@aura3d/addons 0.0.0-stage → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +11 -2
  2. package/dist/effects/AsciiOutput.d.ts +60 -0
  3. package/dist/effects/AsciiOutput.d.ts.map +1 -0
  4. package/dist/effects/AsciiOutput.js +187 -0
  5. package/dist/effects/AsciiOutput.js.map +1 -0
  6. package/dist/effects/OutlineOutput.d.ts +58 -0
  7. package/dist/effects/OutlineOutput.d.ts.map +1 -0
  8. package/dist/effects/OutlineOutput.js +274 -0
  9. package/dist/effects/OutlineOutput.js.map +1 -0
  10. package/dist/effects/StereoOutputs.d.ts +106 -0
  11. package/dist/effects/StereoOutputs.d.ts.map +1 -0
  12. package/dist/effects/StereoOutputs.js +315 -0
  13. package/dist/effects/StereoOutputs.js.map +1 -0
  14. package/dist/generators/EnvironmentGenerators.d.ts +100 -0
  15. package/dist/generators/EnvironmentGenerators.d.ts.map +1 -0
  16. package/dist/generators/EnvironmentGenerators.js +477 -0
  17. package/dist/generators/EnvironmentGenerators.js.map +1 -0
  18. package/dist/index.d.ts +14 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +14 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/objects/MarchingCubes.d.ts +80 -0
  23. package/dist/objects/MarchingCubes.d.ts.map +1 -0
  24. package/dist/objects/MarchingCubes.js +289 -0
  25. package/dist/objects/MarchingCubes.js.map +1 -0
  26. package/dist/objects/SpecializedObjects.d.ts +150 -0
  27. package/dist/objects/SpecializedObjects.d.ts.map +1 -0
  28. package/dist/objects/SpecializedObjects.js +544 -0
  29. package/dist/objects/SpecializedObjects.js.map +1 -0
  30. package/dist/renderers/SpatialDOMRenderer.d.ts +76 -0
  31. package/dist/renderers/SpatialDOMRenderer.d.ts.map +1 -0
  32. package/dist/renderers/SpatialDOMRenderer.js +279 -0
  33. package/dist/renderers/SpatialDOMRenderer.js.map +1 -0
  34. package/dist/renderers/VectorRenderer.d.ts +98 -0
  35. package/dist/renderers/VectorRenderer.d.ts.map +1 -0
  36. package/dist/renderers/VectorRenderer.js +253 -0
  37. package/dist/renderers/VectorRenderer.js.map +1 -0
  38. package/dist/tools/Fracture.d.ts +87 -0
  39. package/dist/tools/Fracture.d.ts.map +1 -0
  40. package/dist/tools/Fracture.js +422 -0
  41. package/dist/tools/Fracture.js.map +1 -0
  42. package/dist/tools/Sculptor.d.ts +84 -0
  43. package/dist/tools/Sculptor.d.ts.map +1 -0
  44. package/dist/tools/Sculptor.js +207 -0
  45. package/dist/tools/Sculptor.js.map +1 -0
  46. package/dist/tools/TubePainter.d.ts +47 -0
  47. package/dist/tools/TubePainter.d.ts.map +1 -0
  48. package/dist/tools/TubePainter.js +170 -0
  49. package/dist/tools/TubePainter.js.map +1 -0
  50. package/dist/utils/WorkerPool.d.ts +93 -0
  51. package/dist/utils/WorkerPool.d.ts.map +1 -0
  52. package/dist/utils/WorkerPool.js +360 -0
  53. package/dist/utils/WorkerPool.js.map +1 -0
  54. package/package.json +114 -3
