@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,180 @@
1
+ import { Fn, If, Loop, Return, atomicAdd, atomicLoad, atomicStore, computeKernel, distance, dot, float, int, localId, mat4, storage, uint, vec4, workgroupId, } from "three/tsl";
2
+ import { MAX_LEVELS, levelsToDrawNode } from "../levels/draw.js";
3
+ import { column, maxScale, stretch } from "../tsl.js";
4
+ import { toTsl } from "../typegpu.js";
5
+ import { cullScale, instanceOnScreen } from "./measure.js";
6
+ import { DRAW_BYTES, FLOATS_AT, INTS_AT, UNLISTED } from "./rows.js";
7
+ // Sorting a Lod's instances into its levels' instance lists for one camera, on the GPU, in two passes it builds once
8
+ // (see sort.ts).
9
+ //
10
+ // One workgroup per block of `BLOCK` instances of the ranges the camera sees (see clusters.ts), one lane per instance:
11
+ // updateInstance skips an instance at scale 0, thins it out by `cullDistance`, skips it outside the camera's frustum,
12
+ // measures its height on screen from its matrix with instanceOnScreen, picks what it draws with levelsToDraw, the
13
+ // function the CPU runs too, and appends itself to each level it draws: its index and signed fade go to that level's
14
+ // next free slot. Each level that draws something has a list of `listSize` slots, from the start the row gives; the
15
+ // level's draws start there (their first instance). The indirect pass hands each level's count to the indirect draws of
16
+ // the Lod's meshes and clears the counts for the next camera. Both stay within WebGPU's default limit of 8 storage
17
+ // buffers per stage.
18
+ const cullScaleNode = toTsl("lodCullScale", ["origin", "distance", "near", "far", "survivors"], cullScale);
19
+ const instanceOnScreenNode = toTsl("lodInstanceOnScreen", ["matrix", "source", "grow", "eye", "scale", "ortho"], instanceOnScreen);
20
+ /** Instances per block of a range, one workgroup's lanes. */
21
+ export const BLOCK = 64;
22
+ /** WebGPU's guaranteed maxComputeWorkgroupsPerDimension: the most blocks one sort visits. */
23
+ export const MAX_BLOCKS = 65535;
24
+ /** The sort passes over `buffers`, their nodes pointed at other buffers by `point`. */
25
+ export function sortPasses(buffers) {
26
+ const nodes = nodesOf(buffers);
27
+ const update = computeKernel(Fn(() => {
28
+ const block = nodes.blocks.element(workgroupId.x).toVar();
29
+ const index = block.x.add(localId.x).toVar();
30
+ If(index.greaterThanEqual(block.y), () => void Return());
31
+ updateInstance(nodes, index);
32
+ })(), [BLOCK]);
33
+ const indirect = computeKernel(Fn(() => writeDraws(nodes))(), [1]);
34
+ indirect.dispatchSize = [1, 1, 1];
35
+ return {
36
+ update,
37
+ indirect,
38
+ /** Point the passes at `next`, dispatching the update pass over its `blocks` blocks: before they run. */
39
+ point(next, blocks) {
40
+ nodes.words.value = next.words;
41
+ nodes.floats.value = next.floats;
42
+ nodes.blocks.value = next.blocks;
43
+ nodes.matrices.value = next.matrices;
44
+ nodes.scaled.value = next.scaled;
45
+ nodes.indices.value = next.indices;
46
+ nodes.fades.value = next.fades;
47
+ nodes.counts.value = next.counts;
48
+ nodes.draws.value = next.draws;
49
+ nodes.args.value = next.args;
50
+ update.dispatchSize = [blocks, 1, 1];
51
+ },
52
+ dispose() {
53
+ update.dispose();
54
+ indirect.dispose();
55
+ },
56
+ };
57
+ }
58
+ /** The storage nodes of `buffers`, as the passes read and write them. */
59
+ function nodesOf(buffers) {
60
+ return {
61
+ words: storage(buffers.words, "uint", 0).setName("lodRowWords").toReadOnly(),
62
+ floats: storage(buffers.floats, "float", 0).setName("lodRowFloats").toReadOnly(),
63
+ blocks: storage(buffers.blocks, "uvec2", 0).setName("lodBlocks").toReadOnly(),
64
+ matrices: storage(buffers.matrices, "mat4", 0).setName("lodMatrices").toReadOnly(),
65
+ scaled: storage(buffers.scaled, "mat4", 0).setName("lodScaledMatrices"),
66
+ indices: storage(buffers.indices, "uint", 0).setName("lodSlotIndices"),
67
+ fades: storage(buffers.fades, "float", 0).setName("lodSlotFades"),
68
+ counts: storage(buffers.counts, "uint", 0).setName("lodCounts").toAtomic(),
69
+ draws: storage(buffers.draws, "uvec4", 0).setName("lodDraws").toReadOnly(),
70
+ args: storage(buffers.args, "uint", 0).setName("lodDrawArgs"),
71
+ };
72
+ }
73
+ /** The row's values, by name. */
74
+ function rowOf(nodes) {
75
+ const u = (k, c) => nodes.words.element(k * 4 + c).toVar();
76
+ const f = (k, c) => nodes.floats.element(k * 4 + c);
77
+ const f4 = (k) => vec4(f(k, 0), f(k, 1), f(k, 2), f(k, 3)).toVar();
78
+ const eye = f4(FLOATS_AT.eye);
79
+ const values = f4(FLOATS_AT.values);
80
+ return {
81
+ count: int(u(INTS_AT.levels, 0)),
82
+ coarsest: int(u(INTS_AT.levels, 1)),
83
+ forced: int(u(INTS_AT.levels, 2)).sub(1), // see forcedWord
84
+ empty: u(INTS_AT.masks, 0),
85
+ fades: u(INTS_AT.masks, 1),
86
+ loaded: u(INTS_AT.masks, 2),
87
+ before: u(INTS_AT.masks, 3),
88
+ ortho: u(INTS_AT.flags, 0),
89
+ culled: u(INTS_AT.flags, 1),
90
+ survivors: u(INTS_AT.flags, 2),
91
+ drawCount: u(INTS_AT.flags, 3),
92
+ listSize: u(INTS_AT.layout, 0),
93
+ /** The first slot of level `level`'s list, `UNLISTED` for none. */
94
+ start: (level) => nodes.words.element(uint(INTS_AT.starts * 4).add(level)),
95
+ low: f4(FLOATS_AT.low),
96
+ high: f4(FLOATS_AT.high),
97
+ eye: eye.xyz,
98
+ scale: eye.w,
99
+ source: f4(FLOATS_AT.source),
100
+ progress: values.x,
101
+ reach: values.y,
102
+ near: values.z,
103
+ far: values.w,
104
+ cullEye: f4(FLOATS_AT.cullEye).xyz,
105
+ planes: Array.from({ length: 6 }, (_, i) => f4(FLOATS_AT.planes + i)),
106
+ };
107
+ }
108
+ /** Instance `index`, sorted into the lists of the levels it draws for the camera whose row `nodes` read. */
109
+ function updateInstance(nodes, index) {
110
+ const r = rowOf(nodes);
111
+ const { count, coarsest, forced, empty, fades, loaded, before, eye, scale, progress, reach, near, far, ortho, culled, survivors, low, high } = r;
112
+ const m = nodes.matrices.element(index).toVar();
113
+ const hide = () => void Return();
114
+ If(maxScale(m).equal(0), hide);
115
+ const grow = float(1).toVar();
116
+ If(culled.equal(uint(1)), () => {
117
+ const origin = column(m, 3).xyz.toVar();
118
+ grow.assign(cullScaleNode({ origin, distance: distance(origin, r.cullEye), near, far, survivors }));
119
+ If(grow.equal(0), hide);
120
+ If(survivors.equal(uint(1)), () => {
121
+ const scaled = mat4(column(m, 0).mul(grow), column(m, 1).mul(grow), column(m, 2).mul(grow), column(m, 3));
122
+ nodes.scaled.element(index).assign(scaled);
123
+ });
124
+ });
125
+ const onScreen = instanceOnScreenNode({ matrix: m, source: r.source, grow, eye, scale, ortho }).toVar();
126
+ const centre = onScreen.xyz;
127
+ // Outside the camera's frustum: wholly behind one of its planes, with every level and its sway.
128
+ const extent = reach
129
+ .mul(stretch(m))
130
+ .mul(grow)
131
+ .mul(1 + 1e-4)
132
+ .negate();
133
+ for (const plane of r.planes)
134
+ If(dot(plane.xyz, centre).add(plane.w).lessThan(extent), hide);
135
+ const height = onScreen.w;
136
+ const drawn = levelsToDrawNode({ height, count, low, high, empty, coarsest, forced, fades, loaded, before, progress }).toVar();
137
+ const level = int(drawn.x).toVar();
138
+ const finer = int(drawn.y).toVar();
139
+ const fade = drawn.z.toVar();
140
+ const { listSize } = r;
141
+ /** Append the instance to level `at`'s list with `signed`, if the level has one and its list has room. */
142
+ const append = (at, signed) => {
143
+ const level = uint(at).toVar();
144
+ const start = r.start(level).toVar();
145
+ If(start.notEqual(UNLISTED), () => {
146
+ const k = atomicAdd(nodes.counts.element(level), uint(1)).toVar();
147
+ If(k.lessThan(listSize), () => {
148
+ const slot = start.add(k).toVar();
149
+ nodes.indices.element(slot).assign(index);
150
+ nodes.fades.element(slot).assign(signed);
151
+ });
152
+ });
153
+ };
154
+ If(level.greaterThanEqual(0), () => append(level, fade));
155
+ // The finer neighbour fading out with it.
156
+ If(finer.greaterThanEqual(0).and(fade.greaterThan(0)), () => append(finer, fade.negate()));
157
+ }
158
+ /** Hands each level's count to the indirect draws of its meshes (at most its list's slots), and clears the counts. */
159
+ function writeDraws(nodes) {
160
+ const r = rowOf(nodes);
161
+ const { listSize } = r;
162
+ Loop({ start: uint(0), end: r.drawCount, type: "uint", condition: "<" }, ({ i }) => {
163
+ const draw = nodes.draws.element(i).toVar();
164
+ const first = r.start(draw.x).toVar();
165
+ const base = i.mul(DRAW_BYTES / 4).toVar();
166
+ const words = nodes.args;
167
+ // Indexed: count, instances, first index, base vertex, first instance; else count, instances, first vertex, first
168
+ // instance and an unused word.
169
+ words.element(base).assign(draw.y);
170
+ const held = atomicLoad(nodes.counts.element(draw.x)).toVar();
171
+ words.element(base.add(1)).assign(held.lessThan(listSize).select(held, listSize));
172
+ words.element(base.add(2)).assign(draw.z);
173
+ words.element(base.add(3)).assign(draw.w.equal(1).select(uint(0), first));
174
+ words.element(base.add(4)).assign(draw.w.equal(1).select(first, uint(0)));
175
+ });
176
+ Loop({ start: uint(0), end: uint(MAX_LEVELS), type: "uint", condition: "<" }, ({ i }) => {
177
+ atomicStore(nodes.counts.element(i), uint(0));
178
+ });
179
+ }
180
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/instanced/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Box3, Sphere, type Object3D } from "three/webgpu";
2
+ /**
3
+ * The sphere fades measure for a Lod's levels: level 0's, or the first level's that draws
4
+ * anything when level 0 draws nothing; `own` in that level's own space, `placed` in its
5
+ * parent's (the Lod's). It is the centre and half diagonal of the level's `boundingBox`,
6
+ * which an impostor baked from it shares. `who` names the caller in the error.
7
+ */
8
+ export declare function measureLevels(levels: readonly {
9
+ object?: Object3D;
10
+ box?: Box3;
11
+ }[], who: string): {
12
+ own: Sphere;
13
+ placed: Sphere;
14
+ };
15
+ /** A level's bounds in the space of the Lod that holds it, including an eager object's transform. */
16
+ export declare function levelBox(level: {
17
+ object?: Object3D;
18
+ box?: Box3;
19
+ }): Box3;
20
+ /** Fill absent mesh bounds conservatively from a deferred level's declared box, without reading vertices. */
21
+ export declare function prepareBounds(root: Object3D, box: Box3): void;
@@ -0,0 +1,42 @@
1
+ import { Box3, Sphere, Vector3 } from "three/webgpu";
2
+ import { boundingBox, local } from "../source/detail.js";
3
+ import { isMesh } from "../three.js";
4
+ // Where a Lod's levels are: the bounds each declares or draws, measured from their full detail.
5
+ const sphereOf = (box) => (box.isEmpty() ? null : new Sphere(box.getCenter(new Vector3()), box.getSize(new Vector3()).length() / 2));
6
+ /**
7
+ * The sphere fades measure for a Lod's levels: level 0's, or the first level's that draws
8
+ * anything when level 0 draws nothing; `own` in that level's own space, `placed` in its
9
+ * parent's (the Lod's). It is the centre and half diagonal of the level's `boundingBox`,
10
+ * which an impostor baked from it shares. `who` names the caller in the error.
11
+ */
12
+ export function measureLevels(levels, who) {
13
+ for (const { object, box } of levels) {
14
+ const own = sphereOf(object ? boundingBox(object) : (box ?? new Box3()));
15
+ if (!own)
16
+ continue;
17
+ return { own, placed: object ? own.clone().applyMatrix4(local(object)) : own.clone() };
18
+ }
19
+ throw new Error(`${who}: no level has visible geometry to measure`);
20
+ }
21
+ /** A level's bounds in the space of the Lod that holds it, including an eager object's transform. */
22
+ export function levelBox(level) {
23
+ if (level.box)
24
+ return level.box.clone();
25
+ return level.object ? boundingBox(level.object).applyMatrix4(local(level.object)) : new Box3();
26
+ }
27
+ /** Fill absent mesh bounds conservatively from a deferred level's declared box, without reading vertices. */
28
+ export function prepareBounds(root, box) {
29
+ const visit = (node, placement) => {
30
+ if (isMesh(node)) {
31
+ if (placement.determinant() === 0)
32
+ throw new Error("Lod: mesh placement must be invertible");
33
+ const geometry = node.geometry;
34
+ geometry.boundingBox ??= box.clone().applyMatrix4(placement.clone().invert());
35
+ geometry.boundingSphere ??= geometry.boundingBox.getBoundingSphere(new Sphere());
36
+ }
37
+ for (const child of node.children)
38
+ visit(child, local(child).premultiply(placement));
39
+ };
40
+ visit(root, local(root));
41
+ }
42
+ //# sourceMappingURL=bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../src/levels/bounds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAA+B,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,gGAAgG;AAEhG,MAAM,QAAQ,GAAG,CAAC,GAAS,EAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAE1J;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoD,EAAE,GAAW;IAC7F,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,4CAA4C,CAAC,CAAC;AACtE,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,QAAQ,CAAC,KAAwC;IAC/D,IAAI,KAAK,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACjG,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,GAAS;IACrD,MAAM,KAAK,GAAG,CAAC,IAAc,EAAE,SAAkB,EAAQ,EAAE;QACzD,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,QAAQ,CAAC,WAAW,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,QAAQ,CAAC,cAAc,KAAK,QAAQ,CAAC,WAAW,CAAC,iBAAiB,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { type Camera, type Renderer, type Scene } from "three/webgpu";
2
+ import { type RenderContext, type ShadowMap } from "./compile/contexts.js";
3
+ /**
4
+ * The height `renderer` draws at now, which levels are chosen at: CSS pixels on the canvas, so that a high-density
5
+ * screen picks the levels a standard one does and pays for its extra pixels only in fill; pixels in a render target,
6
+ * except one the canvas's size, which stands in for it (a post-processing target); in a shadow pass, the map's texels.
7
+ */
8
+ export declare function drawingHeight(renderer: Renderer, shadow: boolean): number | null;
9
+ /**
10
+ * What a Lod's renders told of each camera that drew it: the height it draws at, where it rendered, and the shadow
11
+ * maps it drew. A context or shadow map whose target is disposed is passed over, so that no compile revives the target.
12
+ */
13
+ export declare class CameraRenders {
14
+ /** Per camera: a side table, as three's Camera has no place for a package's state; a camera let go is let go here. */
15
+ private readonly cameras;
16
+ /** The targets disposed since they were last drawn into. */
17
+ private readonly disposed;
18
+ /** One listener on each target drawn into, until it is disposed or `dispose` is called. */
19
+ private readonly listeners;
20
+ /**
21
+ * The height `camera` draws at, measured from `renderer` while it renders (see `drawingHeight`), else the last it
22
+ * drew at; before it drew, the canvas's.
23
+ */
24
+ heightOf(camera: Camera, renderer: Renderer, shadow: boolean): number;
25
+ /** Where `camera` last rendered a scene holding the Lod, into a target not disposed. */
26
+ contextOf(camera: Camera): RenderContext | undefined;
27
+ /**
28
+ * Whether `context` is still one its camera renders in: not one whose target was disposed, nor one evicted by the
29
+ * cap on contexts per camera.
30
+ */
31
+ holds(context: RenderContext): boolean;
32
+ /** The shadow maps `cameras` drew, into targets not disposed. */
33
+ shadowsOf(cameras: Iterable<Camera>): ShadowMap[];
34
+ /** Whether `camera`, a light's shadow camera, drew a shadow map whose target is not disposed. */
35
+ drawsShadowMap(camera: Camera): boolean;
36
+ /**
37
+ * Whether `target` was disposed since it was last drawn into: what draws into it compiles nothing. The output never
38
+ * is.
39
+ */
40
+ isDisposed(target: RenderContext["target"]): boolean;
41
+ /** Note what `renderer` rendering `scene` with `camera` tells: the camera's render context, or a shadow map. */
42
+ note(renderer: Renderer, scene: Scene, camera: Camera): void;
43
+ /** Stop listening to the targets drawn into. */
44
+ dispose(): void;
45
+ /** `target` is drawn into now: live again if it was disposed, and listened to for its disposal. */
46
+ private drawnInto;
47
+ private stateOf;
48
+ }
@@ -0,0 +1,122 @@
1
+ import { Vector2, Vector4 } from "three/webgpu";
2
+ import { at } from "../at.js";
3
+ import { busy } from "./renderer.js";
4
+ import { renderNow, sameContext } from "./compile/contexts.js";
5
+ // What renders tell a Lod of the cameras that draw it.
6
+ const viewport = new Vector4();
7
+ const canvas = new Vector2();
8
+ /**
9
+ * The height `renderer` draws at now, which levels are chosen at: CSS pixels on the canvas, so that a high-density
10
+ * screen picks the levels a standard one does and pays for its extra pixels only in fill; pixels in a render target,
11
+ * except one the canvas's size, which stands in for it (a post-processing target); in a shadow pass, the map's texels.
12
+ */
13
+ export function drawingHeight(renderer, shadow) {
14
+ const active = renderer.getRenderTarget();
15
+ if (shadow)
16
+ return active ? active.height : null;
17
+ if (!active)
18
+ return renderer.getViewport(viewport).w;
19
+ const ratio = active.height === renderer.getDrawingBufferSize(canvas).y ? renderer.getPixelRatio() : 1;
20
+ return active.viewport.w / ratio;
21
+ }
22
+ /** The render contexts kept per camera: those of a camera that draws several scenes or targets each frame. */
23
+ const CONTEXTS = 8;
24
+ /**
25
+ * What a Lod's renders told of each camera that drew it: the height it draws at, where it rendered, and the shadow
26
+ * maps it drew. A context or shadow map whose target is disposed is passed over, so that no compile revives the target.
27
+ */
28
+ export class CameraRenders {
29
+ /** Per camera: a side table, as three's Camera has no place for a package's state; a camera let go is let go here. */
30
+ cameras = new WeakMap();
31
+ /** The targets disposed since they were last drawn into. */
32
+ disposed = new WeakSet();
33
+ /** One listener on each target drawn into, until it is disposed or `dispose` is called. */
34
+ listeners = new Map();
35
+ /**
36
+ * The height `camera` draws at, measured from `renderer` while it renders (see `drawingHeight`), else the last it
37
+ * drew at; before it drew, the canvas's.
38
+ */
39
+ heightOf(camera, renderer, shadow) {
40
+ const height = busy(renderer) ? drawingHeight(renderer, shadow) : null;
41
+ if (height !== null)
42
+ this.stateOf(camera).height = height;
43
+ return this.cameras.get(camera)?.height ?? renderer.getSize(canvas).y;
44
+ }
45
+ /** Where `camera` last rendered a scene holding the Lod, into a target not disposed. */
46
+ contextOf(camera) {
47
+ return this.cameras.get(camera)?.contexts.find((context) => !this.isDisposed(context.target));
48
+ }
49
+ /**
50
+ * Whether `context` is still one its camera renders in: not one whose target was disposed, nor one evicted by the
51
+ * cap on contexts per camera.
52
+ */
53
+ holds(context) {
54
+ return !this.isDisposed(context.target) && (this.cameras.get(context.camera)?.contexts.includes(context) ?? false);
55
+ }
56
+ /** The shadow maps `cameras` drew, into targets not disposed. */
57
+ shadowsOf(cameras) {
58
+ return [...cameras].flatMap((camera) => this.cameras.get(camera)?.shadows ?? []).filter((map) => !this.isDisposed(map.target));
59
+ }
60
+ /** Whether `camera`, a light's shadow camera, drew a shadow map whose target is not disposed. */
61
+ drawsShadowMap(camera) {
62
+ return this.cameras.get(camera)?.shadows.some((map) => !this.isDisposed(map.target)) ?? false;
63
+ }
64
+ /**
65
+ * Whether `target` was disposed since it was last drawn into: what draws into it compiles nothing. The output never
66
+ * is.
67
+ */
68
+ isDisposed(target) {
69
+ return target !== null && this.disposed.has(target);
70
+ }
71
+ /** Note what `renderer` rendering `scene` with `camera` tells: the camera's render context, or a shadow map. */
72
+ note(renderer, scene, camera) {
73
+ const now = renderNow(renderer, scene, camera);
74
+ if (!now)
75
+ return;
76
+ const state = this.stateOf(camera);
77
+ if ("shadow" in now) {
78
+ const { shadow } = now;
79
+ this.drawnInto(shadow.target);
80
+ const index = state.shadows.findIndex((map) => map.target === shadow.target);
81
+ if (index >= 0)
82
+ state.shadows[index] = shadow;
83
+ else
84
+ state.shadows.push(shadow);
85
+ return;
86
+ }
87
+ const { contexts } = state;
88
+ const { target } = now.context;
89
+ if (target)
90
+ this.drawnInto(target);
91
+ const index = contexts.findIndex((context) => sameContext(context, now.context));
92
+ contexts.unshift(index >= 0 ? at(contexts.splice(index, 1), 0) : now.context);
93
+ if (contexts.length > CONTEXTS)
94
+ contexts.pop();
95
+ }
96
+ /** Stop listening to the targets drawn into. */
97
+ dispose() {
98
+ for (const [target, listener] of this.listeners)
99
+ target.removeEventListener("dispose", listener);
100
+ this.listeners.clear();
101
+ }
102
+ /** `target` is drawn into now: live again if it was disposed, and listened to for its disposal. */
103
+ drawnInto(target) {
104
+ this.disposed.delete(target);
105
+ if (this.listeners.has(target))
106
+ return;
107
+ const listener = () => {
108
+ this.disposed.add(target);
109
+ target.removeEventListener("dispose", listener);
110
+ this.listeners.delete(target);
111
+ };
112
+ this.listeners.set(target, listener);
113
+ target.addEventListener("dispose", listener);
114
+ }
115
+ stateOf(camera) {
116
+ let state = this.cameras.get(camera);
117
+ if (!state)
118
+ this.cameras.set(camera, (state = { height: null, contexts: [], shadows: [] }));
119
+ return state;
120
+ }
121
+ }
122
+ //# sourceMappingURL=cameras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameras.js","sourceRoot":"","sources":["../../src/levels/cameras.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { Camera, Material, Renderer, Scene } from "three/webgpu";
2
+ export interface RenderContext {
3
+ camera: Camera;
4
+ scene: Scene;
5
+ /** The target the render was asked for: null for the output, also while three draws it through its output pass. */
6
+ target: ReturnType<Renderer["getRenderTarget"]>;
7
+ mrt: Parameters<Renderer["setMRT"]>[0];
8
+ cubeFace: number;
9
+ mipLevel: number;
10
+ /** How deep in renders it drew (see `callDepth`). */
11
+ depth: number;
12
+ }
13
+ /** A render target a camera or shadow map draws into. */
14
+ export type Target = NonNullable<RenderContext["target"]>;
15
+ /** A shadow map rendered for a scene, with the camera and override material three drew it with. */
16
+ export interface ShadowMap {
17
+ camera: Camera;
18
+ scene: Scene;
19
+ target: Target;
20
+ overrideMaterial: Material;
21
+ depth: number;
22
+ }
23
+ /** What `renderer` rendering `scene` with `camera` is now: a camera's render context, or a shadow map. */
24
+ export declare function renderNow(renderer: Renderer, scene: Scene, camera: Camera): {
25
+ context: RenderContext;
26
+ } | {
27
+ shadow: ShadowMap;
28
+ } | null;
29
+ /** Whether `a` and `b` describe the same render: what was compiled for one is compiled for the other. */
30
+ export declare const sameContext: (a: RenderContext, b: RenderContext) => boolean;
@@ -0,0 +1,18 @@
1
+ import { callDepth, inShadowMap, isOutputPass } from "../renderer.js";
2
+ /** What `renderer` rendering `scene` with `camera` is now: a camera's render context, or a shadow map. */
3
+ export function renderNow(renderer, scene, camera) {
4
+ const active = renderer.getRenderTarget();
5
+ // A compile, outside renders, prepares draws at depth 0.
6
+ const depth = Math.max(callDepth(renderer), 0);
7
+ if (inShadowMap(scene)) {
8
+ const material = scene.overrideMaterial;
9
+ return active && material ? { shadow: { camera, scene, target: active, overrideMaterial: material, depth } } : null;
10
+ }
11
+ const target = isOutputPass(active) ? null : active;
12
+ const cubeFace = renderer.getActiveCubeFace();
13
+ const mipLevel = renderer.getActiveMipmapLevel();
14
+ return { context: { camera, scene, target, mrt: renderer.getMRT(), cubeFace, mipLevel, depth } };
15
+ }
16
+ /** Whether `a` and `b` describe the same render: what was compiled for one is compiled for the other. */
17
+ export const sameContext = (a, b) => a.scene === b.scene && a.target === b.target && a.mrt === b.mrt && a.cubeFace === b.cubeFace && a.mipLevel === b.mipLevel && a.depth === b.depth;
18
+ //# sourceMappingURL=contexts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexts.js","sourceRoot":"","sources":["../../../src/levels/compile/contexts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA4BtE,0GAA0G;AAC1G,MAAM,UAAU,SAAS,CAAC,QAAkB,EAAE,KAAY,EAAE,MAAc;IACxE,MAAM,MAAM,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IAC1C,yDAAyD;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC;QACxC,OAAO,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACtH,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,oBAAoB,EAAE,CAAC;IACjD,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;AACnG,CAAC;AAED,yGAAyG;AACzG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAE,CAAgB,EAAW,EAAE,CACzE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Object3D, Renderer } from "three/webgpu";
2
+ import type { RenderContext, ShadowMap, Target } from "./contexts.js";
3
+ /** What a compile is for besides its context: shadow maps, and which targets were disposed. */
4
+ export interface CompileFor {
5
+ /** The shadow maps the scene's level meshes draw into: each mesh that casts compiles for them too. */
6
+ shadows: readonly ShadowMap[];
7
+ /** Whether `target` was disposed: no draw compiles for it, as that would make its textures again. */
8
+ isDisposed(target: Target): boolean;
9
+ }
10
+ /** What `renderer` prepares levels with: one Compiler per renderer, made the first time a level compiles for it. */
11
+ export declare function compilerOf(renderer: Renderer): Compiler;
12
+ /**
13
+ * What a renderer prepares for the levels arriving: the levels share its queue's budget and its pipeline cache, which
14
+ * it shares the readiness of (see `sharePipelines`).
15
+ */
16
+ export declare class Compiler {
17
+ private readonly renderer;
18
+ /** Uploaded since the last frame. */
19
+ private uploaded;
20
+ /** The last upload: uploads run in turn. */
21
+ private uploads;
22
+ /**
23
+ * The last draw compiled for each shader build: material, attributes, target, shadow map and nesting. three starts a
24
+ * build for each draw that misses its cache, even one another draw is building, so a draw that builds alike waits
25
+ * for the last one and finds its build cached.
26
+ */
27
+ private readonly builds;
28
+ constructor(renderer: Renderer);
29
+ /**
30
+ * Prepare the same target and MRT as the camera's draw, even if normal rendering has since restored the canvas, and
31
+ * the shadow maps of `compileFor`, for each mesh that casts. r186 uploads a texture synchronously inside initTexture,
32
+ * and creates a pipeline it meets while rendering synchronously, so each texture and draw is prepared here first.
33
+ * Textures upload paced across frames (see `paced`); every draw then compiles at once, as do the draws of every
34
+ * other level the renderer prepares, so their pipelines are created side by side.
35
+ */
36
+ compileAsync(object: Object3D, context: RenderContext, { shadows, isDisposed }: CompileFor): Promise<void>;
37
+ /** Run `upload`, which answers the bytes it uploaded, after the next frame if those since the last one reached `FRAME_UPLOAD`. */
38
+ private paced;
39
+ /** Compile the draw of `mesh`'s groups `part` for `target`. */
40
+ private compileDraw;
41
+ }