From 7fdcf5596036eced557f90d1cd9ce9d9f35721a6 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 14 Apr 2026 02:38:47 +0200 Subject: [PATCH] Add support for additional control effects in document migration and runtime host --- src/document/migrate-scene-document.ts | 69 ++++++++++++++++++++++++++ src/runtime-three/runtime-host.ts | 4 ++ 2 files changed, 73 insertions(+) diff --git a/src/document/migrate-scene-document.ts b/src/document/migrate-scene-document.ts index 80cabeb5..ac8471b5 100644 --- a/src/document/migrate-scene-document.ts +++ b/src/document/migrate-scene-document.ts @@ -68,10 +68,17 @@ import { createPlayModelAnimationControlEffect, createPlaySoundControlEffect, createProjectGlobalControlTargetRef, + createSetAmbientLightColorControlEffect, + createSetAmbientLightIntensityControlEffect, createSetActorPresenceControlEffect, createSetInteractionEnabledControlEffect, createSetLightEnabledControlEffect, + createSetLightColorControlEffect, createSetLightIntensityControlEffect, + createSetModelInstanceVisibleControlEffect, + createSetSoundVolumeControlEffect, + createSetSunLightColorControlEffect, + createSetSunLightIntensityControlEffect, createSoundEmitterControlTargetRef, createStopModelAnimationControlEffect, createStopSoundControlEffect, @@ -2979,6 +2986,14 @@ function readControlEffect(value: unknown, label: string): ControlEffect { `${label}.target` ) as ReturnType }); + case "setModelInstanceVisible": + return createSetModelInstanceVisibleControlEffect({ + target: readControlTargetRef( + value.target, + `${label}.target` + ) as ReturnType, + visible: expectBoolean(value.visible, `${label}.visible`) + }); case "playSound": return createPlaySoundControlEffect({ target: readControlTargetRef( @@ -2993,6 +3008,14 @@ function readControlEffect(value: unknown, label: string): ControlEffect { `${label}.target` ) as ReturnType }); + case "setSoundVolume": + return createSetSoundVolumeControlEffect({ + target: readControlTargetRef( + value.target, + `${label}.target` + ) as ReturnType, + volume: expectNonNegativeFiniteNumber(value.volume, `${label}.volume`) + }); case "setInteractionEnabled": return createSetInteractionEnabledControlEffect({ target: readControlTargetRef( @@ -3020,6 +3043,52 @@ function readControlEffect(value: unknown, label: string): ControlEffect { `${label}.intensity` ) }); + case "setLightColor": + return createSetLightColorControlEffect({ + target: readControlTargetRef( + value.target, + `${label}.target` + ) as ReturnType, + colorHex: expectString(value.colorHex, `${label}.colorHex`) + }); + case "setAmbientLightIntensity": + return createSetAmbientLightIntensityControlEffect({ + target: readControlTargetRef( + value.target, + `${label}.target` + ) as ReturnType, + intensity: expectNonNegativeFiniteNumber( + value.intensity, + `${label}.intensity` + ) + }); + case "setAmbientLightColor": + return createSetAmbientLightColorControlEffect({ + target: readControlTargetRef( + value.target, + `${label}.target` + ) as ReturnType, + colorHex: expectString(value.colorHex, `${label}.colorHex`) + }); + case "setSunLightIntensity": + return createSetSunLightIntensityControlEffect({ + target: readControlTargetRef( + value.target, + `${label}.target` + ) as ReturnType, + intensity: expectNonNegativeFiniteNumber( + value.intensity, + `${label}.intensity` + ) + }); + case "setSunLightColor": + return createSetSunLightColorControlEffect({ + target: readControlTargetRef( + value.target, + `${label}.target` + ) as ReturnType, + colorHex: expectString(value.colorHex, `${label}.colorHex`) + }); default: throw new Error(`${label}.type must be a supported control effect.`); } diff --git a/src/runtime-three/runtime-host.ts b/src/runtime-three/runtime-host.ts index cc9808ff..1055fc8e 100644 --- a/src/runtime-three/runtime-host.ts +++ b/src/runtime-three/runtime-host.ts @@ -1268,6 +1268,10 @@ export class RuntimeHost { } } + if (!this.animationMixers.has(target.modelInstanceId)) { + return; + } + if (clipName === null) { this.applyStopAnimationAction(target.modelInstanceId); return;