@drawcall/lod 0.0.0-stage → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -2
  3. package/dist/baked/codec.d.ts +10 -0
  4. package/dist/baked/codec.js +291 -0
  5. package/dist/baked/codec.js.map +1 -0
  6. package/dist/baked/coverage.d.ts +3 -0
  7. package/dist/baked/coverage.js +45 -0
  8. package/dist/baked/coverage.js.map +1 -0
  9. package/dist/baked/index.d.ts +51 -0
  10. package/dist/baked/index.js +151 -0
  11. package/dist/baked/index.js.map +1 -0
  12. package/dist/baked/interior/faces.d.ts +26 -0
  13. package/dist/baked/interior/faces.js +105 -0
  14. package/dist/baked/interior/faces.js.map +1 -0
  15. package/dist/baked/interior/material.d.ts +31 -0
  16. package/dist/baked/interior/material.js +157 -0
  17. package/dist/baked/interior/material.js.map +1 -0
  18. package/dist/baked/interior/rooms.d.ts +22 -0
  19. package/dist/baked/interior/rooms.js +78 -0
  20. package/dist/baked/interior/rooms.js.map +1 -0
  21. package/dist/baked/low.d.ts +20 -0
  22. package/dist/baked/low.js +75 -0
  23. package/dist/baked/low.js.map +1 -0
  24. package/dist/baked/raster.d.ts +20 -0
  25. package/dist/baked/raster.js +71 -0
  26. package/dist/baked/raster.js.map +1 -0
  27. package/dist/baked/transfer.d.ts +36 -0
  28. package/dist/baked/transfer.js +243 -0
  29. package/dist/baked/transfer.js.map +1 -0
  30. package/dist/baked/unwrap.d.ts +9 -0
  31. package/dist/baked/unwrap.js +167 -0
  32. package/dist/baked/unwrap.js.map +1 -0
  33. package/dist/baked/xatlas.d.ts +2 -0
  34. package/dist/baked/xatlas.js +31 -0
  35. package/dist/baked/xatlas.js.map +1 -0
  36. package/dist/bounds.d.ts +33 -0
  37. package/dist/bounds.js +127 -0
  38. package/dist/bounds.js.map +1 -0
  39. package/dist/dispose.d.ts +5 -0
  40. package/dist/dispose.js +28 -0
  41. package/dist/dispose.js.map +1 -0
  42. package/dist/fade.d.ts +44 -0
  43. package/dist/fade.js +78 -0
  44. package/dist/fade.js.map +1 -0
  45. package/dist/impostor/bake/atlas.d.ts +51 -0
  46. package/dist/impostor/bake/atlas.js +190 -0
  47. package/dist/impostor/bake/atlas.js.map +1 -0
  48. package/dist/impostor/bake/index.d.ts +50 -0
  49. package/dist/impostor/bake/index.js +221 -0
  50. package/dist/impostor/bake/index.js.map +1 -0
  51. package/dist/impostor/bake/materials.d.ts +29 -0
  52. package/dist/impostor/bake/materials.js +156 -0
  53. package/dist/impostor/bake/materials.js.map +1 -0
  54. package/dist/impostor/bake/source.d.ts +3 -0
  55. package/dist/impostor/bake/source.js +23 -0
  56. package/dist/impostor/bake/source.js.map +1 -0
  57. package/dist/impostor/cache.d.ts +15 -0
  58. package/dist/impostor/cache.js +44 -0
  59. package/dist/impostor/cache.js.map +1 -0
  60. package/dist/impostor/codec.d.ts +14 -0
  61. package/dist/impostor/codec.js +137 -0
  62. package/dist/impostor/codec.js.map +1 -0
  63. package/dist/impostor/impostor.d.ts +67 -0
  64. package/dist/impostor/impostor.js +79 -0
  65. package/dist/impostor/impostor.js.map +1 -0
  66. package/dist/impostor/mesh/card.d.ts +38 -0
  67. package/dist/impostor/mesh/card.js +79 -0
  68. package/dist/impostor/mesh/card.js.map +1 -0
  69. package/dist/impostor/mesh/index.d.ts +66 -0
  70. package/dist/impostor/mesh/index.js +174 -0
  71. package/dist/impostor/mesh/index.js.map +1 -0
  72. package/dist/impostor/mesh/material.d.ts +63 -0
  73. package/dist/impostor/mesh/material.js +199 -0
  74. package/dist/impostor/mesh/material.js.map +1 -0
  75. package/dist/impostor/mesh/surface.d.ts +63 -0
  76. package/dist/impostor/mesh/surface.js +162 -0
  77. package/dist/impostor/mesh/surface.js.map +1 -0
  78. package/dist/impostor/mesh/textures.d.ts +4 -0
  79. package/dist/impostor/mesh/textures.js +37 -0
  80. package/dist/impostor/mesh/textures.js.map +1 -0
  81. package/dist/impostor/octahedral.d.ts +29 -0
  82. package/dist/impostor/octahedral.js +83 -0
  83. package/dist/impostor/octahedral.js.map +1 -0
  84. package/dist/index.d.ts +15 -0
  85. package/dist/index.js +16 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/instanced/args.d.ts +20 -0
  88. package/dist/instanced/args.js +77 -0
  89. package/dist/instanced/args.js.map +1 -0
  90. package/dist/instanced/bounds.d.ts +50 -0
  91. package/dist/instanced/bounds.js +271 -0
  92. package/dist/instanced/bounds.js.map +1 -0
  93. package/dist/instanced/dirty.d.ts +12 -0
  94. package/dist/instanced/dirty.js +61 -0
  95. package/dist/instanced/dirty.js.map +1 -0
  96. package/dist/instanced/index.d.ts +116 -0
  97. package/dist/instanced/index.js +573 -0
  98. package/dist/instanced/index.js.map +1 -0
  99. package/dist/instanced/meshes.d.ts +14 -0
  100. package/dist/instanced/meshes.js +54 -0
  101. package/dist/instanced/meshes.js.map +1 -0
  102. package/dist/instanced/select.d.ts +84 -0
  103. package/dist/instanced/select.js +264 -0
  104. package/dist/instanced/select.js.map +1 -0
  105. package/dist/lazy.d.ts +64 -0
  106. package/dist/lazy.js +187 -0
  107. package/dist/lazy.js.map +1 -0
  108. package/dist/levels.d.ts +72 -0
  109. package/dist/levels.js +146 -0
  110. package/dist/levels.js.map +1 -0
  111. package/dist/loader/cache.d.ts +15 -0
  112. package/dist/loader/cache.js +37 -0
  113. package/dist/loader/cache.js.map +1 -0
  114. package/dist/loader/dispose.d.ts +3 -0
  115. package/dist/loader/dispose.js +25 -0
  116. package/dist/loader/dispose.js.map +1 -0
  117. package/dist/loader.d.ts +99 -0
  118. package/dist/loader.js +234 -0
  119. package/dist/loader.js.map +1 -0
  120. package/dist/lod.d.ts +78 -0
  121. package/dist/lod.js +211 -0
  122. package/dist/lod.js.map +1 -0
  123. package/dist/material.d.ts +12 -0
  124. package/dist/material.js +52 -0
  125. package/dist/material.js.map +1 -0
  126. package/dist/pause.d.ts +6 -0
  127. package/dist/pause.js +20 -0
  128. package/dist/pause.js.map +1 -0
  129. package/dist/renderer.d.ts +21 -0
  130. package/dist/renderer.js +83 -0
  131. package/dist/renderer.js.map +1 -0
  132. package/dist/simplify.d.ts +24 -0
  133. package/dist/simplify.js +148 -0
  134. package/dist/simplify.js.map +1 -0
  135. package/dist/source/error.d.ts +14 -0
  136. package/dist/source/error.js +94 -0
  137. package/dist/source/error.js.map +1 -0
  138. package/dist/source/frame.d.ts +11 -0
  139. package/dist/source/frame.js +25 -0
  140. package/dist/source/frame.js.map +1 -0
  141. package/dist/source/shading.d.ts +96 -0
  142. package/dist/source/shading.js +224 -0
  143. package/dist/source/shading.js.map +1 -0
  144. package/dist/source/source.d.ts +23 -0
  145. package/dist/source/source.js +50 -0
  146. package/dist/source/source.js.map +1 -0
  147. package/dist/source/surface.d.ts +31 -0
  148. package/dist/source/surface.js +110 -0
  149. package/dist/source/surface.js.map +1 -0
  150. package/dist/source/texels.d.ts +45 -0
  151. package/dist/source/texels.js +191 -0
  152. package/dist/source/texels.js.map +1 -0
  153. package/dist/source/trace.d.ts +42 -0
  154. package/dist/source/trace.js +153 -0
  155. package/dist/source/trace.js.map +1 -0
  156. package/dist/three.d.ts +55 -0
  157. package/dist/three.js +103 -0
  158. package/dist/three.js.map +1 -0
  159. package/dist/tsl.d.ts +45 -0
  160. package/dist/tsl.js +99 -0
  161. package/dist/tsl.js.map +1 -0
  162. package/dist/view.d.ts +30 -0
  163. package/dist/view.js +75 -0
  164. package/dist/view.js.map +1 -0
  165. package/dist/wind/bounds.d.ts +3 -0
  166. package/dist/wind/bounds.js +47 -0
  167. package/dist/wind/bounds.js.map +1 -0
  168. package/dist/wind/hooks.d.ts +5 -0
  169. package/dist/wind/hooks.js +3 -0
  170. package/dist/wind/hooks.js.map +1 -0
  171. package/dist/wind/index.d.ts +57 -0
  172. package/dist/wind/index.js +196 -0
  173. package/dist/wind/index.js.map +1 -0
  174. package/dist/wind/sway.d.ts +29 -0
  175. package/dist/wind/sway.js +71 -0
  176. package/dist/wind/sway.js.map +1 -0
  177. package/package.json +69 -3
  178. package/skills/lod/SKILL.md +137 -0
