using System.Runtime.CompilerServices; namespace Content.Shared._White.Spline.Linear; public abstract class SplineLinear : Spline { [MethodImpl(MethodImplOptions.AggressiveInlining)] public override T SamplePosition(ReadOnlySpan controlPoints, float u) { var iu = (int) u; var t = u % 1; return Add(Multiply(controlPoints[iu], 1 - t), Multiply(controlPoints[iu + 1], t)); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override T SampleVelocity(ReadOnlySpan controlPoints, float u) { var iu = (int) u; return iu == 0 ? Subtract(controlPoints[iu + 1], controlPoints[iu]) : Subtract(controlPoints[iu + 1], controlPoints[iu - 1]); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override (T Position, T Velocity) SamplePositionVelocity(ReadOnlySpan controlPoints, float u) { return ( SamplePosition(controlPoints, u), SampleVelocity(controlPoints, u) ); } protected abstract T Multiply(T op1, float scalar); }