SummerDay/addons/summer_day/user_interface/canvas/canvas.gd

106 lines
2.9 KiB
GDScript3
Raw Normal View History

2021-11-18 17:23:37 +01:00
tool
2021-11-21 11:46:04 +01:00
extends PanelContainer
2021-11-18 17:23:37 +01:00
class_name SummerDayCanvas
onready var MeshContainer := $Render/RenderLayer/Container
2021-12-31 17:22:58 +01:00
onready var EditHints := $Render/ForegroundLayer/EditHints
var document: SummerDayDocument
2021-11-18 17:23:37 +01:00
var scene: SummerDayScene
var canvas_state := SummerDayCanvasState.new()
2021-11-21 11:46:04 +01:00
var tool_pool := SummerDayCanvasToolPool.new()
var tool_context: SummerDayToolContext # Provided by plugin root.
2021-11-18 17:23:37 +01:00
func _ready():
2021-11-21 11:46:04 +01:00
tool_context.canvas_state = canvas_state
canvas_state.connect("view_transform_changed",
self, "_on_view_transform_changed")
canvas_state.connect("canvas_polygon_changed",
self, "_on_canvas_polygon_changed")
2021-11-18 17:23:37 +01:00
func _gui_input(event):
2021-12-12 17:04:17 +01:00
if event.has_method("get_position"):
tool_context.position = canvas_state.view_transform.xform_inv(
event.position
)
tool_pool.run_most_prior(event, tool_context)
2021-12-12 17:04:17 +01:00
# _gui_input() cannot receive screen touch released event by itself.
2021-11-21 11:46:04 +01:00
func _input(event):
if event is InputEventScreenTouch and !event.is_pressed():
2021-12-12 17:04:17 +01:00
_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:
2021-12-19 22:26:09 +01:00
document.add_track(instance)
func _on_SummerDay_document_changed(new_doc):
if new_doc != document:
document = new_doc
new_doc.connect("track_added",
MeshContainer, "_on_Document_add_track")
new_doc.setup_tracks()
2021-11-18 17:23:37 +01:00
func _on_SummerDay_scene_changed(new_scene):
if new_scene != scene:
scene = new_scene
canvas_state.update_fill_transform(scene)
scene.connect("aspect_ratio_changed",
self, "_on_scene_aspect_ratio_changed")
$Render/Label.text = str(scene) + "\n" + str(scene.aspect_ratio)
canvas_state.update_fill_transform(scene)
2021-11-18 17:23:37 +01:00
func _on_Canvas_resized():
canvas_state.rect_size = rect_size
canvas_state.update_canvas_to_clip_space()
canvas_state.update_fill_transform(scene)
2021-11-19 21:05:44 +01:00
func _on_scene_aspect_ratio_changed(new_aspect_ratio):
canvas_state.update_fill_transform(scene)
func _on_view_transform_changed(canvas_transform, spatial_transform):
var canvas_transform_listeners = get_tree().get_nodes_in_group(
2021-12-12 17:04:17 +01:00
"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(
2021-12-12 17:04:17 +01:00
"SummerDaySpatialTransform"
)
for i 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 i is MeshInstance:
var mat = i.material_override
mat.set_shader_param("canvas_transform", basis)
else:
i.get_material().set_shader_param("canvas_transform", basis)
func _on_canvas_polygon_changed(new_polygon):
2021-12-12 17:04:17 +01:00
var listeners = get_tree().get_nodes_in_group("SummerDayCanvasPolygon")
for i in listeners:
i.polygon = new_polygon