48 lines
1.4 KiB
GDScript
48 lines
1.4 KiB
GDScript
extends Node3D
|
|
|
|
@export var pan_factor : float = 0.1
|
|
|
|
@export var events_label : Label
|
|
@export var drag_label : Label
|
|
|
|
var events = {}
|
|
var last_drag_distance : float = 0
|
|
var min_zoom = 0
|
|
var max_zoom = 20
|
|
var zoom_sensitivity = 10
|
|
var zoom_speed = 0.5
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
pass # Replace with function body.
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta):
|
|
events_label.text = "Touch events: {no}".format({"no": events.size()})
|
|
|
|
|
|
func _unhandled_input(event):
|
|
if event is InputEventScreenTouch:
|
|
if event.pressed:
|
|
events[event.index] = event
|
|
else:
|
|
events.erase(event.index)
|
|
|
|
if event is InputEventScreenDrag:
|
|
events[event.index] = event
|
|
if events.size() == 1:
|
|
var relative : Vector2 = event.relative * pan_factor
|
|
rotation_degrees.y += relative.x
|
|
$Tilt.rotation_degrees.x += relative.y
|
|
$Tilt.rotation_degrees.x = clamp($Tilt.rotation_degrees.x, -90, -5)
|
|
|
|
elif events.size() == 2:
|
|
var drag_distance = events[0].position.distance_to(events[1].position)
|
|
drag_label.text = "Drag distance: {dist}".format({"dist": drag_distance})
|
|
if abs(drag_distance - last_drag_distance) > zoom_sensitivity:
|
|
var new_zoom = zoom_speed if drag_distance < last_drag_distance else zoom_speed
|
|
new_zoom = clamp($Camera3D.position.z + new_zoom, min_zoom, max_zoom)
|
|
$Camera3D.position.z = new_zoom
|
|
last_drag_distance = drag_distance
|