diff --git a/src/runtime-three/runtime-host.ts b/src/runtime-three/runtime-host.ts index 6a81d21d..416f4ade 100644 --- a/src/runtime-three/runtime-host.ts +++ b/src/runtime-three/runtime-host.ts @@ -341,6 +341,7 @@ export class RuntimeHost { private previousPauseInputActive = false; private readonly pressedKeys = new Set(); private activeScheduledImpulseRoutineIds = new Set(); + private completedScheduledImpulseRoutineIds = new Set(); constructor(options: { enableRendering?: boolean } = {}) { const enableRendering = options.enableRendering ?? true; @@ -740,6 +741,7 @@ export class RuntimeHost { this.currentClockState = null; this.lastPublishedClockState = null; this.activeScheduledImpulseRoutineIds.clear(); + this.completedScheduledImpulseRoutineIds.clear(); this.manualPauseActive = false; this.controlPauseActive = false; this.previousPauseInputActive = false; @@ -3082,13 +3084,18 @@ export class RuntimeHost { this.syncResolvedControlStateToRuntime(nextResolvedControl); for (const impulseRoutine of nextResolvedScheduler.impulses) { - if (this.activeScheduledImpulseRoutineIds.has(impulseRoutine.routineId)) { + if ( + this.activeScheduledImpulseRoutineIds.has(impulseRoutine.routineId) || + this.completedScheduledImpulseRoutineIds.has(impulseRoutine.routineId) + ) { continue; } for (const effect of impulseRoutine.effects) { this.dispatchImpulseSequenceEffect(effect, null); } + + this.completedScheduledImpulseRoutineIds.add(impulseRoutine.routineId); } this.runtimeScene.scheduler.resolved = nextResolvedScheduler;