@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
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Yield to the page, so that a long bake does not freeze it: `scheduler.yield()` where
3
- * there is one, else a message round trip. Unlike setTimeout, neither is throttled to
4
- * one call a second in a background tab.
2
+ * A promise that settles in a later task of the page's event loop: `scheduler.yield()`
3
+ * where there is one, else a message round trip. Unlike setTimeout, neither is throttled
4
+ * to one call a second in a background tab.
5
5
  */
6
- export function pause() {
6
+ export function nextTask() {
7
7
  const scheduler = Reflect.get(globalThis, "scheduler");
8
8
  const yielding = typeof scheduler === "object" && scheduler !== null ? Reflect.get(scheduler, "yield") : undefined;
9
9
  if (typeof yielding === "function")
@@ -17,4 +17,4 @@ export function pause() {
17
17
  channel.port2.postMessage(null);
18
18
  });
19
19
  }
20
- //# sourceMappingURL=pause.js.map
20
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,SAAS,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnH,IAAI,OAAO,QAAQ,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/three.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { MeshStandardNodeMaterial, type BatchedMesh, type Box3, type BufferAttribute, type Color, type InstancedMesh, type Loader, type Material, type Mesh, type MeshPhysicalMaterial, type MeshStandardMaterial, type Node, type NodeMaterial, type Object3D, type Renderer, type Scene, type SkinnedMesh, type StorageInstancedBufferAttribute, type Texture } from "three/webgpu";
2
- import type { GLTSLoader, GLTSScene } from "@drawcall/glts";
3
- import type { Instances } from "./instanced/meshes.js";
4
- import type { InstancedLod } from "./instanced/index.js";
1
+ import { MeshStandardNodeMaterial, type BatchedMesh, type Box3, type BufferAttribute, type Color, type CompressedTexture, type InstancedMesh, type Material, type Matrix4, type Mesh, type MeshPhysicalMaterial, type MeshStandardMaterial, type Node, type NodeMaterial, type Object3D, type Renderer, type Scene, type SkinnedMesh, type StorageInstancedBufferAttribute, type Texture } from "three/webgpu";
2
+ import type { GLTSScene } from "@drawcall/glts";
3
+ import type { Lod } from "./lod.js";
5
4
  import type { ImpostorMesh } from "./impostor/mesh/index.js";
6
5
  export declare const isObject3D: (value: unknown) => value is Object3D;
7
6
  export declare const isNode: (value: unknown) => value is Node;
@@ -11,13 +10,14 @@ export declare const isInstancedMesh: (node: Object3D) => node is InstancedMesh;
11
10
  export declare const isBatchedMesh: (node: Object3D) => node is BatchedMesh;
12
11
  export declare const isLight: (node: Object3D) => boolean;
13
12
  export declare const isScene: (node: Object3D) => node is Scene;
13
+ export declare const isLine: (node: Object3D) => boolean;
14
+ export declare const isPoints: (node: Object3D) => boolean;
15
+ export declare const isSprite: (node: Object3D) => boolean;
16
+ /** A scene a GLTSLoader loaded: its loader gives it a dispose of its own, which a clone, a plain Scene, lacks. */
14
17
  export declare const isGLTSScene: (node: Object3D) => node is GLTSScene;
15
- /** A GLTSLoader, recognized by the bundled module provenance it publishes. */
16
- export declare const isGLTSLoader: (loader: Loader) => loader is GLTSLoader;
17
18
  export declare const isImpostorMesh: (node: Object3D) => node is ImpostorMesh;
