@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,203 @@
1
+ import { Matrix4, Vector3 } from "three/webgpu";
2
+ import { d, std, tgpu } from "typegpu";
3
+ import { drawnLevel, levelsToDraw } from "../levels/draw.js";
4
+ // How one instance draws, the same on the CPU and in the sort (see update.ts): whether cullDistance thins it out and
5
+ // how much its survivors grow, and its height on screen.
6
+ /** The largest a survivor of `cullDistance` grows: what it reaches where 1/64 of the instances draw. */
7
+ export const MAX_SURVIVOR_SCALE = 8;
8
+ /** Three xorshift steps: shifts and xors only, exact in JavaScript's 32-bit integer operators as on the GPU. */
9
+ const xorshift = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.u32], d.u32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = value => {
10
+ "use gpu";
11
+
12
+ let h = d.u32(value);
13
+ h = d.u32(h ^ h << 13);
14
+ h = d.u32(h ^ h >>> 17);
15
+ h = d.u32(h ^ h << 5);
16
+ return h;
17
+ }, {
18
+ v: 2,
19
+ name: undefined,
20
+ ast: {
21
+ params: [{
22
+ type: "i",
23
+ name: "value"
24
+ }],
25
+ body: [0, [[12, "h", [6, "d.u32", ["value"]]], [2, "h", "=", [6, "d.u32", [[1, "h", "^", [1, "h", "<<", [5, "13"]]]]]], [2, "h", "=", [6, "d.u32", [[1, "h", "^", [1, "h", ">>>", [5, "17"]]]]]], [2, "h", "=", [6, "d.u32", [[1, "h", "^", [1, "h", "<<", [5, "5"]]]]]], [10, "h"]]]
26
+ },
27
+ externals: {
28
+ "d.u32": () => d.u32
29
+ }
30
+ }) && $.f)({})), "xorshift");
31
+ /**
32
+ * The bits of `origin`, an instance's translation, hashed into [0, 1): what thins it out (see `CullDistance`), the
33
+ * same on the CPU and the GPU.
34
+ */
35
+ export const originHash = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.vec3f], d.f32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = origin => {
36
+ "use gpu";
37
+
38
+ const bits = std.bitcastF32toU32(origin);
39
+ let h = xorshift(bits.x ^ d.u32(0x9e3779b9));
40
+ h = xorshift(h ^ bits.y);
41
+ h = xorshift(h ^ bits.z);
42
+ h = xorshift(h);
43
+ return __tsover_div(d.f32(h >>> 8), 16777216);
44
+ }, {
45
+ v: 2,
46
+ name: undefined,
47
+ ast: {
48
+ params: [{
49
+ type: "i",
50
+ name: "origin"
51
+ }],
52
+ body: [0, [[13, "bits", [6, "std.bitcastF32toU32", ["origin"]]], [12, "h", [6, "xorshift", [[1, [7, "bits", "x"], "^", [6, "d.u32", [[5, "2654435769"]]]]]]], [2, "h", "=", [6, "xorshift", [[1, "h", "^", [7, "bits", "y"]]]]], [2, "h", "=", [6, "xorshift", [[1, "h", "^", [7, "bits", "z"]]]]], [2, "h", "=", [6, "xorshift", ["h"]]], [10, [1, [6, "d.f32", [[1, "h", ">>>", [5, "8"]]]], "/", [5, "16777216"]]]]]
53
+ },
54
+ externals: {
55
+ "std.bitcastF32toU32": () => std.bitcastF32toU32,
56
+ "xorshift": () => xorshift,
57
+ "d.u32": () => d.u32,
58
+ "d.f32": () => d.f32
59
+ }
60
+ }) && $.f)({})), "originHash");
61
+ /**
62
+ * How an instance at `origin`, `distance` from the cullDistance camera, draws (see `CullDistance`): 0 thinned out,
63
+ * else the scale it draws at: 1, or with `survivors` 1/√share, share the share of instances drawn at its distance.
64
+ */
65
+ export const cullScale = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.vec3f, d.f32, d.f32, d.f32, d.u32], d.f32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (origin, distance, near, far, survivors) => {
66
+ "use gpu";
67
+
68
+ const share = std.clamp(__tsover_div(__tsover_sub(far, distance), __tsover_sub(far, near)), 0, 1);
69
+ if (originHash(origin) >= share) return 0;
70
+ if (survivors === 0) return 1;
71
+ return std.min(__tsover_div(1, std.sqrt(share)), MAX_SURVIVOR_SCALE);
72
+ }, {
73
+ v: 2,
74
+ name: undefined,
75
+ ast: {
76
+ params: [{
77
+ type: "i",
78
+ name: "origin"
79
+ }, {
80
+ type: "i",
81
+ name: "distance"
82
+ }, {
83
+ type: "i",
84
+ name: "near"
85
+ }, {
86
+ type: "i",
87
+ name: "far"
88
+ }, {
89
+ type: "i",
90
+ name: "survivors"
91
+ }],
92
+ body: [0, [[13, "share", [6, "std.clamp", [[1, [1, "far", "-", "distance"], "/", [1, "far", "-", "near"]], [5, "0"], [5, "1"]]]], [11, [1, [6, "originHash", ["origin"]], ">=", "share"], [10, [5, "0"]]], [11, [1, "survivors", "===", [5, "0"]], [10, [5, "1"]]], [10, [6, "std.min", [[1, [5, "1"], "/", [6, "std.sqrt", ["share"]]], "MAX_SURVIVOR_SCALE"]]]]]
93
+ },
94
+ externals: {
95
+ "std.clamp": () => std.clamp,
96
+ "originHash": () => originHash,
97
+ "std.min": () => std.min,
98
+ "std.sqrt": () => std.sqrt,
99
+ "MAX_SURVIVOR_SCALE": () => MAX_SURVIVOR_SCALE
100
+ }
101
+ }) && $.f)({})), "cullScale");
102
+ /** The longest `matrix` scales an axis. */
103
+ const longestAxis = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.mat4x4f], d.f32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = matrix => {
104
+ "use gpu";
105
+
106
+ const x = std.length(std.mul(matrix, d.vec4f(1, 0, 0, 0)).xyz);
107
+ const y = std.length(std.mul(matrix, d.vec4f(0, 1, 0, 0)).xyz);
108
+ const z = std.length(std.mul(matrix, d.vec4f(0, 0, 1, 0)).xyz);
109
+ return std.max(x, std.max(y, z));
110
+ }, {
111
+ v: 2,
112
+ name: undefined,
113
+ ast: {
114
+ params: [{
115
+ type: "i",
116
+ name: "matrix"
117
+ }],
118
+ body: [0, [[13, "x", [6, "std.length", [[7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[5, "1"], [5, "0"], [5, "0"], [5, "0"]]]]], "xyz"]]]], [13, "y", [6, "std.length", [[7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[5, "0"], [5, "1"], [5, "0"], [5, "0"]]]]], "xyz"]]]], [13, "z", [6, "std.length", [[7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[5, "0"], [5, "0"], [5, "1"], [5, "0"]]]]], "xyz"]]]], [10, [6, "std.max", ["x", [6, "std.max", ["y", "z"]]]]]]]
119
+ },
120
+ externals: {
121
+ "std.length": () => std.length,
122
+ "std.mul": () => std.mul,
123
+ "d.vec4f": () => d.vec4f,
124
+ "std.max": () => std.max
125
+ }
126
+ }) && $.f)({})), "longestAxis");
127
+ /**
128
+ * Where an instance at `matrix` stands for a camera, `source` the source's sphere (centre, radius) grown by `grow`:
129
+ * the source's centre (xyz), and its height on screen (w) seen from `eye` with `scale` pixels per unit of subtense, or
130
+ * of size with `ortho` 1, as a Lod measures its own on the CPU (see screen.ts: 2 r q / d).
131
+ */
132
+ export const instanceOnScreen = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.mat4x4f, d.vec4f, d.f32, d.vec3f, d.f32, d.u32], d.vec4f)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (matrix, source, grow, eye, scale, ortho) => {
133
+ "use gpu";
134
+
135
+ const centre = std.mul(matrix, d.vec4f(std.mul(source.xyz, grow), 1)).xyz;
136
+ const size = __tsover_mul(__tsover_mul(__tsover_mul(__tsover_mul(source.w, longestAxis(matrix)), grow), 2), scale);
137
+ if (ortho === 1) return d.vec4f(centre, size);
138
+ return d.vec4f(centre, __tsover_div(size, std.max(std.distance(centre, eye), 1e-6)));
139
+ }, {
140
+ v: 2,
141
+ name: undefined,
142
+ ast: {
143
+ params: [{
144
+ type: "i",
145
+ name: "matrix"
146
+ }, {
147
+ type: "i",
148
+ name: "source"
149
+ }, {
150
+ type: "i",
151
+ name: "grow"
152
+ }, {
153
+ type: "i",
154
+ name: "eye"
155
+ }, {
156
+ type: "i",
157
+ name: "scale"
158
+ }, {
159
+ type: "i",
160
+ name: "ortho"
161
+ }],
162
+ body: [0, [[13, "centre", [7, [6, "std.mul", ["matrix", [6, "d.vec4f", [[6, "std.mul", [[7, "source", "xyz"], "grow"]], [5, "1"]]]]], "xyz"]], [13, "size", [1, [1, [1, [1, [7, "source", "w"], "*", [6, "longestAxis", ["matrix"]]], "*", "grow"], "*", [5, "2"]], "*", "scale"]], [11, [1, "ortho", "===", [5, "1"]], [10, [6, "d.vec4f", ["centre", "size"]]]], [10, [6, "d.vec4f", ["centre", [1, "size", "/", [6, "std.max", [[6, "std.distance", ["centre", "eye"]], [5, "0.000001"]]]]]]]]]
163
+ },
164
+ externals: {
165
+ "std.mul": () => std.mul,
166
+ "d.vec4f": () => d.vec4f,
167
+ "longestAxis": () => longestAxis,
168
+ "std.max": () => std.max,
169
+ "std.distance": () => std.distance
170
+ }
171
+ }) && $.f)({})), "instanceOnScreen");
172
+ const instance = new Matrix4();
173
+ const origin = new Vector3();
174
+ const toVec3f = ({
175
+ x,
176
+ y,
177
+ z
178
+ }) => d.vec3f(x, y, z);
179
+ /**
180
+ * The level the instance at `offset` of `matrices` draws most of its pixels with (see `InstancedLodChunk.getLevelAt`),
181
+ * thinned out by `cull` and seen by `camera`, both in the InstancedLod's space, of the levels of `loaded`, `source` the
182
+ * source's sphere; null if it draws nothing.
183
+ */
184
+ export function instanceLevel(matrices, offset, cull, camera, source, loaded) {
185
+ instance.fromArray(matrices, offset);
186
+ if (instance.getMaxScaleOnAxis() === 0) return null;
187
+ origin.setFromMatrixPosition(instance);
188
+ const grow = cull ? cullScale(toVec3f(origin), origin.distanceTo(cull.eye), cull.near, cull.far, Number(cull.survivors)) : 1;
189
+ if (grow === 0) return null;
190
+ const {
191
+ levels,
192
+ eye,
193
+ scale,
194
+ ortho
195
+ } = camera;
196
+ const {
197
+ center,
198
+ radius
199
+ } = source;
200
+ const height = instanceOnScreen(d.mat4x4f(...instance.elements), d.vec4f(center.x, center.y, center.z, radius), grow, toVec3f(eye), scale, Number(ortho)).w;
201
+ return drawnLevel(levelsToDraw(height, levels, loaded, loaded, 1));
202
+ }
203
+ //# sourceMappingURL=measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Matrix4","Vector3","d","std","tgpu","drawnLevel","levelsToDraw","MAX_SURVIVOR_SCALE","xorshift","globalThis","__TYPEGPU_AUTONAME__","a","fn","u32","$","__TYPEGPU_META__","WeakMap","set","f","value","h","v","name","undefined","ast","params","type","body","externals","d.u32","originHash","vec3f","f32","origin","bits","bitcastF32toU32","x","y","z","__tsover_div","std.bitcastF32toU32","d.f32","cullScale","distance","near","far","survivors","share","clamp","__tsover_sub","min","sqrt","std.clamp","std.min","std.sqrt","longestAxis","mat4x4f","matrix","length","mul","vec4f","xyz","max","std.length","std.mul","d.vec4f","std.max","instanceOnScreen","source","grow","eye","scale","ortho","centre","size","__tsover_mul","w","std.distance","instance","toVec3f","instanceLevel","matrices","offset","cull","camera","loaded","fromArray","getMaxScaleOnAxis","setFromMatrixPosition","distanceTo","Number","levels","center","radius","height","elements"],"sources":["../../src/instanced/measure.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,14 +1,46 @@
1
- import { BufferGeometry, Matrix4, type Mesh } from "three/webgpu";
2
- import type { Selection } from "./select.js";
3
- /** The index (or vertex) ranges `mesh` draws, clipped to its draw range; group order is preserved even for empty draws. */
4
- export declare function ranges(mesh: Mesh): Array<{
5
- count: number;
6
- start: number;
7
- indexed: boolean;
8
- }>;
9
- /** The faded material of `mesh`'s material group `group`. */
10
- export declare function groupMaterial(mesh: Mesh, group: number): import("three/webgpu").NodeMaterial;
11
- /** A geometry drawing `geometry`'s buffers from the indirect arguments at byte `offset`. */
12
- export declare function indirect(geometry: BufferGeometry, selection: Selection, offset: number): BufferGeometry;
13
- /** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
14
- export declare function placed(geometry: BufferGeometry, placement: Matrix4): BufferGeometry;
1
+ import { type Box3, type Camera, type Color, Matrix4, Mesh, type Object3D, type Sphere } from "three/webgpu";
2
+ import { type DrawnInstances, type InstanceSlots } from "../levels/fade.js";
3
+ import { type IndirectDraw } from "./rows.js";
4
+ /** A mesh of a level's object and one of its material groups, placed in the instance's space. */
5
+ export interface Part {
6
+ template: Mesh;
7
+ placement: Matrix4;
8
+ group: number;
9
+ draw: IndirectDraw;
10
+ }
11
+ /** What every level mesh of one InstancedLod draws from. */
12
+ export interface MeshInputs {
13
+ /** The instances, which a mesh made later draws too. */
14
+ readonly instances: DrawnInstances;
15
+ /**
16
+ * Around every instance, in the InstancedLod's space: what its meshes are culled by, and their box, which three's
17
+ * Box3.setFromObject reads.
18
+ */
19
+ readonly bounds: Sphere;
20
+ readonly box: Box3;
21
+ /** Per camera, the instances in each level's list and where its indirect draws lie. */
22
+ readonly slots: (camera: Camera) => InstanceSlots;
23
+ /** One instance's bounding radius in its own space, which shadow casters are cut off at. */
24
+ readonly radius: number;
25
+ /**
26
+ * Where `camera`'s indirect draws lie as a mesh draws for it with `renderer`, its lists sorted: the camera's due sorts,
27
+ * every InstancedLod's, run now. Never throws: three is rendering.
28
+ */
29
+ readonly drawFor: (renderer: unknown, camera: Camera) => InstanceSlots["args"];
30
+ }
31
+ /** `object`'s meshes and material groups, placed once in the instance's space, for level `level`. */
32
+ export declare function partsOf(object: Object3D, level: number): Part[];
33
+ /** A level's meshes, which draw once their indirect draws lie among a camera's (see `drawFrom`). */
34
+ export interface LevelMeshes {
35
+ readonly meshes: Mesh[];
36
+ /** The meshes' indirect draws, in order. */
37
+ readonly draws: IndirectDraw[];
38
+ /** Draw from the camera's draw `first` on, where `draws` were appended (see `InstanceSlots.args`). */
39
+ drawFrom(first: number): void;
40
+ }
41
+ /** The meshes drawing `parts`, tinted by `tint`. */
42
+ export declare function levelMeshes(parts: readonly Part[], tint: Color, inputs: MeshInputs): LevelMeshes;
43
+ /** Release `mesh`, which may never have been added. */
44
+ export declare function freeMesh(mesh: Mesh): void;
45
+ /** Point every mesh of `meshes` at `instances.matrices`, which changed: survivors scale, or no longer do. */
46
+ export declare function drawMatrices(meshes: readonly Mesh[], instances: DrawnInstances): void;
@@ -1,9 +1,32 @@
1
- import { BufferGeometry, Matrix4 } from "three/webgpu";
2
- import { levelMaterial } from "../material.js";
3
- // The meshes an InstancedLod draws its levels with, made from the levels' templates.
1
+ import { BufferGeometry, Matrix4, Mesh } from "three/webgpu";
2
+ import { setFadeSource } from "../levels/fade.js";
3
+ import { levelMaterial } from "../levels/material.js";
4
+ import { impostorInstances } from "../impostor/mesh/index.js";
5
+ import { isImpostorMesh, isInstancedMesh, isLOD, isMesh, rejectSkinned } from "../three.js";
6
+ import { DRAW_BYTES } from "./rows.js";
7
+ // The meshes that draw an InstancedLod's level: one plain three Mesh per mesh and material group of its object, or an
8
+ // ImpostorMesh for an impostor, each drawing every instance in its level's list for a camera with one indirect draw.
4
9
  const IDENTITY = new Matrix4();
