@drawcall/lod 0.1.2 → 0.2.0
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 +10 -69
- package/dist/at.d.ts +2 -0
- package/dist/at.js +8 -0
- package/dist/at.js.map +1 -0
- package/dist/baked/codec.d.ts +6 -3
- package/dist/baked/codec.js +22 -16
- package/dist/baked/codec.js.map +1 -1
- package/dist/baked/index.d.ts +4 -0
- package/dist/baked/index.js +2 -2
- package/dist/baked/index.js.map +1 -1
- package/dist/baked/low.d.ts +2 -2
- package/dist/baked/low.js +4 -4
- package/dist/baked/low.js.map +1 -1
- package/dist/bounds.d.ts +12 -2
- package/dist/bounds.js +72 -10
- package/dist/bounds.js.map +1 -1
- package/dist/compile.d.ts +4 -0
- package/dist/compile.js +100 -0
- package/dist/compile.js.map +1 -0
- package/dist/deferred.d.ts +12 -0
- package/dist/deferred.js +27 -0
- package/dist/deferred.js.map +1 -0
- package/dist/dispose.d.ts +7 -3
- package/dist/dispose.js +33 -4
- package/dist/dispose.js.map +1 -1
- package/dist/fade.d.ts +5 -13
- package/dist/fade.js +62 -28
- package/dist/fade.js.map +1 -1
- package/dist/impostor/bake/index.d.ts +1 -0
- package/dist/impostor/bake/index.js +1 -0
- package/dist/impostor/bake/index.js.map +1 -1
- package/dist/impostor/bake/materials.js +11 -1
- package/dist/impostor/bake/materials.js.map +1 -1
- package/dist/impostor/codec.d.ts +2 -7
- package/dist/impostor/codec.js +16 -27
- package/dist/impostor/codec.js.map +1 -1
- package/dist/impostor/mesh/card.js +4 -1
- package/dist/impostor/mesh/card.js.map +1 -1
- package/dist/impostor/mesh/index.d.ts +6 -4
- package/dist/impostor/mesh/index.js +8 -10
- package/dist/impostor/mesh/index.js.map +1 -1
- package/dist/impostor/mesh/material.d.ts +7 -5
- package/dist/impostor/mesh/material.js +29 -26
- package/dist/impostor/mesh/material.js.map +1 -1
- package/dist/impostor/mesh/surface.d.ts +20 -16
- package/dist/impostor/mesh/surface.js +74 -55
- package/dist/impostor/mesh/surface.js.map +1 -1
- package/dist/impostor/octahedral.d.ts +1 -8
- package/dist/impostor/octahedral.js +3 -18
- package/dist/impostor/octahedral.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/instanced/args.js +2 -2
- package/dist/instanced/args.js.map +1 -1
- package/dist/instanced/{bounds.d.ts → blocks.d.ts} +25 -9
- package/dist/instanced/{bounds.js → blocks.js} +76 -53
- package/dist/instanced/blocks.js.map +1 -0
- package/dist/instanced/dirty.d.ts +3 -0
- package/dist/instanced/dirty.js +40 -5
- package/dist/instanced/dirty.js.map +1 -1
- package/dist/instanced/index.d.ts +25 -51
- package/dist/instanced/index.js +189 -413
- package/dist/instanced/index.js.map +1 -1
- package/dist/instanced/meshes.d.ts +54 -13
- package/dist/instanced/meshes.js +178 -41
- package/dist/instanced/meshes.js.map +1 -1
- package/dist/instanced/parts.d.ts +14 -0
- package/dist/instanced/parts.js +79 -0
- package/dist/instanced/parts.js.map +1 -0
- package/dist/instanced/raycast.d.ts +13 -0
- package/dist/instanced/raycast.js +53 -0
- package/dist/instanced/raycast.js.map +1 -0
- package/dist/instanced/select.d.ts +17 -9
- package/dist/instanced/select.js +114 -63
- package/dist/instanced/select.js.map +1 -1
- package/dist/instanced/store.d.ts +31 -0
- package/dist/instanced/store.js +96 -0
- package/dist/instanced/store.js.map +1 -0
- package/dist/levels.d.ts +71 -48
- package/dist/levels.js +99 -74
- package/dist/levels.js.map +1 -1
- package/dist/loader/bundle.d.ts +25 -0
- package/dist/loader/bundle.js +241 -0
- package/dist/loader/bundle.js.map +1 -0
- package/dist/loader/cache.d.ts +15 -15
- package/dist/loader/cache.js +71 -33
- package/dist/loader/cache.js.map +1 -1
- package/dist/loader/provenance.d.ts +30 -0
- package/dist/loader/provenance.js +105 -0
- package/dist/loader/provenance.js.map +1 -0
- package/dist/loader/url.d.ts +13 -0
- package/dist/loader/url.js +31 -0
- package/dist/loader/url.js.map +1 -0
- package/dist/loader.d.ts +30 -74
- package/dist/loader.js +191 -186
- package/dist/loader.js.map +1 -1
- package/dist/lod.d.ts +20 -31
- package/dist/lod.js +105 -96
- package/dist/lod.js.map +1 -1
- package/dist/material.js +9 -4
- package/dist/material.js.map +1 -1
- package/dist/mesh/codec.d.ts +4 -0
- package/dist/mesh/codec.js +192 -0
- package/dist/mesh/codec.js.map +1 -0
- package/dist/queue.d.ts +2 -0
- package/dist/queue.js +33 -0
- package/dist/queue.js.map +1 -0
- package/dist/residency.d.ts +44 -0
- package/dist/residency.js +205 -0
- package/dist/residency.js.map +1 -0
- package/dist/simplify.js +5 -3
- package/dist/simplify.js.map +1 -1
- package/dist/source/{error.d.ts → deviation.d.ts} +3 -3
- package/dist/source/{error.js → deviation.js} +6 -6
- package/dist/source/deviation.js.map +1 -0
- package/dist/source/source.d.ts +1 -1
- package/dist/source/source.js +1 -1
- package/dist/three.d.ts +17 -5
- package/dist/three.js +24 -3
- package/dist/three.js.map +1 -1
- package/dist/tsl.d.ts +5 -5
- package/dist/tsl.js +12 -19
- package/dist/tsl.js.map +1 -1
- package/dist/view.d.ts +16 -1
- package/dist/view.js +57 -1
- package/dist/view.js.map +1 -1
- package/dist/wind/index.d.ts +2 -2
- package/dist/wind/index.js +31 -28
- package/dist/wind/index.js.map +1 -1
- package/dist/wind/sway.d.ts +2 -1
- package/package.json +9 -3
- package/skills/lod/SKILL.md +71 -109
- package/dist/impostor/cache.d.ts +0 -15
- package/dist/impostor/cache.js +0 -44
- package/dist/impostor/cache.js.map +0 -1
- package/dist/instanced/bounds.js.map +0 -1
- package/dist/lazy.d.ts +0 -64
- package/dist/lazy.js +0 -187
- package/dist/lazy.js.map +0 -1
- package/dist/loader/dispose.d.ts +0 -3
- package/dist/loader/dispose.js +0 -25
- package/dist/loader/dispose.js.map +0 -1
- package/dist/source/error.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Box3, Matrix4, Sphere, Vector3 } from "three/webgpu";
|
|
2
|
-
import { FADE } from "../levels.js";
|
|
2
|
+
import { FADE, DEMAND, lastFitting } from "../levels.js";
|
|
3
|
+
import { at } from "../at.js";
|
|
3
4
|
import { Dirty } from "./dirty.js";
|
|
4
5
|
// Cover float32 matrix products, distances and threshold arithmetic. Near a switch,
|
|
5
6
|
// uncertain blocks keep both levels and cannot reuse a previous GPU selection.
|
|
@@ -8,18 +9,18 @@ const matrix = new Matrix4();
|
|
|
8
9
|
const point = new Vector3();
|
|
9
10
|
const extent = new Vector3();
|
|
10
11
|
/** Cached spatial blocks: instance edits refit leaves; moving views visit only blocks. */
|
|
11
|
-
export class
|
|
12
|
+
export class Blocks {
|
|
12
13
|
matrices;
|
|
13
14
|
spheres;
|
|
14
15
|
source;
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
bounds;
|
|
17
|
+
rest;
|
|
17
18
|
block;
|
|
18
19
|
leaves;
|
|
19
20
|
tree;
|
|
20
21
|
dirty;
|
|
21
22
|
radii;
|
|
22
|
-
|
|
23
|
+
roundoff;
|
|
23
24
|
unsafe;
|
|
24
25
|
levelBoxes = [];
|
|
25
26
|
token = {};
|
|
@@ -28,14 +29,16 @@ export class Bounds {
|
|
|
28
29
|
low = 0;
|
|
29
30
|
high = 0;
|
|
30
31
|
padding = 0;
|
|
31
|
-
constructor(matrices, spheres, source,
|
|
32
|
+
constructor(matrices, spheres, source,
|
|
33
|
+
/** Set to enclose every instance on refit. */
|
|
34
|
+
bounds, draws,
|
|
32
35
|
/** Radius enclosing every placed level about source.center. */
|
|
33
|
-
|
|
36
|
+
rest) {
|
|
34
37
|
this.matrices = matrices;
|
|
35
38
|
this.spheres = spheres;
|
|
36
39
|
this.source = source;
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
40
|
+
this.bounds = bounds;
|
|
41
|
+
this.rest = rest;
|
|
39
42
|
const count = matrices.length / 16;
|
|
40
43
|
// Fine leaves avoid many empty draws in small, multipart crowds. Large crowds
|
|
41
44
|
// retain bounded block traversal rather than inspecting every instance per view.
|
|
@@ -53,7 +56,7 @@ export class Bounds {
|
|
|
53
56
|
}));
|
|
54
57
|
this.dirty = new Dirty(Math.ceil(count / this.block));
|
|
55
58
|
this.radii = new Float64Array(count);
|
|
56
|
-
this.
|
|
59
|
+
this.roundoff = new Float64Array(count);
|
|
57
60
|
this.unsafe = new Uint8Array(count);
|
|
58
61
|
}
|
|
59
62
|
/** Measure changed matrices, retaining the GPU's max-axis radius for LOD selection. */
|
|
@@ -67,11 +70,11 @@ export class Bounds {
|
|
|
67
70
|
.toArray(this.spheres, i * 4);
|
|
68
71
|
const axis = matrix.getMaxScaleOnAxis();
|
|
69
72
|
this.spheres[i * 4 + 3] = radius * axis;
|
|
70
|
-
this.radii[i] = this.
|
|
73
|
+
this.radii[i] = this.rest.radius * stretch(matrix);
|
|
71
74
|
const e = matrix.elements;
|
|
72
75
|
// Absolute terms also cover cancellation in the shader's transformed center.
|
|
73
|
-
const terms = Math.max(Math.abs(e[0] * center.x) + Math.abs(e[4] * center.y) + Math.abs(e[8] * center.z) + Math.abs(e[12]), Math.abs(e[1] * center.x) + Math.abs(e[5] * center.y) + Math.abs(e[9] * center.z) + Math.abs(e[13]), Math.abs(e[2] * center.x) + Math.abs(e[6] * center.y) + Math.abs(e[10] * center.z) + Math.abs(e[14]), radius, this.
|
|
74
|
-
this.
|
|
76
|
+
const terms = Math.max(Math.abs(e[0] * center.x) + Math.abs(e[4] * center.y) + Math.abs(e[8] * center.z) + Math.abs(e[12]), Math.abs(e[1] * center.x) + Math.abs(e[5] * center.y) + Math.abs(e[9] * center.z) + Math.abs(e[13]), Math.abs(e[2] * center.x) + Math.abs(e[6] * center.y) + Math.abs(e[10] * center.z) + Math.abs(e[14]), radius, this.rest.radius);
|
|
77
|
+
this.roundoff[i] = ROUND * Math.sqrt(3) * terms;
|
|
75
78
|
// WGSL length squares its inputs. Guard the intermediates, not only the final
|
|
76
79
|
// screen height: infinity / infinity would select level zero, not the CPU tier.
|
|
77
80
|
this.unsafe[i] = Number(unsafe(axis) || unsafe(radius) || terms > 1e15 || !Number.isFinite(terms));
|
|
@@ -103,7 +106,7 @@ export class Bounds {
|
|
|
103
106
|
last = Math.ceil(last / 2);
|
|
104
107
|
}
|
|
105
108
|
});
|
|
106
|
-
enclosing(at(this.tree, 1).geometry, this.
|
|
109
|
+
enclosing(at(this.tree, 1).geometry, this.bounds);
|
|
107
110
|
}
|
|
108
111
|
leaf(node, block) {
|
|
109
112
|
node.geometry.makeEmpty();
|
|
@@ -118,10 +121,10 @@ export class Bounds {
|
|
|
118
121
|
if (radius === 0 && !at(this.unsafe, i))
|
|
119
122
|
continue;
|
|
120
123
|
node.unsafe ||= Boolean(at(this.unsafe, i));
|
|
121
|
-
const
|
|
122
|
-
const reach = at(this.radii, i) * (1 + this.padding) +
|
|
124
|
+
const roundoff = at(this.roundoff, i);
|
|
125
|
+
const reach = at(this.radii, i) * (1 + this.padding) + roundoff;
|
|
123
126
|
point.fromArray(this.spheres, i * 4);
|
|
124
|
-
expand(node.centers, point,
|
|
127
|
+
expand(node.centers, point, roundoff);
|
|
125
128
|
expand(node.geometry, point, reach);
|
|
126
129
|
node.smallest = Math.min(node.smallest, radius);
|
|
127
130
|
node.largest = Math.max(node.largest, radius);
|
|
@@ -144,19 +147,43 @@ export class Bounds {
|
|
|
144
147
|
}
|
|
145
148
|
/** Level bounds plus a token only when every block has an unchanged solid choice. */
|
|
146
149
|
select(levels, view, reaches, measured, root) {
|
|
147
|
-
|
|
148
|
-
this.levelBoxes.push(new Box3());
|
|
149
|
-
for (const box of this.levelBoxes)
|
|
150
|
-
box.makeEmpty();
|
|
150
|
+
this.resetBoxes(levels);
|
|
151
151
|
this.complete = measured;
|
|
152
152
|
this.changed = false;
|
|
153
|
-
if (!this.
|
|
153
|
+
if (!this.bounds.isEmpty()) {
|
|
154
154
|
if (measured)
|
|
155
155
|
this.visit(1, levels, view);
|
|
156
156
|
else
|
|
157
157
|
for (const box of this.levelBoxes)
|
|
158
158
|
box.copy(at(this.tree, 1).geometry);
|
|
159
159
|
}
|
|
160
|
+
this.enclose(levels, view, reaches, root, measured, 1);
|
|
161
|
+
if (!this.complete)
|
|
162
|
+
return undefined;
|
|
163
|
+
if (this.changed)
|
|
164
|
+
this.token = {};
|
|
165
|
+
return this.token;
|
|
166
|
+
}
|
|
167
|
+
/** Ahead-of-view demand without changing solid selections or their reuse token. */
|
|
168
|
+
demand(levels, view, reaches, root) {
|
|
169
|
+
this.resetBoxes(levels);
|
|
170
|
+
this.gather(1, levels, view);
|
|
171
|
+
this.enclose(levels, view, reaches, root, true, DEMAND);
|
|
172
|
+
}
|
|
173
|
+
gather(index, levels, view) {
|
|
174
|
+
const node = at(this.tree, index);
|
|
175
|
+
if (node.geometry.isEmpty())
|
|
176
|
+
return;
|
|
177
|
+
const [finest, coarsest] = this.span(node, levels, view, DEMAND);
|
|
178
|
+
if (finest !== coarsest && index < this.leaves) {
|
|
179
|
+
this.gather(index * 2, levels, view);
|
|
180
|
+
this.gather(index * 2 + 1, levels, view);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
for (let level = finest; level <= coarsest; level++)
|
|
184
|
+
at(this.levelBoxes, level).union(node.geometry);
|
|
185
|
+
}
|
|
186
|
+
enclose(levels, view, reaches, root, measured, margin) {
|
|
160
187
|
const top = at(this.tree, 1);
|
|
161
188
|
const axis = root.getMaxScaleOnAxis();
|
|
162
189
|
// Three transforms a culling sphere by max-axis scale, which underbounds shear.
|
|
@@ -165,7 +192,7 @@ export class Bounds {
|
|
|
165
192
|
enclosing(at(this.levelBoxes, level), sphere);
|
|
166
193
|
const next = levels[level + 1];
|
|
167
194
|
if (measured && !top.unsafe && !unsafe(view.scale) && view.eye.length() < 1e15 && !sphere.isEmpty() && !view.ortho && view.forced === null && next) {
|
|
168
|
-
const threshold = next.maxPixels * (view.fades ? 1 - FADE : 1);
|
|
195
|
+
const threshold = next.maxPixels * (view.fades ? 1 - FADE : 1) * margin;
|
|
169
196
|
const radius = (2 * top.largest * view.scale * (1 + ROUND * 4)) / threshold + top.reach + view.eye.length() * ROUND;
|
|
170
197
|
if (radius < sphere.radius)
|
|
171
198
|
sphere.set(view.eye, radius);
|
|
@@ -173,25 +200,12 @@ export class Bounds {
|
|
|
173
200
|
if (!sphere.isEmpty())
|
|
174
201
|
sphere.radius *= dilation;
|
|
175
202
|
});
|
|
176
|
-
if (!this.complete)
|
|
177
|
-
return undefined;
|
|
178
|
-
if (this.changed)
|
|
179
|
-
this.token = {};
|
|
180
|
-
return this.token;
|
|
181
203
|
}
|
|
182
204
|
visit(index, levels, view) {
|
|
183
205
|
const node = at(this.tree, index);
|
|
184
206
|
if (node.geometry.isEmpty())
|
|
185
207
|
return;
|
|
186
|
-
this.
|
|
187
|
-
const low = this.low;
|
|
188
|
-
const high = this.high;
|
|
189
|
-
// Infinity marks an unsafe float32 interval; even legal infinite thresholds
|
|
190
|
-
// cannot exclude the source when the GPU's height may be NaN.
|
|
191
|
-
let finest = view.forced ?? (high === Infinity ? 0 : fitting(levels, high));
|
|
192
|
-
const coarsest = view.forced ?? fitting(levels, low);
|
|
193
|
-
if (view.fades && finest > 0 && high >= at(levels, finest).maxPixels * (1 - FADE) * (1 - ROUND))
|
|
194
|
-
finest--;
|
|
208
|
+
const [finest, coarsest] = this.span(node, levels, view, 1);
|
|
195
209
|
if (finest === coarsest) {
|
|
196
210
|
this.changed ||= node.solid !== finest;
|
|
197
211
|
node.solid = finest;
|
|
@@ -211,11 +225,32 @@ export class Bounds {
|
|
|
211
225
|
for (let level = finest; level <= coarsest; level++)
|
|
212
226
|
at(this.levelBoxes, level).union(node.geometry);
|
|
213
227
|
}
|
|
228
|
+
resetBoxes(levels) {
|
|
229
|
+
while (this.levelBoxes.length < levels.length)
|
|
230
|
+
this.levelBoxes.push(new Box3());
|
|
231
|
+
for (const box of this.levelBoxes)
|
|
232
|
+
box.makeEmpty();
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The finest and coarsest levels `node` may draw, fade partner included, with heights
|
|
236
|
+
* widened by `margin` for demand. Must match the GPU's selection and `levelOf`.
|
|
237
|
+
*/
|
|
238
|
+
span(node, levels, view, margin) {
|
|
239
|
+
this.interval(node, view);
|
|
240
|
+
const high = this.high / margin;
|
|
241
|
+
// Infinity marks an unsafe float32 interval; even legal infinite thresholds
|
|
242
|
+
// cannot exclude the source when the GPU's height may be NaN.
|
|
243
|
+
let finest = view.forced ?? (high === Infinity ? 0 : lastFitting(levels, high));
|
|
244
|
+
const coarsest = view.forced ?? lastFitting(levels, this.low);
|
|
245
|
+
if (view.fades && finest > 0 && high >= at(levels, finest).maxPixels * (1 - FADE) * (1 - ROUND))
|
|
246
|
+
finest--;
|
|
247
|
+
return [finest, coarsest];
|
|
248
|
+
}
|
|
214
249
|
interval(node, view) {
|
|
215
250
|
const distance = node.sphere.center.distanceTo(view.eye);
|
|
216
|
-
const
|
|
217
|
-
const near = view.ortho ? 1 : Math.max(distance - node.sphere.radius -
|
|
218
|
-
const far = view.ortho ? 1 : Math.max(distance + node.sphere.radius +
|
|
251
|
+
const roundoff = view.eye.length() * ROUND;
|
|
252
|
+
const near = view.ortho ? 1 : Math.max(distance - node.sphere.radius - roundoff, 1e-6);
|
|
253
|
+
const far = view.ortho ? 1 : Math.max(distance + node.sphere.radius + roundoff, 1e-6);
|
|
219
254
|
this.low = ((2 * node.smallest * view.scale) / far) * (1 - ROUND * 4);
|
|
220
255
|
this.high = ((2 * node.largest * view.scale) / near) * (1 + ROUND * 4);
|
|
221
256
|
// Float32 overflow/underflow can invalidate a real-number interval. Keep all
|
|
@@ -240,22 +275,10 @@ export function stretch(matrix) {
|
|
|
240
275
|
const yz = Math.abs(e[4] * e[8] + e[5] * e[9] + e[6] * e[10]);
|
|
241
276
|
return Math.sqrt(Math.max(e[0] ** 2 + e[1] ** 2 + e[2] ** 2 + xy + xz, e[4] ** 2 + e[5] ** 2 + e[6] ** 2 + xy + yz, e[8] ** 2 + e[9] ** 2 + e[10] ** 2 + xz + yz));
|
|
242
277
|
}
|
|
243
|
-
function fitting(levels, height) {
|
|
244
|
-
for (let i = levels.length - 1; i > 0; i--)
|
|
245
|
-
if (height <= at(levels, i).maxPixels)
|
|
246
|
-
return i;
|
|
247
|
-
return 0;
|
|
248
|
-
}
|
|
249
278
|
function expand(box, center, radius) {
|
|
250
279
|
box.expandByPoint(extent.copy(center).addScalar(-radius));
|
|
251
280
|
box.expandByPoint(extent.copy(center).addScalar(radius));
|
|
252
281
|
}
|
|
253
|
-
function at(values, index) {
|
|
254
|
-
const value = values[index];
|
|
255
|
-
if (value === undefined)
|
|
256
|
-
throw new Error(`InstancedLod bounds: index ${index} out of range`);
|
|
257
|
-
return value;
|
|
258
|
-
}
|
|
259
282
|
// These broad limits stay well inside float32's squared-length and product range.
|
|
260
283
|
// Outside them, retain all levels and let the GPU make the original selection.
|
|
261
284
|
function unsafe(value) {
|
|
@@ -268,4 +291,4 @@ function enclosing(box, sphere) {
|
|
|
268
291
|
sphere.radius = Infinity;
|
|
269
292
|
}
|
|
270
293
|
}
|
|
271
|
-
//# sourceMappingURL=
|
|
294
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/instanced/blocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BufferAttribute } from "three/webgpu";
|
|
1
2
|
/** Changed indices, drained as ordered runs without scanning unchanged instances. */
|
|
2
3
|
export declare class Dirty {
|
|
3
4
|
private readonly count;
|
|
@@ -10,3 +11,5 @@ export declare class Dirty {
|
|
|
10
11
|
/** End is exclusive. Edits made by the visitor are not supported. */
|
|
11
12
|
drain(visit: (start: number, end: number) => void): void;
|
|
12
13
|
}
|
|
14
|
+
/** Union pending uploads, including repeated edits while a crowd is not drawn. */
|
|
15
|
+
export declare function upload(attribute: BufferAttribute, start: number, end: number): void;
|
package/dist/instanced/dirty.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { at } from "../at.js";
|
|
1
2
|
/** Changed indices, drained as ordered runs without scanning unchanged instances. */
|
|
2
3
|
export class Dirty {
|
|
3
4
|
count;
|
|
@@ -52,10 +53,44 @@ export class Dirty {
|
|
|
52
53
|
visit(start, end);
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
/** Union pending uploads, including repeated edits while a crowd is not drawn. */
|
|
57
|
+
export function upload(attribute, start, end) {
|
|
58
|
+
start *= attribute.itemSize;
|
|
59
|
+
end *= attribute.itemSize;
|
|
60
|
+
const ranges = attribute.updateRanges;
|
|
61
|
+
let low = 0;
|
|
62
|
+
let high = ranges.length;
|
|
63
|
+
while (low < high) {
|
|
64
|
+
const middle = (low + high) >>> 1;
|
|
65
|
+
const range = at(ranges, middle);
|
|
66
|
+
if (range.start + range.count < start)
|
|
67
|
+
low = middle + 1;
|
|
68
|
+
else
|
|
69
|
+
high = middle;
|
|
70
|
+
}
|
|
71
|
+
const first = ranges[low];
|
|
72
|
+
if (!first || first.start > end) {
|
|
73
|
+
const range = { start, count: end - start };
|
|
74
|
+
if (low === ranges.length)
|
|
75
|
+
ranges.push(range);
|
|
76
|
+
else
|
|
77
|
+
ranges.splice(low, 0, range);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
end = Math.max(end, first.start + first.count);
|
|
81
|
+
first.start = Math.min(start, first.start);
|
|
82
|
+
let next = low + 1;
|
|
83
|
+
while (next < ranges.length) {
|
|
84
|
+
const range = at(ranges, next);
|
|
85
|
+
if (range.start > end)
|
|
86
|
+
break;
|
|
87
|
+
end = Math.max(end, range.start + range.count);
|
|
88
|
+
next++;
|
|
89
|
+
}
|
|
90
|
+
first.count = end - first.start;
|
|
91
|
+
if (next > low + 1)
|
|
92
|
+
ranges.splice(low + 1, next - low - 1);
|
|
93
|
+
}
|
|
94
|
+
attribute.needsUpdate = true;
|
|
60
95
|
}
|
|
61
96
|
//# sourceMappingURL=dirty.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../src/instanced/dirty.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../src/instanced/dirty.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,qFAAqF;AACrF,MAAM,OAAO,KAAK;IAIa;IAHZ,IAAI,CAAc;IAClB,KAAK,GAAa,EAAE,CAAC;IAEtC,YAA6B,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAAC,KAAa;QACf,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO;QACzB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,GAAG;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;IACzH,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,KAA2C;QAC/C,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACf,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxD,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;gBACjB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBAClB,GAAG,EAAE,CAAC;oBACN,SAAS;gBACX,CAAC;gBACD,IAAI,KAAK,IAAI,CAAC;oBAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAClC,KAAK,GAAG,KAAK,CAAC;gBACd,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACtB,IAAI,KAAK,IAAI,CAAC;YAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,UAAU,MAAM,CAAC,SAA0B,EAAE,KAAa,EAAE,GAAW;IAC3E,KAAK,IAAI,SAAS,CAAC,QAAQ,CAAC;IAC5B,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK;YAAE,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;;YACnD,IAAI,GAAG,MAAM,CAAC;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,KAAK,EAAE,CAAC;QAC5C,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YACzC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,KAAK,GAAG,GAAG;gBAAE,MAAM;YAC7B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,EAAE,CAAC;QACT,CAAC;QACD,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;QAChC,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;AAC/B,CAAC"}
|
|
@@ -1,26 +1,19 @@
|
|
|
1
1
|
import { type Color, Matrix4, Object3D, Sphere, type Camera, type Intersection, type Raycaster } from "three/webgpu";
|
|
2
|
-
import { type LodLevel } from "../levels.js";
|
|
3
|
-
import { type LevelsEventMap } from "../
|
|
2
|
+
import { type LevelView, type LodLevel } from "../levels.js";
|
|
3
|
+
import { type LevelsEventMap } from "../residency.js";
|
|
4
4
|
import { WIND_BOUNDS } from "../wind/hooks.js";
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* the dither. Thresholds, `forceLevel`, `Lod.quality`, `Lod.debug` and shadows work as
|
|
11
|
-
* for `Lod`; nothing of an instance is drawn into a directional light's shadow map whose
|
|
12
|
-
* texels are wider than it. Each level is culled by the crowd's bounds, tightened for
|
|
13
|
-
* finer levels to the region near the camera where their instances can draw.
|
|
6
|
+
* Independently selected copies of one object, batched into indirect draws per view.
|
|
7
|
+
* Thresholds, fades, global settings and shadows follow Lod. Each level's bounds tighten
|
|
8
|
+
* to the region where its instances can draw. Instance matrices may scale arbitrarily;
|
|
9
|
+
* the crowd's own transform and its parents should scale uniformly. Scale 0 draws nothing.
|
|
14
10
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* may scale any way.
|
|
11
|
+
* Level templates are cloned, then their meshes are instanced. Skinned meshes,
|
|
12
|
+
* InstancedMeshes (except ImpostorMesh) and nested Lods are unsupported. For external
|
|
13
|
+
* detail, leave level 0 empty and draw the instances that `levelOf` reports there.
|
|
19
14
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* ImpostorMesh) or nested Lods. To build a hierarchy on top, leave level 0 empty (see
|
|
23
|
-
* `Lod`) and draw the detail of the instances `levelOf` reports at level 0 yourself.
|
|
15
|
+
* Requires WebGPU `indirect-first-instance`. Sequential cameras are supported; nested
|
|
16
|
+
* renders replace the outer selection, so exclude this crowd with camera layers.
|
|
24
17
|
*/
|
|
25
18
|
export declare class InstancedLod extends Object3D<LevelsEventMap> {
|
|
26
19
|
readonly isLOD = true;
|
|
@@ -29,22 +22,15 @@ export declare class InstancedLod extends Object3D<LevelsEventMap> {
|
|
|
29
22
|
autoUpdate: boolean;
|
|
30
23
|
/** Draw only this level for every instance, without fades. */
|
|
31
24
|
forceLevel: number | null;
|
|
32
|
-
readonly levels: readonly
|
|
25
|
+
readonly levels: readonly LevelView[];
|
|
33
26
|
readonly count: number;
|
|
34
27
|
private readonly entries;
|
|
35
|
-
/** Per level, the meshes drawing it. */
|
|
36
|
-
private readonly meshes;
|
|
37
28
|
private readonly probes;
|
|
38
29
|
private selection;
|
|
39
|
-
private
|
|
40
|
-
private readonly
|
|
30
|
+
private meshes;
|
|
31
|
+
private readonly residency;
|
|
41
32
|
private disposed;
|
|
42
|
-
|
|
43
|
-
private readonly matrices;
|
|
44
|
-
/** Instance colours, 4 floats each, once `setColorAt` was called. */
|
|
45
|
-
private colors;
|
|
46
|
-
/** Each instance's bounding sphere, centre and radius, in the InstancedLod's space. */
|
|
47
|
-
private readonly spheres;
|
|
33
|
+
private readonly store;
|
|
48
34
|
/** Bounding sphere of the source in an instance's space. */
|
|
49
35
|
private readonly sphere;
|
|
50
36
|
/** Every placed level, kept separate from the source sphere used for LOD selection. */
|
|
@@ -58,44 +44,35 @@ export declare class InstancedLod extends Object3D<LevelsEventMap> {
|
|
|
58
44
|
private readonly demand;
|
|
59
45
|
/** Source-radius padding for the shadow caster cutoff; culling pads every level separately. */
|
|
60
46
|
private padding;
|
|
61
|
-
private readonly matrixChanges;
|
|
62
|
-
private readonly colorChanges;
|
|
63
47
|
private blocks;
|
|
64
48
|
private readonly last;
|
|
49
|
+
get pending(): boolean;
|
|
50
|
+
get error(): Error | undefined;
|
|
65
51
|
/** `levels[0]` is the source. Empty only as the target of `copy`. */
|
|
66
|
-
constructor(levels?:
|
|
52
|
+
constructor(levels?: readonly LodLevel[], count?: number);
|
|
67
53
|
private build;
|
|
68
|
-
/**
|
|
69
|
-
private
|
|
70
|
-
/**
|
|
54
|
+
/** Compile only the arriving level; bounds and instance buffers stay fixed. */
|
|
55
|
+
private install;
|
|
56
|
+
/** Metadata includes unloaded levels, so later arrivals cannot enlarge this envelope. */
|
|
71
57
|
private boundLevels;
|
|
72
|
-
/** Material group `group` of `template` drawn for every instance in `level`'s slots, from indirect draw arguments at byte `offset`. */
|
|
73
|
-
private instance;
|
|
74
|
-
private bind;
|
|
75
58
|
setMatrixAt(index: number, matrix: Matrix4): void;
|
|
76
59
|
getMatrixAt(index: number, matrix: Matrix4): Matrix4;
|
|
77
60
|
/** Tint instance `index` by `color`, as InstancedMesh.setColorAt does, in every level. */
|
|
78
61
|
setColorAt(index: number, color: Color): void;
|
|
79
62
|
/** Instance `index`'s colour: white unless set. */
|
|
80
63
|
getColorAt(index: number, color: Color): Color;
|
|
81
|
-
/** Carry `colors` with the instances from now on: every level's meshes draw them. */
|
|
82
|
-
private useColors;
|
|
83
64
|
/**
|
|
84
65
|
* The finest level instance `index` drew in the last update, or null before the first
|
|
85
66
|
* (or at scale 0). Inside a fade the next coarser level draws too.
|
|
86
67
|
*/
|
|
87
68
|
levelOf(index: number): number | null;
|
|
88
|
-
private check;
|
|
89
69
|
/** Source radius padded for the level shaders' shadow caster cutoff. */
|
|
90
70
|
private get drawRadius();
|
|
91
71
|
[WIND_BOUNDS](padding: number, slope: number, baseY: number): void;
|
|
92
|
-
/**
|
|
93
|
-
private measure;
|
|
94
|
-
private measureChanges;
|
|
95
|
-
/** Sort the instances into levels for `camera`; three's renderer calls this itself while `autoUpdate`. */
|
|
72
|
+
/** Sort instances for `camera`; demand begins after its first drawing context exists. */
|
|
96
73
|
update(camera: Camera): void;
|
|
97
|
-
/**
|
|
98
|
-
private
|
|
74
|
+
/** Move each level's reach to the level that draws in its place: its fallback, and during a handover also its previous one. */
|
|
75
|
+
private reroute;
|
|
99
76
|
/**
|
|
100
77
|
* Hits every instance's source level, with `instanceId` set; `object` is this
|
|
101
78
|
* InstancedLod. Meshes of the source on layers the raycaster does not test are skipped.
|
|
@@ -107,10 +84,7 @@ export declare class InstancedLod extends Object3D<LevelsEventMap> {
|
|
|
107
84
|
*/
|
|
108
85
|
copy(source: InstancedLod): this;
|
|
109
86
|
clone(): this;
|
|
110
|
-
/**
|
|
111
|
-
* Frees every level, the source included, and the instanced meshes. Clones share
|
|
112
|
-
* geometry and textures, so dispose only once no clone draws any more.
|
|
113
|
-
*/
|
|
87
|
+
/** Release drawables and templates only after every owner sharing their geometry, materials and textures has stopped drawing. */
|
|
114
88
|
dispose(): void;
|
|
115
89
|
private clearDraws;
|
|
116
90
|
}
|