@drawcall/lod 0.1.0 → 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.
Files changed (147) hide show
  1. package/README.md +10 -69
  2. package/dist/at.d.ts +2 -0
  3. package/dist/at.js +8 -0
  4. package/dist/at.js.map +1 -0
  5. package/dist/baked/codec.d.ts +6 -3
  6. package/dist/baked/codec.js +22 -16
  7. package/dist/baked/codec.js.map +1 -1
  8. package/dist/baked/coverage.d.ts +3 -0
  9. package/dist/baked/coverage.js +45 -0
  10. package/dist/baked/coverage.js.map +1 -0
  11. package/dist/baked/index.d.ts +4 -0
  12. package/dist/baked/index.js +3 -35
  13. package/dist/baked/index.js.map +1 -1
  14. package/dist/baked/low.d.ts +2 -2
  15. package/dist/baked/low.js +4 -4
  16. package/dist/baked/low.js.map +1 -1
  17. package/dist/bounds.d.ts +12 -2
  18. package/dist/bounds.js +72 -10
  19. package/dist/bounds.js.map +1 -1
  20. package/dist/compile.d.ts +4 -0
  21. package/dist/compile.js +100 -0
  22. package/dist/compile.js.map +1 -0
  23. package/dist/deferred.d.ts +12 -0
  24. package/dist/deferred.js +27 -0
  25. package/dist/deferred.js.map +1 -0
  26. package/dist/dispose.d.ts +7 -3
  27. package/dist/dispose.js +33 -4
  28. package/dist/dispose.js.map +1 -1
  29. package/dist/fade.d.ts +5 -13
  30. package/dist/fade.js +62 -28
  31. package/dist/fade.js.map +1 -1
  32. package/dist/impostor/bake/index.d.ts +1 -0
  33. package/dist/impostor/bake/index.js +1 -0
  34. package/dist/impostor/bake/index.js.map +1 -1
  35. package/dist/impostor/bake/materials.js +11 -1
  36. package/dist/impostor/bake/materials.js.map +1 -1
  37. package/dist/impostor/codec.d.ts +2 -7
  38. package/dist/impostor/codec.js +16 -27
  39. package/dist/impostor/codec.js.map +1 -1
  40. package/dist/impostor/mesh/card.js +4 -1
  41. package/dist/impostor/mesh/card.js.map +1 -1
  42. package/dist/impostor/mesh/index.d.ts +6 -4
  43. package/dist/impostor/mesh/index.js +8 -10
  44. package/dist/impostor/mesh/index.js.map +1 -1
  45. package/dist/impostor/mesh/material.d.ts +7 -5
  46. package/dist/impostor/mesh/material.js +29 -26
  47. package/dist/impostor/mesh/material.js.map +1 -1
  48. package/dist/impostor/mesh/surface.d.ts +20 -16
  49. package/dist/impostor/mesh/surface.js +74 -55
  50. package/dist/impostor/mesh/surface.js.map +1 -1
  51. package/dist/impostor/octahedral.d.ts +1 -8
  52. package/dist/impostor/octahedral.js +3 -18
  53. package/dist/impostor/octahedral.js.map +1 -1
  54. package/dist/index.d.ts +7 -6
  55. package/dist/index.js +5 -4
  56. package/dist/index.js.map +1 -1
  57. package/dist/instanced/args.js +2 -2
  58. package/dist/instanced/args.js.map +1 -1
  59. package/dist/instanced/{bounds.d.ts → blocks.d.ts} +25 -9
  60. package/dist/instanced/{bounds.js → blocks.js} +76 -53
  61. package/dist/instanced/blocks.js.map +1 -0
  62. package/dist/instanced/dirty.d.ts +3 -0
  63. package/dist/instanced/dirty.js +40 -5
  64. package/dist/instanced/dirty.js.map +1 -1
  65. package/dist/instanced/index.d.ts +25 -51
  66. package/dist/instanced/index.js +189 -413
  67. package/dist/instanced/index.js.map +1 -1
  68. package/dist/instanced/meshes.d.ts +54 -13
  69. package/dist/instanced/meshes.js +178 -41
  70. package/dist/instanced/meshes.js.map +1 -1
  71. package/dist/instanced/parts.d.ts +14 -0
  72. package/dist/instanced/parts.js +79 -0
  73. package/dist/instanced/parts.js.map +1 -0
  74. package/dist/instanced/raycast.d.ts +13 -0
  75. package/dist/instanced/raycast.js +53 -0
  76. package/dist/instanced/raycast.js.map +1 -0
  77. package/dist/instanced/select.d.ts +17 -9
  78. package/dist/instanced/select.js +114 -63
  79. package/dist/instanced/select.js.map +1 -1
  80. package/dist/instanced/store.d.ts +31 -0
  81. package/dist/instanced/store.js +96 -0
  82. package/dist/instanced/store.js.map +1 -0
  83. package/dist/levels.d.ts +71 -48
  84. package/dist/levels.js +99 -74
  85. package/dist/levels.js.map +1 -1
  86. package/dist/loader/bundle.d.ts +25 -0
  87. package/dist/loader/bundle.js +241 -0
  88. package/dist/loader/bundle.js.map +1 -0
  89. package/dist/loader/cache.d.ts +15 -15
  90. package/dist/loader/cache.js +71 -33
  91. package/dist/loader/cache.js.map +1 -1
  92. package/dist/loader/provenance.d.ts +30 -0
  93. package/dist/loader/provenance.js +105 -0
  94. package/dist/loader/provenance.js.map +1 -0
  95. package/dist/loader/url.d.ts +13 -0
  96. package/dist/loader/url.js +31 -0
  97. package/dist/loader/url.js.map +1 -0
  98. package/dist/loader.d.ts +30 -74
  99. package/dist/loader.js +191 -186
  100. package/dist/loader.js.map +1 -1
  101. package/dist/lod.d.ts +20 -31
  102. package/dist/lod.js +105 -96
  103. package/dist/lod.js.map +1 -1
  104. package/dist/material.js +9 -4
  105. package/dist/material.js.map +1 -1
  106. package/dist/mesh/codec.d.ts +4 -0
  107. package/dist/mesh/codec.js +192 -0
  108. package/dist/mesh/codec.js.map +1 -0
  109. package/dist/queue.d.ts +2 -0
  110. package/dist/queue.js +33 -0
  111. package/dist/queue.js.map +1 -0
  112. package/dist/residency.d.ts +44 -0
  113. package/dist/residency.js +205 -0
  114. package/dist/residency.js.map +1 -0
  115. package/dist/simplify.js +5 -3
  116. package/dist/simplify.js.map +1 -1
  117. package/dist/source/{error.d.ts → deviation.d.ts} +3 -3
  118. package/dist/source/{error.js → deviation.js} +6 -6
  119. package/dist/source/deviation.js.map +1 -0
  120. package/dist/source/source.d.ts +1 -1
  121. package/dist/source/source.js +1 -1
  122. package/dist/three.d.ts +17 -5
  123. package/dist/three.js +24 -3
  124. package/dist/three.js.map +1 -1
  125. package/dist/tsl.d.ts +5 -5
  126. package/dist/tsl.js +12 -19
  127. package/dist/tsl.js.map +1 -1
  128. package/dist/view.d.ts +16 -1
  129. package/dist/view.js +57 -1
  130. package/dist/view.js.map +1 -1
  131. package/dist/wind/index.d.ts +2 -2
  132. package/dist/wind/index.js +31 -28
  133. package/dist/wind/index.js.map +1 -1
  134. package/dist/wind/sway.d.ts +2 -1
  135. package/package.json +9 -3
  136. package/skills/lod/SKILL.md +71 -109
  137. package/dist/impostor/cache.d.ts +0 -15
  138. package/dist/impostor/cache.js +0 -44
  139. package/dist/impostor/cache.js.map +0 -1
  140. package/dist/instanced/bounds.js.map +0 -1
  141. package/dist/lazy.d.ts +0 -64
  142. package/dist/lazy.js +0 -187
  143. package/dist/lazy.js.map +0 -1
  144. package/dist/loader/dispose.d.ts +0 -3
  145. package/dist/loader/dispose.js +0 -25
  146. package/dist/loader/dispose.js.map +0 -1
  147. 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 Bounds {
12
+ export class Blocks {
12
13
  matrices;
13
14
  spheres;
14
15
  source;
15
- sphere;
16
- geometry;
16
+ bounds;
17
+ rest;
17
18
  block;
18
19
  leaves;
19
20
  tree;
20
21
  dirty;
21
22
  radii;
22
- errors;
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, sphere, draws,
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
- geometry = source) {
36
+ rest) {
34
37
  this.matrices = matrices;
35
38
  this.spheres = spheres;
36
39
  this.source = source;
37
- this.sphere = sphere;
38
- this.geometry = geometry;
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.errors = new Float64Array(count);
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.geometry.radius * stretch(matrix);
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.geometry.radius);
74
- this.errors[i] = ROUND * Math.sqrt(3) * terms;
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.sphere);
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 error = at(this.errors, i);
122
- const reach = at(this.radii, i) * (1 + this.padding) + error;
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, error);
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
- while (this.levelBoxes.length < levels.length)
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.sphere.isEmpty()) {
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.interval(node, view);
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 error = view.eye.length() * ROUND;
217
- const near = view.ortho ? 1 : Math.max(distance - node.sphere.radius - error, 1e-6);
218
- const far = view.ortho ? 1 : Math.max(distance + node.sphere.radius + error, 1e-6);
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=bounds.js.map
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;
@@ -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
- function at(values, index) {
56
- const value = values[index];
57
- if (value === undefined)
58
- throw new Error(`Dirty: index ${index} out of range`);
59
- return value;
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":"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"}
1
+ {"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../src/instanced/dirty.ts"],"names":[],"mappings":"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"}
@@ -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 "../lazy.js";
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
- * `count` copies of one object with levels of detail, each switched by its own height on
7
- * screen: `Lod` for instances. The GPU sorts the instances into levels once per view
8
- * (see select.ts) and every mesh of a level draws the instances it holds in one indirect
9
- * draw; an instance near a switch is in both neighbours and they split its pixels with
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
- * Instance matrices are model transforms of the object, as for an InstancedMesh; set
16
- * them with `setMatrixAt`, and instance colours with `setColorAt`. An instance at scale 0
17
- * draws nothing. Its own transform (and its parents') should scale uniformly; instances
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
- * Levels are templates, read when it is built: their meshes are drawn instanced, not
21
- * added to the scene. They cannot contain skinned meshes, InstancedMeshes (other than an
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 LodLevel[];
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 fallback;
40
- private readonly installed;
30
+ private meshes;
31
+ private readonly residency;
41
32
  private disposed;
42
- /** Instance matrices, 16 floats each: the selection uploads them from here. */
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?: Object3D[], count?: number);
52
+ constructor(levels?: readonly LodLevel[], count?: number);
67
53
  private build;
68
- /** Install ready atlas templates atomically before selecting this view. */
69
- private refresh;
70
- /** Bound what the level meshes draw, including template placement and impostor boxes. */
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
- /** Measure only changed matrices; matrix and colour uploads have separate ranges. */
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
- /** Only levels whose conservative bounds contain a possible selected instance. */
98
- private showLevels;
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
  }