18
- export declare const isLodInstances: (node: Object3D) => node is Instances;
19
- export declare const isInstancedLod: (node: Object3D) => node is InstancedLod;
20
- /** three's LOD and this package's Lod and InstancedLod. */
19
+ export declare const isLod: (node: Object3D) => node is Lod;
20
+ /** three's LOD and this package's Lod. */
21
21
  export declare const isLOD: (node: Object3D) => node is Object3D & {
22
22
  isLOD: true;
23
23
  autoUpdate: boolean;
@@ -32,36 +32,25 @@ export declare const isNodeMaterial: (material: Material) => material is NodeMat
32
32
  export declare const isStandardNode: (material: Material) => material is MeshStandardNodeMaterial;
33
33
  export declare const isStorageInstanced: (attribute: BufferAttribute) => attribute is StorageInstancedBufferAttribute;
34
34
  /**
35
- * A node material that renders like `material`: a clone when it is one, else the node
36
- * material of its type with its values, as three converts it for WebGPU itself.
35
+ * A node material that renders like `material`: a clone when it is one, else the node material of its type with its
36
+ * values, as three converts it for WebGPU itself. NodeMaterial.copy skips accessors of Material itself, alphaTest among
37
+ * them.
37
38
  */
38
39
  export declare function toNodeMaterial(material: Material): NodeMaterial;
40
+ export declare const isBox3: (value: unknown) => value is Box3;
39
41
  export declare const isTexture: (value: unknown) => value is Texture;
42
+ export declare const isCompressedTexture: (value: unknown) => value is CompressedTexture;
40
43
  export declare const isColor: (value: unknown) => value is Color;
41
- /**
42
- * `renderer` as the WebGPU renderer it is: three's typings give render callbacks a
43
- * WebGLRenderer, which this package does not draw with.
44
- */
45
- export declare function gpuRenderer(renderer: unknown): Renderer;
46
- /** The queue of `renderer`'s WebGPU device; throws until the backend has one. */
47
- export declare function gpuQueue(renderer: Renderer): GPUQueueLike;
48
- interface GPUQueueLike {
49
- onSubmittedWorkDone(): Promise<void>;
50
- }
51
- /**
52
- * Whether the scene `node` is in is being drawn into a shadow map: three's shadow pass
53
- * draws it with its own override material, and calls `update` on every LOD with the
54
- * light's camera, which must not switch the levels the view chose.
55
- */
56
- export declare function inShadowPass(node: Object3D): boolean;
44
+ export declare const isRenderer: (value: unknown) => value is Renderer;
45
+ /** The root of the tree `node` is in: its scene, once added to one. */
46
+ export declare function rootOf(node: Object3D): Object3D;
57
47
  /** Whether `material` is the one three draws shadow maps with (a node material building for a shadow pass has it). */
58
48
  export declare const isShadowPass: (material: unknown) => boolean;
59
- /** The storage matrices of a level draw, an ImpostorMesh, or a storage-backed InstancedMesh; else null. */
60
- export declare function storageMatrices(object: Object3D): StorageInstancedBufferAttribute | null;
61
49
  /** Whether `value` is of exactly `like`'s class: a guard for clone() overrides. */
62
50
  export declare const sameClass: <T extends object>(like: T, value: object) => value is T;
63
51
  /** Throws if anything under `root` is skinned; `who` names the caller in the message. */
64
52
  export declare function rejectSkinned(root: Object3D, who: string): void;
65
53
  /** Give `level` the transform of `source`, and its shadows: cast or receive if any mesh of it does. */
66
54
  export declare function placeLike(level: Object3D, source: Object3D): void;
67
- export {};
55
+ /** Upper bound on the largest singular value, exact for orthogonal matrix axes. */
56
+ export declare function stretch(matrix: Matrix4): number;
package/dist/three.js CHANGED
@@ -10,13 +10,14 @@ export const isInstancedMesh = (node) => flag(node, "isInstancedMesh");
10
10
  export const isBatchedMesh = (node) => flag(node, "isBatchedMesh");
11
11
  export const isLight = (node) => flag(node, "isLight");
12
12
  export const isScene = (node) => flag(node, "isScene");
13
- export const isGLTSScene = (node) => isScene(node) && "source" in node && "dispose" in node && typeof node.dispose === "function";
14
- /** A GLTSLoader, recognized by the bundled module provenance it publishes. */
15
- export const isGLTSLoader = (loader) => "moduleSources" in loader && typeof loader.moduleSources === "object" && loader.moduleSources !== null;
13
+ export const isLine = (node) => flag(node, "isLine");
14
+ export const isPoints = (node) => flag(node, "isPoints");
15
+ export const isSprite = (node) => flag(node, "isSprite");
16
+ /** A scene a GLTSLoader loaded: its loader gives it a dispose of its own, which a clone, a plain Scene, lacks. */
17
+ export const isGLTSScene = (node) => isScene(node) && "source" in node && Object.hasOwn(node, "dispose");
16
18
  export const isImpostorMesh = (node) => flag(node, "isImpostorMesh");
17
- export const isLodInstances = (node) => flag(node, "isLodInstances");
18
- export const isInstancedLod = (node) => flag(node, "isInstancedLod");
19
- /** three's LOD and this package's Lod and InstancedLod. */
19
+ export const isLod = (node) => flag(node, "isLod");
20
+ /** three's LOD and this package's Lod. */
20
21
  export const isLOD = (node) => flag(node, "isLOD");
21
22
  export const isStandard = (material) => flag(material, "isMeshStandardMaterial");
22
23
  export const isPhysical = (material) => flag(material, "isMeshPhysicalMaterial");
@@ -35,71 +36,35 @@ const NODE_MATERIALS = {
35
36
  MeshNormalMaterial: MeshNormalNodeMaterial,
36
37
  };
37
38
  /**
38
- * A node material that renders like `material`: a clone when it is one, else the node
39
- * material of its type with its values, as three converts it for WebGPU itself.
39
+ * A node material that renders like `material`: a clone when it is one, else the node material of its type with its
40
+ * values, as three converts it for WebGPU itself. NodeMaterial.copy skips accessors of Material itself, alphaTest among
41
+ * them.
40
42
  */
41
43
  export function toNodeMaterial(material) {
42
- if (isNodeMaterial(material)) {
43
- const copy = material.clone();
44
- // three's NodeMaterial.copy skips accessors of Material itself, alphaTest among them.
45
- copy.alphaTest = material.alphaTest;
46
- return copy;
47
- }
44
+ const copy = isNodeMaterial(material) ? material.clone() : new (nodeMaterialOf(material))().copy(material);
45
+ copy.alphaTest = material.alphaTest;
46
+ return copy;
47
+ }
48
+ function nodeMaterialOf(material) {
48
49
  const Type = NODE_MATERIALS[material.type];
49
50
  if (!Type)
50
51
  throw new Error(`@drawcall/lod: ${material.type} has no node material to draw with WebGPU`);
51
- // Every own value but the source's identity and its event listeners.
52
- const values = Object.fromEntries(Object.entries(material).filter(([key]) => key !== "uuid" && key !== "_listeners"));
53
- return Object.assign(new Type(), values);
52
+ return Type;
54
53
  }
54
+ export const isBox3 = (value) => flag(value, "isBox3");
55
55
  export const isTexture = (value) => flag(value, "isTexture");
56
+ export const isCompressedTexture = (value) => flag(value, "isCompressedTexture");
56
57
  export const isColor = (value) => flag(value, "isColor");
57
- /**
58
- * `renderer` as the WebGPU renderer it is: three's typings give render callbacks a
59
- * WebGLRenderer, which this package does not draw with.
60
- */
61
- export function gpuRenderer(renderer) {
62
- if (!isRenderer(renderer))
63
- throw new Error("@drawcall/lod: draws with three's WebGPURenderer only");
64
- return renderer;
65
- }
66
- const isRenderer = (value) => flag(value, "isRenderer");
67
- /** The queue of `renderer`'s WebGPU device; throws until the backend has one. */
68
- export function gpuQueue(renderer) {
69
- const { backend } = renderer;
70
- // three's typings declare WebGPUBackend but not its device.
71
- const device = isWebGPUBackend(backend) && "device" in backend ? backend.device : undefined;
72
- if (!hasQueue(device))
73
- throw new Error("@drawcall/lod: level preparation requires an initialized WebGPU device");
74
- return device.queue;
75
- }
76
- const hasQueue = (value) => typeof value === "object" &&
77
- value !== null &&
78
- "queue" in value &&
79
- typeof value.queue === "object" &&
80
- value.queue !== null &&
81
- "onSubmittedWorkDone" in value.queue &&
82
- typeof value.queue.onSubmittedWorkDone === "function";
83
- const isWebGPUBackend = (backend) => flag(backend, "isWebGPUBackend");
84
- /**
85
- * Whether the scene `node` is in is being drawn into a shadow map: three's shadow pass
86
- * draws it with its own override material, and calls `update` on every LOD with the
87
- * light's camera, which must not switch the levels the view chose.
88
- */
89
- export function inShadowPass(node) {
58
+ export const isRenderer = (value) => flag(value, "isRenderer");
59
+ /** The root of the tree `node` is in: its scene, once added to one. */
60
+ export function rootOf(node) {
90
61
  let root = node;
91
62
  while (root.parent)
92
63
  root = root.parent;
93
- return "overrideMaterial" in root && isShadowPass(root.overrideMaterial);
64
+ return root;
94
65
  }
95
66
  /** Whether `material` is the one three draws shadow maps with (a node material building for a shadow pass has it). */
96
67
  export const isShadowPass = (material) => flag(material, "isShadowPassMaterial");
97
- /** The storage matrices of a level draw, an ImpostorMesh, or a storage-backed InstancedMesh; else null. */
98
- export function storageMatrices(object) {
99
- if (isImpostorMesh(object) || isLodInstances(object))
100
- return object.instanceMatrix;
101
- return isInstancedMesh(object) && isStorageInstanced(object.instanceMatrix) ? object.instanceMatrix : null;
102
- }
103
68
  /** Whether `value` is of exactly `like`'s class: a guard for clone() overrides. */
104
69
  export const sameClass = (like, value) => Object.getPrototypeOf(value) === Object.getPrototypeOf(like);
105
70
  /** Throws if anything under `root` is skinned; `who` names the caller in the message. */
@@ -121,4 +86,12 @@ export function placeLike(level, source) {
121
86
  level.receiveShadow ||= node.receiveShadow;
122
87
  });
123
88
  }
