62 lines
1.7 KiB
GDScript
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()
|