@flighthq/spatial 0.3.1-next.996.06087b5 → 0.4.0-edge.1908.751021c

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 (57) hide show
  1. package/dist/bvh3D.d.ts +3 -0
  2. package/dist/bvh3D.d.ts.map +1 -0
  3. package/dist/bvh3D.js +575 -0
  4. package/dist/bvh3D.js.map +1 -0
  5. package/dist/contract.d.ts +6 -1
  6. package/dist/contract.d.ts.map +1 -1
  7. package/dist/contract.js +6 -1
  8. package/dist/contract.js.map +1 -1
  9. package/dist/explainSpatialIndexing2D.d.ts +3 -0
  10. package/dist/explainSpatialIndexing2D.d.ts.map +1 -0
  11. package/dist/{explainSpatialIndexing.js → explainSpatialIndexing2D.js} +2 -2
  12. package/dist/explainSpatialIndexing2D.js.map +1 -0
  13. package/dist/explainSpatialIndexing3D.d.ts +3 -0
  14. package/dist/explainSpatialIndexing3D.d.ts.map +1 -0
  15. package/dist/explainSpatialIndexing3D.js +15 -0
  16. package/dist/explainSpatialIndexing3D.js.map +1 -0
  17. package/dist/formatSpatialIndexingNotice.d.ts.map +1 -1
  18. package/dist/formatSpatialIndexingNotice.js +8 -2
  19. package/dist/formatSpatialIndexingNotice.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/spatialIndex.d.ts +10 -10
  25. package/dist/spatialIndex.d.ts.map +1 -1
  26. package/dist/spatialIndex.js +14 -14
  27. package/dist/spatialIndex.js.map +1 -1
  28. package/dist/spatialIndex3D.d.ts +13 -0
  29. package/dist/spatialIndex3D.d.ts.map +1 -0
  30. package/dist/spatialIndex3D.js +166 -0
  31. package/dist/spatialIndex3D.js.map +1 -0
  32. package/dist/spatialIndexingGuard.d.ts +4 -0
  33. package/dist/spatialIndexingGuard.d.ts.map +1 -0
  34. package/dist/spatialIndexingGuard.js +23 -0
  35. package/dist/spatialIndexingGuard.js.map +1 -0
  36. package/dist/uniformGrid.d.ts +2 -3
  37. package/dist/uniformGrid.d.ts.map +1 -1
  38. package/dist/uniformGrid.js +5 -15
  39. package/dist/uniformGrid.js.map +1 -1
  40. package/dist/uniformGrid3D.d.ts +3 -0
  41. package/dist/uniformGrid3D.d.ts.map +1 -0
  42. package/dist/uniformGrid3D.js +627 -0
  43. package/dist/uniformGrid3D.js.map +1 -0
  44. package/package.json +3 -3
  45. package/src/bvh3D.test.ts +294 -0
  46. package/src/explainSpatialIndexing2D.test.ts +81 -0
  47. package/src/explainSpatialIndexing3D.test.ts +59 -0
  48. package/src/formatSpatialIndexingNotice.test.ts +30 -4
  49. package/src/spatialIndex.test.ts +65 -65
  50. package/src/spatialIndex3D.test.ts +273 -0
  51. package/src/spatialIndexingGuard.test.ts +188 -0
  52. package/src/uniformGrid.test.ts +54 -182
  53. package/src/uniformGrid3D.test.ts +358 -0
  54. package/dist/explainSpatialIndexing.d.ts +0 -3
  55. package/dist/explainSpatialIndexing.d.ts.map +0 -1
  56. package/dist/explainSpatialIndexing.js.map +0 -1
  57. package/src/explainSpatialIndexing.test.ts +0 -76
