@aura3d/editor-runtime 1.0.6
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/README.md +20 -0
- package/dist/Command.d.ts +11 -0
- package/dist/Command.d.ts.map +1 -0
- package/dist/Command.js +2 -0
- package/dist/Command.js.map +1 -0
- package/dist/CommandHistory.d.ts +20 -0
- package/dist/CommandHistory.d.ts.map +1 -0
- package/dist/CommandHistory.js +124 -0
- package/dist/CommandHistory.js.map +1 -0
- package/dist/DiagnosticsOverlayModel.d.ts +30 -0
- package/dist/DiagnosticsOverlayModel.d.ts.map +1 -0
- package/dist/DiagnosticsOverlayModel.js +57 -0
- package/dist/DiagnosticsOverlayModel.js.map +1 -0
- package/dist/EditorPluginHost.d.ts +46 -0
- package/dist/EditorPluginHost.d.ts.map +1 -0
- package/dist/EditorPluginHost.js +57 -0
- package/dist/EditorPluginHost.js.map +1 -0
- package/dist/EditorRuntime.d.ts +95 -0
- package/dist/EditorRuntime.d.ts.map +1 -0
- package/dist/EditorRuntime.js +277 -0
- package/dist/EditorRuntime.js.map +1 -0
- package/dist/EditorStateModel.d.ts +93 -0
- package/dist/EditorStateModel.d.ts.map +1 -0
- package/dist/EditorStateModel.js +251 -0
- package/dist/EditorStateModel.js.map +1 -0
- package/dist/Gizmo.d.ts +43 -0
- package/dist/Gizmo.d.ts.map +1 -0
- package/dist/Gizmo.js +60 -0
- package/dist/Gizmo.js.map +1 -0
- package/dist/HierarchyModel.d.ts +21 -0
- package/dist/HierarchyModel.d.ts.map +1 -0
- package/dist/HierarchyModel.js +32 -0
- package/dist/HierarchyModel.js.map +1 -0
- package/dist/InspectorModel.d.ts +16 -0
- package/dist/InspectorModel.d.ts.map +1 -0
- package/dist/InspectorModel.js +53 -0
- package/dist/InspectorModel.js.map +1 -0
- package/dist/LocalizationAccessibilityFixtures.d.ts +70 -0
- package/dist/LocalizationAccessibilityFixtures.d.ts.map +1 -0
- package/dist/LocalizationAccessibilityFixtures.js +275 -0
- package/dist/LocalizationAccessibilityFixtures.js.map +1 -0
- package/dist/MaterialVariantWorkflow.d.ts +19 -0
- package/dist/MaterialVariantWorkflow.d.ts.map +1 -0
- package/dist/MaterialVariantWorkflow.js +82 -0
- package/dist/MaterialVariantWorkflow.js.map +1 -0
- package/dist/PickingService.d.ts +58 -0
- package/dist/PickingService.d.ts.map +1 -0
- package/dist/PickingService.js +119 -0
- package/dist/PickingService.js.map +1 -0
- package/dist/PlayModeBridge.d.ts +14 -0
- package/dist/PlayModeBridge.d.ts.map +1 -0
- package/dist/PlayModeBridge.js +23 -0
- package/dist/PlayModeBridge.js.map +1 -0
- package/dist/PrefabRegistry.d.ts +41 -0
- package/dist/PrefabRegistry.d.ts.map +1 -0
- package/dist/PrefabRegistry.js +119 -0
- package/dist/PrefabRegistry.js.map +1 -0
- package/dist/ProjectSerializer.d.ts +82 -0
- package/dist/ProjectSerializer.d.ts.map +1 -0
- package/dist/ProjectSerializer.js +131 -0
- package/dist/ProjectSerializer.js.map +1 -0
- package/dist/RotateGizmo.d.ts +5 -0
- package/dist/RotateGizmo.d.ts.map +1 -0
- package/dist/RotateGizmo.js +37 -0
- package/dist/RotateGizmo.js.map +1 -0
- package/dist/ScaleGizmo.d.ts +5 -0
- package/dist/ScaleGizmo.d.ts.map +1 -0
- package/dist/ScaleGizmo.js +42 -0
- package/dist/ScaleGizmo.js.map +1 -0
- package/dist/Selection.d.ts +20 -0
- package/dist/Selection.d.ts.map +1 -0
- package/dist/Selection.js +46 -0
- package/dist/Selection.js.map +1 -0
- package/dist/ShaderGraphModel.d.ts +69 -0
- package/dist/ShaderGraphModel.d.ts.map +1 -0
- package/dist/ShaderGraphModel.js +172 -0
- package/dist/ShaderGraphModel.js.map +1 -0
- package/dist/StaticExportRuntime.d.ts +13 -0
- package/dist/StaticExportRuntime.d.ts.map +1 -0
- package/dist/StaticExportRuntime.js +307 -0
- package/dist/StaticExportRuntime.js.map +1 -0
- package/dist/TimelineModel.d.ts +175 -0
- package/dist/TimelineModel.d.ts.map +1 -0
- package/dist/TimelineModel.js +335 -0
- package/dist/TimelineModel.js.map +1 -0
- package/dist/TimelineRuntimeBridge.d.ts +98 -0
- package/dist/TimelineRuntimeBridge.d.ts.map +1 -0
- package/dist/TimelineRuntimeBridge.js +186 -0
- package/dist/TimelineRuntimeBridge.js.map +1 -0
- package/dist/TranslateGizmo.d.ts +5 -0
- package/dist/TranslateGizmo.d.ts.map +1 -0
- package/dist/TranslateGizmo.js +41 -0
- package/dist/TranslateGizmo.js.map +1 -0
- package/dist/commands/CreateNodeCommand.d.ts +14 -0
- package/dist/commands/CreateNodeCommand.d.ts.map +1 -0
- package/dist/commands/CreateNodeCommand.js +16 -0
- package/dist/commands/CreateNodeCommand.js.map +1 -0
- package/dist/commands/DeleteNodeCommand.d.ts +13 -0
- package/dist/commands/DeleteNodeCommand.d.ts.map +1 -0
- package/dist/commands/DeleteNodeCommand.js +55 -0
- package/dist/commands/DeleteNodeCommand.js.map +1 -0
- package/dist/commands/ReparentNodeCommand.d.ts +24 -0
- package/dist/commands/ReparentNodeCommand.d.ts.map +1 -0
- package/dist/commands/ReparentNodeCommand.js +39 -0
- package/dist/commands/ReparentNodeCommand.js.map +1 -0
- package/dist/commands/SetPropertyCommand.d.ts +14 -0
- package/dist/commands/SetPropertyCommand.d.ts.map +1 -0
- package/dist/commands/SetPropertyCommand.js +43 -0
- package/dist/commands/SetPropertyCommand.js.map +1 -0
- package/dist/commands/TransformCommand.d.ts +42 -0
- package/dist/commands/TransformCommand.d.ts.map +1 -0
- package/dist/commands/TransformCommand.js +72 -0
- package/dist/commands/TransformCommand.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/package.json +17 -0
- package/src/Command.ts +11 -0
- package/src/CommandHistory.ts +136 -0
- package/src/DiagnosticsOverlayModel.ts +85 -0
- package/src/EditorPluginHost.ts +106 -0
- package/src/EditorRuntime.ts +349 -0
- package/src/EditorStateModel.ts +336 -0
- package/src/Gizmo.ts +101 -0
- package/src/HierarchyModel.ts +57 -0
- package/src/InspectorModel.ts +71 -0
- package/src/LocalizationAccessibilityFixtures.ts +368 -0
- package/src/MaterialVariantWorkflow.ts +101 -0
- package/src/PickingService.ts +174 -0
- package/src/PlayModeBridge.ts +27 -0
- package/src/PrefabRegistry.ts +164 -0
- package/src/ProjectSerializer.ts +200 -0
- package/src/RotateGizmo.ts +35 -0
- package/src/ScaleGizmo.ts +40 -0
- package/src/Selection.ts +63 -0
- package/src/ShaderGraphModel.ts +254 -0
- package/src/StaticExportRuntime.ts +322 -0
- package/src/TimelineModel.ts +466 -0
- package/src/TimelineRuntimeBridge.ts +280 -0
- package/src/TranslateGizmo.ts +39 -0
- package/src/commands/CreateNodeCommand.ts +23 -0
- package/src/commands/DeleteNodeCommand.ts +74 -0
- package/src/commands/ReparentNodeCommand.ts +55 -0
- package/src/commands/SetPropertyCommand.ts +47 -0
- package/src/commands/TransformCommand.ts +107 -0
- package/src/index.ts +85 -0
- package/tests/editor-runtime.test.ts +597 -0
- package/tsconfig.json +7 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface MaterialVariantState {
|
|
2
|
+
readonly assetId: string;
|
|
3
|
+
readonly variants: readonly string[];
|
|
4
|
+
readonly selected: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface MaterialVariantRenderOptions {
|
|
7
|
+
readonly materialVariant?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class MaterialVariantWorkflow {
|
|
10
|
+
private readonly states;
|
|
11
|
+
register(assetId: string, variants: readonly string[], selected?: string | null): MaterialVariantState;
|
|
12
|
+
unregister(assetId: string): void;
|
|
13
|
+
select(assetId: string, variant: string | null): MaterialVariantState;
|
|
14
|
+
state(assetId: string): MaterialVariantState;
|
|
15
|
+
snapshot(): readonly MaterialVariantState[];
|
|
16
|
+
renderOptions(assetId: string): MaterialVariantRenderOptions;
|
|
17
|
+
clear(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=MaterialVariantWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaterialVariantWorkflow.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/MaterialVariantWorkflow.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAElE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAW,GAAG,oBAAoB;IAgB5G,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,oBAAoB;IAerE,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB;IAS5C,QAAQ,IAAI,SAAS,oBAAoB,EAAE;IAQ3C,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,4BAA4B;IAK5D,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export class MaterialVariantWorkflow {
|
|
2
|
+
states = new Map();
|
|
3
|
+
register(assetId, variants, selected = null) {
|
|
4
|
+
const normalizedAssetId = normalizeAssetId(assetId);
|
|
5
|
+
const normalizedVariants = normalizeVariants(variants);
|
|
6
|
+
const normalizedSelected = selected === null ? null : normalizeVariantName(selected);
|
|
7
|
+
if (normalizedSelected !== null && !normalizedVariants.includes(normalizedSelected)) {
|
|
8
|
+
throw new Error(`Material variant ${normalizedSelected} is not available for asset ${normalizedAssetId}.`);
|
|
9
|
+
}
|
|
10
|
+
const state = {
|
|
11
|
+
assetId: normalizedAssetId,
|
|
12
|
+
variants: normalizedVariants,
|
|
13
|
+
selected: normalizedSelected
|
|
14
|
+
};
|
|
15
|
+
this.states.set(normalizedAssetId, state);
|
|
16
|
+
return state;
|
|
17
|
+
}
|
|
18
|
+
unregister(assetId) {
|
|
19
|
+
this.states.delete(normalizeAssetId(assetId));
|
|
20
|
+
}
|
|
21
|
+
select(assetId, variant) {
|
|
22
|
+
const normalizedAssetId = normalizeAssetId(assetId);
|
|
23
|
+
const state = this.states.get(normalizedAssetId);
|
|
24
|
+
if (!state) {
|
|
25
|
+
throw new Error(`Material variant asset ${normalizedAssetId} is not registered.`);
|
|
26
|
+
}
|
|
27
|
+
const selected = variant === null ? null : normalizeVariantName(variant);
|
|
28
|
+
if (selected !== null && !state.variants.includes(selected)) {
|
|
29
|
+
throw new Error(`Material variant ${selected} is not available for asset ${normalizedAssetId}.`);
|
|
30
|
+
}
|
|
31
|
+
const next = { ...state, selected };
|
|
32
|
+
this.states.set(normalizedAssetId, next);
|
|
33
|
+
return next;
|
|
34
|
+
}
|
|
35
|
+
state(assetId) {
|
|
36
|
+
const normalizedAssetId = normalizeAssetId(assetId);
|
|
37
|
+
const state = this.states.get(normalizedAssetId);
|
|
38
|
+
if (!state) {
|
|
39
|
+
throw new Error(`Material variant asset ${normalizedAssetId} is not registered.`);
|
|
40
|
+
}
|
|
41
|
+
return state;
|
|
42
|
+
}
|
|
43
|
+
snapshot() {
|
|
44
|
+
return [...this.states.values()].map((state) => ({
|
|
45
|
+
assetId: state.assetId,
|
|
46
|
+
variants: [...state.variants],
|
|
47
|
+
selected: state.selected
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
renderOptions(assetId) {
|
|
51
|
+
const selected = this.state(assetId).selected;
|
|
52
|
+
return selected === null ? {} : { materialVariant: selected };
|
|
53
|
+
}
|
|
54
|
+
clear() {
|
|
55
|
+
this.states.clear();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function normalizeAssetId(assetId) {
|
|
59
|
+
const normalized = assetId.trim();
|
|
60
|
+
if (normalized.length === 0) {
|
|
61
|
+
throw new Error("Material variant asset id cannot be empty.");
|
|
62
|
+
}
|
|
63
|
+
return normalized;
|
|
64
|
+
}
|
|
65
|
+
function normalizeVariantName(variant) {
|
|
66
|
+
const normalized = variant.trim();
|
|
67
|
+
if (normalized.length === 0) {
|
|
68
|
+
throw new Error("Material variant name cannot be empty.");
|
|
69
|
+
}
|
|
70
|
+
return normalized;
|
|
71
|
+
}
|
|
72
|
+
function normalizeVariants(variants) {
|
|
73
|
+
if (variants.length === 0) {
|
|
74
|
+
throw new Error("Material variant list cannot be empty.");
|
|
75
|
+
}
|
|
76
|
+
const normalized = variants.map(normalizeVariantName);
|
|
77
|
+
if (new Set(normalized).size !== normalized.length) {
|
|
78
|
+
throw new Error("Material variant list cannot contain duplicate names.");
|
|
79
|
+
}
|
|
80
|
+
return normalized;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=MaterialVariantWorkflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaterialVariantWorkflow.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/MaterialVariantWorkflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Ray } from "@aura3d/math";
|
|
2
|
+
import type { SceneNode } from "@aura3d/scene";
|
|
3
|
+
type Tuple3 = readonly [number, number, number];
|
|
4
|
+
export interface EditorPickTarget {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly node: SceneNode;
|
|
7
|
+
readonly bounds: {
|
|
8
|
+
readonly min: Tuple3;
|
|
9
|
+
readonly max: Tuple3;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface EditorPickHit {
|
|
13
|
+
readonly target: EditorPickTarget;
|
|
14
|
+
readonly distance: number;
|
|
15
|
+
}
|
|
16
|
+
export interface EditorPickingColorId {
|
|
17
|
+
readonly targetId: string;
|
|
18
|
+
readonly encodedId: number;
|
|
19
|
+
readonly color: readonly [number, number, number, number];
|
|
20
|
+
}
|
|
21
|
+
export interface EditorPickingEvidenceSnapshot {
|
|
22
|
+
readonly source: "origin-master-gpu-picking-adapted";
|
|
23
|
+
readonly registeredTargetCount: number;
|
|
24
|
+
readonly width: number;
|
|
25
|
+
readonly height: number;
|
|
26
|
+
readonly needsUpdate: boolean;
|
|
27
|
+
readonly idCapacity: number;
|
|
28
|
+
readonly sampleColorId: EditorPickingColorId | null;
|
|
29
|
+
readonly decodedSampleTargetId: string | null;
|
|
30
|
+
readonly colorIds: readonly EditorPickingColorId[];
|
|
31
|
+
readonly evidence: {
|
|
32
|
+
readonly colorIdEncoding: boolean;
|
|
33
|
+
readonly colorIdDecoding: boolean;
|
|
34
|
+
readonly framebufferResizeBoundary: boolean;
|
|
35
|
+
readonly raycastFallback: boolean;
|
|
36
|
+
};
|
|
37
|
+
readonly blockedClaims: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
export declare class PickingService {
|
|
40
|
+
private readonly targets;
|
|
41
|
+
private width;
|
|
42
|
+
private height;
|
|
43
|
+
private needsUpdate;
|
|
44
|
+
setTargets(targets: readonly EditorPickTarget[]): void;
|
|
45
|
+
addTarget(target: EditorPickTarget): void;
|
|
46
|
+
removeTarget(id: string): void;
|
|
47
|
+
pick(ray: Ray): EditorPickHit | undefined;
|
|
48
|
+
resizePickingBuffer(width: number, height: number): void;
|
|
49
|
+
invalidatePickingBuffer(): void;
|
|
50
|
+
colorIdForTarget(targetId: string): EditorPickingColorId | undefined;
|
|
51
|
+
targetIdFromColor(color: readonly [number, number, number] | readonly [number, number, number, number]): string | undefined;
|
|
52
|
+
snapshot(): EditorPickingEvidenceSnapshot;
|
|
53
|
+
static idToColor(id: number): readonly [number, number, number, number];
|
|
54
|
+
static colorToId(red: number, green: number, blue: number): number;
|
|
55
|
+
private colorIds;
|
|
56
|
+
}
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=PickingService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickingService.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PickingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export class PickingService {
|
|
2
|
+
targets = new Map();
|
|
3
|
+
width = 1024;
|
|
4
|
+
height = 768;
|
|
5
|
+
needsUpdate = true;
|
|
6
|
+
setTargets(targets) {
|
|
7
|
+
this.targets.clear();
|
|
8
|
+
for (const target of targets) {
|
|
9
|
+
this.targets.set(target.id, target);
|
|
10
|
+
}
|
|
11
|
+
this.needsUpdate = true;
|
|
12
|
+
}
|
|
13
|
+
addTarget(target) {
|
|
14
|
+
this.targets.set(target.id, target);
|
|
15
|
+
this.needsUpdate = true;
|
|
16
|
+
}
|
|
17
|
+
removeTarget(id) {
|
|
18
|
+
this.targets.delete(id);
|
|
19
|
+
this.needsUpdate = true;
|
|
20
|
+
}
|
|
21
|
+
pick(ray) {
|
|
22
|
+
const hit = [...this.targets.values()]
|
|
23
|
+
.map((target) => ({ target, distance: intersectBounds(ray, target.bounds) }))
|
|
24
|
+
.filter((hit) => hit.distance !== undefined)
|
|
25
|
+
.sort((a, b) => a.distance - b.distance)[0];
|
|
26
|
+
this.needsUpdate = false;
|
|
27
|
+
return hit;
|
|
28
|
+
}
|
|
29
|
+
resizePickingBuffer(width, height) {
|
|
30
|
+
if (!Number.isInteger(width) || !Number.isInteger(height) || width < 1 || height < 1) {
|
|
31
|
+
throw new RangeError("Picking buffer dimensions must be positive integers.");
|
|
32
|
+
}
|
|
33
|
+
this.width = width;
|
|
34
|
+
this.height = height;
|
|
35
|
+
this.needsUpdate = true;
|
|
36
|
+
}
|
|
37
|
+
invalidatePickingBuffer() {
|
|
38
|
+
this.needsUpdate = true;
|
|
39
|
+
}
|
|
40
|
+
colorIdForTarget(targetId) {
|
|
41
|
+
const ids = this.colorIds();
|
|
42
|
+
return ids.find((entry) => entry.targetId === targetId);
|
|
43
|
+
}
|
|
44
|
+
targetIdFromColor(color) {
|
|
45
|
+
const encodedId = PickingService.colorToId(color[0] ?? 0, color[1] ?? 0, color[2] ?? 0);
|
|
46
|
+
const entry = this.colorIds().find((candidate) => candidate.encodedId === encodedId);
|
|
47
|
+
return entry?.targetId;
|
|
48
|
+
}
|
|
49
|
+
snapshot() {
|
|
50
|
+
const colorIds = this.colorIds();
|
|
51
|
+
const sampleColorId = colorIds[0] ?? null;
|
|
52
|
+
const decodedSampleTargetId = sampleColorId ? this.targetIdFromColor(sampleColorId.color) ?? null : null;
|
|
53
|
+
return {
|
|
54
|
+
source: "origin-master-gpu-picking-adapted",
|
|
55
|
+
registeredTargetCount: this.targets.size,
|
|
56
|
+
width: this.width,
|
|
57
|
+
height: this.height,
|
|
58
|
+
needsUpdate: this.needsUpdate,
|
|
59
|
+
idCapacity: 0xffffff,
|
|
60
|
+
sampleColorId,
|
|
61
|
+
decodedSampleTargetId,
|
|
62
|
+
colorIds,
|
|
63
|
+
evidence: {
|
|
64
|
+
colorIdEncoding: colorIds.every((entry) => entry.color[3] === 255 && entry.encodedId >= 1),
|
|
65
|
+
colorIdDecoding: sampleColorId !== null && decodedSampleTargetId === sampleColorId.targetId,
|
|
66
|
+
framebufferResizeBoundary: this.width > 0 && this.height > 0,
|
|
67
|
+
raycastFallback: true
|
|
68
|
+
},
|
|
69
|
+
blockedClaims: [
|
|
70
|
+
"production GPU framebuffer picking pass",
|
|
71
|
+
"depth-buffer world-position reconstruction",
|
|
72
|
+
"GPU picking performance parity with Unity Scene View",
|
|
73
|
+
"GPU picking performance parity with Unreal Editor viewport"
|
|
74
|
+
]
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
static idToColor(id) {
|
|
78
|
+
if (!Number.isInteger(id) || id < 1 || id > 0xffffff) {
|
|
79
|
+
throw new RangeError("Picking color id must be an integer in the 1..16777215 range.");
|
|
80
|
+
}
|
|
81
|
+
return [id & 0xff, (id >> 8) & 0xff, (id >> 16) & 0xff, 255];
|
|
82
|
+
}
|
|
83
|
+
static colorToId(red, green, blue) {
|
|
84
|
+
return (red & 0xff) | ((green & 0xff) << 8) | ((blue & 0xff) << 16);
|
|
85
|
+
}
|
|
86
|
+
colorIds() {
|
|
87
|
+
return [...this.targets.keys()].map((targetId, index) => {
|
|
88
|
+
const encodedId = index + 1;
|
|
89
|
+
return { targetId, encodedId, color: PickingService.idToColor(encodedId) };
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function intersectBounds(ray, bounds) {
|
|
94
|
+
let tmin = Number.NEGATIVE_INFINITY;
|
|
95
|
+
let tmax = Number.POSITIVE_INFINITY;
|
|
96
|
+
for (const axis of [0, 1, 2]) {
|
|
97
|
+
const origin = axis === 0 ? ray.origin.x : axis === 1 ? ray.origin.y : ray.origin.z;
|
|
98
|
+
const direction = axis === 0 ? ray.direction.x : axis === 1 ? ray.direction.y : ray.direction.z;
|
|
99
|
+
const min = bounds.min[axis];
|
|
100
|
+
const max = bounds.max[axis];
|
|
101
|
+
if (Math.abs(direction) < 1e-8) {
|
|
102
|
+
if (origin < min || origin > max)
|
|
103
|
+
return undefined;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const invD = 1 / direction;
|
|
107
|
+
let near = (min - origin) * invD;
|
|
108
|
+
let far = (max - origin) * invD;
|
|
109
|
+
if (near > far)
|
|
110
|
+
[near, far] = [far, near];
|
|
111
|
+
tmin = Math.max(tmin, near);
|
|
112
|
+
tmax = Math.min(tmax, far);
|
|
113
|
+
if (tmin > tmax)
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
const distance = tmin >= 0 ? tmin : tmax;
|
|
117
|
+
return distance >= 0 ? distance : undefined;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=PickingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickingService.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PickingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SnapshotAdapter<T> {
|
|
2
|
+
capture(): T;
|
|
3
|
+
restore(snapshot: T): void;
|
|
4
|
+
}
|
|
5
|
+
export declare class PlayModeBridge<TSnapshot> {
|
|
6
|
+
private readonly adapter;
|
|
7
|
+
private snapshot?;
|
|
8
|
+
constructor(adapter: SnapshotAdapter<TSnapshot>);
|
|
9
|
+
enter(): void;
|
|
10
|
+
exit({ restore }?: {
|
|
11
|
+
restore?: boolean | undefined;
|
|
12
|
+
}): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=PlayModeBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlayModeBridge.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PlayModeBridge.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,CAAC;IACb,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;CAC5B;AAED,qBAAa,cAAc,CAAC,SAAS;IAGvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,CAAY;gBAEA,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC;IAEhE,KAAK,IAAI,IAAI;IAOb,IAAI,CAAC,EAAE,OAAc,EAAE;;KAAK,GAAG,IAAI;CASpC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class PlayModeBridge {
|
|
2
|
+
adapter;
|
|
3
|
+
snapshot;
|
|
4
|
+
constructor(adapter) {
|
|
5
|
+
this.adapter = adapter;
|
|
6
|
+
}
|
|
7
|
+
enter() {
|
|
8
|
+
if (this.snapshot !== undefined) {
|
|
9
|
+
throw new Error("Play mode is already active");
|
|
10
|
+
}
|
|
11
|
+
this.snapshot = this.adapter.capture();
|
|
12
|
+
}
|
|
13
|
+
exit({ restore = true } = {}) {
|
|
14
|
+
if (this.snapshot === undefined) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (restore) {
|
|
18
|
+
this.adapter.restore(this.snapshot);
|
|
19
|
+
}
|
|
20
|
+
this.snapshot = undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=PlayModeBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlayModeBridge.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PlayModeBridge.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,cAAc;IAGI;IAFrB,QAAQ,CAAa;IAE7B,YAA6B,OAAmC;QAAnC,YAAO,GAAP,OAAO,CAA4B;IAAG,CAAC;IAEpE,KAAK;QACH,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE;QAC1B,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type EditorPrefabSchemaVersion = "aura3d-prefab";
|
|
2
|
+
export interface EditorPrefabNodeBase {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly parentId: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface EditorPrefab<TNode extends EditorPrefabNodeBase = EditorPrefabNodeBase> {
|
|
8
|
+
readonly schemaVersion: EditorPrefabSchemaVersion;
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly rootNodeId: string;
|
|
12
|
+
readonly sourceNodeId?: string;
|
|
13
|
+
readonly createdAt: string;
|
|
14
|
+
readonly nodes: readonly TNode[];
|
|
15
|
+
}
|
|
16
|
+
export interface CreatePrefabOptions<TNode extends EditorPrefabNodeBase> {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly rootNodeId: string;
|
|
20
|
+
readonly sourceNodeId?: string;
|
|
21
|
+
readonly createdAt?: string;
|
|
22
|
+
readonly nodes: readonly TNode[];
|
|
23
|
+
}
|
|
24
|
+
export interface InstantiatePrefabOptions {
|
|
25
|
+
readonly idPrefix: string;
|
|
26
|
+
readonly rootParentId?: string | null;
|
|
27
|
+
readonly nameSuffix?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class PrefabRegistry<TNode extends EditorPrefabNodeBase = EditorPrefabNodeBase> {
|
|
30
|
+
private readonly prefabsById;
|
|
31
|
+
create(options: CreatePrefabOptions<TNode>): EditorPrefab<TNode>;
|
|
32
|
+
register(prefab: EditorPrefab<TNode>): EditorPrefab<TNode>;
|
|
33
|
+
upsert(prefab: EditorPrefab<TNode>): EditorPrefab<TNode>;
|
|
34
|
+
get(id: string): EditorPrefab<TNode> | undefined;
|
|
35
|
+
list(): readonly EditorPrefab<TNode>[];
|
|
36
|
+
remove(id: string): boolean;
|
|
37
|
+
clear(): void;
|
|
38
|
+
instantiate(prefabOrId: EditorPrefab<TNode> | string, options: InstantiatePrefabOptions): readonly TNode[];
|
|
39
|
+
}
|
|
40
|
+
export declare function validatePrefab<TNode extends EditorPrefabNodeBase>(prefab: EditorPrefab<TNode>): void;
|
|
41
|
+
//# sourceMappingURL=PrefabRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrefabRegistry.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PrefabRegistry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,yBAAyB,GAAG,eAAe,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,YAAY,CAAC,KAAK,SAAS,oBAAoB,GAAG,oBAAoB;IACrF,QAAQ,CAAC,aAAa,EAAE,yBAAyB,CAAC;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB,CAAC,KAAK,SAAS,oBAAoB;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,cAAc,CAAC,KAAK,SAAS,oBAAoB,GAAG,oBAAoB;IACnF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAEtE,MAAM,CAAC,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;IAchE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;IAU1D,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC;IAOxD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,SAAS;IAKhD,IAAI,IAAI,SAAS,YAAY,CAAC,KAAK,CAAC,EAAE;IAItC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI3B,KAAK,IAAI,IAAI;IAIb,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,wBAAwB,GAAG,SAAS,KAAK,EAAE;CAuB3G;AAED,wBAAgB,cAAc,CAAC,KAAK,SAAS,oBAAoB,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,IAAI,CA2BpG"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export class PrefabRegistry {
|
|
2
|
+
prefabsById = new Map();
|
|
3
|
+
create(options) {
|
|
4
|
+
const prefab = {
|
|
5
|
+
schemaVersion: "aura3d-prefab",
|
|
6
|
+
id: normalizeId(options.id, "prefab id"),
|
|
7
|
+
name: normalizeName(options.name, "prefab name"),
|
|
8
|
+
rootNodeId: normalizeId(options.rootNodeId, "prefab rootNodeId"),
|
|
9
|
+
...(options.sourceNodeId ? { sourceNodeId: normalizeId(options.sourceNodeId, "prefab sourceNodeId") } : {}),
|
|
10
|
+
createdAt: options.createdAt ?? new Date().toISOString(),
|
|
11
|
+
nodes: options.nodes.map((node) => cloneNode(node))
|
|
12
|
+
};
|
|
13
|
+
validatePrefab(prefab);
|
|
14
|
+
return prefab;
|
|
15
|
+
}
|
|
16
|
+
register(prefab) {
|
|
17
|
+
validatePrefab(prefab);
|
|
18
|
+
if (this.prefabsById.has(prefab.id)) {
|
|
19
|
+
throw new Error(`Prefab already registered: ${prefab.id}`);
|
|
20
|
+
}
|
|
21
|
+
const cloned = clonePrefab(prefab);
|
|
22
|
+
this.prefabsById.set(cloned.id, cloned);
|
|
23
|
+
return cloned;
|
|
24
|
+
}
|
|
25
|
+
upsert(prefab) {
|
|
26
|
+
validatePrefab(prefab);
|
|
27
|
+
const cloned = clonePrefab(prefab);
|
|
28
|
+
this.prefabsById.set(cloned.id, cloned);
|
|
29
|
+
return cloned;
|
|
30
|
+
}
|
|
31
|
+
get(id) {
|
|
32
|
+
const prefab = this.prefabsById.get(id);
|
|
33
|
+
return prefab ? clonePrefab(prefab) : undefined;
|
|
34
|
+
}
|
|
35
|
+
list() {
|
|
36
|
+
return [...this.prefabsById.values()].map((prefab) => clonePrefab(prefab));
|
|
37
|
+
}
|
|
38
|
+
remove(id) {
|
|
39
|
+
return this.prefabsById.delete(id);
|
|
40
|
+
}
|
|
41
|
+
clear() {
|
|
42
|
+
this.prefabsById.clear();
|
|
43
|
+
}
|
|
44
|
+
instantiate(prefabOrId, options) {
|
|
45
|
+
const prefab = typeof prefabOrId === "string" ? this.get(prefabOrId) : clonePrefab(prefabOrId);
|
|
46
|
+
if (!prefab) {
|
|
47
|
+
throw new Error(`Unknown prefab: ${prefabOrId}`);
|
|
48
|
+
}
|
|
49
|
+
validatePrefab(prefab);
|
|
50
|
+
const idPrefix = normalizeId(options.idPrefix, "prefab instance idPrefix");
|
|
51
|
+
const idMap = new Map(prefab.nodes.map((node) => [node.id, `${idPrefix}-${node.id}`]));
|
|
52
|
+
const rootParentId = options.rootParentId ?? null;
|
|
53
|
+
const nameSuffix = options.nameSuffix ?? " Instance";
|
|
54
|
+
return prefab.nodes.map((node) => {
|
|
55
|
+
const cloned = cloneNode(node);
|
|
56
|
+
const remappedParent = node.id === prefab.rootNodeId
|
|
57
|
+
? rootParentId
|
|
58
|
+
: node.parentId ? idMap.get(node.parentId) ?? null : null;
|
|
59
|
+
return {
|
|
60
|
+
...cloned,
|
|
61
|
+
id: idMap.get(node.id),
|
|
62
|
+
name: `${node.name}${nameSuffix}`,
|
|
63
|
+
parentId: remappedParent
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function validatePrefab(prefab) {
|
|
69
|
+
if (prefab.schemaVersion !== "aura3d-prefab") {
|
|
70
|
+
throw new Error(`Unsupported prefab schemaVersion: ${String(prefab.schemaVersion)}`);
|
|
71
|
+
}
|
|
72
|
+
normalizeId(prefab.id, "prefab id");
|
|
73
|
+
normalizeName(prefab.name, "prefab name");
|
|
74
|
+
normalizeId(prefab.rootNodeId, "prefab rootNodeId");
|
|
75
|
+
if (prefab.nodes.length === 0) {
|
|
76
|
+
throw new Error("Prefab must contain at least one node.");
|
|
77
|
+
}
|
|
78
|
+
const ids = new Set();
|
|
79
|
+
for (const node of prefab.nodes) {
|
|
80
|
+
normalizeId(node.id, "prefab node id");
|
|
81
|
+
normalizeName(node.name, "prefab node name");
|
|
82
|
+
if (ids.has(node.id)) {
|
|
83
|
+
throw new Error(`Prefab node id is duplicated: ${node.id}`);
|
|
84
|
+
}
|
|
85
|
+
ids.add(node.id);
|
|
86
|
+
}
|
|
87
|
+
if (!ids.has(prefab.rootNodeId)) {
|
|
88
|
+
throw new Error(`Prefab rootNodeId ${prefab.rootNodeId} is not present in nodes.`);
|
|
89
|
+
}
|
|
90
|
+
for (const node of prefab.nodes) {
|
|
91
|
+
if (node.parentId !== null && !ids.has(node.parentId)) {
|
|
92
|
+
throw new Error(`Prefab node ${node.id} references external parent ${node.parentId}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function clonePrefab(prefab) {
|
|
97
|
+
return {
|
|
98
|
+
...prefab,
|
|
99
|
+
nodes: prefab.nodes.map((node) => cloneNode(node))
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function cloneNode(node) {
|
|
103
|
+
return JSON.parse(JSON.stringify(node));
|
|
104
|
+
}
|
|
105
|
+
function normalizeId(value, label) {
|
|
106
|
+
const normalized = value.trim();
|
|
107
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(normalized)) {
|
|
108
|
+
throw new Error(`${label} must be a non-empty stable id.`);
|
|
109
|
+
}
|
|
110
|
+
return normalized;
|
|
111
|
+
}
|
|
112
|
+
function normalizeName(value, label) {
|
|
113
|
+
const normalized = value.trim();
|
|
114
|
+
if (normalized.length === 0) {
|
|
115
|
+
throw new Error(`${label} cannot be empty.`);
|
|
116
|
+
}
|
|
117
|
+
return normalized;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=PrefabRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrefabRegistry.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/PrefabRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type TimelineModelConfig } from "./TimelineModel";
|
|
2
|
+
import type { TimelineRuntimeBindingConfig } from "./TimelineRuntimeBridge";
|
|
3
|
+
export interface EditorProjectAssetDocument {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly uri?: string;
|
|
7
|
+
readonly type?: "gltf" | "glb" | "image" | "audio" | "material" | "unknown";
|
|
8
|
+
readonly source?: string;
|
|
9
|
+
readonly license?: string;
|
|
10
|
+
readonly clips?: readonly string[];
|
|
11
|
+
readonly morphTargets?: readonly string[];
|
|
12
|
+
readonly diagnostics?: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
export interface EditorProjectTimelineDocument extends TimelineModelConfig {
|
|
15
|
+
readonly bindings?: readonly TimelineRuntimeBindingConfig[];
|
|
16
|
+
readonly evidence?: {
|
|
17
|
+
readonly authoredInEditor?: boolean;
|
|
18
|
+
readonly runtimeReplay?: boolean;
|
|
19
|
+
readonly animationEvents?: boolean;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface EditorProjectVisualGraphDocument {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly name: string;
|
|
25
|
+
readonly nodes: readonly unknown[];
|
|
26
|
+
readonly edges: readonly unknown[];
|
|
27
|
+
readonly runtimeBindings?: readonly {
|
|
28
|
+
readonly nodeId: string;
|
|
29
|
+
readonly targetId: string;
|
|
30
|
+
readonly event?: string;
|
|
31
|
+
}[];
|
|
32
|
+
}
|
|
33
|
+
export interface EditorProjectStateDocument {
|
|
34
|
+
readonly selectedNodeId?: string | number | null;
|
|
35
|
+
readonly activeTool?: string;
|
|
36
|
+
readonly activeTimelineId?: string | null;
|
|
37
|
+
readonly playMode?: "edit" | "play" | "paused";
|
|
38
|
+
}
|
|
39
|
+
export interface EditorProjectDocument {
|
|
40
|
+
readonly schema: "a3d-editor-project";
|
|
41
|
+
readonly version?: number;
|
|
42
|
+
readonly name: string;
|
|
43
|
+
readonly nodes: readonly unknown[];
|
|
44
|
+
readonly assets?: readonly (string | EditorProjectAssetDocument)[];
|
|
45
|
+
readonly timelines?: readonly EditorProjectTimelineDocument[];
|
|
46
|
+
readonly visualGraphs?: readonly EditorProjectVisualGraphDocument[];
|
|
47
|
+
readonly editor?: EditorProjectStateDocument;
|
|
48
|
+
readonly evidence?: {
|
|
49
|
+
readonly serializedBy?: "editor-runtime" | "editor-app" | string;
|
|
50
|
+
readonly roundTripReady?: boolean;
|
|
51
|
+
readonly browserWorkflowReady?: boolean;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export interface EditorProjectEvidence {
|
|
55
|
+
readonly kind: "aura-editor-project-evidence";
|
|
56
|
+
readonly schema: EditorProjectDocument["schema"];
|
|
57
|
+
readonly version: number | null;
|
|
58
|
+
readonly name: string;
|
|
59
|
+
readonly nodeCount: number;
|
|
60
|
+
readonly assetCount: number;
|
|
61
|
+
readonly timelineCount: number;
|
|
62
|
+
readonly visualGraphCount: number;
|
|
63
|
+
readonly timelineBindingCount: number;
|
|
64
|
+
readonly signalMarkerCount: number;
|
|
65
|
+
readonly typedAssetEvidenceCount: number;
|
|
66
|
+
readonly hasAnimationTimeline: boolean;
|
|
67
|
+
readonly hasRuntimeReplayBindings: boolean;
|
|
68
|
+
readonly hasVisualGraphBindings: boolean;
|
|
69
|
+
readonly roundTripReady: boolean;
|
|
70
|
+
readonly evidence: {
|
|
71
|
+
readonly projectSerialization: true;
|
|
72
|
+
readonly timelineSerialization: boolean;
|
|
73
|
+
readonly visualGraphSerialization: boolean;
|
|
74
|
+
readonly runtimeReplayBindings: boolean;
|
|
75
|
+
readonly sourceLicenseAssetEvidence: boolean;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export declare function serializeEditorProject(project: EditorProjectDocument): string;
|
|
79
|
+
export declare function parseEditorProject(text: string): EditorProjectDocument;
|
|
80
|
+
export declare function validateEditorProject(project: EditorProjectDocument): EditorProjectDocument;
|
|
81
|
+
export declare function collectEditorProjectEvidence(project: EditorProjectDocument): EditorProjectEvidence;
|
|
82
|
+
//# sourceMappingURL=ProjectSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectSerializer.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/ProjectSerializer.ts"],"names":[],"mappings":"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"}
|