@drawcall/lod 0.2.0 → 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 (364) hide show
  1. package/README.md +8 -6
  2. package/dist/bake.d.ts +22 -0
  3. package/dist/bake.js +88 -0
  4. package/dist/bake.js.map +1 -0
  5. package/dist/baked/codec.d.ts +3 -6
  6. package/dist/baked/codec.js +48 -154
  7. package/dist/baked/codec.js.map +1 -1
  8. package/dist/baked/coverage.d.ts +6 -3
  9. package/dist/baked/coverage.js +6 -3
  10. package/dist/baked/coverage.js.map +1 -1
  11. package/dist/baked/fields.d.ts +9 -0
  12. package/dist/baked/fields.js +22 -0
  13. package/dist/baked/fields.js.map +1 -0
  14. package/dist/baked/index.d.ts +12 -6
  15. package/dist/baked/index.js +22 -20
  16. package/dist/baked/index.js.map +1 -1
  17. package/dist/baked/interior/faces.d.ts +4 -3
  18. package/dist/baked/interior/faces.js +13 -10
  19. package/dist/baked/interior/faces.js.map +1 -1
  20. package/dist/baked/interior/material.d.ts +7 -10
  21. package/dist/baked/interior/material.js +29 -36
  22. package/dist/baked/interior/material.js.map +1 -1
  23. package/dist/baked/interior/rooms.js +1 -1
  24. package/dist/baked/interior/rooms.js.map +1 -1
  25. package/dist/baked/low.js +5 -4
  26. package/dist/baked/low.js.map +1 -1
  27. package/dist/baked/raster.js +6 -6
  28. package/dist/baked/raster.js.map +1 -1
  29. package/dist/baked/textures.d.ts +17 -0
  30. package/dist/baked/textures.js +95 -0
  31. package/dist/baked/textures.js.map +1 -0
  32. package/dist/baked/transfer.js +19 -18
  33. package/dist/baked/transfer.js.map +1 -1
  34. package/dist/baked/unwrap.js +4 -3
  35. package/dist/baked/unwrap.js.map +1 -1
  36. package/dist/baked/xatlas.js.map +1 -1
  37. package/dist/codec/container.d.ts +8 -0
  38. package/dist/codec/container.js +63 -0
  39. package/dist/codec/container.js.map +1 -0
  40. package/dist/codec/mesh.d.ts +8 -0
  41. package/dist/{mesh/codec.js → codec/mesh.js} +80 -52
  42. package/dist/codec/mesh.js.map +1 -0
  43. package/dist/dispose.d.ts +7 -4
  44. package/dist/dispose.js +20 -22
  45. package/dist/dispose.js.map +1 -1
  46. package/dist/gpu.d.ts +39 -0
  47. package/dist/gpu.js +41 -0
  48. package/dist/gpu.js.map +1 -0
  49. package/dist/impostor/bake/atlas.d.ts +4 -4
  50. package/dist/impostor/bake/atlas.js +12 -12
  51. package/dist/impostor/bake/atlas.js.map +1 -1
  52. package/dist/impostor/bake/fit.d.ts +8 -0
  53. package/dist/impostor/bake/fit.js +28 -0
  54. package/dist/impostor/bake/fit.js.map +1 -0
  55. package/dist/impostor/bake/index.d.ts +22 -14
  56. package/dist/impostor/bake/index.js +41 -134
  57. package/dist/impostor/bake/index.js.map +1 -1
  58. package/dist/impostor/bake/materials.d.ts +3 -3
  59. package/dist/impostor/bake/materials.js +51 -13
  60. package/dist/impostor/bake/materials.js.map +1 -1
  61. package/dist/impostor/bake/sheet.d.ts +8 -0
  62. package/dist/impostor/bake/sheet.js +90 -0
  63. package/dist/impostor/bake/sheet.js.map +1 -0
  64. package/dist/impostor/bake/source.d.ts +2 -2
  65. package/dist/impostor/bake/source.js +8 -19
  66. package/dist/impostor/bake/source.js.map +1 -1
  67. package/dist/impostor/codec.d.ts +4 -5
  68. package/dist/impostor/codec.js +36 -109
  69. package/dist/impostor/codec.js.map +1 -1
  70. package/dist/impostor/impostor.d.ts +31 -7
  71. package/dist/impostor/impostor.js +21 -6
  72. package/dist/impostor/impostor.js.map +1 -1
  73. package/dist/impostor/ktx2/encode.d.ts +26 -0
  74. package/dist/impostor/ktx2/encode.js +117 -0
  75. package/dist/impostor/ktx2/encode.js.map +1 -0
  76. package/dist/impostor/ktx2/transcode.d.ts +3 -0
  77. package/dist/impostor/ktx2/transcode.js +99 -0
  78. package/dist/impostor/ktx2/transcode.js.map +1 -0
  79. package/dist/impostor/ktx2/uastc.d.ts +7 -0
  80. package/dist/impostor/ktx2/uastc.js +64 -0
  81. package/dist/impostor/ktx2/uastc.js.map +1 -0
  82. package/dist/impostor/ktx2/wasm/encoder.d.ts +4 -0
  83. package/dist/impostor/ktx2/wasm/encoder.js +10 -0
  84. package/dist/impostor/ktx2/wasm/encoder.js.map +1 -0
  85. package/dist/impostor/ktx2/wasm/transcoder.d.ts +3 -0
  86. package/dist/impostor/ktx2/wasm/transcoder.js +9 -0
  87. package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -0
  88. package/dist/impostor/ktx2/worker.d.ts +1 -0
  89. package/dist/impostor/ktx2/worker.js +12 -0
  90. package/dist/impostor/ktx2/worker.js.map +1 -0
  91. package/dist/impostor/mesh/card.d.ts +3 -3
  92. package/dist/impostor/mesh/card.js +7 -7
  93. package/dist/impostor/mesh/card.js.map +1 -1
  94. package/dist/impostor/mesh/index.d.ts +5 -4
  95. package/dist/impostor/mesh/index.js +8 -9
  96. package/dist/impostor/mesh/index.js.map +1 -1
  97. package/dist/impostor/mesh/material.d.ts +18 -9
  98. package/dist/impostor/mesh/material.js +40 -27
  99. package/dist/impostor/mesh/material.js.map +1 -1
  100. package/dist/impostor/mesh/surface.d.ts +1 -1
  101. package/dist/impostor/mesh/surface.js +13 -9
  102. package/dist/impostor/mesh/surface.js.map +1 -1
  103. package/dist/impostor/mesh/textures.d.ts +3 -3
  104. package/dist/impostor/mesh/textures.js +24 -34
  105. package/dist/impostor/mesh/textures.js.map +1 -1
  106. package/dist/index.d.ts +15 -10
  107. package/dist/index.js +13 -8
  108. package/dist/index.js.map +1 -1
  109. package/dist/instanced/camera.d.ts +46 -0
  110. package/dist/instanced/camera.js +70 -0
  111. package/dist/instanced/camera.js.map +1 -0
  112. package/dist/instanced/chunk.d.ts +97 -0
  113. package/dist/instanced/chunk.js +156 -0
  114. package/dist/instanced/chunk.js.map +1 -0
  115. package/dist/instanced/chunks.d.ts +60 -0
  116. package/dist/instanced/chunks.js +208 -0
  117. package/dist/instanced/chunks.js.map +1 -0
  118. package/dist/instanced/cull.d.ts +28 -0
  119. package/dist/instanced/cull.js +22 -0
  120. package/dist/instanced/cull.js.map +1 -0
  121. package/dist/instanced/index.d.ts +96 -66
  122. package/dist/instanced/index.js +229 -288
  123. package/dist/instanced/index.js.map +1 -1
  124. package/dist/instanced/key.d.ts +19 -0
  125. package/dist/instanced/key.js +45 -0
  126. package/dist/instanced/key.js.map +1 -0
  127. package/dist/instanced/levels.d.ts +60 -0
  128. package/dist/instanced/levels.js +130 -0
  129. package/dist/instanced/levels.js.map +1 -0
  130. package/dist/instanced/lists.d.ts +70 -0
  131. package/dist/instanced/lists.js +133 -0
  132. package/dist/instanced/lists.js.map +1 -0
  133. package/dist/instanced/measure.d.ts +28 -0
  134. package/dist/instanced/measure.js +203 -0
  135. package/dist/instanced/measure.js.map +1 -0
  136. package/dist/instanced/meshes.d.ts +42 -51
  137. package/dist/instanced/meshes.js +158 -180
  138. package/dist/instanced/meshes.js.map +1 -1
  139. package/dist/instanced/mirror.d.ts +20 -0
  140. package/dist/instanced/mirror.js +37 -0
  141. package/dist/instanced/mirror.js.map +1 -0
  142. package/dist/instanced/pages/buffers.d.ts +37 -0
  143. package/dist/instanced/pages/buffers.js +15 -0
  144. package/dist/instanced/pages/buffers.js.map +1 -0
  145. package/dist/instanced/pages/chunk.d.ts +51 -0
  146. package/dist/instanced/pages/chunk.js +81 -0
  147. package/dist/instanced/pages/chunk.js.map +1 -0
  148. package/dist/instanced/pages/index.d.ts +74 -0
  149. package/dist/instanced/pages/index.js +269 -0
  150. package/dist/instanced/pages/index.js.map +1 -0
  151. package/dist/instanced/pages/passes.d.ts +21 -0
  152. package/dist/instanced/pages/passes.js +52 -0
  153. package/dist/instanced/pages/passes.js.map +1 -0
  154. package/dist/instanced/pages/slots.d.ts +11 -0
  155. package/dist/instanced/pages/slots.js +90 -0
  156. package/dist/instanced/pages/slots.js.map +1 -0
  157. package/dist/instanced/pages/workgroup.d.ts +14 -0
  158. package/dist/instanced/pages/workgroup.js +38 -0
  159. package/dist/instanced/pages/workgroup.js.map +1 -0
  160. package/dist/instanced/raycast.d.ts +13 -11
  161. package/dist/instanced/raycast.js +33 -40
  162. package/dist/instanced/raycast.js.map +1 -1
  163. package/dist/instanced/rows.d.ts +108 -0
  164. package/dist/instanced/rows.js +209 -0
  165. package/dist/instanced/rows.js.map +1 -0
  166. package/dist/instanced/shape.d.ts +25 -0
  167. package/dist/instanced/shape.js +51 -0
  168. package/dist/instanced/shape.js.map +1 -0
  169. package/dist/instanced/sort.d.ts +63 -0
  170. package/dist/instanced/sort.js +162 -0
  171. package/dist/instanced/sort.js.map +1 -0
  172. package/dist/instanced/update.d.ts +30 -0
  173. package/dist/instanced/update.js +207 -0
  174. package/dist/instanced/update.js.map +1 -0
  175. package/dist/levels/bounds.d.ts +21 -0
  176. package/dist/levels/bounds.js +42 -0
  177. package/dist/levels/bounds.js.map +1 -0
  178. package/dist/levels/cameras.d.ts +48 -0
  179. package/dist/levels/cameras.js +122 -0
  180. package/dist/levels/cameras.js.map +1 -0
  181. package/dist/levels/compile/contexts.d.ts +30 -0
  182. package/dist/levels/compile/contexts.js +18 -0
  183. package/dist/levels/compile/contexts.js.map +1 -0
  184. package/dist/levels/compile/index.d.ts +39 -0
  185. package/dist/levels/compile/index.js +185 -0
  186. package/dist/levels/compile/index.js.map +1 -0
  187. package/dist/levels/compile/pipelines.d.ts +26 -0
  188. package/dist/levels/compile/pipelines.js +177 -0
  189. package/dist/levels/compile/pipelines.js.map +1 -0
  190. package/dist/levels/compiles.d.ts +29 -0
  191. package/dist/levels/compiles.js +50 -0
  192. package/dist/levels/compiles.js.map +1 -0
  193. package/dist/levels/draw.d.ts +102 -0
  194. package/dist/levels/draw.js +401 -0
  195. package/dist/levels/draw.js.map +1 -0
  196. package/dist/levels/fade.d.ts +69 -0
  197. package/dist/levels/fade.js +150 -0
  198. package/dist/levels/fade.js.map +1 -0
  199. package/dist/levels/index.d.ts +99 -0
  200. package/dist/levels/index.js +155 -0
  201. package/dist/levels/index.js.map +1 -0
  202. package/dist/levels/item.d.ts +38 -0
  203. package/dist/levels/item.js +97 -0
  204. package/dist/levels/item.js.map +1 -0
  205. package/dist/levels/load.d.ts +31 -0
  206. package/dist/levels/load.js +142 -0
  207. package/dist/levels/load.js.map +1 -0
  208. package/dist/levels/manager.d.ts +159 -0
  209. package/dist/levels/manager.js +339 -0
  210. package/dist/levels/manager.js.map +1 -0
  211. package/dist/{material.js → levels/material.js} +4 -3
  212. package/dist/levels/material.js.map +1 -0
  213. package/dist/levels/renderer.d.ts +29 -0
  214. package/dist/levels/renderer.js +41 -0
  215. package/dist/levels/renderer.js.map +1 -0
  216. package/dist/levels/requests.d.ts +49 -0
  217. package/dist/levels/requests.js +95 -0
  218. package/dist/levels/requests.js.map +1 -0
  219. package/dist/levels/screen.d.ts +14 -0
  220. package/dist/levels/screen.js +21 -0
  221. package/dist/levels/screen.js.map +1 -0
  222. package/dist/levels/wait.d.ts +27 -0
  223. package/dist/levels/wait.js +61 -0
  224. package/dist/levels/wait.js.map +1 -0
  225. package/dist/loader/build.d.ts +10 -0
  226. package/dist/loader/build.js +28 -0
  227. package/dist/loader/build.js.map +1 -0
  228. package/dist/loader/cache.d.ts +6 -9
  229. package/dist/loader/cache.js +17 -24
  230. package/dist/loader/cache.js.map +1 -1
  231. package/dist/loader/context.d.ts +46 -0
  232. package/dist/loader/context.js +91 -0
  233. package/dist/loader/context.js.map +1 -0
  234. package/dist/loader/{provenance.d.ts → dependencies.d.ts} +5 -3
  235. package/dist/loader/{provenance.js → dependencies.js} +12 -4
  236. package/dist/loader/dependencies.js.map +1 -0
  237. package/dist/loader/index.d.ts +62 -0
  238. package/dist/loader/index.js +284 -0
  239. package/dist/loader/index.js.map +1 -0
  240. package/dist/loader/level.d.ts +41 -0
  241. package/dist/loader/level.js +140 -0
  242. package/dist/loader/level.js.map +1 -0
  243. package/dist/loader/request.d.ts +87 -0
  244. package/dist/loader/request.js +59 -0
  245. package/dist/loader/request.js.map +1 -0
  246. package/dist/loader/url.d.ts +5 -2
  247. package/dist/loader/url.js +10 -6
  248. package/dist/loader/url.js.map +1 -1
  249. package/dist/lod.d.ts +81 -40
  250. package/dist/lod.js +196 -149
  251. package/dist/lod.js.map +1 -1
  252. package/dist/meshopt.d.ts +6 -0
  253. package/dist/meshopt.js +19 -0
  254. package/dist/meshopt.js.map +1 -0
  255. package/dist/simplify/cards.d.ts +14 -0
  256. package/dist/simplify/cards.js +128 -0
  257. package/dist/simplify/cards.js.map +1 -0
  258. package/dist/{simplify.d.ts → simplify/index.d.ts} +7 -4
  259. package/dist/{simplify.js → simplify/index.js} +41 -23
  260. package/dist/simplify/index.js.map +1 -0
  261. package/dist/{bounds.d.ts → source/detail.d.ts} +4 -23
  262. package/dist/{bounds.js → source/detail.js} +19 -51
  263. package/dist/source/detail.js.map +1 -0
  264. package/dist/source/deviation.js +6 -6
  265. package/dist/source/deviation.js.map +1 -1
  266. package/dist/source/{shading.d.ts → evaluator.d.ts} +10 -10
  267. package/dist/source/{shading.js → evaluator.js} +5 -5
  268. package/dist/source/evaluator.js.map +1 -0
  269. package/dist/source/{trace.d.ts → raycaster.d.ts} +6 -6
  270. package/dist/source/{trace.js → raycaster.js} +8 -8
  271. package/dist/source/raycaster.js.map +1 -0
  272. package/dist/source/{texels.d.ts → sampler.d.ts} +1 -1
  273. package/dist/source/{texels.js → sampler.js} +3 -3
  274. package/dist/source/sampler.js.map +1 -0
  275. package/dist/source/source.d.ts +1 -1
  276. package/dist/source/source.js +1 -1
  277. package/dist/source/source.js.map +1 -1
  278. package/dist/source/surface.js +1 -1
  279. package/dist/source/surface.js.map +1 -1
  280. package/dist/task.d.ts +6 -0
  281. package/dist/{pause.js → task.js} +5 -5
  282. package/dist/task.js.map +1 -0
  283. package/dist/three.d.ts +13 -24
  284. package/dist/three.js +26 -53
  285. package/dist/three.js.map +1 -1
  286. package/dist/tsl.d.ts +8 -12
  287. package/dist/tsl.js +11 -39
  288. package/dist/tsl.js.map +1 -1
  289. package/dist/typegpu.d.ts +37 -0
  290. package/dist/typegpu.js +37 -0
  291. package/dist/typegpu.js.map +1 -0
  292. package/dist/wind/bounds.js +2 -2
  293. package/dist/wind/bounds.js.map +1 -1
  294. package/dist/wind/hooks.d.ts +7 -4
  295. package/dist/wind/hooks.js +5 -2
  296. package/dist/wind/hooks.js.map +1 -1
  297. package/dist/wind/index.d.ts +2 -2
  298. package/dist/wind/index.js +15 -15
  299. package/dist/wind/index.js.map +1 -1
  300. package/dist/wind/sway.d.ts +2 -0
  301. package/dist/wind/sway.js +4 -1
  302. package/dist/wind/sway.js.map +1 -1
  303. package/package.json +18 -8
  304. package/skills/lod/SKILL.md +108 -31
  305. package/dist/bounds.js.map +0 -1
  306. package/dist/compile.d.ts +0 -4
  307. package/dist/compile.js +0 -100
  308. package/dist/compile.js.map +0 -1
  309. package/dist/deferred.d.ts +0 -12
  310. package/dist/deferred.js +0 -27
  311. package/dist/deferred.js.map +0 -1
  312. package/dist/fade.d.ts +0 -36
  313. package/dist/fade.js +0 -112
  314. package/dist/fade.js.map +0 -1
  315. package/dist/instanced/args.d.ts +0 -20
  316. package/dist/instanced/args.js +0 -77
  317. package/dist/instanced/args.js.map +0 -1
  318. package/dist/instanced/blocks.d.ts +0 -66
  319. package/dist/instanced/blocks.js +0 -294
  320. package/dist/instanced/blocks.js.map +0 -1
  321. package/dist/instanced/dirty.d.ts +0 -15
  322. package/dist/instanced/dirty.js +0 -96
  323. package/dist/instanced/dirty.js.map +0 -1
  324. package/dist/instanced/parts.d.ts +0 -14
  325. package/dist/instanced/parts.js +0 -79
  326. package/dist/instanced/parts.js.map +0 -1
  327. package/dist/instanced/select.d.ts +0 -92
  328. package/dist/instanced/select.js +0 -315
  329. package/dist/instanced/select.js.map +0 -1
  330. package/dist/instanced/store.d.ts +0 -31
  331. package/dist/instanced/store.js +0 -96
  332. package/dist/instanced/store.js.map +0 -1
  333. package/dist/levels.d.ts +0 -95
  334. package/dist/levels.js +0 -171
  335. package/dist/levels.js.map +0 -1
  336. package/dist/loader/bundle.d.ts +0 -25
  337. package/dist/loader/bundle.js +0 -241
  338. package/dist/loader/bundle.js.map +0 -1
  339. package/dist/loader/provenance.js.map +0 -1
  340. package/dist/loader.d.ts +0 -55
  341. package/dist/loader.js +0 -239
  342. package/dist/loader.js.map +0 -1
  343. package/dist/material.js.map +0 -1
  344. package/dist/mesh/codec.d.ts +0 -4
  345. package/dist/mesh/codec.js.map +0 -1
  346. package/dist/pause.d.ts +0 -6
  347. package/dist/pause.js.map +0 -1
  348. package/dist/queue.d.ts +0 -2
  349. package/dist/queue.js +0 -33
  350. package/dist/queue.js.map +0 -1
  351. package/dist/renderer.d.ts +0 -21
  352. package/dist/renderer.js +0 -83
  353. package/dist/renderer.js.map +0 -1
  354. package/dist/residency.d.ts +0 -44
  355. package/dist/residency.js +0 -205
  356. package/dist/residency.js.map +0 -1
  357. package/dist/simplify.js.map +0 -1
  358. package/dist/source/shading.js.map +0 -1
  359. package/dist/source/texels.js.map +0 -1
  360. package/dist/source/trace.js.map +0 -1
  361. package/dist/view.d.ts +0 -45
  362. package/dist/view.js +0 -131
  363. package/dist/view.js.map +0 -1
  364. /package/dist/{material.d.ts → levels/material.d.ts} +0 -0