@@ -0,0 +1,3 @@
1
+ import type { SpatialIndexBackend3D } from '@flighthq/types/contract';
2
+ export declare function createBvhSpatialBackend3D(margin?: number): SpatialIndexBackend3D;
3
+ //# sourceMappingURL=bvh3D.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bvh3D.d.ts","sourceRoot":"","sources":["../src/bvh3D.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,qBAAqB,EAOtB,MAAM,0BAA0B,CAAC;AA4BlC,wBAAgB,yBAAyB,CAAC,MAAM,SAAwB,GAAG,qBAAqB,CAsB/F"}
package/dist/bvh3D.js ADDED
@@ -0,0 +1,575 @@
1
+ import { reportSpatialIndexing } from './spatialIndexingGuard';
2
+ // A dynamic bounding-volume hierarchy: the second 3D backend, beside the uniform grid.
3
+ //
4
+ // The grid is the right structure when objects are roughly one size and the world has a scale; a tree
5
+ // is the right one when neither holds. A grid cell is a fixed world length, so an object much larger
6
+ // than a cell occupies many of them and an object much smaller wastes one — and an unbounded world has
7
+ // no cell size that is right anywhere. A tree adapts: it subdivides where objects are and nowhere else,
8
+ // costs O(log n) per query regardless of extent, and has no tuning constant that can be wrong.
9
+ //
10
+ // It is DYNAMIC in the specific sense that leaves carry FAT bounds — the object's box grown by a
11
+ // margin — so a body that moves a little stays inside the bounds already in the tree and needs no
12
+ // reinsertion at all. That is what makes it usable for a physics broadphase, where nearly every object
13
+ // moves nearly every step: without the margin, every step would be a full remove-and-reinsert.
14
+ //
15
+ // The margin buys cheap updates at the cost of looser traversal, which is why queries test a leaf's
16
+ // EXACT bounds before publishing it. Traversal uses the fat box; the answer uses the real one. Skipping
17
+ // that second test would make this backend report overlaps the grid does not, and the two are supposed
18
+ // to be interchangeable.
19
+ // Creates a BVH backend. `margin` is how far each leaf's stored box is grown beyond its object; a
20
+ // larger margin means fewer reinsertions and looser internal nodes.
21
+ //
22
+ // The default suits a world whose objects are order-of-magnitude single-digit units and move a few
23
+ // units per step. It is a world-space LENGTH, like the grid's cell size, so the two tune against the
24
+ // same intuition.
25
+ export function createBvhSpatialBackend3D(margin = DEFAULT_BVH_MARGIN_3D) {
26
+ const tree = createBvh3D(margin);
27
+ return {
28
+ clearSpatialIndex: () => clearBvh3D(tree),
29
+ explainSpatialIndexing: (id) => explainBvh3D(tree, id),
30
+ insertSpatialObject: (id, bounds) => insertBvh3D(tree, id, bounds, 'insert'),
31
+ querySpatialPairs: (out) => queryBvh3DPairs(tree, out),
32
+ querySpatialPoint: (x, y, z, out) => queryBvh3DPoint(tree, x, y, z, out),
33
+ querySpatialRay: (x, y, z, dx, dy, dz, out) => queryBvh3DRay(tree, x, y, z, dx, dy, dz, out),
34
+ querySpatialRegion: (region, out) => queryBvh3DRegion(tree, region, out),
35
+ removeSpatialObject: (id) => {
36
+ const wasMissing = !tree.leafByObject.has(id) && !tree.declined.has(id);
37
+ removeBvh3D(tree, id);
38
+ if (wasMissing)
39
+ reportBvh3DIndexing(tree, id, 'absent', 'remove', 'missing-id');
40
+ },
41
+ updateSpatialObject: (id, bounds) => {
42
+ const wasMissing = !tree.leafByObject.has(id) && !tree.declined.has(id);
43
+ const inserted = insertBvh3D(tree, id, bounds, 'update');
44
+ if (wasMissing)
45
+ reportBvh3DIndexing(tree, id, explainBvh3D(tree, id).mode, 'update', 'missing-id');
46
+ return inserted;
47
+ },
48
+ };
49
+ }
50
+ function createBvh3D(margin) {
51
+ return {
52
+ bounds: new Map(),
53
+ child1: [],
54
+ child2: [],
55
+ count: 0,
56
+ declined: new Map(),
57
+ freeList: [],
58
+ height: [],
59
+ leafByObject: new Map(),
60
+ margin: Number.isFinite(margin) && margin >= 0 ? margin : 0,
61
+ maxX: [],
62
+ maxY: [],
63
+ maxZ: [],
64
+ minX: [],
65
+ minY: [],
66
+ minZ: [],
67
+ object: [],
68
+ parent: [],
69
+ root: NIL,
70
+ stack: [],
71
+ };
72
+ }
73
+ function clearBvh3D(tree) {
74
+ tree.root = NIL;
75
+ tree.count = 0;
76
+ tree.freeList.length = 0;
77
+ tree.minX.length = 0;
78
+ tree.minY.length = 0;
79
+ tree.minZ.length = 0;
80
+ tree.maxX.length = 0;
81
+ tree.maxY.length = 0;
82
+ tree.maxZ.length = 0;
83
+ tree.parent.length = 0;
84
+ tree.child1.length = 0;
85
+ tree.child2.length = 0;
86
+ tree.height.length = 0;
87
+ tree.object.length = 0;
88
+ tree.leafByObject.clear();
89
+ tree.bounds.clear();
90
+ tree.declined.clear();
91
+ }
92
+ // A tree reports `cells` for an indexed object and a bucket count of zero.
93
+ //
94
+ // The mode vocabulary is shared with the grid and is grid-SHAPED — `cells` names a structure this one
95
+ // does not have. It is used anyway because it is the only member meaning "indexed normally", and
96
+ // `SpatialIndexingExplanation` already anticipates a bucketless structure by defining `bucketCount` as
97
+ // zero for one. Renaming the mode would change a vocabulary every backend and both dimensions share.
98
+ function explainBvh3D(tree, id) {
99
+ const reason = tree.declined.get(id);
100
+ if (reason !== undefined)
101
+ return { bucketCount: 0, id, mode: 'declined', reason };
102
+ if (!tree.leafByObject.has(id))
103
+ return { bucketCount: 0, id, mode: 'absent', reason: null };
104
+ return { bucketCount: 0, id, mode: 'cells', reason: null };
105
+ }
106
+ function insertBvh3D(tree, id, bounds, operation) {
107
+ if (!Number.isFinite(bounds.minX) ||
108
+ !Number.isFinite(bounds.minY) ||
109
+ !Number.isFinite(bounds.minZ) ||
110
+ !Number.isFinite(bounds.maxX) ||
111
+ !Number.isFinite(bounds.maxY) ||
112
+ !Number.isFinite(bounds.maxZ)) {
113
+ removeBvh3D(tree, id);
114
+ tree.declined.set(id, 'non-finite-bounds');
115
+ reportBvh3DIndexing(tree, id, 'declined', operation, 'non-finite-bounds');
116
+ return false;
117
+ }
118
+ if (bounds.maxX < bounds.minX || bounds.maxY < bounds.minY || bounds.maxZ < bounds.minZ) {
119
+ removeBvh3D(tree, id);
120
+ tree.declined.set(id, 'inverted-bounds');
121
+ reportBvh3DIndexing(tree, id, 'declined', operation, 'inverted-bounds');
122
+ return false;
123
+ }
124
+ tree.declined.delete(id);
125
+ const existing = tree.leafByObject.get(id);
126
+ if (existing !== undefined) {
127
+ // The whole point of the margin: if the object still sits inside the box already in the tree, the
128
+ // tree does not change at all. Only the exact bounds are refreshed, because queries answer from
129
+ // those and a stale one would report last step's overlap as this step's.
130
+ if (bounds.minX >= tree.minX[existing] &&
131
+ bounds.minY >= tree.minY[existing] &&
132
+ bounds.minZ >= tree.minZ[existing] &&
133
+ bounds.maxX <= tree.maxX[existing] &&
134
+ bounds.maxY <= tree.maxY[existing] &&
135
+ bounds.maxZ <= tree.maxZ[existing]) {
136
+ copyBounds3D(bounds, tree.bounds.get(id));
137
+ return true;
138
+ }
139
+ removeBvh3D(tree, id);
140
+ }
141
+ const leaf = allocateBvh3DNode(tree);
142
+ const margin = tree.margin;
143
+ tree.minX[leaf] = bounds.minX - margin;
144
+ tree.minY[leaf] = bounds.minY - margin;
145
+ tree.minZ[leaf] = bounds.minZ - margin;
146
+ tree.maxX[leaf] = bounds.maxX + margin;
147
+ tree.maxY[leaf] = bounds.maxY + margin;
148
+ tree.maxZ[leaf] = bounds.maxZ + margin;
149
+ tree.object[leaf] = id;
150
+ tree.height[leaf] = 0;
151
+ tree.child1[leaf] = NIL;
152
+ tree.child2[leaf] = NIL;
153
+ tree.leafByObject.set(id, leaf);
154
+ tree.bounds.set(id, {
155
+ maxX: bounds.maxX,
156
+ maxY: bounds.maxY,
157
+ maxZ: bounds.maxZ,
158
+ minX: bounds.minX,
159
+ minY: bounds.minY,
160
+ minZ: bounds.minZ,
161
+ });
162
+ tree.count += 1;
163
+ insertBvh3DLeaf(tree, leaf);
164
+ return true;
165
+ }
166
+ function removeBvh3D(tree, id) {
167
+ tree.declined.delete(id);
168
+ const leaf = tree.leafByObject.get(id);
169
+ if (leaf === undefined)
170
+ return;
171
+ tree.leafByObject.delete(id);
172
+ tree.bounds.delete(id);
173
+ tree.count -= 1;
174
+ removeBvh3DLeaf(tree, leaf);
175
+ freeBvh3DNode(tree, leaf);
176
+ }
177
+ // Descends to the leaf whose enclosing box grows LEAST by taking this one, which is the surface-area
178
+ // heuristic in its simplest form. Descending by centre distance instead builds a tree that looks
179
+ // balanced and traverses badly, because a node's cost is the area a ray or box must test against, not
180
+ // how evenly its children are counted.
181
+ function insertBvh3DLeaf(tree, leaf) {
182
+ if (tree.root === NIL) {
183
+ tree.root = leaf;
184
+ tree.parent[leaf] = NIL;
185
+ return;
186
+ }
187
+ let index = tree.root;
188
+ while (tree.height[index] > 0) {
189
+ const child1 = tree.child1[index];
190
+ const child2 = tree.child2[index];
191
+ const area = boundsArea(tree, index);
192
+ const combined = combinedArea(tree, index, leaf);
193
+ // The cost of putting the leaf here rather than deeper: a new parent covering both, plus the growth
194
+ // this node's own box would take on the way down.
195
+ const branchCost = 2 * combined;
196
+ const inheritanceCost = 2 * (combined - area);
197
+ const cost1 = descentCost(tree, child1, leaf, inheritanceCost);
198
+ const cost2 = descentCost(tree, child2, leaf, inheritanceCost);
199
+ if (branchCost < cost1 && branchCost < cost2)
200
+ break;
201
+ index = cost1 < cost2 ? child1 : child2;
202
+ }
203
+ const sibling = index;
204
+ const oldParent = tree.parent[sibling];
205
+ const newParent = allocateBvh3DNode(tree);
206
+ tree.parent[newParent] = oldParent;
207
+ tree.object[newParent] = NIL;
208
+ tree.child1[newParent] = sibling;
209
+ tree.child2[newParent] = leaf;
210
+ tree.height[newParent] = tree.height[sibling] + 1;
211
+ unionBounds(tree, newParent, sibling, leaf);
212
+ tree.parent[sibling] = newParent;
213
+ tree.parent[leaf] = newParent;
214
+ if (oldParent === NIL)
215
+ tree.root = newParent;
216
+ else if (tree.child1[oldParent] === sibling)
217
+ tree.child1[oldParent] = newParent;
218
+ else
219
+ tree.child2[oldParent] = newParent;
220
+ refitBvh3DAncestors(tree, tree.parent[leaf]);
221
+ }
222
+ function removeBvh3DLeaf(tree, leaf) {
223
+ if (leaf === tree.root) {
224
+ tree.root = NIL;
225
+ return;
226
+ }
227
+ const parent = tree.parent[leaf];
228
+ const grandParent = tree.parent[parent];
229
+ const sibling = tree.child1[parent] === leaf ? tree.child2[parent] : tree.child1[parent];
230
+ // The parent existed only to hold two children; with one gone it is pure indirection, so the sibling
231
+ // takes its place rather than the parent surviving with a single child.
232
+ if (grandParent === NIL) {
233
+ tree.root = sibling;
234
+ tree.parent[sibling] = NIL;
235
+ freeBvh3DNode(tree, parent);
236
+ return;
237
+ }
238
+ if (tree.child1[grandParent] === parent)
239
+ tree.child1[grandParent] = sibling;
240
+ else
241
+ tree.child2[grandParent] = sibling;
242
+ tree.parent[sibling] = grandParent;
243
+ freeBvh3DNode(tree, parent);
244
+ refitBvh3DAncestors(tree, grandParent);
245
+ }
246
+ // Walks to the root re-deriving each node's box and height, rebalancing as it goes.
247
+ //
248
+ // Both must happen on the way UP and in that order: a node's box is the union of its children's, so a
249
+ // change at a leaf is only visible to a query once every ancestor has been rewritten. Refitting lazily
250
+ // would leave a parent claiming a region its children no longer cover, which loses objects silently
251
+ // rather than loudly.
252
+ function refitBvh3DAncestors(tree, start) {
253
+ let index = start;
254
+ while (index !== NIL) {
255
+ index = balanceBvh3D(tree, index);
256
+ const child1 = tree.child1[index];
257
+ const child2 = tree.child2[index];
258
+ tree.height[index] = 1 + Math.max(tree.height[child1], tree.height[child2]);
259
+ unionBounds(tree, index, child1, child2);
260
+ index = tree.parent[index];
261
+ }
262
+ }
263
+ // One AVL-style rotation when a node's children differ in height by more than one, returning whichever
264
+ // node now occupies the position. Without it a run of sorted insertions degenerates to a list and every
265
+ // query becomes linear.
266
+ function balanceBvh3D(tree, index) {
267
+ if (tree.height[index] < 2)
268
+ return index;
269
+ const child1 = tree.child1[index];
270
+ const child2 = tree.child2[index];
271
+ const balance = tree.height[child2] - tree.height[child1];
272
+ if (balance > 1)
273
+ return rotateBvh3D(tree, index, child2);
274
+ if (balance < -1)
275
+ return rotateBvh3D(tree, index, child1);
276
+ return index;
277
+ }
278
+ // Promotes `heavy` above `index`, re-parenting whichever of its children is taller to keep the result
279
+ // balanced.
280
+ function rotateBvh3D(tree, index, heavy) {
281
+ const heavyChild1 = tree.child1[heavy];
282
+ const heavyChild2 = tree.child2[heavy];
283
+ tree.child1[heavy] = index;
284
+ tree.parent[heavy] = tree.parent[index];
285
+ tree.parent[index] = heavy;
286
+ const grandParent = tree.parent[heavy];
287
+ if (grandParent === NIL)
288
+ tree.root = heavy;
289
+ else if (tree.child1[grandParent] === index)
290
+ tree.child1[grandParent] = heavy;
291
+ else
292
+ tree.child2[grandParent] = heavy;
293
+ const promote = tree.height[heavyChild1] > tree.height[heavyChild2] ? heavyChild1 : heavyChild2;
294
+ const demote = promote === heavyChild1 ? heavyChild2 : heavyChild1;
295
+ tree.child2[heavy] = promote;
296
+ if (tree.child1[index] === heavy)
297
+ tree.child1[index] = demote;
298
+ else
299
+ tree.child2[index] = demote;
300
+ tree.parent[demote] = index;
301
+ unionBounds(tree, index, tree.child1[index], tree.child2[index]);
302
+ unionBounds(tree, heavy, tree.child1[heavy], tree.child2[heavy]);
303
+ tree.height[index] = 1 + Math.max(tree.height[tree.child1[index]], tree.height[tree.child2[index]]);
304
+ tree.height[heavy] = 1 + Math.max(tree.height[tree.child1[heavy]], tree.height[tree.child2[heavy]]);
305
+ return heavy;
306
+ }
307
+ function queryBvh3DPairs(tree, out) {
308
+ let written = 0;
309
+ if (tree.root === NIL) {
310
+ out.length = 0;
311
+ return;
312
+ }
313
+ tree.leafByObject.forEach((leaf, id) => {
314
+ const exact = tree.bounds.get(id);
315
+ if (exact === undefined)
316
+ return;
317
+ const stack = tree.stack;
318
+ stack.length = 0;
319
+ stack.push(tree.root);
320
+ while (stack.length > 0) {
321
+ const node = stack.pop();
322
+ if (node === NIL || node === leaf)
323
+ continue;
324
+ if (!nodeOverlapsBounds(tree, node, exact))
325
+ continue;
326
+ if (tree.height[node] === 0) {
327
+ const other = tree.object[node];
328
+ // Each unordered pair once. Comparing ids rather than tracking a seen-set is what keeps this
329
+ // allocation-free, and it is why a pair is emitted by the lower-id member only.
330
+ if (other <= id)
331
+ continue;
332
+ const otherExact = tree.bounds.get(other);
333
+ if (otherExact !== undefined && boundsOverlap3D(exact, otherExact)) {
334
+ const pair = out[written];
335
+ if (pair === undefined)
336
+ out.push({ a: id, b: other });
337
+ else {
338
+ pair.a = id;
339
+ pair.b = other;
340
+ }
341
+ written += 1;
342
+ }
343
+ continue;
344
+ }
345
+ stack.push(tree.child1[node]);
346
+ stack.push(tree.child2[node]);
347
+ }
348
+ });
349
+ out.length = written;
350
+ }
351
+ function queryBvh3DPoint(tree, x, y, z, out) {
352
+ out.length = 0;
353
+ if (tree.root === NIL)
354
+ return;
355
+ const stack = tree.stack;
356
+ stack.length = 0;
357
+ stack.push(tree.root);
358
+ while (stack.length > 0) {
359
+ const node = stack.pop();
360
+ if (node === NIL)
361
+ continue;
362
+ if (x < tree.minX[node] ||
363
+ x > tree.maxX[node] ||
364
+ y < tree.minY[node] ||
365
+ y > tree.maxY[node] ||
366
+ z < tree.minZ[node] ||
367
+ z > tree.maxZ[node]) {
368
+ continue;
369
+ }
370
+ if (tree.height[node] === 0) {
371
+ const exact = tree.bounds.get(tree.object[node]);
372
+ // Half-open [min, max) on every axis, matching the grid: a point exactly on a maximum face is
373
+ // outside. Sharing the convention is what keeps a point on a shared face from belonging to two
374
+ // adjacent boxes in one backend and one box in the other.
375
+ if (exact !== undefined &&
376
+ x >= exact.minX &&
377
+ x < exact.maxX &&
378
+ y >= exact.minY &&
379
+ y < exact.maxY &&
380
+ z >= exact.minZ &&
381
+ z < exact.maxZ) {
382
+ out.push(tree.object[node]);
383
+ }
384
+ continue;
385
+ }
386
+ stack.push(tree.child1[node]);
387
+ stack.push(tree.child2[node]);
388
+ }
389
+ }
390
+ function queryBvh3DRay(tree, x, y, z, dx, dy, dz, out) {
391
+ out.length = 0;
392
+ if (tree.root === NIL)
393
+ return;
394
+ const stack = tree.stack;
395
+ stack.length = 0;
396
+ stack.push(tree.root);
397
+ while (stack.length > 0) {
398
+ const node = stack.pop();
399
+ if (node === NIL)
400
+ continue;
401
+ if (!raySlabsHit(x, y, z, dx, dy, dz, tree.minX[node], tree.minY[node], tree.minZ[node], tree.maxX[node], tree.maxY[node], tree.maxZ[node])) {
402
+ continue;
403
+ }
404
+ if (tree.height[node] === 0) {
405
+ const exact = tree.bounds.get(tree.object[node]);
406
+ if (exact !== undefined &&
407
+ raySlabsHit(x, y, z, dx, dy, dz, exact.minX, exact.minY, exact.minZ, exact.maxX, exact.maxY, exact.maxZ)) {
408
+ out.push(tree.object[node]);
409
+ }
410
+ continue;
411
+ }
412
+ stack.push(tree.child1[node]);
413
+ stack.push(tree.child2[node]);
414
+ }
415
+ }
416
+ function queryBvh3DRegion(tree, region, out) {
417
+ out.length = 0;
418
+ if (tree.root === NIL)
419
+ return;
420
+ const stack = tree.stack;
421
+ stack.length = 0;
422
+ stack.push(tree.root);
423
+ while (stack.length > 0) {
424
+ const node = stack.pop();
425
+ if (node === NIL || !nodeOverlapsBounds(tree, node, region))
426
+ continue;
427
+ if (tree.height[node] === 0) {
428
+ const exact = tree.bounds.get(tree.object[node]);
429
+ if (exact !== undefined && boundsOverlap3D(exact, region))
430
+ out.push(tree.object[node]);
431
+ continue;
432
+ }
433
+ stack.push(tree.child1[node]);
434
+ stack.push(tree.child2[node]);
435
+ }
436
+ }
437
+ function allocateBvh3DNode(tree) {
438
+ const recycled = tree.freeList.pop();
439
+ if (recycled !== undefined) {
440
+ tree.parent[recycled] = NIL;
441
+ tree.child1[recycled] = NIL;
442
+ tree.child2[recycled] = NIL;
443
+ tree.height[recycled] = 0;
444
+ tree.object[recycled] = NIL;
445
+ return recycled;
446
+ }
447
+ const index = tree.minX.length;
448
+ tree.minX.push(0);
449
+ tree.minY.push(0);
450
+ tree.minZ.push(0);
451
+ tree.maxX.push(0);
452
+ tree.maxY.push(0);
453
+ tree.maxZ.push(0);
454
+ tree.parent.push(NIL);
455
+ tree.child1.push(NIL);
456
+ tree.child2.push(NIL);
457
+ tree.height.push(0);
458
+ tree.object.push(NIL);
459
+ return index;
460
+ }
461
+ function freeBvh3DNode(tree, index) {
462
+ tree.parent[index] = NIL;
463
+ tree.child1[index] = NIL;
464
+ tree.child2[index] = NIL;
465
+ tree.object[index] = NIL;
466
+ tree.height[index] = -1;
467
+ tree.freeList.push(index);
468
+ }
469
+ function boundsArea(tree, index) {
470
+ const dx = tree.maxX[index] - tree.minX[index];
471
+ const dy = tree.maxY[index] - tree.minY[index];
472
+ const dz = tree.maxZ[index] - tree.minZ[index];
473
+ return 2 * (dx * dy + dy * dz + dz * dx);
474
+ }
475
+ // STRICT on every axis, so two boxes that merely touch do not overlap — the convention the uniform grid
476
+ // already uses. The two backends sit behind one seam and a caller may swap them, so a boundary case must
477
+ // not answer differently depending on which is installed. Node traversal above stays INCLUSIVE on
478
+ // purpose: a conservative descent may visit a leaf that then fails this test, but it must never prune one
479
+ // that would have passed it.
480
+ function boundsOverlap3D(a, b) {
481
+ return a.minX < b.maxX && a.maxX > b.minX && a.minY < b.maxY && a.maxY > b.minY && a.minZ < b.maxZ && a.maxZ > b.minZ;
482
+ }
483
+ function combinedArea(tree, a, b) {
484
+ const dx = Math.max(tree.maxX[a], tree.maxX[b]) - Math.min(tree.minX[a], tree.minX[b]);
485
+ const dy = Math.max(tree.maxY[a], tree.maxY[b]) - Math.min(tree.minY[a], tree.minY[b]);
486
+ const dz = Math.max(tree.maxZ[a], tree.maxZ[b]) - Math.min(tree.minZ[a], tree.minZ[b]);
487
+ return 2 * (dx * dy + dy * dz + dz * dx);
488
+ }
489
+ function copyBounds3D(source, target) {
490
+ target.minX = source.minX;
491
+ target.minY = source.minY;
492
+ target.minZ = source.minZ;
493
+ target.maxX = source.maxX;
494
+ target.maxY = source.maxY;
495
+ target.maxZ = source.maxZ;
496
+ }
497
+ // What descending into `child` would cost. A leaf costs the box that would enclose it and the newcomer;
498
+ // an internal node costs only the GROWTH, because its existing area is already paid for.
499
+ function descentCost(tree, child, leaf, inheritanceCost) {
500
+ const combined = combinedArea(tree, child, leaf);
501
+ if (tree.height[child] === 0)
502
+ return combined + inheritanceCost;
503
+ return combined - boundsArea(tree, child) + inheritanceCost;
504
+ }
505
+ function nodeOverlapsBounds(tree, index, region) {
506
+ return (tree.minX[index] <= region.maxX &&
507
+ tree.maxX[index] >= region.minX &&
508
+ tree.minY[index] <= region.maxY &&
509
+ tree.maxY[index] >= region.minY &&
510
+ tree.minZ[index] <= region.maxZ &&
511
+ tree.maxZ[index] >= region.minZ);
512
+ }
513
+ // Slab test for a FORWARD ray, matching the uniform grid's reading: the ray extends from its origin in
514
+ // the direction given and not behind it. A zero component is parallel to that pair of planes, which is
515
+ // a hit exactly when the origin already lies between them.
516
+ function raySlabsHit(x, y, z, dx, dy, dz, minX, minY, minZ, maxX, maxY, maxZ) {
517
+ let near = 0;
518
+ let far = Number.POSITIVE_INFINITY;
519
+ for (let axis = 0; axis < 3; axis += 1) {
520
+ const origin = axis === 0 ? x : axis === 1 ? y : z;
521
+ const direction = axis === 0 ? dx : axis === 1 ? dy : dz;
522
+ const low = axis === 0 ? minX : axis === 1 ? minY : minZ;
523
+ const high = axis === 0 ? maxX : axis === 1 ? maxY : maxZ;
524
+ if (direction === 0) {
525
+ if (origin < low || origin > high)
526
+ return false;
527
+ continue;
528
+ }
529
+ const inverse = 1 / direction;
530
+ let t0 = (low - origin) * inverse;
531
+ let t1 = (high - origin) * inverse;
532
+ if (t0 > t1) {
533
+ const swap = t0;
534
+ t0 = t1;
535
+ t1 = swap;
536
+ }
537
+ if (t0 > near)
538
+ near = t0;
539
+ if (t1 < far)
540
+ far = t1;
541
+ if (near > far)
542
+ return false;
543
+ }
544
+ return true;
545
+ }
546
+ function reportBvh3DIndexing(tree, id, mode, operation,
547
+ // Wider than the EXPLANATION's reason, which carries only decline causes. A notice also reports
548
+ // `missing-id`, which is a fault in the operation rather than a property of the stored object, so
549
+ // there is nothing for a later `explainSpatialIndexing` to return. Matches the grids' reporter.
550
+ reason) {
551
+ // Only ever called for a fault: a declined insert, or an operation naming an id the tree does not
552
+ // hold. An ordinary successful insert or update reports NOTHING, which is what both grids do and what
553
+ // the shared formatter is written against — it has no advice for `cells` because no backend is
554
+ // supposed to raise it. Reporting success instead makes the guard fire once per object per step, so
555
+ // the one notice that matters arrives buried in thousands that do not.
556
+ //
557
+ // `cellSize` is the grid's tuning constant and a tree has none, so the margin is reported in its
558
+ // place: it is the number a caller would tune for the same reason, and leaving the field at zero
559
+ // would tell a diagnostic reader the structure was misconfigured.
560
+ reportSpatialIndexing({ cellSize: tree.margin, id, mode, operation, reason, wouldOccupyBucketCount: 0 });
561
+ }
562
+ function unionBounds(tree, target, a, b) {
563
+ tree.minX[target] = Math.min(tree.minX[a], tree.minX[b]);
564
+ tree.minY[target] = Math.min(tree.minY[a], tree.minY[b]);
565
+ tree.minZ[target] = Math.min(tree.minZ[a], tree.minZ[b]);
566
+ tree.maxX[target] = Math.max(tree.maxX[a], tree.maxX[b]);
567
+ tree.maxY[target] = Math.max(tree.maxY[a], tree.maxY[b]);
568
+ tree.maxZ[target] = Math.max(tree.maxZ[a], tree.maxZ[b]);
569
+ }
570
+ // The sentinel for "no node", matching the -1 an index into a parallel array cannot hold.
571
+ const NIL = -1;
572
+ // A world-space length, chosen against the same intuition as the grid's default cell size: a few units,
573
+ // suiting objects of order single-digit units moving a few units per step.
574
+ const DEFAULT_BVH_MARGIN_3D = 2;
575
+ //# sourceMappingURL=bvh3D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bvh3D.js","sourceRoot":"","sources":["../src/bvh3D.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
- export * from './explainSpatialIndexing';
1
+ export * from './explainSpatialIndexing2D';
2
+ export * from './bvh3D';
3
+ export * from './explainSpatialIndexing3D';
2
4
  export * from './formatSpatialIndexingNotice';
3
5
  export * from './spatialIndex';
6
+ export * from './spatialIndex3D';
7
+ export * from './spatialIndexingGuard';
4
8
  export * from './uniformGrid';
9
+ export * from './uniformGrid3D';
5
10
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}
package/dist/contract.js CHANGED
@@ -1,5 +1,10 @@
1
- export * from './explainSpatialIndexing';
1
+ export * from './explainSpatialIndexing2D';
2
+ export * from './bvh3D';
3
+ export * from './explainSpatialIndexing3D';
2
4
  export * from './formatSpatialIndexingNotice';
3
5
  export * from './spatialIndex';
6
+ export * from './spatialIndex3D';
7
+ export * from './spatialIndexingGuard';
4
8
  export * from './uniformGrid';
9
+ export * from './uniformGrid3D';
5
10
  //# sourceMappingURL=contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,SAAS,CAAC;AACxB,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC"}