Add support for additional control effects in document migration and runtime host

This commit is contained in:
2026-04-14 02:38:47 +02:00
parent a995cd172e
commit 7fdcf55960
2 changed files with 73 additions and 0 deletions

View File

@@ -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<typeof createModelInstanceControlTargetRef>
});
case "setModelInstanceVisible":
return createSetModelInstanceVisibleControlEffect({
target: readControlTargetRef(
value.target,
`${label}.target`
) as ReturnType<typeof createModelInstanceControlTargetRef>,
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<typeof createSoundEmitterControlTargetRef>
});
case "setSoundVolume":
return createSetSoundVolumeControlEffect({
target: readControlTargetRef(
value.target,
`${label}.target`
) as ReturnType<typeof createSoundEmitterControlTargetRef>,
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<typeof createLightControlTargetRef>,
colorHex: expectString(value.colorHex, `${label}.colorHex`)
});
case "setAmbientLightIntensity":
return createSetAmbientLightIntensityControlEffect({
target: readControlTargetRef(
value.target,
`${label}.target`
) as ReturnType<typeof createActiveSceneControlTargetRef>,
intensity: expectNonNegativeFiniteNumber(
value.intensity,
`${label}.intensity`
)
});
case "setAmbientLightColor":
return createSetAmbientLightColorControlEffect({
target: readControlTargetRef(
value.target,
`${label}.target`
) as ReturnType<typeof createActiveSceneControlTargetRef>,
colorHex: expectString(value.colorHex, `${label}.colorHex`)
});
case "setSunLightIntensity":
return createSetSunLightIntensityControlEffect({
target: readControlTargetRef(
value.target,
`${label}.target`
) as ReturnType<typeof createActiveSceneControlTargetRef>,
intensity: expectNonNegativeFiniteNumber(
value.intensity,
`${label}.intensity`
)
});
case "setSunLightColor":
return createSetSunLightColorControlEffect({
target: readControlTargetRef(
value.target,
`${label}.target`
) as ReturnType<typeof createActiveSceneControlTargetRef>,
colorHex: expectString(value.colorHex, `${label}.colorHex`)
});
default:
throw new Error(`${label}.type must be a supported control effect.`);
}

View File

@@ -1268,6 +1268,10 @@ export class RuntimeHost {
}
}
if (!this.animationMixers.has(target.modelInstanceId)) {
return;
}
if (clipName === null) {
this.applyStopAnimationAction(target.modelInstanceId);
return;