mirror of
https://github.com/ElHombreAlex/FTL-Faster-Than-Light-VR.git
synced 2026-10-06 01:00:06 +02:00
36 lines
1.2 KiB
GDScript
36 lines
1.2 KiB
GDScript
extends RefCounted
|
|
|
|
var position_deadband := 0.0015
|
|
var angle_deadband := deg_to_rad(0.15)
|
|
var time_constant := 0.075
|
|
var fast_time_constant := 0.025
|
|
var initialized := false
|
|
var value := Transform3D.IDENTITY
|
|
|
|
|
|
func reset() -> void:
|
|
initialized = false
|
|
|
|
|
|
func update(target: Transform3D, delta: float) -> Transform3D:
|
|
var rotation := target.basis.orthonormalized().get_rotation_quaternion()
|
|
if not initialized:
|
|
value = target
|
|
initialized = true
|
|
return value
|
|
var current := value.basis.orthonormalized().get_rotation_quaternion()
|
|
var distance := value.origin.distance_to(target.origin)
|
|
var angle := current.angle_to(rotation)
|
|
# Reacquired tracking and explicit recentering must not leave a long trail.
|
|
if distance > 0.35 or angle > deg_to_rad(70.0):
|
|
value = target
|
|
return value
|
|
var moving := distance > 0.025 or angle > deg_to_rad(8.0)
|
|
var alpha := 1.0 - exp(-maxf(delta, 0.0) / (fast_time_constant if moving else time_constant))
|
|
if distance > position_deadband:
|
|
value.origin = value.origin.lerp(target.origin, alpha)
|
|
if angle > angle_deadband:
|
|
current = current.slerp(rotation, alpha)
|
|
value.basis = Basis(current).scaled(target.basis.get_scale())
|
|
return value
|