@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.
- package/dist/AnimationSceneEditor.d.ts +111 -0
- package/dist/AnimationSceneEditor.d.ts.map +1 -0
- package/dist/AnimationSceneEditor.js +285 -0
- package/dist/AnimationSceneEditor.js.map +1 -0
- package/dist/AssetDropZone.d.ts +52 -0
- package/dist/AssetDropZone.d.ts.map +1 -0
- package/dist/AssetDropZone.js +115 -0
- package/dist/AssetDropZone.js.map +1 -0
- package/dist/CameraPathEditor.d.ts +48 -0
- package/dist/CameraPathEditor.d.ts.map +1 -0
- package/dist/CameraPathEditor.js +181 -0
- package/dist/CameraPathEditor.js.map +1 -0
- package/dist/CartoonSceneEditor.d.ts +111 -0
- package/dist/CartoonSceneEditor.d.ts.map +1 -0
- package/dist/CartoonSceneEditor.js +285 -0
- package/dist/CartoonSceneEditor.js.map +1 -0
- package/dist/CurveEditor.d.ts +38 -0
- package/dist/CurveEditor.d.ts.map +1 -0
- package/dist/CurveEditor.js +112 -0
- package/dist/CurveEditor.js.map +1 -0
- package/dist/EpisodeReviewPanel.d.ts +67 -0
- package/dist/EpisodeReviewPanel.d.ts.map +1 -0
- package/dist/EpisodeReviewPanel.js +162 -0
- package/dist/EpisodeReviewPanel.js.map +1 -0
- package/dist/EventTrackEditor.d.ts +54 -0
- package/dist/EventTrackEditor.d.ts.map +1 -0
- package/dist/EventTrackEditor.js +124 -0
- package/dist/EventTrackEditor.js.map +1 -0
- package/dist/KeyframeEditor.d.ts +49 -0
- package/dist/KeyframeEditor.d.ts.map +1 -0
- package/dist/KeyframeEditor.js +161 -0
- package/dist/KeyframeEditor.js.map +1 -0
- package/dist/MultiUserReviewWorkflow.d.ts +77 -0
- package/dist/MultiUserReviewWorkflow.d.ts.map +1 -0
- package/dist/MultiUserReviewWorkflow.js +162 -0
- package/dist/MultiUserReviewWorkflow.js.map +1 -0
- package/dist/NonlinearAnimationEditor.d.ts +81 -0
- package/dist/NonlinearAnimationEditor.d.ts.map +1 -0
- package/dist/NonlinearAnimationEditor.js +180 -0
- package/dist/NonlinearAnimationEditor.js.map +1 -0
- package/dist/PropertyPanel.d.ts +21 -0
- package/dist/PropertyPanel.d.ts.map +1 -0
- package/dist/PropertyPanel.js +72 -0
- package/dist/PropertyPanel.js.map +1 -0
- package/dist/RenderQueuePanel.d.ts +38 -0
- package/dist/RenderQueuePanel.d.ts.map +1 -0
- package/dist/RenderQueuePanel.js +72 -0
- package/dist/RenderQueuePanel.js.map +1 -0
- package/dist/SceneOutliner.d.ts +19 -0
- package/dist/SceneOutliner.d.ts.map +1 -0
- package/dist/SceneOutliner.js +64 -0
- package/dist/SceneOutliner.js.map +1 -0
- package/dist/TimelineEditorController.d.ts +102 -0
- package/dist/TimelineEditorController.d.ts.map +1 -0
- package/dist/TimelineEditorController.js +449 -0
- package/dist/TimelineEditorController.js.map +1 -0
- package/dist/TimelineTrackTypes.d.ts +25 -0
- package/dist/TimelineTrackTypes.d.ts.map +1 -0
- package/dist/TimelineTrackTypes.js +48 -0
- package/dist/TimelineTrackTypes.js.map +1 -0
- package/dist/TimelineUI.d.ts +27 -0
- package/dist/TimelineUI.d.ts.map +1 -0
- package/dist/TimelineUI.js +123 -0
- package/dist/TimelineUI.js.map +1 -0
- package/dist/VisualReviewDashboard.d.ts +43 -0
- package/dist/VisualReviewDashboard.d.ts.map +1 -0
- package/dist/VisualReviewDashboard.js +47 -0
- package/dist/VisualReviewDashboard.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
- package/src/AnimationSceneEditor.ts +368 -0
- package/src/AssetDropZone.ts +144 -0
- package/src/CameraPathEditor.ts +223 -0
- package/src/CurveEditor.ts +152 -0
- package/src/EpisodeReviewPanel.ts +236 -0
- package/src/EventTrackEditor.ts +169 -0
- package/src/KeyframeEditor.ts +214 -0
- package/src/MultiUserReviewWorkflow.ts +229 -0
- package/src/NonlinearAnimationEditor.ts +262 -0
- package/src/PropertyPanel.ts +82 -0
- package/src/RenderQueuePanel.ts +106 -0
- package/src/SceneOutliner.ts +78 -0
- package/src/TimelineEditorController.ts +525 -0
- package/src/TimelineTrackTypes.ts +89 -0
- package/src/TimelineUI.ts +153 -0
- package/src/VisualReviewDashboard.ts +87 -0
- package/src/index.ts +55 -0
- package/tests/editor-runtime.test.ts +490 -0
|
@@ -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 AnimationAssetCategory, type AnimationEditorAssetReference } from "./AssetDropZone";
|
|
6
|
+
export interface AnimationSceneTransform {
|
|
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 AnimationSceneNode extends HierarchyLikeNode {
|
|
25
|
+
readonly id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
kind: AnimationAssetCategory;
|
|
28
|
+
visible: boolean;
|
|
29
|
+
asset?: AnimationEditorAssetReference;
|
|
30
|
+
transform: AnimationSceneTransform;
|
|
31
|
+
animationClips: string[];
|
|
32
|
+
material?: string;
|
|
33
|
+
readonly children: AnimationSceneNode[];
|
|
34
|
+
}
|
|
35
|
+
export interface AnimationSceneEditorSnapshot {
|
|
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: AnimationSceneEpisodeSnapshot;
|
|
49
|
+
}
|
|
50
|
+
export interface AnimationSceneEditorOptions {
|
|
51
|
+
readonly runtime?: EditorRuntime;
|
|
52
|
+
readonly root?: AnimationSceneNode;
|
|
53
|
+
readonly episode?: Partial<AnimationSceneEpisodeState>;
|
|
54
|
+
}
|
|
55
|
+
export interface AnimationSceneEpisodeState {
|
|
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 AnimationSceneEpisodeSnapshot extends AnimationSceneEpisodeState {
|
|
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 AnimationSceneEditor {
|
|
72
|
+
readonly runtime: EditorRuntime;
|
|
73
|
+
readonly root: AnimationSceneNode;
|
|
74
|
+
readonly dropZone: AssetDropZone<AnimationSceneNode>;
|
|
75
|
+
private cameraPreviewIdInternal;
|
|
76
|
+
private episodeState;
|
|
77
|
+
constructor(options?: AnimationSceneEditorOptions);
|
|
78
|
+
placeAsset(asset: AnimationEditorAssetReference, placement?: AssetDropPlacement): Promise<AnimationSceneNode>;
|
|
79
|
+
addEmptyNode(config: {
|
|
80
|
+
readonly id?: string;
|
|
81
|
+
readonly name: string;
|
|
82
|
+
readonly kind?: AnimationAssetCategory;
|
|
83
|
+
readonly parentId?: string;
|
|
84
|
+
}): Promise<AnimationSceneNode>;
|
|
85
|
+
removeNode(id: string): Promise<void>;
|
|
86
|
+
setTransform(id: string, transform: Partial<AnimationSceneTransform>): Promise<void>;
|
|
87
|
+
selectNode(id: string): void;
|
|
88
|
+
setCameraPreview(id: string | null): void;
|
|
89
|
+
setEpisodeState(state: Partial<AnimationSceneEpisodeState>): AnimationSceneEpisodeSnapshot;
|
|
90
|
+
serializeScene(): AnimationSceneNode;
|
|
91
|
+
loadScene(root: AnimationSceneNode): void;
|
|
92
|
+
flattenHierarchy(): ReturnType<EditorRuntime["flattenHierarchy"]>;
|
|
93
|
+
inspectSelected(): readonly ReturnType<EditorRuntime["inspect"]>[number][];
|
|
94
|
+
snapshot(): AnimationSceneEditorSnapshot;
|
|
95
|
+
private episodeSnapshot;
|
|
96
|
+
private createNodeFromAsset;
|
|
97
|
+
private addNode;
|
|
98
|
+
private requireNode;
|
|
99
|
+
}
|
|
100
|
+
export declare function createAnimationSceneNode(config: {
|
|
101
|
+
readonly id: string;
|
|
102
|
+
readonly name: string;
|
|
103
|
+
readonly kind: AnimationAssetCategory;
|
|
104
|
+
readonly asset?: AnimationEditorAssetReference;
|
|
105
|
+
readonly transform?: AnimationSceneTransform;
|
|
106
|
+
readonly visible?: boolean;
|
|
107
|
+
readonly animationClips?: readonly string[];
|
|
108
|
+
readonly material?: string;
|
|
109
|
+
readonly children?: readonly AnimationSceneNode[];
|
|
110
|
+
}): AnimationSceneNode;
|
|
111
|
+
//# sourceMappingURL=AnimationSceneEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationSceneEditor.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/AnimationSceneEditor.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 AnimationSceneEditor {
|
|
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 ?? createAnimationSceneNode({ 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 = createAnimationSceneNode({
|
|
27
|
+
id: config.id ?? stableNodeId(config.name),
|
|
28
|
+
name: config.name,
|
|
29
|
+
kind: config.kind ?? "prop"
|
|
30
|
+
});
|
|
31
|
+
await this.runtime.history.execute(new AddAnimationNodeCommand(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 animation scene node.");
|
|
37
|
+
const parent = findParent(this.root, id);
|
|
38
|
+
const node = findNode(this.root, id);
|
|
39
|
+
if (!parent || !node)
|
|
40
|
+
throw new Error(`Animation scene node does not exist: ${id}`);
|
|
41
|
+
await this.runtime.history.execute(new RemoveAnimationNodeCommand(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 SetAnimationTransformCommand(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 createAnimationSceneNode({
|
|
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(`Animation 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 createAnimationSceneNode(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 AddAnimationNodeCommand {
|
|
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 animation 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(`Animation 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 RemoveAnimationNodeCommand {
|
|
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 animation 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 SetAnimationTransformCommand {
|
|
203
|
+
node;
|
|
204
|
+
after;
|
|
205
|
+
name;
|
|
206
|
+
before;
|
|
207
|
+
constructor(node, after) {
|
|
208
|
+
this.node = node;
|
|
209
|
+
this.after = after;
|
|
210
|
+
this.name = `Set animation 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 createAnimationSceneNode({
|
|
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=AnimationSceneEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimationSceneEditor.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/AnimationSceneEditor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CommandHistory } from "./CommandHistory";
|
|
2
|
+
import type { EditorProjectAssetDocument } from "./ProjectSerializer";
|
|
3
|
+
export type AnimationAssetCategory = "character" | "set" | "prop" | "camera" | "light" | "audio" | "material" | "unknown";
|
|
4
|
+
export interface AnimationEditorAssetReference extends EditorProjectAssetDocument {
|
|
5
|
+
readonly kind?: "aura-asset-ref" | "editor-asset-ref";
|
|
6
|
+
readonly category?: AnimationAssetCategory;
|
|
7
|
+
readonly profile?: "animation-character" | "animation-set" | "animation-prop" | "animation-audio" | string;
|
|
8
|
+
readonly style?: string;
|
|
9
|
+
readonly rigType?: "humanoid" | "creature" | "prop" | "none";
|
|
10
|
+
readonly lipSyncReady?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface AssetDropPlacement {
|
|
13
|
+
readonly targetId?: string | number;
|
|
14
|
+
readonly position?: {
|
|
15
|
+
readonly x: number;
|
|
16
|
+
readonly y: number;
|
|
17
|
+
readonly z: number;
|
|
18
|
+
};
|
|
19
|
+
readonly rotation?: {
|
|
20
|
+
readonly x: number;
|
|
21
|
+
readonly y: number;
|
|
22
|
+
readonly z: number;
|
|
23
|
+
readonly w?: number;
|
|
24
|
+
};
|
|
25
|
+
readonly scale?: {
|
|
26
|
+
readonly x: number;
|
|
27
|
+
readonly y: number;
|
|
28
|
+
readonly z: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export interface AssetDropResult<TNode> {
|
|
32
|
+
readonly asset: AnimationEditorAssetReference;
|
|
33
|
+
readonly node: TNode;
|
|
34
|
+
readonly placement: AssetDropPlacement;
|
|
35
|
+
}
|
|
36
|
+
export interface AssetDropZoneOptions<TNode> {
|
|
37
|
+
readonly history?: CommandHistory;
|
|
38
|
+
readonly createNode: (asset: AnimationEditorAssetReference, placement: AssetDropPlacement) => TNode;
|
|
39
|
+
readonly addNode: (node: TNode, placement: AssetDropPlacement) => void;
|
|
40
|
+
readonly removeNode: (node: TNode) => void;
|
|
41
|
+
readonly onDrop?: (result: AssetDropResult<TNode>) => void;
|
|
42
|
+
}
|
|
43
|
+
export declare class AssetDropZone<TNode = unknown> {
|
|
44
|
+
private readonly options;
|
|
45
|
+
readonly history: CommandHistory;
|
|
46
|
+
constructor(options: AssetDropZoneOptions<TNode>);
|
|
47
|
+
dropAsset(asset: AnimationEditorAssetReference, placement?: AssetDropPlacement): Promise<AssetDropResult<TNode>>;
|
|
48
|
+
bindElement(element: HTMLElement): () => void;
|
|
49
|
+
}
|
|
50
|
+
export declare function serializeAssetForDrag(asset: AnimationEditorAssetReference): string;
|
|
51
|
+
export declare function readAssetFromDataTransfer(dataTransfer: DataTransfer | null): AnimationEditorAssetReference | undefined;
|
|
52
|
+
//# sourceMappingURL=AssetDropZone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetDropZone.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/AssetDropZone.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { CommandHistory } from "./CommandHistory.js";
|
|
2
|
+
export class AssetDropZone {
|
|
3
|
+
options;
|
|
4
|
+
history;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.options = options;
|
|
7
|
+
this.history = options.history ?? new CommandHistory();
|
|
8
|
+
}
|
|
9
|
+
async dropAsset(asset, placement = {}) {
|
|
10
|
+
validateAssetReference(asset);
|
|
11
|
+
validatePlacement(placement);
|
|
12
|
+
const node = this.options.createNode(asset, placement);
|
|
13
|
+
await this.history.execute(new DropAssetCommand(this.options, asset, node, placement));
|
|
14
|
+
const result = { asset, node, placement };
|
|
15
|
+
this.options.onDrop?.(result);
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
bindElement(element) {
|
|
19
|
+
const dragover = (event) => {
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
if (event.dataTransfer)
|
|
22
|
+
event.dataTransfer.dropEffect = "copy";
|
|
23
|
+
};
|
|
24
|
+
const drop = (event) => {
|
|
25
|
+
event.preventDefault();
|
|
26
|
+
const asset = readAssetFromDataTransfer(event.dataTransfer);
|
|
27
|
+
if (!asset)
|
|
28
|
+
return;
|
|
29
|
+
void this.dropAsset(asset, {
|
|
30
|
+
position: {
|
|
31
|
+
x: Number(element.dataset.dropX ?? 0),
|
|
32
|
+
y: Number(element.dataset.dropY ?? 0),
|
|
33
|
+
z: Number(element.dataset.dropZ ?? 0)
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
element.addEventListener("dragover", dragover);
|
|
38
|
+
element.addEventListener("drop", drop);
|
|
39
|
+
return () => {
|
|
40
|
+
element.removeEventListener("dragover", dragover);
|
|
41
|
+
element.removeEventListener("drop", drop);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
class DropAssetCommand {
|
|
46
|
+
options;
|
|
47
|
+
asset;
|
|
48
|
+
node;
|
|
49
|
+
placement;
|
|
50
|
+
name;
|
|
51
|
+
constructor(options, asset, node, placement) {
|
|
52
|
+
this.options = options;
|
|
53
|
+
this.asset = asset;
|
|
54
|
+
this.node = node;
|
|
55
|
+
this.placement = placement;
|
|
56
|
+
this.name = `Drop asset ${asset.id}`;
|
|
57
|
+
}
|
|
58
|
+
execute() {
|
|
59
|
+
this.options.addNode(this.node, this.placement);
|
|
60
|
+
}
|
|
61
|
+
undo() {
|
|
62
|
+
this.options.removeNode(this.node);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export function serializeAssetForDrag(asset) {
|
|
66
|
+
validateAssetReference(asset);
|
|
67
|
+
return JSON.stringify(asset);
|
|
68
|
+
}
|
|
69
|
+
export function readAssetFromDataTransfer(dataTransfer) {
|
|
70
|
+
if (!dataTransfer)
|
|
71
|
+
return undefined;
|
|
72
|
+
const encoded = dataTransfer.getData("application/x-aura3d-asset") || dataTransfer.getData("text/plain");
|
|
73
|
+
if (!encoded.trim())
|
|
74
|
+
return undefined;
|
|
75
|
+
const parsed = JSON.parse(encoded);
|
|
76
|
+
validateAssetReference(parsed);
|
|
77
|
+
return parsed;
|
|
78
|
+
}
|
|
79
|
+
function validateAssetReference(asset) {
|
|
80
|
+
if (!asset.id?.trim())
|
|
81
|
+
throw new Error("Dropped Aura3D asset id is required.");
|
|
82
|
+
if (!asset.name?.trim())
|
|
83
|
+
throw new Error(`Dropped Aura3D asset name is required: ${asset.id}`);
|
|
84
|
+
if ((asset.uri && /^https?:\/\//i.test(asset.uri) || asset.source && /^https?:\/\//i.test(asset.source)) && asset.kind !== "aura-asset-ref") {
|
|
85
|
+
throw new Error(`Dropped asset "${asset.id}" must be a typed Aura3D asset reference, not a raw URL.`);
|
|
86
|
+
}
|
|
87
|
+
if (asset.source !== undefined && !asset.source.trim())
|
|
88
|
+
throw new Error(`Dropped Aura3D asset source cannot be empty: ${asset.id}`);
|
|
89
|
+
if (asset.license !== undefined && !asset.license.trim())
|
|
90
|
+
throw new Error(`Dropped Aura3D asset license cannot be empty: ${asset.id}`);
|
|
91
|
+
if (asset.category === "character") {
|
|
92
|
+
if (asset.rigType === "none")
|
|
93
|
+
throw new Error(`Animation character asset "${asset.id}" must be rigged.`);
|
|
94
|
+
if ((asset.clips?.length ?? 0) === 0)
|
|
95
|
+
throw new Error(`Animation character asset "${asset.id}" requires animation clip metadata.`);
|
|
96
|
+
if (!asset.lipSyncReady)
|
|
97
|
+
throw new Error(`Animation character asset "${asset.id}" requires lip-sync readiness metadata.`);
|
|
98
|
+
}
|
|
99
|
+
if ((asset.category === "set" || asset.category === "audio") && !asset.license) {
|
|
100
|
+
throw new Error(`Animation ${asset.category} asset "${asset.id}" requires license metadata.`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function validatePlacement(placement) {
|
|
104
|
+
validateVector(placement.position, "position");
|
|
105
|
+
validateVector(placement.rotation, "rotation");
|
|
106
|
+
validateVector(placement.scale, "scale");
|
|
107
|
+
}
|
|
108
|
+
function validateVector(vector, label) {
|
|
109
|
+
if (!vector)
|
|
110
|
+
return;
|
|
111
|
+
if (!Number.isFinite(vector.x) || !Number.isFinite(vector.y) || !Number.isFinite(vector.z)) {
|
|
112
|
+
throw new Error(`Asset drop ${label} must contain finite x/y/z values.`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=AssetDropZone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetDropZone.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/AssetDropZone.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CommandHistory } from "./CommandHistory";
|
|
2
|
+
import { type TimelineKeyframe } from "./KeyframeEditor";
|
|
3
|
+
import type { TimelineClip } from "./TimelineModel";
|
|
4
|
+
export type EditorCameraVector3 = readonly [number, number, number];
|
|
5
|
+
export interface EditorCameraPathKeyframe {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly time: number;
|
|
8
|
+
readonly position: EditorCameraVector3;
|
|
9
|
+
readonly target: EditorCameraVector3;
|
|
10
|
+
readonly fov: number;
|
|
11
|
+
readonly focusDistance?: number;
|
|
12
|
+
readonly shake?: number;
|
|
13
|
+
readonly interpolation?: TimelineKeyframe["interpolation"];
|
|
14
|
+
}
|
|
15
|
+
export interface EditorCameraPathSample {
|
|
16
|
+
readonly time: number;
|
|
17
|
+
readonly position: EditorCameraVector3;
|
|
18
|
+
readonly target: EditorCameraVector3;
|
|
19
|
+
readonly fov: number;
|
|
20
|
+
readonly focusDistance?: number;
|
|
21
|
+
readonly shake: number;
|
|
22
|
+
}
|
|
23
|
+
export interface EditorCameraPathEvidence {
|
|
24
|
+
readonly clipId: string;
|
|
25
|
+
readonly cameraKeyframeCount: number;
|
|
26
|
+
readonly editablePropertyCount: number;
|
|
27
|
+
readonly sampledPointCount: number;
|
|
28
|
+
readonly evidence: {
|
|
29
|
+
readonly shotCameraMoveEditing: boolean;
|
|
30
|
+
readonly cameraPositionCurves: boolean;
|
|
31
|
+
readonly cameraTargetCurves: boolean;
|
|
32
|
+
readonly fovCurve: boolean;
|
|
33
|
+
readonly deterministicSampling: true;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export declare class CameraPathEditor {
|
|
37
|
+
private readonly keyframes;
|
|
38
|
+
private readonly curves;
|
|
39
|
+
constructor(history?: CommandHistory);
|
|
40
|
+
get commandHistory(): CommandHistory;
|
|
41
|
+
setCameraKeyframe(clip: TimelineClip, keyframe: EditorCameraPathKeyframe): Promise<EditorCameraPathKeyframe>;
|
|
42
|
+
readCameraPathKeyframes(clip: TimelineClip): readonly EditorCameraPathKeyframe[];
|
|
43
|
+
sample(clip: TimelineClip, time: number): EditorCameraPathSample;
|
|
44
|
+
evidence(clip: TimelineClip): EditorCameraPathEvidence;
|
|
45
|
+
}
|
|
46
|
+
export declare function createCameraPathEditor(history?: CommandHistory): CameraPathEditor;
|
|
47
|
+
export declare function readCameraPathKeyframes(clip: TimelineClip): readonly EditorCameraPathKeyframe[];
|
|
48
|
+
//# sourceMappingURL=CameraPathEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraPathEditor.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/CameraPathEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,gBAAgB,CAAC,eAAe,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;QACxC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;QACvC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;QACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,qBAAqB,EAAE,IAAI,CAAC;KACtC,CAAC;CACH;AAgBD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,OAAO,iBAAuB;IAK1C,IAAI,cAAc,IAAI,cAAc,CAEnC;IAEK,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAiBlH,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,wBAAwB,EAAE;IAIhF,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,sBAAsB;IAsBhE,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,wBAAwB;CAkBvD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAEjF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,wBAAwB,EAAE,CAyB/F"}
|