89
+ /** Upper bound on the largest singular value, exact for orthogonal matrix axes. */
90
+ export function stretch(matrix) {
91
+ const e = matrix.elements;
92
+ const xy = Math.abs(e[0] * e[4] + e[1] * e[5] + e[2] * e[6]);
93
+ const xz = Math.abs(e[0] * e[8] + e[1] * e[9] + e[2] * e[10]);
94
+ const yz = Math.abs(e[4] * e[8] + e[5] * e[9] + e[6] * e[10]);
95
+ return Math.sqrt(Math.max(e[0] ** 2 + e[1] ** 2 + e[2] ** 2 + xy + xz, e[4] ** 2 + e[5] ** 2 + e[6] ** 2 + xy + yz, e[8] ** 2 + e[9] ** 2 + e[10] ** 2 + xz + yz));
96
+ }
124
97
  //# sourceMappingURL=three.js.map
package/dist/three.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"three.js","sourceRoot":"","sources":["../src/three.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"three.js","sourceRoot":"","sources":["../src/three.ts"],"names":[],"mappings":"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"}
package/dist/tsl.d.ts CHANGED
@@ -1,8 +1,10 @@
1
- import type { BufferAttribute, ContextNode, Node, NodeBuilder, StorageBufferNode } from "three/webgpu";
1
+ import type { Node, NodeBuilder } from "three/webgpu";
2
2
  /** Column `i` (0..3) of `m`. */
3
3
  export declare const column: (m: Node<"mat4">, i: 0 | 1 | 2 | 3) => Node<"vec4">;
4
4
  /** The largest scale `m` applies along an axis. */
5
5
  export declare const maxScale: (m: Node<"mat4">) => Node<"float">;
6
+ /** An upper bound on the largest stretch `m` applies to any direction, exact for orthogonal axes (as `stretch` in three.ts). */
7
+ export declare function stretch(m: Node<"mat4">): Node<"float">;
6
8
  /** Whether projection `m` is orthographic: its bottom-right element is 1. */
7
9
  export declare const isOrthographic: (m: Node<"mat4">) => Node<"bool">;
8
10
  /** An affine matrix `m` and the inverse of its linear part, as cofactor columns over the determinant. */
@@ -25,21 +27,15 @@ export declare function contextNode(builder: NodeBuilder, ...path: string[]): No
25
27
  * An object that stays the same throughout one build of a shader, to cache per build
26
28
  * what several of a material's slots read. Each slot is handed its own proxy of the
27
29
  * builder, and three's typings expose no handle of the build itself: this is what the
28
- * build keeps for `anchor`.
30
+ * build holds for `anchor`. `getNodeProperties` is public in three, only missing from
31
+ * its typings.
29
32
  */
30
33
  export declare function buildKey(builder: NodeBuilder, anchor: Node): object;
31
34
  /**
32
35
  * Whether `node` builds to a `type` value, which three's typings leave open for a
33
36
  * material's slots. Checked while a shader builds, so a slot of another type fails there.
34
37
  */
35
- export declare function isNodeOf<T extends "bool" | "float" | "vec3" | "vec4" | "color">(node: Node, type: T, builder: NodeBuilder): node is Node<T>;
36
- /** One room-bounds node per buffer; a stable name lets equal shaders share programs. */
37
- export declare function roomBounds(attribute: BufferAttribute): StorageBufferNode<"vec4">;
38
- export declare const instanceGroup: import("three/webgpu").UniformGroupNode;
39
- /**
40
- * A context in which every texture read is `bias` mip levels above the level the
41
- * hardware would pick: the level from the read's own texel footprint, plus `bias`. Reads
42
- * with uv of their own making, or with an explicit level or gradients, keep theirs.
43
- */
44
- export declare function biasedTextures(bias: Node<"float">): ContextNode<unknown>;
38
+ export declare function isNodeOf<T extends NodeType>(node: Node, type: T, builder: NodeBuilder): node is Node<T>;
39
+ /** The TSL node types `isNodeOf` tells apart. */
40
+ export type NodeType = "bool" | "float" | "int" | "uint" | "vec2" | "vec3" | "vec4" | "mat4";
45
41
  export {};
package/dist/tsl.js CHANGED
@@ -1,4 +1,4 @@
1
- import { NodeUpdateType, context, cross, dFdx, dFdy, dot, length, log2, max, storage, uniform, uniformGroup, uv, vec2, vec3, vec4 } from "three/tsl";
1
+ import { cross, dot, max, vec3, vec4 } from "three/tsl";
2
2
  import { isNode } from "./three.js";
3
3
  // Matrix access for the shaders, in operations three's typings know: they type no
4
4
  // columns, inverses or transposes of matrix nodes. A product with a unit vector picks a
@@ -7,6 +7,14 @@ import { isNode } from "./three.js";
7
7
  export const column = (m, i) => m.mul(vec4(i === 0 ? 1 : 0, i === 1 ? 1 : 0, i === 2 ? 1 : 0, i === 3 ? 1 : 0));
8
8
  /** The largest scale `m` applies along an axis. */
9
9
  export const maxScale = (m) => max(column(m, 0).xyz.length(), max(column(m, 1).xyz.length(), column(m, 2).xyz.length()));
10
+ /** An upper bound on the largest stretch `m` applies to any direction, exact for orthogonal axes (as `stretch` in three.ts). */
11
+ export function stretch(m) {
12
+ const a = column(m, 0).xyz, b = column(m, 1).xyz, c = column(m, 2).xyz;
13
+ const ab = dot(a, b).abs();
14
+ const ac = dot(a, c).abs();
15
+ const bc = dot(b, c).abs();
16
+ return max(dot(a, a).add(ab).add(ac), max(dot(b, b).add(ab).add(bc), dot(c, c).add(ac).add(bc))).sqrt();
17
+ }
10
18
  /** Whether projection `m` is orthographic: its bottom-right element is 1. */
11
19
  export const isOrthographic = (m) => column(m, 3).w.equal(1);
12
20
  export function affine(m) {
@@ -37,7 +45,8 @@ export function contextNode(builder, ...path) {
37
45
  * An object that stays the same throughout one build of a shader, to cache per build
38
46
  * what several of a material's slots read. Each slot is handed its own proxy of the
39
47
  * builder, and three's typings expose no handle of the build itself: this is what the
40
- * build keeps for `anchor`.
48
+ * build holds for `anchor`. `getNodeProperties` is public in three, only missing from
49
+ * its typings.
41
50
  */
42
51
  export function buildKey(builder, anchor) {
43
52
  const properties = Reflect.apply(Reflect.get(builder, "getNodeProperties"), builder, [anchor]);
@@ -52,41 +61,4 @@ export function buildKey(builder, anchor) {
52
61
  export function isNodeOf(node, type, builder) {
53
62
  return node.getNodeType(builder) === type;
54
63
  }
55
- const bounds = new WeakMap();
56
- /** One room-bounds node per buffer; a stable name lets equal shaders share programs. */
57
- export function roomBounds(attribute) {
58
- let node = bounds.get(attribute);
59
- if (!node)
60
- bounds.set(attribute, (node = storage(attribute, "vec4", 0).setName("lodRoomBounds")));
61
- return node;
62
- }
63
- // Keep replaceable draw buffers out of texture-keyed binding caches. Each render
64
- // object owns this group's bindings while its shader reads the shared nodes below.
65
- export const instanceGroup = uniformGroup("lodInstances", 2, NodeUpdateType.OBJECT);
66
- /** The size in texels of a texture's image, or null when it has none to read. */
67
- function texelsOf(image) {
68
- if (typeof image !== "object" || image === null || !("width" in image) || !("height" in image))
69
- return null;
70
- const { width, height } = image;
71
- return typeof width === "number" && typeof height === "number" ? [width, height] : null;
72
- }
73
- /**
74
- * A context in which every texture read is `bias` mip levels above the level the
75
- * hardware would pick: the level from the read's own texel footprint, plus `bias`. Reads
76
- * with uv of their own making, or with an explicit level or gradients, keep theirs.
77
- */
78
- export function biasedTextures(bias) {
79
- return context({
80
- getTextureLevel: (node) => {
81
- const texture = node.value;
82
- const size = texelsOf(texture.image);
83
- if (node.uvNode || !size)
84
- return null;
85
- // The texture's offset, repeat and rotation, as three applies them.
86
- const at = uniform(texture.matrix).mul(vec3(uv(texture.channel), 1)).xy;
87
- const texels = at.mul(vec2(size[0], size[1]));
88
- return log2(max(max(length(dFdx(texels)), length(dFdy(texels))), 1e-6)).add(bias);
89
- },
90
- });
91
- }
92
64
  //# sourceMappingURL=tsl.js.map
package/dist/tsl.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tsl.js","sourceRoot":"","sources":["../src/tsl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tsl.js","sourceRoot":"","sources":["../src/tsl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Node } from "three/webgpu";
2
+ import { type TgpuFn } from "typegpu";
3
+ /** The WGSL types a TypeGPU function given to toTsl takes or returns, by TypeGPU's names, and the TSL node type of each. */
4
+ declare const NODE_TYPES: {
5
+ readonly f32: "float";
6
+ readonly i32: "int";
7
+ readonly u32: "uint";
8
+ readonly vec3f: "vec3";
9
+ readonly vec4f: "vec4";
10
+ readonly mat4x4f: "mat4";
11
+ };
12
+ type WgslType = keyof typeof NODE_TYPES;
13
+ /** The WGSL types such a function returns. */
14
+ type ReturnedType = "f32" | "vec3f" | "vec4f";
15
+ /** A TypeGPU data type, such as `d.f32`, by its WGSL name. */
16
+ type Typed<T extends WgslType = WgslType> = {
17
+ readonly type: T;
18
+ };
19
+ /** A TypeGPU function's argument and return types. */
20
+ interface Shell<A extends readonly Typed[], R extends ReturnedType> {
21
+ readonly argTypes: A;
22
+ readonly returnType: Typed<R>;
23
+ }
24
+ /** The TSL nodes the function takes, by the names `N` of its arguments, typed `A` in their order. */
25
+ type TslInputs<N extends readonly string[], A extends readonly Typed[]> = {
26
+ [I in keyof N & `${number}` as N[I]]: Node<(typeof NODE_TYPES)[A[I & keyof A]["type"]]>;
27
+ };
28
+ /**
29
+ * A TSL function of nodes named `names` that calls `fn`, a TypeGPU function, through a WGSL forwarder `name`;
30
+ * TypeGPU's WGSL joins the shader as a library.
31
+ */
32
+ export declare function toTsl<A extends Typed[], R extends ReturnedType, const N extends {
33
+ [I in keyof A]: string;
34
+ }>(name: string, names: N, fn: TgpuFn & {
35
+ readonly shell: Shell<A, R>;
36
+ }): (inputs: TslInputs<N, A>) => Node<(typeof NODE_TYPES)[R]>;
37
+ export {};
@@ -0,0 +1,37 @@
1
+ import { Fn, code, wgslFn } from "three/tsl";
2
+ import { tgpu } from "typegpu";
3
+ import { at } from "./at.js";
4
+ import { isNodeOf } from "./tsl.js";
5
+ // TypeGPU functions ('use gpu') in three's shaders: one function runs as plain JS on the CPU and, through toTsl, as
6
+ // WGSL in a TSL node graph.
7
+ /** The WGSL types a TypeGPU function given to toTsl takes or returns, by TypeGPU's names, and the TSL node type of each. */
8
+ const NODE_TYPES = {
9
+ f32: "float",
10
+ i32: "int",
11
+ u32: "uint",
12
+ vec3f: "vec3",
13
+ vec4f: "vec4",
14
+ mat4x4f: "mat4"
15
+ };
16
+ // Not generic: three's Fn leaves a generic return type unresolved.
17
+ export function toTsl(name, names, fn) {
18
+ // TgpuFn types its shell loosely; the signature types it by its WGSL types.
19
+ const shell = fn.shell;
20
+ const returned = shell.returnType.type;
21
+ const params = names.map((param, index) => `${param}: ${at(shell.argTypes, index).type}`);
22
+ const signature = `(${params.join(", ")}) -> ${returned}`;
23
+ const library = code(tgpu.resolve({
24
+ template: `fn ${name}Of${signature} { return target(${names.join(", ")}); }`,
25
+ externals: {
26
+ target: fn
27
+ }
28
+ }));
29
+ const call = wgslFn(`fn ${name}${signature} { return ${name}Of(${names.join(", ")}); }`, [library]);
30
+ const type = NODE_TYPES[returned];
31
+ return inputs => Fn(builder => {
32
+ const value = call(inputs);
33
+ if (isNodeOf(value, type, builder)) return value;
34
+ throw new Error(`@drawcall/lod: ${name}'s WGSL returns no ${returned}`);
35
+ })();
36
+ }
37
+ //# sourceMappingURL=typegpu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Fn","code","wgslFn","tgpu","at","isNodeOf","NODE_TYPES","f32","i32","u32","vec3f","vec4f","mat4x4f","toTsl","name","names","fn","shell","returned","returnType","type","params","map","param","index","argTypes","signature","join","library","resolve","template","externals","target","call","inputs","builder","value","Error"],"sources":["../src/typegpu.ts"],"sourcesContent":[null],"mappings":"AACA,SAASA,EAAE,EAAEC,IAAI,EAAEC,MAAM,QAAQ,WAAW;AAC5C,SAASC,IAAI,QAAqB,SAAS;AAC3C,SAASC,EAAE,QAAQ,SAAS;AAC5B,SAASC,QAAQ,QAAuB,UAAU;AAElD;AACA;AAEA;AACA,MAAMC,UAAU,GAAG;EAAEC,GAAG,EAAE,OAAO;EAAEC,GAAG,EAAE,KAAK;EAAEC,GAAG,EAAE,MAAM;EAAEC,KAAK,EAAE,MAAM;EAAEC,KAAK,EAAE,MAAM;EAAEC,OAAO,EAAE;AAAM,CAA8C;AA6BvJ;AACA,OAAM,SAAUC,KAAKA,CACnBC,IAAY,EACZC,KAAwB,EACxBC,EAA6D;EAE7D;EACA,MAAMC,KAAK,GAAiCD,EAAE,CAACC,KAAK;EACpD,MAAMC,QAAQ,GAAGD,KAAK,CAACE,UAAU,CAACC,IAAI;EACtC,MAAMC,MAAM,GAAGN,KAAK,CAACO,GAAG,CAAC,CAACC,KAAK,EAAEC,KAAK,KAAK,GAAGD,KAAK,KAAKnB,EAAE,CAACa,KAAK,CAACQ,QAAQ,EAAED,KAAK,CAAC,CAACJ,IAAI,EAAE,CAAC;EACzF,MAAMM,SAAS,GAAG,IAAIL,MAAM,CAACM,IAAI,CAAC,IAAI,CAAC,QAAQT,QAAQ,EAAE;EACzD,MAAMU,OAAO,GAAG3B,IAAI,CAACE,IAAI,CAAC0B,OAAO,CAAC;IAAEC,QAAQ,EAAE,MAAMhB,IAAI,KAAKY,SAAS,oBAAoBX,KAAK,CAACY,IAAI,CAAC,IAAI,CAAC,MAAM;IAAEI,SAAS,EAAE;MAAEC,MAAM,EAAEhB;IAAE;EAAE,CAAE,CAAC,CAAC;EAC/I,MAAMiB,IAAI,GAAG/B,MAAM,CAAC,MAAMY,IAAI,GAAGY,SAAS,aAAaZ,IAAI,MAAMC,KAAK,CAACY,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAACC,OAAO,CAAC,CAAC;EACnG,MAAMR,IAAI,GAAGd,UAAU,CAACY,QAAQ,CAAC;EACjC,OAAQgB,MAAM,IACZlC,EAAE,CAAEmC,OAAO,IAAI;IACb,MAAMC,KAAK,GAAGH,IAAI,CAACC,MAAM,CAAC;IAC1B,IAAI7B,QAAQ,CAAC+B,KAAK,EAAEhB,IAAI,EAAEe,OAAO,CAAC,EAAE,OAAOC,KAAK;IAChD,MAAM,IAAIC,KAAK,CAAC,kBAAkBvB,IAAI,sBAAsBI,QAAQ,EAAE,CAAC;EACzE,CAAC,CAAC,EAAE;AACR","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import { Matrix4, Sphere, Vector3 } from "three/webgpu";
2
- import { drawOf } from "../fade.js";
2
+ import { fadeSourceOf } from "../levels/fade.js";
3
3
  import { isImpostorMesh, isInstancedMesh } from "../three.js";
4
4
  /** Bound maximum sway on the mesh itself, leaving shared geometry in its rest pose. */
5
5
  export function windBounds(mesh, placement, amplitude, baseY, height) {
@@ -16,8 +16,8 @@ export function windBounds(mesh, placement, amplitude, baseY, height) {
16
16
  const reach = Math.max(Math.abs(root.min.y - baseY), Math.abs(root.max.y - baseY)) / height;
17
17
  rest.radius += amplitude * reach * horizontalScale(placement.clone().invert());
18
18
  // An ImpostorMesh of its own measures its shadow casters by this radius too.
19
- const draw = drawOf(mesh);
20
- if (draw?.kind === "instances")
19
+ const draw = fadeSourceOf(mesh);
20
+ if (draw)
21
21
  draw.radius = rest.radius;
22
22
  const instances = isInstancedMesh(mesh) || isImpostorMesh(mesh) ? mesh : null;
23
23
  if (!instances) {
@@ -1 +1 @@
1
- {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../src/wind/bounds.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../src/wind/bounds.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
- /** Setup-only culling and caster padding; selection and fades keep their rest bounds. */
2
- export declare const WIND_BOUNDS: unique symbol;
3
- export interface WindBounds {
4
- [WIND_BOUNDS](padding: number, slope: number, baseY: number): void;
1
+ /**
2
+ * How a Lod takes wind: it refuses it once it has rendered or prepares levels, whose shaders would then
3
+ * build in a frame; else it pads its setup-only culling and casters, while the levels it draws hold their rest bounds.
4
+ */
5
+ export declare const WIND: unique symbol;
6
+ export interface WindTarget {
7
+ [WIND](padding: number, slope: number, baseY: number): void;
5
8
  }
@@ -1,3 +1,6 @@
1
- /** Setup-only culling and caster padding; selection and fades keep their rest bounds. */
2
- export const WIND_BOUNDS = Symbol("wind bounds");
1
+ /**
2
+ * How a Lod takes wind: it refuses it once it has rendered or prepares levels, whose shaders would then
3
+ * build in a frame; else it pads its setup-only culling and casters, while the levels it draws hold their rest bounds.
4
+ */
5
+ export const WIND = Symbol("wind");
3
6
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/wind/hooks.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/wind/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC"}
@@ -15,7 +15,7 @@ export interface SwayOptions {
15
15
  }
16
16
  /**
17
17
  * A shared GPU breeze: an affine sway, fixed at the base and linear with height.
18
- * Bake/build levels first, apply once to the completed Lod, InstancedLod, mesh or
18
+ * Bake/build levels first, apply once to the completed Lod, mesh or
19
19
  * mesh group, then set time once before rendering each frame. All levels and shadow
20
20
  * passes share the motion. Simplified and baked meshes need no special preparation.
21
21
  *
@@ -28,7 +28,7 @@ export interface SwayOptions {
28
28
  * must stay fixed after applying; move/rotate/scale the root or its instances instead.
29
29
  * Nested LODs and nested instance batches must be applied individually; an
30
30
  * InstancedMesh sways only with its matrices in a storage buffer (an ImpostorMesh's are).
31
- * Lod, InstancedLod and ImpostorMesh clones retain the shared breeze. For ordinary
31
+ * Lod and ImpostorMesh clones retain the shared breeze. For ordinary
32
32
  * Mesh/Group clones, apply to each clone too: the material is shared but the sway is
33
33
  * the mesh's. Tangent-space normal maps are supported (tangents do not sway);
34
34
  * object-space normal maps are not.
@@ -42,12 +42,12 @@ export declare class Wind {
42
42
  /** Oscillations per second; zero freezes the time-dependent part of the phase. */
43
43
  get speed(): number;
44
44
  set speed(value: number);
45
- /** Global amplitude multiplier in [0, 1]. Zero keeps the wind shader but draws the rest pose. */
45
+ /** Global amplitude multiplier in [0, 1]. Zero draws the rest pose, with the wind shader. */
46
46
  get strength(): number;
47
47
  set strength(value: number);
48
48
  get direction(): readonly [number, number];
49
49
  set direction([x, z]: readonly [number, number]);
50
- /** Attach once, after constructing all levels. Objects without this call keep their original shaders. */
50
+ /** Attach once, after constructing all levels and before a Lod first renders. Objects without this call draw with their original shaders. */
51
51
  apply(root: Object3D, { amplitude, baseY, height }: SwayOptions): void;
52
52
  /** Attach meshes arriving with a deferred level; existing meshes retain their bounds. */
53
53
  private attach;