5
- /** The index (or vertex) ranges `mesh` draws, clipped to its draw range; group order is preserved even for empty draws. */
6
- export function ranges(mesh) {
10
+ /** `object`'s meshes and material groups, placed once in the instance's space, for level `level`. */
11
+ export function partsOf(object, level) {
12
+ rejectSkinned(object, "InstancedLod");
13
+ object.updateWorldMatrix(true, true);
14
+ const outside = object.parent ? object.parent.matrixWorld.clone().invert() : new Matrix4();
15
+ const found = [];
16
+ object.traverse((node) => {
17
+ if (isLOD(node))
18
+ throw new Error("InstancedLod: levels cannot contain a Lod or InstancedLod; nest them with Lod");
19
+ if (isInstancedMesh(node) && !isImpostorMesh(node))
20
+ throw new Error(`InstancedLod: levels cannot contain an InstancedMesh ("${node.name}")`);
21
+ if (!isMesh(node))
22
+ return;
23
+ const placement = outside.clone().multiply(node.matrixWorld);
24
+ ranges(node).forEach((range, group) => found.push({ template: node, placement, group, draw: { level, ...range } }));
25
+ });
26
+ return found;
27
+ }
28
+ /** The index (or vertex) ranges `mesh` draws, clipped to its draw range, in group order, empty draws included. */
29
+ function ranges(mesh) {
7
30
  const { geometry } = mesh;
8
31
  const indexed = geometry.index !== null;
9
32
  const total = geometry.index?.count ?? geometry.getAttribute("position").count;
@@ -14,8 +37,91 @@ export function ranges(mesh) {
14
37
  return { count: Math.max(0, end - first), start: first, indexed };
15
38
  });
16
39
  }
