From 97ed921f20ca40b82d36ac6316801c1601b4f85d Mon Sep 17 00:00:00 2001 From: mono Date: Mon, 3 Jan 2022 23:53:28 +0100 Subject: [PATCH] Implemented interaction hints. --- Buctton.gd | 9 +++ addons/summer_day/data/blueprint/editable.gd | 26 ++++++++ .../data/blueprint/template_editables/tube.gd | 61 ++++++++++++++++++- addons/summer_day/data/document/cell.gd | 8 ++- addons/summer_day/data/document/document.gd | 12 +++- addons/summer_day/data/document/track.gd | 6 ++ addons/summer_day/main_screen.tscn | 11 +++- addons/summer_day/summer_day.gd | 15 ++++- .../summer_day/tools/canvas/free_transform.gd | 1 + addons/summer_day/tools/canvas/hand.gd | 1 + addons/summer_day/tools/canvas/pen.gd | 3 +- addons/summer_day/tools/canvas/rotation.gd | 1 + addons/summer_day/tools/canvas/tool_pool.gd | 1 + addons/summer_day/tools/canvas/zoom.gd | 1 + .../user_interface/canvas/canvas.gd | 8 ++- .../user_interface/canvas/canvas.tscn | 20 ++++-- .../user_interface/canvas/canvas_state.gd | 6 +- .../canvas/rendering/interaction_hint.gd | 30 ++++----- .../utilities/summer_day_globals.gd | 2 + production/ann.tres | 2 +- production/blueprints/mannequin/mat.tres | 2 +- 21 files changed, 192 insertions(+), 34 deletions(-) create mode 100644 Buctton.gd diff --git a/Buctton.gd b/Buctton.gd new file mode 100644 index 0000000..c52739e --- /dev/null +++ b/Buctton.gd @@ -0,0 +1,9 @@ +tool +extends Button + + +func _on_Button_pressed(): + print(SummerDay.test) + print(SummerDay.canvas_state.test) + print(SummerDay.canvas_state.fill_transform) + print(SummerDay.canvas_state.rect_size) diff --git a/addons/summer_day/data/blueprint/editable.gd b/addons/summer_day/data/blueprint/editable.gd index 032edbf..585c13e 100644 --- a/addons/summer_day/data/blueprint/editable.gd +++ b/addons/summer_day/data/blueprint/editable.gd @@ -17,3 +17,29 @@ func _interact(event: InputEvent) -> bool: # Virtual. func _update_table(table: SummerDayTable): # Virtual. pass + + +func _draw_interaction_hint(): # Virtual. + pass + + +func update_interaction_hint(): + SummerDay.interaction_hint.clear() + _draw_interaction_hint() + + +func draw_dot(position: Vector3, color: Color): + SummerDay.interaction_hint.draw_dot(position, color) + + +func draw_line(position_1: Vector3, position_2: Vector3, + color: Color, second_color = null +): + var color_2: Color + if second_color == null: + color_2 = color + else: + color_2 = second_color + SummerDay.interaction_hint.draw_line( + position_1, position_2, color, color_2 + ) diff --git a/addons/summer_day/data/blueprint/template_editables/tube.gd b/addons/summer_day/data/blueprint/template_editables/tube.gd index 00e1d4e..9482e58 100644 --- a/addons/summer_day/data/blueprint/template_editables/tube.gd +++ b/addons/summer_day/data/blueprint/template_editables/tube.gd @@ -15,6 +15,7 @@ export(PoolVector2Array) var vertices = PoolVector2Array([ Vector2(-0.1, 0.4), ]) +var picked_point = -1 func _check_for_selection_candidate(event: InputEvent) -> bool: # Virtual. @@ -25,7 +26,21 @@ func _check_for_selection_candidate(event: InputEvent) -> bool: # Virtual. func _interact(event: InputEvent) -> bool: # Virtual. - return false + + 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(table: SummerDayTable): # Virtual. @@ -35,4 +50,48 @@ func _update_table(table: SummerDayTable): # Virtual. 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) diff --git a/addons/summer_day/data/document/cell.gd b/addons/summer_day/data/document/cell.gd index 53239cb..3b84887 100644 --- a/addons/summer_day/data/document/cell.gd +++ b/addons/summer_day/data/document/cell.gd @@ -15,8 +15,14 @@ func _pass_input(event: InputEvent): # Virtual. if success: block_selection = true if !block_selection: - selected.clear() for i in editable_list: if i._check_for_selection_candidate(event): + selected.clear() selected.append(i) + i.update_interaction_hint() print("YOU CLICKED!!") + + +func update_interaction_hint(): + for i in selected: + i.update_interaction_hint() diff --git a/addons/summer_day/data/document/document.gd b/addons/summer_day/data/document/document.gd index a58f8b3..0a5920b 100644 --- a/addons/summer_day/data/document/document.gd +++ b/addons/summer_day/data/document/document.gd @@ -13,10 +13,14 @@ export(Array, Resource) var tracks var raw_aspect_ratio setget , _get_raw_aspect_ratio +var selected_track -func setup_tracks(): + +func setup(): for track in tracks: + selected_track = track emit_signal("track_added", track) + update_interaction_hint() func add_track(blueprint: SummerDayBlueprint): @@ -24,6 +28,7 @@ func add_track(blueprint: SummerDayBlueprint): track.blueprint = blueprint track.add_cell(0) tracks.append(track) + selected_track = track emit_signal("track_added", track) @@ -34,6 +39,11 @@ func create_scene() -> SummerDayScene: return _scene +func update_interaction_hint(): + if selected_track: + selected_track.update_interaction_hint() + + func _set_resolution(new_resolution): var handled_resolution = Vector2() diff --git a/addons/summer_day/data/document/track.gd b/addons/summer_day/data/document/track.gd index 3f8a29e..2c9ab33 100644 --- a/addons/summer_day/data/document/track.gd +++ b/addons/summer_day/data/document/track.gd @@ -31,3 +31,9 @@ func pass_local_input(event: InputEvent): var current_cell = get_current_cell() if current_cell: current_cell._pass_input(event) + + +func update_interaction_hint(): + var cell = get_current_cell() + if cell: + cell.update_interaction_hint() diff --git a/addons/summer_day/main_screen.tscn b/addons/summer_day/main_screen.tscn index 56193dd..d9ef823 100644 --- a/addons/summer_day/main_screen.tscn +++ b/addons/summer_day/main_screen.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] [ext_resource path="res://addons/summer_day/user_interface/canvas/canvas.tscn" type="PackedScene" id=1] [ext_resource path="res://addons/summer_day/main_screen.gd" type="Script" id=2] +[ext_resource path="res://Buctton.gd" type="Script" id=3] [node name="MainScreen" type="Control"] anchor_right = 1.0 @@ -13,3 +14,11 @@ __meta__ = { } [node name="Canvas" parent="." instance=ExtResource( 1 )] + +[node name="Button" type="Button" parent="."] +margin_right = 63.0 +margin_bottom = 20.0 +text = "PRESS" +script = ExtResource( 3 ) + +[connection signal="pressed" from="Button" to="Button" method="_on_Button_pressed"] diff --git a/addons/summer_day/summer_day.gd b/addons/summer_day/summer_day.gd index 8032c72..9a8282f 100644 --- a/addons/summer_day/summer_day.gd +++ b/addons/summer_day/summer_day.gd @@ -19,6 +19,8 @@ func _enter_tree(): canvas_instance = main_screen_instance.get_node("Canvas") self.connect("document_changed", canvas_instance, "_on_SummerDay_document_changed") + canvas_instance.connect("resized", + canvas_instance, "_on_Canvas_resized") # Add the main panel to the editor's main viewport. get_editor_interface().get_editor_viewport().add_child(main_screen_instance) # Hide the main panel. Very much required. @@ -46,6 +48,13 @@ func _exit_tree(): remove_control_from_bottom_panel(timeline_instance) +func enable_plugin(): + add_autoload_singleton( + "SummerDay", + "res://addons/summer_day/utilities/summer_day_globals.gd" + ) + + func disable_plugin(): remove_autoload_singleton("SummerDay") @@ -70,8 +79,9 @@ func handles(object): func edit(object): - if object != $"/root/SummerDay".document: - $"/root/SummerDay".document = object + var _SummerDay = $"/root/SummerDay" + if object != _SummerDay.document: + _SummerDay.document = object emit_signal("document_changed", object) @@ -88,6 +98,7 @@ func _initilize(): "SummerDay", "res://addons/summer_day/utilities/summer_day_globals.gd" ) + MainScreen = load("res://addons/summer_day/main_screen.tscn") Timeline = load("res://addons/summer_day/user_interface/timeline/timeline.tscn") Document = load("res://addons/summer_day/data/document/document.gd") diff --git a/addons/summer_day/tools/canvas/free_transform.gd b/addons/summer_day/tools/canvas/free_transform.gd index 7ce6c73..5213342 100644 --- a/addons/summer_day/tools/canvas/free_transform.gd +++ b/addons/summer_day/tools/canvas/free_transform.gd @@ -1,3 +1,4 @@ +tool extends SummerDayTool class_name SummerDayFreeTransformCanvasTool diff --git a/addons/summer_day/tools/canvas/hand.gd b/addons/summer_day/tools/canvas/hand.gd index 39fb65e..b19ec2a 100644 --- a/addons/summer_day/tools/canvas/hand.gd +++ b/addons/summer_day/tools/canvas/hand.gd @@ -1,3 +1,4 @@ +tool extends SummerDayTool class_name SummerDayHandCanvasTool diff --git a/addons/summer_day/tools/canvas/pen.gd b/addons/summer_day/tools/canvas/pen.gd index c47cbe1..5846514 100644 --- a/addons/summer_day/tools/canvas/pen.gd +++ b/addons/summer_day/tools/canvas/pen.gd @@ -1,3 +1,4 @@ +tool extends SummerDayTool class_name SummerDayPenCanvasTool @@ -8,7 +9,7 @@ func _init(): func _check_for_use(event: InputEvent): if event is InputEventMouseButton: - if event.button_index == BUTTON_LEFT and event.is_pressed(): + if event.button_index == BUTTON_LEFT: return true if event is InputEventMouseMotion: diff --git a/addons/summer_day/tools/canvas/rotation.gd b/addons/summer_day/tools/canvas/rotation.gd index 7c5c44c..3f86cbd 100644 --- a/addons/summer_day/tools/canvas/rotation.gd +++ b/addons/summer_day/tools/canvas/rotation.gd @@ -1,3 +1,4 @@ +tool extends SummerDayTool class_name SummerDayRotationCanvasTool diff --git a/addons/summer_day/tools/canvas/tool_pool.gd b/addons/summer_day/tools/canvas/tool_pool.gd index d6b76b7..4c50892 100644 --- a/addons/summer_day/tools/canvas/tool_pool.gd +++ b/addons/summer_day/tools/canvas/tool_pool.gd @@ -1,3 +1,4 @@ +tool extends SummerDayToolPool class_name SummerDayCanvasToolPool diff --git a/addons/summer_day/tools/canvas/zoom.gd b/addons/summer_day/tools/canvas/zoom.gd index e65a3c3..f52bd9d 100644 --- a/addons/summer_day/tools/canvas/zoom.gd +++ b/addons/summer_day/tools/canvas/zoom.gd @@ -1,3 +1,4 @@ +tool extends SummerDayTool class_name SummerDayZoomCanvasTool diff --git a/addons/summer_day/user_interface/canvas/canvas.gd b/addons/summer_day/user_interface/canvas/canvas.gd index 6a7c0ea..0539da8 100644 --- a/addons/summer_day/user_interface/canvas/canvas.gd +++ b/addons/summer_day/user_interface/canvas/canvas.gd @@ -44,12 +44,11 @@ func drop_data(position, data): func _on_SummerDay_document_changed(new_doc): new_doc.connect("track_added", MeshContainer, "_on_Document_add_track") - new_doc.setup_tracks() + new_doc.setup() canvas_state.update_fill_transform() new_doc.connect("resolution_changed", self, "_on_scene_aspect_ratio_changed") $Render/Label.text = str(new_doc) + "\n" + str(new_doc.resolution) - canvas_state.update_fill_transform() func _on_Canvas_resized(): @@ -85,7 +84,10 @@ func _on_view_transform_changed(canvas_transform, spatial_transform): var mat = mesh.surface_get_material(i) mat.set_shader_param("canvas_transform", basis) else: - l.get_material().set_shader_param("canvas_transform", basis) + 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): diff --git a/addons/summer_day/user_interface/canvas/canvas.tscn b/addons/summer_day/user_interface/canvas/canvas.tscn index 259e0c6..f821e88 100644 --- a/addons/summer_day/user_interface/canvas/canvas.tscn +++ b/addons/summer_day/user_interface/canvas/canvas.tscn @@ -27,19 +27,31 @@ blend_mode = 3 [sub_resource type="Shader" id=6] code = "shader_type spatial; -render_mode blend_mix, depth_draw_opaque, unshaded, depth_test_disable; +render_mode blend_mix,depth_draw_opaque,cull_disabled,unshaded,depth_test_disable,skip_vertex_transform; + + +uniform mat3 canvas_transform; + +void vertex() { + vec4 pre = vec4(VERTEX, 1.0); + vec3 transformed_xy = vec3(pre.xy, 1.0) * transpose(canvas_transform); + vec4 post = vec4(transformed_xy.x, transformed_xy.y, pre.z, pre.w); + POSITION = post; + VERTEX = (post / post.w).xyz; +} void fragment() { float depth = texture(DEPTH_TEXTURE, SCREEN_UV).r; float weight = clamp((FRAGCOORD.z - depth) * float(0xFFFFFF), 0.0, 0.66); vec3 screen_color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb; - ALBEDO = mix(ALBEDO, screen_color, weight); + ALBEDO = mix(COLOR.rgb, screen_color, weight); }" [sub_resource type="ShaderMaterial" id=7] render_priority = 1 shader = SubResource( 6 ) +shader_param/canvas_transform = Basis( 0.587128, 0, -0.414469, 0, -0.943144, 0.393899, 0, 0, 1 ) [node name="Canvas" type="PanelContainer"] anchor_right = 1.0 @@ -102,7 +114,7 @@ invert_enable = true invert_border = 1000.0 polygon = PoolVector2Array( 0, 0, 1.77778, 0, 1.77778, 1, 0, 1 ) -[node name="InteractionHint" type="ImmediateGeometry" parent="Render/RenderLayer"] +[node name="InteractionHint" type="ImmediateGeometry" parent="Render/RenderLayer" groups=["SummerDaySpatialTransform"]] material_override = SubResource( 7 ) script = ExtResource( 3 ) @@ -117,5 +129,3 @@ gui_disable_input = true [node name="Label" type="Label" parent="Render"] margin_right = 40.0 margin_bottom = 14.0 - -[connection signal="resized" from="." to="." method="_on_Canvas_resized"] diff --git a/addons/summer_day/user_interface/canvas/canvas_state.gd b/addons/summer_day/user_interface/canvas/canvas_state.gd index c542643..16a1626 100644 --- a/addons/summer_day/user_interface/canvas/canvas_state.gd +++ b/addons/summer_day/user_interface/canvas/canvas_state.gd @@ -3,10 +3,12 @@ class_name SummerDayCanvasState signal fill_transform_changed(fill_transform) signal canvas_transform_changed(canvas_transform) -signal view_transform_changed(view_transform) +signal view_transform_changed(view_transform, spatial_transform) signal canvas_polygon_changed(polygon) +var test = "Das ist im Canvas_State" + var rect_size: Vector2 var fill_transform := Transform2D.IDENTITY @@ -52,7 +54,7 @@ func update_fill_transform(): translation ) - _update_canvas_polygon() + #_update_canvas_polygon() emit_signal("fill_transform_changed", fill_transform) diff --git a/addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd b/addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd index 3c1d015..8073286 100644 --- a/addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd +++ b/addons/summer_day/user_interface/canvas/rendering/interaction_hint.gd @@ -7,28 +7,28 @@ var canvas_state: SummerDayCanvasState # Provided through Canvas. func draw_dot(position: Vector3, color: Color): - var transformation = SummerDay.canvas_state.clip_space_view_transform - var transformed_position = transformation.xform(position) - - var radius = 3.0 - var vertex_count = 12.0 + var radius = 0.0085 + var vertex_count = 6.0 begin(Mesh.PRIMITIVE_TRIANGLE_FAN) set_color(color) for i in range(vertex_count): var weight = i / vertex_count - var offset = Vector3(sin(weight * TAU), cos(weight * TAU), 0.0) - add_vertex(transformed_position + offset) + var offset = Vector3( + sin(weight * TAU) * radius, + cos(weight * TAU) * radius, + 0.0 + ) + add_vertex(position + offset) end() -func draw_line(position_1: Vector3, position_2: Vector3, color: Color): - var transformation = SummerDay.canvas_state.clip_space_view_transform - var transformed_position_1 = transformation.xform(position_1) - var transformed_position_2 = transformation.xform(position_2) - +func draw_line(position_1: Vector3, position_2: Vector3, + color_1: Color, color_2: Color +): begin(Mesh.PRIMITIVE_LINES) - set_color(color) - add_vertex(transformed_position_1) - add_vertex(transformed_position_2) + set_color(color_1) + add_vertex(position_1) + set_color(color_2) + add_vertex(position_2) end() diff --git a/addons/summer_day/utilities/summer_day_globals.gd b/addons/summer_day/utilities/summer_day_globals.gd index e4c5bae..b3d41f0 100644 --- a/addons/summer_day/utilities/summer_day_globals.gd +++ b/addons/summer_day/utilities/summer_day_globals.gd @@ -2,6 +2,8 @@ tool extends Node +var test = "Jojojawdfq" + var document: SummerDayDocument var canvas_state: SummerDayCanvasState var interaction_hint: SummerDayInteractionHint diff --git a/production/ann.tres b/production/ann.tres index 8d2b53e..56585eb 100644 --- a/production/ann.tres +++ b/production/ann.tres @@ -9,7 +9,7 @@ [sub_resource type="Resource" id=1] script = ExtResource( 6 ) -vertices = PoolVector2Array( -0.4, -0.4, 0.1, -0.4, 0.1, 0.1, -0.4, 0.1, -0.1, -0.1, 0.4, -0.1, 0.4, 0.4, -0.1, 0.4 ) +vertices = PoolVector2Array( -0.4, -0.4, 0.1, -0.4, 0.113769, -0.0876254, -0.4, 0.1, -0.1, -0.1, 0.4, -0.1, 0.4, 0.4, -0.1, 0.4 ) [sub_resource type="Resource" id=2] script = ExtResource( 3 ) diff --git a/production/blueprints/mannequin/mat.tres b/production/blueprints/mannequin/mat.tres index a3e6207..282edea 100644 --- a/production/blueprints/mannequin/mat.tres +++ b/production/blueprints/mannequin/mat.tres @@ -55,5 +55,5 @@ void fragment() { [resource] shader = SubResource( 1 ) -shader_param/canvas_transform = Basis( -0.100636, -0.496363, 0.0452502, -0.707523, 0.143448, 0.352804, 0, 0, 1 ) +shader_param/canvas_transform = Basis( 0.999546, 0, -0.0981899, 0, -1.22596, -0.0477029, 0, 0, 1 ) shader_param/table = ExtResource( 1 )