SummerDay/addons/summer_day/data/blueprint/template_editables/tube.gd

121 lines
2.8 KiB
GDScript

tool
extends SummerDayEditable
class_name SummerDayEditableTube
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),
Vector2(-0.1, -0.1),
Vector2(0.4, -0.1),
Vector2(0.4, 0.4),
Vector2(-0.1, 0.4),
])
var picked_point = -1
func _init():
z_range.index = 0
func _check_for_selection_candidate(event: InputEvent) -> bool: # Virtual.
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT and event.pressed:
return _is_point_included(event.position)
return false
func _interact(event: InputEvent) -> bool: # Virtual.
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT:
if event.pressed:
_pick_point(event.position)
else:
picked_point = -1
if event is InputEventMouseMotion:
if picked_point != -1:
vertices[picked_point] = event.position
_update_table()
update_interaction_hint()
return true
func _update_table(): # Virtual.
var rear_matrix = SummerDayMathHelper.plane_3d_to_xy(
Vector3(1.0, 1.0, 1.0),
Vector3(-1.0, 1.0, 1.0),
Vector3(-1.0, -1.0, 1.0),
Vector3(1.0, -1.0, 1.0),
vertices[0], vertices[1], vertices[2], vertices[3]
)
var front_matrix = SummerDayMathHelper.plane_3d_to_xy(
Vector3(1.0, 1.0, -1.0),
Vector3(-1.0, 1.0, -1.0),
Vector3(-1.0, -1.0, -1.0),
Vector3(1.0, -1.0, -1.0),
vertices[4], vertices[5], vertices[6], vertices[7]
)
table.apply_matrix(front_matrix, 0, 0)
table.apply_matrix(rear_matrix, 0, 1)
table.flush()
func _is_point_included(point: Vector2) -> bool: # Private.
var convex_hull = Geometry.convex_hull_2d(vertices)
return Geometry.is_point_in_polygon(point, convex_hull)
func _draw_interaction_hint():
for i in range(4):
var vertex_2d = vertices[i]
var vertex = _with_z(vertex_2d, 0.0)
draw_dot(vertex, Color.cornflower)
for i in range(4, 8):
var vertex_2d = vertices[i]
var vertex = _with_z(vertex_2d, -1.0)
draw_dot(vertex, Color.crimson)
for i in range(4):
draw_line(
_with_z(vertices[i], 0.0),
_with_z(vertices[wrapi(i + 1, 0, 4)], 0.0),
Color.cornflower
)
for i in range(4):
draw_line(
_with_z(vertices[i], 0.0),
_with_z(vertices[i + 4], -1.0),
Color.cornflower,
Color.crimson
)
for i in range(4):
draw_line(
_with_z(vertices[i + 4], -1.0),
_with_z(vertices[wrapi(i + 5, 4, 8)], -1.0),
Color.crimson
)
func _pick_point(mouse_pos):
var picked_point_so_far = -1
var nearest_distance = 0.02
for i in vertices.size():
var distance = vertices[i].distance_to(mouse_pos)
if distance < nearest_distance:
nearest_distance = distance
picked_point_so_far = i
picked_point = picked_point_so_far
func _with_z(vector: Vector2, z: float) -> Vector3:
return Vector3(vector.x, vector.y, z)