godot-boids-experiments/scripts/CameraControl.gd

53 lines
1.7 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 InputEventMouseButton:
if event.button_index == MouseButton.MOUSE_BUTTON_WHEEL_UP:
$Tilt/Camera3D.position.z -= 0.1
elif event.button_index == MouseButton.MOUSE_BUTTON_WHEEL_DOWN:
$Tilt/Camera3D.position.z += 0.1
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($Tilt/Camera3D.position.z + new_zoom, min_zoom, max_zoom)
$Tilt/Camera3D.position.z = new_zoom
last_drag_distance = drag_distance