@drawcall/lod 0.2.0 → 0.4.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 (355) hide show
  1. package/README.md +6 -7
  2. package/dist/bake.d.ts +36 -0
  3. package/dist/bake.js +176 -0
  4. package/dist/bake.js.map +1 -0
  5. package/dist/baked/codec.d.ts +3 -6
  6. package/dist/baked/codec.js +48 -154
  7. package/dist/baked/codec.js.map +1 -1
  8. package/dist/baked/coverage.d.ts +6 -3
  9. package/dist/baked/coverage.js +6 -3
  10. package/dist/baked/coverage.js.map +1 -1
  11. package/dist/baked/fields.d.ts +9 -0
  12. package/dist/baked/fields.js +22 -0
  13. package/dist/baked/fields.js.map +1 -0
  14. package/dist/baked/index.d.ts +14 -8
  15. package/dist/baked/index.js +24 -22
  16. package/dist/baked/index.js.map +1 -1
  17. package/dist/baked/interior/faces.d.ts +4 -3
  18. package/dist/baked/interior/faces.js +16 -11
  19. package/dist/baked/interior/faces.js.map +1 -1
  20. package/dist/baked/interior/material.d.ts +7 -10
  21. package/dist/baked/interior/material.js +29 -36
  22. package/dist/baked/interior/material.js.map +1 -1
  23. package/dist/baked/interior/rooms.d.ts +1 -1
  24. package/dist/baked/interior/rooms.js +2 -2
  25. package/dist/baked/interior/rooms.js.map +1 -1
  26. package/dist/baked/low.js +5 -4
  27. package/dist/baked/low.js.map +1 -1
  28. package/dist/baked/raster.js +6 -6
  29. package/dist/baked/raster.js.map +1 -1
  30. package/dist/baked/textures.d.ts +17 -0
  31. package/dist/baked/textures.js +95 -0
  32. package/dist/baked/textures.js.map +1 -0
  33. package/dist/baked/transfer.js +19 -18
  34. package/dist/baked/transfer.js.map +1 -1
  35. package/dist/baked/unwrap.js +4 -3
  36. package/dist/baked/unwrap.js.map +1 -1
  37. package/dist/baked/xatlas.js.map +1 -1
  38. package/dist/codec/container.d.ts +8 -0
  39. package/dist/codec/container.js +63 -0
  40. package/dist/codec/container.js.map +1 -0
  41. package/dist/codec/mesh.d.ts +8 -0
  42. package/dist/{mesh/codec.js → codec/mesh.js} +80 -52
  43. package/dist/codec/mesh.js.map +1 -0
  44. package/dist/dispose.d.ts +8 -5
  45. package/dist/dispose.js +22 -24
  46. package/dist/dispose.js.map +1 -1
  47. package/dist/foliage.d.ts +32 -0
  48. package/dist/foliage.js +137 -0
  49. package/dist/foliage.js.map +1 -0
  50. package/dist/impostor/bake/atlas.d.ts +4 -4
  51. package/dist/impostor/bake/atlas.js +12 -12
  52. package/dist/impostor/bake/atlas.js.map +1 -1
  53. package/dist/impostor/bake/fit.d.ts +8 -0
  54. package/dist/impostor/bake/fit.js +28 -0
  55. package/dist/impostor/bake/fit.js.map +1 -0
  56. package/dist/impostor/bake/index.d.ts +22 -14
  57. package/dist/impostor/bake/index.js +50 -134
  58. package/dist/impostor/bake/index.js.map +1 -1
  59. package/dist/impostor/bake/materials.d.ts +3 -3
  60. package/dist/impostor/bake/materials.js +51 -13
  61. package/dist/impostor/bake/materials.js.map +1 -1
  62. package/dist/impostor/bake/sheet.d.ts +8 -0
  63. package/dist/impostor/bake/sheet.js +90 -0
  64. package/dist/impostor/bake/sheet.js.map +1 -0
  65. package/dist/impostor/bake/source.d.ts +3 -2
  66. package/dist/impostor/bake/source.js +9 -20
  67. package/dist/impostor/bake/source.js.map +1 -1
  68. package/dist/impostor/codec.d.ts +4 -5
  69. package/dist/impostor/codec.js +36 -109
  70. package/dist/impostor/codec.js.map +1 -1
  71. package/dist/impostor/impostor.d.ts +31 -7
  72. package/dist/impostor/impostor.js +21 -6
  73. package/dist/impostor/impostor.js.map +1 -1
  74. package/dist/impostor/ktx2/encode.d.ts +26 -0
  75. package/dist/impostor/ktx2/encode.js +120 -0
  76. package/dist/impostor/ktx2/encode.js.map +1 -0
  77. package/dist/impostor/ktx2/transcode.d.ts +3 -0
  78. package/dist/impostor/ktx2/transcode.js +99 -0
  79. package/dist/impostor/ktx2/transcode.js.map +1 -0
  80. package/dist/impostor/ktx2/uastc.d.ts +7 -0
  81. package/dist/impostor/ktx2/uastc.js +65 -0
  82. package/dist/impostor/ktx2/uastc.js.map +1 -0
  83. package/dist/impostor/ktx2/wasm/encoder.d.ts +4 -0
  84. package/dist/impostor/ktx2/wasm/encoder.js +10 -0
  85. package/dist/impostor/ktx2/wasm/encoder.js.map +1 -0
  86. package/dist/impostor/ktx2/wasm/transcoder.d.ts +3 -0
  87. package/dist/impostor/ktx2/wasm/transcoder.js +9 -0
  88. package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -0
  89. package/dist/impostor/ktx2/worker.d.ts +1 -0
  90. package/dist/impostor/ktx2/worker.js +10 -0
  91. package/dist/impostor/ktx2/worker.js.map +1 -0
  92. package/dist/impostor/mesh/card.d.ts +4 -4
  93. package/dist/impostor/mesh/card.js +7 -7
  94. package/dist/impostor/mesh/card.js.map +1 -1
  95. package/dist/impostor/mesh/index.d.ts +7 -6
  96. package/dist/impostor/mesh/index.js +10 -11
  97. package/dist/impostor/mesh/index.js.map +1 -1
  98. package/dist/impostor/mesh/material.d.ts +18 -9
  99. package/dist/impostor/mesh/material.js +40 -27
  100. package/dist/impostor/mesh/material.js.map +1 -1
  101. package/dist/impostor/mesh/surface.d.ts +1 -1
  102. package/dist/impostor/mesh/surface.js +13 -9
  103. package/dist/impostor/mesh/surface.js.map +1 -1
  104. package/dist/impostor/mesh/textures.d.ts +3 -3
  105. package/dist/impostor/mesh/textures.js +24 -34
  106. package/dist/impostor/mesh/textures.js.map +1 -1
  107. package/dist/index.d.ts +13 -11
  108. package/dist/index.js +12 -10
  109. package/dist/index.js.map +1 -1
  110. package/dist/instanced/camera.d.ts +34 -0
  111. package/dist/instanced/camera.js +45 -0
  112. package/dist/instanced/camera.js.map +1 -0
  113. package/dist/instanced/clusters.d.ts +54 -0
  114. package/dist/instanced/clusters.js +151 -0
  115. package/dist/instanced/clusters.js.map +1 -0
  116. package/dist/instanced/cull.d.ts +28 -0
  117. package/dist/instanced/cull.js +22 -0
  118. package/dist/instanced/cull.js.map +1 -0
  119. package/dist/instanced/instances.d.ts +39 -0
  120. package/dist/instanced/instances.js +104 -0
  121. package/dist/instanced/instances.js.map +1 -0
  122. package/dist/instanced/key.d.ts +19 -0
  123. package/dist/instanced/key.js +45 -0
  124. package/dist/instanced/key.js.map +1 -0
  125. package/dist/instanced/levels.d.ts +60 -0
  126. package/dist/instanced/levels.js +131 -0
  127. package/dist/instanced/levels.js.map +1 -0
  128. package/dist/instanced/lists.d.ts +57 -0
  129. package/dist/instanced/lists.js +114 -0
  130. package/dist/instanced/lists.js.map +1 -0
  131. package/dist/instanced/measure.d.ts +28 -0
  132. package/dist/instanced/measure.js +203 -0
  133. package/dist/instanced/measure.js.map +1 -0
  134. package/dist/instanced/meshes.d.ts +44 -51
  135. package/dist/instanced/meshes.js +167 -179
  136. package/dist/instanced/meshes.js.map +1 -1
  137. package/dist/instanced/mirror.d.ts +24 -0
  138. package/dist/instanced/mirror.js +76 -0
  139. package/dist/instanced/mirror.js.map +1 -0
  140. package/dist/instanced/raycast.d.ts +10 -11
  141. package/dist/instanced/raycast.js +31 -41
  142. package/dist/instanced/raycast.js.map +1 -1
  143. package/dist/instanced/rows.d.ts +50 -0
  144. package/dist/instanced/rows.js +36 -0
  145. package/dist/instanced/rows.js.map +1 -0
  146. package/dist/instanced/shape.d.ts +27 -0
  147. package/dist/instanced/shape.js +54 -0
  148. package/dist/instanced/shape.js.map +1 -0
  149. package/dist/instanced/sort.d.ts +61 -0
  150. package/dist/instanced/sort.js +192 -0
  151. package/dist/instanced/sort.js.map +1 -0
  152. package/dist/instanced/update.d.ts +34 -0
  153. package/dist/instanced/update.js +180 -0
  154. package/dist/instanced/update.js.map +1 -0
  155. package/dist/levels/bounds.d.ts +21 -0
  156. package/dist/levels/bounds.js +42 -0
  157. package/dist/levels/bounds.js.map +1 -0
  158. package/dist/levels/cameras.d.ts +48 -0
  159. package/dist/levels/cameras.js +122 -0
  160. package/dist/levels/cameras.js.map +1 -0
  161. package/dist/levels/compile/contexts.d.ts +30 -0
  162. package/dist/levels/compile/contexts.js +18 -0
  163. package/dist/levels/compile/contexts.js.map +1 -0
  164. package/dist/levels/compile/index.d.ts +41 -0
  165. package/dist/levels/compile/index.js +193 -0
  166. package/dist/levels/compile/index.js.map +1 -0
  167. package/dist/levels/compile/pipelines.d.ts +26 -0
  168. package/dist/levels/compile/pipelines.js +172 -0
  169. package/dist/levels/compile/pipelines.js.map +1 -0
  170. package/dist/levels/compiles.d.ts +29 -0
  171. package/dist/levels/compiles.js +50 -0
  172. package/dist/levels/compiles.js.map +1 -0
  173. package/dist/levels/draw.d.ts +102 -0
  174. package/dist/levels/draw.js +401 -0
  175. package/dist/levels/draw.js.map +1 -0
  176. package/dist/levels/fade.d.ts +60 -0
  177. package/dist/levels/fade.js +129 -0
  178. package/dist/levels/fade.js.map +1 -0
  179. package/dist/levels/index.d.ts +99 -0
  180. package/dist/levels/index.js +155 -0
  181. package/dist/levels/index.js.map +1 -0
  182. package/dist/levels/item.d.ts +38 -0
  183. package/dist/levels/item.js +89 -0
  184. package/dist/levels/item.js.map +1 -0
  185. package/dist/levels/load.d.ts +31 -0
  186. package/dist/levels/load.js +144 -0
  187. package/dist/levels/load.js.map +1 -0
  188. package/dist/levels/manager.d.ts +158 -0
  189. package/dist/levels/manager.js +352 -0
  190. package/dist/levels/manager.js.map +1 -0
  191. package/dist/{material.d.ts → levels/material.d.ts} +2 -2
  192. package/dist/{material.js → levels/material.js} +6 -5
  193. package/dist/levels/material.js.map +1 -0
  194. package/dist/levels/renderer.d.ts +32 -0
  195. package/dist/levels/renderer.js +57 -0
  196. package/dist/levels/renderer.js.map +1 -0
  197. package/dist/levels/requests.d.ts +52 -0
  198. package/dist/levels/requests.js +97 -0
  199. package/dist/levels/requests.js.map +1 -0
  200. package/dist/levels/screen.d.ts +14 -0
  201. package/dist/levels/screen.js +21 -0
  202. package/dist/levels/screen.js.map +1 -0
  203. package/dist/loader/build.d.ts +10 -0
  204. package/dist/loader/build.js +28 -0
  205. package/dist/loader/build.js.map +1 -0
  206. package/dist/loader/context.d.ts +44 -0
  207. package/dist/loader/context.js +96 -0
  208. package/dist/loader/context.js.map +1 -0
  209. package/dist/loader/entry.d.ts +4 -0
  210. package/dist/loader/entry.js +43 -0
  211. package/dist/loader/entry.js.map +1 -0
  212. package/dist/loader/index.d.ts +76 -0
  213. package/dist/loader/index.js +272 -0
  214. package/dist/loader/index.js.map +1 -0
  215. package/dist/loader/level.d.ts +41 -0
  216. package/dist/loader/level.js +140 -0
  217. package/dist/loader/level.js.map +1 -0
  218. package/dist/loader/node.d.ts +26 -0
  219. package/dist/loader/node.js +199 -0
  220. package/dist/loader/node.js.map +1 -0
  221. package/dist/loader/request.d.ts +54 -0
  222. package/dist/loader/request.js +19 -0
  223. package/dist/loader/request.js.map +1 -0
  224. package/dist/loader/url.d.ts +10 -6
  225. package/dist/loader/url.js +22 -14
  226. package/dist/loader/url.js.map +1 -1
  227. package/dist/lod.d.ts +144 -43
  228. package/dist/lod.js +354 -163
  229. package/dist/lod.js.map +1 -1
  230. package/dist/meshopt.d.ts +6 -0
  231. package/dist/meshopt.js +20 -0
  232. package/dist/meshopt.js.map +1 -0
  233. package/dist/node-process.d.ts +5 -0
  234. package/dist/node-process.js +6 -0
  235. package/dist/node-process.js.map +1 -0
  236. package/dist/node.d.ts +2 -0
  237. package/dist/node.js +5 -0
  238. package/dist/node.js.map +1 -0
  239. package/dist/simplify/cards.d.ts +14 -0
  240. package/dist/simplify/cards.js +128 -0
  241. package/dist/simplify/cards.js.map +1 -0
  242. package/dist/{simplify.d.ts → simplify/index.d.ts} +8 -5
  243. package/dist/{simplify.js → simplify/index.js} +45 -27
  244. package/dist/simplify/index.js.map +1 -0
  245. package/dist/{bounds.d.ts → source/detail.d.ts} +9 -23
  246. package/dist/{bounds.js → source/detail.js} +28 -58
  247. package/dist/source/detail.js.map +1 -0
  248. package/dist/source/deviation.js +6 -6
  249. package/dist/source/deviation.js.map +1 -1
  250. package/dist/source/{shading.d.ts → evaluator.d.ts} +10 -10
  251. package/dist/source/{shading.js → evaluator.js} +5 -5
  252. package/dist/source/evaluator.js.map +1 -0
  253. package/dist/source/{trace.d.ts → raycaster.d.ts} +6 -6
  254. package/dist/source/{trace.js → raycaster.js} +8 -8
  255. package/dist/source/raycaster.js.map +1 -0
  256. package/dist/source/{texels.d.ts → sampler.d.ts} +1 -1
  257. package/dist/source/{texels.js → sampler.js} +8 -5
  258. package/dist/source/sampler.js.map +1 -0
  259. package/dist/source/source.d.ts +1 -1
  260. package/dist/source/source.js +1 -1
  261. package/dist/source/source.js.map +1 -1
  262. package/dist/source/surface.js +1 -1
  263. package/dist/source/surface.js.map +1 -1
  264. package/dist/task.d.ts +6 -0
  265. package/dist/{pause.js → task.js} +5 -5
  266. package/dist/task.js.map +1 -0
  267. package/dist/three.d.ts +19 -30
  268. package/dist/three.js +30 -57
  269. package/dist/three.js.map +1 -1
  270. package/dist/tsl.d.ts +8 -12
  271. package/dist/tsl.js +11 -39
  272. package/dist/tsl.js.map +1 -1
  273. package/dist/typegpu.d.ts +37 -0
  274. package/dist/typegpu.js +37 -0
  275. package/dist/typegpu.js.map +1 -0
  276. package/dist/wind/bounds.js +3 -3
  277. package/dist/wind/bounds.js.map +1 -1
  278. package/dist/wind/hooks.d.ts +7 -4
  279. package/dist/wind/hooks.js +5 -2
  280. package/dist/wind/hooks.js.map +1 -1
  281. package/dist/wind/index.d.ts +4 -4
  282. package/dist/wind/index.js +25 -23
  283. package/dist/wind/index.js.map +1 -1
  284. package/dist/wind/sway.d.ts +2 -0
  285. package/dist/wind/sway.js +4 -1
  286. package/dist/wind/sway.js.map +1 -1
  287. package/package.json +24 -10
  288. package/skills/lod/SKILL.md +120 -32
  289. package/dist/bounds.js.map +0 -1
  290. package/dist/compile.d.ts +0 -4
  291. package/dist/compile.js +0 -100
  292. package/dist/compile.js.map +0 -1
  293. package/dist/deferred.d.ts +0 -12
  294. package/dist/deferred.js +0 -27
  295. package/dist/deferred.js.map +0 -1
  296. package/dist/fade.d.ts +0 -36
  297. package/dist/fade.js +0 -112
  298. package/dist/fade.js.map +0 -1
  299. package/dist/instanced/args.d.ts +0 -20
  300. package/dist/instanced/args.js +0 -77
  301. package/dist/instanced/args.js.map +0 -1
  302. package/dist/instanced/blocks.d.ts +0 -66
  303. package/dist/instanced/blocks.js +0 -294
  304. package/dist/instanced/blocks.js.map +0 -1
  305. package/dist/instanced/dirty.d.ts +0 -15
  306. package/dist/instanced/dirty.js +0 -96
  307. package/dist/instanced/dirty.js.map +0 -1
  308. package/dist/instanced/index.d.ts +0 -90
  309. package/dist/instanced/index.js +0 -349
  310. package/dist/instanced/index.js.map +0 -1
  311. package/dist/instanced/parts.d.ts +0 -14
  312. package/dist/instanced/parts.js +0 -79
  313. package/dist/instanced/parts.js.map +0 -1
  314. package/dist/instanced/select.d.ts +0 -92
  315. package/dist/instanced/select.js +0 -315
  316. package/dist/instanced/select.js.map +0 -1
  317. package/dist/instanced/store.d.ts +0 -31
  318. package/dist/instanced/store.js +0 -96
  319. package/dist/instanced/store.js.map +0 -1
  320. package/dist/levels.d.ts +0 -95
  321. package/dist/levels.js +0 -171
  322. package/dist/levels.js.map +0 -1
  323. package/dist/loader/bundle.d.ts +0 -25
  324. package/dist/loader/bundle.js +0 -241
  325. package/dist/loader/bundle.js.map +0 -1
  326. package/dist/loader/cache.d.ts +0 -15
  327. package/dist/loader/cache.js +0 -75
  328. package/dist/loader/cache.js.map +0 -1
  329. package/dist/loader/provenance.d.ts +0 -30
  330. package/dist/loader/provenance.js +0 -105
  331. package/dist/loader/provenance.js.map +0 -1
  332. package/dist/loader.d.ts +0 -55
  333. package/dist/loader.js +0 -239
  334. package/dist/loader.js.map +0 -1
  335. package/dist/material.js.map +0 -1
  336. package/dist/mesh/codec.d.ts +0 -4
  337. package/dist/mesh/codec.js.map +0 -1
  338. package/dist/pause.d.ts +0 -6
  339. package/dist/pause.js.map +0 -1
  340. package/dist/queue.d.ts +0 -2
  341. package/dist/queue.js +0 -33
  342. package/dist/queue.js.map +0 -1
  343. package/dist/renderer.d.ts +0 -21
  344. package/dist/renderer.js +0 -83
  345. package/dist/renderer.js.map +0 -1
  346. package/dist/residency.d.ts +0 -44
  347. package/dist/residency.js +0 -205
  348. package/dist/residency.js.map +0 -1
  349. package/dist/simplify.js.map +0 -1
  350. package/dist/source/shading.js.map +0 -1
  351. package/dist/source/texels.js.map +0 -1
  352. package/dist/source/trace.js.map +0 -1
  353. package/dist/view.d.ts +0 -45
  354. package/dist/view.js +0 -131
  355. package/dist/view.js.map +0 -1