17
- /** The faded material of `mesh`'s material group `group`. */
18
- export function groupMaterial(mesh, group) {
40
+ /** The meshes drawing `parts`, tinted by `tint`. */
41
+ export function levelMeshes(parts, tint, inputs) {
42
+ let first = null;
43
+ const offset = (i) => (first === null ? null : (first + i) * DRAW_BYTES);
44
+ return {
45
+ meshes: parts.map((part, i) => levelMesh(part, () => offset(i), tint, inputs)),
46
+ draws: parts.map((part) => part.draw),
47
+ drawFrom: (start) => void (first = start),
48
+ };
49
+ }
50
+ /** Release `mesh`, which may never have been added. */
51
+ export function freeMesh(mesh) {
52
+ // ImpostorMesh.dispose also destroys its instance buffers, which are the InstancedLod's.
53
+ if (isImpostorMesh(mesh))
54
+ mesh.material.release();
55
+ mesh.geometry.dispose();
56
+ }
57
+ /** Point every mesh of `meshes` at `instances.matrices`, which changed: survivors scale, or no longer do. */
58
+ export function drawMatrices(meshes, instances) {
59
+ for (const mesh of meshes)
60
+ if (isImpostorMesh(mesh))
61
+ mesh.instanceMatrix = instances.matrices;
62
+ }
63
+ /**
64
+ * Material group `group` of `template` drawn for every instance in level `level`'s list, from byte `offset()` of a
65
+ * camera's draws, once there is one.
66
+ */
67
+ function levelMesh({ template, placement, group }, offset, tint, inputs) {
68
+ const { instances, bounds, box, slots, radius, drawFor } = inputs;
69
+ // An impostor card is placed in the shader; any other mesh draws its geometry moved into the instance's space, so
70
+ // the instance matrix is all it needs.
71
+ const mesh = isImpostorMesh(template) ? card(template, placement, inputs) : plain(template, placement, group, instances);
72
+ setFadeSource(mesh, {
73
+ kind: "instances",
74
+ slots,
75
+ radius,
76
+ tint,
77
+ level: isImpostorMesh(template) ? undefined : { instances, space: placement.clone().invert() },
78
+ });
79
+ mesh.name = template.name;
80
+ mesh.castShadow = template.castShadow;
81
+ mesh.receiveShadow = template.receiveShadow;
82
+ if (!isImpostorMesh(mesh))
83
+ mesh.geometry.boundingSphere = bounds;
84
+ mesh.geometry.boundingBox = box;
85
+ const previous = mesh.onBeforeRender;
86
+ // Each camera draws the instances in its own lists. A level compiling to join draws nothing yet: its pipelines do not
87
+ // depend on the indirect draw.
88
+ mesh.onBeforeRender = (renderer, scene, camera, geometry, material, drawn) => {
89
+ previous.call(mesh, renderer, scene, camera, geometry, material, drawn);
90
+ const start = offset();
91
+ if (start === null)
92
+ return;
93
+ const args = drawFor(renderer, camera);
94
+ mesh.geometry.setIndirect(args.attribute, args.offset + start);
95
+ };
96
+ return mesh;
97
+ }
98
+ /**
99
+ * A plain mesh drawing `template`'s geometry moved by `placement`, with a geometry of its own, which its draws point
100
+ * at their camera's indirect draws, over the moved one's buffers.
101
+ */
102
+ function plain(template, placement, group, instances) {
103
+ const moved = placed(template.geometry, placement);
104
+ const geometry = new BufferGeometry();
105
+ geometry.index = moved.index;
106
+ for (const [name, attribute] of Object.entries(moved.attributes))
107
+ geometry.setAttribute(name, attribute);
108
+ geometry.morphAttributes = moved.morphAttributes;
109
+ // three's NodeMaterial multiplies a draw's colour by the varying vInstanceColor wherever its object has an
110
+ // instanceColor; placeInstances (see fade.ts) writes it.
111
+ return Object.assign(new Mesh(geometry, groupMaterial(template, group)), { instanceColor: instances.colors });
112
+ }
113
+ /** An impostor's cards for the instances in a level's list. */
114
+ function card(template, placement, { instances, bounds }) {
115
+ const mesh = impostorInstances(template, 0, placement);
116
+ // Indirect draws give the count. Three otherwise keys a card's shader by its count, one per object.
117
+ mesh.count = 1;
118
+ mesh.instanceMatrix = instances.matrices;
119
+ mesh.instanceColor = instances.colors;
120
+ mesh.boundingSphere = bounds;
121
+ return mesh;
122
+ }
123
+ /** The level material of `mesh`'s material group `group`. */
124
+ function groupMaterial(mesh, group) {
19
125
  if (!Array.isArray(mesh.material))
20
126
  return levelMaterial(mesh.material);
21
127
  const index = mesh.geometry.groups[group]?.materialIndex ?? 0;
@@ -24,22 +130,13 @@ export function groupMaterial(mesh, group) {
24
130
  throw new Error(`InstancedLod: "${mesh.name}" has no material ${index}`);
25
131
  return levelMaterial(material);
26
132
  }
27
- /** A geometry drawing `geometry`'s buffers from the indirect arguments at byte `offset`. */
28
- export function indirect(geometry, selection, offset) {
29
- const view = new BufferGeometry();
30
- view.index = geometry.index;
31
- for (const [name, attribute] of Object.entries(geometry.attributes))
32
- view.setAttribute(name, attribute);
33
- view.morphAttributes = geometry.morphAttributes;
34
- view.boundingBox = geometry.boundingBox;
35
- view.boundingSphere = geometry.boundingSphere;
36
- view.setIndirect(selection.args, selection.argsOffset + offset);
37
- return view;
38
- }
39
- /** Placed copies of geometries, shared by every InstancedLod drawing the same mesh the same way. */
133
+ /**
134
+ * Placed copies of geometries, shared by every InstancedLod drawing the same mesh the same way: a side table, as three's
135
+ * BufferGeometry has no room for a package's state.
136
+ */
40
137
  const copies = new WeakMap();
41
138
  /** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
42
- export function placed(geometry, placement) {
139
+ function placed(geometry, placement) {
43
140
  if (placement.equals(IDENTITY))
44
141
  return geometry;
45
142
  const known = copies.get(geometry) ?? [];
@@ -47,7 +144,25 @@ export function placed(geometry, placement) {
47
144
  const hit = known.find((entry) => entry.placement.equals(placement));
48
145
  if (hit)
49
146
  return hit.geometry;
50
- const copy = geometry.clone().applyMatrix4(placement);
147
+ const copy = geometry.clone();
148
+ const box = copy.boundingBox;
149
+ const sphere = copy.boundingSphere;
150
+ // applyMatrix4 otherwise recomputes both bounds by walking the transformed vertices.
151
+ copy.boundingBox = null;
152
+ copy.boundingSphere = null;
153
+ // Translations leave normals and tangents unchanged; scanning them stalls large source arrivals.
154
+ if (placement.clone().setPosition(0, 0, 0).equals(IDENTITY)) {
155
+ const position = copy.getAttribute("position");
156
+ if (position) {
157
+ position.applyMatrix4(placement);
158
+ position.needsUpdate = true;
159
+ }
160
+ }
161
+ else
162
+ copy.applyMatrix4(placement);
163
+ copy.boundingBox = box?.applyMatrix4(placement) ?? null;
164
+ copy.boundingSphere = sphere?.applyMatrix4(placement) ?? null;
165
+ geometry.addEventListener("dispose", () => copy.dispose());
51
166
  known.push({ placement: placement.clone(), geometry: copy });
52
167
  return copy;
53
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"meshes.js","sourceRoot":"","sources":["../../src/instanced/meshes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meshes.js","sourceRoot":"","sources":["../../src/instanced/meshes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { StorageBufferAttribute, type InstancedBufferAttribute } from "three/webgpu";
2
+ /**
3
+ * A storage attribute over a CPU chunk attribute's array, which the page pool reads it through, uploading what the app
4
+ * marks changed in it: binding the app's own attribute through storage() would flag it as a storage attribute, which
5
+ * three then pads (an RGB colour to four floats) and treats as one wherever else the app draws it.
6
+ */
7
+ export declare class Mirror {
8
+ readonly source: InstancedBufferAttribute;
9
+ /** A matrix per item, or floats one by one, which three never pads. */
10
+ readonly attribute: StorageBufferAttribute;
11
+ /** The source's version it last took in. */
12
+ private version;
13
+ constructor(source: InstancedBufferAttribute);
14
+ /**
15
+ * Take in the source's edits, whose array it shares: upload the ranges the app marked changed (all of it without any),
16
+ * which three would upload and clear were it drawing the source itself. Whether the source changed.
17
+ */
18
+ refresh(): boolean;
19
+ dispose(): void;
20
+ }
@@ -0,0 +1,37 @@
1
+ import { StorageBufferAttribute } from "three/webgpu";
2
+ /**
3
+ * A storage attribute over a CPU chunk attribute's array, which the page pool reads it through, uploading what the app
4
+ * marks changed in it: binding the app's own attribute through storage() would flag it as a storage attribute, which
5
+ * three then pads (an RGB colour to four floats) and treats as one wherever else the app draws it.
6
+ */
7
+ export class Mirror {
8
+ source;
9
+ /** A matrix per item, or floats one by one, which three never pads. */
10
+ attribute;
11
+ /** The source's version it last took in. */
12
+ version;
13
+ constructor(source) {
14
+ this.source = source;
15
+ this.attribute = new StorageBufferAttribute(source.array, source.itemSize === 16 ? 16 : 1);
16
+ this.version = source.version;
17
+ }
18
+ /**
19
+ * Take in the source's edits, whose array it shares: upload the ranges the app marked changed (all of it without any),
20
+ * which three would upload and clear were it drawing the source itself. Whether the source changed.
21
+ */
22
+ refresh() {
23
+ const { source, attribute } = this;
24
+ if (source.version === this.version)
25
+ return false;
26
+ this.version = source.version;
27
+ for (const { start, count } of source.updateRanges)
28
+ attribute.addUpdateRange(start, count);
29
+ source.clearUpdateRanges();
30
+ attribute.needsUpdate = true;
31
+ return true;
32
+ }
33
+ dispose() {
34
+ this.attribute.dispose();
35
+ }
36
+ }
37
+ //# sourceMappingURL=mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mirror.js","sourceRoot":"","sources":["../../src/instanced/mirror.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAiC,MAAM,cAAc,CAAC;AAErF;;;;GAIG;AACH,MAAM,OAAO,MAAM;IAMI;IALrB,uEAAuE;IAC9D,SAAS,CAAyB;IAC3C,4CAA4C;IACpC,OAAO,CAAS;IAExB,YAAqB,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;QACnD,IAAI,CAAC,SAAS,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,YAAY;YAAE,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3F,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3B,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import type { StorageBufferAttribute, StorageInstancedBufferAttribute } from "three/webgpu";
2
+ /** Bits of an occupied page's entry that hold its page; those above hold its InstancedLod's row. */
3
+ export declare const PAGE_BITS = 16;
4
+ /** A page pool's sizes and buffers, which its passes read. */
5
+ export interface PoolBuffers {
6
+ readonly pages: number;
7
+ readonly slots: number;
8
+ /** The free page count, then the free page ids. */
9
+ readonly stack: StorageBufferAttribute;
10
+ /** Per window of a chunk's range, from its slot's first window (see `sources`): the page it holds. */
11
+ readonly table: StorageBufferAttribute;
12
+ /** Per window of a chunk's range: the window's instances, then where they start among the chunk's. */
13
+ readonly windows: StorageBufferAttribute;
14
+ /**
15
+ * Per slot, written by the CPU: its chunk's first window, its windows, its generation, and its InstancedLod's row
16
+ * plus one (0 while it holds no chunk).
17
+ */
18
+ readonly sources: StorageBufferAttribute;
19
+ /**
20
+ * Per slot, written by the GPU, two vec4s: the generation it got to, its pages, its instances and the pages it needs;
21
+ * then the first window its pages are listed from.
22
+ */
23
+ readonly states: StorageBufferAttribute;
24
+ /** How many pages chunks hold, then per page held its id and its InstancedLod's row (see `PAGE_BITS`). */
25
+ readonly occupied: StorageBufferAttribute;
26
+ /** Every pool index's instance matrix and colour (RGB and a pad), as the level meshes draw them. */
27
+ readonly matrices: StorageInstancedBufferAttribute;
28
+ readonly colors: StorageInstancedBufferAttribute;
29
+ }
30
+ /** `pool`'s buffers as one pass uses them: a node each, since a pass may not bind a buffer it writes twice. */
31
+ export declare function nodes(pool: PoolBuffers): {
32
+ stack: import("three/webgpu").StorageBufferNode<"uint">;
33
+ table: import("three/webgpu").StorageBufferNode<"uint">;
34
+ windows: import("three/webgpu").StorageBufferNode<"uint">;
35
+ sources: import("three/webgpu").StorageBufferNode<"uvec4">;
36
+ states: import("three/webgpu").StorageBufferNode<"uvec4">;
37
+ };
@@ -0,0 +1,15 @@
1
+ import { storage } from "three/tsl";
2
+ // The buffers of a page pool, which its passes read and write (see passes.ts).
3
+ /** Bits of an occupied page's entry that hold its page; those above hold its InstancedLod's row. */
4
+ export const PAGE_BITS = 16;
5
+ /** `pool`'s buffers as one pass uses them: a node each, since a pass may not bind a buffer it writes twice. */
6
+ export function nodes(pool) {
7
+ return {
8
+ stack: storage(pool.stack, "uint", 0).toAtomic(),
9
+ table: storage(pool.table, "uint", 0),
10
+ windows: storage(pool.windows, "uint", 0),
11
+ sources: storage(pool.sources, "uvec4", 0).toReadOnly(),
12
+ states: storage(pool.states, "uvec4", 0),
13
+ };
14
+ }
15
+ //# sourceMappingURL=buffers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffers.js","sourceRoot":"","sources":["../../../src/instanced/pages/buffers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,+EAA+E;AAE/E,oGAAoG;AACpG,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AA6B5B,+GAA+G;AAC/G,MAAM,UAAU,KAAK,CAAC,IAAiB;IACrC,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;QAChD,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE;QACvD,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;KACzC,CAAC;AACJ,CAAC"}