@@ -1,77 +0,0 @@
1
- import { IndirectStorageBufferAttribute } from "three/webgpu";
2
- /** Bytes per draw, including the unused final word of a non-indexed draw. */
3
- export const ARGS_BYTES = 20;
4
- const PAGE_DRAWS = 4096;
5
- // WebGPU's guaranteed maxStorageBufferBindingSize; a page is one storage binding.
6
- const MAX_BYTES = 128 * 1024 * 1024;
7
- /**
8
- * Stable slices of fixed-size pages. Sharing the indirect buffer lets WebGPU batch
9
- * draw validation; growing a page would replace buffers still used by meshes and kernels.
10
- */
11
- export class Args {
12
- capacity;
13
- pages = [];
14
- constructor(capacity = PAGE_DRAWS) {
15
- this.capacity = capacity;
16
- if (!Number.isSafeInteger(capacity) || capacity < 1 || capacity * ARGS_BYTES > MAX_BYTES) {
17
- throw new Error("InstancedLod: invalid indirect argument page capacity");
18
- }
19
- }
20
- take(values) {
21
- if (values.length % 5 !== 0 || values.byteLength > MAX_BYTES) {
22
- throw new Error("InstancedLod: indirect arguments exceed a storage binding or contain an incomplete draw");
23
- }
24
- const count = Math.max(values.length / 5, 1);
25
- let page = this.pages.find((page) => page.free.some((range) => range.count >= count));
26
- if (!page) {
27
- const capacity = Math.max(this.capacity, count);
28
- page = { attribute: new IndirectStorageBufferAttribute(new Uint32Array(capacity * 5), 1), free: [{ first: 0, count: capacity }], users: 0 };
29
- this.pages.push(page);
30
- }
31
- const range = page.free.find((range) => range.count >= count);
32
- if (!range)
33
- throw new Error("InstancedLod: no space in indirect argument page");
34
- const first = range.first;
35
- range.first += count;
36
- range.count -= count;
37
- if (range.count === 0)
38
- page.free.splice(page.free.indexOf(range), 1);
39
- page.users++;
40
- // Keep a CPU mirror of the fixed fields, but never upload a live page again:
41
- // its instance counts belong to the GPU. The arguments pass writes all words of each slice.
42
- page.attribute.array.set(values, first * 5);
43
- const owned = page;
44
- let disposed = false;
45
- return {
46
- attribute: page.attribute,
47
- offset: first * ARGS_BYTES,
48
- dispose: () => {
49
- if (disposed)
50
- return;
51
- disposed = true;
52
- this.release(owned, { first, count });
53
- },
54
- };
55
- }
56
- release(page, range) {
57
- if (--page.users === 0) {
58
- this.pages.splice(this.pages.indexOf(page), 1);
59
- page.attribute.dispose();
60
- return;
61
- }
62
- // Earlier submitted draws finish before a later arguments pass overwrites a reused slice.
63
- page.free.push(range);
64
- page.free.sort((a, b) => a.first - b.first);
65
- const merged = [];
66
- for (const range of page.free) {
67
- const previous = merged.at(-1);
68
- if (previous && previous.first + previous.count === range.first)
69
- previous.count += range.count;
70
- else
71
- merged.push(range);
72
- }
73
- page.free = merged;
74
- }
75
- }
76
- export const args = new Args();
77
- //# sourceMappingURL=args.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/instanced/args.ts"],"names":[],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- import { Matrix4, Sphere, Vector3 } from "three/webgpu";
2
- export interface BlockView {
3
- eye: Vector3;
4
- scale: number;
5
- ortho: boolean;
6
- fades: boolean;
7
- forced: number | null;
8
- }
9
- /** Cached spatial blocks: instance edits refit leaves; moving views visit only blocks. */
10
- export declare class Blocks {
11
- private readonly matrices;
12
- private readonly spheres;
13
- private readonly source;
14
- /** Set to enclose every instance on refit. */
15
- private readonly bounds;
16
- /** Radius enclosing every placed level about source.center. */
17
- private readonly rest;
18
- private readonly block;
19
- private readonly leaves;
20
- private readonly tree;
21
- private readonly dirty;
22
- private readonly radii;
23
- private readonly roundoff;
24
- private readonly unsafe;
25
- private readonly levelBoxes;
26
- private token;
27
- private changed;
28
- private complete;
29
- private low;
30
- private high;
31
- private padding;
32
- constructor(matrices: Float32Array, spheres: Float32Array, source: Sphere,
33
- /** Set to enclose every instance on refit. */
34
- bounds: Sphere, draws: number,
35
- /** Radius enclosing every placed level about source.center. */
36
- rest: {
37
- readonly radius: number;
38
- });
39
- /** Measure changed matrices, retaining the GPU's max-axis radius for LOD selection. */
40
- measure(start: number, end: number): void;
41
- pad(padding: number): void;
42
- /** Refit only edited leaves and their ancestors. No instance scan on view changes. */
43
- refit(): void;
44
- private leaf;
45
- private join;
46
- /** Level bounds plus a token only when every block has an unchanged solid choice. */
47
- select(levels: readonly {
48
- maxPixels: number;
49
- }[], view: BlockView, reaches: Sphere[], measured: boolean, root: Matrix4): object | undefined;
50
- /** Ahead-of-view demand without changing solid selections or their reuse token. */
51
- demand(levels: readonly {
52
- maxPixels: number;
53
- }[], view: BlockView, reaches: Sphere[], root: Matrix4): void;
54
- private gather;
55
- private enclose;
56
- private visit;
57
- private resetBoxes;
58
- /**
59
- * The finest and coarsest levels `node` may draw, fade partner included, with heights
60
- * widened by `margin` for demand. Must match the GPU's selection and `levelOf`.
61
- */
62
- private span;
63
- private interval;
64
- }
65
- /** Upper bound on the largest singular value, exact for orthogonal matrix axes. */
66
- export declare function stretch(matrix: Matrix4): number;
@@ -1,294 +0,0 @@
1
- import { Box3, Matrix4, Sphere, Vector3 } from "three/webgpu";
2
- import { FADE, DEMAND, lastFitting } from "../levels.js";
3
- import { at } from "../at.js";
4
- import { Dirty } from "./dirty.js";
5
- // Cover float32 matrix products, distances and threshold arithmetic. Near a switch,
6
- // uncertain blocks keep both levels and cannot reuse a previous GPU selection.
7
- const ROUND = 1e-5;
8
- const matrix = new Matrix4();
9
- const point = new Vector3();
10
- const extent = new Vector3();
11
- /** Cached spatial blocks: instance edits refit leaves; moving views visit only blocks. */
12
- export class Blocks {
13
- matrices;
14
- spheres;
15
- source;
16
- bounds;
17
- rest;
18
- block;
19
- leaves;
20
- tree;
21
- dirty;
22
- radii;
23
- roundoff;
24
- unsafe;
25
- levelBoxes = [];
26
- token = {};
27
- changed = false;
28
- complete = true;
29
- low = 0;
30
- high = 0;
31
- padding = 0;
32
- constructor(matrices, spheres, source,
33
- /** Set to enclose every instance on refit. */
34
- bounds, draws,
35
- /** Radius enclosing every placed level about source.center. */
36
- rest) {
37
- this.matrices = matrices;
38
- this.spheres = spheres;
39
- this.source = source;
40
- this.bounds = bounds;
41
- this.rest = rest;
42
- const count = matrices.length / 16;
43
- // Fine leaves avoid many empty draws in small, multipart crowds. Large crowds
44
- // retain bounded block traversal rather than inspecting every instance per view.
45
- this.block = count <= 4096 && draws >= 8 ? 1 : 64;
46
- this.leaves = 2 ** Math.ceil(Math.log2(Math.max(1, Math.ceil(count / this.block))));
47
- this.tree = Array.from({ length: this.leaves * 2 }, () => ({
48
- geometry: new Box3(),
49
- centers: new Box3(),
50
- sphere: new Sphere(),
51
- smallest: Infinity,
52
- largest: 0,
53
- reach: 0,
54
- solid: -1,
55
- unsafe: false,
56
- }));
57
- this.dirty = new Dirty(Math.ceil(count / this.block));
58
- this.radii = new Float64Array(count);
59
- this.roundoff = new Float64Array(count);
60
- this.unsafe = new Uint8Array(count);
61
- }
62
- /** Measure changed matrices, retaining the GPU's max-axis radius for LOD selection. */
63
- measure(start, end) {
64
- const { center, radius } = this.source;
65
- for (let i = start; i < end; i++) {
66
- matrix.fromArray(this.matrices, i * 16);
67
- point
68
- .copy(center)
69
- .applyMatrix4(matrix)
70
- .toArray(this.spheres, i * 4);
71
- const axis = matrix.getMaxScaleOnAxis();
72
- this.spheres[i * 4 + 3] = radius * axis;
73
- this.radii[i] = this.rest.radius * stretch(matrix);
74
- const e = matrix.elements;
75
- // Absolute terms also cover cancellation in the shader's transformed center.
76
- const terms = Math.max(Math.abs(e[0] * center.x) + Math.abs(e[4] * center.y) + Math.abs(e[8] * center.z) + Math.abs(e[12]), Math.abs(e[1] * center.x) + Math.abs(e[5] * center.y) + Math.abs(e[9] * center.z) + Math.abs(e[13]), Math.abs(e[2] * center.x) + Math.abs(e[6] * center.y) + Math.abs(e[10] * center.z) + Math.abs(e[14]), radius, this.rest.radius);
77
- this.roundoff[i] = ROUND * Math.sqrt(3) * terms;
78
- // WGSL length squares its inputs. Guard the intermediates, not only the final
79
- // screen height: infinity / infinity would select level zero, not the CPU tier.
80
- this.unsafe[i] = Number(unsafe(axis) || unsafe(radius) || terms > 1e15 || !Number.isFinite(terms));
81
- this.dirty.add(Math.floor(i / this.block));
82
- }
83
- }
84
- pad(padding) {
85
- if (padding === this.padding)
86
- return;
87
- this.padding = padding;
88
- this.dirty.all();
89
- }
90
- /** Refit only edited leaves and their ancestors. No instance scan on view changes. */
91
- refit() {
92
- if (this.dirty.empty)
93
- return;
94
- this.dirty.drain((start, end) => {
95
- for (let block = start; block < end; block++) {
96
- this.leaf(at(this.tree, this.leaves + block), block);
97
- }
98
- // Join each affected parent once per depth, making a full edit linear in the
99
- // tree size even when multipart crowds use one leaf per instance.
100
- let first = Math.floor((this.leaves + start) / 2);
101
- let last = Math.ceil((this.leaves + end) / 2);
102
- while (first > 0) {
103
- for (let index = first; index < last; index++)
104
- this.join(index);
105
- first = Math.floor(first / 2);
106
- last = Math.ceil(last / 2);
107
- }
108
- });
109
- enclosing(at(this.tree, 1).geometry, this.bounds);
110
- }
111
- leaf(node, block) {
112
- node.geometry.makeEmpty();
113
- node.centers.makeEmpty();
114
- node.smallest = Infinity;
115
- node.largest = node.reach = 0;
116
- node.solid = -1;
117
- node.unsafe = false;
118
- const end = Math.min((block + 1) * this.block, this.radii.length);
119
- for (let i = block * this.block; i < end; i++) {
120
- const radius = at(this.spheres, i * 4 + 3);
121
- if (radius === 0 && !at(this.unsafe, i))
122
- continue;
123
- node.unsafe ||= Boolean(at(this.unsafe, i));
124
- const roundoff = at(this.roundoff, i);
125
- const reach = at(this.radii, i) * (1 + this.padding) + roundoff;
126
- point.fromArray(this.spheres, i * 4);
127
- expand(node.centers, point, roundoff);
128
- expand(node.geometry, point, reach);
129
- node.smallest = Math.min(node.smallest, radius);
130
- node.largest = Math.max(node.largest, radius);
131
- node.reach = Math.max(node.reach, reach);
132
- }
133
- enclosing(node.centers, node.sphere);
134
- }
135
- join(index) {
136
- const node = at(this.tree, index);
137
- const a = at(this.tree, index * 2);
138
- const b = at(this.tree, index * 2 + 1);
139
- node.geometry.copy(a.geometry).union(b.geometry);
140
- node.centers.copy(a.centers).union(b.centers);
141
- enclosing(node.centers, node.sphere);
142
- node.smallest = Math.min(a.smallest, b.smallest);
143
- node.largest = Math.max(a.largest, b.largest);
144
- node.reach = Math.max(a.reach, b.reach);
145
- node.unsafe = a.unsafe || b.unsafe;
146
- node.solid = -1;
147
- }
148
- /** Level bounds plus a token only when every block has an unchanged solid choice. */
149
- select(levels, view, reaches, measured, root) {
150
- this.resetBoxes(levels);
151
- this.complete = measured;
152
- this.changed = false;
153
- if (!this.bounds.isEmpty()) {
154
- if (measured)
155
- this.visit(1, levels, view);
156
- else
157
- for (const box of this.levelBoxes)
158
- box.copy(at(this.tree, 1).geometry);
159
- }
160
- this.enclose(levels, view, reaches, root, measured, 1);
161
- if (!this.complete)
162
- return undefined;
163
- if (this.changed)
164
- this.token = {};
165
- return this.token;
166
- }
167
- /** Ahead-of-view demand without changing solid selections or their reuse token. */
168
- demand(levels, view, reaches, root) {
169
- this.resetBoxes(levels);
170
- this.gather(1, levels, view);
171
- this.enclose(levels, view, reaches, root, true, DEMAND);
172
- }
173
- gather(index, levels, view) {
174
- const node = at(this.tree, index);
175
- if (node.geometry.isEmpty())
176
- return;
177
- const [finest, coarsest] = this.span(node, levels, view, DEMAND);
178
- if (finest !== coarsest && index < this.leaves) {
179
- this.gather(index * 2, levels, view);
180
- this.gather(index * 2 + 1, levels, view);
181
- return;
182
- }
183
- for (let level = finest; level <= coarsest; level++)
184
- at(this.levelBoxes, level).union(node.geometry);
185
- }
186
- enclose(levels, view, reaches, root, measured, margin) {
187
- const top = at(this.tree, 1);
188
- const axis = root.getMaxScaleOnAxis();
189
- // Three transforms a culling sphere by max-axis scale, which underbounds shear.
190
- const dilation = axis > 0 ? stretch(root) / axis : 1;
191
- reaches.forEach((sphere, level) => {
192
- enclosing(at(this.levelBoxes, level), sphere);
193
- const next = levels[level + 1];
194
- if (measured && !top.unsafe && !unsafe(view.scale) && view.eye.length() < 1e15 && !sphere.isEmpty() && !view.ortho && view.forced === null && next) {
195
- const threshold = next.maxPixels * (view.fades ? 1 - FADE : 1) * margin;
196
- const radius = (2 * top.largest * view.scale * (1 + ROUND * 4)) / threshold + top.reach + view.eye.length() * ROUND;
197
- if (radius < sphere.radius)
198
- sphere.set(view.eye, radius);
199
- }
200
- if (!sphere.isEmpty())
201
- sphere.radius *= dilation;
202
- });
203
- }
204
- visit(index, levels, view) {
205
- const node = at(this.tree, index);
206
- if (node.geometry.isEmpty())
207
- return;
208
- const [finest, coarsest] = this.span(node, levels, view, 1);
209
- if (finest === coarsest) {
210
- this.changed ||= node.solid !== finest;
211
- node.solid = finest;
212
- at(this.levelBoxes, finest).union(node.geometry);
213
- return;
214
- }
215
- // Descendants may hold a proof from an older split; never reuse that after the
216
- // whole branch was last selected as one solid level.
217
- this.changed ||= node.solid !== -1;
218
- node.solid = -1;
219
- if (index < this.leaves) {
220
- this.visit(index * 2, levels, view);
221
- this.visit(index * 2 + 1, levels, view);
222
- return;
223
- }
224
- this.complete = false;
225
- for (let level = finest; level <= coarsest; level++)
226
- at(this.levelBoxes, level).union(node.geometry);
227
- }
228
- resetBoxes(levels) {
229
- while (this.levelBoxes.length < levels.length)
230
- this.levelBoxes.push(new Box3());
231
- for (const box of this.levelBoxes)
232
- box.makeEmpty();
233
- }
234
- /**
235
- * The finest and coarsest levels `node` may draw, fade partner included, with heights
236
- * widened by `margin` for demand. Must match the GPU's selection and `levelOf`.
237
- */
238
- span(node, levels, view, margin) {
239
- this.interval(node, view);
240
- const high = this.high / margin;
241
- // Infinity marks an unsafe float32 interval; even legal infinite thresholds
242
- // cannot exclude the source when the GPU's height may be NaN.
243
- let finest = view.forced ?? (high === Infinity ? 0 : lastFitting(levels, high));
244
- const coarsest = view.forced ?? lastFitting(levels, this.low);
245
- if (view.fades && finest > 0 && high >= at(levels, finest).maxPixels * (1 - FADE) * (1 - ROUND))
246
- finest--;
247
- return [finest, coarsest];
248
- }
249
- interval(node, view) {
250
- const distance = node.sphere.center.distanceTo(view.eye);
251
- const roundoff = view.eye.length() * ROUND;
252
- const near = view.ortho ? 1 : Math.max(distance - node.sphere.radius - roundoff, 1e-6);
253
- const far = view.ortho ? 1 : Math.max(distance + node.sphere.radius + roundoff, 1e-6);
254
- this.low = ((2 * node.smallest * view.scale) / far) * (1 - ROUND * 4);
255
- this.high = ((2 * node.largest * view.scale) / near) * (1 + ROUND * 4);
256
- // Float32 overflow/underflow can invalidate a real-number interval. Keep all
257
- // levels in these unusual cases instead of making an unsupported proof.
258
- if (!Number.isFinite(this.high) ||
259
- this.high > 1e30 ||
260
- this.low < 1e-30 ||
261
- node.unsafe ||
262
- unsafe(view.scale) ||
263
- distance > 1e15 ||
264
- view.eye.length() > 1e15) {
265
- this.low = 0;
266
- this.high = Infinity;
267
- }
268
- }
269
- }
270
- /** Upper bound on the largest singular value, exact for orthogonal matrix axes. */
271
- export function stretch(matrix) {
272
- const e = matrix.elements;
273
- const xy = Math.abs(e[0] * e[4] + e[1] * e[5] + e[2] * e[6]);
274
- const xz = Math.abs(e[0] * e[8] + e[1] * e[9] + e[2] * e[10]);
275
- const yz = Math.abs(e[4] * e[8] + e[5] * e[9] + e[6] * e[10]);
276
- return Math.sqrt(Math.max(e[0] ** 2 + e[1] ** 2 + e[2] ** 2 + xy + xz, e[4] ** 2 + e[5] ** 2 + e[6] ** 2 + xy + yz, e[8] ** 2 + e[9] ** 2 + e[10] ** 2 + xz + yz));
277
- }
278
- function expand(box, center, radius) {
279
- box.expandByPoint(extent.copy(center).addScalar(-radius));
280
- box.expandByPoint(extent.copy(center).addScalar(radius));
281
- }
282
- // These broad limits stay well inside float32's squared-length and product range.
283
- // Outside them, retain all levels and let the GPU make the original selection.
284
- function unsafe(value) {
285
- return !Number.isFinite(value) || Math.abs(value) > 1e15 || (value !== 0 && Math.abs(value) < 1e-15);
286
- }
287
- function enclosing(box, sphere) {
288
- box.getBoundingSphere(sphere);
289
- if (!Number.isFinite(sphere.radius) || !Number.isFinite(sphere.center.lengthSq())) {
290
- sphere.center.set(0, 0, 0);
291
- sphere.radius = Infinity;
292
- }
293
- }
294
- //# sourceMappingURL=blocks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/instanced/blocks.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import type { BufferAttribute } from "three/webgpu";
2
- /** Changed indices, drained as ordered runs without scanning unchanged instances. */
3
- export declare class Dirty {
4
- private readonly count;
5
- private readonly bits;
6
- private readonly words;
7
- constructor(count: number);
8
- get empty(): boolean;
9
- add(index: number): void;
10
- all(): void;
11
- /** End is exclusive. Edits made by the visitor are not supported. */
12
- drain(visit: (start: number, end: number) => void): void;
13
- }
14
- /** Union pending uploads, including repeated edits while a crowd is not drawn. */
15
- export declare function upload(attribute: BufferAttribute, start: number, end: number): void;
@@ -1,96 +0,0 @@
1
- import { at } from "../at.js";
2
- /** Changed indices, drained as ordered runs without scanning unchanged instances. */
3
- export class Dirty {
4
- count;
5
- bits;
6
- words = [];
7
- constructor(count) {
8
- this.count = count;
9
- this.bits = new Uint32Array(Math.ceil(count / 32));
10
- }
11
- get empty() {
12
- return this.words.length === 0;
13
- }
14
- add(index) {
15
- const word = index >>> 5;
16
- const before = at(this.bits, word);
17
- this.bits[word] = before | (1 << (index & 31));
18
- if (before !== 0)
19
- return;
20
- this.words.push(word);
21
- }
22
- all() {
23
- this.words.length = 0;
24
- this.bits.fill(0xffffffff);
25
- for (let i = 0; i < this.bits.length; i++)
26
- this.words.push(i);
27
- if (this.bits.length > 0 && this.count % 32)
28
- this.bits[this.bits.length - 1] = 0xffffffff >>> (32 - (this.count % 32));
29
- }
30
- /** End is exclusive. Edits made by the visitor are not supported. */
31
- drain(visit) {
32
- let start = -1;
33
- let end = -1;
34
- this.words.sort((a, b) => a - b);
35
- for (const word of this.words) {
36
- let bits = at(this.bits, word);
37
- this.bits[word] = 0;
38
- while (bits !== 0) {
39
- const index = word * 32 + 31 - Math.clz32(bits & -bits);
40
- bits &= bits - 1;
41
- if (index === end) {
42
- end++;
43
- continue;
44
- }
45
- if (start >= 0)
46
- visit(start, end);
47
- start = index;
48
- end = index + 1;
49
- }
50
- }
51
- this.words.length = 0;
52
- if (start >= 0)
53
- visit(start, end);
54
- }
55
- }
56
- /** Union pending uploads, including repeated edits while a crowd is not drawn. */
57
- export function upload(attribute, start, end) {
58
- start *= attribute.itemSize;
59
- end *= attribute.itemSize;
60
- const ranges = attribute.updateRanges;
61
- let low = 0;
62
- let high = ranges.length;
63
- while (low < high) {
64
- const middle = (low + high) >>> 1;
65
- const range = at(ranges, middle);
66
- if (range.start + range.count < start)
67
- low = middle + 1;
68
- else
69
- high = middle;
70
- }
71
- const first = ranges[low];
72
- if (!first || first.start > end) {
73
- const range = { start, count: end - start };
74
- if (low === ranges.length)
75
- ranges.push(range);
76
- else
77
- ranges.splice(low, 0, range);
78
- }
79
- else {
80
- end = Math.max(end, first.start + first.count);
81
- first.start = Math.min(start, first.start);
82
- let next = low + 1;
83
- while (next < ranges.length) {
84
- const range = at(ranges, next);
85
- if (range.start > end)
86
- break;
87
- end = Math.max(end, range.start + range.count);
88
- next++;
89
- }
90
- first.count = end - first.start;
91
- if (next > low + 1)
92
- ranges.splice(low + 1, next - low - 1);
93
- }
94
- attribute.needsUpdate = true;
95
- }
96
- //# sourceMappingURL=dirty.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dirty.js","sourceRoot":"","sources":["../../src/instanced/dirty.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { type BufferGeometry, Matrix4, type Mesh, type Object3D } from "three/webgpu";
2
- import type { IndirectDraw } from "./select.js";
3
- export interface Part {
4
- template: Mesh;
5
- placement: Matrix4;
6
- group: number;
7
- draw: IndirectDraw;
8
- }
9
- /** Template meshes and material groups, placed once in the instance's space. */
10
- export declare function parts(object: Object3D, level: number): Part[];
11
- /** The faded material of `mesh`'s material group `group`. */
12
- export declare function groupMaterial(mesh: Mesh, group: number): import("three/webgpu").NodeMaterial;
13
- /** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
14
- export declare function placed(geometry: BufferGeometry, placement: Matrix4): BufferGeometry;