@flighthq/spatial 0.3.0-next.906.07cea63 → 0.3.1-next.209.43ef1bc
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/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +2 -0
- package/dist/contract.js.map +1 -1
- package/dist/explainSpatialIndexing.d.ts +3 -0
- package/dist/explainSpatialIndexing.d.ts.map +1 -0
- package/dist/explainSpatialIndexing.js +14 -0
- package/dist/explainSpatialIndexing.js.map +1 -0
- package/dist/formatSpatialIndexingNotice.d.ts +3 -0
- package/dist/formatSpatialIndexingNotice.d.ts.map +1 -0
- package/dist/formatSpatialIndexingNotice.js +38 -0
- package/dist/formatSpatialIndexingNotice.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/spatialIndex.d.ts +2 -2
- package/dist/spatialIndex.d.ts.map +1 -1
- package/dist/spatialIndex.js +9 -3
- package/dist/spatialIndex.js.map +1 -1
- package/dist/uniformGrid.d.ts +3 -1
- package/dist/uniformGrid.d.ts.map +1 -1
- package/dist/uniformGrid.js +254 -31
- package/dist/uniformGrid.js.map +1 -1
- package/package.json +5 -3
- package/src/explainSpatialIndexing.test.ts +76 -0
- package/src/formatSpatialIndexingNotice.test.ts +116 -0
- package/src/uniformGrid.test.ts +713 -3
package/dist/uniformGrid.js
CHANGED
|
@@ -1,39 +1,70 @@
|
|
|
1
1
|
import { containsRectanglePointXY, intersectsRectangle } from '@flighthq/geometry/contract';
|
|
2
|
+
// The per-object cell budget. An object whose AABB covers more cells than this is held in the flat
|
|
3
|
+
// overflow list instead of being written into every cell it spans.
|
|
4
|
+
//
|
|
5
|
+
// This bound is what makes insert cost independent of object size. Without it the cell walk is
|
|
6
|
+
// proportional to extent ÷ cellSize *squared*, so cost is set by the largest object rather than by
|
|
7
|
+
// the object count: measured on this grid at one cell per unit, a 200-unit box costs 40k cell writes
|
|
8
|
+
// (~28 ms) and a 2000-unit box costs 4M (~4.7 s), while an AABB a trillion units wide — reachable
|
|
9
|
+
// from any diverging simulation — never returns at all. A hang is worse than a throw because it is
|
|
10
|
+
// uncatchable and takes the caller with it.
|
|
11
|
+
//
|
|
12
|
+
// Overflow is not a degraded result: an object that spans a thousand cells is a co-occupant of nearly
|
|
13
|
+
// everything, so the cell index tells the queries almost nothing and a linear scan answers the same
|
|
14
|
+
// question at a bounded cost. 1024 cells is a 32×32 block — an object 32× the cell size on each axis,
|
|
15
|
+
// far past the "cell size ≈ typical object size" the grid is built around. An object over the budget
|
|
16
|
+
// is a signal the cell size is wrong for the workload, which the indexing guard reports.
|
|
17
|
+
export const MAX_INDEXED_CELLS_PER_OBJECT = 1024;
|
|
2
18
|
// Builds a uniform-grid (spatial-hash) backend: an object's AABB is mapped to the rectangular block
|
|
3
19
|
// of fixed-size cells it covers, and each cell holds the ids overlapping it. Co-located objects share
|
|
4
20
|
// a cell, so candidate pairs and region/point/ray hits are found by looking only at the relevant
|
|
5
21
|
// cells instead of scanning every object. `cellSize` is the world-space side length of one cell; a
|
|
6
|
-
// good value is roughly the size of a typical object (too small over-spans
|
|
7
|
-
// cells, too large lumps unrelated objects together).
|
|
8
|
-
//
|
|
22
|
+
// good value is a positive finite number roughly the size of a typical object (too small over-spans
|
|
23
|
+
// large objects across many cells, too large lumps unrelated objects together). An invalid size uses
|
|
24
|
+
// the bounded overflow path to keep results correct and reports through the indexing guard. No
|
|
25
|
+
// import-time side effect — the caller constructs a grid explicitly, and createSpatialIndex uses
|
|
26
|
+
// this as its default index.
|
|
27
|
+
//
|
|
28
|
+
// Object size does not set the cost: an AABB spanning more than MAX_INDEXED_CELLS_PER_OBJECT cells
|
|
29
|
+
// goes to a flat overflow list that every query scans, and non-finite or inverted bounds are declined
|
|
30
|
+
// outright with a false sentinel. Both are visible through explainSpatialIndexing.
|
|
9
31
|
export function createUniformGridSpatialBackend(cellSize) {
|
|
10
32
|
const grid = {
|
|
11
33
|
cellSize,
|
|
12
34
|
cells: new Map(),
|
|
13
35
|
bounds: new Map(),
|
|
36
|
+
overflow: new Set(),
|
|
37
|
+
declined: new Map(),
|
|
14
38
|
minCellX: 0,
|
|
15
39
|
minCellY: 0,
|
|
16
40
|
maxCellX: 0,
|
|
17
41
|
maxCellY: 0,
|
|
18
|
-
empty: true,
|
|
19
42
|
seen: new Set(),
|
|
43
|
+
pairIds: [],
|
|
20
44
|
};
|
|
21
45
|
return {
|
|
22
46
|
insertSpatialObject(id, bounds) {
|
|
23
|
-
_insertIntoGrid(grid, id, bounds);
|
|
47
|
+
return _insertIntoGrid(grid, id, bounds, 'insert');
|
|
24
48
|
},
|
|
25
49
|
updateSpatialObject(id, bounds) {
|
|
26
|
-
|
|
27
|
-
_insertIntoGrid(grid, id, bounds);
|
|
50
|
+
return _updateGridObject(grid, id, bounds);
|
|
28
51
|
},
|
|
29
52
|
removeSpatialObject(id) {
|
|
53
|
+
const wasMissing = !grid.bounds.has(id) && !grid.declined.has(id);
|
|
30
54
|
_removeFromGrid(grid, id);
|
|
55
|
+
if (wasMissing)
|
|
56
|
+
_reportGridIndexing(grid, id, 'absent', 'remove', 'missing-id', 0);
|
|
31
57
|
},
|
|
32
58
|
clearSpatialIndex() {
|
|
33
59
|
grid.cells.clear();
|
|
34
60
|
grid.bounds.clear();
|
|
61
|
+
grid.overflow.clear();
|
|
62
|
+
grid.declined.clear();
|
|
35
63
|
grid.seen.clear();
|
|
36
|
-
grid.
|
|
64
|
+
grid.pairIds.length = 0;
|
|
65
|
+
},
|
|
66
|
+
explainSpatialIndexing(id) {
|
|
67
|
+
return _explainGridIndexing(grid, id);
|
|
37
68
|
},
|
|
38
69
|
querySpatialPairs(out) {
|
|
39
70
|
_queryGridPairs(grid, out);
|
|
@@ -49,6 +80,12 @@ export function createUniformGridSpatialBackend(cellSize) {
|
|
|
49
80
|
},
|
|
50
81
|
};
|
|
51
82
|
}
|
|
83
|
+
// Installs the indexing guard consulted for invalid configuration or bounds, missing-id operations,
|
|
84
|
+
// and overflow routing; null uninstalls it. Module-scoped rather than per-grid: it is a development
|
|
85
|
+
// diagnostic, and an application debugging an index wants it on for every grid at once.
|
|
86
|
+
export function setSpatialIndexingGuard(guard) {
|
|
87
|
+
_indexingGuard = guard;
|
|
88
|
+
}
|
|
52
89
|
// Maps a world coordinate to its cell index along one axis. Uses floor so negative coordinates map
|
|
53
90
|
// to consistently decreasing cell indices (world 0 is the boundary between cell -1 and cell 0).
|
|
54
91
|
function _cellIndex(coord, cellSize) {
|
|
@@ -61,23 +98,79 @@ function _cellKey(cx, cy) {
|
|
|
61
98
|
}
|
|
62
99
|
// Fills a scratch RectangleLike (x/y/width/height) from a SpatialAabb (min/max corners) so the
|
|
63
100
|
// geometry rectangle-overlap and point-containment helpers can be reused instead of re-deriving the
|
|
64
|
-
// AABB math here.
|
|
65
|
-
// which the geometry helpers still normalize internally.
|
|
101
|
+
// AABB math here. Stored AABBs are normalized because insert declines inverted bounds.
|
|
66
102
|
function _fillRectFromAabb(out, aabb) {
|
|
67
103
|
out.x = aabb.minX;
|
|
68
104
|
out.y = aabb.minY;
|
|
69
105
|
out.width = aabb.maxX - aabb.minX;
|
|
70
106
|
out.height = aabb.maxY - aabb.minY;
|
|
71
107
|
}
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
108
|
+
// Reports how `id` is currently held. Pure: reads only, allocates only the returned record.
|
|
109
|
+
function _explainGridIndexing(grid, id) {
|
|
110
|
+
const declineReason = grid.declined.get(id);
|
|
111
|
+
if (declineReason !== undefined)
|
|
112
|
+
return { bucketCount: 0, id, mode: 'declined', reason: declineReason };
|
|
113
|
+
if (grid.overflow.has(id))
|
|
114
|
+
return { bucketCount: 0, id, mode: 'overflow', reason: null };
|
|
115
|
+
const bounds = grid.bounds.get(id);
|
|
116
|
+
if (bounds === undefined)
|
|
117
|
+
return { bucketCount: 0, id, mode: 'absent', reason: null };
|
|
118
|
+
return { bucketCount: _spannedCellCount(grid.cellSize, bounds), id, mode: 'cells', reason: null };
|
|
119
|
+
}
|
|
120
|
+
// Adds an object to the index, storing a private copy of the bounds; the caller may safely mutate or
|
|
121
|
+
// reuse the passed bounds afterward. Returns false only for bounds that cannot be indexed at all.
|
|
122
|
+
//
|
|
123
|
+
// Five outcomes, and which one applies is decided *before* any cell is touched — that ordering is
|
|
124
|
+
// the whole point, since deciding afterward would mean walking the cells to find out they were too
|
|
125
|
+
// many:
|
|
126
|
+
// - non-finite bounds are declined. There is no cell range to compute, and storing them would let a
|
|
127
|
+
// NaN leak into every later overlap test, so the object is left out of the index entirely and the
|
|
128
|
+
// caller gets a false sentinel rather than an exception or a silent no-op.
|
|
129
|
+
// - inverted bounds are likewise declined because min/max corners do not describe an AABB.
|
|
130
|
+
// - a non-positive or non-finite cell size routes valid objects to overflow, preserving query
|
|
131
|
+
// correctness through the bounded flat scan while the indexing guard reports the configuration.
|
|
132
|
+
// - bounds spanning more than MAX_INDEXED_CELLS_PER_OBJECT cells go to the overflow list, which
|
|
133
|
+
// every query scans. Bounded by the object count instead of the object's size.
|
|
134
|
+
// - everything else takes the ordinary path: one entry in each cell it covers.
|
|
135
|
+
function _insertIntoGrid(grid, id, bounds, operation) {
|
|
136
|
+
if (!Number.isFinite(bounds.minX) ||
|
|
137
|
+
!Number.isFinite(bounds.minY) ||
|
|
138
|
+
!Number.isFinite(bounds.maxX) ||
|
|
139
|
+
!Number.isFinite(bounds.maxY)) {
|
|
140
|
+
grid.declined.set(id, 'non-finite-bounds');
|
|
141
|
+
_reportGridIndexing(grid, id, 'declined', operation, 'non-finite-bounds', 0);
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
if (bounds.maxX < bounds.minX || bounds.maxY < bounds.minY) {
|
|
145
|
+
grid.declined.set(id, 'inverted-bounds');
|
|
146
|
+
_reportGridIndexing(grid, id, 'declined', operation, 'inverted-bounds', 0);
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
75
149
|
const cs = grid.cellSize;
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
150
|
+
const copy = { minX: bounds.minX, minY: bounds.minY, maxX: bounds.maxX, maxY: bounds.maxY };
|
|
151
|
+
if (!(cs > 0 && Number.isFinite(cs))) {
|
|
152
|
+
grid.bounds.set(id, copy);
|
|
153
|
+
grid.overflow.add(id);
|
|
154
|
+
_reportGridIndexing(grid, id, 'overflow', operation, 'invalid-cell-size', 0);
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
const spanned = _spannedCellCount(cs, copy);
|
|
158
|
+
// Written as a negated `<=` so an unrepresentable span falls to overflow rather than through to a
|
|
159
|
+
// loop that cannot index it.
|
|
160
|
+
if (!(spanned <= MAX_INDEXED_CELLS_PER_OBJECT)) {
|
|
161
|
+
grid.bounds.set(id, copy);
|
|
162
|
+
grid.overflow.add(id);
|
|
163
|
+
_reportGridIndexing(grid, id, 'overflow', operation, null, spanned);
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
const cx0 = _cellIndex(copy.minX, cs);
|
|
167
|
+
const cx1 = _cellIndex(copy.maxX, cs);
|
|
168
|
+
const cy0 = _cellIndex(copy.minY, cs);
|
|
169
|
+
const cy1 = _cellIndex(copy.maxY, cs);
|
|
170
|
+
// Whether a cell range exists yet, read *before* this object's cells are added. A first celled
|
|
171
|
+
// object seeds the range; a later one widens it.
|
|
172
|
+
const hadCells = grid.cells.size !== 0;
|
|
173
|
+
grid.bounds.set(id, copy);
|
|
81
174
|
for (let cy = cy0; cy <= cy1; cy++) {
|
|
82
175
|
for (let cx = cx0; cx <= cx1; cx++) {
|
|
83
176
|
const key = _cellKey(cx, cy);
|
|
@@ -89,12 +182,11 @@ function _insertIntoGrid(grid, id, bounds) {
|
|
|
89
182
|
cell.ids.add(id);
|
|
90
183
|
}
|
|
91
184
|
}
|
|
92
|
-
if (
|
|
185
|
+
if (!hadCells) {
|
|
93
186
|
grid.minCellX = cx0;
|
|
94
187
|
grid.maxCellX = cx1;
|
|
95
188
|
grid.minCellY = cy0;
|
|
96
189
|
grid.maxCellY = cy1;
|
|
97
|
-
grid.empty = false;
|
|
98
190
|
}
|
|
99
191
|
else {
|
|
100
192
|
if (cx0 < grid.minCellX)
|
|
@@ -106,6 +198,44 @@ function _insertIntoGrid(grid, id, bounds) {
|
|
|
106
198
|
if (cy1 > grid.maxCellY)
|
|
107
199
|
grid.maxCellY = cy1;
|
|
108
200
|
}
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
// Updates an object's private AABB copy without touching its cell sets when both the old and new
|
|
204
|
+
// bounds take the ordinary indexing path and cover exactly the same cells. Small per-frame movement
|
|
205
|
+
// usually stays inside this range, so its dominant cost becomes four field writes instead of a
|
|
206
|
+
// remove-and-reinsert walk. Every mode or range transition keeps using the shared slow path below.
|
|
207
|
+
function _updateGridObject(grid, id, bounds) {
|
|
208
|
+
const wasMissing = !grid.bounds.has(id) && !grid.declined.has(id);
|
|
209
|
+
const previous = grid.bounds.get(id);
|
|
210
|
+
if (previous !== undefined &&
|
|
211
|
+
!grid.overflow.has(id) &&
|
|
212
|
+
Number.isFinite(bounds.minX) &&
|
|
213
|
+
Number.isFinite(bounds.minY) &&
|
|
214
|
+
Number.isFinite(bounds.maxX) &&
|
|
215
|
+
Number.isFinite(bounds.maxY) &&
|
|
216
|
+
bounds.minX <= bounds.maxX &&
|
|
217
|
+
bounds.minY <= bounds.maxY) {
|
|
218
|
+
const cs = grid.cellSize;
|
|
219
|
+
const spanned = _spannedCellCount(cs, bounds);
|
|
220
|
+
if (spanned <= MAX_INDEXED_CELLS_PER_OBJECT &&
|
|
221
|
+
_cellIndex(previous.minX, cs) === _cellIndex(bounds.minX, cs) &&
|
|
222
|
+
_cellIndex(previous.minY, cs) === _cellIndex(bounds.minY, cs) &&
|
|
223
|
+
_cellIndex(previous.maxX, cs) === _cellIndex(bounds.maxX, cs) &&
|
|
224
|
+
_cellIndex(previous.maxY, cs) === _cellIndex(bounds.maxY, cs)) {
|
|
225
|
+
previous.minX = bounds.minX;
|
|
226
|
+
previous.minY = bounds.minY;
|
|
227
|
+
previous.maxX = bounds.maxX;
|
|
228
|
+
previous.maxY = bounds.maxY;
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
_removeFromGrid(grid, id);
|
|
233
|
+
const inserted = _insertIntoGrid(grid, id, bounds, 'update');
|
|
234
|
+
if (wasMissing) {
|
|
235
|
+
const explanation = _explainGridIndexing(grid, id);
|
|
236
|
+
_reportGridIndexing(grid, id, explanation.mode, 'update', 'missing-id', 0);
|
|
237
|
+
}
|
|
238
|
+
return inserted;
|
|
109
239
|
}
|
|
110
240
|
// Reports whether an AABB contains the point (`x`,`y`), reusing the geometry rectangle helper.
|
|
111
241
|
function _isSpatialAabbContainsPoint(aabb, x, y) {
|
|
@@ -165,11 +295,18 @@ function _rayBoxEntryT(ox, oy, dx, dy, minX, minY, maxX, maxY) {
|
|
|
165
295
|
}
|
|
166
296
|
// Removes an object from every cell its stored AABB covered and drops now-empty cells. The occupied
|
|
167
297
|
// cell range is intentionally not shrunk (only reset when the grid fully empties). A no-op for an
|
|
168
|
-
// unknown id.
|
|
298
|
+
// unknown id. Overflowed and declined ids leave through their own sets without a cell walk — remove
|
|
299
|
+
// re-derives the cell range from the stored bounds, so an overflowed object taking the ordinary path
|
|
300
|
+
// here would reintroduce exactly the unbounded walk the insert bound removed.
|
|
169
301
|
function _removeFromGrid(grid, id) {
|
|
302
|
+
grid.declined.delete(id);
|
|
170
303
|
const bounds = grid.bounds.get(id);
|
|
171
304
|
if (bounds === undefined)
|
|
172
305
|
return;
|
|
306
|
+
if (grid.overflow.delete(id)) {
|
|
307
|
+
grid.bounds.delete(id);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
173
310
|
const cs = grid.cellSize;
|
|
174
311
|
const cx0 = _cellIndex(bounds.minX, cs);
|
|
175
312
|
const cx1 = _cellIndex(bounds.maxX, cs);
|
|
@@ -187,8 +324,30 @@ function _removeFromGrid(grid, id) {
|
|
|
187
324
|
}
|
|
188
325
|
}
|
|
189
326
|
grid.bounds.delete(id);
|
|
190
|
-
|
|
191
|
-
|
|
327
|
+
}
|
|
328
|
+
// Appends the pairs involving overflowed objects. An overflowed object occupies no cell, so the cell
|
|
329
|
+
// walk in _queryGridPairs can never emit a pair for it and no dedup against that walk is needed. Its
|
|
330
|
+
// pairs are enumerated here instead: against every other indexed object, which is what "spans nearly
|
|
331
|
+
// the whole world" already means. Unlike the cell path these are filtered by a real AABB overlap test
|
|
332
|
+
// rather than emitted as bare locality candidates — the result stays a superset of the true overlaps
|
|
333
|
+
// either way, and an object this large would otherwise nominate every other object every frame.
|
|
334
|
+
function _queryGridOverflowPairs(grid, out) {
|
|
335
|
+
for (const id of grid.overflow) {
|
|
336
|
+
const bounds = grid.bounds.get(id);
|
|
337
|
+
if (bounds === undefined)
|
|
338
|
+
continue;
|
|
339
|
+
for (const [otherId, otherBounds] of grid.bounds) {
|
|
340
|
+
if (otherId === id)
|
|
341
|
+
continue;
|
|
342
|
+
// Each overflow×overflow pair would otherwise be emitted from both sides; taking it only from
|
|
343
|
+
// the lower id emits it once. An overflow×celled pair reaches this test from one side only.
|
|
344
|
+
if (grid.overflow.has(otherId) && otherId < id)
|
|
345
|
+
continue;
|
|
346
|
+
if (!_isSpatialAabbOverlapping(bounds, otherBounds))
|
|
347
|
+
continue;
|
|
348
|
+
out.push(id < otherId ? { a: id, b: otherId } : { a: otherId, b: id });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
192
351
|
}
|
|
193
352
|
// Enumerates candidate pairs. Within each cell every co-occupant pair is a candidate, but a pair may
|
|
194
353
|
// share several cells; to emit it exactly once, a pair is emitted only from its canonical cell — the
|
|
@@ -198,11 +357,14 @@ function _removeFromGrid(grid, id) {
|
|
|
198
357
|
function _queryGridPairs(grid, out) {
|
|
199
358
|
out.length = 0;
|
|
200
359
|
const cs = grid.cellSize;
|
|
360
|
+
const list = grid.pairIds;
|
|
201
361
|
for (const cell of grid.cells.values()) {
|
|
202
362
|
const ids = cell.ids;
|
|
203
363
|
if (ids.size < 2)
|
|
204
364
|
continue;
|
|
205
|
-
|
|
365
|
+
list.length = 0;
|
|
366
|
+
for (const id of ids)
|
|
367
|
+
list.push(id);
|
|
206
368
|
for (let i = 0; i < list.length; i++) {
|
|
207
369
|
for (let j = i + 1; j < list.length; j++) {
|
|
208
370
|
let a = list[i];
|
|
@@ -223,16 +385,30 @@ function _queryGridPairs(grid, out) {
|
|
|
223
385
|
}
|
|
224
386
|
}
|
|
225
387
|
}
|
|
388
|
+
if (grid.overflow.size !== 0)
|
|
389
|
+
_queryGridOverflowPairs(grid, out);
|
|
390
|
+
}
|
|
391
|
+
function _reportGridIndexing(grid, id, mode, operation, reason, wouldOccupyBucketCount) {
|
|
392
|
+
if (_indexingGuard === null)
|
|
393
|
+
return;
|
|
394
|
+
_indexingGuard({ cellSize: grid.cellSize, id, mode, operation, reason, wouldOccupyBucketCount });
|
|
226
395
|
}
|
|
227
396
|
// Gathers the ids in the cell containing the point, then confirms each against its real bounds. A
|
|
228
|
-
// single cell holds each id at most once, so no dedup pass is needed.
|
|
397
|
+
// single cell holds each id at most once, so no dedup pass is needed. Overflowed objects hold no cell
|
|
398
|
+
// and are tested directly; they cannot collide with the cell gather, so no dedup is needed there
|
|
399
|
+
// either.
|
|
229
400
|
function _queryGridPoint(grid, x, y, out) {
|
|
230
401
|
out.length = 0;
|
|
231
402
|
const cs = grid.cellSize;
|
|
232
403
|
const cell = grid.cells.get(_cellKey(_cellIndex(x, cs), _cellIndex(y, cs)));
|
|
233
|
-
if (cell
|
|
234
|
-
|
|
235
|
-
|
|
404
|
+
if (cell !== undefined) {
|
|
405
|
+
for (const id of cell.ids) {
|
|
406
|
+
const bounds = grid.bounds.get(id);
|
|
407
|
+
if (bounds !== undefined && _isSpatialAabbContainsPoint(bounds, x, y))
|
|
408
|
+
out.push(id);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
for (const id of grid.overflow) {
|
|
236
412
|
const bounds = grid.bounds.get(id);
|
|
237
413
|
if (bounds !== undefined && _isSpatialAabbContainsPoint(bounds, x, y))
|
|
238
414
|
out.push(id);
|
|
@@ -244,8 +420,6 @@ function _queryGridPoint(grid, x, y, out) {
|
|
|
244
420
|
// point query at the origin. An empty grid returns nothing.
|
|
245
421
|
function _queryGridRay(grid, ox, oy, dx, dy, out) {
|
|
246
422
|
out.length = 0;
|
|
247
|
-
if (grid.empty)
|
|
248
|
-
return;
|
|
249
423
|
const cs = grid.cellSize;
|
|
250
424
|
const seen = grid.seen;
|
|
251
425
|
seen.clear();
|
|
@@ -253,6 +427,23 @@ function _queryGridRay(grid, ox, oy, dx, dy, out) {
|
|
|
253
427
|
_queryGridPoint(grid, ox, oy, out);
|
|
254
428
|
return;
|
|
255
429
|
}
|
|
430
|
+
// Overflowed objects are outside the cell range the DDA walks — deliberately, so one huge AABB
|
|
431
|
+
// cannot stretch that range and make every ray traverse it — so they are slab-tested directly.
|
|
432
|
+
for (const id of grid.overflow) {
|
|
433
|
+
const bounds = grid.bounds.get(id);
|
|
434
|
+
if (bounds !== undefined &&
|
|
435
|
+
_rayBoxEntryT(ox, oy, dx, dy, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY) >= 0) {
|
|
436
|
+
out.push(id);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
// The cell range describes the CELLS, so the cells decide whether it means anything. Reading a
|
|
440
|
+
// separately-maintained `empty` flag here was the defect: it was set from `bounds.size`, which counts
|
|
441
|
+
// overflowed objects too, so removing the last CELLED object while any overflowed object remained
|
|
442
|
+
// left the flag false and the min/max range stale — and this walk then stepped across that stale
|
|
443
|
+
// range, unbounded, with no cells left to find. Deriving the fact removes the class: there is no
|
|
444
|
+
// longer a flag that can disagree with the structure it describes, at any transition.
|
|
445
|
+
if (grid.cells.size === 0)
|
|
446
|
+
return;
|
|
256
447
|
const boxMinX = grid.minCellX * cs;
|
|
257
448
|
const boxMinY = grid.minCellY * cs;
|
|
258
449
|
const boxMaxX = (grid.maxCellX + 1) * cs;
|
|
@@ -316,12 +507,25 @@ function _queryGridRay(grid, ox, oy, dx, dy, out) {
|
|
|
316
507
|
}
|
|
317
508
|
// Gathers the ids in every cell the region covers (deduplicated via the reused scratch set), then
|
|
318
509
|
// confirms each against the region's real bounds — so a false cell-mate whose bounds miss the region
|
|
319
|
-
// is dropped.
|
|
510
|
+
// is dropped. Overflowed objects hold no cell and are tested directly.
|
|
511
|
+
//
|
|
512
|
+
// The region is caller-supplied, so it carries the same unbounded-walk hazard the insert bound closes
|
|
513
|
+
// and needs its own guard: a query region wider than the world costs extent ÷ cellSize squared cell
|
|
514
|
+
// lookups against a grid that may hold one object. When the region spans more cells than the grid has
|
|
515
|
+
// occupied, walking the objects is both cheaper and exact, so the walk flips — a region query is
|
|
516
|
+
// never more expensive than a full scan.
|
|
320
517
|
function _queryGridRegion(grid, region, out) {
|
|
321
518
|
out.length = 0;
|
|
322
519
|
const cs = grid.cellSize;
|
|
323
520
|
const seen = grid.seen;
|
|
324
521
|
seen.clear();
|
|
522
|
+
if (!(_spannedCellCount(cs, region) <= grid.cells.size)) {
|
|
523
|
+
for (const [id, bounds] of grid.bounds) {
|
|
524
|
+
if (_isSpatialAabbOverlapping(bounds, region))
|
|
525
|
+
out.push(id);
|
|
526
|
+
}
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
325
529
|
const cx0 = _cellIndex(region.minX, cs);
|
|
326
530
|
const cx1 = _cellIndex(region.maxX, cs);
|
|
327
531
|
const cy0 = _cellIndex(region.minY, cs);
|
|
@@ -341,7 +545,26 @@ function _queryGridRegion(grid, region, out) {
|
|
|
341
545
|
}
|
|
342
546
|
}
|
|
343
547
|
}
|
|
548
|
+
for (const id of grid.overflow) {
|
|
549
|
+
const bounds = grid.bounds.get(id);
|
|
550
|
+
if (bounds !== undefined && _isSpatialAabbOverlapping(bounds, region))
|
|
551
|
+
out.push(id);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
// How many cells an AABB's span covers, as a count rather than a walk — the number the per-object
|
|
555
|
+
// budget is compared against, computed before any cell is touched. Returns NaN for bounds or a cell
|
|
556
|
+
// size that make the cell indices non-finite; callers test it with a negated `<=` so NaN falls to the
|
|
557
|
+
// bounded path rather than through it.
|
|
558
|
+
function _spannedCellCount(cellSize, aabb) {
|
|
559
|
+
const cx0 = _cellIndex(aabb.minX, cellSize);
|
|
560
|
+
const cx1 = _cellIndex(aabb.maxX, cellSize);
|
|
561
|
+
const cy0 = _cellIndex(aabb.minY, cellSize);
|
|
562
|
+
const cy1 = _cellIndex(aabb.maxY, cellSize);
|
|
563
|
+
return (cx1 - cx0 + 1) * (cy1 - cy0 + 1);
|
|
344
564
|
}
|
|
565
|
+
// Diagnostics seam filled by setSpatialIndexingGuard. Caller-facing text stays in the separate
|
|
566
|
+
// formatSpatialIndexingNotice module, so production pays only the null checks at noteworthy sites.
|
|
567
|
+
let _indexingGuard = null;
|
|
345
568
|
// Reused scratch rectangles for the geometry overlap/containment helpers. Only ever read+written
|
|
346
569
|
// within a single non-nested helper call, so sharing them across the module allocates nothing per
|
|
347
570
|
// query without aliasing hazard.
|
package/dist/uniformGrid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniformGrid.js","sourceRoot":"","sources":["../src/uniformGrid.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uniformGrid.js","sourceRoot":"","sources":["../src/uniformGrid.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/spatial",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1-next.209.43ef1bc",
|
|
4
|
+
"author": "Joshua Granick and other contributors",
|
|
5
|
+
"license": "MIT",
|
|
4
6
|
"repository": {
|
|
5
7
|
"type": "git",
|
|
6
8
|
"url": "https://github.com/flighthq/flight.git",
|
|
@@ -36,8 +38,8 @@
|
|
|
36
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
37
39
|
},
|
|
38
40
|
"dependencies": {
|
|
39
|
-
"@flighthq/geometry": "0.3.
|
|
40
|
-
"@flighthq/types": "0.3.
|
|
41
|
+
"@flighthq/geometry": "0.3.1-next.209.43ef1bc",
|
|
42
|
+
"@flighthq/types": "0.3.1-next.209.43ef1bc"
|
|
41
43
|
},
|
|
42
44
|
"devDependencies": {
|
|
43
45
|
"typescript": "^5.3.0"
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { SpatialObjectId } from '@flighthq/types/contract';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
|
|
4
|
+
import { explainSpatialIndexing } from './explainSpatialIndexing';
|
|
5
|
+
import { createSpatialIndex, insertSpatialObject, removeSpatialObject, updateSpatialObject } from './spatialIndex';
|
|
6
|
+
import { MAX_INDEXED_CELLS_PER_OBJECT, createUniformGridSpatialBackend } from './uniformGrid';
|
|
7
|
+
|
|
8
|
+
describe('explainSpatialIndexing', () => {
|
|
9
|
+
it('reports absent for an id that was never inserted', () => {
|
|
10
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(10));
|
|
11
|
+
expect(explainSpatialIndexing(index, 42)).toEqual({ bucketCount: 0, id: 42, mode: 'absent', reason: null });
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('reports the bucket count of an ordinary object', () => {
|
|
15
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(10));
|
|
16
|
+
insertSpatialObject(index, 1, { minX: 0, minY: 0, maxX: 25, maxY: 25 });
|
|
17
|
+
// Covers cells 0..2 on each axis.
|
|
18
|
+
expect(explainSpatialIndexing(index, 1)).toEqual({ bucketCount: 9, id: 1, mode: 'cells', reason: null });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('reports overflow with no buckets for an oversized object', () => {
|
|
22
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(1));
|
|
23
|
+
insertSpatialObject(index, 1, { minX: 0, minY: 0, maxX: 1e6, maxY: 1e6 });
|
|
24
|
+
expect(explainSpatialIndexing(index, 1)).toEqual({ bucketCount: 0, id: 1, mode: 'overflow', reason: null });
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('reports declined with the reason for non-finite bounds', () => {
|
|
28
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(10));
|
|
29
|
+
insertSpatialObject(index, 1, { minX: 0, minY: 0, maxX: Infinity, maxY: 10 });
|
|
30
|
+
expect(explainSpatialIndexing(index, 1)).toEqual({
|
|
31
|
+
bucketCount: 0,
|
|
32
|
+
id: 1,
|
|
33
|
+
mode: 'declined',
|
|
34
|
+
reason: 'non-finite-bounds',
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('returns to absent after a remove', () => {
|
|
39
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(10));
|
|
40
|
+
insertSpatialObject(index, 1, { minX: 0, minY: 0, maxX: 5, maxY: 5 });
|
|
41
|
+
removeSpatialObject(index, 1);
|
|
42
|
+
expect(explainSpatialIndexing(index, 1).mode).toBe('absent');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('tracks the mode across updates', () => {
|
|
46
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(1));
|
|
47
|
+
insertSpatialObject(index, 1, { minX: 0, minY: 0, maxX: 2, maxY: 2 });
|
|
48
|
+
expect(explainSpatialIndexing(index, 1).mode).toBe('cells');
|
|
49
|
+
updateSpatialObject(index, 1, { minX: 0, minY: 0, maxX: 1e9, maxY: 1e9 });
|
|
50
|
+
expect(explainSpatialIndexing(index, 1).mode).toBe('overflow');
|
|
51
|
+
updateSpatialObject(index, 1, { minX: NaN, minY: 0, maxX: 2, maxY: 2 });
|
|
52
|
+
expect(explainSpatialIndexing(index, 1).mode).toBe('declined');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('never exceeds the per-object bucket budget it exists to measure', () => {
|
|
56
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(1));
|
|
57
|
+
const ids: SpatialObjectId[] = [];
|
|
58
|
+
for (let i = 0; i < 8; i++) {
|
|
59
|
+
const extent = 10 ** i;
|
|
60
|
+
insertSpatialObject(index, i, { minX: 0, minY: 0, maxX: extent, maxY: extent });
|
|
61
|
+
ids.push(i);
|
|
62
|
+
}
|
|
63
|
+
for (const id of ids) {
|
|
64
|
+
expect(explainSpatialIndexing(index, id).bucketCount).toBeLessThanOrEqual(MAX_INDEXED_CELLS_PER_OBJECT);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('mutates nothing — repeated calls report the same thing', () => {
|
|
69
|
+
const index = createSpatialIndex(createUniformGridSpatialBackend(10));
|
|
70
|
+
insertSpatialObject(index, 1, { minX: 0, minY: 0, maxX: 5, maxY: 5 });
|
|
71
|
+
const first = explainSpatialIndexing(index, 1);
|
|
72
|
+
expect(explainSpatialIndexing(index, 1)).toEqual(first);
|
|
73
|
+
expect(explainSpatialIndexing(index, 99).mode).toBe('absent');
|
|
74
|
+
expect(explainSpatialIndexing(index, 1)).toEqual(first);
|
|
75
|
+
});
|
|
76
|
+
});
|