Animation/SpringFloat.cs

A small value type that implements a damped spring for a float. It stores current value, target, velocity, frequency and damping, updates via MathX.SpringDamp, and exposes helpers to advance and check if settled.

using System;
using Sandbox;

namespace Goo.Animation;

public record struct SpringFloat
{
    public float Current;
    public float Target;
    public float Velocity;
    public float Frequency;
    public float Damping;

    public SpringFloat(float initial, float frequency, float damping)
    {
        Current = initial;
        Target = initial;
        Velocity = 0f;
        Frequency = frequency;
        Damping = damping;
    }

    public void Update(float dt) =>
        Current = MathX.SpringDamp(Current, Target, ref Velocity, dt, Frequency, Damping);

    public bool IsSettled =>
        MathF.Abs(Target - Current) < 0.0001f && MathF.Abs(Velocity) < 0.0001f;

    /// <summary>Advances by dt and returns true while still moving; chain calls with | (not ||) so every damper advances each frame.</summary>
    public bool Tick(float dt) { Update(dt); return !IsSettled; }
}