@drawcall/lod 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/README.md +6 -7
  2. package/dist/bake.d.ts +36 -0
  3. package/dist/bake.js +176 -0
  4. package/dist/bake.js.map +1 -0
  5. package/dist/baked/codec.d.ts +3 -6
  6. package/dist/baked/codec.js +48 -154
  7. package/dist/baked/codec.js.map +1 -1
  8. package/dist/baked/coverage.d.ts +6 -3
  9. package/dist/baked/coverage.js +6 -3
  10. package/dist/baked/coverage.js.map +1 -1
  11. package/dist/baked/fields.d.ts +9 -0
  12. package/dist/baked/fields.js +22 -0
  13. package/dist/baked/fields.js.map +1 -0
  14. package/dist/baked/index.d.ts +14 -8
  15. package/dist/baked/index.js +24 -22
  16. package/dist/baked/index.js.map +1 -1
  17. package/dist/baked/interior/faces.d.ts +4 -3
  18. package/dist/baked/interior/faces.js +16 -11
  19. package/dist/baked/interior/faces.js.map +1 -1
  20. package/dist/baked/interior/material.d.ts +7 -10
  21. package/dist/baked/interior/material.js +29 -36
  22. package/dist/baked/interior/material.js.map +1 -1
  23. package/dist/baked/interior/rooms.d.ts +1 -1
  24. package/dist/baked/interior/rooms.js +2 -2
  25. package/dist/baked/interior/rooms.js.map +1 -1
  26. package/dist/baked/low.js +5 -4
  27. package/dist/baked/low.js.map +1 -1
  28. package/dist/baked/raster.js +6 -6
  29. package/dist/baked/raster.js.map +1 -1
  30. package/dist/baked/textures.d.ts +17 -0
  31. package/dist/baked/textures.js +95 -0
  32. package/dist/baked/textures.js.map +1 -0
  33. package/dist/baked/transfer.js +19 -18
  34. package/dist/baked/transfer.js.map +1 -1
  35. package/dist/baked/unwrap.js +4 -3
  36. package/dist/baked/unwrap.js.map +1 -1
  37. package/dist/baked/xatlas.js.map +1 -1
  38. package/dist/codec/container.d.ts +8 -0
  39. package/dist/codec/container.js +63 -0
  40. package/dist/codec/container.js.map +1 -0
  41. package/dist/codec/mesh.d.ts +8 -0
  42. package/dist/{mesh/codec.js → codec/mesh.js} +80 -52
  43. package/dist/codec/mesh.js.map +1 -0
  44. package/dist/dispose.d.ts +8 -5
  45. package/dist/dispose.js +22 -24
  46. package/dist/dispose.js.map +1 -1
  47. package/dist/foliage.d.ts +32 -0
  48. package/dist/foliage.js +137 -0
  49. package/dist/foliage.js.map +1 -0
  50. package/dist/impostor/bake/atlas.d.ts +4 -4
  51. package/dist/impostor/bake/atlas.js +12 -12
  52. package/dist/impostor/bake/atlas.js.map +1 -1
  53. package/dist/impostor/bake/fit.d.ts +8 -0
  54. package/dist/impostor/bake/fit.js +28 -0
  55. package/dist/impostor/bake/fit.js.map +1 -0
  56. package/dist/impostor/bake/index.d.ts +22 -14
  57. package/dist/impostor/bake/index.js +50 -134
  58. package/dist/impostor/bake/index.js.map +1 -1
  59. package/dist/impostor/bake/materials.d.ts +3 -3
  60. package/dist/impostor/bake/materials.js +51 -13
  61. package/dist/impostor/bake/materials.js.map +1 -1
  62. package/dist/impostor/bake/sheet.d.ts +8 -0
  63. package/dist/impostor/bake/sheet.js +90 -0
  64. package/dist/impostor/bake/sheet.js.map +1 -0
  65. package/dist/impostor/bake/source.d.ts +3 -2
  66. package/dist/impostor/bake/source.js +9 -20
  67. package/dist/impostor/bake/source.js.map +1 -1
  68. package/dist/impostor/codec.d.ts +4 -5
  69. package/dist/impostor/codec.js +36 -109
  70. package/dist/impostor/codec.js.map +1 -1
  71. package/dist/impostor/impostor.d.ts +31 -7
  72. package/dist/impostor/impostor.js +21 -6
  73. package/dist/impostor/impostor.js.map +1 -1
  74. package/dist/impostor/ktx2/encode.d.ts +26 -0
  75. package/dist/impostor/ktx2/encode.js +120 -0
  76. package/dist/impostor/ktx2/encode.js.map +1 -0
  77. package/dist/impostor/ktx2/transcode.d.ts +3 -0
  78. package/dist/impostor/ktx2/transcode.js +99 -0
  79. package/dist/impostor/ktx2/transcode.js.map +1 -0
  80. package/dist/impostor/ktx2/uastc.d.ts +7 -0
  81. package/dist/impostor/ktx2/uastc.js +65 -0
  82. package/dist/impostor/ktx2/uastc.js.map +1 -0
  83. package/dist/impostor/ktx2/wasm/encoder.d.ts +4 -0
  84. package/dist/impostor/ktx2/wasm/encoder.js +10 -0
  85. package/dist/impostor/ktx2/wasm/encoder.js.map +1 -0
  86. package/dist/impostor/ktx2/wasm/transcoder.d.ts +3 -0
  87. package/dist/impostor/ktx2/wasm/transcoder.js +9 -0
  88. package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -0
  89. package/dist/impostor/ktx2/worker.d.ts +1 -0
  90. package/dist/impostor/ktx2/worker.js +10 -0
  91. package/dist/impostor/ktx2/worker.js.map +1 -0
  92. package/dist/impostor/mesh/card.d.ts +4 -4
  93. package/dist/impostor/mesh/card.js +7 -7
  94. package/dist/impostor/mesh/card.js.map +1 -1
  95. package/dist/impostor/mesh/index.d.ts +7 -6
  96. package/dist/impostor/mesh/index.js +10 -11
  97. package/dist/impostor/mesh/index.js.map +1 -1
  98. package/dist/impostor/mesh/material.d.ts +18 -9
  99. package/dist/impostor/mesh/material.js +40 -27
  100. package/dist/impostor/mesh/material.js.map +1 -1
  101. package/dist/impostor/mesh/surface.d.ts +1 -1
  102. package/dist/impostor/mesh/surface.js +13 -9
  103. package/dist/impostor/mesh/surface.js.map +1 -1
  104. package/dist/impostor/mesh/textures.d.ts +3 -3
  105. package/dist/impostor/mesh/textures.js +24 -34
  106. package/dist/impostor/mesh/textures.js.map +1 -1
  107. package/dist/index.d.ts +13 -11
  108. package/dist/index.js +12 -10
  109. package/dist/index.js.map +1 -1
  110. package/dist/instanced/camera.d.ts +34 -0
  111. package/dist/instanced/camera.js +45 -0
  112. package/dist/instanced/camera.js.map +1 -0
  113. package/dist/instanced/clusters.d.ts +54 -0
  114. package/dist/instanced/clusters.js +151 -0
  115. package/dist/instanced/clusters.js.map +1 -0
  116. package/dist/instanced/cull.d.ts +28 -0
  117. package/dist/instanced/cull.js +22 -0
  118. package/dist/instanced/cull.js.map +1 -0
  119. package/dist/instanced/instances.d.ts +39 -0
  120. package/dist/instanced/instances.js +104 -0
  121. package/dist/instanced/instances.js.map +1 -0
  122. package/dist/instanced/key.d.ts +19 -0
  123. package/dist/instanced/key.js +45 -0
  124. package/dist/instanced/key.js.map +1 -0
  125. package/dist/instanced/levels.d.ts +60 -0
  126. package/dist/instanced/levels.js +131 -0
  127. package/dist/instanced/levels.js.map +1 -0
  128. package/dist/instanced/lists.d.ts +57 -0
  129. package/dist/instanced/lists.js +114 -0
  130. package/dist/instanced/lists.js.map +1 -0
  131. package/dist/instanced/measure.d.ts +28 -0
  132. package/dist/instanced/measure.js +203 -0
  133. package/dist/instanced/measure.js.map +1 -0
  134. package/dist/instanced/meshes.d.ts +44 -51
  135. package/dist/instanced/meshes.js +167 -179
  136. package/dist/instanced/meshes.js.map +1 -1
  137. package/dist/instanced/mirror.d.ts +24 -0
  138. package/dist/instanced/mirror.js +76 -0
  139. package/dist/instanced/mirror.js.map +1 -0
  140. package/dist/instanced/raycast.d.ts +10 -11
  141. package/dist/instanced/raycast.js +31 -41
  142. package/dist/instanced/raycast.js.map +1 -1
  143. package/dist/instanced/rows.d.ts +50 -0
  144. package/dist/instanced/rows.js +36 -0
  145. package/dist/instanced/rows.js.map +1 -0
  146. package/dist/instanced/shape.d.ts +27 -0
  147. package/dist/instanced/shape.js +54 -0
  148. package/dist/instanced/shape.js.map +1 -0
  149. package/dist/instanced/sort.d.ts +61 -0
  150. package/dist/instanced/sort.js +192 -0
  151. package/dist/instanced/sort.js.map +1 -0
  152. package/dist/instanced/update.d.ts +34 -0
  153. package/dist/instanced/update.js +180 -0
  154. package/dist/instanced/update.js.map +1 -0
  155. package/dist/levels/bounds.d.ts +21 -0
  156. package/dist/levels/bounds.js +42 -0
  157. package/dist/levels/bounds.js.map +1 -0
  158. package/dist/levels/cameras.d.ts +48 -0
  159. package/dist/levels/cameras.js +122 -0
  160. package/dist/levels/cameras.js.map +1 -0
  161. package/dist/levels/compile/contexts.d.ts +30 -0
  162. package/dist/levels/compile/contexts.js +18 -0
  163. package/dist/levels/compile/contexts.js.map +1 -0
  164. package/dist/levels/compile/index.d.ts +41 -0
  165. package/dist/levels/compile/index.js +193 -0
  166. package/dist/levels/compile/index.js.map +1 -0
  167. package/dist/levels/compile/pipelines.d.ts +26 -0
  168. package/dist/levels/compile/pipelines.js +172 -0
  169. package/dist/levels/compile/pipelines.js.map +1 -0
  170. package/dist/levels/compiles.d.ts +29 -0
  171. package/dist/levels/compiles.js +50 -0
  172. package/dist/levels/compiles.js.map +1 -0
  173. package/dist/levels/draw.d.ts +102 -0
  174. package/dist/levels/draw.js +401 -0
  175. package/dist/levels/draw.js.map +1 -0
  176. package/dist/levels/fade.d.ts +60 -0
  177. package/dist/levels/fade.js +129 -0
  178. package/dist/levels/fade.js.map +1 -0
  179. package/dist/levels/index.d.ts +99 -0
  180. package/dist/levels/index.js +155 -0
  181. package/dist/levels/index.js.map +1 -0
  182. package/dist/levels/item.d.ts +38 -0
  183. package/dist/levels/item.js +89 -0
  184. package/dist/levels/item.js.map +1 -0
  185. package/dist/levels/load.d.ts +31 -0
  186. package/dist/levels/load.js +144 -0
  187. package/dist/levels/load.js.map +1 -0
  188. package/dist/levels/manager.d.ts +158 -0
  189. package/dist/levels/manager.js +352 -0
  190. package/dist/levels/manager.js.map +1 -0
  191. package/dist/{material.d.ts → levels/material.d.ts} +2 -2
  192. package/dist/{material.js → levels/material.js} +6 -5
  193. package/dist/levels/material.js.map +1 -0
  194. package/dist/levels/renderer.d.ts +32 -0
  195. package/dist/levels/renderer.js +57 -0
  196. package/dist/levels/renderer.js.map +1 -0
  197. package/dist/levels/requests.d.ts +52 -0
  198. package/dist/levels/requests.js +97 -0
  199. package/dist/levels/requests.js.map +1 -0
  200. package/dist/levels/screen.d.ts +14 -0
  201. package/dist/levels/screen.js +21 -0
  202. package/dist/levels/screen.js.map +1 -0
  203. package/dist/loader/build.d.ts +10 -0
  204. package/dist/loader/build.js +28 -0
  205. package/dist/loader/build.js.map +1 -0
  206. package/dist/loader/context.d.ts +44 -0
  207. package/dist/loader/context.js +96 -0
  208. package/dist/loader/context.js.map +1 -0
  209. package/dist/loader/entry.d.ts +4 -0
  210. package/dist/loader/entry.js +43 -0
  211. package/dist/loader/entry.js.map +1 -0
  212. package/dist/loader/index.d.ts +76 -0
  213. package/dist/loader/index.js +272 -0
  214. package/dist/loader/index.js.map +1 -0
  215. package/dist/loader/level.d.ts +41 -0
  216. package/dist/loader/level.js +140 -0
  217. package/dist/loader/level.js.map +1 -0
  218. package/dist/loader/node.d.ts +26 -0
  219. package/dist/loader/node.js +199 -0
  220. package/dist/loader/node.js.map +1 -0
  221. package/dist/loader/request.d.ts +54 -0
  222. package/dist/loader/request.js +19 -0
  223. package/dist/loader/request.js.map +1 -0
  224. package/dist/loader/url.d.ts +10 -6
  225. package/dist/loader/url.js +22 -14
  226. package/dist/loader/url.js.map +1 -1
  227. package/dist/lod.d.ts +144 -43
  228. package/dist/lod.js +354 -163
  229. package/dist/lod.js.map +1 -1
  230. package/dist/meshopt.d.ts +6 -0
  231. package/dist/meshopt.js +20 -0
  232. package/dist/meshopt.js.map +1 -0
  233. package/dist/node-process.d.ts +5 -0
  234. package/dist/node-process.js +6 -0
  235. package/dist/node-process.js.map +1 -0
  236. package/dist/node.d.ts +2 -0
  237. package/dist/node.js +5 -0
  238. package/dist/node.js.map +1 -0
  239. package/dist/simplify/cards.d.ts +14 -0
  240. package/dist/simplify/cards.js +128 -0
  241. package/dist/simplify/cards.js.map +1 -0
  242. package/dist/{simplify.d.ts → simplify/index.d.ts} +8 -5
  243. package/dist/{simplify.js → simplify/index.js} +45 -27
  244. package/dist/simplify/index.js.map +1 -0
  245. package/dist/{bounds.d.ts → source/detail.d.ts} +9 -23
  246. package/dist/{bounds.js → source/detail.js} +28 -58
  247. package/dist/source/detail.js.map +1 -0
  248. package/dist/source/deviation.js +6 -6
  249. package/dist/source/deviation.js.map +1 -1
  250. package/dist/source/{shading.d.ts → evaluator.d.ts} +10 -10
  251. package/dist/source/{shading.js → evaluator.js} +5 -5
  252. package/dist/source/evaluator.js.map +1 -0
  253. package/dist/source/{trace.d.ts → raycaster.d.ts} +6 -6
  254. package/dist/source/{trace.js → raycaster.js} +8 -8
  255. package/dist/source/raycaster.js.map +1 -0
  256. package/dist/source/{texels.d.ts → sampler.d.ts} +1 -1
  257. package/dist/source/{texels.js → sampler.js} +8 -5
  258. package/dist/source/sampler.js.map +1 -0
  259. package/dist/source/source.d.ts +1 -1
  260. package/dist/source/source.js +1 -1
  261. package/dist/source/source.js.map +1 -1
  262. package/dist/source/surface.js +1 -1
  263. package/dist/source/surface.js.map +1 -1
  264. package/dist/task.d.ts +6 -0
  265. package/dist/{pause.js → task.js} +5 -5
  266. package/dist/task.js.map +1 -0
  267. package/dist/three.d.ts +19 -30
  268. package/dist/three.js +30 -57
  269. package/dist/three.js.map +1 -1
  270. package/dist/tsl.d.ts +8 -12
  271. package/dist/tsl.js +11 -39
  272. package/dist/tsl.js.map +1 -1
  273. package/dist/typegpu.d.ts +37 -0
  274. package/dist/typegpu.js +37 -0
  275. package/dist/typegpu.js.map +1 -0
  276. package/dist/wind/bounds.js +3 -3
  277. package/dist/wind/bounds.js.map +1 -1
  278. package/dist/wind/hooks.d.ts +7 -4
  279. package/dist/wind/hooks.js +5 -2
  280. package/dist/wind/hooks.js.map +1 -1
  281. package/dist/wind/index.d.ts +4 -4
  282. package/dist/wind/index.js +25 -23
  283. package/dist/wind/index.js.map +1 -1
  284. package/dist/wind/sway.d.ts +2 -0
  285. package/dist/wind/sway.js +4 -1
  286. package/dist/wind/sway.js.map +1 -1
  287. package/package.json +24 -10
  288. package/skills/lod/SKILL.md +120 -32
  289. package/dist/bounds.js.map +0 -1
  290. package/dist/compile.d.ts +0 -4
  291. package/dist/compile.js +0 -100
  292. package/dist/compile.js.map +0 -1
  293. package/dist/deferred.d.ts +0 -12
  294. package/dist/deferred.js +0 -27
  295. package/dist/deferred.js.map +0 -1
  296. package/dist/fade.d.ts +0 -36
  297. package/dist/fade.js +0 -112
  298. package/dist/fade.js.map +0 -1
  299. package/dist/instanced/args.d.ts +0 -20
  300. package/dist/instanced/args.js +0 -77
  301. package/dist/instanced/args.js.map +0 -1
  302. package/dist/instanced/blocks.d.ts +0 -66
  303. package/dist/instanced/blocks.js +0 -294
  304. package/dist/instanced/blocks.js.map +0 -1
  305. package/dist/instanced/dirty.d.ts +0 -15
  306. package/dist/instanced/dirty.js +0 -96
  307. package/dist/instanced/dirty.js.map +0 -1
  308. package/dist/instanced/index.d.ts +0 -90
  309. package/dist/instanced/index.js +0 -349
  310. package/dist/instanced/index.js.map +0 -1
  311. package/dist/instanced/parts.d.ts +0 -14
  312. package/dist/instanced/parts.js +0 -79
  313. package/dist/instanced/parts.js.map +0 -1
  314. package/dist/instanced/select.d.ts +0 -92
  315. package/dist/instanced/select.js +0 -315
  316. package/dist/instanced/select.js.map +0 -1
  317. package/dist/instanced/store.d.ts +0 -31
  318. package/dist/instanced/store.js +0 -96
  319. package/dist/instanced/store.js.map +0 -1
  320. package/dist/levels.d.ts +0 -95
  321. package/dist/levels.js +0 -171
  322. package/dist/levels.js.map +0 -1
  323. package/dist/loader/bundle.d.ts +0 -25
  324. package/dist/loader/bundle.js +0 -241
  325. package/dist/loader/bundle.js.map +0 -1
  326. package/dist/loader/cache.d.ts +0 -15
  327. package/dist/loader/cache.js +0 -75
  328. package/dist/loader/cache.js.map +0 -1
  329. package/dist/loader/provenance.d.ts +0 -30
  330. package/dist/loader/provenance.js +0 -105
  331. package/dist/loader/provenance.js.map +0 -1
  332. package/dist/loader.d.ts +0 -55
  333. package/dist/loader.js +0 -239
  334. package/dist/loader.js.map +0 -1
  335. package/dist/material.js.map +0 -1
  336. package/dist/mesh/codec.d.ts +0 -4
  337. package/dist/mesh/codec.js.map +0 -1
  338. package/dist/pause.d.ts +0 -6
  339. package/dist/pause.js.map +0 -1
  340. package/dist/queue.d.ts +0 -2
  341. package/dist/queue.js +0 -33
  342. package/dist/queue.js.map +0 -1
  343. package/dist/renderer.d.ts +0 -21
  344. package/dist/renderer.js +0 -83
  345. package/dist/renderer.js.map +0 -1
  346. package/dist/residency.d.ts +0 -44
  347. package/dist/residency.js +0 -205
  348. package/dist/residency.js.map +0 -1
  349. package/dist/simplify.js.map +0 -1
  350. package/dist/source/shading.js.map +0 -1
  351. package/dist/source/texels.js.map +0 -1
  352. package/dist/source/trace.js.map +0 -1
  353. package/dist/view.d.ts +0 -45
  354. package/dist/view.js +0 -131
  355. package/dist/view.js.map +0 -1
