auto-git:

[change] src/scheduler/project-schedule-control-options.ts
This commit is contained in:
2026-04-23 02:35:47 +02:00
parent 593bb500ec
commit 01022b19c4

View File

@@ -2,8 +2,11 @@ import type { ProjectDocument, ProjectScene } from "../document/scene-document";
import { getScenePathLabel, getScenePaths } from "../document/paths"; import { getScenePathLabel, getScenePaths } from "../document/paths";
import { import {
createActiveSceneControlTargetRef, createActiveSceneControlTargetRef,
createActivateCameraRigOverrideControlEffect,
createFollowActorPathControlEffect, createFollowActorPathControlEffect,
createActorControlTargetRef, createActorControlTargetRef,
createCameraRigControlTargetRef,
createClearCameraRigOverrideControlEffect,
createInteractionControlTargetRef, createInteractionControlTargetRef,
createLightControlTargetRef, createLightControlTargetRef,
createModelInstanceControlTargetRef, createModelInstanceControlTargetRef,
@@ -36,6 +39,8 @@ import { getSortedEntityDisplayLabels } from "../entities/entity-labels";
import { listProjectNpcActors } from "../entities/npc-actor-registry"; import { listProjectNpcActors } from "../entities/npc-actor-registry";
export const PROJECT_SCHEDULE_EFFECT_OPTION_IDS = [ export const PROJECT_SCHEDULE_EFFECT_OPTION_IDS = [
"camera.activate",
"camera.clear",
"actor.present", "actor.present",
"actor.hidden", "actor.hidden",
"actor.playAnimation", "actor.playAnimation",
@@ -105,18 +110,29 @@ export interface ProjectScheduleTargetOption {
const PROJECT_SCHEDULE_GROUP_ORDER: Record<string, number> = { const PROJECT_SCHEDULE_GROUP_ORDER: Record<string, number> = {
Project: 0, Project: 0,
"Scene Lighting": 1, "Scene Lighting": 1,
Actors: 2, "Camera Rigs": 2,
"Model Instances": 3, Actors: 3,
"Sound Emitters": 4, "Model Instances": 4,
Interactions: 5, "Sound Emitters": 5,
Lights: 6, Interactions: 6,
Other: 7 Lights: 7,
Other: 8
}; };
const PROJECT_SCHEDULE_EFFECT_OPTIONS: Record< const PROJECT_SCHEDULE_EFFECT_OPTIONS: Record<
ProjectScheduleEffectOptionId, ProjectScheduleEffectOptionId,
ProjectScheduleEffectOption ProjectScheduleEffectOption
> = { > = {
"camera.activate": {
id: "camera.activate",
label: "Activate Camera Override",
valueKind: "none"
},
"camera.clear": {
id: "camera.clear",
label: "Clear Camera Override",
valueKind: "none"
},
"actor.present": { "actor.present": {
id: "actor.present", id: "actor.present",
label: "Present", label: "Present",
@@ -415,6 +431,19 @@ export function listProjectScheduleTargetOptions(
}); });
break; break;
} }
case "cameraRig": {
const target = createCameraRigControlTargetRef(entity.id);
pushOption({
key: getControlTargetRefKey(target),
target,
label,
subtitle: getSceneTargetSubtitle(scene),
groupLabel: "Camera Rigs",
defaults: {}
});
break;
}
case "interactable": { case "interactable": {
const target = createInteractionControlTargetRef("interactable", entity.id); const target = createInteractionControlTargetRef("interactable", entity.id);
@@ -518,6 +547,13 @@ export function listProjectScheduleEffectOptions(
return options; return options;
} }
case "entity": case "entity":
if (targetOption.target.entityKind === "cameraRig") {
return [
PROJECT_SCHEDULE_EFFECT_OPTIONS["camera.activate"],
PROJECT_SCHEDULE_EFFECT_OPTIONS["camera.clear"]
];
}
if (targetOption.target.entityKind === "soundEmitter") { if (targetOption.target.entityKind === "soundEmitter") {
return [ return [
PROJECT_SCHEDULE_EFFECT_OPTIONS["sound.play"], PROJECT_SCHEDULE_EFFECT_OPTIONS["sound.play"],
@@ -553,6 +589,9 @@ export function getProjectSequenceControlStepClassForEffectOptionId(
effectOptionId: ProjectScheduleEffectOptionId effectOptionId: ProjectScheduleEffectOptionId
): "held" | "impulse" { ): "held" | "impulse" {
switch (effectOptionId) { switch (effectOptionId) {
case "camera.activate":
case "camera.clear":
return "held";
case "model.playAnimation": case "model.playAnimation":
case "model.stopAnimation": case "model.stopAnimation":
case "sound.play": case "sound.play":
@@ -587,6 +626,10 @@ export function getProjectScheduleEffectOptionId(
throw new Error( throw new Error(
"Project time pause is intentionally not exposed in the schedule editor because a scheduler routine cannot safely pause its own project clock." "Project time pause is intentionally not exposed in the schedule editor because a scheduler routine cannot safely pause its own project clock."
); );
case "activateCameraRigOverride":
return "camera.activate";
case "clearCameraRigOverride":
return "camera.clear";
case "setActorPresence": case "setActorPresence":
return effect.active ? "actor.present" : "actor.hidden"; return effect.active ? "actor.present" : "actor.hidden";
case "playActorAnimation": case "playActorAnimation":
@@ -633,6 +676,18 @@ export function createProjectScheduleEffectFromOption(options: {
const { targetOption } = options; const { targetOption } = options;
switch (options.effectOptionId) { switch (options.effectOptionId) {
case "camera.activate":
return createActivateCameraRigOverrideControlEffect({
target: createCameraRigControlTargetRef(
(targetOption.target as ReturnType<typeof createCameraRigControlTargetRef>).entityId
)
});
case "camera.clear":
return createClearCameraRigOverrideControlEffect({
target: createCameraRigControlTargetRef(
(targetOption.target as ReturnType<typeof createCameraRigControlTargetRef>).entityId
)
});
case "actor.present": case "actor.present":
return createSetActorPresenceControlEffect({ return createSetActorPresenceControlEffect({
target: createActorControlTargetRef( target: createActorControlTargetRef(