86 lines
2.3 KiB
GDScript
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
|