Editor/RetargetWindow.PreviewSession.cs

Editor partial for RetargetWindow handling a baked mocap preview session. It defines a BakedPreview record, stores preview state, manages async task for building previews, and provides methods to refresh, invalidate, and update export UI availability.

File Access
using System.Threading.Tasks;
using Sandbox;
using HumanoidMocap.Core;

namespace HumanoidMocap.EditorTools;

public sealed partial class RetargetWindow
{
    sealed record BakedPreview(ClipResult Clip,RetargetTargetSpec Target,string Space,int Revision,bool FirstPerson,
        Core.Motion.PropContactMotion Props,Core.Motion.CapturePlacement Placement,bool SupportsProps,
        Core.Motion.MotionDocument Source,System.Collections.Generic.IReadOnlyList<Core.Motion.WristPositionOffset> WristOffsets);
    BakedPreview _bakedPreview;
    Task _mocapPreviewTask=Task.CompletedTask;
    int _previewRevision,_motionLoadRevision;
    bool _previewPending;

    Task RefreshMocapPreviewAsync()
        =>_mocapPreviewTask=BuildMocapPreviewAsync(++_previewRevision);

    void InvalidateMocapPreview()
    {
        ++_previewRevision;_bakedPreview=null;_rebuiltBaked=null;_previewPending=false;
        UpdateTrackingStatus();
        UpdateExportAvailability();
    }
    void UpdateExportAvailability()
    {
        if(_exportMotionButton.IsValid())
            _exportMotionButton.Enabled=_editedMotion is not null&&_processing is null&&!_exportingMotion&&_rebuilding is null
                &&(_exportCaptured||(!_previewPending&&_bakedPreview is not null));
        RefreshMotionBricksButton();
    }
}