97 lines
2.7 KiB
GDScript
97 lines
2.7 KiB
GDScript
tool
|
|
extends PanelContainer
|
|
class_name SummerDayCanvas
|
|
|
|
onready var MeshContainer := $Render/RenderLayer/Container
|
|
onready var InteractionHint := $Render/RenderLayer/InteractionHint
|
|
|
|
var document: SummerDayDocument
|
|
var canvas_state := SummerDayCanvasState.new()
|
|
var tool_pool := SummerDayCanvasToolPool.new()
|
|
|
|
|
|
func _ready():
|
|
SummerDay.canvas_state = canvas_state
|
|
SummerDay.interaction_hint = InteractionHint
|
|
SummerDay.debug_info = $Render/DebugInfo
|
|
canvas_state.connect("view_transform_changed",
|
|
self, "_on_view_transform_changed")
|
|
canvas_state.connect("canvas_polygon_changed",
|
|
self, "_on_canvas_polygon_changed")
|
|
|
|
|
|
func _gui_input(event):
|
|
tool_pool.run_most_prior(event)
|
|
|
|
|
|
# _gui_input() cannot receive screen touch released event by itself.
|
|
func _input(event):
|
|
if event is InputEventScreenTouch and !event.is_pressed():
|
|
_gui_input(event)
|
|
tool_pool.pass_global_input(event)
|
|
|
|
|
|
func can_drop_data(position, data):
|
|
return data.has("files")
|
|
|
|
|
|
func drop_data(position, data):
|
|
var file_path = data["files"][0]
|
|
var instance = load(file_path)
|
|
if instance is SummerDayBlueprint:
|
|
SummerDay.document.add_track(instance)
|
|
|
|
|
|
func _on_SummerDay_document_changed(new_doc):
|
|
new_doc.connect("track_added",
|
|
MeshContainer, "_on_Document_add_track")
|
|
new_doc.setup()
|
|
canvas_state.update_fill_transform()
|
|
new_doc.connect("resolution_changed",
|
|
self, "_on_scene_aspect_ratio_changed")
|
|
|
|
|
|
func _on_Canvas_resized():
|
|
canvas_state.rect_size = rect_size
|
|
canvas_state.update_canvas_to_clip_space()
|
|
canvas_state.update_fill_transform()
|
|
|
|
|
|
func _on_scene_aspect_ratio_changed(new_aspect_ratio):
|
|
canvas_state.update_fill_transform()
|
|
|
|
|
|
func _on_view_transform_changed(canvas_transform, spatial_transform):
|
|
var canvas_transform_listeners = get_tree().get_nodes_in_group(
|
|
"SummerDayCanvasTransform"
|
|
)
|
|
for i in canvas_transform_listeners:
|
|
if i is Viewport:
|
|
i.canvas_transform = canvas_transform
|
|
|
|
var spatial_transform_listeners = get_tree().get_nodes_in_group(
|
|
"SummerDaySpatialTransform"
|
|
)
|
|
for l in spatial_transform_listeners:
|
|
var basis = Basis(
|
|
Vector3(spatial_transform.x.x, spatial_transform.x.y, 0.0),
|
|
Vector3(spatial_transform.y.x, spatial_transform.y.y, 0.0),
|
|
Vector3(spatial_transform.origin.x, spatial_transform.origin.y, 1.0)
|
|
)
|
|
if l is MeshInstance:
|
|
var mesh = l.mesh
|
|
for i in range(mesh.get_surface_count()):
|
|
var mat = mesh.surface_get_material(i)
|
|
mat.set_shader_param("canvas_transform", basis)
|
|
else:
|
|
if l.has_method("get_material"):
|
|
l.get_material().set_shader_param("canvas_transform", basis)
|
|
else:
|
|
l.material_override.set_shader_param("canvas_transform", basis)
|
|
|
|
|
|
func _on_canvas_polygon_changed(new_polygon):
|
|
var listeners = get_tree().get_nodes_in_group("SummerDayCanvasPolygon")
|
|
for i in listeners:
|
|
i.polygon = new_polygon
|