Skip to content

Commit ea4e038

Browse files
m-GDEVjacketsj
andauthored
Ported touch support to Godot 4 (#323)
Co-authored-by: jacketsj <[email protected]>
1 parent c13fd5c commit ea4e038

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

lorien/InfiniteCanvas/PanZoomCamera.gd

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ var _zoom_active := false
1919
var _current_zoom_level := 1.0
2020
var _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
# -------------------------------------------------------------------------------------------------
2329
func 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
# -------------------------------------------------------------------------------------------------
3988
func tool_event(event: InputEvent) -> void:
4089
if _is_input_enabled:

lorien/project.godot

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ canvas_pan_key={
260260
[input_devices]
261261

262262
pen_tablet/driver.windows="wintab"
263+
pointing/emulate_mouse_from_touch=false
263264

264265
[locale]
265266

0 commit comments

Comments
 (0)