@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,131 @@
|
|
|
1
|
+
import { TimelineModel } from "./TimelineModel.js";
|
|
2
|
+
export function serializeEditorProject(project) {
|
|
3
|
+
const normalized = validateEditorProject(project);
|
|
4
|
+
return `${JSON.stringify(normalized, null, 2)}\n`;
|
|
5
|
+
}
|
|
6
|
+
export function parseEditorProject(text) {
|
|
7
|
+
const parsed = JSON.parse(text);
|
|
8
|
+
return validateEditorProject(parsed);
|
|
9
|
+
}
|
|
10
|
+
export function validateEditorProject(project) {
|
|
11
|
+
if (!isRecord(project))
|
|
12
|
+
throw new Error("Editor project document must be an object.");
|
|
13
|
+
if (project.schema !== "a3d-editor-project")
|
|
14
|
+
throw new Error("Unsupported editor project schema.");
|
|
15
|
+
if (typeof project.name !== "string" || !project.name.trim())
|
|
16
|
+
throw new Error("Editor project name is required.");
|
|
17
|
+
if (!Array.isArray(project.nodes))
|
|
18
|
+
throw new Error("Editor project nodes must be an array.");
|
|
19
|
+
validateAssets(project.assets ?? []);
|
|
20
|
+
validateTimelines(project.timelines ?? []);
|
|
21
|
+
validateVisualGraphs(project.visualGraphs ?? []);
|
|
22
|
+
return project;
|
|
23
|
+
}
|
|
24
|
+
export function collectEditorProjectEvidence(project) {
|
|
25
|
+
const parsed = validateEditorProject(project);
|
|
26
|
+
const timelines = parsed.timelines ?? [];
|
|
27
|
+
const visualGraphs = parsed.visualGraphs ?? [];
|
|
28
|
+
const timelineBindingCount = timelines.reduce((total, timeline) => total + (timeline.bindings?.length ?? 0), 0);
|
|
29
|
+
const signalMarkerCount = timelines.reduce((total, timeline) => {
|
|
30
|
+
return total + (timeline.tracks ?? []).reduce((trackTotal, track) => {
|
|
31
|
+
if (track.type !== "signal")
|
|
32
|
+
return trackTotal;
|
|
33
|
+
return trackTotal + (track.clips?.length ?? 0);
|
|
34
|
+
}, 0);
|
|
35
|
+
}, 0);
|
|
36
|
+
const typedAssetEvidenceCount = (parsed.assets ?? []).filter((asset) => {
|
|
37
|
+
return typeof asset !== "string" && Boolean(asset.id && asset.name && asset.source && asset.license);
|
|
38
|
+
}).length;
|
|
39
|
+
const assetCount = parsed.assets?.length ?? 0;
|
|
40
|
+
const hasAnimationTimeline = timelines.some((timeline) => (timeline.tracks ?? []).some((track) => track.type === "animation"));
|
|
41
|
+
const hasVisualGraphBindings = visualGraphs.some((graph) => (graph.runtimeBindings?.length ?? 0) > 0);
|
|
42
|
+
const hasRuntimeReplayBindings = timelineBindingCount > 0;
|
|
43
|
+
return {
|
|
44
|
+
kind: "aura-editor-project-evidence",
|
|
45
|
+
schema: parsed.schema,
|
|
46
|
+
version: parsed.version ?? null,
|
|
47
|
+
name: parsed.name,
|
|
48
|
+
nodeCount: parsed.nodes.length,
|
|
49
|
+
assetCount,
|
|
50
|
+
timelineCount: timelines.length,
|
|
51
|
+
visualGraphCount: visualGraphs.length,
|
|
52
|
+
timelineBindingCount,
|
|
53
|
+
signalMarkerCount,
|
|
54
|
+
typedAssetEvidenceCount,
|
|
55
|
+
hasAnimationTimeline,
|
|
56
|
+
hasRuntimeReplayBindings,
|
|
57
|
+
hasVisualGraphBindings,
|
|
58
|
+
roundTripReady: parsed.nodes.length > 0 && timelines.length > 0 && hasRuntimeReplayBindings,
|
|
59
|
+
evidence: {
|
|
60
|
+
projectSerialization: true,
|
|
61
|
+
timelineSerialization: timelines.length > 0,
|
|
62
|
+
visualGraphSerialization: visualGraphs.length > 0,
|
|
63
|
+
runtimeReplayBindings: hasRuntimeReplayBindings || hasVisualGraphBindings,
|
|
64
|
+
sourceLicenseAssetEvidence: assetCount > 0 && typedAssetEvidenceCount === assetCount
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function validateAssets(assets) {
|
|
69
|
+
if (!Array.isArray(assets))
|
|
70
|
+
throw new Error("Editor project assets must be an array.");
|
|
71
|
+
for (const asset of assets) {
|
|
72
|
+
if (typeof asset === "string") {
|
|
73
|
+
if (!asset.trim())
|
|
74
|
+
throw new Error("Editor project asset ids must be non-empty.");
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (!asset.id.trim())
|
|
78
|
+
throw new Error("Editor project asset id is required.");
|
|
79
|
+
if (!asset.name.trim())
|
|
80
|
+
throw new Error(`Editor project asset name is required: ${asset.id}`);
|
|
81
|
+
assertStringArray(asset.clips, `asset clips for ${asset.id}`);
|
|
82
|
+
assertStringArray(asset.morphTargets, `asset morphTargets for ${asset.id}`);
|
|
83
|
+
assertStringArray(asset.diagnostics, `asset diagnostics for ${asset.id}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function validateTimelines(timelines) {
|
|
87
|
+
if (!Array.isArray(timelines))
|
|
88
|
+
throw new Error("Editor project timelines must be an array.");
|
|
89
|
+
for (const timeline of timelines) {
|
|
90
|
+
new TimelineModel(timeline);
|
|
91
|
+
for (const binding of timeline.bindings ?? []) {
|
|
92
|
+
if (!binding.targetId.trim())
|
|
93
|
+
throw new Error(`Timeline binding targetId is required for timeline ${timeline.id ?? timeline.name ?? "unnamed"}.`);
|
|
94
|
+
if (binding.trackId !== undefined && !binding.trackId.trim())
|
|
95
|
+
throw new Error("Timeline binding trackId cannot be empty.");
|
|
96
|
+
if (binding.trackName !== undefined && !binding.trackName.trim())
|
|
97
|
+
throw new Error("Timeline binding trackName cannot be empty.");
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function validateVisualGraphs(graphs) {
|
|
102
|
+
if (!Array.isArray(graphs))
|
|
103
|
+
throw new Error("Editor project visualGraphs must be an array.");
|
|
104
|
+
for (const graph of graphs) {
|
|
105
|
+
if (!graph.id.trim())
|
|
106
|
+
throw new Error("Editor project visual graph id is required.");
|
|
107
|
+
if (!graph.name.trim())
|
|
108
|
+
throw new Error(`Editor project visual graph name is required: ${graph.id}`);
|
|
109
|
+
if (!Array.isArray(graph.nodes))
|
|
110
|
+
throw new Error(`Editor project visual graph nodes must be an array: ${graph.id}`);
|
|
111
|
+
if (!Array.isArray(graph.edges))
|
|
112
|
+
throw new Error(`Editor project visual graph edges must be an array: ${graph.id}`);
|
|
113
|
+
for (const binding of graph.runtimeBindings ?? []) {
|
|
114
|
+
if (!binding.nodeId.trim())
|
|
115
|
+
throw new Error(`Visual graph runtime binding nodeId is required: ${graph.id}`);
|
|
116
|
+
if (!binding.targetId.trim())
|
|
117
|
+
throw new Error(`Visual graph runtime binding targetId is required: ${graph.id}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function assertStringArray(values, label) {
|
|
122
|
+
if (values === undefined)
|
|
123
|
+
return;
|
|
124
|
+
if (!Array.isArray(values) || values.some((value) => !value.trim())) {
|
|
125
|
+
throw new Error(`Editor project ${label} must be non-empty strings.`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function isRecord(value) {
|
|
129
|
+
return typeof value === "object" && value !== null;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=ProjectSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectSerializer.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/ProjectSerializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RotateGizmo.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/RotateGizmo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAGhD,qBAAa,WAAY,SAAQ,KAAK;IAC9B,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAW5C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Gizmo } from "./Gizmo.js";
|
|
2
|
+
import { TransformCommand } from "./commands/TransformCommand.js";
|
|
3
|
+
export class RotateGizmo extends Gizmo {
|
|
4
|
+
async drag(input) {
|
|
5
|
+
if (!this.target)
|
|
6
|
+
return;
|
|
7
|
+
const current = readTransform(this.target);
|
|
8
|
+
const next = clone(current);
|
|
9
|
+
next.rotation ??= { x: 0, y: 0, z: 0, w: 1 };
|
|
10
|
+
const delta = this.snapRotationDelta(input.delta);
|
|
11
|
+
if (input.axis === "x")
|
|
12
|
+
next.rotation.x += delta;
|
|
13
|
+
if (input.axis === "y")
|
|
14
|
+
next.rotation.y += delta;
|
|
15
|
+
if (input.axis === "z" || input.axis === "uniform")
|
|
16
|
+
next.rotation.z += delta;
|
|
17
|
+
await this.history.execute(new TransformCommand(this.target, next));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function readTransform(target) {
|
|
21
|
+
if ("transform" in target) {
|
|
22
|
+
return {
|
|
23
|
+
position: { x: target.transform.position[0], y: target.transform.position[1], z: target.transform.position[2] },
|
|
24
|
+
rotation: { x: target.transform.rotation[0], y: target.transform.rotation[1], z: target.transform.rotation[2], w: target.transform.rotation[3] },
|
|
25
|
+
scale: { x: target.transform.scale[0], y: target.transform.scale[1], z: target.transform.scale[2] }
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return clone(target);
|
|
29
|
+
}
|
|
30
|
+
function clone(transform) {
|
|
31
|
+
return {
|
|
32
|
+
position: { ...transform.position },
|
|
33
|
+
rotation: transform.rotation ? { ...transform.rotation } : undefined,
|
|
34
|
+
scale: transform.scale ? { ...transform.scale } : undefined
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=RotateGizmo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RotateGizmo.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/RotateGizmo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAsB,MAAM,6BAA6B,CAAC;AAEnF,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,KAAK,CAAC,IAAI,CAAC,KAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG;YAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC;QACjD,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG;YAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC;QACjD,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC;QAC7E,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF;AAED,SAAS,aAAa,CAAC,MAA0C;IAC/D,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;QAC1B,OAAO;YACL,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;YAC/G,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;YAChJ,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;SACpG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,KAAK,CAAC,SAAwB;IACrC,OAAO;QACL,QAAQ,EAAE,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE;QACnC,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QACpE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScaleGizmo.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/ScaleGizmo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAGhD,qBAAa,UAAW,SAAQ,KAAK;IAC7B,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB5C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Gizmo } from "./Gizmo.js";
|
|
2
|
+
import { TransformCommand } from "./commands/TransformCommand.js";
|
|
3
|
+
export class ScaleGizmo extends Gizmo {
|
|
4
|
+
async drag(input) {
|
|
5
|
+
if (!this.target)
|
|
6
|
+
return;
|
|
7
|
+
const current = readTransform(this.target);
|
|
8
|
+
const next = clone(current);
|
|
9
|
+
next.scale ??= { x: 1, y: 1, z: 1 };
|
|
10
|
+
const amount = Math.max(0.001, this.snapScaleFactor(1 + input.delta));
|
|
11
|
+
if (input.axis === "x")
|
|
12
|
+
next.scale.x *= amount;
|
|
13
|
+
if (input.axis === "y")
|
|
14
|
+
next.scale.y *= amount;
|
|
15
|
+
if (input.axis === "z")
|
|
16
|
+
next.scale.z *= amount;
|
|
17
|
+
if (input.axis === "uniform") {
|
|
18
|
+
next.scale.x *= amount;
|
|
19
|
+
next.scale.y *= amount;
|
|
20
|
+
next.scale.z *= amount;
|
|
21
|
+
}
|
|
22
|
+
await this.history.execute(new TransformCommand(this.target, next));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function readTransform(target) {
|
|
26
|
+
if ("transform" in target) {
|
|
27
|
+
return {
|
|
28
|
+
position: { x: target.transform.position[0], y: target.transform.position[1], z: target.transform.position[2] },
|
|
29
|
+
rotation: { x: target.transform.rotation[0], y: target.transform.rotation[1], z: target.transform.rotation[2], w: target.transform.rotation[3] },
|
|
30
|
+
scale: { x: target.transform.scale[0], y: target.transform.scale[1], z: target.transform.scale[2] }
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return clone(target);
|
|
34
|
+
}
|
|
35
|
+
function clone(transform) {
|
|
36
|
+
return {
|
|
37
|
+
position: { ...transform.position },
|
|
38
|
+
rotation: transform.rotation ? { ...transform.rotation } : undefined,
|
|
39
|
+
scale: transform.scale ? { ...transform.scale } : undefined
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=ScaleGizmo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScaleGizmo.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/ScaleGizmo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type SelectionId = string | number;
|
|
2
|
+
export interface SelectionChange {
|
|
3
|
+
readonly previous: readonly SelectionId[];
|
|
4
|
+
readonly current: readonly SelectionId[];
|
|
5
|
+
}
|
|
6
|
+
export type SelectionListener = (change: SelectionChange) => void;
|
|
7
|
+
export declare class Selection {
|
|
8
|
+
private readonly ids;
|
|
9
|
+
private readonly listeners;
|
|
10
|
+
current(): readonly SelectionId[];
|
|
11
|
+
has(id: SelectionId): boolean;
|
|
12
|
+
set(ids: readonly SelectionId[]): void;
|
|
13
|
+
add(id: SelectionId): void;
|
|
14
|
+
remove(id: SelectionId): void;
|
|
15
|
+
clear(): void;
|
|
16
|
+
subscribe(listener: SelectionListener): () => void;
|
|
17
|
+
prune(alive: (id: SelectionId) => boolean): void;
|
|
18
|
+
private replace;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=Selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Selection.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/Selection.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAElE,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA0B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgC;IAE1D,OAAO,IAAI,SAAS,WAAW,EAAE;IAIjC,GAAG,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO;IAI7B,GAAG,CAAC,GAAG,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI;IAItC,GAAG,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAI1B,MAAM,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAM7B,KAAK,IAAI,IAAI;IAIb,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAKlD,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,GAAG,IAAI;IAIhD,OAAO,CAAC,OAAO;CAchB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export class Selection {
|
|
2
|
+
ids = new Set();
|
|
3
|
+
listeners = new Set();
|
|
4
|
+
current() {
|
|
5
|
+
return [...this.ids];
|
|
6
|
+
}
|
|
7
|
+
has(id) {
|
|
8
|
+
return this.ids.has(id);
|
|
9
|
+
}
|
|
10
|
+
set(ids) {
|
|
11
|
+
this.replace(new Set(ids));
|
|
12
|
+
}
|
|
13
|
+
add(id) {
|
|
14
|
+
this.replace(new Set([...this.ids, id]));
|
|
15
|
+
}
|
|
16
|
+
remove(id) {
|
|
17
|
+
const next = new Set(this.ids);
|
|
18
|
+
next.delete(id);
|
|
19
|
+
this.replace(next);
|
|
20
|
+
}
|
|
21
|
+
clear() {
|
|
22
|
+
this.replace(new Set());
|
|
23
|
+
}
|
|
24
|
+
subscribe(listener) {
|
|
25
|
+
this.listeners.add(listener);
|
|
26
|
+
return () => this.listeners.delete(listener);
|
|
27
|
+
}
|
|
28
|
+
prune(alive) {
|
|
29
|
+
this.replace(new Set([...this.ids].filter(alive)));
|
|
30
|
+
}
|
|
31
|
+
replace(next) {
|
|
32
|
+
const previous = this.current();
|
|
33
|
+
this.ids.clear();
|
|
34
|
+
for (const id of next) {
|
|
35
|
+
this.ids.add(id);
|
|
36
|
+
}
|
|
37
|
+
const current = this.current();
|
|
38
|
+
if (previous.length !== current.length || previous.some((id, index) => id !== current[index])) {
|
|
39
|
+
const change = { previous, current };
|
|
40
|
+
for (const listener of [...this.listeners]) {
|
|
41
|
+
listener(change);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=Selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Selection.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/Selection.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,SAAS;IACH,GAAG,GAAG,IAAI,GAAG,EAAe,CAAC;IAC7B,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IAE1D,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,EAAe;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,GAA2B;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,EAAe;QACjB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,EAAe;QACpB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,SAAS,CAAC,QAA2B;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,KAAmC;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAEO,OAAO,CAAC,IAAsB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACjB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9F,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YACrC,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3C,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export type ShaderGraphValueType = "float" | "vec2" | "vec3" | "vec4" | "color" | "texture2d" | "surface";
|
|
2
|
+
export interface ShaderGraphPort {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly type: ShaderGraphValueType;
|
|
5
|
+
readonly required?: boolean;
|
|
6
|
+
readonly defaultValue?: number | readonly number[] | string;
|
|
7
|
+
}
|
|
8
|
+
export interface ShaderGraphNode {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly type: string;
|
|
11
|
+
readonly category: "Math" | "Vector" | "Texture" | "UV" | "Color" | "PBR" | "Utility";
|
|
12
|
+
readonly inputs: readonly ShaderGraphPort[];
|
|
13
|
+
readonly outputs: readonly ShaderGraphPort[];
|
|
14
|
+
}
|
|
15
|
+
export interface ShaderGraphEdge {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly from: {
|
|
18
|
+
readonly nodeId: string;
|
|
19
|
+
readonly output: string;
|
|
20
|
+
};
|
|
21
|
+
readonly to: {
|
|
22
|
+
readonly nodeId: string;
|
|
23
|
+
readonly input: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface ShaderGraphDiagnostic {
|
|
27
|
+
readonly severity: "error" | "warning" | "info";
|
|
28
|
+
readonly message: string;
|
|
29
|
+
readonly nodeId?: string;
|
|
30
|
+
readonly edgeId?: string;
|
|
31
|
+
readonly port?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ShaderGraphFixture {
|
|
34
|
+
readonly id: "external-parity-old-branch-shader-graph-fixture";
|
|
35
|
+
readonly source: "origin-master-shader-graph-adapted";
|
|
36
|
+
readonly sourceFiles: readonly [
|
|
37
|
+
"origin/master:src/shaders/graph/ShaderGraph.ts",
|
|
38
|
+
"origin/master:src/shaders/graph/NodeLibrary.ts",
|
|
39
|
+
"origin/master:src/shaders/graph/GraphValidator.ts",
|
|
40
|
+
"origin/master:src/shaders/graph/GraphSerializer.ts",
|
|
41
|
+
"origin/master:src/shaders/graph/ShaderNode.ts"
|
|
42
|
+
];
|
|
43
|
+
readonly nodes: readonly ShaderGraphNode[];
|
|
44
|
+
readonly edges: readonly ShaderGraphEdge[];
|
|
45
|
+
readonly validation: {
|
|
46
|
+
readonly valid: boolean;
|
|
47
|
+
readonly outputNodePresent: boolean;
|
|
48
|
+
readonly acyclic: boolean;
|
|
49
|
+
readonly connectedRequiredInputs: number;
|
|
50
|
+
readonly typedConnections: number;
|
|
51
|
+
readonly warnings: readonly ShaderGraphDiagnostic[];
|
|
52
|
+
readonly errors: readonly ShaderGraphDiagnostic[];
|
|
53
|
+
};
|
|
54
|
+
readonly codegen: {
|
|
55
|
+
readonly targets: readonly ["glsl", "wgsl"];
|
|
56
|
+
readonly uniformCount: number;
|
|
57
|
+
readonly textureBindingCount: number;
|
|
58
|
+
readonly generatedExpressionCount: number;
|
|
59
|
+
readonly glslHash: string;
|
|
60
|
+
readonly wgslHash: string;
|
|
61
|
+
readonly previewFragmentLines: readonly string[];
|
|
62
|
+
};
|
|
63
|
+
readonly categories: readonly string[];
|
|
64
|
+
readonly blockedClaims: readonly string[];
|
|
65
|
+
readonly hash: string;
|
|
66
|
+
readonly claimBoundary: string;
|
|
67
|
+
}
|
|
68
|
+
export declare function createOldBranchShaderGraphFixture(): ShaderGraphFixture;
|
|
69
|
+
//# sourceMappingURL=ShaderGraphModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderGraphModel.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/ShaderGraphModel.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;AAE1G,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC;CAC7D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;IACtF,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,CAAC,EAAE,EAAE;QACX,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,iDAAiD,CAAC;IAC/D,QAAQ,CAAC,MAAM,EAAE,oCAAoC,CAAC;IACtD,QAAQ,CAAC,WAAW,EAAE,SAAS;QAC7B,gDAAgD;QAChD,gDAAgD;QAChD,mDAAmD;QACnD,oDAAoD;QACpD,+CAA+C;KAChD,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;QACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;QACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;KACnD,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;QAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;KAClD,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAkBD,wBAAgB,iCAAiC,IAAI,kBAAkB,CAkEtE"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
const sourceFiles = [
|
|
2
|
+
"origin/master:src/shaders/graph/ShaderGraph.ts",
|
|
3
|
+
"origin/master:src/shaders/graph/NodeLibrary.ts",
|
|
4
|
+
"origin/master:src/shaders/graph/GraphValidator.ts",
|
|
5
|
+
"origin/master:src/shaders/graph/GraphSerializer.ts",
|
|
6
|
+
"origin/master:src/shaders/graph/ShaderNode.ts"
|
|
7
|
+
];
|
|
8
|
+
const blockedClaims = [
|
|
9
|
+
"Unity Shader Graph parity",
|
|
10
|
+
"Unreal Material Editor parity",
|
|
11
|
+
"live visual node editor parity",
|
|
12
|
+
"full material graph serialization parity",
|
|
13
|
+
"shader compiler optimization parity"
|
|
14
|
+
];
|
|
15
|
+
export function createOldBranchShaderGraphFixture() {
|
|
16
|
+
const nodes = [
|
|
17
|
+
node("uv0", "uv.texcoord", "UV", [], [{ name: "uv", type: "vec2" }]),
|
|
18
|
+
node("albedo-texture", "texture.sample2d", "Texture", [
|
|
19
|
+
{ name: "uv", type: "vec2", required: true },
|
|
20
|
+
{ name: "texture", type: "texture2d", defaultValue: "procedural-carbon-fiber" }
|
|
21
|
+
], [{ name: "color", type: "color" }]),
|
|
22
|
+
node("tint", "color.rgb", "Color", [], [{ name: "color", type: "color" }]),
|
|
23
|
+
node("multiply", "math.multiply", "Math", [
|
|
24
|
+
{ name: "a", type: "color", required: true },
|
|
25
|
+
{ name: "b", type: "color", required: true }
|
|
26
|
+
], [{ name: "value", type: "color" }]),
|
|
27
|
+
node("normal", "vector.normal", "Vector", [], [{ name: "normal", type: "vec3" }]),
|
|
28
|
+
node("pbr", "pbr.surface", "PBR", [
|
|
29
|
+
{ name: "baseColor", type: "color", required: true },
|
|
30
|
+
{ name: "normal", type: "vec3", required: true },
|
|
31
|
+
{ name: "metallic", type: "float", defaultValue: 0.2 },
|
|
32
|
+
{ name: "roughness", type: "float", defaultValue: 0.38 }
|
|
33
|
+
], [{ name: "surface", type: "surface" }]),
|
|
34
|
+
node("output", "utility.output", "Utility", [{ name: "surface", type: "surface", required: true }], [])
|
|
35
|
+
];
|
|
36
|
+
const edges = [
|
|
37
|
+
edge("e0", "uv0", "uv", "albedo-texture", "uv"),
|
|
38
|
+
edge("e1", "albedo-texture", "color", "multiply", "a"),
|
|
39
|
+
edge("e2", "tint", "color", "multiply", "b"),
|
|
40
|
+
edge("e3", "multiply", "value", "pbr", "baseColor"),
|
|
41
|
+
edge("e4", "normal", "normal", "pbr", "normal"),
|
|
42
|
+
edge("e5", "pbr", "surface", "output", "surface")
|
|
43
|
+
];
|
|
44
|
+
const validation = validateShaderGraph(nodes, edges);
|
|
45
|
+
const previewFragmentLines = [
|
|
46
|
+
"vec2 uv = a3d_texcoord0;",
|
|
47
|
+
"vec3 sampled = texture(u_proceduralCarbonFiber, uv).rgb;",
|
|
48
|
+
"vec3 baseColor = sampled * vec3(0.88, 0.14, 0.08);",
|
|
49
|
+
"a3dSurface.baseColor = baseColor;",
|
|
50
|
+
"a3dSurface.metallic = 0.2;",
|
|
51
|
+
"a3dSurface.roughness = 0.38;"
|
|
52
|
+
];
|
|
53
|
+
const glslHash = hashStrings(previewFragmentLines);
|
|
54
|
+
const wgslHash = hashStrings(previewFragmentLines.map((line) => line.replaceAll("vec", "vec").replaceAll("texture(", "textureSample(")));
|
|
55
|
+
return {
|
|
56
|
+
id: "external-parity-old-branch-shader-graph-fixture",
|
|
57
|
+
source: "origin-master-shader-graph-adapted",
|
|
58
|
+
sourceFiles,
|
|
59
|
+
nodes,
|
|
60
|
+
edges,
|
|
61
|
+
validation,
|
|
62
|
+
codegen: {
|
|
63
|
+
targets: ["glsl", "wgsl"],
|
|
64
|
+
uniformCount: 3,
|
|
65
|
+
textureBindingCount: 1,
|
|
66
|
+
generatedExpressionCount: previewFragmentLines.length,
|
|
67
|
+
glslHash,
|
|
68
|
+
wgslHash,
|
|
69
|
+
previewFragmentLines
|
|
70
|
+
},
|
|
71
|
+
categories: [...new Set(nodes.map((entry) => entry.category))].sort(),
|
|
72
|
+
blockedClaims,
|
|
73
|
+
hash: hashStrings([
|
|
74
|
+
...nodes.map((entry) => `${entry.id}:${entry.type}:${entry.category}`),
|
|
75
|
+
...edges.map((entry) => `${entry.from.nodeId}.${entry.from.output}->${entry.to.nodeId}.${entry.to.input}`),
|
|
76
|
+
glslHash,
|
|
77
|
+
wgslHash
|
|
78
|
+
]),
|
|
79
|
+
claimBoundary: "Deterministic bounded shader-graph evidence adapted from the old node library, graph validation, and graph codegen concepts. It proves typed node/edge validation, required-input coverage, acyclic graph checks, category metadata, and GLSL/WGSL preview codegen hashes; it does not claim a live visual node editor, full material graph serialization, Unity Shader Graph parity, Unreal Material Editor parity, or shader compiler optimization parity."
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function validateShaderGraph(nodes, edges) {
|
|
83
|
+
const errors = [];
|
|
84
|
+
const warnings = [];
|
|
85
|
+
const nodeById = new Map(nodes.map((entry) => [entry.id, entry]));
|
|
86
|
+
const connectedInputs = new Set(edges.map((entry) => `${entry.to.nodeId}.${entry.to.input}`));
|
|
87
|
+
let typedConnections = 0;
|
|
88
|
+
for (const edgeEntry of edges) {
|
|
89
|
+
const fromNode = nodeById.get(edgeEntry.from.nodeId);
|
|
90
|
+
const toNode = nodeById.get(edgeEntry.to.nodeId);
|
|
91
|
+
const fromPort = fromNode?.outputs.find((entry) => entry.name === edgeEntry.from.output);
|
|
92
|
+
const toPort = toNode?.inputs.find((entry) => entry.name === edgeEntry.to.input);
|
|
93
|
+
if (!fromNode || !fromPort || !toNode || !toPort) {
|
|
94
|
+
errors.push({ severity: "error", message: "Edge references a missing node or port.", edgeId: edgeEntry.id });
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (fromPort.type !== toPort.type) {
|
|
98
|
+
errors.push({ severity: "error", message: `Type mismatch: ${fromPort.type} cannot connect to ${toPort.type}.`, edgeId: edgeEntry.id });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
typedConnections += 1;
|
|
102
|
+
}
|
|
103
|
+
let connectedRequiredInputs = 0;
|
|
104
|
+
for (const graphNode of nodes) {
|
|
105
|
+
for (const input of graphNode.inputs) {
|
|
106
|
+
if (input.required && connectedInputs.has(`${graphNode.id}.${input.name}`)) {
|
|
107
|
+
connectedRequiredInputs += 1;
|
|
108
|
+
}
|
|
109
|
+
else if (input.required) {
|
|
110
|
+
errors.push({ severity: "error", message: `Required input '${input.name}' is not connected.`, nodeId: graphNode.id, port: input.name });
|
|
111
|
+
}
|
|
112
|
+
else if (!connectedInputs.has(`${graphNode.id}.${input.name}`) && input.defaultValue === undefined) {
|
|
113
|
+
warnings.push({ severity: "warning", message: `Input '${input.name}' has no connection and no default value.`, nodeId: graphNode.id, port: input.name });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const acyclic = !hasCycle(nodes, edges);
|
|
118
|
+
if (!acyclic)
|
|
119
|
+
errors.push({ severity: "error", message: "Cycle detected in shader graph." });
|
|
120
|
+
const outputNodePresent = nodes.some((entry) => entry.type === "utility.output");
|
|
121
|
+
if (!outputNodePresent)
|
|
122
|
+
errors.push({ severity: "error", message: "Graph must have a utility.output node." });
|
|
123
|
+
return {
|
|
124
|
+
valid: errors.length === 0,
|
|
125
|
+
outputNodePresent,
|
|
126
|
+
acyclic,
|
|
127
|
+
connectedRequiredInputs,
|
|
128
|
+
typedConnections,
|
|
129
|
+
warnings,
|
|
130
|
+
errors
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function hasCycle(nodes, edges) {
|
|
134
|
+
const adjacency = new Map(nodes.map((entry) => [entry.id, []]));
|
|
135
|
+
for (const graphEdge of edges) {
|
|
136
|
+
adjacency.get(graphEdge.from.nodeId)?.push(graphEdge.to.nodeId);
|
|
137
|
+
}
|
|
138
|
+
const visited = new Set();
|
|
139
|
+
const visiting = new Set();
|
|
140
|
+
const visit = (id) => {
|
|
141
|
+
if (visiting.has(id))
|
|
142
|
+
return true;
|
|
143
|
+
if (visited.has(id))
|
|
144
|
+
return false;
|
|
145
|
+
visiting.add(id);
|
|
146
|
+
for (const next of adjacency.get(id) ?? []) {
|
|
147
|
+
if (visit(next))
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
visiting.delete(id);
|
|
151
|
+
visited.add(id);
|
|
152
|
+
return false;
|
|
153
|
+
};
|
|
154
|
+
return nodes.some((entry) => visit(entry.id));
|
|
155
|
+
}
|
|
156
|
+
function node(id, type, category, inputs, outputs) {
|
|
157
|
+
return { id, type, category, inputs, outputs };
|
|
158
|
+
}
|
|
159
|
+
function edge(id, fromNode, fromOutput, toNode, toInput) {
|
|
160
|
+
return { id, from: { nodeId: fromNode, output: fromOutput }, to: { nodeId: toNode, input: toInput } };
|
|
161
|
+
}
|
|
162
|
+
function hashStrings(values) {
|
|
163
|
+
let hash = 0x811c9dc5;
|
|
164
|
+
for (const value of values) {
|
|
165
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
166
|
+
hash ^= value.charCodeAt(index);
|
|
167
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return hash.toString(16).padStart(8, "0");
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=ShaderGraphModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShaderGraphModel.js","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/ShaderGraphModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface StaticExportRuntimeOptions {
|
|
2
|
+
readonly globalName?: string;
|
|
3
|
+
readonly canvasSelector?: string;
|
|
4
|
+
readonly statusSelector?: string;
|
|
5
|
+
readonly projectPath?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface StaticExportHtmlOptions {
|
|
8
|
+
readonly title: string;
|
|
9
|
+
readonly runtimePath?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function createStaticExportRuntime(options?: StaticExportRuntimeOptions): string;
|
|
12
|
+
export declare function createStaticExportHtml(options: StaticExportHtmlOptions): string;
|
|
13
|
+
//# sourceMappingURL=StaticExportRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StaticExportRuntime.d.ts","sourceRoot":"","sources":["../../../../packages/editor-runtime/src/StaticExportRuntime.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAOD,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,0BAA+B,GAAG,MAAM,CAiQ1F;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAwB/E"}
|