@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape.js","sourceRoot":"","sources":["../../src/instanced/shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { StorageInstancedBufferAttribute, type Camera, type Frustum, type Renderer, type Sphere, type Vector3 } from "three/webgpu";
2
+ import type { d } from "typegpu";
3
+ import type { DrawLevels } from "../levels/draw.js";
4
+ import type { InstanceSlots } from "../levels/fade.js";
5
+ import type { Cull } from "./cull.js";
6
+ import { type InstancePagePool } from "./pages/index.js";
7
+ import { type IndirectDraw } from "./rows.js";
8
+ /** What one InstancedLod sorts by for a camera, everything in its space. */
9
+ export interface RowValues {
10
+ levels: d.Infer<typeof DrawLevels>;
11
+ /** The level loading state levelsToDraw reads (see LodLevelLoadManager). */
12
+ loaded: number;
13
+ before: number;
14
+ progress: number;
15
+ eye: Vector3;
16
+ /** Pixels per unit of subtense (or of size, for an orthographic camera). */
17
+ scale: number;
18
+ ortho: boolean;
19
+ cull: Cull | null;
20
+ /** One instance's source sphere, and how far its levels and their sway reach. */
21
+ source: Sphere;
22
+ reach: number;
23
+ frustum: Frustum;
24
+ }
25
+ /** The rows of every InstancedLod of a LodGpu, every camera's buffers, and the passes sorting into them. */
26
+ export declare class Sorter {
27
+ private readonly renderer;
28
+ private readonly pool;
29
+ private readonly layout;
30
+ private readonly cameras;
31
+ /** Survivors' scaled matrices, made once a row scales them; their CPU array is dropped once a pass wrote them. */
32
+ private scaled;
33
+ /** Where survivors' scaled matrices go while none scale: never written, as no survivor scales. */
34
+ private readonly unscaled;
35
+ private passes;
36
+ private isDisposed;
37
+ constructor(renderer: Renderer, pool: InstancePagePool);
38
+ /** A row for an InstancedLod whose levels of `listed`, a mask, list up to `listSize` instances each. */
39
+ register(listed: number, listSize: number): number;
40
+ /** Free `row`: its InstancedLod is disposed. */
41
+ unregister(row: number): void;
42
+ /** `row` draws `draws` too, after those it has; where they start among its draws. */
43
+ appendDraws(row: number, draws: readonly IndirectDraw[]): number;
44
+ /** Survivors' scaled matrices, every pool index's: one buffer, as pool indices are unique to their InstancedLod. */
45
+ get scaledMatrices(): StorageInstancedBufferAttribute;
46
+ /** An InstancedLod draws for `camera`: its buffers are made with the first. */
47
+ hold(camera: Camera): void;
48
+ /** An InstancedLod stops drawing for `camera`, its row `row` dropped from it; the last frees its buffers. */
49
+ release(camera: Camera, row: number): void;
50
+ /** Where `row`'s lists and draws lie for `camera`. */
51
+ slotsOf(camera: Camera, row: number): InstanceSlots;
52
+ /** Write `values` as what `row` sorts by for `camera`, sorted at the camera's next draw. */
53
+ write(camera: Camera, row: number, values: RowValues): void;
54
+ /** Sort every row due for `camera`, in one compute call: before a level mesh draws for it. */
55
+ run(camera: Camera): void;
56
+ /** Whether it was disposed: then it takes no InstancedLod and no camera. */
57
+ get disposed(): boolean;
58
+ dispose(): void;
59
+ private check;
60
+ private layOut;
61
+ private buffersOf;
62
+ private sortBuffers;
63
+ }
@@ -0,0 +1,162 @@
1
+ import { StorageInstancedBufferAttribute } from "three/webgpu";
2
+ import { releaseArrays } from "./pages/index.js";
3
+ import { FLOATS_AT, FLOAT_ROW, INTS_AT, INT_ROW, RowLayout, disposeBuffers, floatsOf, forcedWord, markWords, setSorting, wordsOf, } from "./rows.js";
4
+ import { sortPasses } from "./update.js";
5
+ /** The rows of every InstancedLod of a LodGpu, every camera's buffers, and the passes sorting into them. */
6
+ export class Sorter {
7
+ renderer;
8
+ pool;
9
+ layout = new RowLayout();
10
+ cameras = new Map();
11
+ /** Survivors' scaled matrices, made once a row scales them; their CPU array is dropped once a pass wrote them. */
12
+ scaled = null;
13
+ /** Where survivors' scaled matrices go while none scale: never written, as no survivor scales. */
14
+ unscaled = new StorageInstancedBufferAttribute(new Float32Array(16), 16);
15
+ passes = null;
16
+ isDisposed = false;
17
+ constructor(renderer, pool) {
18
+ this.renderer = renderer;
19
+ this.pool = pool;
20
+ }
21
+ /** A row for an InstancedLod whose levels of `listed`, a mask, list up to `listSize` instances each. */
22
+ register(listed, listSize) {
23
+ this.check();
24
+ return this.layout.register(listed, listSize);
25
+ }
26
+ /** Free `row`: its InstancedLod is disposed. */
27
+ unregister(row) {
28
+ for (const buffers of this.cameras.values())
29
+ idle(buffers, row);
30
+ this.layout.unregister(row);
31
+ }
32
+ /** `row` draws `draws` too, after those it has; where they start among its draws. */
33
+ appendDraws(row, draws) {
34
+ return this.layout.appendDraws(row, draws);
35
+ }
36
+ /** Survivors' scaled matrices, every pool index's: one buffer, as pool indices are unique to their InstancedLod. */
37
+ get scaledMatrices() {
38
+ return (this.scaled ??= new StorageInstancedBufferAttribute(new Float32Array(this.pool.capacity * 16), 16));
39
+ }
40
+ /** An InstancedLod draws for `camera`: its buffers are made with the first. */
41
+ hold(camera) {
42
+ this.check();
43
+ this.layOut();
44
+ const buffers = this.cameras.get(camera) ?? this.layout.makeBuffers();
45
+ buffers.users++;
46
+ this.cameras.set(camera, buffers);
47
+ }
48
+ /** An InstancedLod stops drawing for `camera`, its row `row` dropped from it; the last frees its buffers. */
49
+ release(camera, row) {
50
+ const buffers = this.cameras.get(camera);
51
+ if (!buffers)
52
+ return;
53
+ idle(buffers, row);
54
+ if (--buffers.users > 0)
55
+ return;
56
+ this.cameras.delete(camera);
57
+ disposeBuffers(buffers);
58
+ }
59
+ /** Where `row`'s lists and draws lie for `camera`. */
60
+ slotsOf(camera, row) {
61
+ this.layOut();
62
+ const { indices, fades, args } = this.buffersOf(camera);
63
+ return { indices, fades, args: { attribute: args, offset: this.layout.argsOffset(row) } };
64
+ }
65
+ /** Write `values` as what `row` sorts by for `camera`, sorted at the camera's next draw. */
66
+ write(camera, row, values) {
67
+ this.layOut();
68
+ const buffers = this.buffersOf(camera);
69
+ const { levels, loaded, before, progress, eye, scale, ortho, cull, source, reach, frustum } = values;
70
+ const words = wordsOf(buffers);
71
+ const base = row * INT_ROW * 4;
72
+ words.set([levels.count, levels.coarsest, forcedWord(levels.forced)], base + INTS_AT.levels * 4);
73
+ words.set([levels.empty, levels.fades, loaded, before], base + INTS_AT.masks * 4);
74
+ words.set([Number(ortho), Number(cull !== null), Number(cull?.survivors ?? false)], base + INTS_AT.flags * 4);
75
+ this.layout.place(buffers, row);
76
+ setSorting(buffers, row, 1);
77
+ markWords(buffers, base, INT_ROW * 4);
78
+ const floats = floatsOf(buffers);
79
+ const at = row * FLOAT_ROW * 4;
80
+ floats.set(levels.maxPixels, at + FLOATS_AT.low * 4);
81
+ floats.set([eye.x, eye.y, eye.z, scale], at + FLOATS_AT.eye * 4);
82
+ floats.set([source.center.x, source.center.y, source.center.z, source.radius], at + FLOATS_AT.source * 4);
83
+ floats.set([progress, reach, cull?.near ?? 0, cull?.far ?? 1], at + FLOATS_AT.values * 4);
84
+ if (cull)
85
+ floats.set([cull.eye.x, cull.eye.y, cull.eye.z, 0], at + FLOATS_AT.cullEye * 4);
86
+ frustum.planes.forEach(({ normal, constant }, i) => floats.set([normal.x, normal.y, normal.z, constant], at + (FLOATS_AT.planes + i) * 4));
87
+ buffers.floats.addUpdateRange(at, FLOAT_ROW * 4);
88
+ buffers.floats.needsUpdate = true;
89
+ buffers.held.add(row);
90
+ buffers.due.add(row);
91
+ }
92
+ /** Sort every row due for `camera`, in one compute call: before a level mesh draws for it. */
93
+ run(camera) {
94
+ this.layOut();
95
+ const buffers = this.cameras.get(camera);
96
+ if (!buffers || buffers.due.size === 0)
97
+ return;
98
+ const sort = this.sortBuffers(buffers);
99
+ const { scaled } = this;
100
+ const passes = (this.passes ??= sortPasses(sort, this.pool.pages));
101
+ passes.point(sort, this.layout.length);
102
+ this.renderer.compute([passes.update, passes.indirect]);
103
+ buffers.whole = false;
104
+ // Sorted: the rows wait as they are until written again, their sorting bits cleared with the next upload.
105
+ for (const row of buffers.due)
106
+ setSorting(buffers, row, 0);
107
+ buffers.due.clear();
108
+ // The pass made the scaled matrices' buffer: only the GPU writes them.
109
+ if (scaled && scaled.array.length > 0)
110
+ releaseArrays([scaled]);
111
+ }
112
+ /** Whether it was disposed: then it takes no InstancedLod and no camera. */
113
+ get disposed() {
114
+ return this.isDisposed;
115
+ }
116
+ dispose() {
117
+ this.isDisposed = true;
118
+ for (const buffers of this.cameras.values())
119
+ disposeBuffers(buffers);
120
+ this.cameras.clear();
121
+ this.layout.dispose();
122
+ this.scaled?.dispose();
123
+ this.unscaled.dispose();
124
+ this.passes?.dispose();
125
+ this.passes = null;
126
+ }
127
+ check() {
128
+ if (this.isDisposed)
129
+ throw new Error("LodGpu: disposed");
130
+ }
131
+ layOut() {
132
+ this.layout.layOut(this.cameras.values());
133
+ }
134
+ buffersOf(camera) {
135
+ const buffers = this.cameras.get(camera);
136
+ if (!buffers)
137
+ throw new Error("LodGpu: no buffers for the camera");
138
+ return buffers;
139
+ }
140
+ sortBuffers({ words, floats, indices, fades, args }) {
141
+ return {
142
+ words,
143
+ floats,
144
+ indices,
145
+ fades,
146
+ args,
147
+ matrices: this.pool.matrices,
148
+ scaled: this.scaled ?? this.unscaled,
149
+ counts: this.layout.counts,
150
+ occupied: this.pool.occupied,
151
+ draws: this.layout.draws,
152
+ };
153
+ }
154
+ }
155
+ /** `buffers` no longer sort `row`: its InstancedLod lets go of the camera, or is disposed. */
156
+ function idle(buffers, row) {
157
+ if (!buffers.held.delete(row))
158
+ return;
159
+ buffers.due.delete(row);
160
+ setSorting(buffers, row, 0);
161
+ }
162
+ //# sourceMappingURL=sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sort.js","sourceRoot":"","sources":["../../src/instanced/sort.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { IndirectStorageBufferAttribute, StorageBufferAttribute, StorageInstancedBufferAttribute } from "three/webgpu";
2
+ /** The buffers the sort passes read and write: pointed at a camera's (rows, lists, args) as it sorts. */
3
+ export interface SortBuffers {
4
+ /** Every row, for the camera: its u32s and its f32s (see rows.ts). */
5
+ words: StorageBufferAttribute;
6
+ floats: StorageBufferAttribute;
7
+ /** The pool's matrices, and survivors' scaled ones, which the level meshes draw while survivors scale. */
8
+ matrices: StorageInstancedBufferAttribute;
9
+ scaled: StorageInstancedBufferAttribute;
10
+ /** The camera's slots: per slot, the pool index it draws and its signed fade. */
11
+ indices: StorageBufferAttribute;
12
+ fades: StorageBufferAttribute;
13
+ /** Per row and level, how many instances it holds for the camera: counted by updateInstance, cleared by the indirect pass. */
14
+ counts: StorageBufferAttribute;
15
+ /** How many pages chunks hold, then each with its row (see pages/buffers.ts). */
16
+ occupied: StorageBufferAttribute;
17
+ /** Every row's draws, from its first (see `drawWords` in rows.ts). */
18
+ draws: StorageBufferAttribute;
19
+ /** The camera's indirect draws, five words each, in the order of `draws`. */
20
+ args: IndirectStorageBufferAttribute;
21
+ }
22
+ /** The sort passes over `buffers`, their nodes pointed at other buffers by `point`, for a pool of `pages` pages. */
23
+ export declare function sortPasses(buffers: SortBuffers, pages: number): {
24
+ update: import("three/webgpu").ComputeNode;
25
+ indirect: import("three/webgpu").ComputeNode;
26
+ /** Point the passes at `buffers`, and dispatch the indirect pass over `rows` rows: before they run. */
27
+ point(next: SortBuffers, rows: number): void;
28
+ dispose(): void;
29
+ };
30
+ export type SortPasses = ReturnType<typeof sortPasses>;
@@ -0,0 +1,207 @@
1
+ import { Fn, If, Loop, Return, atomicAdd, atomicLoad, atomicStore, computeKernel, distance, dot, float, globalId, int, localId, mat4, storage, uint, uniform, vec4, workgroupId, } from "three/tsl";
2
+ import { levelsToDrawNode } from "../levels/draw.js";
3
+ import { column, maxScale, stretch } from "../tsl.js";
4
+ import { toTsl } from "../typegpu.js";
5
+ import { PAGE_BITS } from "./pages/buffers.js";
6
+ import { cullScale, instanceOnScreen } from "./measure.js";
7
+ import { PAGE } from "./pages/workgroup.js";
8
+ import { COUNTS_PER_ROW, DRAW_BYTES, FLOATS_AT, FLOAT_ROW, INTS_AT, INT_ROW, UNLISTED } from "./rows.js";
9
+ // Sorting every InstancedLod's instances into its levels' instance lists for one camera, on the GPU, in two passes a
10
+ // LodGpu builds once (see sort.ts).
11
+ //
12
+ // One workgroup per page of the pool (see pages/index.ts), one lane per pool index of the pages in use: updateInstance
13
+ // reads the row of the page's InstancedLod, which holds all it sorts by for the camera, and skips the page unless the
14
+ // row is sorting. It skips an index at scale 0, thins the instance out by `cullDistance`, skips it outside the camera's
15
+ // frustum, measures its height on screen from its matrix with instanceOnScreen, picks what it draws with levelsToDraw,
16
+ // the function a Lod runs on the CPU, and appends itself to each level it draws: its pool index and signed fade go to
17
+ // that level's next free slot. Each level of an InstancedLod that draws something has a list of its `listSize` slots,
18
+ // from the start its row gives; the level's draws start there (their first instance). The indirect pass, one lane per row, hands each level's
19
+ // count to the indirect draws of the row's meshes and clears its counts for the next camera. Both stay within WebGPU's
20
+ // default limit of 8 storage buffers per stage.
21
+ const cullScaleNode = toTsl("lodCullScale", ["origin", "distance", "near", "far", "survivors"], cullScale);
22
+ const instanceOnScreenNode = toTsl("lodInstanceOnScreen", ["matrix", "source", "grow", "eye", "scale", "ortho"], instanceOnScreen);
23
+ /** The sort passes over `buffers`, their nodes pointed at other buffers by `point`, for a pool of `pages` pages. */
24
+ export function sortPasses(buffers, pages) {
25
+ if (pages > MAX_WORKGROUPS)
26
+ throw new RangeError(`LodGpu: a pool of ${pages} pages outgrows one dispatch of ${MAX_WORKGROUPS} workgroups: lower maxInstanceCount or maxChunkCount`);
27
+ const nodes = nodesOf(buffers);
28
+ const rowCount = uniform(0, "uint");
29
+ const update = computeKernel(Fn(() => {
30
+ If(workgroupId.x.greaterThanEqual(nodes.occupied.element(0)), () => void Return());
31
+ const entry = nodes.occupied.element(workgroupId.x.add(1)).toVar();
32
+ const row = entry.shiftRight(PAGE_BITS).toVar();
33
+ const page = entry.bitAnd(2 ** PAGE_BITS - 1);
34
+ updateInstance(nodes, row, page.mul(PAGE).add(localId.x).toVar());
35
+ })(), [PAGE]);
36
+ update.dispatchSize = [pages, 1, 1];
37
+ const indirect = computeKernel(Fn(() => {
38
+ const row = globalId.x.toVar();
39
+ If(row.greaterThanEqual(rowCount), () => void Return());
40
+ writeDraws(nodes, row);
41
+ })(), [LANES]);
42
+ return {
43
+ update,
44
+ indirect,
45
+ /** Point the passes at `buffers`, and dispatch the indirect pass over `rows` rows: before they run. */
46
+ point(next, rows) {
47
+ nodes.words.value = next.words;
48
+ nodes.floats.value = next.floats;
49
+ nodes.matrices.value = next.matrices;
50
+ nodes.scaled.value = next.scaled;
51
+ nodes.indices.value = next.indices;
52
+ nodes.fades.value = next.fades;
53
+ nodes.counts.value = next.counts;
54
+ nodes.occupied.value = next.occupied;
55
+ nodes.draws.value = next.draws;
56
+ nodes.args.value = next.args;
57
+ rowCount.value = rows;
58
+ indirect.dispatchSize = [Math.max(Math.ceil(rows / LANES), 1), 1, 1];
59
+ },
60
+ dispose() {
61
+ update.dispose();
62
+ indirect.dispose();
63
+ },
64
+ };
65
+ }
66
+ /** The storage nodes of `buffers`, as the passes read and write them. */
67
+ function nodesOf(buffers) {
68
+ return {
69
+ words: storage(buffers.words, "uint", 0).setName("lodRowWords").toReadOnly(),
70
+ floats: storage(buffers.floats, "float", 0).setName("lodRowFloats").toReadOnly(),
71
+ matrices: storage(buffers.matrices, "mat4", 0).setName("lodPoolMatrices").toReadOnly(),
72
+ scaled: storage(buffers.scaled, "mat4", 0).setName("lodScaledMatrices"),
73
+ indices: storage(buffers.indices, "uint", 0).setName("lodSlotIndices"),
74
+ fades: storage(buffers.fades, "float", 0).setName("lodSlotFades"),
75
+ counts: storage(buffers.counts, "uint", 0).setName("lodCounts").toAtomic(),
76
+ occupied: storage(buffers.occupied, "uint", 0).setName("lodOccupied").toReadOnly(),
77
+ draws: storage(buffers.draws, "uvec4", 0).setName("lodDraws").toReadOnly(),
78
+ args: storage(buffers.args, "uint", 0).setName("lodDrawArgs"),
79
+ };
80
+ }
81
+ /** Lanes per workgroup of the indirect pass, one per row. */
82
+ const LANES = 64;
83
+ /** WebGPU's guaranteed maxComputeWorkgroupsPerDimension. */
84
+ const MAX_WORKGROUPS = 65535;
85
+ /** Row `row`'s values, by name, read from the camera's rows of u32s and of f32s. */
86
+ function rowOf(nodes, row) {
87
+ const base = row.mul(INT_ROW * 4).toVar();
88
+ const floats = row.mul(FLOAT_ROW * 4).toVar();
89
+ const u = (k, c) => nodes.words.element(base.add(k * 4 + c)).toVar();
90
+ const f = (k, c) => nodes.floats.element(floats.add(k * 4 + c));
91
+ const f4 = (k) => vec4(f(k, 0), f(k, 1), f(k, 2), f(k, 3)).toVar();
92
+ const eye = f4(FLOATS_AT.eye);
93
+ const values = f4(FLOATS_AT.values);
94
+ return {
95
+ count: int(u(INTS_AT.levels, 0)),
96
+ coarsest: int(u(INTS_AT.levels, 1)),
97
+ forced: int(u(INTS_AT.levels, 2)).sub(1), // see forcedWord
98
+ sorting: u(INTS_AT.levels, 3),
99
+ empty: u(INTS_AT.masks, 0),
100
+ fades: u(INTS_AT.masks, 1),
101
+ loaded: u(INTS_AT.masks, 2),
102
+ before: u(INTS_AT.masks, 3),
103
+ ortho: u(INTS_AT.flags, 0),
104
+ culled: u(INTS_AT.flags, 1),
105
+ survivors: u(INTS_AT.flags, 2),
106
+ drawCount: u(INTS_AT.flags, 3),
107
+ listSize: u(INTS_AT.layout, 0),
108
+ drawBase: u(INTS_AT.layout, 1),
109
+ /** The first slot of level `level`'s list, `UNLISTED` for none. */
110
+ start: (level) => nodes.words.element(base.add(INTS_AT.starts * 4).add(level)),
111
+ low: f4(FLOATS_AT.low),
112
+ high: f4(FLOATS_AT.high),
113
+ eye: eye.xyz,
114
+ scale: eye.w,
115
+ source: f4(FLOATS_AT.source),
116
+ progress: values.x,
117
+ reach: values.y,
118
+ near: values.z,
119
+ far: values.w,
120
+ cullEye: f4(FLOATS_AT.cullEye).xyz,
121
+ planes: Array.from({ length: 6 }, (_, i) => f4(FLOATS_AT.planes + i)),
122
+ };
123
+ }
124
+ /**
125
+ * The instance at `poolIndex`, of row `row`'s InstancedLod, sorted into the lists of the levels it draws for the camera
126
+ * whose rows `nodes` read, if the row is sorting. Stateless: everything it reads and writes is in `nodes`.
127
+ */
128
+ function updateInstance(nodes, row, poolIndex) {
129
+ const r = rowOf(nodes, row);
130
+ If(r.sorting.equal(0), () => void Return());
131
+ const { count, coarsest, forced, empty, fades, loaded, before, eye, scale, progress, reach, near, far, ortho, culled, survivors, low, high } = r;
132
+ const m = nodes.matrices.element(poolIndex).toVar();
133
+ const hide = () => void Return();
134
+ If(maxScale(m).equal(0), hide);
135
+ const grow = float(1).toVar();
136
+ If(culled.equal(uint(1)), () => {
137
+ const origin = column(m, 3).xyz.toVar();
138
+ grow.assign(cullScaleNode({ origin, distance: distance(origin, r.cullEye), near, far, survivors }));
139
+ If(grow.equal(0), hide);
140
+ If(survivors.equal(uint(1)), () => {
141
+ const scaled = mat4(column(m, 0).mul(grow), column(m, 1).mul(grow), column(m, 2).mul(grow), column(m, 3));
142
+ nodes.scaled.element(poolIndex).assign(scaled);
143
+ });
144
+ });
145
+ const onScreen = instanceOnScreenNode({ matrix: m, source: r.source, grow, eye, scale, ortho }).toVar();
146
+ const centre = onScreen.xyz;
147
+ // Outside the camera's frustum: wholly behind one of its planes, with every level and its sway.
148
+ const extent = reach
149
+ .mul(stretch(m))
150
+ .mul(grow)
151
+ .mul(1 + 1e-4)
152
+ .negate();
153
+ for (const plane of r.planes)
154
+ If(dot(plane.xyz, centre).add(plane.w).lessThan(extent), hide);
155
+ const height = onScreen.w;
156
+ const drawn = levelsToDrawNode({ height, count, low, high, empty, coarsest, forced, fades, loaded, before, progress }).toVar();
157
+ const level = int(drawn.x).toVar();
158
+ const finer = int(drawn.y).toVar();
159
+ const fade = drawn.z.toVar();
160
+ const { listSize } = r;
161
+ /** Append the instance to level `index`'s list with `signed`, if the level has one and its list has room. */
162
+ const append = (index, signed) => {
163
+ const at = uint(index).toVar();
164
+ const start = r.start(at).toVar();
165
+ If(start.notEqual(UNLISTED), () => {
166
+ const k = atomicAdd(nodes.counts.element(row.mul(COUNTS_PER_ROW).add(at)), uint(1)).toVar();
167
+ If(k.lessThan(listSize), () => {
168
+ const slot = start.add(k).toVar();
169
+ nodes.indices.element(slot).assign(poolIndex);
170
+ nodes.fades.element(slot).assign(signed);
171
+ });
172
+ });
173
+ };
174
+ If(level.greaterThanEqual(0), () => append(level, fade));
175
+ // The finer neighbour fading out with it.
176
+ If(finer.greaterThanEqual(0).and(fade.greaterThan(0)), () => append(finer, fade.negate()));
177
+ }
178
+ /**
179
+ * Hands each level's count of row `row`, if sorting, to the indirect draws of its meshes (at most its list's slots),
180
+ * and clears its counts for the next camera.
181
+ */
182
+ function writeDraws(nodes, row) {
183
+ const r = rowOf(nodes, row);
184
+ If(r.sorting.equal(0), () => void Return());
185
+ const { listSize, drawBase } = r;
186
+ Loop({ start: uint(0), end: r.drawCount, type: "uint", condition: "<" }, ({ i }) => {
187
+ const draw = nodes.draws.element(drawBase.add(i)).toVar();
188
+ const first = r.start(draw.x).toVar();
189
+ const base = drawBase
190
+ .add(i)
191
+ .mul(DRAW_BYTES / 4)
192
+ .toVar();
193
+ const words = nodes.args;
194
+ // Indexed: count, instances, first index, base vertex, first instance; else count, instances, first vertex, first
195
+ // instance and an unused word.
196
+ words.element(base).assign(draw.y);
197
+ const held = atomicLoad(nodes.counts.element(row.mul(COUNTS_PER_ROW).add(draw.x))).toVar();
198
+ words.element(base.add(1)).assign(held.lessThan(listSize).select(held, listSize));
199
+ words.element(base.add(2)).assign(draw.z);
200
+ words.element(base.add(3)).assign(draw.w.equal(1).select(uint(0), first));
201
+ words.element(base.add(4)).assign(draw.w.equal(1).select(first, uint(0)));
202
+ });
203
+ Loop({ start: uint(0), end: uint(COUNTS_PER_ROW), type: "uint", condition: "<" }, ({ i }) => {
204
+ atomicStore(nodes.counts.element(row.mul(COUNTS_PER_ROW).add(i)), uint(0));
205
+ });
206
+ }
207
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/instanced/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Box3, Sphere, type Object3D } from "three/webgpu";
2
+ /**
3
+ * The sphere fades measure for a Lod's levels: level 0's, or the first level's that draws
4
+ * anything when level 0 draws nothing; `own` in that level's own space, `placed` in its
5
+ * parent's (the Lod's). It is the centre and half diagonal of the level's `boundingBox`,
6
+ * which an impostor baked from it shares. `who` names the caller in the error.
7
+ */
8
+ export declare function measureLevels(levels: readonly {
9
+ object?: Object3D;
10
+ box?: Box3;
11
+ }[], who: string): {
12
+ own: Sphere;
13
+ placed: Sphere;
14
+ };
15
+ /** A level's bounds in the space of the Lod that holds it, including an eager object's transform. */
16
+ export declare function levelBox(level: {
17
+ object?: Object3D;
18
+ box?: Box3;
19
+ }): Box3;
20
+ /** Fill absent mesh bounds conservatively from a deferred level's declared box, without reading vertices. */
21
+ export declare function prepareBounds(root: Object3D, box: Box3): void;
@@ -0,0 +1,42 @@
1
+ import { Box3, Sphere, Vector3 } from "three/webgpu";
2
+ import { boundingBox, local } from "../source/detail.js";
3
+ import { isMesh } from "../three.js";
4
+ // Where a Lod's levels are: the bounds each declares or draws, measured from their full detail.
5
+ const sphereOf = (box) => (box.isEmpty() ? null : new Sphere(box.getCenter(new Vector3()), box.getSize(new Vector3()).length() / 2));
6
+ /**
7
+ * The sphere fades measure for a Lod's levels: level 0's, or the first level's that draws
8
+ * anything when level 0 draws nothing; `own` in that level's own space, `placed` in its
9
+ * parent's (the Lod's). It is the centre and half diagonal of the level's `boundingBox`,
10
+ * which an impostor baked from it shares. `who` names the caller in the error.
11
+ */
12
+ export function measureLevels(levels, who) {
13
+ for (const { object, box } of levels) {
14
+ const own = sphereOf(object ? boundingBox(object) : (box ?? new Box3()));
15
+ if (!own)
16
+ continue;
17
+ return { own, placed: object ? own.clone().applyMatrix4(local(object)) : own.clone() };
18
+ }
19
+ throw new Error(`${who}: no level has visible geometry to measure`);
20
+ }
21
+ /** A level's bounds in the space of the Lod that holds it, including an eager object's transform. */
22
+ export function levelBox(level) {
23
+ if (level.box)
24
+ return level.box.clone();
25
+ return level.object ? boundingBox(level.object).applyMatrix4(local(level.object)) : new Box3();
26
+ }
27
+ /** Fill absent mesh bounds conservatively from a deferred level's declared box, without reading vertices. */
28
+ export function prepareBounds(root, box) {
29
+ const visit = (node, placement) => {
30
+ if (isMesh(node)) {
31
+ if (placement.determinant() === 0)
32
+ throw new Error("Lod: mesh placement must be invertible");
33
+ const geometry = node.geometry;
34
+ geometry.boundingBox ??= box.clone().applyMatrix4(placement.clone().invert());
35
+ geometry.boundingSphere ??= geometry.boundingBox.getBoundingSphere(new Sphere());
36
+ }
37
+ for (const child of node.children)
38
+ visit(child, local(child).premultiply(placement));
39
+ };
40
+ visit(root, local(root));
41
+ }
42
+ //# sourceMappingURL=bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../src/levels/bounds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAA+B,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,gGAAgG;AAEhG,MAAM,QAAQ,GAAG,CAAC,GAAS,EAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAE1J;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoD,EAAE,GAAW;IAC7F,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,4CAA4C,CAAC,CAAC;AACtE,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,QAAQ,CAAC,KAAwC;IAC/D,IAAI,KAAK,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACjG,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,GAAS;IACrD,MAAM,KAAK,GAAG,CAAC,IAAc,EAAE,SAAkB,EAAQ,EAAE;QACzD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,QAAQ,CAAC,WAAW,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { type Camera, type Renderer, type Scene } from "three/webgpu";
2
+ import { type RenderContext, type ShadowMap } from "./compile/contexts.js";
3
+ /**
4
+ * The height `renderer` draws at now, which levels are chosen at: CSS pixels on the canvas, so that a high-density
5
+ * screen picks the levels a standard one does and pays for its extra pixels only in fill; pixels in a render target,
6
+ * except one the canvas's size, which stands in for it (a post-processing target); in a shadow pass, the map's texels.
7
+ */
8
+ export declare function drawingHeight(renderer: Renderer, shadow: boolean): number | null;
9
+ /**
10
+ * What a Lod's renders told of each camera that drew it: the height it draws at, where it rendered, and the shadow
11
+ * maps it drew. A context or shadow map whose target is disposed is passed over, so that no compile revives the target.
12
+ */
13
+ export declare class CameraRenders {
14
+ /** Per camera: a side table, as three's Camera has no place for a package's state; a camera let go is let go here. */
15
+ private readonly cameras;
16
+ /** The targets disposed since they were last drawn into. */
17
+ private readonly disposed;
18
+ /** One listener on each target drawn into, until it is disposed or `dispose` is called. */
19
+ private readonly listeners;
20
+ /**
21
+ * The height `camera` draws at, measured from `renderer` while it renders (see `drawingHeight`), else the last it
22
+ * drew at; before it drew, the canvas's.
23
+ */
24
+ heightOf(camera: Camera, renderer: Renderer, shadow: boolean): number;
25
+ /** Where `camera` last rendered a scene holding the Lod, into a target not disposed. */
26
+ contextOf(camera: Camera): RenderContext | undefined;
27
+ /**
28
+ * Whether `context` is still one its camera renders in: not one whose target was disposed, nor one evicted by the
29
+ * cap on contexts per camera.
30
+ */
31
+ holds(context: RenderContext): boolean;
32
+ /** The shadow maps `cameras` drew, into targets not disposed. */
33
+ shadowsOf(cameras: Iterable<Camera>): ShadowMap[];
34
+ /** Whether `camera`, a light's shadow camera, drew a shadow map whose target is not disposed. */
35
+ drawsShadowMap(camera: Camera): boolean;
36
+ /**
37
+ * Whether `target` was disposed since it was last drawn into: what draws into it compiles nothing. The output never
38
+ * is.
39
+ */
40
+ isDisposed(target: RenderContext["target"]): boolean;
41
+ /** Note what `renderer` rendering `scene` with `camera` tells: the camera's render context, or a shadow map. */
42
+ note(renderer: Renderer, scene: Scene, camera: Camera): void;
43
+ /** Stop listening to the targets drawn into. */
44
+ dispose(): void;
45
+ /** `target` is drawn into now: live again if it was disposed, and listened to for its disposal. */
46
+ private drawnInto;
47
+ private stateOf;
48
+ }