Smooth WASM tool playback and preserve XYZAC DRO axes

This commit is contained in:
2026-08-30 18:58:57 +08:00
parent 99fe5a4151
commit a8ed8bdd3e

View File

@@ -98,6 +98,11 @@ export function XyzacToolPreview({ visual, view = "p", zoom = 1, rotateMode = fa
let renderedJoints: number[] = [];
let renderedActiveSegment = 0;
let renderedProgress = 0;
let paintedTick = -1;
let paintedPose: Point = renderedPose;
let paintedJoints: number[] = renderedJoints;
let paintedActiveSegment = 0;
let paintedProgress = 0;
let liveHistoryLine: THREE.Line | null = null;
let activeLiveLine: THREE.Line | null = null;
let lastHistoryTick = -1;
@@ -170,13 +175,26 @@ export function XyzacToolPreview({ visual, view = "p", zoom = 1, rotateMode = fa
playbackQueue.splice(0, index);
playbackStart += index * 10;
}
} else if (!staleState) {
} else if (!staleState && state.tick >= renderedTick) {
renderedTick = state.tick;
renderedPose = state.livePose;
renderedJoints = state.joints;
renderedActiveSegment = state.activeSegmentId ?? 0;
renderedProgress = state.activeProgress;
}
if (renderedTick < paintedTick) {
renderedTick = paintedTick;
renderedPose = paintedPose;
renderedJoints = paintedJoints;
renderedActiveSegment = paintedActiveSegment;
renderedProgress = paintedProgress;
} else {
paintedTick = renderedTick;
paintedPose = renderedPose;
paintedJoints = renderedJoints;
paintedActiveSegment = renderedActiveSegment;
paintedProgress = renderedProgress;
}
// The planned path is immutable for a loaded program. Rebuilding all
// geometries on every animation frame starves worker snapshots and
// makes an otherwise continuous WASM trajectory appear to stutter.
@@ -238,6 +256,7 @@ export function XyzacToolPreview({ visual, view = "p", zoom = 1, rotateMode = fa
liveTick = renderedTick;
}
element.dataset.xyzacLiveTraceCount = String(liveTrace.length);
element.dataset.xyzacRenderedTick = String(renderedTick);
const historyDue = liveTrace.length > 1 && (lastHistoryTick < 0 || renderedTick - lastHistoryTick >= 4);
if (historyDue) {
if (liveHistoryLine) { liveHistoryLine.geometry.dispose(); liveGroup.remove(liveHistoryLine); }