@@ -1,349 +0,0 @@
1
- import { Box3, Matrix4, Object3D, Sphere, Vector3 } from "three/webgpu";
2
- import { at } from "../at.js";
3
- import { levelBox, measureLevels, prepareBounds } from "../bounds.js";
4
- import { disposeCopies } from "../dispose.js";
5
- import { Level, cloneLevels, estimate, fadeProgress, levelAt, tintLevels, validate } from "../levels.js";
6
- import { Lod } from "../lod.js";
7
- import { Residency } from "../residency.js";
8
- import { inShadowPass, sameClass } from "../three.js";
9
- import { TYPICAL_HEIGHT, View, viewportHeight, watchContext, unwatchContext, inView } from "../view.js";
10
- import { compileLevel } from "../compile.js";
11
- import { WIND_BOUNDS } from "../wind/hooks.js";
12
- import { copyWind, refreshWind } from "../wind/index.js";
13
- import { Meshes } from "./meshes.js";
14
- import { parts } from "./parts.js";
15
- import { Blocks } from "./blocks.js";
16
- import { Probes } from "./raycast.js";
17
- import { ARGS_BYTES } from "./args.js";
18
- import { Selection } from "./select.js";
19
- import { Store } from "./store.js";
20
- const view = new View();
21
- const inverse = new Matrix4();
22
- /**
23
- * Independently selected copies of one object, batched into indirect draws per view.
24
- * Thresholds, fades, global settings and shadows follow Lod. Each level's bounds tighten
25
- * to the region where its instances can draw. Instance matrices may scale arbitrarily;
26
- * the crowd's own transform and its parents should scale uniformly. Scale 0 draws nothing.
27
- *
28
- * Level templates are cloned, then their meshes are instanced. Skinned meshes,
29
- * InstancedMeshes (except ImpostorMesh) and nested Lods are unsupported. For external
30
- * detail, leave level 0 empty and draw the instances that `levelOf` reports there.
31
- *
32
- * Requires WebGPU `indirect-first-instance`. Sequential cameras are supported; nested
33
- * renders replace the outer selection, so exclude this crowd with camera layers.
34
- */
35
- export class InstancedLod extends Object3D {
36
- isLOD = true;
37
- isInstancedLod = true;
38
- /** Let the renderer call `update` with its camera every frame. */
39
- autoUpdate = true;
40
- /** Draw only this level for every instance, without fades. */
41
- forceLevel = null;
42
- levels;
43
- count;
44
- entries = [];
45
- probes;
46
- selection = null;
47
- meshes = null;
48
- residency = new Residency(this.entries, (level, object, context) => this.install(level, object, context), () => {
49
- this.selection?.route(this.residency.fallback, true);
50
- this.dispatchEvent({ type: "levelschange" });
51
- }, (error) => this.dispatchEvent({ type: "levelserror", error }));
52
- disposed = false;
53
- store;
54
- /** Bounding sphere of the source in an instance's space. */
55
- sphere = new Sphere();
56
- /** Every placed level, kept separate from the source sphere used for LOD selection. */
57
- envelope = new Box3();
58
- rest = new Sphere();
59
- /** Around every instance; each level may use tighter bounds. */
60
- bounds = new Sphere();
61
- /** Per level, what its meshes are culled by: `bounds`, or less where its instances must be near the camera. */
62
- reaches = [];
63
- /** Logical demand at the initial default viewport, separate from first-draw visibility. */
64
- demand = [];
65
- /** Source-radius padding for the shadow caster cutoff; culling pads every level separately. */
66
- padding = 0;
67
- blocks;
68
- last = { selected: false, eye: new Vector3(), scale: 0, ortho: false, fades: false, forced: null };
69
- get pending() {
70
- return this.residency.pending;
71
- }
72
- get error() {
73
- return this.residency.error;
74
- }
75
- /** `levels[0]` is the source. Empty only as the target of `copy`. */
76
- constructor(levels = [], count = 0) {
77
- super();
78
- if (!Number.isInteger(count) || count < 0)
79
- throw new Error(`InstancedLod: count must be an integer >= 0, got ${count}`);
80
- this.levels = this.entries;
81
- this.count = count;
82
- this.store = new Store(count);
83
- this.probes = new Probes(this.store.matrices, this.rest);
84
- const draws = levels.length > 0 ? this.build(levels) : 0;
85
- this.blocks = new Blocks(this.store.matrices, this.store.spheres, this.sphere, this.bounds, draws, this.rest);
86
- }
87
- build(inputs) {
88
- const { own, placed } = measureLevels(inputs, "InstancedLod");
89
- this.sphere.copy(placed);
90
- inputs.forEach((input, i) => {
91
- this.entries.push(new Level(input, i, this.entries));
92
- this.reaches.push(new Sphere());
93
- this.demand.push(new Sphere());
94
- this.envelope.union(levelBox(input));
95
- });
96
- estimate(this.entries, 2 * own.radius);
97
- validate(this.entries);
98
- this.residency.reset();
99
- this.boundLevels();
100
- const templates = this.entries.map(({ object }, i) => (object ? parts(object, i) : []));
101
- this.probes.add(templates[0] ?? []);
102
- const draws = templates.flatMap((parts) => parts.map((part) => part.draw));
103
- const selection = new Selection(this.store.matrices, this.sphere, templates.map((parts, i) => parts.length > 0 || at(inputs, i).box?.isEmpty() === false), draws, this.residency.fallback);
104
- this.selection = selection;
105
- this.store.attach(selection);
106
- const meshes = new Meshes(selection, this.reaches, this.drawRadius, {
107
- live: () => !this.disposed,
108
- drawn: (camera, mesh) => this.residency.drawn(camera, mesh),
109
- });
110
- this.meshes = meshes;
111
- let offset = 0;
112
- templates.forEach((parts, i) => {
113
- const made = meshes.make(at(this.entries, i), parts, offset);
114
- offset += made.length * ARGS_BYTES;
115
- meshes.byLevel[i] = made;
116
- for (const mesh of made)
117
- this.add(mesh);
118
- });
119
- if (draws.length === 0)
120
- watchContext(this);
121
- return draws.length;
122
- }
123
- /** Compile only the arriving level; bounds and instance buffers stay fixed. */
124
- async install(level, template, context) {
125
- const { selection, meshes } = this;
126
- if (!selection || !meshes)
127
- throw new Error("InstancedLod: missing selection");
128
- const staged = new Object3D();
129
- const object = template.clone();
130
- if (level.box)
131
- prepareBounds(object, level.box);
132
- const found = parts(object, level.index);
133
- const offset = selection.append(found.map((part) => part.draw));
134
- // A deferred level has no upfront mesh count, so its indirect draw table can relocate.
135
- meshes.relocate();
136
- const made = meshes.make(level, found, offset);
137
- for (const mesh of made)
138
- staged.add(mesh);
139
- const abandon = () => {
140
- for (const mesh of made)
141
- meshes.free(mesh);
142
- disposeCopies(object);
143
- };
144
- try {
145
- refreshWind(this, staged);
146
- await compileLevel(staged, context);
147
- }
148
- catch (error) {
149
- abandon();
150
- throw error;
151
- }
152
- if (this.disposed) {
153
- abandon();
154
- return;
155
- }
156
- level.object = object;
157
- if (made.length > 0)
158
- unwatchContext(this);
159
- if (level.index === 0)
160
- this.probes.add(found);
161
- meshes.byLevel[level.index] = made;
162
- for (const mesh of made)
163
- this.add(mesh);
164
- }
165
- /** Metadata includes unloaded levels, so later arrivals cannot enlarge this envelope. */
166
- boundLevels() {
167
- this.rest.copy(this.sphere);
168
- if (this.envelope.isEmpty())
169
- return;
170
- const { center } = this.rest;
171
- const { min, max } = this.envelope;
172
- 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))));
173
- }
174
- setMatrixAt(index, matrix) {
175
- this.store.setMatrix(index, matrix);
176
- }
177
- getMatrixAt(index, matrix) {
178
- return this.store.getMatrix(index, matrix);
179
- }
180
- /** Tint instance `index` by `color`, as InstancedMesh.setColorAt does, in every level. */
181
- setColorAt(index, color) {
182
- const first = this.store.colors === null;
183
- this.store.setColor(index, color);
184
- if (first)
185
- this.meshes?.recolor();
186
- }
187
- /** Instance `index`'s colour: white unless set. */
188
- getColorAt(index, color) {
189
- return this.store.getColor(index, color);
190
- }
191
- /**
192
- * The finest level instance `index` drew in the last update, or null before the first
193
- * (or at scale 0). Inside a fade the next coarser level draws too.
194
- */
195
- levelOf(index) {
196
- const { last, store } = this;
197
- store.check(index);
198
- if (!last.selected)
199
- return null;
200
- store.measure(this.blocks);
201
- const offset = index * 4;
202
- const r = at(store.spheres, offset + 3);
203
- if (r === 0)
204
- return null;
205
- let height = 2 * r * last.scale;
206
- if (!last.ortho) {
207
- const dx = at(store.spheres, offset) - last.eye.x;
208
- const dy = at(store.spheres, offset + 1) - last.eye.y;
209
- const dz = at(store.spheres, offset + 2) - last.eye.z;
210
- height /= Math.max(Math.sqrt(dx * dx + dy * dy + dz * dz), 1e-6);
211
- }
212
- const level = levelAt(this.entries, height, last.forced);
213
- const selected = last.fades && fadeProgress(this.entries, level, height) > 0 ? level.index - 1 : level.index;
214
- const ready = at(this.residency.fallback, selected);
215
- return ready < 0 ? null : ready;
216
- }
217
- /** Source radius padded for the level shaders' shadow caster cutoff. */
218
- get drawRadius() {
219
- return this.sphere.radius * (1 + this.padding);
220
- }
221
- [WIND_BOUNDS](padding, slope, baseY) {
222
- this.padding = padding / this.sphere.radius;
223
- this.meshes?.setRadius(this.drawRadius);
224
- // The wind shape comes from the source, but taller/offset levels can sway farther.
225
- const reach = slope * Math.max(Math.abs(this.envelope.min.y - baseY), Math.abs(this.envelope.max.y - baseY));
226
- this.blocks.pad(this.rest.radius > 0 ? reach / this.rest.radius : 0);
227
- this.blocks.refit();
228
- }
229
- /** Sort instances for `camera`; demand begins after its first drawing context exists. */
230
- update(camera) {
231
- if (this.disposed || inShadowPass(this))
232
- return;
233
- const { entries, selection, meshes } = this;
234
- if (!selection || !meshes)
235
- return;
236
- validate(entries);
237
- if (this.forceLevel !== null && !entries[this.forceLevel])
238
- throw new Error(`Lod: forceLevel ${this.forceLevel} is not a level`);
239
- this.store.measure(this.blocks);
240
- const height = viewportHeight(camera);
241
- view.begin(camera, height ?? TYPICAL_HEIGHT, this.forceLevel);
242
- tintLevels(entries, Lod.debug);
243
- const worldScale = this.matrixWorld.getMaxScaleOnAxis();
244
- const scale = view.scale * Lod.quality * (view.ortho ? worldScale : 1);
245
- const { last } = this;
246
- last.eye.copy(view.eye).applyMatrix4(inverse.copy(this.matrixWorld).invert());
247
- last.selected = true;
248
- last.scale = scale;
249
- last.ortho = view.ortho;
250
- last.fades = view.fades;
251
- last.forced = this.forceLevel;
252
- const stable = this.blocks.select(entries, last, this.reaches, height !== null, this.matrixWorld);
253
- const { residency } = this;
254
- const progress = residency.progress;
255
- if (selection.progress.value !== progress) {
256
- selection.progress.value = progress;
257
- selection.changed();
258
- }
259
- const needed = [];
260
- if (this.bounds.isEmpty()) {
261
- // Reusable crowds can be populated and drawn in the same frame.
262
- for (const level of entries)
263
- if (level.object)
264
- needed.push(level.index);
265
- }
266
- else if (residency.needsDemand(camera, meshes.byLevel)) {
267
- this.blocks.demand(entries, last, this.demand, this.matrixWorld);
268
- // Coarsest first, so its load starts first.
269
- for (let i = this.demand.length - 1; i >= 0; i--)
270
- if (inView(camera, this.matrixWorld, at(this.demand, i)))
271
- needed.push(i);
272
- this.reroute(progress);
273
- }
274
- residency.demand(camera, needed);
275
- residency.update(camera, meshes.byLevel);
276
- selection.aim(last.eye, scale, view.ortho, view.fades, this.forceLevel, entries, stable);
277
- // Selected only when something may draw: an InstancedLod with every level hidden
278
- // keeps its last selection.
279
- meshes.schedule(meshes.show(camera, this.matrixWorld));
280
- }
281
- /** Move each level's reach to the level that draws in its place: its fallback, and during a handover also its previous one. */
282
- reroute(progress) {
283
- const { fallback, previous } = this.residency;
284
- for (let i = this.reaches.length - 1; i >= 0; i--) {
285
- const reach = at(this.reaches, i);
286
- const target = at(fallback, i);
287
- const before = progress < 1 ? at(previous, i) : -1;
288
- if (before >= 0 && before !== target)
289
- at(this.reaches, before).union(reach);
290
- if (target === i)
291
- continue;
292
- if (target >= 0)
293
- at(this.reaches, target).union(reach);
294
- reach.makeEmpty();
295
- }
296
- }
297
- /**
298
- * Hits every instance's source level, with `instanceId` set; `object` is this
299
- * InstancedLod. Meshes of the source on layers the raycaster does not test are skipped.
300
- */
301
- raycast(raycaster, intersects) {
302
- this.probes.raycast(this, raycaster, intersects);
303
- return false;
304
- }
305
- /**
306
- * Copies `source`'s levels, instances and settings into this empty InstancedLod of the
307
- * same count (it throws otherwise); the copy shares geometry and textures with `source`.
308
- */
309
- copy(source) {
310
- if (this.entries.length > 0 || this.count !== source.count)
311
- throw new Error("InstancedLod.copy: copy into an empty InstancedLod of the same count");
312
- super.copy(source, false);
313
- this.store.copy(source.store);
314
- const draws = source.entries.length > 0 ? this.build(cloneLevels(source.entries)) : 0;
315
- this.blocks = new Blocks(this.store.matrices, this.store.spheres, this.sphere, this.bounds, draws, this.rest);
316
- this.forceLevel = source.forceLevel;
317
- this.autoUpdate = source.autoUpdate;
318
- copyWind(source, this);
319
- return this;
320
- }
321
- clone() {
322
- // three's clone builds `new this.constructor()`, which has no count.
323
- const clone = new InstancedLod([], this.count).copy(this);
324
- if (!sameClass(this, clone))
325
- throw new Error("InstancedLod.clone: a subclass must override clone");
326
- return clone;
327
- }
328
- /** Release drawables and templates only after every owner sharing their geometry, materials and textures has stopped drawing. */
329
- dispose() {
330
- if (this.disposed)
331
- return;
332
- this.disposed = true;
333
- unwatchContext(this);
334
- this.residency.dispose(() => {
335
- this.clearDraws();
336
- for (const { object } of this.entries)
337
- if (object)
338
- disposeCopies(object);
339
- });
340
- }
341
- clearDraws() {
342
- this.meshes?.dispose();
343
- this.meshes = null;
344
- this.selection?.dispose();
345
- this.selection = null;
346
- this.store.attach(null);
347
- }
348
- }
349
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/instanced/index.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { type BufferGeometry, Matrix4, type Mesh, type Object3D } from "three/webgpu";
2
- import type { IndirectDraw } from "./select.js";
3
- export interface Part {
4
- template: Mesh;
5
- placement: Matrix4;
6
- group: number;
7
- draw: IndirectDraw;
8
- }
9
- /** Template meshes and material groups, placed once in the instance's space. */
10
- export declare function parts(object: Object3D, level: number): Part[];
11
- /** The faded material of `mesh`'s material group `group`. */
12
- export declare function groupMaterial(mesh: Mesh, group: number): import("three/webgpu").NodeMaterial;
13
- /** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
14
- export declare function placed(geometry: BufferGeometry, placement: Matrix4): BufferGeometry;
@@ -1,79 +0,0 @@
1
- import { Matrix4 } from "three/webgpu";
2
- import { levelMaterial } from "../material.js";
3
- import { isImpostorMesh, isInstancedMesh, isLOD, isMesh, rejectSkinned } from "../three.js";
4
- // A level template split into the parts an InstancedLod draws, placed in the instance's space.
5
- const IDENTITY = new Matrix4();
6
- /** Template meshes and material groups, placed once in the instance's space. */
7
- export function parts(object, level) {
8
- rejectSkinned(object, "InstancedLod");
9
- object.updateWorldMatrix(true, true);
10
- const outside = object.parent ? object.parent.matrixWorld.clone().invert() : new Matrix4();
11
- const found = [];
12
- object.traverse((node) => {
13
- if (isLOD(node))
14
- throw new Error("InstancedLod: levels cannot contain a Lod or InstancedLod; nest them with Lod");
15
- if (isInstancedMesh(node) && !isImpostorMesh(node))
16
- throw new Error(`InstancedLod: levels cannot contain an InstancedMesh ("${node.name}")`);
17
- if (!isMesh(node))
18
- return;
19
- const placement = outside.clone().multiply(node.matrixWorld);
20
- ranges(node).forEach((range, group) => found.push({ template: node, placement, group, draw: { level, ...range } }));
21
- });
22
- return found;
23
- }
24
- /** The index (or vertex) ranges `mesh` draws, clipped to its draw range; group order is preserved even for empty draws. */
25
- function ranges(mesh) {
26
- const { geometry } = mesh;
27
- const indexed = geometry.index !== null;
28
- const total = geometry.index?.count ?? geometry.getAttribute("position").count;
29
- const groups = Array.isArray(mesh.material) ? geometry.groups : [{ start: 0, count: total }];
30
- return groups.map(({ start, count }) => {
31
- const first = Math.min(total, Math.max(0, start, geometry.drawRange.start));
32
- const end = Math.min(total, start + count, geometry.drawRange.start + geometry.drawRange.count);
33
- return { count: Math.max(0, end - first), start: first, indexed };
34
- });
35
- }
36
- /** The faded material of `mesh`'s material group `group`. */
37
- export function groupMaterial(mesh, group) {
38
- if (!Array.isArray(mesh.material))
39
- return levelMaterial(mesh.material);
40
- const index = mesh.geometry.groups[group]?.materialIndex ?? 0;
41
- const material = mesh.material[index];
42
- if (!material)
43
- throw new Error(`InstancedLod: "${mesh.name}" has no material ${index}`);
44
- return levelMaterial(material);
45
- }
46
- /** Placed copies of geometries, shared by every InstancedLod drawing the same mesh the same way. */
47
- const copies = new WeakMap();
48
- /** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
49
- export function placed(geometry, placement) {
50
- if (placement.equals(IDENTITY))
51
- return geometry;
52
- const known = copies.get(geometry) ?? [];
53
- copies.set(geometry, known);
54
- const hit = known.find((entry) => entry.placement.equals(placement));
55
- if (hit)
56
- return hit.geometry;
57
- const copy = geometry.clone();
58
- const box = copy.boundingBox;
59
- const sphere = copy.boundingSphere;
60
- // applyMatrix4 otherwise recomputes both bounds by walking the transformed vertices.
61
- copy.boundingBox = null;
62
- copy.boundingSphere = null;
63
- // Translations leave normals and tangents unchanged; scanning them stalls large source arrivals.
64
- if (placement.clone().setPosition(0, 0, 0).equals(IDENTITY)) {
65
- const position = copy.getAttribute("position");
66
- if (position) {
67
- position.applyMatrix4(placement);
68
- position.needsUpdate = true;
69
- }
70
- }
71
- else
72
- copy.applyMatrix4(placement);
73
- copy.boundingBox = box?.applyMatrix4(placement) ?? null;
74
- copy.boundingSphere = sphere?.applyMatrix4(placement) ?? null;
75
- geometry.addEventListener("dispose", () => copy.dispose());
76
- known.push({ placement: placement.clone(), geometry: copy });
77
- return copy;
78
- }
79
- //# sourceMappingURL=parts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/instanced/parts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,OAAO,EAA4B,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5F,+FAA+F;AAE/F,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;AAS/B,gFAAgF;AAChF,MAAM,UAAU,KAAK,CAAC,MAAgB,EAAE,KAAa;IACnD,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACtC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC3F,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,IAAI,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAClH,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7I,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO;QAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2HAA2H;AAC3H,SAAS,MAAM,CAAC,IAAU;IACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC;IAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7F,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChG,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,IAAU,EAAE,KAAa;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,IAAI,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,qBAAqB,KAAK,EAAE,CAAC,CAAC;IACxF,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,oGAAoG;AACpG,MAAM,MAAM,GAAG,IAAI,OAAO,EAA2E,CAAC;AAEtG,uFAAuF;AACvF,MAAM,UAAU,MAAM,CAAC,QAAwB,EAAE,SAAkB;IACjE,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;IACnC,qFAAqF;IACrF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC3B,iGAAiG;IACjG,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACjC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;;QAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACxD,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAC9D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,92 +0,0 @@
1
- import { type IndirectStorageBufferAttribute, StorageBufferAttribute, StorageInstancedBufferAttribute, Vector3, type ComputeNode, type Node, type Renderer, type Sphere } from "three/webgpu";
2
- /** The slots every level draws from, `count` per level that draws, from its `first`. */
3
- interface Slots {
4
- readonly matrices: StorageInstancedBufferAttribute;
5
- readonly fades: StorageBufferAttribute;
6
- /** RGB and a pad per slot, once the instances have colours */
7
- colors: StorageInstancedBufferAttribute | null;
8
- }
9
- /** One indirect draw: a level's mesh, drawing `count` indices (or vertices) from `start`. */
10
- export interface IndirectDraw {
11
- level: number;
12
- count: number;
13
- start: number;
14
- indexed: boolean;
15
- }
16
- export declare class Selection {
17
- private draws;
18
- /** The instances' matrices, as `setMatrixAt` writes them. */
19
- readonly matrices: StorageBufferAttribute;
20
- /** The instances' colours (RGB, padded to four floats), once there are any. */
21
- colors: StorageBufferAttribute | null;
22
- readonly count: number;
23
- readonly slots: Slots;
24
- /** Per level, its first slot, or null for a level that draws nothing. */
25
- readonly first: Array<number | null>;
26
- /** Shared page containing this selection's draws, `ARGS_BYTES` apart. */
27
- get args(): IndirectStorageBufferAttribute;
28
- /** Byte offset of this selection's first draw in its page. */
29
- get argsOffset(): number;
30
- readonly eye: import("three/webgpu").UniformNode<"vec3", Vector3>;
31
- /** Pixels per unit of subtense (perspective) or of size (orthographic), × Lod.quality. */
32
- readonly scale: import("three/webgpu").UniformNode<"float", number>;
33
- readonly ortho: import("three/webgpu").UniformNode<"uint", number>;
34
- readonly fades: import("three/webgpu").UniformNode<"uint", number>;
35
- /** The level every instance draws, or -1. */
36
- readonly forced: import("three/webgpu").UniformNode<"int", number>;
37
- /** Per level, its maxPixels (any finite stand-in for level 0's Infinity). */
38
- readonly maxPixels: Array<{
39
- value: number;
40
- } & Node<"float">>;
41
- private readonly counts;
42
- private slice;
43
- private readonly routes;
44
- private readonly previous;
45
- private readonly starts;
46
- private readonly bounds;
47
- readonly progress: import("three/webgpu").UniformNode<"float", number>;
48
- private readonly drawCount;
49
- private readonly records;
50
- private readonly arguments;
51
- private readonly argsStart;
52
- private kernels;
53
- /**
54
- * The renderers whose buffers hold the selection for the view and instances as they are
55
- * (each renderer keeps its own copy of the buffers): see `aim` and `changed`.
56
- */
57
- private readonly current;
58
- private revision;
59
- private stable;
60
- private readonly colorRenderers;
61
- private rendererCount;
62
- constructor(
63
- /** 16 floats per instance */
64
- matrices: Float32Array,
65
- /** One instance's bounding sphere, in its own space. */
66
- sphere: Sphere,
67
- /** Per level, whether it draws anything. */
68
- drawing: readonly boolean[], draws: readonly IndirectDraw[], fallback: readonly number[]);
69
- private allocate;
70
- /** Slots and kernels survive arrivals; only the variable-size draw table is replaced. */
71
- append(draws: readonly IndirectDraw[]): number;
72
- /** Residency is data, including the previous route for the arrival's dither fade. */
73
- route(fallback: readonly number[], fade?: boolean): void;
74
- private writeDraws;
75
- /** Select for this view next; the uniforms are set and compared here. */
76
- aim(eye: Vector3, scale: number, ortho: boolean, fades: boolean, forced: number | null, levels: readonly {
77
- maxPixels: number;
78
- }[], stable?: object): void;
79
- /** The instances changed since the last selection. */
80
- changed(): void;
81
- /** The passes `renderer` has to run for the selection to be current in its buffers, or none. */
82
- take(renderer: Renderer): ComputeNode[];
83
- /** Carry `colors` (4 floats per instance) with the instances from now on, into the slots. */
84
- useColors(colors: Float32Array): void;
85
- /** Frees its buffers and passes. */
86
- dispose(): void;
87
- private passes;
88
- /** The pass that fills the slots. */
89
- private selectPass;
90
- private argumentsPass;
91
- }
92
- export {};