@skenora/procedural 0.1.2
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 +60 -0
- package/dist/emitters.d.ts +3 -0
- package/dist/emitters.d.ts.map +1 -0
- package/dist/emitters.js +3 -0
- package/dist/emitters.js.map +1 -0
- package/dist/geometry-compiler.d.ts +27 -0
- package/dist/geometry-compiler.d.ts.map +1 -0
- package/dist/geometry-compiler.js +355 -0
- package/dist/geometry-compiler.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/material-compiler.d.ts +38 -0
- package/dist/material-compiler.d.ts.map +1 -0
- package/dist/material-compiler.js +132 -0
- package/dist/material-compiler.js.map +1 -0
- package/dist/material-program-emitters.d.ts +44 -0
- package/dist/material-program-emitters.d.ts.map +1 -0
- package/dist/material-program-emitters.js +335 -0
- package/dist/material-program-emitters.js.map +1 -0
- package/dist/render-graph-compiler.d.ts +17 -0
- package/dist/render-graph-compiler.d.ts.map +1 -0
- package/dist/render-graph-compiler.js +46 -0
- package/dist/render-graph-compiler.js.map +1 -0
- package/dist/simulation-compiler.d.ts +29 -0
- package/dist/simulation-compiler.d.ts.map +1 -0
- package/dist/simulation-compiler.js +108 -0
- package/dist/simulation-compiler.js.map +1 -0
- package/dist/texture-compiler.d.ts +19 -0
- package/dist/texture-compiler.d.ts.map +1 -0
- package/dist/texture-compiler.js +139 -0
- package/dist/texture-compiler.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# @skenora/procedural
|
|
2
|
+
|
|
3
|
+
Pure, renderer-independent compilers for versioned Skenora procedural programs.
|
|
4
|
+
|
|
5
|
+
> This package is not currently published to npm; the install command below is
|
|
6
|
+
> intended release syntax. Procedural V1 is current repository source and is
|
|
7
|
+
> not covered by the 2026-08-28 package/browser evidence.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @skenora/procedural
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
- `compileProceduralGeometry()` validates and compiles a bounded geometry graph
|
|
14
|
+
into positions, indices, normals, UVs, bounds, statistics, and a deterministic
|
|
15
|
+
signature.
|
|
16
|
+
- `compileMaterialProgram()` validates and lowers a typed material graph into a
|
|
17
|
+
deterministic intermediate representation with parameter uniforms,
|
|
18
|
+
requirements, topology signature, and content signature.
|
|
19
|
+
- `compileTextureProgram()` produces deterministic bounded generated texture
|
|
20
|
+
bytes and WGSL reflection metadata.
|
|
21
|
+
- `compileRenderGraph()` lowers trusted capture/blur/transmission passes to
|
|
22
|
+
ordered target IR with memory estimates.
|
|
23
|
+
- `compileSimulationProgram()` expands fixed-step fluid, staged inverse FFT,
|
|
24
|
+
or radiance/JFA declarations into stable ping-pong pass IR.
|
|
25
|
+
- Schema, validation, capability-description, limit, and program types are
|
|
26
|
+
re-exported from `@skenora/contracts`.
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import {
|
|
30
|
+
compileMaterialProgram,
|
|
31
|
+
compileProceduralGeometry,
|
|
32
|
+
validateProceduralGeometryProgram,
|
|
33
|
+
} from "@skenora/procedural";
|
|
34
|
+
|
|
35
|
+
const validation = validateProceduralGeometryProgram(geometryProgram);
|
|
36
|
+
if (!validation.valid) throw new Error(validation.issues[0]?.message);
|
|
37
|
+
|
|
38
|
+
const mesh = compileProceduralGeometry(geometryProgram);
|
|
39
|
+
const material = compileMaterialProgram(materialProgram);
|
|
40
|
+
|
|
41
|
+
console.log(mesh.stats, mesh.signature, material.topologySignature);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Geometry V1 limits nodes, segments, array counts, vertices, triangles, and
|
|
45
|
+
convex extrusion profiles. Material V1 limits nodes and parameters and can
|
|
46
|
+
write only PBR base color and emission. Changing parameter values preserves a
|
|
47
|
+
material topology signature; changing graph structure or literals does not.
|
|
48
|
+
|
|
49
|
+
The package never evaluates authored JavaScript or shader source and owns no
|
|
50
|
+
Canvas, Babylon, GPU, workspace, Editor, or network resources. See the
|
|
51
|
+
[repository](https://github.com/zhangjiadi225/skenora); the current working-tree
|
|
52
|
+
guide and resource-free example are `docs/PROCEDURAL_AI.md` and
|
|
53
|
+
`examples/procedural-ai/procedural-material.blueprint.json`.
|
|
54
|
+
|
|
55
|
+
The explicit `@skenora/procedural/emitters` subpath contains versioned trusted
|
|
56
|
+
GLSL and WGSL emitters over compiled MaterialProgram IR. It is an
|
|
57
|
+
internal-style backend seam: callers cannot provide shader text. Runtime
|
|
58
|
+
consumes the GLSL artifact; isolated tooling may inspect the WGSL artifact
|
|
59
|
+
without making WebGPU part of the default Babylon Runtime. Physical WebGPU
|
|
60
|
+
execution lives only in the explicit `@skenora/runtime/simulation` subpath.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitters.d.ts","sourceRoot":"","sources":["../src/emitters.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,6BAA6B,CAAC"}
|
package/dist/emitters.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitters.js","sourceRoot":"","sources":["../src/emitters.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type ProceduralGeometryProgram, type ProceduralProgramIssue, type Vector3Value } from "@skenora/contracts";
|
|
2
|
+
export interface ProceduralGeometryCompileLimits {
|
|
3
|
+
readonly maxVertices: number;
|
|
4
|
+
readonly maxTriangles: number;
|
|
5
|
+
}
|
|
6
|
+
export interface CompiledProceduralMesh {
|
|
7
|
+
readonly positions: readonly number[];
|
|
8
|
+
readonly indices: readonly number[];
|
|
9
|
+
readonly normals: readonly number[];
|
|
10
|
+
readonly uvs: readonly number[];
|
|
11
|
+
readonly bounds: Readonly<{
|
|
12
|
+
minimum: Readonly<Vector3Value>;
|
|
13
|
+
maximum: Readonly<Vector3Value>;
|
|
14
|
+
}>;
|
|
15
|
+
readonly stats: Readonly<{
|
|
16
|
+
vertices: number;
|
|
17
|
+
triangles: number;
|
|
18
|
+
}>;
|
|
19
|
+
readonly signature: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class ProceduralGeometryCompilationError extends Error {
|
|
22
|
+
readonly issues: readonly ProceduralProgramIssue[];
|
|
23
|
+
constructor(issues: readonly ProceduralProgramIssue[]);
|
|
24
|
+
}
|
|
25
|
+
/** Compile only data reachable from output. The function has no renderer or global state. */
|
|
26
|
+
export declare function compileProceduralGeometry(program: Readonly<ProceduralGeometryProgram>, limits?: Partial<ProceduralGeometryCompileLimits>): CompiledProceduralMesh;
|
|
27
|
+
//# sourceMappingURL=geometry-compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-compiler.d.ts","sourceRoot":"","sources":["../src/geometry-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;QACxB,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;QAChC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;KACjC,CAAC,CAAC;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,kCAAmC,SAAQ,KAAK;IAC3D,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;gBAEvC,MAAM,EAAE,SAAS,sBAAsB,EAAE;CAStD;AAQD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,QAAQ,CAAC,yBAAyB,CAAC,EAC5C,MAAM,GAAE,OAAO,CAAC,+BAA+B,CAAM,GACpD,sBAAsB,CAoDxB"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { PROCEDURAL_GEOMETRY_LIMITS, validateProceduralGeometryProgram, } from "@skenora/contracts";
|
|
2
|
+
export class ProceduralGeometryCompilationError extends Error {
|
|
3
|
+
issues;
|
|
4
|
+
constructor(issues) {
|
|
5
|
+
super(issues
|
|
6
|
+
.map((issue) => `${formatPath(issue.path)}: ${issue.message}`)
|
|
7
|
+
.join("; "));
|
|
8
|
+
this.name = "ProceduralGeometryCompilationError";
|
|
9
|
+
this.issues = issues.map((issue) => ({ ...issue, path: [...issue.path] }));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Compile only data reachable from output. The function has no renderer or global state. */
|
|
13
|
+
export function compileProceduralGeometry(program, limits = {}) {
|
|
14
|
+
const validation = validateProceduralGeometryProgram(program);
|
|
15
|
+
if (!validation.valid)
|
|
16
|
+
throw new ProceduralGeometryCompilationError(validation.issues);
|
|
17
|
+
const budget = {
|
|
18
|
+
maxVertices: limits.maxVertices ?? PROCEDURAL_GEOMETRY_LIMITS.maxVertices,
|
|
19
|
+
maxTriangles: limits.maxTriangles ?? PROCEDURAL_GEOMETRY_LIMITS.maxTriangles,
|
|
20
|
+
};
|
|
21
|
+
if (!Number.isInteger(budget.maxVertices) ||
|
|
22
|
+
budget.maxVertices <= 0 ||
|
|
23
|
+
!Number.isInteger(budget.maxTriangles) ||
|
|
24
|
+
budget.maxTriangles <= 0)
|
|
25
|
+
throw new Error("Procedural geometry compile limits must be positive integers");
|
|
26
|
+
const byId = new Map(program.nodes.map((node) => [node.id, node]));
|
|
27
|
+
const memo = new Map();
|
|
28
|
+
const compile = (id) => {
|
|
29
|
+
const cached = memo.get(id);
|
|
30
|
+
if (cached)
|
|
31
|
+
return cached;
|
|
32
|
+
const node = byId.get(id);
|
|
33
|
+
if (!node)
|
|
34
|
+
throw new ProceduralGeometryCompilationError([
|
|
35
|
+
{
|
|
36
|
+
code: "missing-node",
|
|
37
|
+
path: ["output"],
|
|
38
|
+
message: `Node not found: ${id}`,
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
const mesh = compileNode(node, compile);
|
|
42
|
+
enforceBudget(mesh, budget, node.id);
|
|
43
|
+
memo.set(id, mesh);
|
|
44
|
+
return mesh;
|
|
45
|
+
};
|
|
46
|
+
const output = compile(program.output);
|
|
47
|
+
const positions = [...output.positions];
|
|
48
|
+
const indices = [...output.indices];
|
|
49
|
+
const uvs = [...output.uvs];
|
|
50
|
+
const normals = calculateNormals(positions, indices);
|
|
51
|
+
return {
|
|
52
|
+
positions,
|
|
53
|
+
indices,
|
|
54
|
+
normals,
|
|
55
|
+
uvs,
|
|
56
|
+
bounds: calculateBounds(positions),
|
|
57
|
+
stats: { vertices: positions.length / 3, triangles: indices.length / 3 },
|
|
58
|
+
signature: fnv1a(stableStringify(program)),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function compileNode(node, compile) {
|
|
62
|
+
switch (node.type) {
|
|
63
|
+
case "geometry.box":
|
|
64
|
+
return createBox(node.size);
|
|
65
|
+
case "geometry.plane":
|
|
66
|
+
return createPlane(node.width, node.depth);
|
|
67
|
+
case "geometry.sphere":
|
|
68
|
+
return createSphere(node.diameter, node.segments);
|
|
69
|
+
case "geometry.cylinder":
|
|
70
|
+
return createCylinder(node.height, node.diameterTop, node.diameterBottom, node.segments);
|
|
71
|
+
case "geometry.extrude":
|
|
72
|
+
return createExtrude(node.profile, node.depth);
|
|
73
|
+
case "modifier.transform":
|
|
74
|
+
return transformMesh(compile(node.input), node.translation ?? { x: 0, y: 0, z: 0 }, node.rotation ?? { x: 0, y: 0, z: 0 }, node.scaling ?? { x: 1, y: 1, z: 1 });
|
|
75
|
+
case "modifier.array-linear":
|
|
76
|
+
return mergeMeshes(Array.from({ length: node.count }, (_, index) => transformMesh(compile(node.input), {
|
|
77
|
+
x: node.offset.x * index,
|
|
78
|
+
y: node.offset.y * index,
|
|
79
|
+
z: node.offset.z * index,
|
|
80
|
+
}, { x: 0, y: 0, z: 0 }, { x: 1, y: 1, z: 1 })));
|
|
81
|
+
case "modifier.array-radial": {
|
|
82
|
+
const start = node.startAngle ?? 0;
|
|
83
|
+
return mergeMeshes(Array.from({ length: node.count }, (_, index) => {
|
|
84
|
+
const angle = start + (index / node.count) * Math.PI * 2;
|
|
85
|
+
return transformMesh(compile(node.input), {
|
|
86
|
+
x: Math.cos(angle) * node.radius,
|
|
87
|
+
y: 0,
|
|
88
|
+
z: Math.sin(angle) * node.radius,
|
|
89
|
+
}, { x: 0, y: -angle, z: 0 }, { x: 1, y: 1, z: 1 });
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
case "combine.merge":
|
|
93
|
+
return mergeMeshes(node.inputs.map(compile));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function createBox(size) {
|
|
97
|
+
const x = size.x / 2, y = size.y / 2, z = size.z / 2;
|
|
98
|
+
const mesh = { positions: [], indices: [], uvs: [] };
|
|
99
|
+
const quad = (...values) => {
|
|
100
|
+
const start = mesh.positions.length / 3;
|
|
101
|
+
mesh.positions.push(...values);
|
|
102
|
+
mesh.indices.push(start, start + 1, start + 2, start, start + 2, start + 3);
|
|
103
|
+
mesh.uvs.push(0, 0, 0, 1, 1, 1, 1, 0);
|
|
104
|
+
};
|
|
105
|
+
quad(-x, -y, -z, -x, y, -z, x, y, -z, x, -y, -z);
|
|
106
|
+
quad(-x, -y, z, x, -y, z, x, y, z, -x, y, z);
|
|
107
|
+
quad(-x, -y, z, -x, y, z, -x, y, -z, -x, -y, -z);
|
|
108
|
+
quad(x, -y, -z, x, y, -z, x, y, z, x, -y, z);
|
|
109
|
+
quad(-x, y, -z, -x, y, z, x, y, z, x, y, -z);
|
|
110
|
+
quad(-x, -y, z, -x, -y, -z, x, -y, -z, x, -y, z);
|
|
111
|
+
return mesh;
|
|
112
|
+
}
|
|
113
|
+
function createPlane(width, depth) {
|
|
114
|
+
const x = width / 2, z = depth / 2;
|
|
115
|
+
return {
|
|
116
|
+
positions: [-x, 0, -z, x, 0, -z, x, 0, z, -x, 0, z],
|
|
117
|
+
indices: [0, 2, 1, 0, 3, 2],
|
|
118
|
+
uvs: [0, 0, 1, 0, 1, 1, 0, 1],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function createSphere(diameter, segments) {
|
|
122
|
+
const positions = [];
|
|
123
|
+
const indices = [];
|
|
124
|
+
const uvs = [];
|
|
125
|
+
const radius = diameter / 2;
|
|
126
|
+
for (let row = 0; row <= segments; row += 1) {
|
|
127
|
+
const v = row / segments;
|
|
128
|
+
const phi = v * Math.PI;
|
|
129
|
+
for (let column = 0; column <= segments; column += 1) {
|
|
130
|
+
const u = column / segments;
|
|
131
|
+
const theta = u * Math.PI * 2;
|
|
132
|
+
positions.push(Math.sin(phi) * Math.cos(theta) * radius, Math.cos(phi) * radius, Math.sin(phi) * Math.sin(theta) * radius);
|
|
133
|
+
uvs.push(u, v);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const stride = segments + 1;
|
|
137
|
+
for (let row = 0; row < segments; row += 1)
|
|
138
|
+
for (let column = 0; column < segments; column += 1) {
|
|
139
|
+
const a = row * stride + column;
|
|
140
|
+
const b = a + stride;
|
|
141
|
+
indices.push(a, a + 1, b + 1, a, b + 1, b);
|
|
142
|
+
}
|
|
143
|
+
return { positions, indices, uvs };
|
|
144
|
+
}
|
|
145
|
+
function createCylinder(height, diameterTop, diameterBottom, segments) {
|
|
146
|
+
const positions = [];
|
|
147
|
+
const indices = [];
|
|
148
|
+
const uvs = [];
|
|
149
|
+
const half = height / 2;
|
|
150
|
+
for (let index = 0; index <= segments; index += 1) {
|
|
151
|
+
const u = index / segments;
|
|
152
|
+
const angle = u * Math.PI * 2;
|
|
153
|
+
const x = Math.cos(angle), z = Math.sin(angle);
|
|
154
|
+
positions.push(x * diameterBottom * 0.5, -half, z * diameterBottom * 0.5);
|
|
155
|
+
positions.push(x * diameterTop * 0.5, half, z * diameterTop * 0.5);
|
|
156
|
+
uvs.push(u, 0, u, 1);
|
|
157
|
+
}
|
|
158
|
+
for (let index = 0; index < segments; index += 1) {
|
|
159
|
+
const base = index * 2;
|
|
160
|
+
indices.push(base, base + 1, base + 3, base, base + 3, base + 2);
|
|
161
|
+
}
|
|
162
|
+
const addCap = (top, radius) => {
|
|
163
|
+
if (radius === 0)
|
|
164
|
+
return;
|
|
165
|
+
const center = positions.length / 3;
|
|
166
|
+
positions.push(0, top ? half : -half, 0);
|
|
167
|
+
uvs.push(0.5, 0.5);
|
|
168
|
+
const ring = positions.length / 3;
|
|
169
|
+
for (let index = 0; index < segments; index += 1) {
|
|
170
|
+
const angle = (index / segments) * Math.PI * 2;
|
|
171
|
+
const x = Math.cos(angle), z = Math.sin(angle);
|
|
172
|
+
positions.push(x * radius, top ? half : -half, z * radius);
|
|
173
|
+
uvs.push(x * 0.5 + 0.5, z * 0.5 + 0.5);
|
|
174
|
+
}
|
|
175
|
+
for (let index = 0; index < segments; index += 1) {
|
|
176
|
+
const current = ring + index;
|
|
177
|
+
const next = ring + ((index + 1) % segments);
|
|
178
|
+
if (top)
|
|
179
|
+
indices.push(center, next, current);
|
|
180
|
+
else
|
|
181
|
+
indices.push(center, current, next);
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
addCap(true, diameterTop / 2);
|
|
185
|
+
addCap(false, diameterBottom / 2);
|
|
186
|
+
return { positions, indices, uvs };
|
|
187
|
+
}
|
|
188
|
+
function createExtrude(profile, depth) {
|
|
189
|
+
const points = signedArea(profile) < 0 ? [...profile].reverse() : [...profile];
|
|
190
|
+
const positions = [];
|
|
191
|
+
const indices = [];
|
|
192
|
+
const uvs = [];
|
|
193
|
+
const half = depth / 2;
|
|
194
|
+
const bounds = profileBounds(points);
|
|
195
|
+
const appendCap = (z, front) => {
|
|
196
|
+
const start = positions.length / 3;
|
|
197
|
+
for (const point of points) {
|
|
198
|
+
positions.push(point.x, point.y, z);
|
|
199
|
+
uvs.push((point.x - bounds.minimum.x) /
|
|
200
|
+
Math.max(bounds.maximum.x - bounds.minimum.x, 1e-9), (point.y - bounds.minimum.y) /
|
|
201
|
+
Math.max(bounds.maximum.y - bounds.minimum.y, 1e-9));
|
|
202
|
+
}
|
|
203
|
+
for (let index = 1; index < points.length - 1; index += 1)
|
|
204
|
+
if (front)
|
|
205
|
+
indices.push(start, start + index, start + index + 1);
|
|
206
|
+
else
|
|
207
|
+
indices.push(start, start + index + 1, start + index);
|
|
208
|
+
return start;
|
|
209
|
+
};
|
|
210
|
+
appendCap(half, true);
|
|
211
|
+
appendCap(-half, false);
|
|
212
|
+
for (let index = 0; index < points.length; index += 1) {
|
|
213
|
+
const a = points[index];
|
|
214
|
+
const b = points[(index + 1) % points.length];
|
|
215
|
+
const start = positions.length / 3;
|
|
216
|
+
positions.push(a.x, a.y, half, a.x, a.y, -half, b.x, b.y, -half, b.x, b.y, half);
|
|
217
|
+
uvs.push(0, 1, 0, 0, 1, 0, 1, 1);
|
|
218
|
+
indices.push(start, start + 1, start + 2, start, start + 2, start + 3);
|
|
219
|
+
}
|
|
220
|
+
return { positions, indices, uvs };
|
|
221
|
+
}
|
|
222
|
+
function transformMesh(source, translation, rotation, scaling) {
|
|
223
|
+
const positions = [];
|
|
224
|
+
for (let index = 0; index < source.positions.length; index += 3) {
|
|
225
|
+
let x = source.positions[index] * scaling.x;
|
|
226
|
+
let y = source.positions[index + 1] * scaling.y;
|
|
227
|
+
let z = source.positions[index + 2] * scaling.z;
|
|
228
|
+
[y, z] = rotatePair(y, z, rotation.x);
|
|
229
|
+
[z, x] = rotatePair(z, x, rotation.y);
|
|
230
|
+
[x, y] = rotatePair(x, y, rotation.z);
|
|
231
|
+
positions.push(x + translation.x, y + translation.y, z + translation.z);
|
|
232
|
+
}
|
|
233
|
+
const indices = scaling.x * scaling.y * scaling.z < 0
|
|
234
|
+
? reverseTriangles(source.indices)
|
|
235
|
+
: [...source.indices];
|
|
236
|
+
return { positions, indices, uvs: [...source.uvs] };
|
|
237
|
+
}
|
|
238
|
+
function rotatePair(a, b, angle) {
|
|
239
|
+
const cosine = Math.cos(angle), sine = Math.sin(angle);
|
|
240
|
+
return [a * cosine - b * sine, a * sine + b * cosine];
|
|
241
|
+
}
|
|
242
|
+
function mergeMeshes(meshes) {
|
|
243
|
+
const result = { positions: [], indices: [], uvs: [] };
|
|
244
|
+
for (const mesh of meshes) {
|
|
245
|
+
const offset = result.positions.length / 3;
|
|
246
|
+
result.positions.push(...mesh.positions);
|
|
247
|
+
result.uvs.push(...mesh.uvs);
|
|
248
|
+
result.indices.push(...mesh.indices.map((index) => index + offset));
|
|
249
|
+
}
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
function reverseTriangles(indices) {
|
|
253
|
+
const result = [...indices];
|
|
254
|
+
for (let index = 0; index < result.length; index += 3)
|
|
255
|
+
[result[index + 1], result[index + 2]] = [
|
|
256
|
+
result[index + 2],
|
|
257
|
+
result[index + 1],
|
|
258
|
+
];
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
function calculateNormals(positions, indices) {
|
|
262
|
+
const normals = Array(positions.length).fill(0);
|
|
263
|
+
for (let index = 0; index < indices.length; index += 3) {
|
|
264
|
+
const ia = indices[index] * 3, ib = indices[index + 1] * 3, ic = indices[index + 2] * 3;
|
|
265
|
+
const abx = positions[ib] - positions[ia], aby = positions[ib + 1] - positions[ia + 1], abz = positions[ib + 2] - positions[ia + 2];
|
|
266
|
+
const acx = positions[ic] - positions[ia], acy = positions[ic + 1] - positions[ia + 1], acz = positions[ic + 2] - positions[ia + 2];
|
|
267
|
+
const nx = aby * acz - abz * acy, ny = abz * acx - abx * acz, nz = abx * acy - aby * acx;
|
|
268
|
+
for (const offset of [ia, ib, ic]) {
|
|
269
|
+
normals[offset] += nx;
|
|
270
|
+
normals[offset + 1] += ny;
|
|
271
|
+
normals[offset + 2] += nz;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
for (let index = 0; index < normals.length; index += 3) {
|
|
275
|
+
const length = Math.hypot(normals[index], normals[index + 1], normals[index + 2]) ||
|
|
276
|
+
1;
|
|
277
|
+
normals[index] = normals[index] / length;
|
|
278
|
+
normals[index + 1] = normals[index + 1] / length;
|
|
279
|
+
normals[index + 2] = normals[index + 2] / length;
|
|
280
|
+
}
|
|
281
|
+
return normals;
|
|
282
|
+
}
|
|
283
|
+
function calculateBounds(positions) {
|
|
284
|
+
const minimum = { x: Infinity, y: Infinity, z: Infinity };
|
|
285
|
+
const maximum = { x: -Infinity, y: -Infinity, z: -Infinity };
|
|
286
|
+
for (let index = 0; index < positions.length; index += 3) {
|
|
287
|
+
minimum.x = Math.min(minimum.x, positions[index]);
|
|
288
|
+
minimum.y = Math.min(minimum.y, positions[index + 1]);
|
|
289
|
+
minimum.z = Math.min(minimum.z, positions[index + 2]);
|
|
290
|
+
maximum.x = Math.max(maximum.x, positions[index]);
|
|
291
|
+
maximum.y = Math.max(maximum.y, positions[index + 1]);
|
|
292
|
+
maximum.z = Math.max(maximum.z, positions[index + 2]);
|
|
293
|
+
}
|
|
294
|
+
return { minimum, maximum };
|
|
295
|
+
}
|
|
296
|
+
function enforceBudget(mesh, limits, nodeId) {
|
|
297
|
+
const vertices = mesh.positions.length / 3;
|
|
298
|
+
const triangles = mesh.indices.length / 3;
|
|
299
|
+
if (vertices <= limits.maxVertices && triangles <= limits.maxTriangles)
|
|
300
|
+
return;
|
|
301
|
+
throw new ProceduralGeometryCompilationError([
|
|
302
|
+
{
|
|
303
|
+
code: "budget-exceeded",
|
|
304
|
+
path: ["nodes", nodeId],
|
|
305
|
+
message: `Compiled mesh has ${vertices} vertices and ${triangles} triangles; limits are ${limits.maxVertices} and ${limits.maxTriangles}`,
|
|
306
|
+
},
|
|
307
|
+
]);
|
|
308
|
+
}
|
|
309
|
+
function signedArea(points) {
|
|
310
|
+
return (points.reduce((area, point, index) => {
|
|
311
|
+
const next = points[(index + 1) % points.length];
|
|
312
|
+
return area + point.x * next.y - next.x * point.y;
|
|
313
|
+
}, 0) / 2);
|
|
314
|
+
}
|
|
315
|
+
function profileBounds(points) {
|
|
316
|
+
return points.reduce((bounds, point) => ({
|
|
317
|
+
minimum: {
|
|
318
|
+
x: Math.min(bounds.minimum.x, point.x),
|
|
319
|
+
y: Math.min(bounds.minimum.y, point.y),
|
|
320
|
+
},
|
|
321
|
+
maximum: {
|
|
322
|
+
x: Math.max(bounds.maximum.x, point.x),
|
|
323
|
+
y: Math.max(bounds.maximum.y, point.y),
|
|
324
|
+
},
|
|
325
|
+
}), {
|
|
326
|
+
minimum: { x: Infinity, y: Infinity },
|
|
327
|
+
maximum: { x: -Infinity, y: -Infinity },
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
function stableStringify(value) {
|
|
331
|
+
if (Array.isArray(value))
|
|
332
|
+
return `[${value.map(stableStringify).join(",")}]`;
|
|
333
|
+
if (value && typeof value === "object")
|
|
334
|
+
return `{${Object.entries(value)
|
|
335
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
336
|
+
.map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`)
|
|
337
|
+
.join(",")}}`;
|
|
338
|
+
return JSON.stringify(value) ?? "null";
|
|
339
|
+
}
|
|
340
|
+
function fnv1a(value) {
|
|
341
|
+
let hash = 0x811c9dc5;
|
|
342
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
343
|
+
hash ^= value.charCodeAt(index);
|
|
344
|
+
hash = Math.imul(hash, 0x01000193);
|
|
345
|
+
}
|
|
346
|
+
return `fnv1a:${(hash >>> 0).toString(16).padStart(8, "0")}`;
|
|
347
|
+
}
|
|
348
|
+
function formatPath(path) {
|
|
349
|
+
return path.reduce((result, part) => typeof part === "number"
|
|
350
|
+
? `${result}[${part}]`
|
|
351
|
+
: result
|
|
352
|
+
? `${result}.${part}`
|
|
353
|
+
: part, "");
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=geometry-compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-compiler.js","sourceRoot":"","sources":["../src/geometry-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,GAKlC,MAAM,oBAAoB,CAAC;AAoB5B,MAAM,OAAO,kCAAmC,SAAQ,KAAK;IAClD,MAAM,CAAoC;IAEnD,YAAY,MAAyC;QACnD,KAAK,CACH,MAAM;aACH,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;aAC7D,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,oCAAoC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;CACF;AAQD,6FAA6F;AAC7F,MAAM,UAAU,yBAAyB,CACvC,OAA4C,EAC5C,SAAmD,EAAE;IAErD,MAAM,UAAU,GAAG,iCAAiC,CAAC,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,KAAK;QACnB,MAAM,IAAI,kCAAkC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,MAAM,GAAoC;QAC9C,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,0BAA0B,CAAC,WAAW;QACzE,YAAY,EACV,MAAM,CAAC,YAAY,IAAI,0BAA0B,CAAC,YAAY;KACjE,CAAC;IACF,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;QACrC,MAAM,CAAC,WAAW,IAAI,CAAC;QACvB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC;QACtC,MAAM,CAAC,YAAY,IAAI,CAAC;QAExB,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IAEJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAC;IACzC,MAAM,OAAO,GAAG,CAAC,EAAU,EAAY,EAAE;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI;YACP,MAAM,IAAI,kCAAkC,CAAC;gBAC3C;oBACE,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE,CAAC,QAAQ,CAAC;oBAChB,OAAO,EAAE,mBAAmB,EAAE,EAAE;iBACjC;aACF,CAAC,CAAC;QACL,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO;QACL,SAAS;QACT,OAAO;QACP,OAAO;QACP,GAAG;QACH,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC;QAClC,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QACxE,SAAS,EAAE,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,IAAsC,EACtC,OAAiC;IAEjC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,cAAc;YACjB,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,gBAAgB;YACnB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,iBAAiB;YACpB,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,KAAK,mBAAmB;YACtB,OAAO,cAAc,CACnB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,CACd,CAAC;QACJ,KAAK,kBAAkB;YACrB,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,KAAK,oBAAoB;YACvB,OAAO,aAAa,CAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EACnB,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EACxC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EACrC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CACrC,CAAC;QACJ,KAAK,uBAAuB;YAC1B,OAAO,WAAW,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAC9C,aAAa,CACX,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EACnB;gBACE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;gBACxB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;gBACxB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;aACzB,EACD,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EACpB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CACrB,CACF,CACF,CAAC;QACJ,KAAK,uBAAuB,CAAC,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;YACnC,OAAO,WAAW,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;gBACzD,OAAO,aAAa,CAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EACnB;oBACE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM;oBAChC,CAAC,EAAE,CAAC;oBACJ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM;iBACjC,EACD,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EACzB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CACrB,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,KAAK,eAAe;YAClB,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAA4B;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAClB,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EACd,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,IAAI,GAAa,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,CAAC,GAAG,MAAgB,EAAQ,EAAE;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC;IACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,KAAa;IAC/C,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,EACjB,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAChB,OAAO;QACL,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3B,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,QAAgB;IACtD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QACxB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9B,SAAS,CAAC,IAAI,CACZ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,EACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,EACtB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CACzC,CAAC;YACF,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC5B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;QACxC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,cAAc,CACrB,MAAc,EACd,WAAmB,EACnB,cAAsB,EACtB,QAAgB;IAEhB,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;IACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EACvB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,cAAc,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,GAAG,GAAG,CAAC,CAAC;QAC1E,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAY,EAAE,MAAc,EAAQ,EAAE;QACpD,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EACvB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtB,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC7C,IAAI,GAAG;gBAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;;gBACxC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC;IAClC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CACpB,OAAsD,EACtD,KAAa;IAEb,MAAM,MAAM,GACV,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;IAClE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,KAAc,EAAU,EAAE;QACtD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,GAAG,CAAC,IAAI,CACN,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,EACrD,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CACtD,CAAC;QACJ,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;YACvD,IAAI,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;;gBAC5D,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,SAAS,CAAC,IAAI,CACZ,CAAC,CAAC,CAAC,EACH,CAAC,CAAC,CAAC,EACH,IAAI,EACJ,CAAC,CAAC,CAAC,EACH,CAAC,CAAC,CAAC,EACH,CAAC,IAAI,EACL,CAAC,CAAC,CAAC,EACH,CAAC,CAAC,CAAC,EACH,CAAC,IAAI,EACL,CAAC,CAAC,CAAC,EACH,CAAC,CAAC,CAAC,EACH,IAAI,CACL,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CACpB,MAAgB,EAChB,WAAmC,EACnC,QAAgC,EAChC,OAA+B;IAE/B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAE,GAAG,OAAO,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,OAAO,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,OAAO,GACX,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC;QACnC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;QAClC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,UAAU,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAC5B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,WAAW,CAAC,MAA2B;IAC9C,MAAM,MAAM,GAAa,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACjE,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA0B;IAClD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;QACnD,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG;YACvC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE;YAClB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAE;SACnB,CAAC;IACJ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,SAA4B,EAC5B,OAA0B;IAE1B,MAAM,OAAO,GAAG,KAAK,CAAS,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAE,GAAG,CAAC,EAC5B,EAAE,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,CAAC,EAC5B,EAAE,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC;QAC/B,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAE,GAAG,SAAS,CAAC,EAAE,CAAE,EACzC,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,EAC7C,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC;QAChD,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAE,GAAG,SAAS,CAAC,EAAE,CAAE,EACzC,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,EAC7C,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC;QAChD,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAC9B,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAC1B,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAE,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAE,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;YACrE,CAAC,CAAC;QACJ,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAE,GAAG,MAAM,CAAC;QAC1C,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC;QAClD,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC;IACpD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,SAA4B;IACnD,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC7D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACzD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAE,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAE,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CACpB,IAAc,EACd,MAAuC,EACvC,MAAc;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ,IAAI,MAAM,CAAC,WAAW,IAAI,SAAS,IAAI,MAAM,CAAC,YAAY;QACpE,OAAO;IACT,MAAM,IAAI,kCAAkC,CAAC;QAC3C;YACE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;YACvB,OAAO,EAAE,qBAAqB,QAAQ,iBAAiB,SAAS,0BAA0B,MAAM,CAAC,WAAW,QAAQ,MAAM,CAAC,YAAY,EAAE;SAC1I;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CACjB,MAAqD;IAErD,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE,CAAC;QAClD,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CACV,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAqD;IAC1E,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAClB,OAAO,EAAE;YACP,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACtC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;SACvC;QACD,OAAO,EAAE;YACP,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACtC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;SACvC;KACF,CAAC,EACF;QACE,OAAO,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE;QACrC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE;KACxC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7E,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QACpC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aACxD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;aACvE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC;AACzC,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC1B,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,UAAU,CAAC,IAAkC;IACpD,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACf,OAAO,IAAI,KAAK,QAAQ;QACtB,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG;QACtB,CAAC,CAAC,MAAM;YACN,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE;YACrB,CAAC,CAAC,IAAI,EACZ,EAAE,CACH,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./geometry-compiler.js";
|
|
2
|
+
export * from "./material-compiler.js";
|
|
3
|
+
export * from "./texture-compiler.js";
|
|
4
|
+
export * from "./render-graph-compiler.js";
|
|
5
|
+
export * from "./simulation-compiler.js";
|
|
6
|
+
export { MATERIAL_PROGRAM_CAPABILITY_ID, MATERIAL_PROGRAM_CAPABILITY_VERSION, MATERIAL_PROGRAM_LIMITS, MATERIAL_PROGRAM_SCHEMA, MATERIAL_PROGRAM_VERSION, MATERIAL_PROGRAM_V2_VERSION, MATERIAL_PROGRAM_V2_CAPABILITY_ID, MATERIAL_PROGRAM_V2_CAPABILITY_VERSION, TEXTURE_PROGRAM_CAPABILITY_ID, TEXTURE_PROGRAM_CAPABILITY_VERSION, TEXTURE_PROGRAM_LIMITS, TEXTURE_PROGRAM_SCHEMA, TEXTURE_PROGRAM_VERSION, RENDER_GRAPH_CAPABILITY_ID, RENDER_GRAPH_CAPABILITY_VERSION, RENDER_GRAPH_LIMITS, RENDER_GRAPH_SCHEMA, RENDER_GRAPH_VERSION, SIMULATION_PROGRAM_CAPABILITY_ID, SIMULATION_PROGRAM_CAPABILITY_VERSION, SIMULATION_PROGRAM_LIMITS, SIMULATION_PROGRAM_SCHEMA, SIMULATION_PROGRAM_VERSION, PROCEDURAL_GEOMETRY_CAPABILITY_ID, PROCEDURAL_GEOMETRY_CAPABILITY_VERSION, PROCEDURAL_GEOMETRY_LIMITS, PROCEDURAL_GEOMETRY_SCHEMA, PROCEDURAL_GEOMETRY_VERSION, describeMaterialProgramCapability, describeMaterialProgramV2Capability, describeTextureProgramCapability, describeRenderGraphCapability, describeSimulationProgramCapability, describeProceduralGeometryCapability, getMaterialProgramJsonSchema, getTextureProgramJsonSchema, getRenderGraphJsonSchema, getSimulationProgramJsonSchema, getProceduralGeometryProgramJsonSchema, validateMaterialProgram, validateTextureProgram, validateRenderGraph, validateSimulationProgram, validateProceduralGeometryProgram, type MaterialProgram, type MaterialProgramIssue, type MaterialProgramNode, type MaterialProgramOutputs, type MaterialProgramParameter, type MaterialProgramValidationResult, type MaterialProgramValueType, type TextureProgram, type TextureProgramIssue, type TextureProgramKind, type TextureProgramValidationResult, type RenderGraphIssue, type RenderGraphPass, type RenderGraphProgram, type RenderGraphTarget, type RenderGraphValidationResult, type SimulationKernel, type SimulationProgram, type SimulationProgramIssue, type SimulationProgramValidationResult, type SimulationStorageResource, type ProceduralEntityProperties, type ProceduralGeometryNode, type ProceduralGeometryProgram, type ProceduralProgramIssue, type ProceduralProgramValidationResult, } from "@skenora/contracts";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,8BAA8B,EAC9B,mCAAmC,EACnC,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,iCAAiC,EACjC,sCAAsC,EACtC,6BAA6B,EAC7B,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,gCAAgC,EAChC,qCAAqC,EACrC,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,iCAAiC,EACjC,sCAAsC,EACtC,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,iCAAiC,EACjC,mCAAmC,EACnC,gCAAgC,EAChC,6BAA6B,EAC7B,mCAAmC,EACnC,oCAAoC,EACpC,4BAA4B,EAC5B,2BAA2B,EAC3B,wBAAwB,EACxB,8BAA8B,EAC9B,sCAAsC,EACtC,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,iCAAiC,EACjC,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACnC,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,iCAAiC,GACvC,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./geometry-compiler.js";
|
|
2
|
+
export * from "./material-compiler.js";
|
|
3
|
+
export * from "./texture-compiler.js";
|
|
4
|
+
export * from "./render-graph-compiler.js";
|
|
5
|
+
export * from "./simulation-compiler.js";
|
|
6
|
+
export { MATERIAL_PROGRAM_CAPABILITY_ID, MATERIAL_PROGRAM_CAPABILITY_VERSION, MATERIAL_PROGRAM_LIMITS, MATERIAL_PROGRAM_SCHEMA, MATERIAL_PROGRAM_VERSION, MATERIAL_PROGRAM_V2_VERSION, MATERIAL_PROGRAM_V2_CAPABILITY_ID, MATERIAL_PROGRAM_V2_CAPABILITY_VERSION, TEXTURE_PROGRAM_CAPABILITY_ID, TEXTURE_PROGRAM_CAPABILITY_VERSION, TEXTURE_PROGRAM_LIMITS, TEXTURE_PROGRAM_SCHEMA, TEXTURE_PROGRAM_VERSION, RENDER_GRAPH_CAPABILITY_ID, RENDER_GRAPH_CAPABILITY_VERSION, RENDER_GRAPH_LIMITS, RENDER_GRAPH_SCHEMA, RENDER_GRAPH_VERSION, SIMULATION_PROGRAM_CAPABILITY_ID, SIMULATION_PROGRAM_CAPABILITY_VERSION, SIMULATION_PROGRAM_LIMITS, SIMULATION_PROGRAM_SCHEMA, SIMULATION_PROGRAM_VERSION, PROCEDURAL_GEOMETRY_CAPABILITY_ID, PROCEDURAL_GEOMETRY_CAPABILITY_VERSION, PROCEDURAL_GEOMETRY_LIMITS, PROCEDURAL_GEOMETRY_SCHEMA, PROCEDURAL_GEOMETRY_VERSION, describeMaterialProgramCapability, describeMaterialProgramV2Capability, describeTextureProgramCapability, describeRenderGraphCapability, describeSimulationProgramCapability, describeProceduralGeometryCapability, getMaterialProgramJsonSchema, getTextureProgramJsonSchema, getRenderGraphJsonSchema, getSimulationProgramJsonSchema, getProceduralGeometryProgramJsonSchema, validateMaterialProgram, validateTextureProgram, validateRenderGraph, validateSimulationProgram, validateProceduralGeometryProgram, } from "@skenora/contracts";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,8BAA8B,EAC9B,mCAAmC,EACnC,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,iCAAiC,EACjC,sCAAsC,EACtC,6BAA6B,EAC7B,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,gCAAgC,EAChC,qCAAqC,EACrC,yBAAyB,EACzB,yBAAyB,EACzB,0BAA0B,EAC1B,iCAAiC,EACjC,sCAAsC,EACtC,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,iCAAiC,EACjC,mCAAmC,EACnC,gCAAgC,EAChC,6BAA6B,EAC7B,mCAAmC,EACnC,oCAAoC,EACpC,4BAA4B,EAC5B,2BAA2B,EAC3B,wBAAwB,EACxB,8BAA8B,EAC9B,sCAAsC,EACtC,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,iCAAiC,GA2BlC,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type MaterialProgram, type MaterialProgramIssue, type MaterialProgramNode, type MaterialProgramParameter, type MaterialProgramValueType } from "@skenora/contracts";
|
|
2
|
+
export interface CompiledMaterialParameter {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly uniform: string;
|
|
5
|
+
readonly definition: Readonly<MaterialProgramParameter>;
|
|
6
|
+
}
|
|
7
|
+
export interface CompiledMaterialInstruction {
|
|
8
|
+
readonly node: Readonly<MaterialProgramNode>;
|
|
9
|
+
readonly valueType: MaterialProgramValueType;
|
|
10
|
+
}
|
|
11
|
+
export interface CompiledMaterialProgram {
|
|
12
|
+
readonly instructions: readonly CompiledMaterialInstruction[];
|
|
13
|
+
readonly parameters: readonly CompiledMaterialParameter[];
|
|
14
|
+
readonly outputs: Readonly<{
|
|
15
|
+
baseColor?: string;
|
|
16
|
+
emissive?: string;
|
|
17
|
+
roughness?: string;
|
|
18
|
+
metallic?: string;
|
|
19
|
+
opacity?: string;
|
|
20
|
+
}>;
|
|
21
|
+
readonly requirements: Readonly<{
|
|
22
|
+
localPosition: boolean;
|
|
23
|
+
worldPosition: boolean;
|
|
24
|
+
fresnel: boolean;
|
|
25
|
+
noise: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
/** Changes only when generated shader structure or literals change. */
|
|
28
|
+
readonly topologySignature: string;
|
|
29
|
+
/** Includes parameter values and is useful for caches or audit logs. */
|
|
30
|
+
readonly contentSignature: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class MaterialProgramCompilationError extends Error {
|
|
33
|
+
readonly issues: readonly MaterialProgramIssue[];
|
|
34
|
+
constructor(issues: readonly MaterialProgramIssue[]);
|
|
35
|
+
}
|
|
36
|
+
/** Validate and lower a material graph into deterministic, renderer-neutral IR. */
|
|
37
|
+
export declare function compileMaterialProgram(program: Readonly<MaterialProgram>): CompiledMaterialProgram;
|
|
38
|
+
//# sourceMappingURL=material-compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-compiler.d.ts","sourceRoot":"","sources":["../src/material-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,wBAAwB,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;CAC9C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,YAAY,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC9D,QAAQ,CAAC,UAAU,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC1D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;QAC9B,aAAa,EAAE,OAAO,CAAC;QACvB,aAAa,EAAE,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC,CAAC;IACH,uEAAuE;IACvE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,QAAQ,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,CAAC;gBAErC,MAAM,EAAE,SAAS,oBAAoB,EAAE;CAYpD;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,GACjC,uBAAuB,CA0DzB"}
|