@@ -0,0 +1,401 @@
1
+ import { d, std, tgpu } from "typegpu";
2
+ import { toTsl } from "../typegpu.js";
3
+ // Which levels one object draws at a height, written once: a Lod calls levelsToDraw as plain JS for the CPU's measures,
4
+ // and runs the same function per instance on the GPU, resolved into WGSL by TypeGPU.
5
+ /** Share of each level's range over which its finer neighbour fades out. */
6
+ export const FADE = 0.1;
7
+ /**
8
+ * The most levels a Lod has. WGSL has no arrays of a size given at run time, so levelsToDraw reads
9
+ * maxPixels from an array of this size, and the loaded sets are bits of one u32. The GPU side passes the array as two
10
+ * vec4s, `low` and `high` (see `levelsToDrawNode`), which hold eight.
11
+ */
12
+ export const MAX_LEVELS = 8;
13
+ /**
14
+ * The largest f32, which stands for any height levelsToDraw reads, as the maxPixels of level 0's Infinity: an f32
15
+ * holds Infinity, but WGSL has no literal for it and assumes finite math, so TypeGPU refuses to pass it.
16
+ */
17
+ export const ANY_HEIGHT = 3.4028234663852886e38;
18
+ /**
19
+ * The levels as levelsToDraw reads them, with the draw's settings: `maxPixels` per level, `empty` the bits of the
20
+ * levels that draw nothing, `coarsest` the coarsest level that draws something (level 0 if none does), `forced` the
21
+ * level every draw shows or -1, and `fades` 1 where levels fade (not in an orthographic camera or with a forced level),
22
+ * else 0.
23
+ */
24
+ export const DrawLevels = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(d.struct({
25
+ count: d.i32,
26
+ maxPixels: d.arrayOf(d.f32, MAX_LEVELS),
27
+ empty: d.u32,
28
+ coarsest: d.i32,
29
+ forced: d.i32,
30
+ fades: d.u32
31
+ }), "DrawLevels");
32
+ /** Whether bit `level` of `bits` is set: the levels of a set, such as the loaded ones, are bits of one number. */
33
+ export const has = (bits, level) => (bits >>> level & 1) === 1;
34
+ /** `levels` as levelsToDraw reads them, on the CPU and in the GPU's uniforms; `forced` a forced level or null. */
35
+ export function drawLevels(levels, empty, forced, fades) {
36
+ const maxPixels = Array.from({
37
+ length: MAX_LEVELS
38
+ }, (_, i) => Math.min(levels[i]?.maxPixels ?? 0, ANY_HEIGHT));
39
+ let coarsest = 0;
40
+ for (let i = 1; i < levels.length; i++) if (!has(empty, i)) coarsest = i;
41
+ return {
42
+ count: levels.length,
43
+ maxPixels,
44
+ empty,
45
+ coarsest,
46
+ forced: forced ?? -1,
47
+ fades: forced === null && fades ? 1 : 0
48
+ };
49
+ }
50
+ /**
51
+ * What one object draws: `level` with the signed fade `fade`, and `finer` with `-fade` (see fade.ts), so that each
52
+ * pixel is drawn by exactly one of them; with `fade` 0 only `level` draws. `level` -1 draws nothing.
53
+ */
54
+ export const Draw = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(d.struct({
55
+ level: d.i32,
56
+ finer: d.i32,
57
+ fade: d.f32
58
+ }), "Draw");
59
+ /**
60
+ * The level that draws most of an object's pixels in `draw`, or null for none. `level` keeps 1 - fade of them and
61
+ * `finer` fade (see fade.ts), so `finer` once fade is above one half; at one half exactly, `level`.
62
+ */
63
+ export function drawnLevel({
64
+ level,
65
+ finer,
66
+ fade
67
+ }) {
68
+ if (level < 0) return null;
69
+ return fade > 0.5 ? finer : level;
70
+ }
71
+ /** The GPU twin of `has` above, in code TypeGPU resolves: whether bit `index` of `bits` is set. */
72
+ const gpuHas = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.u32, d.i32], d.bool)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (bits, index) => {
73
+ "use gpu";
74
+
75
+ return (bits >>> d.u32(index) & 1) === 1;
76
+ }, {
77
+ v: 2,
78
+ name: undefined,
79
+ ast: {
80
+ params: [{
81
+ type: "i",
82
+ name: "bits"
83
+ }, {
84
+ type: "i",
85
+ name: "index"
86
+ }],
87
+ body: [0, [[10, [1, [1, [1, "bits", ">>>", [6, "d.u32", ["index"]]], "&", [5, "1"]], "===", [5, "1"]]]]]
88
+ },
89
+ externals: {
90
+ "d.u32": () => d.u32
91
+ }
92
+ }) && $.f)({})), "gpuHas");
93
+ /**
94
+ * Level `level`'s maxPixels. The array is walked rather than indexed: TypeScript types an index as possibly
95
+ * undefined, and code TypeGPU resolves cannot narrow it.
96
+ */
97
+ const maxPixelsOf = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([DrawLevels, d.i32], d.f32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (levels, level) => {
98
+ "use gpu";
99
+
100
+ let found = d.f32(0);
101
+ let i = d.i32(0);
102
+ for (const maxPixels of levels.maxPixels) {
103
+ if (i === level) found = maxPixels;
104
+ i = __tsover_add(i, 1);
105
+ }
106
+ return found;
107
+ }, {
108
+ v: 2,
109
+ name: undefined,
110
+ ast: {
111
+ params: [{
112
+ type: "i",
113
+ name: "levels"
114
+ }, {
115
+ type: "i",
116
+ name: "level"
117
+ }],
118
+ body: [0, [[12, "found", [6, "d.f32", [[5, "0"]]]], [12, "i", [6, "d.i32", [[5, "0"]]]], [18, [13, "maxPixels"], [7, "levels", "maxPixels"], [0, [[11, [1, "i", "===", "level"], [2, "found", "=", "maxPixels"]], [2, "i", "+=", [5, "1"]]]]], [10, "found"]]]
119
+ },
120
+ externals: {
121
+ "d.f32": () => d.f32,
122
+ "d.i32": () => d.i32
123
+ }
124
+ }) && $.f)({})), "maxPixelsOf");
125
+ /** The level a `height` px tall object is drawn at: the last one whose maxPixels it fits; level 0 fits any height. */
126
+ export const levelForHeight = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.f32, DrawLevels], d.i32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (height, levels) => {
127
+ "use gpu";
128
+
129
+ let level = d.i32(0);
130
+ let i = d.i32(0);
131
+ for (const maxPixels of levels.maxPixels) {
132
+ if (i > 0 && i < levels.count && height <= maxPixels) level = i;
133
+ i = __tsover_add(i, 1);
134
+ }
135
+ return level;
136
+ }, {
137
+ v: 2,
138
+ name: undefined,
139
+ ast: {
140
+ params: [{
141
+ type: "i",
142
+ name: "height"
143
+ }, {
144
+ type: "i",
145
+ name: "levels"
146
+ }],
147
+ body: [0, [[12, "level", [6, "d.i32", [[5, "0"]]]], [12, "i", [6, "d.i32", [[5, "0"]]]], [18, [13, "maxPixels"], [7, "levels", "maxPixels"], [0, [[11, [3, [3, [1, "i", ">", [5, "0"]], "&&", [1, "i", "<", [7, "levels", "count"]]], "&&", [1, "height", "<=", "maxPixels"]], [2, "level", "=", "i"]], [2, "i", "+=", [5, "1"]]]]], [10, "level"]]]
148
+ },
149
+ externals: {
150
+ "d.i32": () => d.i32
151
+ }
152
+ }) && $.f)({})), "levelForHeight");
153
+ /** `level` once loaded, else the nearest loaded coarser level that draws something, else -1: never a finer one. */
154
+ export const loadedOrCoarser = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.i32, DrawLevels, d.u32], d.i32)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (level, levels, loaded) => {
155
+ "use gpu";
156
+
157
+ if (gpuHas(loaded, level)) return level;
158
+ for (let i = __tsover_add(level, 1); i < levels.count; i++) {
159
+ if (gpuHas(loaded, i) && !gpuHas(levels.empty, i)) return i;
160
+ }
161
+ return -1;
162
+ }, {
163
+ v: 2,
164
+ name: undefined,
165
+ ast: {
166
+ params: [{
167
+ type: "i",
168
+ name: "level"
169
+ }, {
170
+ type: "i",
171
+ name: "levels"
172
+ }, {
173
+ type: "i",
174
+ name: "loaded"
175
+ }],
176
+ body: [0, [[11, [6, "gpuHas", ["loaded", "level"]], [10, "level"]], [14, [12, "i", [1, "level", "+", [5, "1"]]], [1, "i", "<", [7, "levels", "count"]], [102, "++", "i"], [0, [[11, [3, [6, "gpuHas", ["loaded", "i"]], "&&", [4, "!", [6, "gpuHas", [[7, "levels", "empty"], "i"]]]], [10, "i"]]]]], [10, [4, "-", [5, "1"]]]]]
177
+ },
178
+ externals: {
179
+ "gpuHas": () => gpuHas
180
+ }
181
+ }) && $.f)({})), "loadedOrCoarser");
182
+ /** What an object `height` px tall draws once the levels of `loaded` are loaded, with no arrival under way. */
183
+ const settled = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.f32, DrawLevels, d.u32], Draw)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (height, levels, loaded) => {
184
+ "use gpu";
185
+
186
+ // Nothing draws before the coarsest level that draws something: an object never vanishes as its camera backs away.
187
+ if (!gpuHas(loaded, levels.coarsest)) return Draw({
188
+ level: -1,
189
+ finer: -1,
190
+ fade: 0
191
+ });
192
+ let chosen = levels.forced;
193
+ let fade = d.f32(0);
194
+ if (chosen < 0) {
195
+ chosen = levelForHeight(height, levels);
196
+ if (levels.fades === 1 && chosen > 0) {
197
+ const top = maxPixelsOf(levels, chosen);
198
+ fade = std.smoothstep(__tsover_mul(top, __tsover_sub(1, FADE)), top, height);
199
+ }
200
+ }
201
+ const level = loadedOrCoarser(chosen, levels, loaded);
202
+ if (level < 0) return Draw({
203
+ level: -1,
204
+ finer: -1,
205
+ fade: 0
206
+ });
207
+ let finer = level;
208
+ if (fade > 0 && gpuHas(loaded, __tsover_sub(chosen, 1))) finer = __tsover_sub(chosen, 1);
209
+ if (finer === level) fade = 0;
210
+ return Draw({
211
+ level,
212
+ finer,
213
+ fade
214
+ });
215
+ }, {
216
+ v: 2,
217
+ name: undefined,
218
+ ast: {
219
+ params: [{
220
+ type: "i",
221
+ name: "height"
222
+ }, {
223
+ type: "i",
224
+ name: "levels"
225
+ }, {
226
+ type: "i",
227
+ name: "loaded"
228
+ }],
229
+ body: [0, [[11, [4, "!", [6, "gpuHas", ["loaded", [7, "levels", "coarsest"]]]], [10, [6, "Draw", [[104, {
230
+ level: [4, "-", [5, "1"]],
231
+ finer: [4, "-", [5, "1"]],
232
+ fade: [5, "0"]
233
+ }]]]]], [12, "chosen", [7, "levels", "forced"]], [12, "fade", [6, "d.f32", [[5, "0"]]]], [11, [1, "chosen", "<", [5, "0"]], [0, [[2, "chosen", "=", [6, "levelForHeight", ["height", "levels"]]], [11, [3, [1, [7, "levels", "fades"], "===", [5, "1"]], "&&", [1, "chosen", ">", [5, "0"]]], [0, [[13, "top", [6, "maxPixelsOf", ["levels", "chosen"]]], [2, "fade", "=", [6, "std.smoothstep", [[1, "top", "*", [1, [5, "1"], "-", "FADE"]], "top", "height"]]]]]]]]], [13, "level", [6, "loadedOrCoarser", ["chosen", "levels", "loaded"]]], [11, [1, "level", "<", [5, "0"]], [10, [6, "Draw", [[104, {
234
+ level: [4, "-", [5, "1"]],
235
+ finer: [4, "-", [5, "1"]],
236
+ fade: [5, "0"]
237
+ }]]]]], [12, "finer", "level"], [11, [3, [1, "fade", ">", [5, "0"]], "&&", [6, "gpuHas", ["loaded", [1, "chosen", "-", [5, "1"]]]]], [2, "finer", "=", [1, "chosen", "-", [5, "1"]]]], [11, [1, "finer", "===", "level"], [2, "fade", "=", [5, "0"]]], [10, [6, "Draw", [[104, {
238
+ level: "level",
239
+ finer: "finer",
240
+ fade: "fade"
241
+ }]]]]]]
242
+ },
243
+ externals: {
244
+ "gpuHas": () => gpuHas,
245
+ "Draw": () => Draw,
246
+ "d.f32": () => d.f32,
247
+ "levelForHeight": () => levelForHeight,
248
+ "maxPixelsOf": () => maxPixelsOf,
249
+ "std.smoothstep": () => std.smoothstep,
250
+ "FADE": () => FADE,
251
+ "loadedOrCoarser": () => loadedOrCoarser
252
+ }
253
+ }) && $.f)({})), "settled");
254
+ /**
255
+ * What an object `height` px tall draws: its level by height (or `levels.forced`), and inside the top FADE of that
256
+ * level's range its finer neighbour too, each as `loaded` has them (see `loadedOrCoarser`). Nothing draws until the
257
+ * coarsest level that draws something has loaded.
258
+ *
259
+ * While a level arrives, `progress` runs from 0 to 1 over the arrival (1 when none is under way) from what the levels
260
+ * of `before` drew to what those of `loaded` draw, with two draws only: the old height fade collapses onto one level,
261
+ * that level hands its pixels to the new one, and the new height fade opens. What arrives where nothing drew draws at
262
+ * once.
263
+ */
264
+ export const levelsToDraw = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.f32, DrawLevels, d.u32, d.u32, d.f32], Draw)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (height, levels, loaded, before, progress) => {
265
+ "use gpu";
266
+
267
+ const after = settled(height, levels, loaded);
268
+ if (progress >= 1) return after;
269
+ const from = settled(height, levels, before);
270
+ if (from.level < 0 || from.level === after.level && from.finer === after.finer) return after;
271
+ let level = after.level;
272
+ let finer = after.finer;
273
+ let fade = d.f32(0);
274
+ if (progress < __tsover_div(1, 3)) {
275
+ level = from.level;
276
+ finer = from.finer;
277
+ if (from.fade > 0) fade = __tsover_add(from.fade, __tsover_mul(__tsover_mul(__tsover_sub(1, from.fade), progress), 3));
278
+ } else if (progress < __tsover_div(2, 3)) {
279
+ level = std.select(after.level, after.finer, after.fade > 0);
280
+ finer = std.select(from.level, from.finer, from.fade > 0);
281
+ fade = __tsover_sub(1, __tsover_mul(__tsover_sub(progress, __tsover_div(1, 3)), 3));
282
+ } else if (after.fade > 0) {
283
+ fade = __tsover_sub(1, __tsover_mul(__tsover_mul(__tsover_sub(1, after.fade), __tsover_sub(progress, __tsover_div(2, 3))), 3));
284
+ }
285
+ if (level === finer) fade = 0;
286
+ return Draw({
287
+ level,
288
+ finer,
289
+ fade
290
+ });
291
+ }, {
292
+ v: 2,
293
+ name: undefined,
294
+ ast: {
295
+ params: [{
296
+ type: "i",
297
+ name: "height"
298
+ }, {
299
+ type: "i",
300
+ name: "levels"
301
+ }, {
302
+ type: "i",
303
+ name: "loaded"
304
+ }, {
305
+ type: "i",
306
+ name: "before"
307
+ }, {
308
+ type: "i",
309
+ name: "progress"
310
+ }],
311
+ body: [0, [[13, "after", [6, "settled", ["height", "levels", "loaded"]]], [11, [1, "progress", ">=", [5, "1"]], [10, "after"]], [13, "from", [6, "settled", ["height", "levels", "before"]]], [11, [3, [1, [7, "from", "level"], "<", [5, "0"]], "||", [3, [1, [7, "from", "level"], "===", [7, "after", "level"]], "&&", [1, [7, "from", "finer"], "===", [7, "after", "finer"]]]], [10, "after"]], [12, "level", [7, "after", "level"]], [12, "finer", [7, "after", "finer"]], [12, "fade", [6, "d.f32", [[5, "0"]]]], [11, [1, "progress", "<", [1, [5, "1"], "/", [5, "3"]]], [0, [[2, "level", "=", [7, "from", "level"]], [2, "finer", "=", [7, "from", "finer"]], [11, [1, [7, "from", "fade"], ">", [5, "0"]], [2, "fade", "=", [1, [7, "from", "fade"], "+", [1, [1, [1, [5, "1"], "-", [7, "from", "fade"]], "*", "progress"], "*", [5, "3"]]]]]]], [11, [1, "progress", "<", [1, [5, "2"], "/", [5, "3"]]], [0, [[2, "level", "=", [6, "std.select", [[7, "after", "level"], [7, "after", "finer"], [1, [7, "after", "fade"], ">", [5, "0"]]]]], [2, "finer", "=", [6, "std.select", [[7, "from", "level"], [7, "from", "finer"], [1, [7, "from", "fade"], ">", [5, "0"]]]]], [2, "fade", "=", [1, [5, "1"], "-", [1, [1, "progress", "-", [1, [5, "1"], "/", [5, "3"]]], "*", [5, "3"]]]]]], [11, [1, [7, "after", "fade"], ">", [5, "0"]], [0, [[2, "fade", "=", [1, [5, "1"], "-", [1, [1, [1, [5, "1"], "-", [7, "after", "fade"]], "*", [1, "progress", "-", [1, [5, "2"], "/", [5, "3"]]]], "*", [5, "3"]]]]]]]]], [11, [1, "level", "===", "finer"], [2, "fade", "=", [5, "0"]]], [10, [6, "Draw", [[104, {
312
+ level: "level",
313
+ finer: "finer",
314
+ fade: "fade"
315
+ }]]]]]]
316
+ },
317
+ externals: {
318
+ "settled": () => settled,
319
+ "d.f32": () => d.f32,
320
+ "std.select": () => std.select,
321
+ "Draw": () => Draw
322
+ }
323
+ }) && $.f)({})), "levelsToDraw");
324
+ // drawnOf passes maxPixels as two vec4s, `low` and `high`.
325
+ if (MAX_LEVELS !== 8) throw new Error("Lod: levelsToDraw's WGSL passes maxPixels as two vec4s: MAX_LEVELS must be 8");
326
+ /**
327
+ * levelsToDraw of the levels as `drawLevels` encodes them, with `low` and `high` holding maxPixels of levels 0 to 3 and
328
+ * 4 to 7: a vec3 of the level, the finer level (as floats) and the fade.
329
+ */
330
+ const drawnOf = /*#__PURE__*/(globalThis.__TYPEGPU_AUTONAME__ ?? (a => a))(tgpu.fn([d.f32, d.i32, d.vec4f, d.vec4f, d.u32, d.i32, d.i32, d.u32, d.u32, d.u32, d.f32], d.vec3f)(/*#__PURE__*/($ => (globalThis.__TYPEGPU_META__ ??= new WeakMap()).set($.f = (height, count, low, high, empty, coarsest, forced, fades, loaded, before, progress) => {
331
+ "use gpu";
332
+
333
+ const maxPixels = d.arrayOf(d.f32, MAX_LEVELS)([low.x, low.y, low.z, low.w, high.x, high.y, high.z, high.w]);
334
+ const drawn = levelsToDraw(height, DrawLevels({
335
+ count,
336
+ maxPixels,
337
+ empty,
338
+ coarsest,
339
+ forced,
340
+ fades
341
+ }), loaded, before, progress);
342
+ return d.vec3f(d.f32(drawn.level), d.f32(drawn.finer), drawn.fade);
343
+ }, {
344
+ v: 2,
345
+ name: undefined,
346
+ ast: {
347
+ params: [{
348
+ type: "i",
349
+ name: "height"
350
+ }, {
351
+ type: "i",
352
+ name: "count"
353
+ }, {
354
+ type: "i",
355
+ name: "low"
356
+ }, {
357
+ type: "i",
358
+ name: "high"
359
+ }, {
360
+ type: "i",
361
+ name: "empty"
362
+ }, {
363
+ type: "i",
364
+ name: "coarsest"
365
+ }, {
366
+ type: "i",
367
+ name: "forced"
368
+ }, {
369
+ type: "i",
370
+ name: "fades"
371
+ }, {
372
+ type: "i",
373
+ name: "loaded"
374
+ }, {
375
+ type: "i",
376
+ name: "before"
377
+ }, {
378
+ type: "i",
379
+ name: "progress"
380
+ }],
381
+ body: [0, [[13, "maxPixels", [6, [6, "d.arrayOf", ["d.f32", "MAX_LEVELS"]], [[100, [[7, "low", "x"], [7, "low", "y"], [7, "low", "z"], [7, "low", "w"], [7, "high", "x"], [7, "high", "y"], [7, "high", "z"], [7, "high", "w"]]]]]], [13, "drawn", [6, "levelsToDraw", ["height", [6, "DrawLevels", [[104, {
382
+ count: "count",
383
+ maxPixels: "maxPixels",
384
+ empty: "empty",
385
+ coarsest: "coarsest",
386
+ forced: "forced",
387
+ fades: "fades"
388
+ }]]], "loaded", "before", "progress"]]], [10, [6, "d.vec3f", [[6, "d.f32", [[7, "drawn", "level"]]], [6, "d.f32", [[7, "drawn", "finer"]]], [7, "drawn", "fade"]]]]]]
389
+ },
390
+ externals: {
391
+ "d.arrayOf": () => d.arrayOf,
392
+ "d.f32": () => d.f32,
393
+ "MAX_LEVELS": () => MAX_LEVELS,
394
+ "levelsToDraw": () => levelsToDraw,
395
+ "DrawLevels": () => DrawLevels,
396
+ "d.vec3f": () => d.vec3f
397
+ }
398
+ }) && $.f)({})), "drawnOf");
399
+ /** drawnOf on the GPU, from its inputs as TSL nodes. */
400
+ export const levelsToDrawNode = toTsl("lodDraw", ["height", "count", "low", "high", "empty", "coarsest", "forced", "fades", "loaded", "before", "progress"], drawnOf);
401
+ //# sourceMappingURL=draw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["d","std","tgpu","toTsl","FADE","MAX_LEVELS","ANY_HEIGHT","DrawLevels","globalThis","__TYPEGPU_AUTONAME__","a","struct","count","i32","maxPixels","arrayOf","f32","empty","u32","coarsest","forced","fades","has","bits","level","drawLevels","levels","Array","from","length","_","i","Math","min","Draw","finer","fade","drawnLevel","gpuHas","fn","bool","$","__TYPEGPU_META__","WeakMap","set","f","index","v","name","undefined","ast","params","type","body","externals","d.u32","maxPixelsOf","found","__tsover_add","d.f32","d.i32","levelForHeight","height","loadedOrCoarser","loaded","settled","chosen","top","smoothstep","__tsover_mul","__tsover_sub","std.smoothstep","levelsToDraw","before","progress","after","__tsover_div","select","std.select","Error","drawnOf","vec4f","vec3f","low","high","x","y","z","w","drawn","d.arrayOf","d.vec3f","levelsToDrawNode"],"sources":["../../src/levels/draw.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,60 @@
1
+ import { type Camera, Color, type IndirectStorageBufferAttribute, Matrix4, StorageBufferAttribute, StorageInstancedBufferAttribute, type Node, type NodeBuilder, type Object3D } from "three/webgpu";
2
+ /**
3
+ * For one camera, the instances a Lod's level meshes draw: per slot, the instance and its signed fade, and where the
4
+ * camera's indirect draws of them lie, `DRAW_BYTES` apart in the order of the Lod's meshes.
5
+ */
6
+ export interface InstanceSlots {
7
+ /** the index of the instance each slot draws */
8
+ readonly indices: StorageBufferAttribute;
9
+ /** its signed fade */
10
+ readonly fades: StorageBufferAttribute;
11
+ /** Where the camera's indirect draws of the Lod's meshes start (see rows.ts). */
12
+ readonly args: {
13
+ readonly offset: number;
14
+ readonly attribute: IndirectStorageBufferAttribute;
15
+ };
16
+ }
17
+ /** What a Lod's level meshes draw their instances from: every instance's matrix, and its colour (RGB and a pad). */
18
+ export interface DrawnInstances {
19
+ matrices: StorageInstancedBufferAttribute;
20
+ colors: StorageInstancedBufferAttribute;
21
+ }
22
+ /** How a mesh drawing instances is drawn: where its fade and shadow size come from. */
23
+ export interface FadeSource {
24
+ /** per camera, the instance and signed fade of each slot; null for none (an ImpostorMesh of its own, drawing every instance) */
25
+ slots: ((camera: Camera) => InstanceSlots | null) | null;
26
+ /** one instance's bounding radius in its own space */
27
+ radius: number;
28
+ /** debug tint, white when off */
29
+ tint: Color;
30
+ /**
31
+ * For a plain mesh of a Lod's level: the instances it draws, and `space`, where its geometry's space sits in the
32
+ * source's (a Lod draws template geometry moved into the instance's space). An ImpostorMesh carries its own instances.
33
+ */
34
+ level?: {
35
+ readonly instances: DrawnInstances;
36
+ readonly space: Matrix4;
37
+ };
38
+ }
39
+ /** Draw `mesh` as `source` says: its materials read it while it renders. */
40
+ export declare const setFadeSource: (mesh: Object3D, source: FadeSource) => void;
41
+ export declare const fadeSourceOf: (mesh: Object3D) => FadeSource | undefined;
42
+ /** This draw's debug tint (see `Lod.debug`). */
43
+ export declare const tint: import("three/webgpu").UniformNode<"color", Color>;
44
+ /** Interleaved gradient noise over the pixels of the target being drawn. */
45
+ export declare const dither: (pixel: Node<"vec2">) => Node<"float">;
46
+ /** Where `object`'s geometry space sits in its source's: moved for a Lod's plain level mesh (see `FadeSource`). */
47
+ export declare const spaceOf: (object: Object3D | null) => Matrix4 | null;
48
+ /** This draw's instance matrix when its matrices live in storage, else null. */
49
+ export declare function instanceMatrixOf(object: Object3D): Node<"mat4"> | null;
50
+ /** The colour of a draw whose instances have none: given one from the start, a draw's shader stays the same once they do. */
51
+ export declare const white: StorageInstancedBufferAttribute;
52
+ export declare const instanceColor: import("three/webgpu").VaryingNode<"vec3">;
53
+ /** Apply the level's shared instance bindings before its own deformation, as Three does for InstancedMesh. */
54
+ export declare function placeInstances(builder: NodeBuilder): void;
55
+ /** This draw's signed fade. */
56
+ export declare const fade: import("three/src/nodes/TSL.js").FnNode<[], Node<"float">>;
57
+ /** Whether this pixel is this draw's, by its fade: false on the other level's pixels. */
58
+ export declare const keepsPixel: import("three/src/nodes/TSL.js").FnNode<[], Node<"bool">>;
59
+ /** `position` in a shadow map render, or nothing (a point) when the draw is too small to cast. */
60
+ export declare const castPosition: (position: Node<"vec3">) => Node<"vec3">;
@@ -0,0 +1,129 @@
1
+ import { Color, Matrix4, StorageBufferAttribute, StorageInstancedBufferAttribute, } from "three/webgpu";
2
+ import { Fn, NodeUpdateType, bool, cameraProjectionMatrix, dot, float, fract, instanceIndex, modelWorldMatrix, normalLocal, positionLocal, transformNormal, varyingProperty, screenCoordinate, screenSize, select, storage, uniform, uniformGroup, varying, vec2, vec3, } from "three/tsl";
3
+ import { isImpostorMesh, isInstancedMesh, isStorageInstanced } from "../three.js";
4
+ import { column, isOrthographic, maxScale } from "../tsl.js";
5
+ /**
6
+ * Per level mesh, where its fade comes from: a side table, as three's Object3D has no typed place for a package's state
7
+ * (userData is the app's).
8
+ */
9
+ const sources = new WeakMap();
10
+ /** Draw `mesh` as `source` says: its materials read it while it renders. */
11
+ export const setFadeSource = (mesh, source) => void sources.set(mesh, source);
12
+ export const fadeSourceOf = (mesh) => sources.get(mesh);
13
+ const WHITE = new Color(1, 1, 1);
14
+ const of = (object) => (object ? sources.get(object) : undefined);
15
+ // Per-object values, shared by every material: each draw reads its own.
16
+ const instanceRadius = uniform(0).onObjectUpdate(({ object }) => of(object)?.radius ?? 0);
17
+ /** This draw's debug tint (see `Lod.debug`). */
18
+ export const tint = uniform(new Color(1, 1, 1)).onObjectUpdate(({ object }) => of(object)?.tint ?? WHITE);
19
+ /** Interleaved gradient noise over the pixels of the target being drawn. */
20
+ export const dither = (pixel) => fract(float(52.9829189).mul(fract(dot(pixel, vec2(0.06711056, 0.00583715)))));
21
+ /** The level mesh `object` is, when it is a Lod's plain one. */
22
+ const levelOf = (object) => of(object)?.level ?? null;
23
+ /** The instances where `object` reads its matrices and colours from storage: its own, or its Lod's; else null. */
24
+ function instancesOf(object) {
25
+ if (isImpostorMesh(object))
26
+ return { matrices: object.instanceMatrix, colors: object.instanceColor };
27
+ const level = levelOf(object);
28
+ if (level)
29
+ return level.instances;
30
+ return isInstancedMesh(object) && isStorageInstanced(object.instanceMatrix) ? { matrices: object.instanceMatrix, colors: null } : null;
31
+ }
32
+ /** Where `object`'s geometry space sits in its source's: moved for a Lod's plain level mesh (see `FadeSource`). */
33
+ export const spaceOf = (object) => levelOf(object)?.space ?? null;
34
+ // The draw buffers below are replaced per object, so they stay out of three's texture-keyed
35
+ // binding caches: each render object has its own bindings of this group, while its shader
36
+ // reads the shared nodes.
37
+ const instanceGroup = uniformGroup("lodInstances", 2, NodeUpdateType.OBJECT);
38
+ const identity = new StorageInstancedBufferAttribute(new Float32Array(new Matrix4().elements), 16);
39
+ const matrices = storage(identity, "mat4", 0)
40
+ .setName("lodInstanceMatrices")
41
+ .setGroup(instanceGroup)
42
+ .toReadOnly()
43
+ .onObjectUpdate(({ object }) => {
44
+ const instances = object && instancesOf(object);
45
+ if (!instances)
46
+ throw new Error("Lod: instance draw has no matrices");
47
+ return instances.matrices;
48
+ });
49
+ /** `object`'s slots as `camera` draws it, when it draws slots. */
50
+ function slotsOf(object, camera) {
51
+ const draw = of(object);
52
+ return draw?.slots && camera ? draw.slots(camera) : null;
53
+ }
54
+ const zero = new StorageBufferAttribute(new Float32Array(1), 1);
55
+ const fades = storage(zero, "float", 0)
56
+ .setName("lodInstanceFades")
57
+ .setGroup(instanceGroup)
58
+ .toReadOnly()
59
+ .onObjectUpdate(({ object, camera }) => slotsOf(object, camera)?.fades ?? zero);
60
+ const none = new StorageBufferAttribute(new Uint32Array(1), 1);
61
+ const indices = storage(none, "uint", 0)
62
+ .setName("lodInstanceSlots")
63
+ .setGroup(instanceGroup)
64
+ .toReadOnly()
65
+ .onObjectUpdate(({ object, camera }) => slotsOf(object, camera)?.indices ?? none);
66
+ /** 1 when the draw's instances are slots the instance pass for each camera fills, else 0. */
67
+ const slotted = uniform(0, "uint").onObjectUpdate(({ object }) => Number(!!of(object)?.slots));
68
+ /** The instance this draw's instance index stands for: the one in its slot, or itself. */
69
+ const instance = Fn(() => slotted.equal(1).select(indices.element(instanceIndex), instanceIndex));
70
+ /** This draw's instance matrix when its matrices live in storage, else null. */
71
+ export function instanceMatrixOf(object) {
72
+ return instancesOf(object) ? matrices.element(instance()) : null;
73
+ }
74
+ /** The colour of a draw whose instances have none: given one from the start, a draw's shader stays the same once they do. */
75
+ export const white = new StorageInstancedBufferAttribute(new Float32Array([1, 1, 1, 1]), 4);
76
+ const colors = storage(white, "vec4", 0)
77
+ .setName("lodInstanceColors")
78
+ .setGroup(instanceGroup)
79
+ .toReadOnly()
80
+ .onObjectUpdate(({ object }) => (object && instancesOf(object)?.colors) || white);
81
+ const colorIndex = uniform(0, "uint").onObjectUpdate(({ object }) => {
82
+ const colors = object && instancesOf(object)?.colors;
83
+ return Number(!!colors && colors !== white);
84
+ });
85
+ export const instanceColor = varying(colors.element(instance().mul(colorIndex)).xyz).setInterpolation("flat");
86
+ /** Apply the level's shared instance bindings before its own deformation, as Three does for InstancedMesh. */
87
+ export function placeInstances(builder) {
88
+ if (!levelOf(builder.object))
89
+ return;
90
+ const matrix = matrices.element(instance());
91
+ positionLocal.assign(matrix.mul(positionLocal).xyz);
92
+ if (builder.geometry.hasAttribute("normal"))
93
+ normalLocal.assign(transformNormal(normalLocal, matrix));
94
+ varyingProperty("vec3", "vInstanceColor").assign(instanceColor);
95
+ }
96
+ /** This draw's signed fade. */
97
+ export const fade = Fn((builder) => {
98
+ if (isImpostorMesh(builder.object))
99
+ return varying(fades.element(instanceIndex.mul(slotted))).setInterpolation("flat");
100
+ if (!sources.get(builder.object)?.slots)
101
+ return float(0);
102
+ // Constant across the primitive: keep compute-written slots out of fragment bindings.
103
+ return varying(fades.element(instanceIndex)).setInterpolation("flat");
104
+ });
105
+ /** Whether this pixel is this draw's, by its fade: false on the other level's pixels. */
106
+ export const keepsPixel = Fn(() => {
107
+ const f = fade();
108
+ const d = dither(screenCoordinate.xy);
109
+ return select(f.greaterThanEqual(0), d.greaterThanEqual(f), d.lessThan(f.negate()));
110
+ });
111
+ /**
112
+ * Whether this draw is too small for the shadow map being drawn: narrower than a texel
113
+ * of an orthographic (directional light's) map, it would cover a texel centre only by
114
+ * chance, flickering as it or the map moves. Only valid in a shadow map render.
115
+ */
116
+ const tooSmallToCast = Fn((builder) => {
117
+ const { object } = builder;
118
+ const instance = sources.has(object) ? instanceMatrixOf(object) : null;
119
+ // A mesh drawing no instances of a Lod's or an ImpostorMesh's is never too small to cast.
120
+ if (!instance)
121
+ return bool(false);
122
+ const diameter = maxScale(modelWorldMatrix.mul(instance)).mul(instanceRadius).mul(2);
123
+ // projection[1][1] is 2 × zoom / (top - bottom)
124
+ const texel = float(2).div(column(cameraProjectionMatrix, 1).y.mul(screenSize.y));
125
+ return isOrthographic(cameraProjectionMatrix).and(diameter.lessThan(texel));
126
+ });
127
+ /** `position` in a shadow map render, or nothing (a point) when the draw is too small to cast. */
128
+ export const castPosition = (position) => select(tooSmallToCast(), vec3(0), position);
129
+ //# sourceMappingURL=fade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fade.js","sourceRoot":"","sources":["../../src/levels/fade.ts"],"names":[],"mappings":"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"}