Stop now rewinds animated properties to the value they had before the
timeline first acted on them — not "first keyframe's value" as before.
- New per-track baseline stored runtime-only in a TMap keyed by
(ActorId, PropertyPath), so it survives track reordering and isn't
persisted to JSON (avoids stale data in legacy scenarios).
- Captured once: at track creation (first "+" on a fresh property) or
at SetData time for tracks loaded from a scenario. Never re-captured,
so scrub-then-Play doesn't shift the baseline to whatever the cursor
happened to be parked on.
- Stop writes the baselines back via ImportText, fires OnEditorPropertyChanged
+ RepNotify per track, then defers the actual StopSimulation by 100ms
so the BehaviorTree has a grace period to see the restored values via
OnRep / OnEditorPropertyChanged and transition to a neutral state before
AI tick is cut.
- Play cancels any in-flight deferred StopSimulation (Restart = Stop +
Play keeps the simulation running across the handoff).
- SetData and Clear reset the baseline map so loading a new scenario
doesn't inherit the previous one's baselines.
Also cache GetCurrentDisplayForProperty calls in RefreshDynamicPropertyValues:
the property panel was invoking the BP interface every tick per visible
combo. Now each row stores LastExportedValue + LastDisplayToShow and
short-circuits if the property's exported text is unchanged — BP only
runs on actual value transitions (seek, timeline keyframe, manual edit).
Duplicated across MainWidget and MainWidget_Legacy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>