From a4b7de996b11bfda6dc9e240537f92e68fa72815 Mon Sep 17 00:00:00 2001 From: Mono Date: Sun, 21 Nov 2021 13:44:46 +0100 Subject: [PATCH] Implemented buggy free hand canvas transform for touchscreens. --- .../tools/general_use/free_transform.gd | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) 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 5c2a4c0..77defe5 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 @@ -2,15 +2,60 @@ extends SummerDayTool class_name SummerDayFreeTransformCanvasTool +var touch_dict = {} +var initial_touches +var current_touches +var initial_transform: Transform2D + + func _init(): priority = 1 func _check_for_use(event: InputEvent, tool_context: SummerDayToolContext): + if event is InputEventScreenTouch: + if event.pressed: + touch_dict[event.index] = event.position + else: + touch_dict.erase(event.index) + if touch_dict.size() == 2: + initial_transform = tool_context.canvas_state.canvas_transform + + var keys = touch_dict.keys() + initial_touches = [touch_dict[keys[0]], touch_dict[keys[1]]] + print(touch_dict) + if event is InputEventScreenDrag: - return true + touch_dict[event.index] = event.position + if touch_dict.size() == 2: + var keys = touch_dict.keys() + current_touches = [touch_dict[keys[0]], touch_dict[keys[1]]] + return true + + return false func _run(event: InputEvent, tool_context: SummerDayToolContext): - var transform := tool_context.canvas_state.canvas_transform - transform = transform.translated(event.relative) + 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.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 tool_context.canvas_state.canvas_transform = transform