SummerDay/addons/summer_day/tool/canvas/tools/general_use/free_transform.gd

62 lines
1.7 KiB
GDScript

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]]]
if event is InputEventScreenDrag:
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 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]
)
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