@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.
- package/README.md +11 -2
- package/dist/effects/AsciiOutput.d.ts +60 -0
- package/dist/effects/AsciiOutput.d.ts.map +1 -0
- package/dist/effects/AsciiOutput.js +187 -0
- package/dist/effects/AsciiOutput.js.map +1 -0
- package/dist/effects/OutlineOutput.d.ts +58 -0
- package/dist/effects/OutlineOutput.d.ts.map +1 -0
- package/dist/effects/OutlineOutput.js +274 -0
- package/dist/effects/OutlineOutput.js.map +1 -0
- package/dist/effects/StereoOutputs.d.ts +106 -0
- package/dist/effects/StereoOutputs.d.ts.map +1 -0
- package/dist/effects/StereoOutputs.js +315 -0
- package/dist/effects/StereoOutputs.js.map +1 -0
- package/dist/generators/EnvironmentGenerators.d.ts +100 -0
- package/dist/generators/EnvironmentGenerators.d.ts.map +1 -0
- package/dist/generators/EnvironmentGenerators.js +477 -0
- package/dist/generators/EnvironmentGenerators.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/objects/MarchingCubes.d.ts +80 -0
- package/dist/objects/MarchingCubes.d.ts.map +1 -0
- package/dist/objects/MarchingCubes.js +289 -0
- package/dist/objects/MarchingCubes.js.map +1 -0
- package/dist/objects/SpecializedObjects.d.ts +150 -0
- package/dist/objects/SpecializedObjects.d.ts.map +1 -0
- package/dist/objects/SpecializedObjects.js +544 -0
- package/dist/objects/SpecializedObjects.js.map +1 -0
- package/dist/renderers/SpatialDOMRenderer.d.ts +76 -0
- package/dist/renderers/SpatialDOMRenderer.d.ts.map +1 -0
- package/dist/renderers/SpatialDOMRenderer.js +279 -0
- package/dist/renderers/SpatialDOMRenderer.js.map +1 -0
- package/dist/renderers/VectorRenderer.d.ts +98 -0
- package/dist/renderers/VectorRenderer.d.ts.map +1 -0
- package/dist/renderers/VectorRenderer.js +253 -0
- package/dist/renderers/VectorRenderer.js.map +1 -0
- package/dist/tools/Fracture.d.ts +87 -0
- package/dist/tools/Fracture.d.ts.map +1 -0
- package/dist/tools/Fracture.js +422 -0
- package/dist/tools/Fracture.js.map +1 -0
- package/dist/tools/Sculptor.d.ts +84 -0
- package/dist/tools/Sculptor.d.ts.map +1 -0
- package/dist/tools/Sculptor.js +207 -0
- package/dist/tools/Sculptor.js.map +1 -0
- package/dist/tools/TubePainter.d.ts +47 -0
- package/dist/tools/TubePainter.d.ts.map +1 -0
- package/dist/tools/TubePainter.js +170 -0
- package/dist/tools/TubePainter.js.map +1 -0
- package/dist/utils/WorkerPool.d.ts +93 -0
- package/dist/utils/WorkerPool.d.ts.map +1 -0
- package/dist/utils/WorkerPool.js +360 -0
- package/dist/utils/WorkerPool.js.map +1 -0
- package/package.json +114 -3
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
/** Optional scene objects built on Aura3D's existing sky, geometry and textures. */
|
|
2
|
+
import { geometry, material, sky, texture } from "@aura3d/engine";
|
|
3
|
+
import { ShadowProjectionBuilder, createDayNightSky } from "@aura3d/rendering";
|
|
4
|
+
// The renderer supplies an OpenGL-style projection to custom materials, except
|
|
5
|
+
// in reversed-depth WebGPU frames, which hand programs a native zero-to-one
|
|
6
|
+
// projection and set the a3dZeroToOneProjection pipeline override. WebGPU uses
|
|
7
|
+
// a 0..1 depth clip range, so convert the homogeneous z coordinate otherwise.
|
|
8
|
+
const OBJECT_CLIP_WGSL = `
|
|
9
|
+
override a3dZeroToOneProjection: bool = false;
|
|
10
|
+
fn objectClip(position: vec3<f32>) -> vec4<f32> {
|
|
11
|
+
let clip = aura.u_modelViewProjection * vec4<f32>(position, 1.0);
|
|
12
|
+
return vec4<f32>(clip.xy, select(clip.z * 0.5 + clip.w * 0.5, clip.z, a3dZeroToOneProjection), clip.w);
|
|
13
|
+
}
|
|
14
|
+
`;
|
|
15
|
+
const OBJECT_POSITION_VERTEX_WGSL = `${OBJECT_CLIP_WGSL}
|
|
16
|
+
@vertex
|
|
17
|
+
fn vs_main(@location(0) position: vec3<f32>) -> @builtin(position) vec4<f32> {
|
|
18
|
+
return objectClip(position);
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
const OBJECT_TEXTURE_VERTEX_WGSL = `${OBJECT_CLIP_WGSL}
|
|
22
|
+
struct TextureVertexOutput {
|
|
23
|
+
@builtin(position) position: vec4<f32>,
|
|
24
|
+
@location(0) uv: vec2<f32>,
|
|
25
|
+
};
|
|
26
|
+
@vertex
|
|
27
|
+
fn vs_main(@location(0) position: vec3<f32>, @location(2) uv: vec2<f32>) -> TextureVertexOutput {
|
|
28
|
+
var output: TextureVertexOutput;
|
|
29
|
+
output.position = objectClip(position);
|
|
30
|
+
output.uv = uv;
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
`;
|
|
34
|
+
const GROUND_VERTEX_WGSL = `${OBJECT_CLIP_WGSL}
|
|
35
|
+
struct GroundVertexOutput {
|
|
36
|
+
@builtin(position) position: vec4<f32>,
|
|
37
|
+
@location(0) groundPosition: vec3<f32>,
|
|
38
|
+
};
|
|
39
|
+
@vertex
|
|
40
|
+
fn vs_main(@location(0) position: vec3<f32>) -> GroundVertexOutput {
|
|
41
|
+
var output: GroundVertexOutput;
|
|
42
|
+
output.position = objectClip(position);
|
|
43
|
+
output.groundPosition = position;
|
|
44
|
+
return output;
|
|
45
|
+
}
|
|
46
|
+
`;
|
|
47
|
+
function finite(value, name) {
|
|
48
|
+
if (!Number.isFinite(value) || !Number.isFinite(Math.fround(value)))
|
|
49
|
+
throw new RangeError(`${name} must be finite and fit in float32.`);
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function vec3(value, name) {
|
|
53
|
+
if (!value || value.length !== 3)
|
|
54
|
+
throw new RangeError(`${name} must be a vec3.`);
|
|
55
|
+
return [finite(value[0], name), finite(value[1], name), finite(value[2], name)];
|
|
56
|
+
}
|
|
57
|
+
function color(value, name) {
|
|
58
|
+
const result = vec3(value, name);
|
|
59
|
+
if (result.some((channel) => channel < 0 || channel > 1))
|
|
60
|
+
throw new RangeError(`${name} channels must be in [0, 1].`);
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
function validBounds(bounds) {
|
|
64
|
+
const min = vec3(bounds.min, "bounds.min");
|
|
65
|
+
const max = vec3(bounds.max, "bounds.max");
|
|
66
|
+
if (min.some((value, axis) => Math.fround(value) >= Math.fround(max[axis])))
|
|
67
|
+
throw new RangeError("Bounds must have positive float32 extent on every axis.");
|
|
68
|
+
return { min, max };
|
|
69
|
+
}
|
|
70
|
+
function unitInterval(value, name) {
|
|
71
|
+
if (!Number.isFinite(value) || value < 0 || value > 1)
|
|
72
|
+
throw new RangeError(`${name} must be in [0, 1].`);
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A gradient sky with a horizon-fading ground disc, or an equirectangular
|
|
77
|
+
* panorama projected onto an inward dome, skirt and horizontal ground. The
|
|
78
|
+
* panorama projection assumes a level capture camera at cameraHeight, is
|
|
79
|
+
* bounded by radius and is not physical terrain. Textures remain caller-owned.
|
|
80
|
+
* Ground materials supply both the GLSL and WGSL paths.
|
|
81
|
+
*/
|
|
82
|
+
export function createGroundedSky(options = {}) {
|
|
83
|
+
const hour = finite(options.hour ?? 12, "hour");
|
|
84
|
+
const center = vec3(options.center ?? [0, 0, 0], "center");
|
|
85
|
+
const radius = finite(options.radius ?? 500, "radius");
|
|
86
|
+
if (radius <= 0 || radius > 100_000)
|
|
87
|
+
throw new RangeError("radius must be greater than zero and no larger than 100000.");
|
|
88
|
+
if ([0, 2].some((axis) => !Number.isFinite(Math.fround(center[axis] + radius)) || Math.fround(center[axis] + radius) === Math.fround(center[axis]))) {
|
|
89
|
+
throw new RangeError("radius must produce representable ground geometry around center.");
|
|
90
|
+
}
|
|
91
|
+
const segments = options.segments ?? 64;
|
|
92
|
+
if (!Number.isInteger(segments) || segments < 3 || segments > 256)
|
|
93
|
+
throw new RangeError("segments must be an integer from 3 to 256.");
|
|
94
|
+
if (!options.panorama && (options.cameraHeight !== undefined || options.rings !== undefined))
|
|
95
|
+
throw new RangeError("cameraHeight and rings require a panorama.");
|
|
96
|
+
if (options.panorama && options.groundColor !== undefined)
|
|
97
|
+
throw new RangeError("groundColor cannot be combined with a panorama.");
|
|
98
|
+
const ground = color(options.groundColor ?? [0.16, 0.17, 0.18], "groundColor");
|
|
99
|
+
const state = createDayNightSky({ hour, starCount: 0, cloudCellCount: 0 });
|
|
100
|
+
const skyNode = sky.gradient({ name: `${options.name ?? "grounded-sky"}-sky`, zenith: state.zenithColor, horizon: state.horizonColor, ground: linearToHex(ground) });
|
|
101
|
+
if (options.panorama) {
|
|
102
|
+
const ref = options.panorama;
|
|
103
|
+
if (!(ref.kind === "aura-texture-ref" || (ref.kind === "aura-asset-ref" && ref.type === "texture")))
|
|
104
|
+
throw new TypeError("panorama must be an Aura texture handle or typed texture asset.");
|
|
105
|
+
const cameraHeight = finite(options.cameraHeight ?? 1.6, "cameraHeight");
|
|
106
|
+
if (cameraHeight <= 0 || cameraHeight >= radius)
|
|
107
|
+
throw new RangeError("cameraHeight must be positive and less than radius.");
|
|
108
|
+
const rings = options.rings ?? 16;
|
|
109
|
+
if (!Number.isInteger(rings) || rings < 2 || rings > 128)
|
|
110
|
+
throw new RangeError("rings must be an integer from 2 to 128.");
|
|
111
|
+
const projected = projectedPanorama(center, radius, cameraHeight, segments, rings);
|
|
112
|
+
const projectedMaterial = material.custom({
|
|
113
|
+
glsl: {
|
|
114
|
+
vertex: "out vec2 vPanoramaUV; void main() { vPanoramaUV = uv; gl_Position = modelViewProjectionMatrix * vec4(position, 1.0); }",
|
|
115
|
+
fragment: "in vec2 vPanoramaUV; out vec4 outColor; void main() { outColor = texture(panoramaMap, vPanoramaUV); }"
|
|
116
|
+
},
|
|
117
|
+
wgsl: {
|
|
118
|
+
vertex: OBJECT_TEXTURE_VERTEX_WGSL,
|
|
119
|
+
fragment: `
|
|
120
|
+
@fragment
|
|
121
|
+
fn fs_main(@location(0) uv: vec2<f32>) -> @location(0) vec4<f32> {
|
|
122
|
+
return textureSample(u_panoramaMapTexture, u_panoramaMapSampler, uv);
|
|
123
|
+
}
|
|
124
|
+
`
|
|
125
|
+
},
|
|
126
|
+
uniforms: { panoramaMap: { type: "texture2d", value: ref } },
|
|
127
|
+
side: "double", fog: false
|
|
128
|
+
});
|
|
129
|
+
const projectedNode = geometry.custom(projected, { name: `${options.name ?? "grounded-sky"}-ground`, material: projectedMaterial, castShadow: false, receiveShadow: false });
|
|
130
|
+
return { sky: skyNode, ground: projectedNode, nodes: [skyNode.toJSON(), projectedNode.toJSON()], dayFactor: state.dayFactor };
|
|
131
|
+
}
|
|
132
|
+
const horizon = hexColor(state.horizonColor);
|
|
133
|
+
const positions = [center[0], center[1], center[2]];
|
|
134
|
+
const normals = [0, 1, 0];
|
|
135
|
+
const indices = [];
|
|
136
|
+
for (let i = 0; i < segments; i += 1) {
|
|
137
|
+
const angle = i * Math.PI * 2 / segments;
|
|
138
|
+
positions.push(center[0] + Math.cos(angle) * radius, center[1], center[2] + Math.sin(angle) * radius);
|
|
139
|
+
normals.push(0, 1, 0);
|
|
140
|
+
indices.push(0, 1 + ((i + 1) % segments), 1 + i);
|
|
141
|
+
}
|
|
142
|
+
const groundGeometry = { kind: "aura-custom-geometry", positions, normals, indices };
|
|
143
|
+
const groundMaterial = material.custom({
|
|
144
|
+
glsl: {
|
|
145
|
+
vertex: "out vec3 vGroundPosition; void main() { vGroundPosition = position; gl_Position = modelViewProjectionMatrix * vec4(position, 1.0); }",
|
|
146
|
+
fragment: "in vec3 vGroundPosition; out vec4 outColor; void main() { float t = smoothstep(0.0, 1.0, clamp(length(vGroundPosition.xz - groundCenter) / groundRadius, 0.0, 1.0)); outColor = vec4(mix(groundTint, horizonTint, t), 1.0); }"
|
|
147
|
+
},
|
|
148
|
+
wgsl: {
|
|
149
|
+
vertex: GROUND_VERTEX_WGSL,
|
|
150
|
+
fragment: `
|
|
151
|
+
@fragment
|
|
152
|
+
fn fs_main(@location(0) groundPosition: vec3<f32>) -> @location(0) vec4<f32> {
|
|
153
|
+
let radial = clamp(length(groundPosition.xz - aura.u_groundCenter) / aura.u_groundRadius, 0.0, 1.0);
|
|
154
|
+
let fade = smoothstep(0.0, 1.0, radial);
|
|
155
|
+
return vec4<f32>(mix(aura.u_groundTint, aura.u_horizonTint, fade), 1.0);
|
|
156
|
+
}
|
|
157
|
+
`
|
|
158
|
+
},
|
|
159
|
+
uniforms: {
|
|
160
|
+
groundCenter: { type: "vec2", value: [center[0], center[2]] },
|
|
161
|
+
groundRadius: { type: "f32", value: radius },
|
|
162
|
+
groundTint: { type: "vec3", value: ground },
|
|
163
|
+
horizonTint: { type: "vec3", value: horizon }
|
|
164
|
+
},
|
|
165
|
+
side: "double",
|
|
166
|
+
fog: false
|
|
167
|
+
});
|
|
168
|
+
const groundNode = geometry.custom(groundGeometry, { name: `${options.name ?? "grounded-sky"}-ground`, material: groundMaterial, castShadow: false, receiveShadow: false });
|
|
169
|
+
return { sky: skyNode, ground: groundNode, nodes: [skyNode.toJSON(), groundNode.toJSON()], dayFactor: state.dayFactor };
|
|
170
|
+
}
|
|
171
|
+
/** Panorama rows run from zenith to horizon, down the skirt, then inward on the ground. */
|
|
172
|
+
function projectedPanorama(center, radius, height, segments, rings) {
|
|
173
|
+
const positions = [];
|
|
174
|
+
const normals = [];
|
|
175
|
+
const uvs = [];
|
|
176
|
+
const indices = [];
|
|
177
|
+
const rows = rings * 2 + 2;
|
|
178
|
+
for (let row = 0; row < rows; row += 1) {
|
|
179
|
+
let radial;
|
|
180
|
+
let y;
|
|
181
|
+
let elevation;
|
|
182
|
+
let normalY;
|
|
183
|
+
let normalRadial;
|
|
184
|
+
if (row <= rings) {
|
|
185
|
+
const polar = row * Math.PI / (2 * rings);
|
|
186
|
+
radial = radius * Math.sin(polar);
|
|
187
|
+
y = center[1] + height + radius * Math.cos(polar);
|
|
188
|
+
elevation = Math.PI / 2 - polar;
|
|
189
|
+
normalY = -Math.cos(polar);
|
|
190
|
+
normalRadial = -Math.sin(polar);
|
|
191
|
+
}
|
|
192
|
+
else if (row === rings + 1) {
|
|
193
|
+
radial = radius;
|
|
194
|
+
y = center[1];
|
|
195
|
+
elevation = Math.atan2(-height, radius);
|
|
196
|
+
normalY = 0;
|
|
197
|
+
normalRadial = -1;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
radial = radius * (1 - (row - rings - 1) / rings);
|
|
201
|
+
y = center[1];
|
|
202
|
+
elevation = Math.atan2(-height, radial);
|
|
203
|
+
normalY = 1;
|
|
204
|
+
normalRadial = 0;
|
|
205
|
+
}
|
|
206
|
+
for (let column = 0; column <= segments; column += 1) {
|
|
207
|
+
const u = column / segments;
|
|
208
|
+
const angle = u * Math.PI * 2;
|
|
209
|
+
const x = Math.cos(angle);
|
|
210
|
+
const z = Math.sin(angle);
|
|
211
|
+
positions.push(center[0] + x * radial, y, center[2] + z * radial);
|
|
212
|
+
normals.push(x * normalRadial, normalY, z * normalRadial);
|
|
213
|
+
uvs.push(u, 0.5 + elevation / Math.PI);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
for (let row = 0; row < rows - 1; row += 1)
|
|
217
|
+
for (let column = 0; column < segments; column += 1) {
|
|
218
|
+
const a = row * (segments + 1) + column;
|
|
219
|
+
const b = a + segments + 1;
|
|
220
|
+
// One triangle collapses at each pole; omit it.
|
|
221
|
+
if (row !== 0)
|
|
222
|
+
indices.push(a, b, a + 1);
|
|
223
|
+
if (row !== rows - 2)
|
|
224
|
+
indices.push(a + 1, b, b + 1);
|
|
225
|
+
}
|
|
226
|
+
return { kind: "aura-custom-geometry", positions, normals, uvs, indices };
|
|
227
|
+
}
|
|
228
|
+
function hexColor(hex) {
|
|
229
|
+
if (!/^#[0-9a-f]{6}$/i.test(hex))
|
|
230
|
+
throw new Error("Day/night sky returned an invalid horizon color.");
|
|
231
|
+
const linear = (channel) => channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;
|
|
232
|
+
return [linear(parseInt(hex.slice(1, 3), 16) / 255), linear(parseInt(hex.slice(3, 5), 16) / 255), linear(parseInt(hex.slice(5, 7), 16) / 255)];
|
|
233
|
+
}
|
|
234
|
+
function linearToHex(value) {
|
|
235
|
+
const srgb = (channel) => channel <= 0.0031308 ? channel * 12.92 : 1.055 * channel ** (1 / 2.4) - 0.055;
|
|
236
|
+
return `#${value.map((channel) => Math.round(srgb(channel) * 255).toString(16).padStart(2, "0")).join("")}`;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Project either caster bounds or static triangle geometry onto a horizontal
|
|
240
|
+
* receiver. Bounds input remains a planar hull approximation. Geometry input
|
|
241
|
+
* preserves triangle coverage, including concavities and holes, and rejects
|
|
242
|
+
* overlapping projected triangles instead of double-blending their alpha.
|
|
243
|
+
* Geometry is a snapshot: update it explicitly after changing the caster or
|
|
244
|
+
* its transform. Morphing, partial draw ranges and grouped materials are not
|
|
245
|
+
* supported by the geometry path. Neither path replaces shadow maps.
|
|
246
|
+
*/
|
|
247
|
+
export function createShadowProjection(options) {
|
|
248
|
+
const isGeometry = options.casterGeometry !== undefined;
|
|
249
|
+
if (isGeometry && options.casterBounds !== undefined)
|
|
250
|
+
throw new RangeError("Specify casterBounds or casterGeometry, not both.");
|
|
251
|
+
const bounds = isGeometry ? undefined : validBounds(options.casterBounds);
|
|
252
|
+
const direction = vec3(options.lightDirection, "lightDirection");
|
|
253
|
+
const length = Math.hypot(...direction);
|
|
254
|
+
const receiverY = finite(options.receiverY ?? 0, "receiverY");
|
|
255
|
+
const offset = finite(options.offset ?? 0.002, "offset");
|
|
256
|
+
const maxDistance = finite(options.maxProjectionDistance ?? 10_000, "maxProjectionDistance");
|
|
257
|
+
if (length <= 1e-12 || direction[1] >= 0 || Math.abs(direction[1] / length) < 1e-6)
|
|
258
|
+
throw new RangeError("lightDirection must point down and intersect the receiver plane.");
|
|
259
|
+
if (bounds && bounds.min[1] < receiverY)
|
|
260
|
+
throw new RangeError("casterBounds must lie on or above the receiver plane.");
|
|
261
|
+
if (offset < 0 || maxDistance <= 0)
|
|
262
|
+
throw new RangeError("offset must be non-negative and maxProjectionDistance positive.");
|
|
263
|
+
if (bounds && (bounds.max[1] - receiverY) * length / -direction[1] > maxDistance)
|
|
264
|
+
throw new RangeError("Shadow projection exceeds maxProjectionDistance.");
|
|
265
|
+
const tint = color(options.color ?? [0, 0, 0], "color");
|
|
266
|
+
const opacity = unitInterval(options.opacity ?? 0.3, "opacity");
|
|
267
|
+
let projection;
|
|
268
|
+
if (isGeometry) {
|
|
269
|
+
const input = options;
|
|
270
|
+
const caster = input.casterGeometry;
|
|
271
|
+
if (!caster || caster.kind !== "aura-custom-geometry")
|
|
272
|
+
throw new TypeError("casterGeometry must be an Aura custom geometry.");
|
|
273
|
+
if (caster.topology !== undefined && caster.topology !== "triangles")
|
|
274
|
+
throw new RangeError("casterGeometry requires triangle topology.");
|
|
275
|
+
if (caster.drawRange || caster.groups?.length || caster.morphTargets?.length) {
|
|
276
|
+
throw new RangeError("casterGeometry does not support draw ranges, groups or morph targets.");
|
|
277
|
+
}
|
|
278
|
+
const positionData = caster.positions;
|
|
279
|
+
let positions;
|
|
280
|
+
if (Array.isArray(positionData) && positionData.length > 0 && Array.isArray(positionData[0])) {
|
|
281
|
+
if (positionData.length > 65_536)
|
|
282
|
+
throw new RangeError("casterGeometry exceeds the vertex limit.");
|
|
283
|
+
const flat = [];
|
|
284
|
+
for (const point of positionData) {
|
|
285
|
+
if (!Array.isArray(point) || point.length !== 3 || !point.every(Number.isFinite))
|
|
286
|
+
throw new RangeError("casterGeometry positions require finite vec3 tuples.");
|
|
287
|
+
flat.push(point[0], point[1], point[2]);
|
|
288
|
+
}
|
|
289
|
+
positions = flat;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
positions = positionData;
|
|
293
|
+
}
|
|
294
|
+
// The triangle builder first quantizes the receiver plane. Validate the
|
|
295
|
+
// offset against that actual plane, not against the unrounded input.
|
|
296
|
+
const projectedY = Math.fround(receiverY);
|
|
297
|
+
const placedY = Math.fround(projectedY + offset);
|
|
298
|
+
if (!Number.isFinite(placedY) || (offset > 0 && placedY === projectedY)) {
|
|
299
|
+
throw new RangeError("Shadow receiver offset must remain representable in float32.");
|
|
300
|
+
}
|
|
301
|
+
projection = new ShadowProjectionBuilder().projectTriangles({ positions, indices: caster.indices, matrix: input.casterMatrix,
|
|
302
|
+
lightDirection: direction, receiverPlaneY: receiverY, maxProjectionDistance: maxDistance,
|
|
303
|
+
maxTriangles: input.maxTriangles, maxOverlapChecks: input.maxOverlapChecks });
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
projection = new ShadowProjectionBuilder().projectBounds({ casterBounds: bounds, lightDirection: direction, receiverPlaneY: receiverY });
|
|
307
|
+
}
|
|
308
|
+
if (projection.points.length < 3)
|
|
309
|
+
throw new RangeError("Shadow projection is degenerate and has no area.");
|
|
310
|
+
const positions = [];
|
|
311
|
+
const normals = [];
|
|
312
|
+
const indices = [];
|
|
313
|
+
for (const point of projection.points) {
|
|
314
|
+
positions.push(point[0], point[1] + offset, point[2]);
|
|
315
|
+
normals.push(0, 1, 0);
|
|
316
|
+
}
|
|
317
|
+
if (projection.indices)
|
|
318
|
+
indices.push(...projection.indices);
|
|
319
|
+
else {
|
|
320
|
+
// Builder's x/z hull is counterclockwise from below; reverse for +Y.
|
|
321
|
+
for (let i = 1; i + 1 < projection.points.length; i += 1)
|
|
322
|
+
indices.push(0, i + 1, i);
|
|
323
|
+
}
|
|
324
|
+
const shadowGeometry = { kind: "aura-custom-geometry", positions, normals, indices, dynamic: true };
|
|
325
|
+
const shadowMaterial = material.custom({
|
|
326
|
+
glsl: { fragment: "out vec4 outColor; void main() { outColor = vec4(shadowTint, shadowOpacity); }" },
|
|
327
|
+
wgsl: {
|
|
328
|
+
vertex: OBJECT_POSITION_VERTEX_WGSL,
|
|
329
|
+
fragment: `
|
|
330
|
+
@fragment
|
|
331
|
+
fn fs_main() -> @location(0) vec4<f32> {
|
|
332
|
+
return vec4<f32>(aura.u_shadowTint, aura.u_shadowOpacity);
|
|
333
|
+
}
|
|
334
|
+
`
|
|
335
|
+
},
|
|
336
|
+
uniforms: { shadowTint: { type: "vec3", value: tint }, shadowOpacity: { type: "f32", value: opacity } },
|
|
337
|
+
transparent: true, depthWrite: false, side: "double", fog: false
|
|
338
|
+
});
|
|
339
|
+
return {
|
|
340
|
+
node: geometry.custom(shadowGeometry, { name: options.name ?? (isGeometry ? "projected-geometry-shadow" : "projected-bounds-shadow"), material: shadowMaterial, castShadow: false, receiveShadow: false }),
|
|
341
|
+
geometry: shadowGeometry,
|
|
342
|
+
points: projection.points,
|
|
343
|
+
bounds: projection.bounds
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* An editable 2D slice of a bounded scalar volume. A live data texture is owned
|
|
348
|
+
* by the object, while the scene and any runtime handle remain caller-owned.
|
|
349
|
+
* `setSlice` updates bound runtime geometry and uploads new pixels on the next
|
|
350
|
+
* render; without a bound handle, use its returned geometry with setGeometry.
|
|
351
|
+
*/
|
|
352
|
+
export class VolumeSlice {
|
|
353
|
+
dimensions;
|
|
354
|
+
axis;
|
|
355
|
+
bounds;
|
|
356
|
+
ownedTexture;
|
|
357
|
+
ownedNode;
|
|
358
|
+
width;
|
|
359
|
+
height;
|
|
360
|
+
values;
|
|
361
|
+
pixels;
|
|
362
|
+
sliceIndex;
|
|
363
|
+
window;
|
|
364
|
+
opacity;
|
|
365
|
+
handle;
|
|
366
|
+
disposed = false;
|
|
367
|
+
constructor(options) {
|
|
368
|
+
const dimensions = options.dimensions;
|
|
369
|
+
if (!dimensions || dimensions.length !== 3 || dimensions.some((n) => !Number.isInteger(n) || n < 1 || n > 1024))
|
|
370
|
+
throw new RangeError("dimensions must contain three integers from 1 to 1024.");
|
|
371
|
+
const count = dimensions[0] * dimensions[1] * dimensions[2];
|
|
372
|
+
if (!Number.isSafeInteger(count) || count > 1_000_000)
|
|
373
|
+
throw new RangeError("VolumeSlice supports at most 1000000 samples.");
|
|
374
|
+
if (options.values.length !== count)
|
|
375
|
+
throw new RangeError(`values must contain exactly ${count} samples.`);
|
|
376
|
+
this.dimensions = [dimensions[0], dimensions[1], dimensions[2]];
|
|
377
|
+
this.axis = options.axis ?? "z";
|
|
378
|
+
if (this.axis !== "x" && this.axis !== "y" && this.axis !== "z")
|
|
379
|
+
throw new RangeError("axis must be x, y or z.");
|
|
380
|
+
this.bounds = validBounds(options.bounds ?? { min: [-0.5, -0.5, -0.5], max: [0.5, 0.5, 0.5] });
|
|
381
|
+
this.sliceIndex = this.checkedIndex(options.index ?? 0);
|
|
382
|
+
this.window = this.checkedWindow(options.window ?? [0, 1]);
|
|
383
|
+
this.opacity = unitInterval(options.opacity ?? 1, "opacity");
|
|
384
|
+
this.values = this.checkedValues(options.values);
|
|
385
|
+
this.width = this.axis === "x" ? dimensions[2] : dimensions[0];
|
|
386
|
+
this.height = this.axis === "y" ? dimensions[2] : dimensions[1];
|
|
387
|
+
this.pixels = new Uint8Array(this.width * this.height * 4);
|
|
388
|
+
this.fillPixels();
|
|
389
|
+
this.ownedTexture = texture.data({ width: this.width, height: this.height, data: this.pixels, format: "rgba8", colorSpace: "linear" });
|
|
390
|
+
try {
|
|
391
|
+
const sliceMaterial = material.custom({
|
|
392
|
+
glsl: {
|
|
393
|
+
vertex: "out vec2 vSliceUV; void main() { vSliceUV = uv; gl_Position = modelViewProjectionMatrix * vec4(position, 1.0); }",
|
|
394
|
+
fragment: "in vec2 vSliceUV; out vec4 outColor; void main() { outColor = texture(sliceMap, vSliceUV); }"
|
|
395
|
+
},
|
|
396
|
+
wgsl: {
|
|
397
|
+
vertex: OBJECT_TEXTURE_VERTEX_WGSL,
|
|
398
|
+
fragment: `
|
|
399
|
+
@fragment
|
|
400
|
+
fn fs_main(@location(0) uv: vec2<f32>) -> @location(0) vec4<f32> {
|
|
401
|
+
return textureSample(u_sliceMapTexture, u_sliceMapSampler, uv);
|
|
402
|
+
}
|
|
403
|
+
`
|
|
404
|
+
},
|
|
405
|
+
uniforms: { sliceMap: { type: "texture2d", value: this.texture } },
|
|
406
|
+
side: "double", transparent: true, depthWrite: false, fog: false
|
|
407
|
+
});
|
|
408
|
+
this.ownedNode = geometry.custom(this.geometry(), { name: options.name ?? "volume-slice", material: sliceMaterial, castShadow: false, receiveShadow: false });
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
this.texture.dispose();
|
|
412
|
+
throw error;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
/** Owned references become unavailable after disposal. */
|
|
416
|
+
get texture() { this.assertLive(); return this.ownedTexture; }
|
|
417
|
+
get node() { this.assertLive(); return this.ownedNode; }
|
|
418
|
+
get index() { this.assertLive(); return this.sliceIndex; }
|
|
419
|
+
/** A copy, suitable for diagnostics without mutating the uploaded texture. */
|
|
420
|
+
getPixels() { this.assertLive(); return new Uint8Array(this.pixels); }
|
|
421
|
+
bind(handle) {
|
|
422
|
+
this.assertLive();
|
|
423
|
+
if (!handle || typeof handle.setGeometry !== "function")
|
|
424
|
+
throw new TypeError("VolumeSlice binding requires a setGeometry handle.");
|
|
425
|
+
handle.setGeometry(this.geometry());
|
|
426
|
+
this.handle = handle;
|
|
427
|
+
}
|
|
428
|
+
unbind() { this.handle = undefined; }
|
|
429
|
+
setSlice(index) {
|
|
430
|
+
this.assertLive();
|
|
431
|
+
const nextIndex = this.checkedIndex(index);
|
|
432
|
+
const previous = this.sliceIndex;
|
|
433
|
+
this.sliceIndex = nextIndex;
|
|
434
|
+
const nextGeometry = this.geometry();
|
|
435
|
+
try {
|
|
436
|
+
this.handle?.setGeometry?.(nextGeometry);
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
this.sliceIndex = previous;
|
|
440
|
+
throw error;
|
|
441
|
+
}
|
|
442
|
+
this.fillPixels();
|
|
443
|
+
this.texture.texture.update(this.pixels);
|
|
444
|
+
return nextGeometry;
|
|
445
|
+
}
|
|
446
|
+
setWindow(window) {
|
|
447
|
+
this.assertLive();
|
|
448
|
+
this.window = this.checkedWindow(window);
|
|
449
|
+
this.fillPixels();
|
|
450
|
+
this.texture.texture.update(this.pixels);
|
|
451
|
+
}
|
|
452
|
+
setOpacity(opacity) {
|
|
453
|
+
this.assertLive();
|
|
454
|
+
this.opacity = unitInterval(opacity, "opacity");
|
|
455
|
+
this.fillPixels();
|
|
456
|
+
this.texture.texture.update(this.pixels);
|
|
457
|
+
}
|
|
458
|
+
setValues(values) {
|
|
459
|
+
this.assertLive();
|
|
460
|
+
this.values = this.checkedValues(values);
|
|
461
|
+
this.fillPixels();
|
|
462
|
+
this.texture.texture.update(this.pixels);
|
|
463
|
+
}
|
|
464
|
+
dispose() {
|
|
465
|
+
if (this.disposed)
|
|
466
|
+
return;
|
|
467
|
+
this.handle = undefined;
|
|
468
|
+
this.ownedTexture?.dispose();
|
|
469
|
+
this.ownedTexture = undefined;
|
|
470
|
+
this.ownedNode = undefined;
|
|
471
|
+
this.values = new Float32Array(0);
|
|
472
|
+
this.pixels = new Uint8Array(0);
|
|
473
|
+
this.disposed = true;
|
|
474
|
+
}
|
|
475
|
+
assertLive() { if (this.disposed || this.ownedTexture?.texture.disposed)
|
|
476
|
+
throw new Error("VolumeSlice has been disposed."); }
|
|
477
|
+
checkedIndex(index) {
|
|
478
|
+
const dimension = this.dimensions[this.axis === "x" ? 0 : this.axis === "y" ? 1 : 2];
|
|
479
|
+
if (!Number.isInteger(index) || index < 0 || index >= dimension)
|
|
480
|
+
throw new RangeError(`Slice index must be an integer in [0, ${dimension - 1}].`);
|
|
481
|
+
return index;
|
|
482
|
+
}
|
|
483
|
+
checkedWindow(window) {
|
|
484
|
+
if (!window || window.length !== 2)
|
|
485
|
+
throw new RangeError("window must contain [min, max].");
|
|
486
|
+
finite(window[0], "window minimum");
|
|
487
|
+
finite(window[1], "window maximum");
|
|
488
|
+
if (window[0] >= window[1])
|
|
489
|
+
throw new RangeError("window maximum must exceed its minimum.");
|
|
490
|
+
return [window[0], window[1]];
|
|
491
|
+
}
|
|
492
|
+
checkedValues(values) {
|
|
493
|
+
const count = this.dimensions[0] * this.dimensions[1] * this.dimensions[2];
|
|
494
|
+
if (values.length !== count)
|
|
495
|
+
throw new RangeError(`values must contain exactly ${count} samples.`);
|
|
496
|
+
const result = new Float32Array(count);
|
|
497
|
+
for (let i = 0; i < count; i += 1)
|
|
498
|
+
result[i] = finite(values[i], `Value ${i}`);
|
|
499
|
+
return result;
|
|
500
|
+
}
|
|
501
|
+
fillPixels() {
|
|
502
|
+
const [nx, ny] = this.dimensions;
|
|
503
|
+
const [low, high] = this.window;
|
|
504
|
+
for (let v = 0; v < this.height; v += 1)
|
|
505
|
+
for (let u = 0; u < this.width; u += 1) {
|
|
506
|
+
const x = this.axis === "x" ? this.sliceIndex : u;
|
|
507
|
+
const y = this.axis === "y" ? this.sliceIndex : v;
|
|
508
|
+
const z = this.axis === "z" ? this.sliceIndex : this.axis === "x" ? u : v;
|
|
509
|
+
const value = this.values[x + nx * (y + ny * z)];
|
|
510
|
+
const gray = Math.round(Math.max(0, Math.min(1, (value - low) / (high - low))) * 255);
|
|
511
|
+
const at = (u + v * this.width) * 4;
|
|
512
|
+
this.pixels[at] = gray;
|
|
513
|
+
this.pixels[at + 1] = gray;
|
|
514
|
+
this.pixels[at + 2] = gray;
|
|
515
|
+
this.pixels[at + 3] = Math.round(this.opacity * 255);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
geometry() {
|
|
519
|
+
const [x0, y0, z0] = this.bounds.min;
|
|
520
|
+
const [x1, y1, z1] = this.bounds.max;
|
|
521
|
+
const count = this.dimensions[this.axis === "x" ? 0 : this.axis === "y" ? 1 : 2];
|
|
522
|
+
const fraction = count === 1 ? 0.5 : this.sliceIndex / (count - 1);
|
|
523
|
+
let positions;
|
|
524
|
+
let normal;
|
|
525
|
+
if (this.axis === "x") {
|
|
526
|
+
const x = x0 + (x1 - x0) * fraction;
|
|
527
|
+
positions = [x, y0, z0, x, y0, z1, x, y1, z1, x, y1, z0];
|
|
528
|
+
normal = [-1, 0, 0];
|
|
529
|
+
}
|
|
530
|
+
else if (this.axis === "y") {
|
|
531
|
+
const y = y0 + (y1 - y0) * fraction;
|
|
532
|
+
positions = [x0, y, z0, x1, y, z0, x1, y, z1, x0, y, z1];
|
|
533
|
+
normal = [0, -1, 0];
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
const z = z0 + (z1 - z0) * fraction;
|
|
537
|
+
positions = [x0, y0, z, x1, y0, z, x1, y1, z, x0, y1, z];
|
|
538
|
+
normal = [0, 0, 1];
|
|
539
|
+
}
|
|
540
|
+
return { kind: "aura-custom-geometry", positions: Float32Array.from(positions), normals: Float32Array.from([...normal, ...normal, ...normal, ...normal]), uvs: Float32Array.from([0, 0, 1, 0, 1, 1, 0, 1]), indices: new Uint32Array([0, 1, 2, 0, 2, 3]), dynamic: true };
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
export function createVolumeSlice(options) { return new VolumeSlice(options); }
|
|
544
|
+
//# sourceMappingURL=SpecializedObjects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecializedObjects.js","sourceRoot":"","sources":["../../src/objects/SpecializedObjects.ts"],"names":[],"mappings":"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"}
|