@tinypoly/gpu-renderer 0.0.0 → 0.0.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/ARCHITECTURE.md CHANGED
@@ -6,7 +6,8 @@ How `@tinypoly/gpu-renderer` works inside, and the decisions behind it. For inst
6
6
  The renderer takes a serialized Three.js scene, uploads geometry, a BVH, materials, textures and lights to the GPU, and
7
7
  runs a path tracing compute shader that accumulates radiance into a float buffer. A small render pipeline presents that
8
8
  buffer, dividing by the sample count and applying exposure, tone mapping, vignette and grain. There is no worker pool and
9
- no `SharedArrayBuffer`: the state lives on the device.
9
+ no `SharedArrayBuffer`: the state lives on the device. The one worker there is builds the BVH of a large scene off the
10
+ page's thread, and changes nothing about the tree it builds.
10
11
 
11
12
  ## Relationship with @tinypoly/cpu-renderer
12
13
 
@@ -28,7 +29,11 @@ stay the algorithmic reference, line by line.
28
29
  - `camera.ts`: the camera's matrices. Every ray goes through the inverse of the camera's own projection.
29
30
  - `geometry.ts`, `bvh.ts`: flat triangle and attribute buffers, and the BVH built straight into 32 byte nodes. Packing
30
31
  also builds what Three draws in screen space (points, lines, sprites, dashes) as triangles facing the camera, applies
31
- displacement maps, and runs vertex shaders.
32
+ displacement maps, and runs vertex shaders. A plain mesh, with no vertex shader and no displacement, takes a faster
33
+ path that transforms each vertex once into typed arrays and writes exactly what the general one would.
34
+ - `bvhBuilder.ts`, `bvhWorker.ts`: the BVH built in a Web Worker from a copy of the positions, for scenes of at least
35
+ `BVH_WORKER_MIN_TRIANGLES`; on the main thread below that, when `bvhWorker` is false, or for good once the worker
36
+ fails to start or load.
32
37
  - `structLayout.ts`, `frameLayout.ts`, `materialLayout.ts`: one description of each struct, from which both the WGSL
33
38
  declaration and the TypeScript writer are generated, so their word offsets cannot drift apart.
34
39
  - `texturePack.ts`, `lights.ts`: the remaining storage buffer layouts. `lights.ts` holds the emissive triangles and
