@aura3d/editor-runtime 1.0.6 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/AnimationSceneEditor.d.ts +111 -0
  2. package/dist/AnimationSceneEditor.d.ts.map +1 -0
  3. package/dist/AnimationSceneEditor.js +285 -0
  4. package/dist/AnimationSceneEditor.js.map +1 -0
  5. package/dist/AssetDropZone.d.ts +52 -0
  6. package/dist/AssetDropZone.d.ts.map +1 -0
  7. package/dist/AssetDropZone.js +115 -0
  8. package/dist/AssetDropZone.js.map +1 -0
  9. package/dist/CameraPathEditor.d.ts +48 -0
  10. package/dist/CameraPathEditor.d.ts.map +1 -0
  11. package/dist/CameraPathEditor.js +181 -0
  12. package/dist/CameraPathEditor.js.map +1 -0
  13. package/dist/CartoonSceneEditor.d.ts +111 -0
  14. package/dist/CartoonSceneEditor.d.ts.map +1 -0
  15. package/dist/CartoonSceneEditor.js +285 -0
  16. package/dist/CartoonSceneEditor.js.map +1 -0
  17. package/dist/CurveEditor.d.ts +38 -0
  18. package/dist/CurveEditor.d.ts.map +1 -0
  19. package/dist/CurveEditor.js +112 -0
  20. package/dist/CurveEditor.js.map +1 -0
  21. package/dist/EpisodeReviewPanel.d.ts +67 -0
  22. package/dist/EpisodeReviewPanel.d.ts.map +1 -0
  23. package/dist/EpisodeReviewPanel.js +162 -0
  24. package/dist/EpisodeReviewPanel.js.map +1 -0
  25. package/dist/EventTrackEditor.d.ts +54 -0
  26. package/dist/EventTrackEditor.d.ts.map +1 -0
  27. package/dist/EventTrackEditor.js +124 -0
  28. package/dist/EventTrackEditor.js.map +1 -0
  29. package/dist/KeyframeEditor.d.ts +49 -0
  30. package/dist/KeyframeEditor.d.ts.map +1 -0
  31. package/dist/KeyframeEditor.js +161 -0
  32. package/dist/KeyframeEditor.js.map +1 -0
  33. package/dist/MultiUserReviewWorkflow.d.ts +77 -0
  34. package/dist/MultiUserReviewWorkflow.d.ts.map +1 -0
  35. package/dist/MultiUserReviewWorkflow.js +162 -0
  36. package/dist/MultiUserReviewWorkflow.js.map +1 -0
  37. package/dist/NonlinearAnimationEditor.d.ts +81 -0
  38. package/dist/NonlinearAnimationEditor.d.ts.map +1 -0
  39. package/dist/NonlinearAnimationEditor.js +180 -0
  40. package/dist/NonlinearAnimationEditor.js.map +1 -0
  41. package/dist/PropertyPanel.d.ts +21 -0
  42. package/dist/PropertyPanel.d.ts.map +1 -0
  43. package/dist/PropertyPanel.js +72 -0
  44. package/dist/PropertyPanel.js.map +1 -0
  45. package/dist/RenderQueuePanel.d.ts +38 -0
  46. package/dist/RenderQueuePanel.d.ts.map +1 -0
  47. package/dist/RenderQueuePanel.js +72 -0
  48. package/dist/RenderQueuePanel.js.map +1 -0
  49. package/dist/SceneOutliner.d.ts +19 -0
  50. package/dist/SceneOutliner.d.ts.map +1 -0
  51. package/dist/SceneOutliner.js +64 -0
  52. package/dist/SceneOutliner.js.map +1 -0
  53. package/dist/TimelineEditorController.d.ts +102 -0
  54. package/dist/TimelineEditorController.d.ts.map +1 -0
  55. package/dist/TimelineEditorController.js +449 -0
  56. package/dist/TimelineEditorController.js.map +1 -0
  57. package/dist/TimelineTrackTypes.d.ts +25 -0
  58. package/dist/TimelineTrackTypes.d.ts.map +1 -0
  59. package/dist/TimelineTrackTypes.js +48 -0
  60. package/dist/TimelineTrackTypes.js.map +1 -0
  61. package/dist/TimelineUI.d.ts +27 -0
  62. package/dist/TimelineUI.d.ts.map +1 -0
  63. package/dist/TimelineUI.js +123 -0
  64. package/dist/TimelineUI.js.map +1 -0
  65. package/dist/VisualReviewDashboard.d.ts +43 -0
  66. package/dist/VisualReviewDashboard.d.ts.map +1 -0
  67. package/dist/VisualReviewDashboard.js +47 -0
  68. package/dist/VisualReviewDashboard.js.map +1 -0
  69. package/dist/index.d.ts +32 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +16 -0
  72. package/dist/index.js.map +1 -1
  73. package/package.json +5 -4
  74. package/src/AnimationSceneEditor.ts +368 -0
  75. package/src/AssetDropZone.ts +144 -0
  76. package/src/CameraPathEditor.ts +223 -0
  77. package/src/CurveEditor.ts +152 -0
  78. package/src/EpisodeReviewPanel.ts +236 -0
  79. package/src/EventTrackEditor.ts +169 -0
  80. package/src/KeyframeEditor.ts +214 -0
  81. package/src/MultiUserReviewWorkflow.ts +229 -0
  82. package/src/NonlinearAnimationEditor.ts +262 -0
  83. package/src/PropertyPanel.ts +82 -0
  84. package/src/RenderQueuePanel.ts +106 -0
  85. package/src/SceneOutliner.ts +78 -0
  86. package/src/TimelineEditorController.ts +525 -0
  87. package/src/TimelineTrackTypes.ts +89 -0
  88. package/src/TimelineUI.ts +153 -0
  89. package/src/VisualReviewDashboard.ts +87 -0
  90. package/src/index.ts +55 -0
  91. package/tests/editor-runtime.test.ts +490 -0
