@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
package/README.md CHANGED
@@ -5,21 +5,20 @@ Level of detail for Three.js. Build simplified meshes, baked low-poly meshes, an
5
5
  Requires Three.js `WebGPURenderer` (`three/webgpu`).
6
6
 
7
7
  ```sh
8
- npm install @drawcall/lod three
8
+ npm install @drawcall/lod three typegpu
9
9
  ```
10
10
 
11
- Load a model into an existing Three.js scene. With a warm cache, the coarse level draws first and finer levels load as the camera approaches:
11
+ Load a model into an existing Three.js scene. Each level loads once the camera needs it, finer ones as the camera approaches. A `Lod` is driven like an `InstancedMesh`: `new Lod(levels)` is one object, `new Lod(levels, count)` draws `count` copies placed with `setMatrixAt`. It draws with the first renderer that renders it:
12
12
 
13
13
  ```ts
14
- import { Lod, LodLoader } from "@drawcall/lod";
14
+ import { CachedLodLoader, Lod } from "@drawcall/lod";
15
15
 
16
- const loader = new LodLoader();
17
- const levels = await loader.loadAsync("/models/tree.glb");
16
+ const levels = await new CachedLodLoader().loadAsync("/models/tree.glb");
18
17
  scene.add(new Lod(levels));
19
18
  ```
20
19
 
