Editor/HumanoidMocap/RetargetWindow.Adjustments.cs
using System;
using System.Globalization;
using HumanoidMocapX.Core.Cleanup;
using HumanoidMocapX.Core.Motion;

namespace HumanoidMocapX.EditorTools;

public sealed partial class RetargetWindow
{
    MocapAdjustmentStore.Session _editSession;
    CleanupSettings _appliedCleanup;
    string _adjustmentSaveError;

    void ResetAdjustmentFields()
    {
        var cleanup=_appliedCleanup??new CleanupSettings();
        _rootSmooth.Text=cleanup.Root.ToString(CultureInfo.InvariantCulture);
        _armSmooth.Text=cleanup.Arms.ToString(CultureInfo.InvariantCulture);
        _fingerSmooth.Text=cleanup.Fingers.ToString(CultureInfo.InvariantCulture);
        _smoothing.Text=cleanup.Smoothing.ToString(CultureInfo.InvariantCulture);
        FitMocapPlacementToTarget();
    }

    void RestoreTargetAdjustments()
    {
        if(_editSession is null||_target is null)return;
        if(!_editSession.State.Targets.TryGetValue(MocapAdjustmentStore.TargetKey(_target.Spec,false),out var edit))return;
        string F(float v)=>v.ToString("R",CultureInfo.InvariantCulture);
        var c=edit.Corrections;
        _ground.Text=F(c.GroundOffset);_facing.Text=F(c.FacingDegrees);
        _stabilizeFeetControl.Value=c.StabilizeFeet;
        _rootMotion=edit.RootMotion;_inPlaceControl.Value=_rootMotion==RootMotionMode.InPlace;
    }

    void SaveAppliedAdjustments(MocapAdjustmentStore.Session session,string key,MocapAdjustmentStore.TargetEdit edit,
        CleanupSettings cleanup,MotionDocument motion)
    {
        if(session is null||session!=_editSession)return;
        session.State.Cleanup=cleanup;session.State.Contacts=motion.Contacts;session.State.Targets[key]=edit;
        try{MocapAdjustmentStore.Save(session);_adjustmentSaveError=null;}
        catch(Exception error){_captureStatus.Text=_adjustmentSaveError="Preview ready, but adjustments could not be saved: "+error.Message;}
    }
}