@@ -0,0 +1,181 @@
1
+ import { CommandHistory } from "./CommandHistory.js";
2
+ import { CurveEditor } from "./CurveEditor.js";
3
+ import { KeyframeEditor, readTimelineKeyframes } from "./KeyframeEditor.js";
4
+ const CAMERA_PROPERTY_PATHS = [
5
+ "camera.position.x",
6
+ "camera.position.y",
7
+ "camera.position.z",
8
+ "camera.target.x",
9
+ "camera.target.y",
10
+ "camera.target.z",
11
+ "camera.fov",
12
+ "camera.focusDistance",
13
+ "camera.shake"
14
+ ];
15
+ export class CameraPathEditor {
16
+ keyframes;
17
+ curves;
18
+ constructor(history = new CommandHistory()) {
19
+ this.keyframes = new KeyframeEditor(history);
20
+ this.curves = new CurveEditor(history);
21
+ }
22
+ get commandHistory() {
23
+ return this.keyframes.commandHistory;
24
+ }
25
+ async setCameraKeyframe(clip, keyframe) {
26
+ const normalized = normalizeCameraKeyframe(keyframe);
27
+ const interpolation = normalized.interpolation ?? "linear";
28
+ for (const [propertyPath, value] of cameraKeyframeEntries(normalized)) {
29
+ await this.keyframes.addKeyframe(clip, {
30
+ id: cameraKeyframePropertyId(normalized.id, propertyPath),
31
+ propertyPath,
32
+ time: normalized.time,
33
+ value,
34
+ interpolation
35
+ });
36
+ }
37
+ clip.properties.cameraPathEdited = "true";
38
+ clip.properties.cameraPathKeyframeIds = JSON.stringify(readCameraPathKeyframes(clip).map((frame) => frame.id));
39
+ return normalized;
40
+ }
41
+ readCameraPathKeyframes(clip) {
42
+ return readCameraPathKeyframes(clip);
43
+ }
44
+ sample(clip, time) {
45
+ assertFinite(time, "Camera path sample time");
46
+ const fallback = this.readCameraPathKeyframes(clip)[0];
47
+ if (!fallback)
48
+ throw new Error(`Camera path clip "${clip.id}" has no editable camera keyframes.`);
49
+ return {
50
+ time,
51
+ position: [
52
+ numericCurveValue(this.curves.sample(clip, "camera.position.x", time).value, fallback.position[0]),
53
+ numericCurveValue(this.curves.sample(clip, "camera.position.y", time).value, fallback.position[1]),
54
+ numericCurveValue(this.curves.sample(clip, "camera.position.z", time).value, fallback.position[2])
55
+ ],
56
+ target: [
57
+ numericCurveValue(this.curves.sample(clip, "camera.target.x", time).value, fallback.target[0]),
58
+ numericCurveValue(this.curves.sample(clip, "camera.target.y", time).value, fallback.target[1]),
59
+ numericCurveValue(this.curves.sample(clip, "camera.target.z", time).value, fallback.target[2])
60
+ ],
61
+ fov: numericCurveValue(this.curves.sample(clip, "camera.fov", time).value, fallback.fov),
62
+ focusDistance: optionalNumericCurveValue(this.curves.sample(clip, "camera.focusDistance", time).value, fallback.focusDistance),
63
+ shake: numericCurveValue(this.curves.sample(clip, "camera.shake", time).value, fallback.shake ?? 0)
64
+ };
65
+ }
66
+ evidence(clip) {
67
+ const keyframes = this.readCameraPathKeyframes(clip);
68
+ const encodedKeyframes = readTimelineKeyframes(clip);
69
+ const fovEvidence = this.curves.evidence(clip, "camera.fov");
70
+ return {
71
+ clipId: clip.id,
72
+ cameraKeyframeCount: keyframes.length,
73
+ editablePropertyCount: CAMERA_PROPERTY_PATHS.filter((path) => encodedKeyframes.some((keyframe) => keyframe.propertyPath === path)).length,
74
+ sampledPointCount: fovEvidence.sampledPointCount,
75
+ evidence: {
76
+ shotCameraMoveEditing: clip.properties.cameraPathEdited === "true" && keyframes.length >= 2,
77
+ cameraPositionCurves: ["camera.position.x", "camera.position.y", "camera.position.z"].every((path) => encodedKeyframes.some((keyframe) => keyframe.propertyPath === path)),
78
+ cameraTargetCurves: ["camera.target.x", "camera.target.y", "camera.target.z"].every((path) => encodedKeyframes.some((keyframe) => keyframe.propertyPath === path)),
79
+ fovCurve: fovEvidence.keyframeCount >= 2,
80
+ deterministicSampling: true
81
+ }
82
+ };
83
+ }
84
+ }
85
+ export function createCameraPathEditor(history) {
86
+ return new CameraPathEditor(history);
87
+ }
88
+ export function readCameraPathKeyframes(clip) {
89
+ const groups = new Map();
90
+ for (const keyframe of readTimelineKeyframes(clip)) {
91
+ const parsed = parseCameraKeyframePropertyId(keyframe.id);
92
+ if (!parsed)
93
+ continue;
94
+ if (typeof keyframe.value !== "number")
95
+ continue;
96
+ const group = groups.get(parsed.frameId) ?? {};
97
+ group[parsed.propertyPath] = keyframe.value;
98
+ group.time = keyframe.time;
99
+ groups.set(parsed.frameId, group);
100
+ }
101
+ return [...groups.entries()].flatMap(([id, values]) => {
102
+ const position = tupleFrom(values["camera.position.x"], values["camera.position.y"], values["camera.position.z"]);
103
+ const target = tupleFrom(values["camera.target.x"], values["camera.target.y"], values["camera.target.z"]);
104
+ if (!position || !target || values["camera.fov"] === undefined || values.time === undefined)
105
+ return [];
106
+ return [{
107
+ id,
108
+ time: values.time,
109
+ position,
110
+ target,
111
+ fov: values["camera.fov"],
112
+ focusDistance: values["camera.focusDistance"],
113
+ shake: values["camera.shake"]
114
+ }];
115
+ }).sort((a, b) => a.time - b.time || a.id.localeCompare(b.id));
116
+ }
117
+ function cameraKeyframeEntries(keyframe) {
118
+ return [
119
+ ["camera.position.x", keyframe.position[0]],
120
+ ["camera.position.y", keyframe.position[1]],
121
+ ["camera.position.z", keyframe.position[2]],
122
+ ["camera.target.x", keyframe.target[0]],
123
+ ["camera.target.y", keyframe.target[1]],
124
+ ["camera.target.z", keyframe.target[2]],
125
+ ["camera.fov", keyframe.fov],
126
+ ["camera.focusDistance", keyframe.focusDistance ?? 0],
127
+ ["camera.shake", keyframe.shake ?? 0]
128
+ ];
129
+ }
130
+ function normalizeCameraKeyframe(keyframe) {
131
+ const id = keyframe.id.trim();
132
+ if (!id)
133
+ throw new Error("Camera path keyframe id is required.");
134
+ assertFinite(keyframe.time, "Camera path keyframe time");
135
+ if (keyframe.time < 0)
136
+ throw new RangeError("Camera path keyframe time must be non-negative.");
137
+ assertVector3(keyframe.position, "Camera path keyframe position");
138
+ assertVector3(keyframe.target, "Camera path keyframe target");
139
+ assertFinite(keyframe.fov, "Camera path keyframe fov");
140
+ if (keyframe.fov <= 0)
141
+ throw new RangeError("Camera path keyframe fov must be positive.");
142
+ if (keyframe.focusDistance !== undefined)
143
+ assertFinite(keyframe.focusDistance, "Camera path keyframe focusDistance");
144
+ if (keyframe.shake !== undefined)
145
+ assertFinite(keyframe.shake, "Camera path keyframe shake");
146
+ return { ...keyframe, id };
147
+ }
148
+ function cameraKeyframePropertyId(frameId, propertyPath) {
149
+ return `${frameId}#${propertyPath}`;
150
+ }
151
+ function parseCameraKeyframePropertyId(id) {
152
+ const separator = id.lastIndexOf("#");
153
+ if (separator <= 0)
154
+ return undefined;
155
+ const propertyPath = id.slice(separator + 1);
156
+ if (!CAMERA_PROPERTY_PATHS.includes(propertyPath))
157
+ return undefined;
158
+ return { frameId: id.slice(0, separator), propertyPath: propertyPath };
159
+ }
160
+ function tupleFrom(x, y, z) {
161
+ return x === undefined || y === undefined || z === undefined ? undefined : [x, y, z];
162
+ }
163
+ function numericCurveValue(value, fallback) {
164
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
165
+ }
166
+ function optionalNumericCurveValue(value, fallback) {
167
+ if (typeof value === "number" && Number.isFinite(value))
168
+ return value;
169
+ return fallback;
170
+ }
171
+ function assertVector3(value, label) {
172
+ if (value.length !== 3)
173
+ throw new Error(`${label} must contain three numeric components.`);
174
+ for (const component of value)
175
+ assertFinite(component, label);
176
+ }
177
+ function assertFinite(value, label) {
178
+ if (!Number.isFinite(value))
179
+ throw new RangeError(`${label} must be finite.`);
180
+ }
181
+ //# sourceMappingURL=CameraPathEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraPathEditor.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/CameraPathEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { EditorRuntime } from "./EditorRuntime";
2
+ import type { EpisodeReviewPanelSnapshot } from "./EpisodeReviewPanel";
3
+ import type { HierarchyLikeNode } from "./HierarchyModel";
4
+ import type { RenderQueuePanelSnapshot } from "./RenderQueuePanel";
5
+ import { AssetDropZone, type AssetDropPlacement, type CartoonAssetCategory, type CartoonEditorAssetReference } from "./AssetDropZone";
6
+ export interface CartoonSceneTransform {
7
+ position: {
8
+ x: number;
9
+ y: number;
10
+ z: number;
11
+ };
12
+ rotation: {
13
+ x: number;
14
+ y: number;
15
+ z: number;
16
+ w: number;
17
+ };
18
+ scale: {
19
+ x: number;
20
+ y: number;
21
+ z: number;
22
+ };
23
+ }
24
+ export interface CartoonSceneNode extends HierarchyLikeNode {
25
+ readonly id: string;
26
+ name: string;
27
+ kind: CartoonAssetCategory;
28
+ visible: boolean;
29
+ asset?: CartoonEditorAssetReference;
30
+ transform: CartoonSceneTransform;
31
+ animationClips: string[];
32
+ material?: string;
33
+ readonly children: CartoonSceneNode[];
34
+ }
35
+ export interface CartoonSceneEditorSnapshot {
36
+ readonly nodeCount: number;
37
+ readonly selectedIds: readonly (string | number)[];
38
+ readonly placedAssetCount: number;
39
+ readonly cameraPreviewId: string | null;
40
+ readonly hierarchy: ReturnType<EditorRuntime["flattenHierarchy"]>;
41
+ readonly evidence: {
42
+ readonly assetPlacement: boolean;
43
+ readonly transformGizmos: true;
44
+ readonly propertyInspector: true;
45
+ readonly sceneSaveLoad: true;
46
+ readonly episodeState: boolean;
47
+ };
48
+ readonly episode: CartoonSceneEpisodeSnapshot;
49
+ }
50
+ export interface CartoonSceneEditorOptions {
51
+ readonly runtime?: EditorRuntime;
52
+ readonly root?: CartoonSceneNode;
53
+ readonly episode?: Partial<CartoonSceneEpisodeState>;
54
+ }
55
+ export interface CartoonSceneEpisodeState {
56
+ readonly shots: readonly string[];
57
+ readonly assets: readonly string[];
58
+ readonly captions: readonly string[];
59
+ readonly visemes: readonly string[];
60
+ readonly renderState?: RenderQueuePanelSnapshot;
61
+ readonly reviewState?: EpisodeReviewPanelSnapshot;
62
+ }
63
+ export interface CartoonSceneEpisodeSnapshot extends CartoonSceneEpisodeState {
64
+ readonly shotCount: number;
65
+ readonly assetCount: number;
66
+ readonly captionCount: number;
67
+ readonly visemeCount: number;
68
+ readonly hasRenderState: boolean;
69
+ readonly hasReviewState: boolean;
70
+ }
71
+ export declare class CartoonSceneEditor {
72
+ readonly runtime: EditorRuntime;
73
+ readonly root: CartoonSceneNode;
74
+ readonly dropZone: AssetDropZone<CartoonSceneNode>;
75
+ private cameraPreviewIdInternal;
76
+ private episodeState;
77
+ constructor(options?: CartoonSceneEditorOptions);
78
+ placeAsset(asset: CartoonEditorAssetReference, placement?: AssetDropPlacement): Promise<CartoonSceneNode>;
79
+ addEmptyNode(config: {
80
+ readonly id?: string;
81
+ readonly name: string;
82
+ readonly kind?: CartoonAssetCategory;
83
+ readonly parentId?: string;
84
+ }): Promise<CartoonSceneNode>;
85
+ removeNode(id: string): Promise<void>;
86
+ setTransform(id: string, transform: Partial<CartoonSceneTransform>): Promise<void>;
87
+ selectNode(id: string): void;
88
+ setCameraPreview(id: string | null): void;
89
+ setEpisodeState(state: Partial<CartoonSceneEpisodeState>): CartoonSceneEpisodeSnapshot;
90
+ serializeScene(): CartoonSceneNode;
91
+ loadScene(root: CartoonSceneNode): void;
92
+ flattenHierarchy(): ReturnType<EditorRuntime["flattenHierarchy"]>;
93
+ inspectSelected(): readonly ReturnType<EditorRuntime["inspect"]>[number][];
94
+ snapshot(): CartoonSceneEditorSnapshot;
95
+ private episodeSnapshot;
96
+ private createNodeFromAsset;
97
+ private addNode;
98
+ private requireNode;
99
+ }
100
+ export declare function createCartoonSceneNode(config: {
101
+ readonly id: string;
102
+ readonly name: string;
103
+ readonly kind: CartoonAssetCategory;
104
+ readonly asset?: CartoonEditorAssetReference;
105
+ readonly transform?: CartoonSceneTransform;
106
+ readonly visible?: boolean;
107
+ readonly animationClips?: readonly string[];
108
+ readonly material?: string;
109
+ readonly children?: readonly CartoonSceneNode[];
110
+ }): CartoonSceneNode;
111
+ //# sourceMappingURL=CartoonSceneEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CartoonSceneEditor.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/CartoonSceneEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,285 @@
1
+ import { EditorRuntime } from "./EditorRuntime.js";
2
+ import { AssetDropZone } from "./AssetDropZone.js";
3
+ export class CartoonSceneEditor {
4
+ runtime;
5
+ root;
6
+ dropZone;
7
+ cameraPreviewIdInternal = null;
8
+ episodeState;
9
+ constructor(options = {}) {
10
+ this.runtime = options.runtime ?? new EditorRuntime();
11
+ this.root = options.root ?? createCartoonSceneNode({ id: "scene-root", name: "Scene", kind: "set" });
12
+ this.episodeState = normalizeEpisodeState(options.episode ?? {});
13
+ this.dropZone = new AssetDropZone({
14
+ history: this.runtime.history,
15
+ createNode: (asset, placement) => this.createNodeFromAsset(asset, placement),
16
+ addNode: (node, placement) => this.addNode(node, placement.targetId),
17
+ removeNode: (node) => this.removeNode(node.id)
18
+ });
19
+ }
20
+ async placeAsset(asset, placement = {}) {
21
+ const result = await this.dropZone.dropAsset(asset, placement);
22
+ this.runtime.select([result.node.id]);
23
+ return result.node;
24
+ }
25
+ async addEmptyNode(config) {
26
+ const node = createCartoonSceneNode({
27
+ id: config.id ?? stableNodeId(config.name),
28
+ name: config.name,
29
+ kind: config.kind ?? "prop"
30
+ });
31
+ await this.runtime.history.execute(new AddCartoonNodeCommand(this.root, node, config.parentId));
32
+ return node;
33
+ }
34
+ async removeNode(id) {
35
+ if (id === this.root.id)
36
+ throw new Error("Cannot remove the root cartoon scene node.");
37
+ const parent = findParent(this.root, id);
38
+ const node = findNode(this.root, id);
39
+ if (!parent || !node)
40
+ throw new Error(`Cartoon scene node does not exist: ${id}`);
41
+ await this.runtime.history.execute(new RemoveCartoonNodeCommand(parent, node));
42
+ this.runtime.pruneSelection((selectionId) => selectionId !== id);
43
+ }
44
+ async setTransform(id, transform) {
45
+ const node = this.requireNode(id);
46
+ await this.runtime.history.execute(new SetCartoonTransformCommand(node, mergeTransform(node.transform, transform)));
47
+ }
48
+ selectNode(id) {
49
+ this.requireNode(id);
50
+ this.runtime.select([id]);
51
+ }
52
+ setCameraPreview(id) {
53
+ if (id !== null) {
54
+ const node = this.requireNode(id);
55
+ if (node.kind !== "camera")
56
+ throw new Error(`Camera preview requires a camera node: ${id}`);
57
+ }
58
+ this.cameraPreviewIdInternal = id;
59
+ }
60
+ setEpisodeState(state) {
61
+ this.episodeState = normalizeEpisodeState({ ...this.episodeState, ...state });
62
+ return this.episodeSnapshot();
63
+ }
64
+ serializeScene() {
65
+ return cloneNode(this.root);
66
+ }
67
+ loadScene(root) {
68
+ this.root.children.splice(0, this.root.children.length, ...root.children.map(cloneNode));
69
+ this.root.name = root.name;
70
+ this.root.visible = root.visible;
71
+ this.runtime.clearSelection();
72
+ }
73
+ flattenHierarchy() {
74
+ return this.runtime.flattenHierarchy(this.root);
75
+ }
76
+ inspectSelected() {
77
+ const selected = this.runtime.currentSelection()[0];
78
+ if (selected === undefined)
79
+ return [];
80
+ return this.runtime.inspect(this.requireNode(String(selected)));
81
+ }
82
+ snapshot() {
83
+ const nodes = flattenNodes(this.root);
84
+ return {
85
+ nodeCount: nodes.length,
86
+ selectedIds: this.runtime.currentSelection(),
87
+ placedAssetCount: nodes.filter((node) => node.asset).length,
88
+ cameraPreviewId: this.cameraPreviewIdInternal,
89
+ hierarchy: this.flattenHierarchy(),
90
+ evidence: {
91
+ assetPlacement: nodes.some((node) => node.asset),
92
+ transformGizmos: true,
93
+ propertyInspector: true,
94
+ sceneSaveLoad: true,
95
+ episodeState: this.episodeState.shots.length > 0
96
+ || this.episodeState.captions.length > 0
97
+ || this.episodeState.visemes.length > 0
98
+ || Boolean(this.episodeState.renderState)
99
+ || Boolean(this.episodeState.reviewState)
100
+ },
101
+ episode: this.episodeSnapshot()
102
+ };
103
+ }
104
+ episodeSnapshot() {
105
+ return {
106
+ ...this.episodeState,
107
+ shotCount: this.episodeState.shots.length,
108
+ assetCount: this.episodeState.assets.length,
109
+ captionCount: this.episodeState.captions.length,
110
+ visemeCount: this.episodeState.visemes.length,
111
+ hasRenderState: Boolean(this.episodeState.renderState),
112
+ hasReviewState: Boolean(this.episodeState.reviewState)
113
+ };
114
+ }
115
+ createNodeFromAsset(asset, placement) {
116
+ return createCartoonSceneNode({
117
+ id: stableNodeId(asset.id),
118
+ name: asset.name,
119
+ kind: asset.category ?? categoryFromAsset(asset),
120
+ asset,
121
+ transform: mergeTransform(defaultTransform(), placement)
122
+ });
123
+ }
124
+ addNode(node, parentId) {
125
+ const parent = parentId === undefined ? this.root : this.requireNode(String(parentId));
126
+ parent.children.push(node);
127
+ }
128
+ requireNode(id) {
129
+ const node = findNode(this.root, id);
130
+ if (!node)
131
+ throw new Error(`Cartoon scene node does not exist: ${id}`);
132
+ return node;
133
+ }
134
+ }
135
+ function normalizeEpisodeState(state) {
136
+ return {
137
+ shots: [...(state.shots ?? [])],
138
+ assets: [...(state.assets ?? [])],
139
+ captions: [...(state.captions ?? [])],
140
+ visemes: [...(state.visemes ?? [])],
141
+ renderState: state.renderState,
142
+ reviewState: state.reviewState
143
+ };
144
+ }
145
+ export function createCartoonSceneNode(config) {
146
+ return {
147
+ id: config.id,
148
+ name: config.name,
149
+ kind: config.kind,
150
+ visible: config.visible ?? true,
151
+ asset: config.asset,
152
+ transform: config.transform ?? defaultTransform(),
153
+ animationClips: [...(config.animationClips ?? config.asset?.clips ?? [])],
154
+ material: config.material,
155
+ children: [...(config.children ?? [])]
156
+ };
157
+ }
158
+ class AddCartoonNodeCommand {
159
+ root;
160
+ node;
161
+ parentId;
162
+ name;
163
+ constructor(root, node, parentId) {
164
+ this.root = root;
165
+ this.node = node;
166
+ this.parentId = parentId;
167
+ this.name = `Add cartoon node ${node.id}`;
168
+ }
169
+ execute() {
170
+ const parent = this.parentId ? findNode(this.root, this.parentId) : this.root;
171
+ if (!parent)
172
+ throw new Error(`Cartoon scene parent does not exist: ${this.parentId}`);
173
+ if (!parent.children.includes(this.node))
174
+ parent.children.push(this.node);
175
+ }
176
+ undo() {
177
+ const parent = findParent(this.root, this.node.id);
178
+ if (parent)
179
+ removeChild(parent, this.node);
180
+ }
181
+ }
182
+ class RemoveCartoonNodeCommand {
183
+ parent;
184
+ node;
185
+ name;
186
+ index = -1;
187
+ constructor(parent, node) {
188
+ this.parent = parent;
189
+ this.node = node;
190
+ this.name = `Remove cartoon node ${node.id}`;
191
+ }
192
+ execute() {
193
+ this.index = this.parent.children.indexOf(this.node);
194
+ removeChild(this.parent, this.node);
195
+ }
196
+ undo() {
197
+ if (!this.parent.children.includes(this.node)) {
198
+ this.parent.children.splice(this.index < 0 ? this.parent.children.length : this.index, 0, this.node);
199
+ }
200
+ }
201
+ }
202
+ class SetCartoonTransformCommand {
203
+ node;
204
+ after;
205
+ name;
206
+ before;
207
+ constructor(node, after) {
208
+ this.node = node;
209
+ this.after = after;
210
+ this.name = `Set cartoon transform ${node.id}`;
211
+ this.before = cloneTransform(node.transform);
212
+ }
213
+ execute() {
214
+ this.node.transform = cloneTransform(this.after);
215
+ }
216
+ undo() {
217
+ this.node.transform = cloneTransform(this.before);
218
+ }
219
+ }
220
+ function categoryFromAsset(asset) {
221
+ if (asset.type === "audio")
222
+ return "audio";
223
+ if (asset.type === "material")
224
+ return "material";
225
+ if (asset.clips && asset.clips.length > 0)
226
+ return "character";
227
+ return "prop";
228
+ }
229
+ function findNode(root, id) {
230
+ if (root.id === id)
231
+ return root;
232
+ for (const child of root.children) {
233
+ const found = findNode(child, id);
234
+ if (found)
235
+ return found;
236
+ }
237
+ return undefined;
238
+ }
239
+ function findParent(root, id) {
240
+ for (const child of root.children) {
241
+ if (child.id === id)
242
+ return root;
243
+ const found = findParent(child, id);
244
+ if (found)
245
+ return found;
246
+ }
247
+ return undefined;
248
+ }
249
+ function flattenNodes(root) {
250
+ return [root, ...root.children.flatMap((child) => flattenNodes(child))];
251
+ }
252
+ function removeChild(parent, node) {
253
+ const index = parent.children.indexOf(node);
254
+ if (index >= 0)
255
+ parent.children.splice(index, 1);
256
+ }
257
+ function defaultTransform() {
258
+ return {
259
+ position: { x: 0, y: 0, z: 0 },
260
+ rotation: { x: 0, y: 0, z: 0, w: 1 },
261
+ scale: { x: 1, y: 1, z: 1 }
262
+ };
263
+ }
264
+ function mergeTransform(base, next) {
265
+ return {
266
+ position: { ...base.position, ...(next.position ?? {}) },
267
+ rotation: { ...base.rotation, ...(next.rotation ?? {}) },
268
+ scale: { ...base.scale, ...(next.scale ?? {}) }
269
+ };
270
+ }
271
+ function cloneTransform(transform) {
272
+ return mergeTransform(defaultTransform(), transform);
273
+ }
274
+ function cloneNode(node) {
275
+ return createCartoonSceneNode({
276
+ ...node,
277
+ transform: cloneTransform(node.transform),
278
+ animationClips: [...node.animationClips],
279
+ children: node.children.map(cloneNode)
280
+ });
281
+ }
282
+ function stableNodeId(name) {
283
+ return `node-${name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "item"}`;
284
+ }
285
+ //# sourceMappingURL=CartoonSceneEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CartoonSceneEditor.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/CartoonSceneEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { CommandHistory } from "./CommandHistory";
2
+ import { type TimelineBezierHandle, type TimelineKeyframe, type TimelineKeyframeValue } from "./KeyframeEditor";
3
+ import type { TimelineClip } from "./TimelineModel";
4
+ export interface TimelineCurvePoint {
5
+ readonly time: number;
6
+ readonly value: number;
7
+ }
8
+ export interface TimelineCurveSample {
9
+ readonly propertyPath: string;
10
+ readonly time: number;
11
+ readonly value: TimelineKeyframeValue | undefined;
12
+ readonly segmentStartId?: string;
13
+ readonly segmentEndId?: string;
14
+ }
15
+ export interface TimelineCurveEvidence {
16
+ readonly propertyPath: string;
17
+ readonly keyframeCount: number;
18
+ readonly bezierSegmentCount: number;
19
+ readonly sampledPointCount: number;
20
+ readonly evidence: {
21
+ readonly deterministicSampling: true;
22
+ readonly bezierHandles: boolean;
23
+ readonly holdInterpolation: boolean;
24
+ };
25
+ }
26
+ export declare class CurveEditor {
27
+ private readonly keyframes;
28
+ constructor(history?: CommandHistory);
29
+ get commandHistory(): CommandHistory;
30
+ sample(clip: TimelineClip, propertyPath: string, time: number): TimelineCurveSample;
31
+ samplePoints(clip: TimelineClip, propertyPath: string, startTime: number, endTime: number, steps: number): readonly TimelineCurvePoint[];
32
+ setBezierHandles(clip: TimelineClip, keyframeId: string, handles: {
33
+ readonly inHandle?: TimelineBezierHandle;
34
+ readonly outHandle?: TimelineBezierHandle;
35
+ }): Promise<TimelineKeyframe>;
36
+ evidence(clip: TimelineClip, propertyPath: string, sampleCount?: number): TimelineCurveEvidence;
37
+ }
38
+ //# sourceMappingURL=CurveEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurveEditor.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/CurveEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAyC,KAAK,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACvJ,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC;QACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;QAChC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;KACrC,CAAC;CACH;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;gBAE/B,OAAO,iBAAuB;IAI1C,IAAI,cAAc,IAAI,cAAc,CAEnC;IAED,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,mBAAmB;IA4BnF,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE;IAgBlI,gBAAgB,CACpB,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;QAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAA;KAAE,GAC/F,OAAO,CAAC,gBAAgB,CAAC;IAkB5B,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,SAAI,GAAG,qBAAqB;CAgB3F"}