using Sandbox; public partial struct Vector2 { /// /// Smoothly move towards the target vector /// public static Vector2 SmoothDamp( in Vector2 current, in Vector2 target, ref Vector2 velocity, float smoothTime, float deltaTime ) { // If smoothing time is zero, directly jump to target (independent of timestep) if ( smoothTime <= 0.0f ) { return target; } // If timestep is zero, stay at current position if ( deltaTime <= 0.0f ) { return current; } // Implicit integration of critically damped spring var omega = MathF.Tau / smoothTime; var denom = (1.0f + omega * deltaTime); velocity = (velocity - (omega * omega) * deltaTime * (current - target)) / (denom * denom); return current + velocity * deltaTime; } /// /// Springly move towards the target vector /// public static Vector2 SpringDamp( in Vector2 current, in Vector2 target, ref Vector2 velocity, float deltaTime, float frequency = 2.0f, float damping = 0.5f ) { var displacement = current - target; (displacement, velocity) = SpringDamper.FromDamping( frequency, damping ) .Simulate( displacement, velocity, deltaTime ); return displacement + target; } [Obsolete( "Use the overload without the 'smoothTime' parameter instead, as it is no longer needed." )] public static Vector2 SpringDamp( in Vector2 current, in Vector2 target, ref Vector2 velocity, float smoothTime, float deltaTime, float frequency = 2.0f, float damping = 0.5f ) { return SpringDamp( in current, in target, ref velocity, deltaTime, frequency, damping ); } }