package/README.md CHANGED
@@ -21,7 +21,7 @@ It is the GPU sibling of [@tinypoly/cpu-renderer](https://github.com/tinypoly/cp
21
21
  - Adaptive sampling: pixels whose noise is gone stop taking paths, and the work they leave goes to the dark, glossy and out of focus areas that still need it.
22
22
  - A variance-guided denoiser (the spatial filter of SVGF, with diffuse and specular light filtered apart as NVIDIA's RELAX does): each signal is separated from its albedo, filtered by an edge-avoiding wavelet that stops at normals, depths and roughness and trusts each pixel as far as its own variance says, and multiplied back, so textures stay sharp, a sharp reflection stays sharp and flat areas keep their exact mean.
23
23
  - Progressive output: the canvas refines sample by sample, and the render can be paused, resumed and cancelled.
24
- - No worker pool and no `SharedArrayBuffer`: the scene lives on the device, so the page needs no cross-origin isolation.
24
+ - No worker pool and no `SharedArrayBuffer`: the scene lives on the device, so the page needs no cross-origin isolation. A single worker builds the BVH of a large scene, so the page keeps responding while it is prepared.
25
25
 
26
26
  ## Install
27
27
 
@@ -86,7 +86,7 @@ const image = await renderer.render();
86
86
 
87
87
  ### `new GpuRenderer(options)`
88
88
 
89
- Every option has a setter of the same name.
89
+ Every option has a setter of the same name, except `bvhWorker` and `createBvhWorker`, which are fixed for the renderer's life.
90
90
 
91
91
  | Option | Type | |
92
92
  | --- | --- | --- |
@@ -97,6 +97,8 @@ Every option has a setter of the same name.
97
97
  | `width`, `height` | `number` | Required. Image size in CSS pixels. |
98
98
  | `pixelRatio` | `number` | Defaults to 1. Pass `window.devicePixelRatio` for a sharp image on a high-density screen. |
99
99
  | `denoiser` | `Partial<DenoiserSettings>` | How the denoiser filters. Merged over `DEFAULT_DENOISER`. See [Denoiser](#denoiser). |
100
+ | `bvhWorker` | `boolean` | Builds the BVH of a scene with at least `BVH_WORKER_MIN_TRIANGLES` (50 000) triangles in a Web Worker, so the page keeps responding. The tree, and so the image, is the same either way. Defaults to `true` where Web Workers exist or when `createBvhWorker` is given; `false` builds on the main thread. See [BVH worker](#bvh-worker). |
101
+ | `createBvhWorker` | `() => BvhWorker` | Starts the BVH worker. Defaults to `createDefaultBvhWorker`. Passing one turns the worker on. |
100
102
 
101
103
  ### Methods
102
104
 
@@ -229,10 +231,12 @@ light.userData.cpuRenderer = { volumetric: { density: 0.05 } };
229
231
 
230
232
  | Function | |
231
233
  | --- | --- |
232
- | `serializeScene(scene)` | Async. The snapshot `setScene` builds from a Three scene, to reuse across renderers, the CPU one included. |
234
+ | `serializeScene(scene, options?)` | Async. The snapshot `setScene` builds from a Three scene, to reuse across renderers, the CPU one included. A snapshot only for this renderer can pass `{ mipmaps: false }`: it samples the base level of each texture, so the mip chains would be built for nothing. |
233
235
  | `serializeCamera(camera)` | A fixed `CameraState` snapshot of a Three camera, including zoom and view offsets. |
234
236
  | `sceneSignature(scene)` | A string that changes whenever something the renderer reads changes. Compare it before re-serializing an interactive scene. |
235
237
  | `isAbortError(error)` | Whether a `render()` rejection means the frame was replaced or cancelled rather than failed. |
238
+ | `createDefaultBvhWorker()` | The BVH worker this package ships, started from `new URL("./bvhWorker.js", import.meta.url)`. |
239
+ | `respondToBvhRequest(request)` | The worker's side of the exchange, for a worker of your own: returns the response and the buffers to transfer. |
236
240
  | `packGeometry`, `buildBvh`, `packLights`, `packTextures`, `sceneByteLength` | The scene packing, published because the sizes it produces are what a host checks against a device's limits before uploading. |
237
241
 
238
242
  ## Bundlers
@@ -246,6 +250,28 @@ export default defineConfig({
246
250
  });
247
251
  ```
248
252
 
253
+ The BVH worker is started the same way, from `new URL("./bvhWorker.js", import.meta.url)` next to the package's own module, which the same bundlers emit as a separate chunk. Where yours does not, pass `createBvhWorker`, or `bvhWorker: false`; see [BVH worker](#bvh-worker).
254
+
255
+ ### BVH worker
256
+
257
+ Splitting a large scene into its BVH takes about a second per million triangles, which would hold the page if it ran there. The renderer sends a copy of the positions to a Web Worker instead, starts it on the first scene large enough to need it, and keeps it until `dispose()`. A smaller scene is built on the main thread, where it takes less time than the trip to the worker and back.
258
+
259
+ If the worker cannot start or fails to load, the renderer warns once in the console and builds every BVH on the main thread from then on: the image does not change, only the page holds while the scene is prepared.
260
+
261
+ ```ts
262
+ // Off: every BVH on the main thread.
263
+ new GpuRenderer({ width, height, scene, bvhWorker: false });
264
+
265
+ // A worker of your own, when the bundler cannot follow the default one's URL.
266
+ new GpuRenderer({
267
+ width, height, scene,
268
+ createBvhWorker: () => new Worker(new URL("@tinypoly/gpu-renderer/bvhWorker.js", import.meta.url),
269
+ { type: "module" }),
270
+ });
271
+ ```
272
+
273
+ Anything shaped like a Web Worker fits `BvhWorker`: `postMessage(request, transfer)`, `terminate()`, `onmessage` and `onerror`. A worker of your own answers each `BvhRequest` with `respondToBvhRequest(request)`, posting its `response` with its `transfer` list.
274
+
249
275
  ## Limits
250
276
 
251
277
  This is a path tracer, not Three.js or WebGL conformance, and not a match for the CPU renderer's image: shadows, indirect light, reflections and transmission come out differently, usually better, never identical. Where it deliberately disagrees with Three (ambient lights as surroundings, stochastic transparency, unlit surfaces that emit, refracting glass) and what it reads, [ARCHITECTURE.md](ARCHITECTURE.md) lists in full. A scene has to fit the device's largest storage binding, and it is not available in Node, which has no WebGPU.
package/dist/bvh.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bvh.d.ts","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,UAAU,IAAI,CAAC;AAW5B;;;GAGG;AACH,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,MAAM,WAAW,SAAS;IACxB,2GAA2G;IAC3G,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gGAAgG;IAChG,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,CA4ElF"}
1
+ {"version":3,"file":"bvh.d.ts","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2CAA2C;AAC3C,eAAO,MAAM,UAAU,IAAI,CAAC;AAW5B;;;GAGG;AACH,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,MAAM,WAAW,SAAS;IACxB,2GAA2G;IAC3G,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gGAAgG;IAChG,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuBD,wBAAgB,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,CA6HlF"}
package/dist/bvh.js CHANGED
@@ -20,37 +20,6 @@ const TRAVERSAL_COST = 0.125;
20
20
  * because a node only pushes its far child. Depth is capped rather than trusted.
21
21
  */
22
22
  export const MAX_BVH_DEPTH = 32;
23
- /** Axis aligned bounds under construction, in doubles so the sweep does not accumulate rounding. */
24
- class Bounds {
25
- min = [Infinity, Infinity, Infinity];
26
- max = [-Infinity, -Infinity, -Infinity];
27
- reset() {
28
- this.min = [Infinity, Infinity, Infinity];
29
- this.max = [-Infinity, -Infinity, -Infinity];
30
- }
31
- addPoint(x, y, z) {
32
- const point = [x, y, z];
33
- for (let axis = 0; axis < 3; axis++) {
34
- if (point[axis] < this.min[axis])
35
- this.min[axis] = point[axis];
36
- if (point[axis] > this.max[axis])
37
- this.max[axis] = point[axis];
38
- }
39
- }
40
- addBounds(other) {
41
- for (let axis = 0; axis < 3; axis++) {
42
- if (other.min[axis] < this.min[axis])
43
- this.min[axis] = other.min[axis];
44
- if (other.max[axis] > this.max[axis])
45
- this.max[axis] = other.max[axis];
46
- }
47
- }
48
- /** Surface area, the cost the split heuristic weighs each side by. Empty bounds cost nothing. */
49
- area() {
50
- const x = this.max[0] - this.min[0], y = this.max[1] - this.min[1], z = this.max[2] - this.min[2];
51
- return x < 0 || y < 0 || z < 0 ? 0 : 2 * (x * y + y * z + z * x);
52
- }
53
- }
54
23
  /** Per-triangle bounds and centroids, the only inputs the split needs. */
55
24
  function triangleBounds(positions, triangleCount) {
56
25
  const min = new Float32Array(triangleCount * 3);
@@ -89,33 +58,82 @@ export function buildBvh(positions, triangleCount) {
89
58
  floats = new Float32Array(nodes);
90
59
  ints = new Int32Array(nodes);
91
60
  };
92
- const stack = [{ start: 0, count: triangleCount, node: 0, depth: 0 }];
93
- const bounds = new Bounds();
61
+ // The pending ranges, four integers each: start, count, node and depth. Typed, so the loop allocates nothing.
62
+ let stack = new Int32Array(4 * 2 * MAX_BVH_DEPTH + 8);
63
+ let top = 1;
64
+ const bins = new Bins();
94
65
  let nodeCount = 1;
95
66
  let maxDepth = 0;
96
- while (stack.length) {
97
- const range = stack.pop();
98
- maxDepth = Math.max(maxDepth, range.depth);
99
- bounds.reset();
100
- for (let i = range.start; i < range.start + range.count; i++) {
67
+ stack[0] = 0;
68
+ stack[1] = triangleCount;
69
+ stack[2] = 0;
70
+ stack[3] = 0;
71
+ while (top) {
72
+ top--;
73
+ const start = stack[top * 4], count = stack[top * 4 + 1], node = stack[top * 4 + 2], depth = stack[top * 4 + 3];
74
+ const end = start + count;
75
+ if (depth > maxDepth)
76
+ maxDepth = depth;
77
+ // The node's bounds and its centroids' bounds, in one pass. Doubles, so the corners are exactly the floats read.
78
+ let minX = Infinity, minY = Infinity, minZ = Infinity, maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
79
+ let cMinX = Infinity, cMinY = Infinity, cMinZ = Infinity, cMaxX = -Infinity, cMaxY = -Infinity, cMaxZ = -Infinity;
80
+ for (let i = start; i < end; i++) {
101
81
  const triangle = order[i] * 3;
102
- bounds.addPoint(min[triangle], min[triangle + 1], min[triangle + 2]);
103
- bounds.addPoint(max[triangle], max[triangle + 1], max[triangle + 2]);
82
+ let value = min[triangle];
83
+ if (value < minX)
84
+ minX = value;
85
+ value = min[triangle + 1];
86
+ if (value < minY)
87
+ minY = value;
88
+ value = min[triangle + 2];
89
+ if (value < minZ)
90
+ minZ = value;
91
+ value = max[triangle];
92
+ if (value > maxX)
93
+ maxX = value;
94
+ value = max[triangle + 1];
95
+ if (value > maxY)
96
+ maxY = value;
97
+ value = max[triangle + 2];
98
+ if (value > maxZ)
99
+ maxZ = value;
100
+ value = centroid[triangle];
101
+ if (value < cMinX)
102
+ cMinX = value;
103
+ if (value > cMaxX)
104
+ cMaxX = value;
105
+ value = centroid[triangle + 1];
106
+ if (value < cMinY)
107
+ cMinY = value;
108
+ if (value > cMaxY)
109
+ cMaxY = value;
110
+ value = centroid[triangle + 2];
111
+ if (value < cMinZ)
112
+ cMinZ = value;
113
+ if (value > cMaxZ)
114
+ cMaxZ = value;
115
+ }
116
+ const word = node * NODE_WORDS;
117
+ floats[word] = minX;
118
+ floats[word + 1] = minY;
119
+ floats[word + 2] = minZ;
120
+ floats[word + 4] = maxX;
121
+ floats[word + 5] = maxY;
122
+ floats[word + 6] = maxZ;
123
+ let split = -1;
124
+ if (count > MAX_LEAF_SIZE && depth + 1 < MAX_BVH_DEPTH) {
125
+ bins.centroidMin[0] = cMinX;
126
+ bins.centroidMin[1] = cMinY;
127
+ bins.centroidMin[2] = cMinZ;
128
+ bins.centroidMax[0] = cMaxX;
129
+ bins.centroidMax[1] = cMaxY;
130
+ bins.centroidMax[2] = cMaxZ;
131
+ split = partition(order, centroid, min, max, start, end, area(minX, minY, minZ, maxX, maxY, maxZ), bins);
104
132
  }
105
- const word = range.node * NODE_WORDS;
106
- floats[word] = bounds.min[0];
107
- floats[word + 1] = bounds.min[1];
108
- floats[word + 2] = bounds.min[2];
109
- floats[word + 4] = bounds.max[0];
110
- floats[word + 5] = bounds.max[1];
111
- floats[word + 6] = bounds.max[2];
112
- const split = range.count > MAX_LEAF_SIZE && range.depth + 1 < MAX_BVH_DEPTH
113
- ? partition(order, centroid, min, max, range, bounds.area())
114
- : -1;
115
133
  if (split < 0) {
116
134
  // A leaf points into `order` instead of into the node array, which the sign of the first link tells apart.
117
- ints[word + 3] = -1 - range.start;
118
- ints[word + 7] = range.count;
135
+ ints[word + 3] = -1 - start;
136
+ ints[word + 7] = count;
119
137
  continue;
120
138
  }
121
139
  reserve(nodeCount + 2);
@@ -123,74 +141,145 @@ export function buildBvh(positions, triangleCount) {
123
141
  const right = nodeCount++;
124
142
  ints[word + 3] = left;
125
143
  ints[word + 7] = right;
126
- stack.push({ start: range.start, count: split - range.start, node: left, depth: range.depth + 1 });
127
- stack.push({ start: split, count: range.start + range.count - split, node: right, depth: range.depth + 1 });
144
+ if ((top + 2) * 4 > stack.length) {
145
+ const grown = new Int32Array(stack.length * 2);
146
+ grown.set(stack);
147
+ stack = grown;
148
+ }
149
+ // Left first, then right, so the right side is built first, as the order the tree was always built in.
150
+ stack.set([start, split - start, left, depth + 1, split, end - split, right, depth + 1], top * 4);
151
+ top += 2;
128
152
  }
129
153
  return { nodes: nodes.slice(0, nodeCount * NODE_WORDS * 4), nodeCount, order, maxDepth };
130
154
  }
155
+ /** Surface area, the cost the split heuristic weighs each side by. Empty bounds cost nothing. */
156
+ function area(minX, minY, minZ, maxX, maxY, maxZ) {
157
+ const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;
158
+ return x < 0 || y < 0 || z < 0 ? 0 : 2 * (x * y + y * z + z * x);
159
+ }
160
+ /** Scratch space for one split, kept across every node so binning allocates nothing. */
161
+ class Bins {
162
+ centroidMin = new Float64Array(3);
163
+ centroidMax = new Float64Array(3);
164
+ /** Six doubles per bin and axis: the minimum corner, then the maximum. */
165
+ bounds = new Float64Array(3 * BIN_COUNT * 6);
166
+ counts = new Int32Array(3 * BIN_COUNT);
167
+ rightArea = new Float64Array(BIN_COUNT);
168
+ rightCount = new Int32Array(BIN_COUNT);
169
+ scale = new Float64Array(3);
170
+ reset() {
171
+ const bounds = this.bounds;
172
+ for (let i = 0; i < bounds.length; i += 6) {
173
+ bounds[i] = bounds[i + 1] = bounds[i + 2] = Infinity;
174
+ bounds[i + 3] = bounds[i + 4] = bounds[i + 5] = -Infinity;
175
+ }
176
+ this.counts.fill(0);
177
+ }
178
+ }
131
179
  /**
132
180
  * Reorders `order` in place so the range splits in two, and returns where the right side starts, or -1 when no split
133
- * beats keeping the range as a leaf. Bins the centroids on all three axes and sweeps the surface area heuristic.
181
+ * beats keeping the range as a leaf. Bins the centroids on all three axes in one pass and sweeps the surface area
182
+ * heuristic on each.
134
183
  */
135
- function partition(order, centroid, min, max, range, parentArea) {
184
+ function partition(order, centroid, min, max, start, end, parentArea, bins) {
136
185
  if (parentArea <= 0)
137
186
  return -1;
138
- const end = range.start + range.count;
139
- const centroidBounds = new Bounds();
140
- for (let i = range.start; i < end; i++) {
187
+ const { centroidMin, centroidMax, bounds, counts, rightArea, rightCount, scale } = bins;
188
+ let binned = false;
189
+ for (let axis = 0; axis < 3; axis++) {
190
+ const extent = centroidMax[axis] - centroidMin[axis];
191
+ // Every centroid sits at the same place on this axis: no split here separates anything.
192
+ scale[axis] = extent > 0 ? BIN_COUNT / extent : 0;
193
+ binned ||= extent > 0;
194
+ }
195
+ if (!binned)
196
+ return -1;
197
+ bins.reset();
198
+ for (let i = start; i < end; i++) {
141
199
  const triangle = order[i] * 3;
142
- centroidBounds.addPoint(centroid[triangle], centroid[triangle + 1], centroid[triangle + 2]);
200
+ const x0 = min[triangle], y0 = min[triangle + 1], z0 = min[triangle + 2];
201
+ const x1 = max[triangle], y1 = max[triangle + 1], z1 = max[triangle + 2];
202
+ for (let axis = 0; axis < 3; axis++) {
203
+ if (scale[axis] === 0)
204
+ continue;
205
+ const bin = axis * BIN_COUNT + binOf(centroid[triangle + axis], centroidMin[axis], scale[axis]);
206
+ const at = bin * 6;
207
+ counts[bin]++;
208
+ if (x0 < bounds[at])
209
+ bounds[at] = x0;
210
+ if (y0 < bounds[at + 1])
211
+ bounds[at + 1] = y0;
212
+ if (z0 < bounds[at + 2])
213
+ bounds[at + 2] = z0;
214
+ if (x1 > bounds[at + 3])
215
+ bounds[at + 3] = x1;
216
+ if (y1 > bounds[at + 4])
217
+ bounds[at + 4] = y1;
218
+ if (z1 > bounds[at + 5])
219
+ bounds[at + 5] = z1;
220
+ }
143
221
  }
144
222
  // Splitting costs a traversal step, so a split only wins when it beats shading the whole range as one leaf.
145
- let bestCost = range.count, bestAxis = -1, bestBin = -1, bestScale = 0;
223
+ let bestCost = end - start, bestAxis = -1, bestBin = -1;
146
224
  for (let axis = 0; axis < 3; axis++) {
147
- const extent = centroidBounds.max[axis] - centroidBounds.min[axis];
148
- // Every centroid sits at the same place on this axis: no split here separates anything.
149
- if (extent <= 0)
225
+ if (scale[axis] === 0)
150
226
  continue;
151
- const scale = BIN_COUNT / extent;
152
- const binBounds = Array.from({ length: BIN_COUNT }, () => new Bounds());
153
- const binCounts = new Int32Array(BIN_COUNT);
154
- for (let i = range.start; i < end; i++) {
155
- const triangle = order[i] * 3;
156
- const bin = binOf(centroid[triangle + axis], centroidBounds.min[axis], scale);
157
- binCounts[bin]++;
158
- binBounds[bin].addPoint(min[triangle], min[triangle + 1], min[triangle + 2]);
159
- binBounds[bin].addPoint(max[triangle], max[triangle + 1], max[triangle + 2]);
160
- }
161
227
  // Sweeping once from each side turns the heuristic into two passes instead of one per candidate split.
162
- const rightArea = new Float64Array(BIN_COUNT);
163
- const rightCount = new Int32Array(BIN_COUNT);
164
- const accumulated = new Bounds();
228
+ let minX = Infinity, minY = Infinity, minZ = Infinity, maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
165
229
  let running = 0;
166
230
  for (let bin = BIN_COUNT - 1; bin > 0; bin--) {
167
- accumulated.addBounds(binBounds[bin]);
168
- running += binCounts[bin];
169
- rightArea[bin] = accumulated.area();
231
+ const at = (axis * BIN_COUNT + bin) * 6;
232
+ if (bounds[at] < minX)
233
+ minX = bounds[at];
234
+ if (bounds[at + 1] < minY)
235
+ minY = bounds[at + 1];
236
+ if (bounds[at + 2] < minZ)
237
+ minZ = bounds[at + 2];
238
+ if (bounds[at + 3] > maxX)
239
+ maxX = bounds[at + 3];
240
+ if (bounds[at + 4] > maxY)
241
+ maxY = bounds[at + 4];
242
+ if (bounds[at + 5] > maxZ)
243
+ maxZ = bounds[at + 5];
244
+ running += counts[axis * BIN_COUNT + bin];
245
+ rightArea[bin] = area(minX, minY, minZ, maxX, maxY, maxZ);
170
246
  rightCount[bin] = running;
171
247
  }
172
- accumulated.reset();
248
+ minX = minY = minZ = Infinity;
249
+ maxX = maxY = maxZ = -Infinity;
173
250
  running = 0;
174
251
  for (let bin = 0; bin < BIN_COUNT - 1; bin++) {
175
- accumulated.addBounds(binBounds[bin]);
176
- running += binCounts[bin];
252
+ const at = (axis * BIN_COUNT + bin) * 6;
253
+ if (bounds[at] < minX)
254
+ minX = bounds[at];
255
+ if (bounds[at + 1] < minY)
256
+ minY = bounds[at + 1];
257
+ if (bounds[at + 2] < minZ)
258
+ minZ = bounds[at + 2];
259
+ if (bounds[at + 3] > maxX)
260
+ maxX = bounds[at + 3];
261
+ if (bounds[at + 4] > maxY)
262
+ maxY = bounds[at + 4];
263
+ if (bounds[at + 5] > maxZ)
264
+ maxZ = bounds[at + 5];
265
+ running += counts[axis * BIN_COUNT + bin];
177
266
  if (!running || !rightCount[bin + 1])
178
267
  continue;
179
268
  const cost = TRAVERSAL_COST
180
- + (accumulated.area() * running + rightArea[bin + 1] * rightCount[bin + 1]) / parentArea;
269
+ + (area(minX, minY, minZ, maxX, maxY, maxZ) * running + rightArea[bin + 1] * rightCount[bin + 1]) / parentArea;
181
270
  if (cost < bestCost) {
182
271
  bestCost = cost;
183
272
  bestAxis = axis;
184
273
  bestBin = bin;
185
- bestScale = scale;
186
274
  }
187
275
  }
188
276
  }
189
277
  if (bestAxis < 0)
190
278
  return -1;
191
- const pivot = centroidBounds.min[bestAxis];
192
- let left = range.start;
193
- for (let i = range.start; i < end; i++) {
279
+ const pivot = centroidMin[bestAxis];
280
+ const bestScale = scale[bestAxis];
281
+ let left = start;
282
+ for (let i = start; i < end; i++) {
194
283
  if (binOf(centroid[order[i] * 3 + bestAxis], pivot, bestScale) <= bestBin) {
195
284
  const swap = order[i];
196
285
  order[i] = order[left];
@@ -199,7 +288,7 @@ function partition(order, centroid, min, max, range, parentArea) {
199
288
  }
200
289
  }
201
290
  // The sweep only proposes splits both sides occupy, so this is a guard against rounding, not an expected outcome.
202
- return left === range.start || left === end ? -1 : left;
291
+ return left === start || left === end ? -1 : left;
203
292
  }
204
293
  function binOf(value, origin, scale) {
205
294
  return Math.min(BIN_COUNT - 1, Math.max(0, Math.floor((value - origin) * scale)));
package/dist/bvh.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bvh.js","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bvh.js","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { type PackedBvh } from "./bvh.js";
2
+ /** What the page sends the worker: its own copy of the positions, transferred. */
3
+ export interface BvhRequest {
4
+ id: number;
5
+ positions: Float32Array;
6
+ triangleCount: number;
7
+ }
8
+ /** The hierarchy back, its buffers transferred, or why it could not be built. */
9
+ export type BvhResponse = {
10
+ id: number;
11
+ nodes: ArrayBuffer;
12
+ nodeCount: number;
13
+ order: Uint32Array;
14
+ maxDepth: number;
15
+ } | {
16
+ id: number;
17
+ error: string;
18
+ };
19
+ /**
20
+ * What the renderer needs from a worker: the shape of a Web `Worker`. Any transport that carries structured clones and
21
+ * transfer lists fits, such as a `worker_threads` thread behind an adapter.
22
+ */
23
+ export interface BvhWorker {
24
+ postMessage(message: BvhRequest, transfer?: Transferable[]): void;
25
+ terminate(): void;
26
+ onmessage: ((event: {
27
+ data: BvhResponse;
28
+ }) => void) | null;
29
+ onerror: ((event: {
30
+ message?: string;
31
+ preventDefault?(): void;
32
+ }) => void) | null;
33
+ }
34
+ export type BvhWorkerFactory = () => BvhWorker;
35
+ /**
36
+ * Below this many triangles the hierarchy is built on the page: it takes a few milliseconds, less than copying the
37
+ * positions to a worker and the hierarchy back.
38
+ */
39
+ export declare const BVH_WORKER_MIN_TRIANGLES = 50000;
40
+ /** The worker this package ships, next to this module. Replace it when the bundler cannot follow the URL. */
41
+ export declare function createDefaultBvhWorker(): BvhWorker;
42
+ /** The worker's side of the exchange, apart from the worker itself so it can be run anywhere. */
43
+ export declare function respondToBvhRequest(request: BvhRequest): {
44
+ response: BvhResponse;
45
+ transfer: Transferable[];
46
+ };
47
+ /**
48
+ * Builds hierarchies in a worker, so a large scene does not hold the page while it is split. The worker is started on
49
+ * the first build that needs it and kept for the next ones. If it cannot be started or fails to load, every build from
50
+ * then on happens on the page, with the same result: the worker only moves the work, it never changes it.
51
+ */
52
+ export declare class BvhBuilder {
53
+ private readonly enabled;
54
+ private readonly createWorker;
55
+ private readonly minTriangles;
56
+ private worker;
57
+ private failed;
58
+ private disposed;
59
+ private next;
60
+ private readonly pending;
61
+ constructor(enabled: boolean, createWorker?: BvhWorkerFactory, minTriangles?: number);
62
+ /** Whether builds go to the worker: it is enabled and has not failed. */
63
+ get usesWorker(): boolean;
64
+ build(positions: Float32Array, triangleCount: number): Promise<PackedBvh>;
65
+ /** Stops the worker. Builds still waiting for it reject with an `AbortError`. */
66
+ dispose(): void;
67
+ private connect;
68
+ private receive;
69
+ /** The worker is gone for good: what it was building, and everything after, is built on the page instead. */
70
+ private fail;
71
+ }
72
+ //# sourceMappingURL=bvhBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bvhBuilder.d.ts","sourceRoot":"","sources":["../src/bvhBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,YAAY,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC3F;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAClE,SAAS,IAAI,IAAI,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,IAAI,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,6GAA6G;AAC7G,wBAAgB,sBAAsB,IAAI,SAAS,CAKlD;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAa5G;AASD;;;;GAIG;AACH,qBAAa,UAAU;IAQnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAT/B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;gBAGnC,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,gBAAyC,EACvD,YAAY,SAA2B;IAE1D,yEAAyE;IACzE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAiBzE,iFAAiF;IACjF,OAAO;IAUP,OAAO,CAAC,OAAO;IAyBf,OAAO,CAAC,OAAO;IAaf,6GAA6G;IAC7G,OAAO,CAAC,IAAI;CAoBb"}