@@ -19,6 +19,12 @@ var _zoom_active := false
1919var _current_zoom_level := 1.0
2020var _start_mouse_pos := Vector2 (0.0 , 0.0 )
2121
22+ # -------------------------------------------------------------------------------------------------
23+ var _touch_events = {}
24+ var _touch_last_drag_distance := 0.0
25+ var _touch_last_drag_median := Vector2 .ZERO
26+ var _multidrag_valid = false
27+
2228# -------------------------------------------------------------------------------------------------
2329func set_zoom_level (zoom_level : float ) -> void :
2430 _current_zoom_level = _to_nearest_zoom_step (zoom_level )
@@ -35,6 +41,49 @@ func do_center(screen_space_center_point: Vector2) -> void:
3541 get_viewport ().warp_mouse (screen_space_center )
3642 _do_pan (delta )
3743
44+
45+ func touch_event (event ):
46+ # Keep track of the fingers on the screen
47+ if event is InputEventScreenTouch :
48+ if event .pressed :
49+ _touch_events [event .index ] = event
50+ _multidrag_valid = false
51+ else :
52+ _touch_events .erase (event .index )
53+ # _touch_last_drag_distance = 0
54+ get_viewport ().set_input_as_handled ()
55+
56+ if event is InputEventScreenDrag :
57+ _touch_events [event .index ] = event
58+ # At least one fing drag
59+ if _touch_events .size () == 1 :
60+ _do_pan (event .relative )
61+ if _touch_events .size () == 2 :
62+ var events = []
63+ for key in _touch_events .keys ():
64+ events .append (_touch_events .get (key ))
65+
66+ var median_point = Vector2 .ZERO
67+ for e in events :
68+ median_point += e .position
69+ median_point /= events .size ()
70+ if _multidrag_valid :
71+ _do_pan (median_point - _touch_last_drag_median )
72+ _touch_last_drag_median = median_point
73+ median_point = get_canvas_transform ().affine_inverse () * median_point
74+ median_point = get_global_transform ().affine_inverse () * median_point
75+
76+ var drag_distance = events [0 ].position .distance_to (events [1 ].position )
77+ var delta = (drag_distance - _touch_last_drag_distance ) * _current_zoom_level / 800
78+ if _multidrag_valid :
79+ _zoom_canvas (_current_zoom_level + delta , median_point )
80+ _touch_last_drag_distance = drag_distance
81+ _multidrag_valid = true
82+ get_viewport ().set_input_as_handled ()
83+
84+ func _input (event ):
85+ touch_event (event )
86+
3887# -------------------------------------------------------------------------------------------------
3988func tool_event (event : InputEvent ) -> void :
4089 if _is_input_enabled :
0 commit comments