@@ -0,0 +1,573 @@
1
+ import { Box3, InstancedMesh, Matrix4, Object3D, Ray, Sphere, Vector3, } from "three/webgpu";
2
+ import { measureLevels } from "../bounds.js";
3
+ import { disposeTree } from "../dispose.js";
4
+ import { drawOf, setDraw } from "../fade.js";
5
+ import { placeInterior } from "../baked/interior/material.js";
6
+ import { impostorInstances } from "../impostor/mesh/index.js";
7
+ import { Level, cloneLevels, copyThresholds, estimate, fadeProgress, levelAt, tintLevels, validate } from "../levels.js";
8
+ import { Lod } from "../lod.js";
9
+ import { available, fallbacks, inView } from "../lazy.js";
10
+ import { gpuRenderer, inShadowPass, isLazyImpostor, isImpostorMesh, isInstancedMesh, isLOD, isMesh, rejectSkinned, sameClass } from "../three.js";
11
+ import { TYPICAL_HEIGHT, View, viewportHeight, watchViewport } from "../view.js";
12
+ import { WIND_BOUNDS } from "../wind/hooks.js";
13
+ import { copyWind, refreshWind } from "../wind/index.js";
14
+ import { groupMaterial, indirect, placed, ranges } from "./meshes.js";
15
+ import { Bounds, stretch } from "./bounds.js";
16
+ import { Dirty } from "./dirty.js";
17
+ import { ARGS_BYTES, Selection } from "./select.js";
18
+ const IDENTITY = new Matrix4();
19
+ const view = new View();
20
+ const inverse = new Matrix4();
21
+ const ray = new Ray();
22
+ const sphere = new Sphere();
23
+ const instance = new Matrix4();
24
+ const world = new Matrix4();
25
+ const box = new Box3();
26
+ const hits = [];
27
+ /**
28
+ * Selections due before the next draw of any InstancedLod: the first level mesh to draw
29
+ * runs them all in one compute call (each call has a cost of its own: an encoder, a
30
+ * pass, a submit). Each renderer runs those its own buffers are not current with.
31
+ */
32
+ const pending = new Set();
33
+ /**
34
+ * `count` copies of one object with levels of detail, each switched by its own height on
35
+ * screen: `Lod` for instances. The GPU sorts the instances into levels once per view
36
+ * (see select.ts) and every mesh of a level draws the instances it holds in one indirect
37
+ * draw; an instance near a switch is in both neighbours and they split its pixels with
38
+ * the dither. Thresholds, `forceLevel`, `Lod.quality`, `Lod.debug` and shadows work as
39
+ * for `Lod`; nothing of an instance is drawn into a directional light's shadow map whose
40
+ * texels are wider than it. Each level is culled by the crowd's bounds, tightened for
41
+ * finer levels to the region near the camera where their instances can draw.
42
+ *
43
+ * Instance matrices are model transforms of the object, as for an InstancedMesh; set
44
+ * them with `setMatrixAt`, and instance colours with `setColorAt`. An instance at scale 0
45
+ * draws nothing. Its own transform (and its parents') should scale uniformly; instances
46
+ * may scale any way.
47
+ *
48
+ * Levels are templates, read when it is built: their meshes are drawn instanced, not
49
+ * added to the scene. They cannot contain skinned meshes, InstancedMeshes (other than an
50
+ * ImpostorMesh) or nested Lods. To build a hierarchy on top, leave level 0 empty (see
51
+ * `Lod`) and draw the detail of the instances `levelOf` reports at level 0 yourself.
52
+ */
53
+ export class InstancedLod extends Object3D {
54
+ isLOD = true;
55
+ isInstancedLod = true;
56
+ /** Let the renderer call `update` with its camera every frame. */
57
+ autoUpdate = true;
58
+ /** Draw only this level for every instance, without fades. */
59
+ forceLevel = null;
60
+ levels;
61
+ count;
62
+ entries = [];
63
+ /** Per level, the meshes drawing it. */
64
+ meshes = [];
65
+ probes = [];
66
+ selection = null;
67
+ fallback = [];
68
+ installed = new Set();
69
+ disposed = false;
70
+ /** Instance matrices, 16 floats each: the selection uploads them from here. */
71
+ matrices;
72
+ /** Instance colours, 4 floats each, once `setColorAt` was called. */
73
+ colors = null;
74
+ /** Each instance's bounding sphere, centre and radius, in the InstancedLod's space. */
75
+ spheres;
76
+ /** Bounding sphere of the source in an instance's space. */
77
+ sphere = new Sphere();
78
+ /** Every placed level, kept separate from the source sphere used for LOD selection. */
79
+ envelope = new Box3();
80
+ rest = new Sphere();
81
+ /** Around every instance; each level may use tighter bounds. */
82
+ bounds = new Sphere();
83
+ /** Per level, what its meshes are culled by: `bounds`, or less where its instances must be near the camera. */
84
+ reaches = [];
85
+ /** Logical demand at the initial default viewport, separate from first-draw visibility. */
86
+ demand = [];
87
+ /** Source-radius padding for the shadow caster cutoff; culling pads every level separately. */
88
+ padding = 0;
89
+ matrixChanges;
90
+ colorChanges;
91
+ blocks;
92
+ last = { selected: false, eye: new Vector3(), scale: 0, ortho: false, fades: false, forced: null };
93
+ /** `levels[0]` is the source. Empty only as the target of `copy`. */
94
+ constructor(levels = [], count = 0) {
95
+ super();
96
+ if (!Number.isInteger(count) || count < 0)
97
+ throw new Error(`InstancedLod: count must be an integer >= 0, got ${count}`);
98
+ this.levels = this.entries;
99
+ this.count = count;
100
+ this.matrices = new Float32Array(count * 16);
101
+ this.spheres = new Float32Array(count * 4);
102
+ for (let i = 0; i < count; i++)
103
+ IDENTITY.toArray(this.matrices, i * 16);
104
+ this.matrixChanges = new Dirty(count);
105
+ this.colorChanges = new Dirty(count);
106
+ this.matrixChanges.all();
107
+ const draws = levels.length > 0 ? this.build(levels) : 0;
108
+ this.blocks = new Bounds(this.matrices, this.spheres, this.sphere, this.bounds, draws, this.rest);
109
+ }
110
+ build(objects, rebuilding = false) {
111
+ const [source] = objects;
112
+ if (!source)
113
+ throw new Error("InstancedLod: needs at least the source level");
114
+ if (isLazyImpostor(source))
115
+ throw new Error("InstancedLod: the source level must be eager");
116
+ for (const object of objects) {
117
+ if (isLazyImpostor(object)) {
118
+ object.materialize();
119
+ }
120
+ if (available(object))
121
+ this.installed.add(object);
122
+ }
123
+ this.fallback = fallbacks(objects);
124
+ for (const object of objects) {
125
+ rejectSkinned(object, "InstancedLod");
126
+ object.traverse((node) => {
127
+ if (isLOD(node))
128
+ throw new Error("InstancedLod: levels cannot contain a Lod or InstancedLod; nest them with Lod");
129
+ if (isInstancedMesh(node) && !isImpostorMesh(node))
130
+ throw new Error(`InstancedLod: levels cannot contain an InstancedMesh ("${node.name}")`);
131
+ });
132
+ }
133
+ const { own, placed } = measureLevels(objects, "InstancedLod");
134
+ this.sphere.copy(placed);
135
+ if (!rebuilding) {
136
+ objects.forEach((object, i) => this.entries.push(new Level(object, i, false, this.entries)));
137
+ estimate(this.entries, 2 * own.radius);
138
+ }
139
+ validate(this.entries);
140
+ // Every template mesh, split per material group: an indirect draw has one range.
141
+ const parts = objects.map((object, level) => {
142
+ // A template's own transform places it in the instance's space, as a Lod's child.
143
+ object.updateWorldMatrix(true, true);
144
+ const outside = object.parent ? object.parent.matrixWorld.clone().invert() : new Matrix4();
145
+ const found = [];
146
+ object.traverse((node) => {
147
+ if (!isMesh(node))
148
+ return;
149
+ const placement = outside.clone().multiply(node.matrixWorld);
150
+ if (level === 0)
151
+ this.probes.push({ mesh: node, placement });
152
+ ranges(node).forEach((range, group) => found.push({ template: node, placement, group, draw: { level, ...range } }));
153
+ });
154
+ return found;
155
+ });
156
+ const draws = parts.flat().map((part) => part.draw);
157
+ const selection = this.selection ??
158
+ new Selection(this.matrices, this.sphere, parts.map((found, i) => found.length > 0 || isLazyImpostor(at(objects, i))), draws, this.fallback);
159
+ if (this.selection)
160
+ selection.replace(draws, this.fallback);
161
+ this.selection = selection;
162
+ if (this.colors)
163
+ this.useColors(selection, this.colors);
164
+ let k = 0;
165
+ parts.forEach((found, i) => {
166
+ const level = at(this.entries, i);
167
+ this.reaches[i] ??= new Sphere();
168
+ this.demand[i] ??= new Sphere();
169
+ const previous = this.meshes[i];
170
+ if (previous?.length && previous.length !== found.length)
171
+ throw new Error("InstancedLod: an existing level's meshes changed");
172
+ this.meshes[i] = found.map((part, index) => {
173
+ const offset = k++ * ARGS_BYTES, mesh = previous?.[index];
174
+ if (!mesh)
175
+ return this.instance(level, part.template, part.placement, part.group, offset, selection);
176
+ this.bind(mesh, level, selection, offset);
177
+ return mesh;
178
+ });
179
+ });
180
+ this.boundLevels();
181
+ if (!rebuilding)
182
+ for (const object of objects)
183
+ if (isLazyImpostor(object))
184
+ object.retain();
185
+ return draws.length;
186
+ }
187
+ /** Install ready atlas templates atomically before selecting this view. */
188
+ refresh() {
189
+ if (this.installed.size === this.entries.length)
190
+ return;
191
+ let changed = false;
192
+ for (const { object } of this.entries) {
193
+ if (!isLazyImpostor(object) || this.installed.has(object))
194
+ continue;
195
+ object.materialize();
196
+ changed ||= available(object);
197
+ }
198
+ if (!changed)
199
+ return;
200
+ if (this.selection)
201
+ pending.delete(this.selection);
202
+ this.probes.length = 0;
203
+ this.envelope.makeEmpty();
204
+ const draws = this.build(this.entries.map((entry) => entry.object), true);
205
+ this.blocks = new Bounds(this.matrices, this.spheres, this.sphere, this.bounds, draws, this.rest);
206
+ this.matrixChanges.all();
207
+ this.measure();
208
+ refreshWind(this);
209
+ this.updateWorldMatrix(true, true);
210
+ this.dispatchEvent({ type: "levelschange" });
211
+ }
212
+ /** Bound what the level meshes draw, including template placement and impostor boxes. */
213
+ boundLevels() {
214
+ for (const meshes of this.meshes) {
215
+ for (const mesh of meshes) {
216
+ if (!isImpostorMesh(mesh))
217
+ mesh.geometry.computeBoundingBox();
218
+ const bounds = mesh.geometry.boundingBox;
219
+ if (!bounds)
220
+ throw new Error("InstancedLod: a level mesh has no geometry bounds");
221
+ box.copy(bounds);
222
+ if (isImpostorMesh(mesh))
223
+ box.applyMatrix4(mesh.placement);
224
+ this.envelope.union(box);
225
+ }
226
+ }
227
+ this.rest.copy(this.sphere);
228
+ if (this.envelope.isEmpty())
229
+ return;
230
+ const { center } = this.rest;
231
+ const { min, max } = this.envelope;
232
+ this.rest.radius = Math.max(this.rest.radius, Math.hypot(Math.max(Math.abs(min.x - center.x), Math.abs(max.x - center.x)), Math.max(Math.abs(min.y - center.y), Math.abs(max.y - center.y)), Math.max(Math.abs(min.z - center.z), Math.abs(max.z - center.z))));
233
+ }
234
+ /** Material group `group` of `template` drawn for every instance in `level`'s slots, from indirect draw arguments at byte `offset`. */
235
+ instance(level, template, placement, group, offset, selection) {
236
+ // An impostor card is placed in the shader; any other mesh draws its geometry moved
237
+ // into the instance's space, so the instance matrix is all it needs.
238
+ const mesh = isImpostorMesh(template)
239
+ ? impostorInstances(template, this.count, placement)
240
+ : new InstancedMesh(placed(template.geometry, placement), groupMaterial(template, group), this.count);
241
+ mesh.geometry = indirect(mesh.geometry, selection, offset);
242
+ this.bind(mesh, level, selection, offset);
243
+ if (!isImpostorMesh(template))
244
+ placeInterior(mesh, placement);
245
+ mesh.name = template.name;
246
+ mesh.castShadow = template.castShadow;
247
+ mesh.receiveShadow = template.receiveShadow;
248
+ this.reaches[level.index] ??= this.bounds.clone();
249
+ mesh.boundingSphere = this.reaches[level.index] ?? null;
250
+ const previous = mesh.onBeforeRender;
251
+ // Selected once per view, before the first level mesh draws: in the view, or in a
252
+ // shadow pass that comes first. The GPU runs it before anything drawn after it.
253
+ mesh.onBeforeRender = (renderer, scene, camera, geometry, material, group) => {
254
+ previous.call(mesh, renderer, scene, camera, geometry, material, group);
255
+ if (pending.size === 0)
256
+ return;
257
+ const gpu = gpuRenderer(renderer);
258
+ // Each level's draws start at its slots (see select.ts).
259
+ if (!gpu.hasFeature("indirect-first-instance"))
260
+ throw new Error("InstancedLod: needs the GPU feature indirect-first-instance, which this device lacks");
261
+ const passes = [...pending].flatMap((due) => due.take(gpu));
262
+ pending.clear();
263
+ if (passes.length > 0)
264
+ gpu.compute(passes);
265
+ };
266
+ watchViewport(mesh);
267
+ this.add(mesh);
268
+ return mesh;
269
+ }
270
+ bind(mesh, level, selection, offset) {
271
+ mesh.geometry.setIndirect(selection.args, selection.argsOffset + offset);
272
+ mesh.instanceMatrix = selection.slots.matrices;
273
+ mesh.instanceColor = selection.slots.colors;
274
+ setDraw(mesh, { kind: "instances", fades: selection.slots.fades, radius: this.drawRadius, tint: level.tint });
275
+ }
276
+ setMatrixAt(index, matrix) {
277
+ this.check(index);
278
+ matrix.toArray(this.matrices, index * 16);
279
+ this.matrixChanges.add(index);
280
+ }
281
+ getMatrixAt(index, matrix) {
282
+ this.check(index);
283
+ return matrix.fromArray(this.matrices, index * 16);
284
+ }
285
+ /** Tint instance `index` by `color`, as InstancedMesh.setColorAt does, in every level. */
286
+ setColorAt(index, color) {
287
+ this.check(index);
288
+ if (!this.colors) {
289
+ this.colors = new Float32Array(this.count * 4).fill(1);
290
+ if (this.selection)
291
+ this.useColors(this.selection, this.colors);
292
+ }
293
+ color.toArray(this.colors, index * 4);
294
+ this.colorChanges.add(index);
295
+ }
296
+ /** Instance `index`'s colour: white unless set. */
297
+ getColorAt(index, color) {
298
+ this.check(index);
299
+ return this.colors ? color.fromArray(this.colors, index * 4) : color.setRGB(1, 1, 1);
300
+ }
301
+ /** Carry `colors` with the instances from now on: every level's meshes draw them. */
302
+ useColors(selection, colors) {
303
+ selection.useColors(colors);
304
+ for (const mesh of this.meshes.flat()) {
305
+ mesh.instanceColor = selection.slots.colors;
306
+ // Instance colours change the shader.
307
+ for (const material of [mesh.material].flat())
308
+ material.needsUpdate = true;
309
+ }
310
+ this.colorChanges.all();
311
+ }
312
+ /**
313
+ * The finest level instance `index` drew in the last update, or null before the first
314
+ * (or at scale 0). Inside a fade the next coarser level draws too.
315
+ */
316
+ levelOf(index) {
317
+ this.check(index);
318
+ const { last } = this;
319
+ if (!last.selected)
320
+ return null;
321
+ this.measure();
322
+ const offset = index * 4;
323
+ const r = at(this.spheres, offset + 3);
324
+ if (r === 0)
325
+ return null;
326
+ let height = 2 * r * last.scale;
327
+ if (!last.ortho) {
328
+ const x = this.spheres[offset];
329
+ const y = this.spheres[offset + 1];
330
+ const z = this.spheres[offset + 2];
331
+ if (x === undefined || y === undefined || z === undefined)
332
+ throw new Error(`InstancedLod: missing sphere ${index}`);
333
+ const dx = x - last.eye.x;
334
+ const dy = y - last.eye.y;
335
+ const dz = z - last.eye.z;
336
+ height /= Math.max(Math.sqrt(dx * dx + dy * dy + dz * dz), 1e-6);
337
+ }
338
+ const level = levelAt(this.entries, height, last.forced);
339
+ const selected = last.fades && fadeProgress(this.entries, level, height) > 0 ? level.index - 1 : level.index;
340
+ return this.fallback[selected] ?? selected;
341
+ }
342
+ check(index) {
343
+ if (!Number.isInteger(index) || index < 0 || index >= this.count)
344
+ throw new Error(`InstancedLod: index ${index} is not in 0..${this.count - 1}`);
345
+ }
346
+ /** Source radius padded for the level shaders' shadow caster cutoff. */
347
+ get drawRadius() {
348
+ return this.sphere.radius * (1 + this.padding);
349
+ }
350
+ [WIND_BOUNDS](padding, slope, baseY) {
351
+ this.padding = padding / this.sphere.radius;
352
+ for (const mesh of this.meshes.flat()) {
353
+ const draw = drawOf(mesh);
354
+ if (draw?.kind === "instances")
355
+ draw.radius = this.drawRadius;
356
+ }
357
+ // The wind shape comes from the source, but taller/offset levels can sway farther.
358
+ const reach = slope * Math.max(Math.abs(this.envelope.min.y - baseY), Math.abs(this.envelope.max.y - baseY));
359
+ this.blocks.pad(this.rest.radius > 0 ? reach / this.rest.radius : 0);
360
+ this.blocks.refit();
361
+ }
362
+ /** Measure only changed matrices; matrix and colour uploads have separate ranges. */
363
+ measure() {
364
+ if (this.matrixChanges.empty && this.colorChanges.empty)
365
+ return;
366
+ this.measureChanges();
367
+ }
368
+ // Keep the closure-bearing work out of the unchanged path: V8 can allocate a
369
+ // lexical context on entry even when a function returns before its callbacks.
370
+ measureChanges() {
371
+ const { selection } = this;
372
+ const matricesChanged = !this.matrixChanges.empty;
373
+ this.matrixChanges.drain((start, end) => {
374
+ this.blocks.measure(start, end);
375
+ if (selection)
376
+ upload(selection.matrices, start, end);
377
+ });
378
+ this.colorChanges.drain((start, end) => {
379
+ if (selection?.colors)
380
+ upload(selection.colors, start, end);
381
+ });
382
+ selection?.changed();
383
+ if (matricesChanged)
384
+ this.blocks.refit();
385
+ }
386
+ /** Sort the instances into levels for `camera`; three's renderer calls this itself while `autoUpdate`. */
387
+ update(camera) {
388
+ if (this.disposed || inShadowPass(this))
389
+ return;
390
+ this.refresh();
391
+ const { entries, selection } = this;
392
+ if (!selection)
393
+ return;
394
+ validate(entries);
395
+ if (this.forceLevel !== null && !entries[this.forceLevel])
396
+ throw new Error(`Lod: forceLevel ${this.forceLevel} is not a level`);
397
+ this.measure();
398
+ const height = viewportHeight(camera);
399
+ view.begin(camera, height ?? TYPICAL_HEIGHT, this.forceLevel);
400
+ tintLevels(entries, Lod.debug);
401
+ const worldScale = this.matrixWorld.getMaxScaleOnAxis();
402
+ const scale = view.scale * Lod.quality * (view.ortho ? worldScale : 1);
403
+ const { last } = this;
404
+ last.eye.copy(view.eye).applyMatrix4(inverse.copy(this.matrixWorld).invert());
405
+ Object.assign(last, { selected: true, scale, ortho: view.ortho, fades: view.fades, forced: this.forceLevel });
406
+ const stable = this.blocks.select(entries, last, this.reaches, height !== null, this.matrixWorld);
407
+ if (this.installed.size < entries.length) {
408
+ let demand = this.reaches;
409
+ if (height === null) {
410
+ // Every mesh must get a first chance to report its viewport. That conservative
411
+ // visibility is not a reason to load every lazy tier: use the actual default
412
+ // selection, including forced and empty levels, for initial atlas demand.
413
+ demand = this.demand;
414
+ this.blocks.select(entries, last, demand, true, this.matrixWorld);
415
+ }
416
+ for (let i = this.reaches.length - 1; i >= 0; i--) {
417
+ const reach = at(this.reaches, i), object = at(entries, i).object;
418
+ if (isLazyImpostor(object) && object.status === "idle" && inView(camera, this.matrixWorld, at(demand, i)))
419
+ object.request();
420
+ const target = this.fallback[i] ?? i;
421
+ if (target !== i) {
422
+ at(this.reaches, target).union(reach);
423
+ reach.makeEmpty();
424
+ }
425
+ }
426
+ }
427
+ selection.aim(last.eye, scale, view.ortho, view.fades, this.forceLevel, entries, stable);
428
+ // Selected only when something may draw: an InstancedLod with every level hidden
429
+ // keeps its last selection.
430
+ if (this.showLevels())
431
+ pending.add(selection);
432
+ }
433
+ /** Only levels whose conservative bounds contain a possible selected instance. */
434
+ showLevels() {
435
+ let shown = false;
436
+ this.meshes.forEach((meshes, level) => {
437
+ const visible = !this.reaches[level]?.isEmpty();
438
+ for (const mesh of meshes)
439
+ mesh.visible = visible;
440
+ shown ||= visible && meshes.length > 0;
441
+ });
442
+ return shown;
443
+ }
444
+ /**
445
+ * Hits every instance's source level, with `instanceId` set; `object` is this
446
+ * InstancedLod. Meshes of the source on layers the raycaster does not test are skipped.
447
+ */
448
+ raycast(raycaster, intersects) {
449
+ ray.copy(raycaster.ray).applyMatrix4(inverse.copy(this.matrixWorld).invert());
450
+ for (let i = 0; i < this.count; i++) {
451
+ instance.fromArray(this.matrices, i * 16);
452
+ sphere.center.copy(this.rest.center).applyMatrix4(instance);
453
+ sphere.radius = this.rest.radius * stretch(instance);
454
+ if (!ray.intersectsSphere(sphere))
455
+ continue;
456
+ for (const { mesh, placement } of this.probes) {
457
+ if (!mesh.layers.test(raycaster.layers))
458
+ continue;
459
+ // The template's own raycast, as if it stood where this instance does.
460
+ const own = mesh.matrixWorld;
461
+ mesh.matrixWorld = world.multiplyMatrices(this.matrixWorld, instance).multiply(placement);
462
+ hits.length = 0;
463
+ mesh.raycast(raycaster, hits);
464
+ mesh.matrixWorld = own;
465
+ for (const hit of hits)
466
+ intersects.push(Object.assign(hit, { object: this, instanceId: i }));
467
+ }
468
+ }
469
+ return false;
470
+ }
471
+ /**
472
+ * Copies `source`'s levels, instances and settings into this empty InstancedLod of the
473
+ * same count (it throws otherwise); the copy shares geometry and textures with `source`.
474
+ */
475
+ copy(source) {
476
+ if (this.entries.length > 0 || this.count !== source.count)
477
+ throw new Error("InstancedLod.copy: copy into an empty InstancedLod of the same count");
478
+ super.copy(source, false);
479
+ this.matrices.set(source.matrices);
480
+ this.colors = source.colors?.slice() ?? null;
481
+ this.matrixChanges.all();
482
+ if (this.colors)
483
+ this.colorChanges.all();
484
+ const draws = source.entries.length > 0 ? this.build(cloneLevels(source.entries)) : 0;
485
+ this.blocks = new Bounds(this.matrices, this.spheres, this.sphere, this.bounds, draws, this.rest);
486
+ copyThresholds(source.entries, this.entries);
487
+ this.forceLevel = source.forceLevel;
488
+ this.autoUpdate = source.autoUpdate;
489
+ copyWind(source, this);
490
+ return this;
491
+ }
492
+ clone() {
493
+ // three's clone builds `new this.constructor()`, which has no count.
494
+ const clone = new InstancedLod([], this.count).copy(this);
495
+ if (!sameClass(this, clone))
496
+ throw new Error("InstancedLod.clone: a subclass must override clone");
497
+ return clone;
498
+ }
499
+ /**
500
+ * Frees every level, the source included, and the instanced meshes. Clones share
501
+ * geometry and textures, so dispose only once no clone draws any more.
502
+ */
503
+ dispose() {
504
+ if (this.disposed)
505
+ return;
506
+ this.disposed = true;
507
+ this.clearDraws();
508
+ for (const { object } of this.entries)
509
+ isLazyImpostor(object) ? object.release() : disposeTree(object);
510
+ }
511
+ clearDraws() {
512
+ // An ImpostorMesh frees its own material and geometry; the other meshes' faded
513
+ // materials go with the levels' originals.
514
+ for (const mesh of this.meshes.flat()) {
515
+ this.remove(mesh);
516
+ mesh.dispose();
517
+ if (!isImpostorMesh(mesh))
518
+ mesh.geometry.dispose();
519
+ }
520
+ if (this.selection)
521
+ pending.delete(this.selection);
522
+ this.selection?.dispose();
523
+ this.selection = null;
524
+ this.meshes.length = 0;
525
+ }
526
+ }
527
+ function at(values, i) {
528
+ const value = values[i];
529
+ if (value === undefined)
530
+ throw new Error(`InstancedLod: index ${i} out of range`);
531
+ return value;
532
+ }
533
+ /** Union pending uploads, including repeated edits while a crowd is not drawn. */
534
+ function upload(attribute, start, end) {
535
+ start *= attribute.itemSize;
536
+ end *= attribute.itemSize;
537
+ const ranges = attribute.updateRanges;
538
+ let low = 0;
539
+ let high = ranges.length;
540
+ while (low < high) {
541
+ const middle = (low + high) >>> 1;
542
+ const range = at(ranges, middle);
543
+ if (range.start + range.count < start)
544
+ low = middle + 1;
545
+ else
546
+ high = middle;
547
+ }
548
+ const first = ranges[low];
549
+ if (!first || first.start > end) {
550
+ const range = { start, count: end - start };
551
+ if (low === ranges.length)
552
+ ranges.push(range);
553
+ else
554
+ ranges.splice(low, 0, range);
555
+ }
556
+ else {
557
+ end = Math.max(end, first.start + first.count);
558
+ first.start = Math.min(start, first.start);
559
+ let next = low + 1;
560
+ while (next < ranges.length) {
561
+ const range = at(ranges, next);
562
+ if (range.start > end)
563
+ break;
564
+ end = Math.max(end, range.start + range.count);
565
+ next++;
566
+ }
567
+ first.count = end - first.start;
568
+ if (next > low + 1)
569
+ ranges.splice(low + 1, next - low - 1);
570
+ }
571
+ attribute.needsUpdate = true;
572
+ }
573
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/instanced/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { BufferGeometry, Matrix4, type Mesh } from "three/webgpu";
2
+ import type { Selection } from "./select.js";
3
+ /** The index (or vertex) ranges `mesh` draws, clipped to its draw range; group order is preserved even for empty draws. */
4
+ export declare function ranges(mesh: Mesh): Array<{
5
+ count: number;
6
+ start: number;
7
+ indexed: boolean;
8
+ }>;
9
+ /** The faded material of `mesh`'s material group `group`. */
10
+ export declare function groupMaterial(mesh: Mesh, group: number): import("three/webgpu").NodeMaterial;
11
+ /** A geometry drawing `geometry`'s buffers from the indirect arguments at byte `offset`. */
12
+ export declare function indirect(geometry: BufferGeometry, selection: Selection, offset: number): BufferGeometry;
13
+ /** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
14
+ export declare function placed(geometry: BufferGeometry, placement: Matrix4): BufferGeometry;