@@ -0,0 +1,207 @@
1
+ const HARD_MAX_VERTICES = 250_000;
2
+ const HARD_MAX_TRIANGLES = 500_000;
3
+ const COORDINATE_LIMIT = 1e12;
4
+ /**
5
+ * Owns CPU copies, never the caller's buffers. `geometry()` returns a fresh
6
+ * custom-geometry snapshot for `geometry.custom(...)` or `handle.setGeometry(...)`.
7
+ * The caller owns any GPU resources compiled from a snapshot. Disposal releases
8
+ * this editor's buffers and does not invalidate previously returned snapshots.
9
+ */
10
+ export class Sculptor {
11
+ positions;
12
+ original;
13
+ normals;
14
+ indices;
15
+ uvs;
16
+ groups;
17
+ maxDisplacement;
18
+ disposed = false;
19
+ constructor(input, options = {}) {
20
+ const maxVertices = budget(options.maxVertices ?? HARD_MAX_VERTICES, HARD_MAX_VERTICES, "maxVertices");
21
+ const maxTriangles = budget(options.maxTriangles ?? HARD_MAX_TRIANGLES, HARD_MAX_TRIANGLES, "maxTriangles");
22
+ this.maxDisplacement = positive(options.maxDisplacement ?? 1, "maxDisplacement");
23
+ if (this.maxDisplacement > COORDINATE_LIMIT)
24
+ throw new RangeError("maxDisplacement exceeds the supported coordinate limit");
25
+ if (!input || !input.positions || input.positions.length < 9 || input.positions.length % 3 !== 0)
26
+ throw new Error("Sculptor positions must contain at least one complete triangle");
27
+ if (input.topology !== undefined && input.topology !== "triangles")
28
+ throw new Error("Sculptor supports triangle topology only");
29
+ for (const key of ["colors", "attributes", "morphTargets", "drawRange"]) {
30
+ if (input[key] !== undefined)
31
+ throw new Error(`Sculptor does not support ${key}; remove it explicitly before editing`);
32
+ }
33
+ const count = input.positions.length / 3;
34
+ if (count > maxVertices)
35
+ throw new RangeError("Sculptor vertex budget exceeded");
36
+ this.positions = finiteArray(input.positions, "positions");
37
+ if (input.normals !== undefined) {
38
+ if (input.normals.length !== this.positions.length)
39
+ throw new Error("Sculptor normals must contain one vec3 per vertex");
40
+ finiteArray(input.normals, "normals");
41
+ }
42
+ this.original = this.positions.slice();
43
+ const indexCount = input.indices?.length || count;
44
+ if (indexCount % 3 !== 0 || indexCount / 3 > maxTriangles)
45
+ throw new RangeError("Sculptor requires complete triangles within the triangle budget");
46
+ const rawIndices = input.indices?.length ? Array.from(input.indices) : Array.from({ length: count }, (_, i) => i);
47
+ if (rawIndices.some((index) => !Number.isInteger(index) || index < 0 || index >= count))
48
+ throw new RangeError("Sculptor index is outside the vertex array");
49
+ this.indices = Uint32Array.from(rawIndices);
50
+ if (input.uvs !== undefined) {
51
+ if (input.uvs.length !== count * 2)
52
+ throw new Error("Sculptor UVs must contain one pair per vertex");
53
+ this.uvs = finiteArray(input.uvs, "uvs");
54
+ }
55
+ this.groups = input.groups?.map((group) => {
56
+ if (!Number.isInteger(group.start) || !Number.isInteger(group.count) || group.start < 0 || group.count < 0 || group.start + group.count > this.indices.length || group.start % 3 !== 0 || group.count % 3 !== 0 || (group.materialIndex !== undefined && (!Number.isInteger(group.materialIndex) || group.materialIndex < 0))) {
57
+ throw new RangeError("Sculptor groups must describe complete triangles within the index array");
58
+ }
59
+ return { ...group };
60
+ });
61
+ this.normals = calculateNormals(this.positions, this.indices);
62
+ }
63
+ geometry() {
64
+ this.assertAlive();
65
+ return {
66
+ kind: "aura-custom-geometry", positions: this.positions.slice(), normals: this.normals.slice(), indices: this.indices.slice(),
67
+ ...(this.uvs ? { uvs: this.uvs.slice() } : {}), ...(this.groups ? { groups: this.groups.map((group) => ({ ...group })) } : {}),
68
+ bounds: bounds(this.positions), dynamic: true
69
+ };
70
+ }
71
+ applyBrush(brush) {
72
+ this.assertAlive();
73
+ vector(brush.center, "brush center");
74
+ positive(brush.radius, "brush radius");
75
+ if (!Number.isFinite(brush.strength) || Math.abs(brush.strength) > COORDINATE_LIMIT)
76
+ throw new RangeError("brush strength must be finite and within the coordinate limit");
77
+ if (brush.falloff !== undefined && brush.falloff !== "linear" && brush.falloff !== "smooth")
78
+ throw new Error("Unsupported brush falloff");
79
+ const direction = brush.direction === undefined ? undefined : normalized(brush.direction, "brush direction");
80
+ const changed = [], before = [], after = [];
81
+ for (let i = 0; i < this.positions.length; i += 3) {
82
+ const x = this.positions[i], y = this.positions[i + 1], z = this.positions[i + 2];
83
+ const distance = Math.hypot(x - brush.center[0], y - brush.center[1], z - brush.center[2]);
84
+ if (distance >= brush.radius)
85
+ continue;
86
+ const t = 1 - distance / brush.radius;
87
+ const weight = brush.falloff === "linear" ? t : t * t * (3 - 2 * t);
88
+ const d = direction ?? [this.normals[i], this.normals[i + 1], this.normals[i + 2]];
89
+ const p = [x + d[0] * brush.strength * weight, y + d[1] * brush.strength * weight, z + d[2] * brush.strength * weight];
90
+ const delta = [p[0] - this.original[i], p[1] - this.original[i + 1], p[2] - this.original[i + 2]];
91
+ const length = Math.hypot(...delta);
92
+ const scale = length > this.maxDisplacement ? this.maxDisplacement / length : 1;
93
+ const next = [this.original[i] + delta[0] * scale, this.original[i + 1] + delta[1] * scale, this.original[i + 2] + delta[2] * scale].map(Math.fround);
94
+ if (next.some((value) => !Number.isFinite(value) || Math.abs(value) > COORDINATE_LIMIT))
95
+ throw new RangeError("Sculpt stroke exceeds the supported coordinate limit");
96
+ if (next[0] === x && next[1] === y && next[2] === z)
97
+ continue;
98
+ changed.push(i / 3);
99
+ before.push(x, y, z);
100
+ after.push(...next);
101
+ }
102
+ const edit = { vertexCount: this.positions.length / 3, indices: Uint32Array.from(changed), before: Float32Array.from(before), after: Float32Array.from(after) };
103
+ this.applyEdit(edit, "redo");
104
+ return edit;
105
+ }
106
+ /** Apply an earlier patch in either direction; malformed patches fail before any mutation. */
107
+ applyEdit(edit, direction) {
108
+ this.assertAlive();
109
+ if (direction !== "undo" && direction !== "redo")
110
+ throw new Error("Sculpt edit direction must be undo or redo");
111
+ if (edit.vertexCount !== this.positions.length / 3 || edit.before.length !== edit.indices.length * 3 || edit.after.length !== edit.indices.length * 3)
112
+ throw new Error("Sculpt edit does not match this geometry");
113
+ const seen = new Set();
114
+ const expected = direction === "undo" ? edit.after : edit.before;
115
+ for (let k = 0; k < edit.indices.length; k += 1) {
116
+ const index = edit.indices[k];
117
+ if (index >= edit.vertexCount || seen.has(index))
118
+ throw new RangeError("Sculpt edit contains an invalid or duplicate vertex");
119
+ seen.add(index);
120
+ for (let axis = 0; axis < 3; axis += 1) {
121
+ const before = edit.before[k * 3 + axis], after = edit.after[k * 3 + axis];
122
+ if (!Number.isFinite(before) || !Number.isFinite(after) || Math.abs(before) > COORDINATE_LIMIT || Math.abs(after) > COORDINATE_LIMIT)
123
+ throw new RangeError("Sculpt edit contains an invalid coordinate");
124
+ if (this.positions[index * 3 + axis] !== expected[k * 3 + axis])
125
+ throw new Error("Sculpt edit conflicts with the current geometry; apply edits in undo/redo order");
126
+ }
127
+ for (const values of [edit.before, edit.after]) {
128
+ if (Math.hypot(values[k * 3] - this.original[index * 3], values[k * 3 + 1] - this.original[index * 3 + 1], values[k * 3 + 2] - this.original[index * 3 + 2]) > this.maxDisplacement + 1e-5 * Math.max(1, this.maxDisplacement))
129
+ throw new RangeError("Sculpt edit exceeds maxDisplacement");
130
+ }
131
+ }
132
+ const values = direction === "undo" ? edit.before : edit.after;
133
+ for (let k = 0; k < edit.indices.length; k += 1)
134
+ this.positions.set(values.subarray(k * 3, k * 3 + 3), edit.indices[k] * 3);
135
+ if (edit.indices.length)
136
+ this.normals = calculateNormals(this.positions, this.indices);
137
+ }
138
+ dispose() {
139
+ if (this.disposed)
140
+ return;
141
+ this.disposed = true;
142
+ // Previously returned snapshots and edits are independently owned by the caller.
143
+ this.positions = new Float32Array(0);
144
+ this.original = new Float32Array(0);
145
+ this.normals = new Float32Array(0);
146
+ this.indices = new Uint32Array(0);
147
+ this.uvs = undefined;
148
+ this.groups = undefined;
149
+ }
150
+ assertAlive() { if (this.disposed)
151
+ throw new Error("Sculptor is disposed"); }
152
+ }
153
+ function calculateNormals(positions, indices) {
154
+ // Accumulate in double precision so tiny, representable float32 triangles
155
+ // do not lose their face area before normalization.
156
+ const sums = new Float64Array(positions.length);
157
+ const normals = new Float32Array(positions.length);
158
+ for (let i = 0; i < indices.length; i += 3) {
159
+ const a = indices[i] * 3, b = indices[i + 1] * 3, c = indices[i + 2] * 3;
160
+ const x1 = positions[b] - positions[a], y1 = positions[b + 1] - positions[a + 1], z1 = positions[b + 2] - positions[a + 2];
161
+ const x2 = positions[c] - positions[a], y2 = positions[c + 1] - positions[a + 1], z2 = positions[c + 2] - positions[a + 2];
162
+ const nx = y1 * z2 - z1 * y2, ny = z1 * x2 - x1 * z2, nz = x1 * y2 - y1 * x2;
163
+ for (const at of [a, b, c]) {
164
+ sums[at] += nx;
165
+ sums[at + 1] += ny;
166
+ sums[at + 2] += nz;
167
+ }
168
+ }
169
+ for (let i = 0; i < normals.length; i += 3) {
170
+ const length = Math.hypot(sums[i], sums[i + 1], sums[i + 2]);
171
+ if (length > 0 && Number.isFinite(length)) {
172
+ normals[i] = sums[i] / length;
173
+ normals[i + 1] = sums[i + 1] / length;
174
+ normals[i + 2] = sums[i + 2] / length;
175
+ }
176
+ else {
177
+ normals[i] = 0;
178
+ normals[i + 1] = 1;
179
+ normals[i + 2] = 0;
180
+ }
181
+ }
182
+ return normals;
183
+ }
184
+ function bounds(data) {
185
+ const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];
186
+ for (let i = 0; i < data.length; i += 3)
187
+ for (let axis = 0; axis < 3; axis += 1) {
188
+ min[axis] = Math.min(min[axis], data[i + axis]);
189
+ max[axis] = Math.max(max[axis], data[i + axis]);
190
+ }
191
+ return { min, max };
192
+ }
193
+ function finiteArray(values, label) {
194
+ const result = Float32Array.from(values);
195
+ if (result.some((v) => !Number.isFinite(v) || Math.abs(v) > COORDINATE_LIMIT))
196
+ throw new RangeError(`${label} must contain finite values within the coordinate limit`);
197
+ return result;
198
+ }
199
+ function budget(value, max, name) { if (!Number.isInteger(value) || value < 1 || value > max)
200
+ throw new RangeError(`${name} must be an integer from 1 to ${max}`); return value; }
201
+ function positive(value, name) { if (!Number.isFinite(value) || value <= 0)
202
+ throw new RangeError(`${name} must be finite and positive`); return value; }
203
+ function vector(value, name) { if (!value || value.length !== 3 || value.some((v) => !Number.isFinite(v) || Math.abs(v) > COORDINATE_LIMIT))
204
+ throw new RangeError(`${name} must be a finite vec3 within the coordinate limit`); }
205
+ function normalized(value, name) { vector(value, name); const length = Math.hypot(...value); if (length < 1e-12)
206
+ throw new RangeError(`${name} must be non-zero`); return [value[0] / length, value[1] / length, value[2] / length]; }
207
+ //# sourceMappingURL=Sculptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sculptor.js","sourceRoot":"","sources":["../../src/tools/Sculptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /** A bounded editable tube built from a local-space polyline. */
2
+ export type TubePoint = readonly [number, number, number];
3
+ export interface TubePainterOptions {
4
+ readonly radius?: number;
5
+ readonly radialSegments?: number;
6
+ readonly capped?: boolean;
7
+ readonly maxPoints?: number;
8
+ readonly maxTriangles?: number;
9
+ }
10
+ export interface PaintedTubeGeometry {
11
+ readonly kind: "aura-custom-geometry";
12
+ readonly positions: Float32Array;
13
+ readonly normals: Float32Array;
14
+ readonly uvs: Float32Array;
15
+ readonly indices: Uint32Array;
16
+ readonly bounds: {
17
+ readonly min: TubePoint;
18
+ readonly max: TubePoint;
19
+ };
20
+ readonly dynamic: true;
21
+ }
22
+ /**
23
+ * Add picked local-space points, then pass `geometry()` to `geometry.custom`
24
+ * or a runtime node's `setGeometry`. Rings use parallel-transported frames;
25
+ * caps have separate normals for a crisp edge. Empty paths return null.
26
+ * Snapshots own their arrays and remain valid after edits or disposal.
27
+ */
28
+ export declare class TubePainter {
29
+ private points;
30
+ private readonly radius;
31
+ private readonly radialSegments;
32
+ private readonly capped;
33
+ private readonly maxPoints;
34
+ private readonly maxTriangles;
35
+ private disposed;
36
+ constructor(options?: TubePainterOptions);
37
+ get pointCount(): number;
38
+ addPoint(point: TubePoint): void;
39
+ /** Removes and returns the last point, allowing a stroke to participate in undo. */
40
+ removeLastPoint(): TubePoint | null;
41
+ clear(): void;
42
+ geometry(): PaintedTubeGeometry | null;
43
+ dispose(): void;
44
+ private triangleCount;
45
+ private assertAlive;
46
+ }
47
+ //# sourceMappingURL=TubePainter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TubePainter.d.ts","sourceRoot":"","sources":["../../src/tools/TubePainter.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AACD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;KAAE,CAAC;IACtE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACxB;AAOD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,GAAE,kBAAuB;IAU5C,IAAI,UAAU,IAAI,MAAM,CAAmD;IAE3E,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAkBhC,oFAAoF;IACpF,eAAe,IAAI,SAAS,GAAG,IAAI;IACnC,KAAK,IAAI,IAAI;IAEb,QAAQ,IAAI,mBAAmB,GAAG,IAAI;IA2EtC,OAAO,IAAI,IAAI;IACf,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,WAAW;CACpB"}
@@ -0,0 +1,170 @@
1
+ const HARD_MAX_POINTS = 8192;
2
+ const HARD_MAX_TRIANGLES = 1_000_000;
3
+ const COORDINATE_LIMIT = 1e9;
4
+ /**
5
+ * Add picked local-space points, then pass `geometry()` to `geometry.custom`
6
+ * or a runtime node's `setGeometry`. Rings use parallel-transported frames;
7
+ * caps have separate normals for a crisp edge. Empty paths return null.
8
+ * Snapshots own their arrays and remain valid after edits or disposal.
9
+ */
10
+ export class TubePainter {
11
+ points = [];
12
+ radius;
13
+ radialSegments;
14
+ capped;
15
+ maxPoints;
16
+ maxTriangles;
17
+ disposed = false;
18
+ constructor(options = {}) {
19
+ this.radius = positive(options.radius ?? 0.05, "radius");
20
+ if (this.radius > COORDINATE_LIMIT)
21
+ throw new RangeError("radius exceeds the supported coordinate limit");
22
+ this.radialSegments = integer(options.radialSegments ?? 8, 3, 128, "radialSegments");
23
+ this.maxPoints = integer(options.maxPoints ?? 2048, 2, HARD_MAX_POINTS, "maxPoints");
24
+ this.maxTriangles = integer(options.maxTriangles ?? 100_000, 1, HARD_MAX_TRIANGLES, "maxTriangles");
25
+ this.capped = options.capped ?? true;
26
+ if (typeof this.capped !== "boolean")
27
+ throw new Error("capped must be a boolean");
28
+ }
29
+ get pointCount() { this.assertAlive(); return this.points.length; }
30
+ addPoint(point) {
31
+ this.assertAlive();
32
+ validatePoint(point);
33
+ if (this.points.length >= this.maxPoints)
34
+ throw new RangeError("TubePainter point budget exceeded");
35
+ const nextCount = this.points.length + 1;
36
+ if (nextCount >= 2 && this.triangleCount(nextCount) > this.maxTriangles)
37
+ throw new RangeError("TubePainter triangle budget exceeded");
38
+ const p = [point[0], point[1], point[2]];
39
+ if (this.points.length) {
40
+ const previous = this.points[this.points.length - 1];
41
+ const nextDirection = normalize(subtract(p, previous), "Consecutive tube points must differ");
42
+ if (this.points.length >= 2) {
43
+ const prior = normalize(subtract(previous, this.points[this.points.length - 2]), "Consecutive tube points must differ");
44
+ if (dot(prior, nextDirection) < -0.999999)
45
+ throw new RangeError("A tube path cannot immediately reverse direction");
46
+ }
47
+ }
48
+ this.points.push(p);
49
+ }
50
+ /** Removes and returns the last point, allowing a stroke to participate in undo. */
51
+ removeLastPoint() { this.assertAlive(); const p = this.points.pop(); return p ? [...p] : null; }
52
+ clear() { this.assertAlive(); this.points = []; }
53
+ geometry() {
54
+ this.assertAlive();
55
+ if (this.points.length < 2)
56
+ return null;
57
+ const n = this.points.length, sides = this.radialSegments;
58
+ const tangents = [];
59
+ const distances = [0];
60
+ for (let i = 0; i < n; i += 1) {
61
+ const incoming = i > 0 ? normalize(subtract(this.points[i], this.points[i - 1]), "invalid tube segment") : undefined;
62
+ const outgoing = i + 1 < n ? normalize(subtract(this.points[i + 1], this.points[i]), "invalid tube segment") : undefined;
63
+ tangents.push(incoming && outgoing ? normalize(add(incoming, outgoing), "tube path cannot reverse direction") : (incoming ?? outgoing));
64
+ if (incoming)
65
+ distances.push(distances[i - 1] + distance(this.points[i], this.points[i - 1]));
66
+ }
67
+ const first = tangents[0];
68
+ const axis = Math.abs(first[0]) <= Math.abs(first[1]) && Math.abs(first[0]) <= Math.abs(first[2]) ? [1, 0, 0] : Math.abs(first[1]) <= Math.abs(first[2]) ? [0, 1, 0] : [0, 0, 1];
69
+ const frames = [normalize(cross(first, axis), "tube frame is degenerate")];
70
+ for (let i = 1; i < n; i += 1) {
71
+ const previous = tangents[i - 1], current = tangents[i];
72
+ const rotation = cross(previous, current), sine = Math.hypot(...rotation), cosine = Math.max(-1, Math.min(1, dot(previous, current)));
73
+ if (sine < 1e-12) {
74
+ if (cosine < 0)
75
+ throw new RangeError("Tube frame cannot rotate through 180 degrees");
76
+ frames.push([...frames[i - 1]]);
77
+ }
78
+ else {
79
+ const axisOfRotation = scale(rotation, 1 / sine), f = frames[i - 1];
80
+ const rotated = add(add(scale(f, cosine), scale(cross(axisOfRotation, f), sine)), scale(axisOfRotation, dot(axisOfRotation, f) * (1 - cosine)));
81
+ // Remove accumulated roundoff along the tangent to keep rings circular.
82
+ frames.push(normalize(subtract(rotated, scale(current, dot(rotated, current))), "tube frame is degenerate"));
83
+ }
84
+ }
85
+ const positions = [], normals = [], uvs = [], indices = [];
86
+ const totalLength = distances[n - 1];
87
+ const put = (p, normal, u, v) => {
88
+ const index = positions.length / 3;
89
+ positions.push(...p);
90
+ normals.push(...normal);
91
+ uvs.push(u, v);
92
+ return index;
93
+ };
94
+ for (let i = 0; i < n; i += 1) {
95
+ const u = frames[i], v = cross(tangents[i], u), point = this.points[i];
96
+ for (let j = 0; j <= sides; j += 1) {
97
+ const angle = j * 2 * Math.PI / sides;
98
+ const normal = add(scale(u, Math.cos(angle)), scale(v, Math.sin(angle)));
99
+ put(add(point, scale(normal, this.radius)), normal, distances[i] / totalLength, j / sides);
100
+ }
101
+ }
102
+ for (let i = 0; i < n - 1; i += 1)
103
+ for (let j = 0; j < sides; j += 1) {
104
+ const a = i * (sides + 1) + j, b = a + sides + 1;
105
+ indices.push(a, a + 1, b, a + 1, b + 1, b);
106
+ }
107
+ if (this.capped) {
108
+ for (const end of [0, n - 1]) {
109
+ const sign = end === 0 ? -1 : 1, normal = scale(tangents[end], sign), point = this.points[end];
110
+ const center = put(point, normal, 0.5, 0.5);
111
+ const u = frames[end], v = cross(tangents[end], u);
112
+ for (let j = 0; j <= sides; j += 1) {
113
+ const angle = j * 2 * Math.PI / sides, c = Math.cos(angle), s = Math.sin(angle);
114
+ put(add(point, scale(add(scale(u, c), scale(v, s)), this.radius)), normal, 0.5 + c * 0.5, 0.5 + s * 0.5);
115
+ }
116
+ for (let j = 0; j < sides; j += 1) {
117
+ if (sign < 0)
118
+ indices.push(center, center + j + 2, center + j + 1);
119
+ else
120
+ indices.push(center, center + j + 1, center + j + 2);
121
+ }
122
+ }
123
+ }
124
+ const vertices = Float32Array.from(positions);
125
+ const vertexNormals = Float32Array.from(normals);
126
+ if (vertices.some((value) => !Number.isFinite(value)))
127
+ throw new RangeError("Tube positions exceed the supported numeric range");
128
+ for (let i = 0; i < indices.length; i += 3) {
129
+ const a = indices[i] * 3, b = indices[i + 1] * 3, c = indices[i + 2] * 3;
130
+ const ab = [vertices[b] - vertices[a], vertices[b + 1] - vertices[a + 1], vertices[b + 2] - vertices[a + 2]];
131
+ const ac = [vertices[c] - vertices[a], vertices[c + 1] - vertices[a + 1], vertices[c + 2] - vertices[a + 2]];
132
+ const face = cross(ab, ac);
133
+ const outward = face[0] * vertexNormals[a] + face[1] * vertexNormals[a + 1] + face[2] * vertexNormals[a + 2];
134
+ if (!(outward > 0))
135
+ throw new RangeError("Tube contains a collapsed or inverted triangle; increase point spacing, use a smaller radius, or move closer to the origin");
136
+ }
137
+ return { kind: "aura-custom-geometry", positions: vertices, normals: vertexNormals, uvs: Float32Array.from(uvs), indices: Uint32Array.from(indices), bounds: bounds(vertices), dynamic: true };
138
+ }
139
+ dispose() { if (!this.disposed) {
140
+ this.points = [];
141
+ this.disposed = true;
142
+ } }
143
+ triangleCount(points) { return 2 * (points - 1) * this.radialSegments + (this.capped ? 2 * this.radialSegments : 0); }
144
+ assertAlive() { if (this.disposed)
145
+ throw new Error("TubePainter is disposed"); }
146
+ }
147
+ function bounds(data) {
148
+ const min = [Infinity, Infinity, Infinity], max = [-Infinity, -Infinity, -Infinity];
149
+ for (let i = 0; i < data.length; i += 3)
150
+ for (let axis = 0; axis < 3; axis += 1) {
151
+ min[axis] = Math.min(min[axis], data[i + axis]);
152
+ max[axis] = Math.max(max[axis], data[i + axis]);
153
+ }
154
+ return { min, max };
155
+ }
156
+ function positive(value, label) { if (!Number.isFinite(value) || value <= 0)
157
+ throw new RangeError(`${label} must be finite and positive`); return value; }
158
+ function integer(value, min, max, label) { if (!Number.isInteger(value) || value < min || value > max)
159
+ throw new RangeError(`${label} must be an integer from ${min} to ${max}`); return value; }
160
+ function validatePoint(p) { if (!p || p.length !== 3 || p.some((value) => !Number.isFinite(value) || Math.abs(value) > COORDINATE_LIMIT))
161
+ throw new RangeError("Tube point must be a finite vec3 within the coordinate limit"); }
162
+ function subtract(a, b) { return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]; }
163
+ function add(a, b) { return [a[0] + b[0], a[1] + b[1], a[2] + b[2]]; }
164
+ function scale(a, n) { return [a[0] * n, a[1] * n, a[2] * n]; }
165
+ function dot(a, b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; }
166
+ function cross(a, b) { return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; }
167
+ function distance(a, b) { return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]); }
168
+ function normalize(a, error) { const length = Math.hypot(...a); if (length < 1e-10 || !Number.isFinite(length))
169
+ throw new RangeError(error); return scale(a, 1 / length); }
170
+ //# sourceMappingURL=TubePainter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TubePainter.js","sourceRoot":"","sources":["../../src/tools/TubePainter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /** The messages understood by an Aura3D worker-pool task endpoint. */
2
+ export type WorkerPoolRequest<Task> = {
3
+ readonly type: "task";
4
+ readonly id: number;
5
+ readonly payload: Task;
6
+ } | {
7
+ readonly type: "cancel";
8
+ readonly id: number;
9
+ };
10
+ export interface WorkerPoolSerializedError {
11
+ readonly name: string;
12
+ readonly message: string;
13
+ }
14
+ export type WorkerPoolResponse<Result> = {
15
+ readonly type: "result";
16
+ readonly id: number;
17
+ readonly value: Result;
18
+ } | {
19
+ readonly type: "error";
20
+ readonly id: number;
21
+ readonly error: WorkerPoolSerializedError;
22
+ };
23
+ /** A browser Worker, or an equivalent adapter with the same lifecycle. */
24
+ export type WorkerPoolWorker = Pick<Worker, "postMessage" | "addEventListener" | "removeEventListener" | "terminate">;
25
+ export interface WorkerPoolOptions {
26
+ /** A new, independently owned worker on each call. Workers are created lazily. */
27
+ readonly createWorker: () => WorkerPoolWorker;
28
+ /** Maximum workers and concurrently executing tasks. */
29
+ readonly size: number;
30
+ /** Maximum waiting tasks, excluding the tasks currently executing. Defaults to 64. */
31
+ readonly maxQueue?: number;
32
+ }
33
+ export interface WorkerPoolRunOptions {
34
+ readonly signal?: AbortSignal;
35
+ /** Transferred only when this task is dispatched, never while it waits in the queue. */
36
+ readonly transfer?: readonly Transferable[];
37
+ }
38
+ export type WorkerPoolErrorCode = "disposed" | "queue-full" | "worker-failed" | "invalid-response";
39
+ export declare class WorkerPoolError extends Error {
40
+ readonly code: WorkerPoolErrorCode;
41
+ constructor(code: WorkerPoolErrorCode, message: string);
42
+ }
43
+ /**
44
+ * Bounded, opt-in processing pool. Exactly one task is sent to each worker at a
45
+ * time. Cancelling an executing task terminates its worker, so CPU-bound work
46
+ * that cannot process a cancel message cannot retain a slot indefinitely. A new
47
+ * worker is created for the next task. Queued tasks are removed without sending
48
+ * or transferring their payloads.
49
+ */
50
+ export declare class WorkerPool<Task, Result> {
51
+ private readonly createWorker;
52
+ private readonly size;
53
+ private readonly maxQueue;
54
+ private readonly workers;
55
+ private readonly queue;
56
+ private nextId;
57
+ private disposed;
58
+ private creating;
59
+ private draining;
60
+ constructor(options: WorkerPoolOptions);
61
+ get workerCount(): number;
62
+ get pendingCount(): number;
63
+ get activeCount(): number;
64
+ run(payload: Task, options?: WorkerPoolRunOptions): Promise<Result>;
65
+ /** Rejects all work, removes listeners and terminates every owned worker. Idempotent. */
66
+ dispose(): void;
67
+ private drain;
68
+ private openWorker;
69
+ private receive;
70
+ private cancel;
71
+ private failWorker;
72
+ private retire;
73
+ private resolve;
74
+ private reject;
75
+ private finish;
76
+ }
77
+ /** Worker-side message endpoint, such as a DedicatedWorkerGlobalScope. */
78
+ export interface WorkerPoolHandlerPort {
79
+ postMessage(message: unknown, transfer: Transferable[]): void;
80
+ addEventListener(type: "message", listener: (event: MessageEvent) => void): void;
81
+ removeEventListener(type: "message", listener: (event: MessageEvent) => void): void;
82
+ }
83
+ export interface WorkerPoolTaskResult<Result> {
84
+ readonly value: Result;
85
+ readonly transfer?: readonly Transferable[];
86
+ }
87
+ /**
88
+ * Install a task handler in a worker. The returned disposer removes its listener,
89
+ * aborts outstanding handlers and suppresses late results. Output transferables
90
+ * are supplied explicitly with the result.
91
+ */
92
+ export declare function installWorkerPoolHandler<Task, Result>(port: WorkerPoolHandlerPort, handler: (payload: Task, signal: AbortSignal) => WorkerPoolTaskResult<Result> | Promise<WorkerPoolTaskResult<Result>>): () => void;
93
+ //# sourceMappingURL=WorkerPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerPool.d.ts","sourceRoot":"","sources":["../../src/utils/WorkerPool.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,CAAC,IAAI,IAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,kBAAkB,CAAC,MAAM,IACjC;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACxE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAE/F,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,WAAW,CAAC,CAAC;AAEtH,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,YAAY,EAAE,MAAM,gBAAgB,CAAC;IAC9C,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEnG,qBAAa,eAAgB,SAAQ,KAAK;IAC5B,QAAQ,CAAC,IAAI,EAAE,mBAAmB;gBAAzB,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM;CAIhE;AAsBD;;;;;;GAMG;AACH,qBAAa,UAAU,CAAC,IAAI,EAAE,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,iBAAiB;IActC,IAAI,WAAW,IAAI,MAAM,CAA8B;IACvD,IAAI,YAAY,IAAI,MAAM,CAA8B;IACxD,IAAI,WAAW,IAAI,MAAM,CAIxB;IAED,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BvE,yFAAyF;IACzF,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,KAAK;IA2Cb,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,MAAM;IAcd,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,MAAM;IAiBd,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,MAAM;CAKf;AAED,0EAA0E;AAC1E,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC9D,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;IACjF,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB,CAAC,MAAM;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;CAC7C;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EACnD,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,oBAAoB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,GACpH,MAAM,IAAI,CAqDZ"}