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