From 5f9545ff375d618ee9c7e87899417ceb56ab5b78 Mon Sep 17 00:00:00 2001 From: Mono Date: Thu, 25 Nov 2021 18:26:56 +0100 Subject: [PATCH] Fixed buggy free hand translation on touchscreens. --- Node2D.gd | 2 +- addons/summer_day/tool/canvas/canvas.gd | 13 ++-- addons/summer_day/tool/canvas/canvas.tscn | 9 +-- .../tools/general_use/free_transform.gd | 73 +++++++++++++------ .../tool/canvas/tools/general_use/hand.gd | 10 +++ .../summer_day/tool/canvas/tools/tool_pool.gd | 7 +- .../tool/tool_system/tool_context.gd | 1 + .../summer_day/utilities/math_helper.gd | 1 + project.godot | 12 ++- 9 files changed, 86 insertions(+), 42 deletions(-) rename Util.gd => addons/summer_day/utilities/math_helper.gd (99%) diff --git a/Node2D.gd b/Node2D.gd index cdfed19..244365a 100644 --- a/Node2D.gd +++ b/Node2D.gd @@ -4,7 +4,7 @@ extends Node2D var image := Image.new() var table := ImageTexture.new() -onready var Util = preload("res://Util.gd") +onready var Util = preload("res://addons/summer_day/utilities/math_helper.gd") var corners = [ Vector2(-0.4, -0.4), diff --git a/addons/summer_day/tool/canvas/canvas.gd b/addons/summer_day/tool/canvas/canvas.gd index baa1dc9..3e888b9 100644 --- a/addons/summer_day/tool/canvas/canvas.gd +++ b/addons/summer_day/tool/canvas/canvas.gd @@ -15,15 +15,12 @@ func _ready(): $Render/BackgroundLayer/EmptyCanvasLayer, "_on_view_transform_changed") +func _gui_input(event): + tool_pool.run_most_prior(event, tool_context) + + func _input(event): - var allow_pass = false - var pos = event.get("position") - if pos == null: - allow_pass = true - else: - if get_rect().has_point(get_local_mouse_position()): - allow_pass = true - if allow_pass: + if event is InputEventScreenTouch and !event.is_pressed(): tool_pool.run_most_prior(event, tool_context) diff --git a/addons/summer_day/tool/canvas/canvas.tscn b/addons/summer_day/tool/canvas/canvas.tscn index 8154b12..0aed3d3 100644 --- a/addons/summer_day/tool/canvas/canvas.tscn +++ b/addons/summer_day/tool/canvas/canvas.tscn @@ -14,13 +14,6 @@ border_color = Color( 0.121569, 0.113725, 0.133333, 1 ) [sub_resource type="GDScript" id=4] script/source = "extends ViewportContainer - - -func _gui_input(event): - pass - -func _clips_input(): - pass " [sub_resource type="Environment" id=1] @@ -47,6 +40,8 @@ margin_left = 1.0 margin_top = 1.0 margin_right = 999.0 margin_bottom = 575.0 +mouse_filter = 1 +input_pass_on_modal_close_click = false stretch = true script = SubResource( 4 ) __meta__ = { diff --git a/addons/summer_day/tool/canvas/tools/general_use/free_transform.gd b/addons/summer_day/tool/canvas/tools/general_use/free_transform.gd index 77defe5..87a17b4 100644 --- a/addons/summer_day/tool/canvas/tools/general_use/free_transform.gd +++ b/addons/summer_day/tool/canvas/tools/general_use/free_transform.gd @@ -35,27 +35,56 @@ func _check_for_use(event: InputEvent, tool_context: SummerDayToolContext): return false func _run(event: InputEvent, tool_context: SummerDayToolContext): - var jump := Transform2D.IDENTITY +# var jump := Transform2D.IDENTITY +# +# # Calculate scale. +# var initial_distance = initial_touches[0].distance_to(initial_touches[1]) +# var current_distance = current_touches[0].distance_to(current_touches[1]) +# var scale = current_distance / initial_distance +# +# # Calculate rotation. +# var initial_angle = initial_touches[0].angle_to_point(initial_touches[1]) +# var current_angle = current_touches[0].angle_to_point(current_touches[1]) +# var rotation = current_angle - initial_angle +# +# jump = jump.scaled(Vector2(scale, scale)).rotated(rotation) +# +# # Calculate origin. +# var transformed_initial_touch = jump.xform(initial_touches[0]) +# var offset = current_touches[0] - transformed_initial_touch +# +# #print(jump) +# jump.origin = offset +# #jump = jump.translated(offset) +# #print(jump) +# +# var transform = jump * initial_transform +# #print(transform) - # Calculate scale. - var initial_distance = initial_touches[0].distance_to(initial_touches[1]) - var current_distance = current_touches[0].distance_to(current_touches[1]) - var scale = current_distance / initial_distance - - # Calculate rotation. - var initial_angle = initial_touches[0].angle_to_point(initial_touches[1]) - var current_angle = current_touches[0].angle_to_point(current_touches[1]) - var rotation = current_angle - initial_angle - - jump = jump.scaled(Vector2(scale, scale)).rotated(rotation) - - # Calculate origin. - var transformed_initial_touch = jump.basis_xform(initial_touches[0]) - var offset = current_touches[0] - transformed_initial_touch - - print(jump) - jump = Transform2D(Vector2.RIGHT, Vector2.DOWN, offset) * jump - print(jump) - - var transform = jump * initial_transform + var init_set = [ + initial_touches[0], + initial_touches[1], + (initial_touches[1] - initial_touches[0]).tangent() + initial_touches[1], + (initial_touches[1] - initial_touches[0]).tangent() + initial_touches[0], + ] + + var curr_set = [ + current_touches[0], + current_touches[1], + (current_touches[1] - current_touches[0]).tangent() + current_touches[1], + (current_touches[1] - current_touches[0]).tangent() + current_touches[0], + ] + + var basis = SummerDayMathHelper.basis_from_to_points( + init_set[0], init_set[1], init_set[2], init_set[3], + curr_set[0], curr_set[1], curr_set[2], curr_set[3] + ) + + #print(basis) + + var transform = Transform2D( + Vector2(basis.x.x, basis.x.y), + Vector2(basis.y.x, basis.y.y), + Vector2(basis.z.x, basis.z.y) + ) * initial_transform tool_context.canvas_state.canvas_transform = transform diff --git a/addons/summer_day/tool/canvas/tools/general_use/hand.gd b/addons/summer_day/tool/canvas/tools/general_use/hand.gd index c753951..67bc540 100644 --- a/addons/summer_day/tool/canvas/tools/general_use/hand.gd +++ b/addons/summer_day/tool/canvas/tools/general_use/hand.gd @@ -2,3 +2,13 @@ extends SummerDayTool class_name SummerDayHandCanvasTool +func _init(): + priority = 1 + + +func _check_for_use(event: InputEvent, tool_context: SummerDayToolContext): + pass + + +func _run(event: InputEvent, tool_context: SummerDayToolContext): + pass diff --git a/addons/summer_day/tool/canvas/tools/tool_pool.gd b/addons/summer_day/tool/canvas/tools/tool_pool.gd index 11384a6..2af69e5 100644 --- a/addons/summer_day/tool/canvas/tools/tool_pool.gd +++ b/addons/summer_day/tool/canvas/tools/tool_pool.gd @@ -3,9 +3,10 @@ class_name SummerDayCanvasToolPool func _init(): - persistent_tool_pool.append( - SummerDayFreeTransformCanvasTool.new() - ) + persistent_tool_pool = [ + SummerDayFreeTransformCanvasTool.new(), + SummerDayHandCanvasTool.new() + ] # Called every frame. 'delta' is the elapsed time since the previous frame. #func _process(delta): diff --git a/addons/summer_day/tool/tool_system/tool_context.gd b/addons/summer_day/tool/tool_system/tool_context.gd index a5454a0..1be5560 100644 --- a/addons/summer_day/tool/tool_system/tool_context.gd +++ b/addons/summer_day/tool/tool_system/tool_context.gd @@ -4,6 +4,7 @@ class_name SummerDayToolContext var edited_scene: SummerDayScene var canvas_state: SummerDayCanvasState +var local_mouse_position: Vector2 func _on_SummerDay_scene_changed(new_scene): diff --git a/Util.gd b/addons/summer_day/utilities/math_helper.gd similarity index 99% rename from Util.gd rename to addons/summer_day/utilities/math_helper.gd index 6229691..1e143ae 100644 --- a/Util.gd +++ b/addons/summer_day/utilities/math_helper.gd @@ -1,4 +1,5 @@ extends Node +class_name SummerDayMathHelper static func matrix_to_points( diff --git a/project.godot b/project.godot index e02c308..bdfc147 100644 --- a/project.godot +++ b/project.godot @@ -74,6 +74,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://addons/summer_day/main_screen.gd" }, { +"base": "Node", +"class": "SummerDayMathHelper", +"language": "GDScript", +"path": "res://addons/summer_day/utilities/math_helper.gd" +}, { "base": "Resource", "class": "SummerDayScene", "language": "GDScript", @@ -118,6 +123,7 @@ _global_script_class_icons={ "SummerDayFreeTransformCanvasTool": "", "SummerDayHandCanvasTool": "", "SummerDayMainScreen": "", +"SummerDayMathHelper": "", "SummerDayScene": "", "SummerDayTimeline": "", "SummerDayTool": "", @@ -134,7 +140,11 @@ config/icon="res://icon.png" [autoload] -Util="res://Util.gd" +Util="res://addons/summer_day/utilities/math_helper.gd" + +[editor_plugins] + +enabled=PoolStringArray( "res://addons/summer_day/plugin.cfg" ) [gdnative]