@drawcall/lod 0.1.2 → 0.3.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 (358) hide show
  1. package/README.md +13 -70
  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/bake.d.ts +22 -0
  6. package/dist/bake.js +88 -0
  7. package/dist/bake.js.map +1 -0
  8. package/dist/baked/codec.d.ts +5 -5
  9. package/dist/baked/codec.js +58 -158
  10. package/dist/baked/codec.js.map +1 -1
  11. package/dist/baked/coverage.d.ts +6 -3
  12. package/dist/baked/coverage.js +6 -3
  13. package/dist/baked/coverage.js.map +1 -1
  14. package/dist/baked/fields.d.ts +9 -0
  15. package/dist/baked/fields.js +22 -0
  16. package/dist/baked/fields.js.map +1 -0
  17. package/dist/baked/index.d.ts +16 -6
  18. package/dist/baked/index.js +23 -21
  19. package/dist/baked/index.js.map +1 -1
  20. package/dist/baked/interior/faces.d.ts +4 -3
  21. package/dist/baked/interior/faces.js +13 -10
  22. package/dist/baked/interior/faces.js.map +1 -1
  23. package/dist/baked/interior/material.d.ts +7 -10
  24. package/dist/baked/interior/material.js +29 -36
  25. package/dist/baked/interior/material.js.map +1 -1
  26. package/dist/baked/interior/rooms.js +1 -1
  27. package/dist/baked/interior/rooms.js.map +1 -1
  28. package/dist/baked/low.d.ts +2 -2
  29. package/dist/baked/low.js +9 -8
  30. package/dist/baked/low.js.map +1 -1
  31. package/dist/baked/raster.js +6 -6
  32. package/dist/baked/raster.js.map +1 -1
  33. package/dist/baked/textures.d.ts +17 -0
  34. package/dist/baked/textures.js +95 -0
  35. package/dist/baked/textures.js.map +1 -0
  36. package/dist/baked/transfer.js +19 -18
  37. package/dist/baked/transfer.js.map +1 -1
  38. package/dist/baked/unwrap.js +4 -3
  39. package/dist/baked/unwrap.js.map +1 -1
  40. package/dist/baked/xatlas.js.map +1 -1
  41. package/dist/codec/container.d.ts +8 -0
  42. package/dist/codec/container.js +63 -0
  43. package/dist/codec/container.js.map +1 -0
  44. package/dist/codec/mesh.d.ts +8 -0
  45. package/dist/codec/mesh.js +220 -0
  46. package/dist/codec/mesh.js.map +1 -0
  47. package/dist/dispose.d.ts +11 -4
  48. package/dist/dispose.js +39 -12
  49. package/dist/dispose.js.map +1 -1
  50. package/dist/gpu.d.ts +39 -0
  51. package/dist/gpu.js +41 -0
  52. package/dist/gpu.js.map +1 -0
  53. package/dist/impostor/bake/atlas.d.ts +4 -4
  54. package/dist/impostor/bake/atlas.js +12 -12
  55. package/dist/impostor/bake/atlas.js.map +1 -1
  56. package/dist/impostor/bake/fit.d.ts +8 -0
  57. package/dist/impostor/bake/fit.js +28 -0
  58. package/dist/impostor/bake/fit.js.map +1 -0
  59. package/dist/impostor/bake/index.d.ts +23 -14
  60. package/dist/impostor/bake/index.js +42 -134
  61. package/dist/impostor/bake/index.js.map +1 -1
  62. package/dist/impostor/bake/materials.d.ts +3 -3
  63. package/dist/impostor/bake/materials.js +60 -12
  64. package/dist/impostor/bake/materials.js.map +1 -1
  65. package/dist/impostor/bake/sheet.d.ts +8 -0
  66. package/dist/impostor/bake/sheet.js +90 -0
  67. package/dist/impostor/bake/sheet.js.map +1 -0
  68. package/dist/impostor/bake/source.d.ts +2 -2
  69. package/dist/impostor/bake/source.js +8 -19
  70. package/dist/impostor/bake/source.js.map +1 -1
  71. package/dist/impostor/codec.d.ts +5 -11
  72. package/dist/impostor/codec.js +37 -121
  73. package/dist/impostor/codec.js.map +1 -1
  74. package/dist/impostor/impostor.d.ts +31 -7
  75. package/dist/impostor/impostor.js +21 -6
  76. package/dist/impostor/impostor.js.map +1 -1
  77. package/dist/impostor/ktx2/encode.d.ts +26 -0
  78. package/dist/impostor/ktx2/encode.js +117 -0
  79. package/dist/impostor/ktx2/encode.js.map +1 -0
  80. package/dist/impostor/ktx2/transcode.d.ts +3 -0
  81. package/dist/impostor/ktx2/transcode.js +99 -0
  82. package/dist/impostor/ktx2/transcode.js.map +1 -0
  83. package/dist/impostor/ktx2/uastc.d.ts +7 -0
  84. package/dist/impostor/ktx2/uastc.js +64 -0
  85. package/dist/impostor/ktx2/uastc.js.map +1 -0
  86. package/dist/impostor/ktx2/wasm/encoder.d.ts +4 -0
  87. package/dist/impostor/ktx2/wasm/encoder.js +10 -0
  88. package/dist/impostor/ktx2/wasm/encoder.js.map +1 -0
  89. package/dist/impostor/ktx2/wasm/transcoder.d.ts +3 -0
  90. package/dist/impostor/ktx2/wasm/transcoder.js +9 -0
  91. package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -0
  92. package/dist/impostor/ktx2/worker.d.ts +1 -0
  93. package/dist/impostor/ktx2/worker.js +12 -0
  94. package/dist/impostor/ktx2/worker.js.map +1 -0
  95. package/dist/impostor/mesh/card.d.ts +3 -3
  96. package/dist/impostor/mesh/card.js +11 -8
  97. package/dist/impostor/mesh/card.js.map +1 -1
  98. package/dist/impostor/mesh/index.d.ts +10 -7
  99. package/dist/impostor/mesh/index.js +15 -18
  100. package/dist/impostor/mesh/index.js.map +1 -1
  101. package/dist/impostor/mesh/material.d.ts +24 -13
  102. package/dist/impostor/mesh/material.js +67 -51
  103. package/dist/impostor/mesh/material.js.map +1 -1
  104. package/dist/impostor/mesh/surface.d.ts +20 -16
  105. package/dist/impostor/mesh/surface.js +81 -58
  106. package/dist/impostor/mesh/surface.js.map +1 -1
  107. package/dist/impostor/mesh/textures.d.ts +3 -3
  108. package/dist/impostor/mesh/textures.js +24 -34
  109. package/dist/impostor/mesh/textures.js.map +1 -1
  110. package/dist/impostor/octahedral.d.ts +1 -8
  111. package/dist/impostor/octahedral.js +3 -18
  112. package/dist/impostor/octahedral.js.map +1 -1
  113. package/dist/index.d.ts +16 -10
  114. package/dist/index.js +14 -8
  115. package/dist/index.js.map +1 -1
  116. package/dist/instanced/camera.d.ts +46 -0
  117. package/dist/instanced/camera.js +70 -0
  118. package/dist/instanced/camera.js.map +1 -0
  119. package/dist/instanced/chunk.d.ts +97 -0
  120. package/dist/instanced/chunk.js +156 -0
  121. package/dist/instanced/chunk.js.map +1 -0
  122. package/dist/instanced/chunks.d.ts +60 -0
  123. package/dist/instanced/chunks.js +208 -0
  124. package/dist/instanced/chunks.js.map +1 -0
  125. package/dist/instanced/cull.d.ts +28 -0
  126. package/dist/instanced/cull.js +22 -0
  127. package/dist/instanced/cull.js.map +1 -0
  128. package/dist/instanced/index.d.ts +96 -92
  129. package/dist/instanced/index.js +229 -512
  130. package/dist/instanced/index.js.map +1 -1
  131. package/dist/instanced/key.d.ts +19 -0
  132. package/dist/instanced/key.js +45 -0
  133. package/dist/instanced/key.js.map +1 -0
  134. package/dist/instanced/levels.d.ts +60 -0
  135. package/dist/instanced/levels.js +130 -0
  136. package/dist/instanced/levels.js.map +1 -0
  137. package/dist/instanced/lists.d.ts +70 -0
  138. package/dist/instanced/lists.js +133 -0
  139. package/dist/instanced/lists.js.map +1 -0
  140. package/dist/instanced/measure.d.ts +28 -0
  141. package/dist/instanced/measure.js +203 -0
  142. package/dist/instanced/measure.js.map +1 -0
  143. package/dist/instanced/meshes.d.ts +46 -14
  144. package/dist/instanced/meshes.js +137 -22
  145. package/dist/instanced/meshes.js.map +1 -1
  146. package/dist/instanced/mirror.d.ts +20 -0
  147. package/dist/instanced/mirror.js +37 -0
  148. package/dist/instanced/mirror.js.map +1 -0
  149. package/dist/instanced/pages/buffers.d.ts +37 -0
  150. package/dist/instanced/pages/buffers.js +15 -0
  151. package/dist/instanced/pages/buffers.js.map +1 -0
  152. package/dist/instanced/pages/chunk.d.ts +51 -0
  153. package/dist/instanced/pages/chunk.js +81 -0
  154. package/dist/instanced/pages/chunk.js.map +1 -0
  155. package/dist/instanced/pages/index.d.ts +74 -0
  156. package/dist/instanced/pages/index.js +269 -0
  157. package/dist/instanced/pages/index.js.map +1 -0
  158. package/dist/instanced/pages/passes.d.ts +21 -0
  159. package/dist/instanced/pages/passes.js +52 -0
  160. package/dist/instanced/pages/passes.js.map +1 -0
  161. package/dist/instanced/pages/slots.d.ts +11 -0
  162. package/dist/instanced/pages/slots.js +90 -0
  163. package/dist/instanced/pages/slots.js.map +1 -0
  164. package/dist/instanced/pages/workgroup.d.ts +14 -0
  165. package/dist/instanced/pages/workgroup.js +38 -0
  166. package/dist/instanced/pages/workgroup.js.map +1 -0
  167. package/dist/instanced/raycast.d.ts +15 -0
  168. package/dist/instanced/raycast.js +46 -0
  169. package/dist/instanced/raycast.js.map +1 -0
  170. package/dist/instanced/rows.d.ts +108 -0
  171. package/dist/instanced/rows.js +209 -0
  172. package/dist/instanced/rows.js.map +1 -0
  173. package/dist/instanced/shape.d.ts +25 -0
  174. package/dist/instanced/shape.js +51 -0
  175. package/dist/instanced/shape.js.map +1 -0
  176. package/dist/instanced/sort.d.ts +63 -0
  177. package/dist/instanced/sort.js +162 -0
  178. package/dist/instanced/sort.js.map +1 -0
  179. package/dist/instanced/update.d.ts +30 -0
  180. package/dist/instanced/update.js +207 -0
  181. package/dist/instanced/update.js.map +1 -0
  182. package/dist/levels/bounds.d.ts +21 -0
  183. package/dist/levels/bounds.js +42 -0
  184. package/dist/levels/bounds.js.map +1 -0
  185. package/dist/levels/cameras.d.ts +48 -0
  186. package/dist/levels/cameras.js +122 -0
  187. package/dist/levels/cameras.js.map +1 -0
  188. package/dist/levels/compile/contexts.d.ts +30 -0
  189. package/dist/levels/compile/contexts.js +18 -0
  190. package/dist/levels/compile/contexts.js.map +1 -0
  191. package/dist/levels/compile/index.d.ts +39 -0
  192. package/dist/levels/compile/index.js +185 -0
  193. package/dist/levels/compile/index.js.map +1 -0
  194. package/dist/levels/compile/pipelines.d.ts +26 -0
  195. package/dist/levels/compile/pipelines.js +177 -0
  196. package/dist/levels/compile/pipelines.js.map +1 -0
  197. package/dist/levels/compiles.d.ts +29 -0
  198. package/dist/levels/compiles.js +50 -0
  199. package/dist/levels/compiles.js.map +1 -0
  200. package/dist/levels/draw.d.ts +102 -0
  201. package/dist/levels/draw.js +401 -0
  202. package/dist/levels/draw.js.map +1 -0
  203. package/dist/levels/fade.d.ts +69 -0
  204. package/dist/levels/fade.js +150 -0
  205. package/dist/levels/fade.js.map +1 -0
  206. package/dist/levels/index.d.ts +99 -0
  207. package/dist/levels/index.js +155 -0
  208. package/dist/levels/index.js.map +1 -0
  209. package/dist/levels/item.d.ts +38 -0
  210. package/dist/levels/item.js +97 -0
  211. package/dist/levels/item.js.map +1 -0
  212. package/dist/levels/load.d.ts +31 -0
  213. package/dist/levels/load.js +142 -0
  214. package/dist/levels/load.js.map +1 -0
  215. package/dist/levels/manager.d.ts +159 -0
  216. package/dist/levels/manager.js +339 -0
  217. package/dist/levels/manager.js.map +1 -0
  218. package/dist/{material.js → levels/material.js} +13 -7
  219. package/dist/levels/material.js.map +1 -0
  220. package/dist/levels/renderer.d.ts +29 -0
  221. package/dist/levels/renderer.js +41 -0
  222. package/dist/levels/renderer.js.map +1 -0
  223. package/dist/levels/requests.d.ts +49 -0
  224. package/dist/levels/requests.js +95 -0
  225. package/dist/levels/requests.js.map +1 -0
  226. package/dist/levels/screen.d.ts +14 -0
  227. package/dist/levels/screen.js +21 -0
  228. package/dist/levels/screen.js.map +1 -0
  229. package/dist/levels/wait.d.ts +27 -0
  230. package/dist/levels/wait.js +61 -0
  231. package/dist/levels/wait.js.map +1 -0
  232. package/dist/loader/build.d.ts +10 -0
  233. package/dist/loader/build.js +28 -0
  234. package/dist/loader/build.js.map +1 -0
  235. package/dist/loader/cache.d.ts +12 -15
  236. package/dist/loader/cache.js +64 -33
  237. package/dist/loader/cache.js.map +1 -1
  238. package/dist/loader/context.d.ts +46 -0
  239. package/dist/loader/context.js +91 -0
  240. package/dist/loader/context.js.map +1 -0
  241. package/dist/loader/dependencies.d.ts +32 -0
  242. package/dist/loader/dependencies.js +113 -0
  243. package/dist/loader/dependencies.js.map +1 -0
  244. package/dist/loader/index.d.ts +62 -0
  245. package/dist/loader/index.js +284 -0
  246. package/dist/loader/index.js.map +1 -0
  247. package/dist/loader/level.d.ts +41 -0
  248. package/dist/loader/level.js +140 -0
  249. package/dist/loader/level.js.map +1 -0
  250. package/dist/loader/request.d.ts +87 -0
  251. package/dist/loader/request.js +59 -0
  252. package/dist/loader/request.js.map +1 -0
  253. package/dist/loader/url.d.ts +16 -0
  254. package/dist/loader/url.js +35 -0
  255. package/dist/loader/url.js.map +1 -0
  256. package/dist/lod.d.ts +79 -49
  257. package/dist/lod.js +209 -153
  258. package/dist/lod.js.map +1 -1
  259. package/dist/meshopt.d.ts +6 -0
  260. package/dist/meshopt.js +19 -0
  261. package/dist/meshopt.js.map +1 -0
  262. package/dist/simplify/cards.d.ts +14 -0
  263. package/dist/simplify/cards.js +128 -0
  264. package/dist/simplify/cards.js.map +1 -0
  265. package/dist/{simplify.d.ts → simplify/index.d.ts} +7 -4
  266. package/dist/{simplify.js → simplify/index.js} +42 -22
  267. package/dist/simplify/index.js.map +1 -0
  268. package/dist/{bounds.d.ts → source/detail.d.ts} +4 -13
  269. package/dist/{bounds.js → source/detail.js} +62 -32
  270. package/dist/source/detail.js.map +1 -0
  271. package/dist/source/{error.d.ts → deviation.d.ts} +3 -3
  272. package/dist/source/{error.js → deviation.js} +12 -12
  273. package/dist/source/deviation.js.map +1 -0
  274. package/dist/source/{shading.d.ts → evaluator.d.ts} +10 -10
  275. package/dist/source/{shading.js → evaluator.js} +5 -5
  276. package/dist/source/evaluator.js.map +1 -0
  277. package/dist/source/{trace.d.ts → raycaster.d.ts} +6 -6
  278. package/dist/source/{trace.js → raycaster.js} +8 -8
  279. package/dist/source/raycaster.js.map +1 -0
  280. package/dist/source/{texels.d.ts → sampler.d.ts} +1 -1
  281. package/dist/source/{texels.js → sampler.js} +3 -3
  282. package/dist/source/sampler.js.map +1 -0
  283. package/dist/source/source.d.ts +2 -2
  284. package/dist/source/source.js +2 -2
  285. package/dist/source/source.js.map +1 -1
  286. package/dist/source/surface.js +1 -1
  287. package/dist/source/surface.js.map +1 -1
  288. package/dist/task.d.ts +6 -0
  289. package/dist/{pause.js → task.js} +5 -5
  290. package/dist/task.js.map +1 -0
  291. package/dist/three.d.ts +20 -19
  292. package/dist/three.js +29 -35
  293. package/dist/three.js.map +1 -1
  294. package/dist/tsl.d.ts +10 -14
  295. package/dist/tsl.js +12 -47
  296. package/dist/tsl.js.map +1 -1
  297. package/dist/typegpu.d.ts +37 -0
  298. package/dist/typegpu.js +37 -0
  299. package/dist/typegpu.js.map +1 -0
  300. package/dist/wind/bounds.js +2 -2
  301. package/dist/wind/bounds.js.map +1 -1
  302. package/dist/wind/hooks.d.ts +7 -4
  303. package/dist/wind/hooks.js +5 -2
  304. package/dist/wind/hooks.js.map +1 -1
  305. package/dist/wind/index.d.ts +4 -4
  306. package/dist/wind/index.js +43 -40
  307. package/dist/wind/index.js.map +1 -1
  308. package/dist/wind/sway.d.ts +4 -1
  309. package/dist/wind/sway.js +4 -1
  310. package/dist/wind/sway.js.map +1 -1
  311. package/package.json +24 -8
  312. package/skills/lod/SKILL.md +147 -108
  313. package/dist/bounds.js.map +0 -1
  314. package/dist/fade.d.ts +0 -44
  315. package/dist/fade.js +0 -78
  316. package/dist/fade.js.map +0 -1
  317. package/dist/impostor/cache.d.ts +0 -15
  318. package/dist/impostor/cache.js +0 -44
  319. package/dist/impostor/cache.js.map +0 -1
  320. package/dist/instanced/args.d.ts +0 -20
  321. package/dist/instanced/args.js +0 -77
  322. package/dist/instanced/args.js.map +0 -1
  323. package/dist/instanced/bounds.d.ts +0 -50
  324. package/dist/instanced/bounds.js +0 -271
  325. package/dist/instanced/bounds.js.map +0 -1
  326. package/dist/instanced/dirty.d.ts +0 -12
  327. package/dist/instanced/dirty.js +0 -61
  328. package/dist/instanced/dirty.js.map +0 -1
  329. package/dist/instanced/select.d.ts +0 -84
  330. package/dist/instanced/select.js +0 -264
  331. package/dist/instanced/select.js.map +0 -1
  332. package/dist/lazy.d.ts +0 -64
  333. package/dist/lazy.js +0 -187
  334. package/dist/lazy.js.map +0 -1
  335. package/dist/levels.d.ts +0 -72
  336. package/dist/levels.js +0 -146
  337. package/dist/levels.js.map +0 -1
  338. package/dist/loader/dispose.d.ts +0 -3
  339. package/dist/loader/dispose.js +0 -25
  340. package/dist/loader/dispose.js.map +0 -1
  341. package/dist/loader.d.ts +0 -99
  342. package/dist/loader.js +0 -234
  343. package/dist/loader.js.map +0 -1
  344. package/dist/material.js.map +0 -1
  345. package/dist/pause.d.ts +0 -6
  346. package/dist/pause.js.map +0 -1
  347. package/dist/renderer.d.ts +0 -21
  348. package/dist/renderer.js +0 -83
  349. package/dist/renderer.js.map +0 -1
  350. package/dist/simplify.js.map +0 -1
  351. package/dist/source/error.js.map +0 -1
  352. package/dist/source/shading.js.map +0 -1
  353. package/dist/source/texels.js.map +0 -1
  354. package/dist/source/trace.js.map +0 -1
  355. package/dist/view.d.ts +0 -30
  356. package/dist/view.js +0 -75
  357. package/dist/view.js.map +0 -1
  358. /package/dist/{material.d.ts → levels/material.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -1,16 +1,22 @@
1
- export { LodLoader } from "./loader.js";
2
- export { setViewportHeight } from "./view.js";
1
+ export { LodLoader } from "./loader/index.js";
2
+ export {} from "./loader/request.js";
3
+ export {} from "./loader/cache.js";
4
+ export { encodeMeshAsync, decodeMeshAsync } from "./codec/mesh.js";
5
+ export { LodGpu } from "./gpu.js";
3
6
  export { Lod } from "./lod.js";
4
- export { LazyImpostor } from "./lazy.js";
5
- export { cachedImpostor } from "./impostor/cache.js";
6
7
  export { Wind } from "./wind/index.js";
7
8
  export { InstancedLod } from "./instanced/index.js";
8
- export {} from "./levels.js";
9
- export { simplify } from "./simplify.js";
9
+ export {} from "./instanced/cull.js";
10
+ export { InstancedLodChunk } from "./instanced/chunk.js";
11
+ export {} from "./instanced/raycast.js";
12
+ export {} from "./levels/index.js";
13
+ export { simplify } from "./simplify/index.js";
10
14
  export { bakeMesh } from "./baked/index.js";
11
- export { encodeBakedMesh, decodeBakedMesh } from "./baked/codec.js";
15
+ export { encodeBakedMeshAsync, decodeBakedMeshAsync } from "./baked/codec.js";
12
16
  export { bakeImpostor } from "./impostor/bake/index.js";
17
+ export { createBakeRenderer } from "./bake.js";
13
18
  export { ImpostorMesh } from "./impostor/mesh/index.js";
19
+ export { cosine } from "./impostor/mesh/surface.js";
14
20
  export {} from "./impostor/impostor.js";
15
- export { decodeImpostor, decodeImpostorAsync, encodeImpostor } from "./impostor/codec.js";
21
+ export { encodeImpostorAsync, decodeImpostorAsync } from "./impostor/codec.js";
16
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,SAAS,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAA4B,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,cAAc,EAA6B,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,IAAI,EAAsC,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAiB,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAwB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAwB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAA4B,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAA4B,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAwD,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAyC,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAwB,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,GAAG,EAAmB,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,IAAI,EAAsC,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAA4B,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAqB,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAoC,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAiC,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAiB,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAwB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAwB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAA4B,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAA4B,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAwD,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { Matrix4, type Camera, type Vector3 } from "three/webgpu";
2
+ import type { d } from "typegpu";
3
+ import type { EncodedLevels } from "../levels/index.js";
4
+ import type { DrawLevels } from "../levels/draw.js";
5
+ import type { ChunkSet } from "./chunks.js";
6
+ import type { Cull } from "./cull.js";
7
+ import type { CameraLists } from "./lists.js";
8
+ import type { InstanceShape } from "./shape.js";
9
+ /** A camera in an InstancedLod's space (see `localCamera`). */
10
+ export interface LocalCamera {
11
+ levels: d.Infer<typeof DrawLevels>;
12
+ eye: Vector3;
13
+ /** Pixels per unit of subtense (or of size, orthographic). */
14
+ scale: number;
15
+ ortho: boolean;
16
+ }
17
+ /** The level loading state levelsToDraw reads (see LodLevelLoadManager). */
18
+ export interface Loading {
19
+ loaded: number;
20
+ before: number;
21
+ progress: number;
22
+ }
23
+ /**
24
+ * `camera`, drawing into a target `height` pixels tall (see screenOf), in the space of `space`, an InstancedLod's world matrix: the
25
+ * levels of `encoded` as levelsToDraw reads them for it, `forced` drawn alone if not null, where it looks from and its
26
+ * pixels per unit.
27
+ */
28
+ export declare function localCamera(camera: Camera, height: number, space: Matrix4, encoded: EncodedLevels, forced: number | null): LocalCamera;
29
+ /**
30
+ * Work out into `found`, a camera's lists, the heights `chunks`' instances can have on its screen and the levels it
31
+ * needs loaded for them, in one walk of the chunks, only once what that reads changed.
32
+ */
33
+ export declare function walk(found: CameraLists, { levels, eye, scale, ortho, cull }: LocalCamera & {
34
+ cull: Cull | null;
35
+ }, { chunks, shape, encoded }: {
36
+ chunks: ChunkSet;
37
+ shape: InstanceShape;
38
+ encoded: EncodedLevels;
39
+ }): void;
40
+ /**
41
+ * The levels whose meshes draw for the camera of `found` with what is loaded: those levelsToDraw draws at a height
42
+ * some chunk's instances can have, with the levels of `loaded`, and while an arrival is under way those of `before`
43
+ * too, as levelsToDraw draws only what one or the other draws until the arrival ends. Sets `found.onlyLevel` too.
44
+ * Worked out again only once what that reads changed.
45
+ */
46
+ export declare function shownBy(found: CameraLists, levels: LocalCamera["levels"], encoded: EncodedLevels, { loaded, before, progress }: Loading): number;
@@ -0,0 +1,70 @@
1
+ import { Matrix4 } from "three/webgpu";
2
+ import { levelsToLoad } from "../levels/load.js";
3
+ import { screenOf } from "../levels/screen.js";
4
+ import { Lod } from "../lod.js";
5
+ /** How much wider than ChunkSet.heights gives them the heights a level mesh is shown for are, relatively. */
6
+ const SLACK = 1e-4;
7
+ const inverse = new Matrix4();
8
+ /**
9
+ * `camera`, drawing into a target `height` pixels tall (see screenOf), in the space of `space`, an InstancedLod's world matrix: the
10
+ * levels of `encoded` as levelsToDraw reads them for it, `forced` drawn alone if not null, where it looks from and its
11
+ * pixels per unit.
12
+ */
13
+ export function localCamera(camera, height, space, encoded, forced) {
14
+ const screen = screenOf(camera, height);
15
+ // Checked before anything reads the thresholds.
16
+ const levels = encoded.get(forced, !screen.ortho);
17
+ const eye = screen.eye.applyMatrix4(inverse.copy(space).invert());
18
+ // Heights are measured in the InstancedLod's space: an orthographic camera's size scales with it.
19
+ const scale = screen.scale * Lod.quality * (screen.ortho ? space.getMaxScaleOnAxis() : 1);
20
+ return { levels, eye, scale, ortho: screen.ortho };
21
+ }
22
+ /**
23
+ * Work out into `found`, a camera's lists, the heights `chunks`' instances can have on its screen and the levels it
24
+ * needs loaded for them, in one walk of the chunks, only once what that reads changed.
25
+ */
26
+ export function walk(found, { levels, eye, scale, ortho, cull }, { chunks, shape, encoded }) {
27
+ const key = found.heightsKey.start();
28
+ // An orthographic camera measures heights alike from anywhere.
29
+ if (!ortho)
30
+ key.put(eye.x).put(eye.y).put(eye.z);
31
+ if (!key.screen(scale, ortho, levels, cull, shape.source).put(chunks.version).end())
32
+ return;
33
+ found.heights = Array.from(chunks.heights(shape.source, eye, scale, ortho, cull));
34
+ found.wanted = levelsToLoad(found.heights, encoded.heights(levels));
35
+ found.heightsVersion++;
36
+ }
37
+ /**
38
+ * The levels whose meshes draw for the camera of `found` with what is loaded: those levelsToDraw draws at a height
39
+ * some chunk's instances can have, with the levels of `loaded`, and while an arrival is under way those of `before`
40
+ * too, as levelsToDraw draws only what one or the other draws until the arrival ends. Sets `found.onlyLevel` too.
41
+ * Worked out again only once what that reads changed.
42
+ */
43
+ export function shownBy(found, levels, encoded, { loaded, before, progress }) {
44
+ const arriving = progress < 1 && before !== loaded;
45
+ if (!found.shownKey
46
+ .start()
47
+ .put(found.heightsVersion)
48
+ .put(loaded)
49
+ .put(arriving ? before : loaded)
50
+ .end())
51
+ return found.shown;
52
+ const now = encoded.heights(levels, loaded);
53
+ const then = arriving ? encoded.heights(levels, before) : null;
54
+ let shown = 0;
55
+ // What every chunk draws.
56
+ let common = found.heights.length > 0 ? ~0 : 0;
57
+ for (const [shortest, tallest] of found.heights) {
58
+ // The GPU measures an instance's height in f32: a range a little wider holds every height it gets.
59
+ const low = shortest * (1 - SLACK);
60
+ const high = tallest * (1 + SLACK);
61
+ const drawn = now.drawnIn(low, high) | (then?.drawnIn(low, high) ?? 0);
62
+ shown |= drawn;
63
+ common &= drawn;
64
+ }
65
+ found.shown = shown;
66
+ // One level alone: drawnIn holds a fading level's finer neighbour too.
67
+ found.onlyLevel = !arriving && common === shown && (shown & (shown - 1)) === 0 ? shown : 0;
68
+ return shown;
69
+ }
70
+ //# sourceMappingURL=camera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera.js","sourceRoot":"","sources":["../../src/instanced/camera.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { Box3, type Camera, type Color, type InstancedBufferAttribute, Matrix4, type StorageBufferAttribute, type StorageInstancedBufferAttribute } from "three/webgpu";
2
+ /** The instances of a chunk to add (see `InstancedLod.addChunk`), as an InstancedMesh holds its own. */
3
+ export interface InstancedLodChunkParameters {
4
+ /**
5
+ * 16 floats per instance, as InstancedMesh.instanceMatrix holds them. From the CPU, an InstancedBufferAttribute that
6
+ * stays live as an InstancedMesh's does: edit it (see `setMatrixAt`) and set `needsUpdate` (after `addUpdateRange`
7
+ * to upload part of it), and the next render takes the change in. The InstancedLod takes and clears its update
8
+ * ranges, so an InstancedMesh also drawing it uploads it whole. From the GPU, a StorageInstancedBufferAttribute an
9
+ * app's pass writes (such as `instancedArray(n, "mat4")`), read once, in the first render that updates the
10
+ * InstancedLod (see `InstancedLod.update`): the app may reuse it after that render. A matrix of scale 0 is no
11
+ * instance.
12
+ */
13
+ instanceMatrix: InstancedBufferAttribute | StorageInstancedBufferAttribute;
14
+ /**
15
+ * RGB floats per instance, as InstancedMesh.instanceColor holds them, of the same kind as `instanceMatrix`, live or
16
+ * read once as it is, its update ranges taken alike; white without.
17
+ */
18
+ instanceColor?: InstancedBufferAttribute | StorageInstancedBufferAttribute;
19
+ /** The first instance of the attributes to read, and how many: the whole attributes by default, as a drawRange. */
20
+ start?: number;
21
+ count?: number;
22
+ /**
23
+ * From the GPU only: a u32 storage attribute (such as `attributeArray(n, "uint")`) whose item `instanceCountIndex`
24
+ * the app's pass wrote, at most `count`, as drawIndirect's instanceCount: only that many are read. Without it all
25
+ * `count` are.
26
+ */
27
+ instanceCount?: StorageBufferAttribute | StorageInstancedBufferAttribute;
28
+ instanceCountIndex?: number;
29
+ /**
30
+ * From the GPU, required, as the CPU cannot measure the GPU's instances; from the CPU, measured, so not given: a box
31
+ * holding every instance's origin (its matrix's translation) in the InstancedLod's space, and bounds on how much
32
+ * the matrices scale: none shorter than `minScale` along its longest axis, none stretching any direction more than
33
+ * `maxScale`. Which levels load is judged by them.
34
+ */
35
+ originBox?: Box3;
36
+ minScale?: number;
37
+ maxScale?: number;
38
+ }
39
+ /**
40
+ * What an InstancedLod keeps of one of its chunks, which the chunk shows: its bounds, re-measured as its CPU attributes
41
+ * change, and how it finds the level an instance draws, while the InstancedLod holds it.
42
+ */
43
+ export interface ChunkState {
44
+ /** Whether its attributes are the GPU's, told once: binding a CPU attribute through storage() flags it as storage. */
45
+ readonly gpu: boolean;
46
+ readonly originBox: Box3;
47
+ minScale: number;
48
+ maxScale: number;
49
+ readonly boundingBox: Box3;
50
+ levelAt: ((index: number, camera: Camera) => number | null) | null;
51
+ }
52
+ /**
53
+ * Instances added to an InstancedLod in one call and removed whole (see `InstancedLod.addChunk`). An instance's index
54
+ * is its index in the chunk's range of its attributes, stable while other chunks come and go. The methods reading or
55
+ * writing instances work for a chunk from the CPU only: a GPU chunk's instances live on the GPU, and its methods throw.
56
+ */
57
+ export declare class InstancedLodChunk {
58
+ private readonly state;
59
+ readonly instanceMatrix: InstancedBufferAttribute | StorageInstancedBufferAttribute;
60
+ readonly instanceColor: InstancedBufferAttribute | StorageInstancedBufferAttribute | null;
61
+ readonly start: number;
62
+ readonly count: number;
63
+ readonly instanceCount: StorageBufferAttribute | StorageInstancedBufferAttribute | null;
64
+ readonly instanceCountIndex: number;
65
+ /** Made by `InstancedLod.addChunk`. */
66
+ constructor(parameters: InstancedLodChunkParameters, state: ChunkState);
67
+ /** Holds every instance's origin, in the InstancedLod's space: given for a GPU chunk, measured for a CPU one. */
68
+ get originBox(): Box3;
69
+ /** No matrix scales its longest axis less: given for a GPU chunk, measured for a CPU one. */
70
+ get minScale(): number;
71
+ /** No matrix stretches any direction more: given for a GPU chunk, measured for a CPU one. */
72
+ get maxScale(): number;
73
+ /**
74
+ * Bounds every instance's every level, swaying included, in the InstancedLod's space: the box of its origins grown
75
+ * by the largest level.
76
+ */
77
+ get boundingBox(): Box3;
78
+ /** Write instance `index`'s matrix into `instanceMatrix`; set its `needsUpdate` to draw it. */
79
+ setMatrixAt(index: number, value: Matrix4): void;
80
+ getMatrixAt(index: number, target: Matrix4): Matrix4;
81
+ /** Write instance `index`'s colour into `instanceColor`; set its `needsUpdate` to draw it. */
82
+ setColorAt(index: number, color: Color): void;
83
+ /** Instance `index`'s colour: white without `instanceColor`. */
84
+ getColorAt(index: number, color: Color): Color;
85
+ /**
86
+ * The level that draws most of instance `index`'s pixels for `camera` from where it is now, with the levels loaded
87
+ * now and no arrival under way, as Lod.getLevel tells; null at scale 0, thinned out by `cullDistance`, or while no
88
+ * level it could draw is loaded. From the attributes as they are, edits not yet drawn included. It throws for every
89
+ * instance while `cullDistance` or the thresholds are invalid.
90
+ */
91
+ getLevelAt(index: number, camera: Camera): number | null;
92
+ /** This chunk, whose instances the CPU holds, after checking `index` is one of them. */
93
+ private cpu;
94
+ private colors;
95
+ }
96
+ /** Measure into `state` the origins and scales of `chunk`'s instances at a scale above 0, from its CPU attributes. */
97
+ export declare function measureChunk(chunk: InstancedLodChunk, state: ChunkState): void;
@@ -0,0 +1,156 @@
1
+ import { Box3, Matrix4, Vector3, } from "three/webgpu";
2
+ import { isStorageInstanced, stretch } from "../three.js";
3
+ const matrix = new Matrix4();
4
+ const origin = new Vector3();
5
+ /**
6
+ * Instances added to an InstancedLod in one call and removed whole (see `InstancedLod.addChunk`). An instance's index
7
+ * is its index in the chunk's range of its attributes, stable while other chunks come and go. The methods reading or
8
+ * writing instances work for a chunk from the CPU only: a GPU chunk's instances live on the GPU, and its methods throw.
9
+ */
10
+ export class InstancedLodChunk {
11
+ state;
12
+ instanceMatrix;
13
+ instanceColor;
14
+ start;
15
+ count;
16
+ instanceCount;
17
+ instanceCountIndex;
18
+ /** Made by `InstancedLod.addChunk`. */
19
+ constructor(parameters, state) {
20
+ this.state = state;
21
+ const { instanceMatrix, instanceColor = null, instanceCount = null, instanceCountIndex = 0 } = parameters;
22
+ const { gpu } = state;
23
+ if (isStorageInstanced(instanceMatrix) !== gpu)
24
+ throw new Error("InstancedLod: a chunk's state is of another kind than its instanceMatrix");
25
+ const { start = 0, count = instanceMatrix.count - start } = parameters;
26
+ if (instanceMatrix.itemSize !== 16)
27
+ throw new TypeError(`InstancedLod: a chunk's instanceMatrix holds 16 floats per instance, not ${instanceMatrix.itemSize}`);
28
+ if (!(instanceMatrix.array instanceof Float32Array) || instanceMatrix.normalized)
29
+ throw new TypeError("InstancedLod: a chunk's instanceMatrix holds floats, not normalized");
30
+ if (!Number.isInteger(start) || !Number.isInteger(count) || start < 0 || count < 0 || start + count > instanceMatrix.count)
31
+ throw new RangeError(`InstancedLod: a chunk's range of ${count} from ${start} passes the ${instanceMatrix.count} instances of its instanceMatrix`);
32
+ if (instanceColor) {
33
+ if (isStorageInstanced(instanceColor) !== gpu)
34
+ throw new TypeError("InstancedLod: a chunk's instanceColor is of another kind than its instanceMatrix");
35
+ // A storage attribute's vec3 is padded to four floats once on the GPU.
36
+ if (instanceColor.itemSize !== 3 && !(gpu && instanceColor.itemSize === 4))
37
+ throw new TypeError(`InstancedLod: a chunk's instanceColor holds RGB per instance, not ${instanceColor.itemSize} floats`);
38
+ if (!(instanceColor.array instanceof Float32Array) || instanceColor.normalized)
39
+ throw new TypeError("InstancedLod: a chunk's instanceColor holds floats, not normalized");
40
+ if (instanceColor.count < start + count)
41
+ throw new RangeError("InstancedLod: a chunk's instanceColor holds fewer instances than its range");
42
+ }
43
+ if (instanceCount) {
44
+ if (!gpu)
45
+ throw new TypeError("InstancedLod: only a GPU chunk takes an instanceCount");
46
+ if (!(instanceCount.array instanceof Uint32Array) || instanceCount.itemSize !== 1)
47
+ throw new TypeError("InstancedLod: a chunk's instanceCount holds u32 items");
48
+ if (!Number.isInteger(instanceCountIndex) || instanceCountIndex < 0 || instanceCountIndex >= instanceCount.count)
49
+ throw new RangeError(`InstancedLod: a chunk's instanceCountIndex ${instanceCountIndex} passes the end of its instanceCount`);
50
+ }
51
+ const { originBox, minScale, maxScale } = parameters;
52
+ const given = originBox !== undefined || minScale !== undefined || maxScale !== undefined;
53
+ if (gpu && (!originBox || minScale === undefined || maxScale === undefined))
54
+ throw new TypeError("InstancedLod: a GPU chunk needs its originBox, minScale and maxScale: the CPU cannot measure the GPU's instances");
55
+ if (!gpu && given)
56
+ throw new TypeError("InstancedLod: a CPU chunk's originBox, minScale and maxScale are measured from its instances, not given");
57
+ if (originBox && minScale !== undefined && maxScale !== undefined) {
58
+ if (!(minScale > 0 && minScale <= maxScale && Number.isFinite(maxScale)))
59
+ throw new RangeError(`InstancedLod: a chunk's scales must be 0 < minScale <= maxScale, got ${minScale}, ${maxScale}`);
60
+ if (originBox.isEmpty() || ![...originBox.min.toArray(), ...originBox.max.toArray()].every(Number.isFinite))
61
+ throw new RangeError("InstancedLod: a chunk's originBox must be finite and not empty");
62
+ state.originBox.copy(originBox);
63
+ state.minScale = minScale;
64
+ state.maxScale = maxScale;
65
+ }
66
+ this.instanceMatrix = instanceMatrix;
67
+ this.instanceColor = instanceColor;
68
+ this.start = start;
69
+ this.count = count;
70
+ this.instanceCount = instanceCount;
71
+ this.instanceCountIndex = instanceCountIndex;
72
+ if (!gpu)
73
+ measureChunk(this, state);
74
+ }
75
+ /** Holds every instance's origin, in the InstancedLod's space: given for a GPU chunk, measured for a CPU one. */
76
+ get originBox() {
77
+ return this.state.originBox;
78
+ }
79
+ /** No matrix scales its longest axis less: given for a GPU chunk, measured for a CPU one. */
80
+ get minScale() {
81
+ return this.state.minScale;
82
+ }
83
+ /** No matrix stretches any direction more: given for a GPU chunk, measured for a CPU one. */
84
+ get maxScale() {
85
+ return this.state.maxScale;
86
+ }
87
+ /**
88
+ * Bounds every instance's every level, swaying included, in the InstancedLod's space: the box of its origins grown
89
+ * by the largest level.
90
+ */
91
+ get boundingBox() {
92
+ return this.state.boundingBox;
93
+ }
94
+ /** Write instance `index`'s matrix into `instanceMatrix`; set its `needsUpdate` to draw it. */
95
+ setMatrixAt(index, value) {
96
+ value.toArray(this.cpu(index).instanceMatrix.array, (this.start + index) * 16);
97
+ }
98
+ getMatrixAt(index, target) {
99
+ return target.fromArray(this.cpu(index).instanceMatrix.array, (this.start + index) * 16);
100
+ }
101
+ /** Write instance `index`'s colour into `instanceColor`; set its `needsUpdate` to draw it. */
102
+ setColorAt(index, color) {
103
+ color.toArray(this.colors(index).array, (this.start + index) * 3);
104
+ }
105
+ /** Instance `index`'s colour: white without `instanceColor`. */
106
+ getColorAt(index, color) {
107
+ const { instanceColor } = this.cpu(index);
108
+ return instanceColor ? color.fromArray(instanceColor.array, (this.start + index) * 3) : color.setRGB(1, 1, 1);
109
+ }
110
+ /**
111
+ * The level that draws most of instance `index`'s pixels for `camera` from where it is now, with the levels loaded
112
+ * now and no arrival under way, as Lod.getLevel tells; null at scale 0, thinned out by `cullDistance`, or while no
113
+ * level it could draw is loaded. From the attributes as they are, edits not yet drawn included. It throws for every
114
+ * instance while `cullDistance` or the thresholds are invalid.
115
+ */
116
+ getLevelAt(index, camera) {
117
+ const { levelAt } = this.state;
118
+ if (!levelAt)
119
+ throw new Error("InstancedLod: the chunk was removed from its InstancedLod");
120
+ this.cpu(index);
121
+ return levelAt(index, camera);
122
+ }
123
+ /** This chunk, whose instances the CPU holds, after checking `index` is one of them. */
124
+ cpu(index) {
125
+ if (this.state.gpu)
126
+ throw new Error("InstancedLod: a GPU chunk's instances live on the GPU: the CPU cannot read or write them");
127
+ if (!Number.isInteger(index) || index < 0 || index >= this.count)
128
+ throw new RangeError(`InstancedLod: ${index} is not an instance of the chunk's ${this.count}`);
129
+ return this;
130
+ }
131
+ colors(index) {
132
+ const { instanceColor } = this.cpu(index);
133
+ if (!instanceColor)
134
+ throw new Error("InstancedLod: give the chunk an instanceColor to colour its instances");
135
+ return instanceColor;
136
+ }
137
+ }
138
+ /** Measure into `state` the origins and scales of `chunk`'s instances at a scale above 0, from its CPU attributes. */
139
+ export function measureChunk(chunk, state) {
140
+ const { array } = chunk.instanceMatrix;
141
+ state.originBox.makeEmpty();
142
+ state.minScale = Infinity;
143
+ state.maxScale = 0;
144
+ for (let i = chunk.start; i < chunk.start + chunk.count; i++) {
145
+ matrix.fromArray(array, i * 16);
146
+ const scale = matrix.getMaxScaleOnAxis();
147
+ if (scale === 0)
148
+ continue;
149
+ state.originBox.expandByPoint(origin.setFromMatrixPosition(matrix));
150
+ state.minScale = Math.min(state.minScale, scale);
151
+ state.maxScale = Math.max(state.maxScale, stretch(matrix));
152
+ }
153
+ if (state.originBox.isEmpty())
154
+ state.minScale = state.maxScale = 0;
155
+ }
156
+ //# sourceMappingURL=chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../src/instanced/chunk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { Box3, type Camera, type Sphere, type Vector3 } from "three/webgpu";
2
+ import { InstancedLodChunk, type InstancedLodChunkParameters } from "./chunk.js";
3
+ import type { Cull } from "./cull.js";
4
+ import type { InstancePagePool } from "./pages/index.js";
5
+ /**
6
+ * The chunks of one InstancedLod: their pool slots, the mirrors the pool reads CPU attributes through, and their
7
+ * bounds, which load levels and cull the level meshes.
8
+ */
9
+ export declare class ChunkSet {
10
+ private readonly pool;
11
+ private readonly row;
12
+ private readonly bounds;
13
+ private readonly reach;
14
+ private readonly levelAt;
15
+ private readonly held;
16
+ private readonly mirrors;
17
+ /** Bumped whenever a chunk was added, removed or re-measured: what `heights` reads changed. */
18
+ version: number;
19
+ /**
20
+ * Chunks over `pool`, for the InstancedLod sorting as row `row`, whose instances `bounds` bounds in the InstancedLod's space; `reach` tells how far from an
21
+ * instance's origin, in its space, every level and its sway reach, and `levelAt` is what a chunk's getLevelAt asks.
22
+ */
23
+ constructor(pool: InstancePagePool, row: number, bounds: {
24
+ readonly sphere: Sphere;
25
+ readonly box: Box3;
26
+ }, reach: () => number, levelAt: (chunk: InstancedLodChunk, index: number, camera: Camera) => number | null);
27
+ get size(): number;
28
+ /** The chunks, in the order they were added. */
29
+ keys(): IterableIterator<InstancedLodChunk>;
30
+ /** The pool slots of the chunks. */
31
+ slots(): number[];
32
+ /** The chunks whose instances the CPU holds. */
33
+ cpu(): InstancedLodChunk[];
34
+ /**
35
+ * What makes chunks of their own with every chunk's instances, their attributes copied (see `InstancedLod.copy`). A
36
+ * GPU chunk cannot be copied: its instances live on the GPU.
37
+ */
38
+ copies(): InstancedLodChunkParameters[];
39
+ /** Hold `parameters`' instances as a chunk, copied into the pool at its next run; `bound` bounds it. */
40
+ add(parameters: InstancedLodChunkParameters): InstancedLodChunk;
41
+ /** Let go of `chunk`; its pages return to the pool at its next run. */
42
+ remove(chunk: InstancedLodChunk): void;
43
+ /**
44
+ * Take in the CPU attributes' edits, those whose versions moved, for every chunk reading them: re-measured, and
45
+ * copied into the pool again at its next run. Whether any changed; `bound` bounds them.
46
+ */
47
+ refresh(): boolean;
48
+ /** Bound every chunk, its box (see `InstancedLodChunk.boundingBox`), and all of them, survivors grown by up to `grow`. */
49
+ bound(grow: number): void;
50
+ /**
51
+ * The heights on a screen of `scale` from `eye`, both in the InstancedLod's space, that each chunk's instances can
52
+ * have, `source` an instance's source sphere: its shortest instance at its farthest, its tallest at its nearest.
53
+ */
54
+ heights(source: Sphere, eye: Vector3, scale: number, ortho: boolean, cull: Cull | null): Generator<[number, number]>;
55
+ /** Free the chunks' slots and release the mirrors; the chunks no longer find their levels. */
56
+ dispose(): void;
57
+ /** The mirror of `attribute`, which `chunk` reads too. */
58
+ private mirror;
59
+ private heldOf;
60
+ }