Files
godot-apointa/scripts/camera_controller.gd
2026-05-16 11:51:19 +02:00

62 lines
1.7 KiB
GDScript

extends Camera3D
@export var height := 1.7
@export var move_duration := 1
var tween: Tween
var _history: Array[Transform3D] = []
var _is_moving := false
func _ready() -> void:
ClickManager.camera_move_requested.connect(_move_to)
func _set_position(pos: Vector3) -> void:
var t := global_transform
t.origin = pos
global_transform = t
func _move_to(target: Transform3D) -> void:
# Save current position before moving
_history.append(global_transform)
var start_transform := global_transform
var end_transform := target
#end_transform.origin.y = height
if tween:
tween.kill()
tween = create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
tween.tween_method(_set_position, start_transform.origin, end_transform.origin, move_duration)
tween.parallel().tween_method(
_set_rotation,
Quaternion(start_transform.basis),
Quaternion(end_transform.basis),
move_duration
)
func go_back() -> void:
if _history.is_empty() or _is_moving:
return
var previous: Transform3D = _history.pop_back()
var start_transform := global_transform
var end_transform := previous
if tween:
tween.kill()
_is_moving = true
tween = create_tween().set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
tween.tween_method(_set_position, start_transform.origin, end_transform.origin, move_duration)
tween.parallel().tween_method(
_set_rotation,
Quaternion(start_transform.basis),
Quaternion(end_transform.basis),
move_duration
)
tween.tween_callback(func(): _is_moving = false)
func _set_rotation(q: Quaternion) -> void:
var t := global_transform
t.basis = Basis(q.normalized())
global_transform = t
func has_history() -> bool:
return not _history.is_empty()