Editor/Core/Rigging/PoseTransition.cs
using System.Numerics;
namespace HumanoidRigger;

/// <summary>Interpolates local joint rotations, including changes made during a transition.</summary>
public sealed class PoseTransition
{
    readonly Dictionary<string,Quaternion> current=new();
    Dictionary<string,Quaternion> start=new(),target=new();
    public IReadOnlyDictionary<string,Quaternion> Current=>current;
    public bool Active {get;private set;}
    public void Begin(IReadOnlyDictionary<string,Quaternion> rotations)
    {
        start=new(current);target=new(rotations);
        foreach(string role in target.Keys)start.TryAdd(role,Quaternion.Identity);
        Active=true;
    }
    public void Sample(float fraction)
    {
        float t=Math.Clamp(fraction,0,1);t=t*t*(3-2*t);
        foreach(var (role,rotation) in start)
            current[role]=Quaternion.Slerp(rotation,target.GetValueOrDefault(role,Quaternion.Identity),t);
        if(fraction>=1){current.Clear();foreach(var pair in target)current.Add(pair.Key,pair.Value);Active=false;}
    }
    public void Reset(){current.Clear();start.Clear();target.Clear();Active=false;}
}