SummerDay/addons/summer_day/data/blueprint/quad.gd

86 lines
2.3 KiB
GDScript

extends Resource
class_name SummerDayQuad
export(PoolVector3Array) var original_vertices = PoolVector3Array([
Vector3(-1.0, -1.0, 0.0),
Vector3(1.0, -1.0, 0.0),
Vector3(1.0, 1.0, 0.0),
Vector3(-1.0, 1.0, 0.0),
])
export(PoolVector2Array) var vertices = PoolVector2Array([
Vector2(-0.4, -0.4),
Vector2(0.1, -0.4),
Vector2(0.1, 0.1),
Vector2(-0.4, 0.1),
])
func guess_normal() -> Vector3:
var original_angles = get_quad_angles(original_vertices)
var angles = get_quad_angles(vertices)
var angle_changes = [
range_lerp(angles[0], original_angles[0], PI, 0.0, 1.0),
range_lerp(angles[1], original_angles[1], PI, 0.0, 1.0),
range_lerp(angles[2], original_angles[2], PI, 0.0, 1.0),
range_lerp(angles[3], original_angles[3], PI, 0.0, 1.0),
]
var FRONT_VECTOR = Vector3(0.0, 0.0, -1.0)
# Going \.
var s_slope_vector_dest
var s_slope_vector_weight
if angle_changes[0] > angle_changes[2]:
s_slope_vector_dest = Vector3(-1.0, -1.0, 0.0)
s_slope_vector_weight = angle_changes[0]
elif angle_changes[0] < angle_changes[2]:
s_slope_vector_dest = Vector3(1.0, 1.0, 0.0)
s_slope_vector_weight = angle_changes[2]
else:
s_slope_vector_dest = FRONT_VECTOR
s_slope_vector_weight = 0.0
# Going /.
var z_slope_vector_dest
var z_slope_vector_weight
if angle_changes[1] > angle_changes[3]:
z_slope_vector_dest = Vector3(1.0, -1.0, 0.0)
z_slope_vector_weight = angle_changes[1]
elif angle_changes[1] < angle_changes[3]:
z_slope_vector_dest = Vector3(-1.0, 1.0, 0.0)
z_slope_vector_weight = angle_changes[3]
else:
z_slope_vector_dest = FRONT_VECTOR
z_slope_vector_weight = 0.0
var s_slope_vector = FRONT_VECTOR.slerp(
s_slope_vector_dest, s_slope_vector_weight
)
var z_slope_vector = FRONT_VECTOR.slerp(
z_slope_vector_dest, z_slope_vector_weight
)
var total_weight = s_slope_vector_weight + z_slope_vector_weight
if total_weight != 0.0:
return s_slope_vector.slerp(
z_slope_vector, s_slope_vector_weight / total_weight
)
else:
return FRONT_VECTOR
func get_quad_angles(verts) -> Array:
var angles = []
for i in range(4):
var next_i = wrapi(i + 1, 0, 4)
var prev_i = wrapi(i - 1, 0, 4)
var to_next = verts[next_i] - verts[i]
var to_prev = verts[prev_i] - verts[i]
var angle = to_next.angle_to(to_prev)
angles.append(angle)
return angles