Fixed buggy free hand translation on touchscreens.

This commit is contained in:
Mono 2021-11-25 18:26:56 +01:00
parent a4b7de996b
commit 5f9545ff37
9 changed files with 86 additions and 42 deletions

View File

@ -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),

View File

@ -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)

View File

@ -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__ = {

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -1,4 +1,5 @@
extends Node
class_name SummerDayMathHelper
static func matrix_to_points(

View File

@ -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]