Implemented buggy free hand canvas transform for touchscreens.
This commit is contained in:
parent
8d028205fb
commit
a4b7de996b
|
@ -2,15 +2,60 @@ extends SummerDayTool
|
||||||
class_name SummerDayFreeTransformCanvasTool
|
class_name SummerDayFreeTransformCanvasTool
|
||||||
|
|
||||||
|
|
||||||
|
var touch_dict = {}
|
||||||
|
var initial_touches
|
||||||
|
var current_touches
|
||||||
|
var initial_transform: Transform2D
|
||||||
|
|
||||||
|
|
||||||
func _init():
|
func _init():
|
||||||
priority = 1
|
priority = 1
|
||||||
|
|
||||||
|
|
||||||
func _check_for_use(event: InputEvent, tool_context: SummerDayToolContext):
|
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:
|
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):
|
func _run(event: InputEvent, tool_context: SummerDayToolContext):
|
||||||
var transform := tool_context.canvas_state.canvas_transform
|
var jump := Transform2D.IDENTITY
|
||||||
transform = transform.translated(event.relative)
|
|
||||||
|
# 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
|
tool_context.canvas_state.canvas_transform = transform
|
||||||
|
|
Loading…
Reference in New Issue
Block a user