Files
ElHombreAlex 35cdf71054 V0.1
First publishable version of the mod
2026-10-03 12:59:33 +02:00

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