21
- Add the [vitecache](https://github.com/drawcall-ai/vitecache) Vite plugin to the host. Loading each asset in the dev server writes its levels as cache files; `vite build` does not generate them, so deploy the cache directory with the app. For procedural assets, register a GLTSLoader on the loading manager and pass a `.glts` URL; the LOD skill below covers caching their expensive generation.
20
+ Add the [vitecache](https://github.com/drawcall-ai/vitecache) Vite plugin to the host. It finds every load in the app's source and builds its levels in Node, during development and `vite build`, so pages read them instead of building them. For procedural assets, pass a `.glts` URL and register a GLTSLoader on the page's loading manager. A `.glts` script can add a `Lod` to its own scene, so that every glts host, instancing it with `loadInstancesAsync`, draws its levels.
22
21
 
23
22
  Choose derived levels to suit your assets. The [LOD skill](https://github.com/drawcall-ai/lod/blob/main/packages/lod/skills/lod/SKILL.md) covers asset choices, caching, lazy loading, wind, and scene integration. It also ships with the package at `skills/lod/SKILL.md`.
24
23
 
25
- The [city example](https://github.com/drawcall-ai/lod/tree/main/examples/city) demonstrates a large scene with buildings, vegetation, and small props.
24
+ The [city example](https://github.com/drawcall-ai/lod/tree/main/examples/city) demonstrates a large scene with buildings, vegetation, and small props, its ground cover scattered around the camera by a compute pass of its own.
package/dist/bake.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ import { WebGPURenderer, type Object3D, type RenderTarget, type Renderer } from "three/webgpu";
2
+ /**
3
+ * A renderer for bakes, initialised: it clears to transparent black, only when a bake clears, and its canvas is never
4
+ * shown or sized. Pass it to `bakeImpostor`, or to `bakeMesh` with an interior, and dispose it when done. CachedLodLoader
5
+ * makes one for itself; so does a .glts script that bakes.
6
+ */
7
+ export declare function createBakeRenderer(): Promise<WebGPURenderer>;
8
+ /** `renderer`, made without antialiasing, set up and initialised as `createBakeRenderer` sets one up. */
9
+ export declare function setUpBakeRenderer(renderer: WebGPURenderer): Promise<WebGPURenderer>;
10
+ /**
11
+ * Throw unless `renderer` draws bakes as `createBakeRenderer` sets one up: initialised, clearing to transparent black
12
+ * and only when told to, with no MRT or XR camera of its own. A bake draws through every such setting; `who` names it.
13
+ */
14
+ export declare function checkBakeRenderer(renderer: Renderer, who: string): void;
15
+ /** A copy of what a bake draws, and what frees it once drawn. */
16
+ export interface BakeCopy {
17
+ readonly root: Object3D;
18
+ /** Free what the copy made: its InstancedMeshes' buffers and every Lod's draw state. */
19
+ dispose(): void;
20
+ }
21
+ /**
22
+ * A fresh copy of `root` to bake, each Lod in it drawn as plain InstancedMeshes of its level 0 at every instance it
23
+ * draws, that level loaded first where it is deferred: a Lod draws with the renderer that first drew it, the app's, and
24
+ * nothing in its first frame. The CPU reads the instances, so a Lod with a storage attribute is refused.
25
+ */
26
+ export declare function bakeCopy(root: Object3D): Promise<BakeCopy>;
27
+ /** Run `bake` on `renderer` once every bake queued on it before has settled. */
28
+ export declare function inTurn<T>(renderer: Renderer, bake: () => Promise<T>): Promise<T>;
29
+ /**
30
+ * Texture `index` of `target` as floats, four channels a texel, rows packed and bottom
31
+ * row first: the layout the bakes write their images in. For float and half-float
32
+ * targets.
33
+ */
34
+ export declare function readFloats(renderer: Renderer, target: RenderTarget, index: number): Promise<Float32Array>;
35
+ /** Texture `index` of an 8-bit `target`, laid out as `readFloats` lays it out. */
36
+ export declare function readBytes(renderer: Renderer, target: RenderTarget, index: number): Promise<Uint8Array>;
package/dist/bake.js ADDED
@@ -0,0 +1,176 @@
1
+ import { Color, DataUtils, Group, InstancedMesh, Matrix4, WebGPURenderer } from "three/webgpu";
2
+ import { disposeCopies } from "./dispose.js";
3
+ import { clone } from "three/addons/utils/SkeletonUtils.js";
4
+ import { at } from "./at.js";
5
+ import { instancesOf } from "./source/detail.js";
6
+ import { isLod, isMesh, isStorageInstanced } from "./three.js";
7
+ // What the GPU bakes (impostor frames, interior rooms) share: the renderer they draw with, one bake at a time on it,
8
+ // and reading back what they drew.
9
+ /**
10
+ * A renderer for bakes, initialised: it clears to transparent black, only when a bake clears, and its canvas is never
11
+ * shown or sized. Pass it to `bakeImpostor`, or to `bakeMesh` with an interior, and dispose it when done. CachedLodLoader
12
+ * makes one for itself; so does a .glts script that bakes.
13
+ */
14
+ export function createBakeRenderer() {
15
+ return setUpBakeRenderer(new WebGPURenderer({ antialias: false }));
16
+ }
17
+ /** `renderer`, made without antialiasing, set up and initialised as `createBakeRenderer` sets one up. */
18
+ export async function setUpBakeRenderer(renderer) {
19
+ renderer.setClearColor(0x000000, 0);
20
+ renderer.autoClear = false;
21
+ await renderer.init();
22
+ return renderer;
23
+ }
24
+ /**
25
+ * Throw unless `renderer` draws bakes as `createBakeRenderer` sets one up: initialised, clearing to transparent black
26
+ * and only when told to, with no MRT or XR camera of its own. A bake draws through every such setting; `who` names it.
27
+ */
28
+ export function checkBakeRenderer(renderer, who) {
29
+ const fail = (why) => {
30
+ throw new Error(`${who}: the renderer ${why}; make one for bakes with createBakeRenderer`);
31
+ };
32
+ if (!renderer.initialized)
33
+ fail("is not initialised (await renderer.init())");
34
+ if (!renderer.getClearColor(new Color()).equals(BLACK) || renderer.getClearAlpha() !== 0)
35
+ fail("must clear to transparent black");
36
+ if (renderer.autoClear)
37
+ fail("must not clear on its own (autoClear)");
38
+ if (renderer.getMRT() !== null)
39
+ fail("has an MRT set");
40
+ if (renderer.xr.isPresenting)
41
+ fail("is presenting XR");
42
+ }
43
+ const BLACK = new Color(0x000000);
44
+ /**
45
+ * A fresh copy of `root` to bake, each Lod in it drawn as plain InstancedMeshes of its level 0 at every instance it
46
+ * draws, that level loaded first where it is deferred: a Lod draws with the renderer that first drew it, the app's, and
47
+ * nothing in its first frame. The CPU reads the instances, so a Lod with a storage attribute is refused.
48
+ */
49
+ export async function bakeCopy(root) {
50
+ root.traverse((node) => {
51
+ if (isLod(node) && [node.instanceMatrix, node.instanceColor].some((attribute) => attribute && isStorageInstanced(attribute)))
52
+ throw new Error(`@drawcall/lod: a bake reads a Lod's instances on the CPU, but "${node.name}" has a storage instanceMatrix or instanceColor`);
53
+ });
54
+ let copy = clone(root);
55
+ const lods = [];
56
+ copy.traverse((node) => {
57
+ if (isLod(node))
58
+ lods.push(node);
59
+ });
60
+ try {
61
+ const sources = await Promise.all(lods.map(levelZeroOf));
62
+ lods.forEach((lod, i) => {
63
+ const drawn = levelZero(lod, at(sources, i));
64
+ // Only the root has no parent here.
65
+ const { parent } = lod;
66
+ if (parent)
67
+ parent.add(drawn);
68
+ else
69
+ copy = drawn;
70
+ lod.removeFromParent();
71
+ });
72
+ }
73
+ finally {
74
+ for (const lod of lods)
75
+ lod.dispose();
76
+ }
77
+ return { root: copy, dispose: () => disposeCopies(copy) };
78
+ }
79
+ /** `lod`'s level 0 object: its own once there is one, else what the level's load makes. */
80
+ async function levelZeroOf(lod) {
81
+ const level = at(lod.levels, 0);
82
+ if (level.object)
83
+ return level.object;
84
+ if (!level.load)
85
+ throw new Error(`@drawcall/lod: level 0 of the Lod "${lod.name}" has neither an object nor a load`);
86
+ return level.load();
87
+ }
88
+ /**
89
+ * `source`, `lod`'s level 0, as a Group in the Lod's place, an InstancedMesh per visible mesh of it drawing it at every
90
+ * instance the Lod draws (see `instancesOf`), coloured as the instances are.
91
+ */
92
+ function levelZero(lod, source) {
93
+ const group = new Group();
94
+ group.name = lod.name;
95
+ group.position.copy(lod.position);
96
+ group.quaternion.copy(lod.quaternion);
97
+ group.scale.copy(lod.scale);
98
+ group.matrixAutoUpdate = lod.matrixAutoUpdate;
99
+ group.matrix.copy(lod.matrix);
100
+ group.visible = lod.visible;
101
+ group.layers.mask = lod.layers.mask;
102
+ source.updateWorldMatrix(true, true);
103
+ const outside = source.parent ? source.parent.matrixWorld.clone().invert() : new Matrix4();
104
+ const instance = new Matrix4();
105
+ const color = new Color();
106
+ source.traverseVisible((node) => {
107
+ if (!isMesh(node))
108
+ return;
109
+ const placement = outside.clone().multiply(node.matrixWorld);
110
+ const drawn = [...instancesOf(lod)];
111
+ const mesh = new InstancedMesh(node.geometry, node.material, drawn.length);
112
+ drawn.forEach((index, i) => {
113
+ mesh.setMatrixAt(i, lod.getMatrixAt(index, instance).multiply(placement));
114
+ if (lod.instanceColor)
115
+ mesh.setColorAt(i, lod.getColorAt(index, color));
116
+ });
117
+ mesh.name = node.name;
118
+ mesh.castShadow = node.castShadow;
119
+ mesh.receiveShadow = node.receiveShadow;
120
+ group.add(mesh);
121
+ });
122
+ return group;
123
+ }
124
+ /**
125
+ * The bake under way on each renderer and those queued after it. Bakes run one at a time on a renderer: each holds one
126
+ * target's renders in flight, and a scene's bakes all at once queued GPU work seconds deep (macOS ends a device whose
127
+ * work holds the display up). A side table, as the renderers are the caller's.
128
+ */
129
+ const queues = new WeakMap();
130
+ /** Run `bake` on `renderer` once every bake queued on it before has settled. */
131
+ export function inTurn(renderer, bake) {
132
+ const next = (queues.get(renderer) ?? Promise.resolve()).then(bake);
133
+ // The queue goes on past a failed bake; its caller has the failure.
134
+ queues.set(renderer, next.catch(() => { }));
135
+ return next;
136
+ }
137
+ /**
138
+ * Texture `index` of `target` as floats, four channels a texel, rows packed and bottom
139
+ * row first: the layout the bakes write their images in. For float and half-float
140
+ * targets.
141
+ */
142
+ export async function readFloats(renderer, target, index) {
143
+ const read = await renderer.readRenderTargetPixelsAsync(target, 0, 0, target.width, target.height, index);
144
+ if (read instanceof Float32Array)
145
+ return packed(read, target, (n) => new Float32Array(n));
146
+ // Half floats come back as their bits.
147
+ if (read instanceof Uint16Array)
148
+ return fromHalves(packed(read, target, (n) => new Uint16Array(n)));
149
+ throw new Error(`@drawcall/lod: read ${read.constructor.name} from a float render target`);
150
+ }
151
+ /** Texture `index` of an 8-bit `target`, laid out as `readFloats` lays it out. */
152
+ export async function readBytes(renderer, target, index) {
153
+ const read = await renderer.readRenderTargetPixelsAsync(target, 0, 0, target.width, target.height, index);
154
+ if (!(read instanceof Uint8Array))
155
+ throw new Error(`@drawcall/lod: read ${read.constructor.name} from an 8-bit render target`);
156
+ return packed(read, target, (n) => new Uint8Array(n));
157
+ }
158
+ /** Every half float by its bits: an immutable table, made once. */
159
+ const HALF = Float32Array.from({ length: 65536 }, (_, bits) => DataUtils.fromHalfFloat(bits));
160
+ function fromHalves(bits) {
161
+ const out = new Float32Array(bits.length);
162
+ // Typed-array reads below are in bounds; `?? 0` only answers noUncheckedIndexedAccess.
163
+ for (let i = 0; i < bits.length; i++)
164
+ out[i] = HALF[bits[i] ?? 0] ?? 0;
165
+ return out;
166
+ }
167
+ /** `read`'s rows, each padded to 256 bytes and top first, packed and bottom first. */
168
+ function packed(read, { width, height }, make) {
169
+ const row = width * 4;
170
+ const stride = (Math.ceil((row * read.BYTES_PER_ELEMENT) / 256) * 256) / read.BYTES_PER_ELEMENT;
171
+ const out = make(row * height);
172
+ for (let y = 0; y < height; y++)
173
+ out.set(read.subarray(y * stride, y * stride + row), (height - 1 - y) * row);
174
+ return out;
175
+ }
176
+ //# sourceMappingURL=bake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bake.js","sourceRoot":"","sources":["../src/bake.ts"],"names":[],"mappings":"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"}
@@ -3,11 +3,8 @@ import { Mesh } from "three/webgpu";
3
3
  * Encode an unmodified `bakeMesh` result, before adding it to a Lod or changing its
4
4
  * materials. This is a baked-result format, not an Object3D/NodeMaterial serializer.
5
5
  * Geometry, map bytes (including cutout mips), rooms, placement and LOD deviation survive
6
- * exactly. Decoding owns fresh resources; the input mesh remains owned by its caller.
7
- */
8
- export declare function encodeBakedMesh(mesh: Mesh): Uint8Array;
9
- /**
10
- * Decode `encodeBakedMesh` bytes into an independently owned mesh, ready for a Lod. Large
11
- * entries inflate in fflate workers.
6
+ * exactly. Decoding makes fresh resources; the input mesh stays its caller's.
12
7
  */
8
+ export declare function encodeBakedMeshAsync(mesh: Mesh): Promise<Uint8Array>;
9
+ /** Decode `encodeBakedMeshAsync` bytes into an independently owned mesh, ready for a Lod. */
13
10
  export declare function decodeBakedMeshAsync(bytes: Uint8Array): Promise<Mesh>;
@@ -1,34 +1,16 @@
1
- import { strFromU8, strToU8, unzip, zipSync } from "fflate";
2
- import { Box3, BufferAttribute, BufferGeometry, ClampToEdgeWrapping, DataArrayTexture, DataTexture, DoubleSide, FrontSide, LinearFilter, LinearMipmapLinearFilter, Mesh, MeshStandardNodeMaterial, NoColorSpace, RGBAFormat, RGFormat, SRGBColorSpace, UnsignedByteType, UVMapping, Vector3, } from "three/webgpu";
3
- import { deviationOf, recordDeviation } from "../levels.js";
4
- import { InteriorMaterial } from "./interior/material.js";
5
- function fail(why) {
6
- throw new Error(`Invalid baked mesh: ${why}`);
7
- }
8
- const object = (value) => {
9
- if (typeof value !== "object" || value === null || Array.isArray(value))
10
- fail("expected metadata object");
11
- return Object.fromEntries(Object.entries(value));
12
- };
13
- const number = (value) => (typeof value === "number" && Number.isFinite(value) ? value : fail("expected finite number"));
14
- const integer = (value) => {
15
- const result = number(value);
16
- return Number.isSafeInteger(result) && result > 0 ? result : fail("expected positive integer");
17
- };
18
- const boolean = (value) => (typeof value === "boolean" ? value : fail("expected boolean"));
19
- const numbers = (value, count) => {
20
- if (!Array.isArray(value) || value.length !== count)
21
- fail(`expected ${count} numbers`);
22
- return value.map(number);
23
- };
24
- const file = (files, name) => files[name] ?? fail(`missing ${name}`);
1
+ import { Box3, BufferAttribute, BufferGeometry, DoubleSide, FrontSide, Mesh, MeshStandardNodeMaterial, Sphere, Vector3 } from "three/webgpu";
2
+ import { pack, unpack } from "../codec/container.js";
3
+ import { deviationOf, recordDeviation } from "../levels/index.js";
4
+ import { boolean, fail, file, number, numbers, object } from "./fields.js";
5
+ import { InteriorMappingMaterial } from "./interior/material.js";
6
+ import { readTexture, writeTexture } from "./textures.js";
25
7
  /**
26
8
  * Encode an unmodified `bakeMesh` result, before adding it to a Lod or changing its
27
9
  * materials. This is a baked-result format, not an Object3D/NodeMaterial serializer.
28
10
  * Geometry, map bytes (including cutout mips), rooms, placement and LOD deviation survive
29
- * exactly. Decoding owns fresh resources; the input mesh remains owned by its caller.
11
+ * exactly. Decoding makes fresh resources; the input mesh stays its caller's.
30
12
  */
31
- export function encodeBakedMesh(mesh) {
13
+ export async function encodeBakedMeshAsync(mesh) {
32
14
  const deviation = deviationOf(mesh);
33
15
  const { geometry, material } = mesh;
34
16
  if (deviation === undefined || !(deviation >= 0) || !Number.isFinite(deviation))
@@ -44,16 +26,17 @@ export function encodeBakedMesh(mesh) {
44
26
  geometry.drawRange.count !== Infinity)
45
27
  fail("modified baked geometry");
46
28
  if (!(material instanceof MeshStandardNodeMaterial) ||
47
- (Object.getPrototypeOf(material) !== MeshStandardNodeMaterial.prototype && Object.getPrototypeOf(material) !== InteriorMaterial.prototype))
29
+ (Object.getPrototypeOf(material) !== MeshStandardNodeMaterial.prototype && Object.getPrototypeOf(material) !== InteriorMappingMaterial.prototype))
48
30
  fail("unsupported material");
49
31
  const standard = new MeshStandardNodeMaterial();
50
32
  // Only the maps, side and alphaTest differ from a default baked material. Refuse
51
33
  // shader hooks and material changes rather than silently dropping them from a cache.
34
+ // Keys starting with "_" are three's own state behind accessors (alphaTest's) and
35
+ // listeners, which the accessors and the checks below cover.
52
36
  const allowed = new Set([
53
37
  "uuid",
54
38
  "id",
55
39
  "version",
56
- "_listeners",
57
40
  "map",
58
41
  "normalMap",
59
42
  "aoMap",
@@ -61,15 +44,13 @@ export function encodeBakedMesh(mesh) {
61
44
  "metalnessMap",
62
45
  "roughness",
63
46
  "metalness",
64
- "alphaTest",
65
- "_alphaTest",
66
47
  "side",
67
48
  "rooms",
68
49
  "bounds",
69
50
  "isInteriorMaterial",
70
51
  ]);
71
52
  for (const [key, value] of Object.entries(material)) {
72
- if (allowed.has(key))
53
+ if (key.startsWith("_") || allowed.has(key))
73
54
  continue;
74
55
  const expected = Reflect.get(standard, key);
75
56
  if (typeof value === "function" ? value !== expected : JSON.stringify(value) !== JSON.stringify(expected))
@@ -99,10 +80,16 @@ export function encodeBakedMesh(mesh) {
99
80
  if (!index || !(index.array instanceof Uint32Array) || index.itemSize !== 1)
100
81
  fail("expected Uint32 indices");
101
82
  files.index = new Uint8Array(index.array.buffer, index.array.byteOffset, index.array.byteLength);
102
- const rooms = material instanceof InteriorMaterial ? (material.rooms ?? fail("unfurnished interior")) : null;
83
+ const rooms = material instanceof InteriorMappingMaterial ? (material.rooms ?? fail("unfurnished interior")) : null;
84
+ geometry.computeBoundingBox();
85
+ geometry.computeBoundingSphere();
86
+ const { boundingBox: box, boundingSphere: sphere } = geometry;
87
+ if (!box || !sphere)
88
+ fail("missing bounds");
103
89
  const meta = {
104
- version: 2,
90
+ version: 4,
105
91
  name: mesh.name,
92
+ bounds: [...box.min.toArray(), ...box.max.toArray(), ...sphere.center.toArray(), sphere.radius],
106
93
  deviation,
107
94
  position: mesh.position.toArray(),
108
95
  quaternion: mesh.quaternion.toArray(),
@@ -122,44 +109,39 @@ export function encodeBakedMesh(mesh) {
122
109
  glow: rooms.glow && writeTexture(files, "glow", rooms.glow),
123
110
  },
124
111
  };
125
- files.meta = strToU8(JSON.stringify(meta));
126
- return zipSync(files, { level: 6 });
112
+ return pack({ ...meta, files: Object.keys(files) }, Object.values(files));
127
113
  }
128
- /**
129
- * Decode `encodeBakedMesh` bytes into an independently owned mesh, ready for a Lod. Large
130
- * entries inflate in fflate workers.
131
- */
114
+ /** Decode `encodeBakedMeshAsync` bytes into an independently owned mesh, ready for a Lod. */
132
115
  export async function decodeBakedMeshAsync(bytes) {
133
- const files = await new Promise((resolve, reject) => unzip(bytes, (error, files) => (error ? reject(error) : resolve(files))));
134
- return fromFiles(files);
135
- }
136
- function fromFiles(files) {
137
- const parsed = JSON.parse(strFromU8(file(files, "meta")));
138
- const meta = object(parsed);
139
- if (meta.version !== 2)
140
- fail("unsupported version");
116
+ const contents = await unpack(bytes, fail);
117
+ const meta = object(contents.header);
118
+ if (meta.version !== 4)
119
+ fail("unsupported version; bake it again");
120
+ const names = meta.files;
121
+ if (!Array.isArray(names) || names.length !== contents.files.length)
122
+ fail("file names do not match the files");
123
+ const files = Object.fromEntries(names.map((name, i) => [typeof name === "string" ? name : fail("invalid file name"), contents.files[i] ?? fail("missing file")]));
141
124
  if (typeof meta.name !== "string")
142
125
  fail("missing name");
143
126
  const deviation = number(meta.deviation);
144
127
  if (deviation < 0)
145
128
  fail("negative LOD deviation");
146
- const position = floats(file(files, "position"));
147
- const normal = floats(file(files, "normal"));
148
- const uv = floats(file(files, "uv"));
149
- const indices = file(files, "index");
150
- if (!position.length || position.length % 3 || normal.length !== position.length || uv.length * 3 !== position.length * 2 || indices.byteLength % 12)
129
+ // The container's CRC rejects corrupt bytes, so lengths are checked but values are not walked.
130
+ const position = typedArray(file(files, "position"), Float32Array);
131
+ const normal = typedArray(file(files, "normal"), Float32Array);
132
+ const uv = typedArray(file(files, "uv"), Float32Array);
133
+ const index = typedArray(file(files, "index"), Uint32Array);
134
+ if (!position.length || position.length % 3 || normal.length !== position.length || uv.length * 3 !== position.length * 2 || index.length % 3)
151
135
  fail("invalid geometry lengths");
152
- const index = new Uint32Array(indices.slice().buffer);
153
- if (index.some((i) => i >= position.length / 3))
154
- fail("index outside geometry");
136
+ const bounds = numbers(meta.bounds, 10);
155
137
  const side = meta.side === FrontSide ? FrontSide : meta.side === DoubleSide ? DoubleSide : fail("unsupported side");
156
138
  const alphaTest = meta.alphaTest === 0 ? 0 : meta.alphaTest === 0.5 ? 0.5 : fail("unsupported alpha test");
157
139
  const map = readTexture(files, "map", meta.map, false);
158
140
  const normalMap = readTexture(files, "normal", meta.normal, false);
159
141
  const orm = readTexture(files, "orm", meta.orm, false);
160
- const material = meta.rooms === null ? new MeshStandardNodeMaterial() : new InteriorMaterial();
142
+ const material = meta.rooms === null ? new MeshStandardNodeMaterial() : new InteriorMappingMaterial();
161
143
  material.setValues({ map, normalMap, aoMap: orm, roughnessMap: orm, metalnessMap: orm, roughness: 1, metalness: 1, side, alphaTest });
162
- if (material instanceof InteriorMaterial) {
144
+ if (material instanceof InteriorMappingMaterial) {
163
145
  const rooms = object(meta.rooms);
164
146
  if (!Array.isArray(rooms.boxes) || !rooms.boxes.length)
165
147
  fail("missing room boxes");
@@ -185,8 +167,8 @@ function fromFiles(files) {
185
167
  geometry.setAttribute("normal", new BufferAttribute(normal, 3));
186
168
  geometry.setAttribute("uv", new BufferAttribute(uv, 2));
187
169
  geometry.setIndex(new BufferAttribute(index, 1));
188
- geometry.computeBoundingBox();
189
- geometry.computeBoundingSphere();
170
+ geometry.boundingBox = new Box3().setFromArray(bounds.slice(0, 6));
171
+ geometry.boundingSphere = new Sphere(new Vector3().fromArray(bounds, 6), bounds[9]);
190
172
  const mesh = new Mesh(geometry, material);
191
173
  mesh.name = meta.name;
192
174
  mesh.position.fromArray(numbers(meta.position, 3));
@@ -197,101 +179,13 @@ function fromFiles(files) {
197
179
  recordDeviation(mesh, deviation);
198
180
  return mesh;
199
181
  }
200
- function floats(bytes) {
182
+ /** `bytes` as 32-bit values, in place: the container aligns its files. */
183
+ function typedArray(bytes, Type) {
201
184
  if (bytes.byteLength % 4)
202
- fail("invalid float data length");
203
- const values = new Float32Array(bytes.slice().buffer);
204
- if (values.some((value) => !Number.isFinite(value)))
205
- fail("non-finite geometry");
206
- return values;
207
- }
208
- function writeTexture(files, name, texture) {
209
- if (!(texture instanceof DataTexture) && !(texture instanceof DataArrayTexture))
210
- fail(`missing ${name} data texture`);
211
- const image = texture.image;
212
- const base = object(image);
213
- const width = integer(base.width), height = integer(base.height);
214
- const depth = texture instanceof DataArrayTexture ? integer(base.depth) : 1;
215
- if (texture.type !== UnsignedByteType ||
216
- (texture.format !== RGBAFormat && texture.format !== RGFormat) ||
217
- texture.minFilter !== LinearMipmapLinearFilter ||
218
- texture.magFilter !== LinearFilter ||
219
- texture.wrapS !== ClampToEdgeWrapping ||
220
- texture.wrapT !== ClampToEdgeWrapping ||
221
- texture.flipY ||
222
- texture.premultiplyAlpha ||
223
- texture.channel !== 0 ||
224
- texture.mapping !== UVMapping ||
225
- !texture.matrixAutoUpdate ||
226
- texture.internalFormat !== null ||
227
- texture.offset.x !== 0 ||
228
- texture.offset.y !== 0 ||
229
- texture.repeat.x !== 1 ||
230
- texture.repeat.y !== 1 ||
231
- texture.rotation !== 0 ||
232
- (texture.colorSpace !== SRGBColorSpace && texture.colorSpace !== NoColorSpace))
233
- fail(`unsupported ${name} texture settings`);
234
- const channels = texture.format === RGFormat ? 2 : 4;
235
- const pixels = (value, width, height) => {
236
- if (!(value instanceof Uint8Array) || value.byteLength !== width * height * depth * channels)
237
- fail(`invalid ${name} pixels`);
238
- return value;
239
- };
240
- files[name + "/0"] = pixels(base.data, width, height);
241
- const mips = texture.mipmaps.map((value, index) => {
242
- const mip = object(value);
243
- const w = integer(mip.width), h = integer(mip.height);
244
- if (w !== Math.max(1, width >> index) || h !== Math.max(1, height >> index))
245
- fail("invalid mip dimensions");
246
- files[`${name}/mip${index}`] = pixels(mip.data, w, h);
247
- return [w, h];
248
- });
249
- return {
250
- width,
251
- height,
252
- depth,
253
- channels,
254
- srgb: texture.colorSpace === SRGBColorSpace,
255
- anisotropy: texture.anisotropy,
256
- generateMipmaps: texture.generateMipmaps,
257
- unpackAlignment: texture.unpackAlignment,
258
- mips,
259
- };
260
- }
261
- function readTexture(files, name, value, array) {
262
- const meta = object(value);
263
- const width = integer(meta.width), height = integer(meta.height), depth = integer(meta.depth);
264
- const channels = meta.channels === 2 ? 2 : meta.channels === 4 ? 4 : fail("invalid texture channels");
265
- if (!array && depth !== 1)
266
- fail("2D texture with layers");
267
- const pixels = (key, width, height) => {
268
- const data = file(files, key);
269
- if (data.byteLength !== width * height * depth * channels)
270
- fail(`invalid ${key} byte length`);
271
- return data;
272
- };
273
- const data = pixels(name + "/0", width, height);
274
- const texture = array ? new DataArrayTexture(data, width, height, depth) : new DataTexture(data, width, height);
275
- texture.format = channels === 2 ? RGFormat : RGBAFormat;
276
- texture.colorSpace = boolean(meta.srgb) ? SRGBColorSpace : NoColorSpace;
277
- texture.minFilter = LinearMipmapLinearFilter;
278
- texture.magFilter = LinearFilter;
279
- texture.anisotropy = number(meta.anisotropy);
280
- texture.generateMipmaps = boolean(meta.generateMipmaps);
281
- const alignment = meta.unpackAlignment;
282
- if (alignment !== 1 && alignment !== 2 && alignment !== 4 && alignment !== 8)
283
- fail("invalid texture alignment");
284
- texture.unpackAlignment = alignment;
285
- if (!Array.isArray(meta.mips))
286
- fail("missing mipmaps");
287
- texture.mipmaps = meta.mips.map((value, index) => {
288
- const size = numbers(value, 2);
289
- const w = integer(size[0]), h = integer(size[1]);
290
- if (w !== Math.max(1, width >> index) || h !== Math.max(1, height >> index))
291
- fail("invalid mip dimensions");
292
- return { data: pixels(`${name}/mip${index}`, w, h), width: w, height: h };
293
- });
294
- texture.needsUpdate = true;
295
- return texture;
185
+ fail("invalid geometry data length");
186
+ const { buffer, byteOffset, byteLength } = bytes;
187
+ if (!(buffer instanceof ArrayBuffer))
188
+ fail("shared geometry data");
189
+ return new Type(buffer, byteOffset, byteLength / 4);
296
190
  }
297
191
  //# sourceMappingURL=codec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/baked/codec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/baked/codec.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,6 @@
1
- import type { Mip } from "../source/texels.js";
2
- /** Keep the base mip's cut-out coverage, with room for filtering around the alpha test. */
3
- export declare function keepCoverage(mips: Mip[]): Mip[];
1
+ import type { Mip } from "../source/sampler.js";
2
+ /**
3
+ * Preserve the base mip's cut-out coverage down the chain: scale each smaller mip's alpha, in place, so that the same
4
+ * share of its texels passes the alpha test, with room for filtering around the test. Returns `mips`.
5
+ */
6
+ export declare function preserveCoverage(mips: Mip[]): Mip[];