@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,272 @@
1
+ import { Box3, Group, Loader, LoadingManager, Vector3 } from "three/webgpu";
2
+ import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
3
+ import { at } from "../at.js";
4
+ import { createBakeRenderer } from "../bake.js";
5
+ import { disposeRecursive } from "../dispose.js";
6
+ import { framePixels } from "../impostor/impostor.js";
7
+ import { resolveThresholds } from "../levels/index.js";
8
+ import { meshoptDecoder } from "../meshopt.js";
9
+ import { isMesh, isObject3D, rejectSkinned } from "../three.js";
10
+ import { LodLoadContext } from "./context.js";
11
+ import { entryOf } from "./entry.js";
12
+ import { decodeLevel, encodeLevel, encodeShape, placedBox, readLevel, readShape, shapeOf } from "./level.js";
13
+ import { derived, normalize } from "./request.js";
14
+ import { assetPath, publicPath, sourceRelativeURL } from "./url.js";
15
+ /**
16
+ * Loads levels of detail from asset URLs, storing each derived level, and the source's shape, in vitecache, keyed by
17
+ * the request alone. Load it as a vitecache cached loader, with literal requests, so that the vitecache plugin finds
18
+ * every load and builds its levels in Node, saving them with the files they were built from; browsers read them, and
19
+ * one that misses builds the level itself.
20
+ *
21
+ * Loads asset URLs through manager handlers, else with a GLTFLoader of its own, which decodes meshopt only: register
22
+ * a GLTFLoader configured with Draco or KTX2 decoders for models compressed with them, and a GLTSLoader for .glts
23
+ * sources. Impostor and interior bakes draw with a renderer of the loader's own, made at its first bake and freed with
24
+ * what the last of the ladders it describes loaded (see `loadAsync`), or by `dispose`.
25
+ */
26
+ export class CachedLodLoader extends Loader {
27
+ options;
28
+ gltf;
29
+ /**
30
+ * The renderer this loader bakes with, made at its first bake. Its own, not the app's: a canvas the size of a bake
31
+ * frame would draw that frame over the whole target (see `bakeImpostor`).
32
+ */
33
+ renderer;
34
+ /** How many ladders it described whose loads are not yet freed. */
35
+ ladders = 0;
36
+ /** Whether `loadAsync` builds every level with the ladder rather than when a camera first needs it. */
37
+ buildsAll = false;
38
+ constructor(manager, options = {}) {
39
+ super(manager);
40
+ this.options = options;
41
+ }
42
+ load(request, onLoad, _onProgress, onError) {
43
+ this.loadAsync(request).then(onLoad, onError ?? ((error) => console.error(error)));
44
+ }
45
+ /**
46
+ * Describes the ladder from its source, which the first level loaded then takes. Empty levels load with it, as does
47
+ * the source when it is the only drawable; other levels load when a camera needs them, including a coarse stand-in
48
+ * while its first detail arrives, and each derived level is built when first loaded. A level whose default threshold
49
+ * is measured from it is built with the ladder, and in Node every level is.
50
+ *
51
+ * What the levels load is freed when the last Lod holding them is disposed (see `LodLevel.hold`), which spends them:
52
+ * a Lod made from them later throws, so call loadAsync again. Levels no Lod ever holds are never freed: they are
53
+ * yours until a Lod holds them. Once every ladder it described is freed, so is its bake renderer.
54
+ */
55
+ async loadAsync(request) {
56
+ const ladder = normalize(request, this.path, (url) => this.publicPath(this.manager.resolveURL(url)));
57
+ const { url, levels: requests } = ladder;
58
+ this.ladders++;
59
+ const context = new LodLoadContext(() => this.loadAsset(url), this.options.onLevel, () => {
60
+ if (--this.ladders === 0)
61
+ void this.freeRenderer();
62
+ });
63
+ this.manager.itemStart(url);
64
+ try {
65
+ // Built with the ladder: every level in Node; elsewhere a simplified or baked level without maxPixels, whose
66
+ // default threshold is measured from its deviation.
67
+ const eager = requests.flatMap((level, index) => level.type !== "empty" && (this.buildsAll || (level.type !== "impostor" && level.maxPixels === undefined)) ? [index + 1] : []);
68
+ // Only what measures a default threshold: bytes no camera asked for are not held.
69
+ const measured = new Map();
70
+ for (const index of eager) {
71
+ let built = false;
72
+ const level = await this.cached(ladder, index, async () => {
73
+ built = true;
74
+ return this.build(ladder, index, await context.source());
75
+ });
76
+ // A level built here is handed to its first load; a stored one is read again then.
77
+ if (built)
78
+ context.setBuilt(index, level);
79
+ measured.set(index, readLevel(level).level);
80
+ }
81
+ const shape = readShape(await this.cached(ladder, "shape", async () => encodeShape(shapeOf(await context.source()))));
82
+ const box = placedBox(shape);
83
+ if (box.isEmpty())
84
+ throw new Error("CachedLodLoader: the source has no visible geometry to measure");
85
+ // Building every level, the loader frees what it loaded with as loadAsync resolves (see the Node loader): no
86
+ // level keeps the spare source, and the source loads again only when a level asks for it.
87
+ if (this.buildsAll) {
88
+ const spare = context.take();
89
+ if (spare)
90
+ disposeRecursive(spare);
91
+ }
92
+ const thresholds = resolveThresholds([
93
+ {},
94
+ ...requests.map((level, position) => ({
95
+ // An impostor's default is its frame's, whether or not it is built with the ladder.
96
+ maxPixels: level.maxPixels ?? (level.type === "impostor" ? framePixels(level.resolution) : undefined),
97
+ measured: level.type === "impostor" ? undefined : measured.get(position + 1),
98
+ })),
99
+ ], shape.box.getSize(new Vector3()).length(), "CachedLodLoader");
100
+ const { hold } = context;
101
+ // Every load runs once however often it is asked for: every Lod made from the levels and the levels reading the
102
+ // source's materials share one object. The source's starts synchronously, so it takes the spare before a coarser
103
+ // level demanded in the same tick.
104
+ const loadSource = once(async () => context.arrive(context.take() ?? (await this.loadAsset(url)), 0, { materials: true }));
105
+ const materials = async () => {
106
+ const { object } = at(levels, 0);
107
+ return materialsOf(object ?? (await loadSource()));
108
+ };
109
+ const deferred = [
110
+ { load: loadSource, maxPixels: Infinity, box, hold },
111
+ ...requests.map((level, position) => {
112
+ const index = position + 1;
113
+ const maxPixels = at(thresholds, index);
114
+ if (level.type === "empty")
115
+ return { load: once(async () => context.arrive(new Group(), index, { materials: true })), maxPixels, box: new Box3(), hold };
116
+ const load = once(async () => {
117
+ const bytes = context.takeBuilt(index) ?? (await this.levelBytes(ladder, index, context.take()));
118
+ const object = await decodeLevel(level.type, readLevel(bytes), materials, level.type === "impostor" ? level.draw : undefined);
119
+ // A simplified level draws with the source level's materials, which that level frees.
120
+ return context.arrive(object, index, { materials: level.type !== "simplify" });
121
+ });
122
+ return { load, maxPixels, box: box.clone(), hold };
123
+ }),
124
+ ];
125
+ const levels = await preload(deferred, !this.buildsAll);
126
+ return levels;
127
+ }
128
+ catch (error) {
129
+ context.fail();
130
+ this.manager.itemError(url);
131
+ throw error;
132
+ }
133
+ finally {
134
+ this.manager.itemEnd(url);
135
+ }
136
+ }
137
+ /** The stored bytes of derived level `of`, or of the source's shape, else what `build` makes, saved. */
138
+ async cached(ladder, of, build) {
139
+ const entry = entryOf(ladder, of, this.options);
140
+ const stored = await entry.load();
141
+ if (stored)
142
+ return stored;
143
+ const bytes = await build();
144
+ await entry.save(bytes, { dependencies: this.inputs() });
145
+ return bytes;
146
+ }
147
+ /**
148
+ * The path below the app's base that `url`, as the manager resolved it, loads, such as `/tree/model.glts`: what its
149
+ * levels are stored under, alike wherever the app is served. The manager of a .glts script resolves URLs against the
150
+ * script.
151
+ */
152
+ publicPath(url) {
153
+ return publicPath(url, this.options.basePath ?? "/_vitecache/");
154
+ }
155
+ /** The files and packages what this loader built so far was built from: none in browsers, which do not save. */
156
+ inputs() {
157
+ return [];
158
+ }
159
+ /** A deferred level's bytes, built from `spare`, the ladder's source, or from a source of its own. Disposes `spare` either way. */
160
+ async levelBytes(ladder, index, spare) {
161
+ let used = false;
162
+ const bytes = await this.cached(ladder, index, async () => {
163
+ used = true;
164
+ const source = spare ?? (await this.loadAsset(ladder.url));
165
+ try {
166
+ return await this.build(ladder, index, source);
167
+ }
168
+ finally {
169
+ disposeRecursive(source);
170
+ }
171
+ });
172
+ if (spare && !used)
173
+ disposeRecursive(spare);
174
+ return bytes;
175
+ }
176
+ /** Build level `index` from `source`, encoded. */
177
+ async build(ladder, index, source) {
178
+ const request = derived(ladder.levels, index);
179
+ const load = (name) => {
180
+ const asset = request.type === "baked" ? request[name] : undefined;
181
+ return asset === undefined ? undefined : this.loadAsset(sourceRelativeURL(asset, ladder.url));
182
+ };
183
+ let low, interior, built;
184
+ try {
185
+ rejectSkinned(source, "CachedLodLoader");
186
+ low = await load("low");
187
+ interior = await load("interior");
188
+ // Only a miss builds: simplify, the bakes and their WASM stay out of pages whose levels are all stored.
189
+ const { buildLevel } = await import("./build.js");
190
+ built = await buildLevel(source, request, { low, interior }, () => this.bakeRenderer());
191
+ return await encodeLevel(built, request.type, shapeOf(source), materialsOf(source));
192
+ }
193
+ finally {
194
+ for (const object of [interior, low])
195
+ if (object)
196
+ disposeRecursive(object);
197
+ // A simplified level draws with the source's materials, which are freed with the source.
198
+ if (built)
199
+ disposeRecursive(built, { materials: request.type !== "simplify" });
200
+ }
201
+ }
202
+ /** The renderer this loader bakes with, made at its first bake. */
203
+ bakeRenderer() {
204
+ this.renderer ??= this.newBakeRenderer();
205
+ return this.renderer;
206
+ }
207
+ newBakeRenderer() {
208
+ return createBakeRenderer();
209
+ }
210
+ /**
211
+ * Free the renderer this loader made for its bakes, resolving once freed; a bake under way fails. Levels it loaded
212
+ * stay as they are, and a later bake makes a new renderer. In Node each `loadAsync` frees what it made to load and
213
+ * bake with, the scenes of its GLTSLoader included, before it resolves, so there this frees nothing.
214
+ */
215
+ async dispose() {
216
+ await this.freeRenderer();
217
+ }
218
+ /** Free the bake renderer, once made. */
219
+ async freeRenderer() {
220
+ const renderer = this.renderer;
221
+ this.renderer = undefined;
222
+ // A renderer that failed to initialise failed the bake that made it.
223
+ const made = await renderer?.catch(() => undefined);
224
+ made?.dispose();
225
+ }
226
+ async loadAsset(url) {
227
+ const { path, extension } = assetPath(url);
228
+ const handler = this.manager.getHandler(path);
229
+ if (!handler && extension === "glts")
230
+ throw new Error(`CachedLodLoader: cannot load "${url}": register a GLTSLoader for .glts on the loading manager`);
231
+ let result;
232
+ if (handler)
233
+ result = await handler.loadAsync(url);
234
+ else {
235
+ this.gltf ??= new GLTFLoader(this.manager).setMeshoptDecoder(meshoptDecoder());
236
+ const decoder = this.gltf.setCrossOrigin(this.crossOrigin).setWithCredentials(this.withCredentials).setRequestHeader(this.requestHeader);
237
+ result = await decoder.loadAsync(url);
238
+ }
239
+ return objectOf(result, url);
240
+ }
241
+ }
242
+ /** `load`, run once however often it is called: every call shares its promise. */
243
+ function once(load) {
244
+ let started;
245
+ return () => (started ??= load());
246
+ }
247
+ function materialsOf(object) {
248
+ const materials = [];
249
+ object.traverse((node) => {
250
+ if (isMesh(node))
251
+ for (const material of [node.material].flat())
252
+ materials.push(material);
253
+ });
254
+ return materials;
255
+ }
256
+ /**
257
+ * Loads what every camera draws before it picks a level: the empty levels, and, given `preloadSource`, the source if it
258
+ * is the only drawable.
259
+ */
260
+ async function preload(levels, preloadSource) {
261
+ const drawable = levels.filter((level) => !level.box.isEmpty());
262
+ return Promise.all(levels.map(async (level) => level.box.isEmpty() || (preloadSource && drawable.length === 1) ? { object: await level.load(), maxPixels: level.maxPixels, hold: level.hold } : level));
263
+ }
264
+ function objectOf(result, url) {
265
+ if (isObject3D(result))
266
+ return result;
267
+ const scene = typeof result === "object" && result !== null ? Reflect.get(result, "scene") : undefined;
268
+ if (isObject3D(scene))
269
+ return scene;
270
+ throw new Error(`CachedLodLoader: the handler for "${url}" did not load an Object3D or a glTF`);
271
+ }
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/loader/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { Box3, Matrix4, type Material, type Object3D } from "three/webgpu";
2
+ import { type ImpostorMeshOptions } from "../impostor/mesh/index.js";
3
+ import type { LodLevelRequest } from "./request.js";
4
+ /** A level the loader builds from the source and caches. */
5
+ export type Derived = Exclude<LodLevelRequest, {
6
+ type: "empty";
7
+ }>;
8
+ type Kind = Derived["type"];
9
+ /**
10
+ * The source's full-detail bounds in its own space and its placement. Every drawable level declares these bounds,
11
+ * so a ladder is described before its finer levels are built; each derived level must fit inside them.
12
+ */
13
+ export interface Shape {
14
+ box: Box3;
15
+ matrix: Matrix4;
16
+ }
17
+ export declare function shapeOf(source: Object3D): Shape;
18
+ /** `shape` on its own, as its cache entry holds it. */
19
+ export declare const encodeShape: (shape: Shape) => Uint8Array;
20
+ export declare const readShape: (bytes: Uint8Array) => Shape;
21
+ /** The bounds every drawable level declares, in the space of the Lod that holds it. */
22
+ export declare const placedBox: ({ box, matrix }: Shape) => Box3;
23
+ interface Metadata {
24
+ name: string;
25
+ deviation?: number;
26
+ texels?: number;
27
+ matrix: Matrix4;
28
+ matrixAutoUpdate: boolean;
29
+ castShadow: boolean;
30
+ receiveShadow: boolean;
31
+ }
32
+ export interface Entry {
33
+ shape: Shape;
34
+ level: Metadata;
35
+ payload: Uint8Array;
36
+ }
37
+ export declare function encodeLevel(object: Object3D, kind: Kind, shape: Shape, materials: readonly Material[]): Promise<Uint8Array>;
38
+ /** Decode a level placed as it was built; `materials` are the source's, which a simplified level draws with. */
39
+ export declare function decodeLevel(kind: Kind, { level, payload }: Entry, materials: () => Promise<Material[]>, draw: ImpostorMeshOptions | undefined): Promise<Object3D>;
40
+ export declare function readLevel(bytes: Uint8Array): Entry;
41
+ export {};
@@ -0,0 +1,140 @@
1
+ import { Box3, Matrix4 } from "three/webgpu";
2
+ import { decodeBakedMeshAsync, encodeBakedMeshAsync } from "../baked/codec.js";
3
+ import { boundingBox } from "../source/detail.js";
4
+ import { decodeImpostorAsync, encodeImpostorAsync } from "../impostor/codec.js";
5
+ import { ImpostorMesh } from "../impostor/mesh/index.js";
6
+ import { measure, recordDeviation } from "../levels/index.js";
7
+ import { isImpostorMesh, isMesh } from "../three.js";
8
+ import { decodeMeshAsync, encodeMeshAsync } from "../codec/mesh.js";
9
+ export function shapeOf(source) {
10
+ if (source.matrixAutoUpdate)
11
+ source.updateMatrix();
12
+ return { box: boundingBox(source), matrix: source.matrix.clone() };
13
+ }
14
+ /** `shape` on its own, as its cache entry holds it. */
15
+ export const encodeShape = (shape) => new TextEncoder().encode(JSON.stringify(shapeFields(shape)));
16
+ export const readShape = (bytes) => parseShape(object(JSON.parse(new TextDecoder().decode(bytes))));
17
+ const shapeFields = ({ box, matrix }) => ({ box: [...box.min.toArray(), ...box.max.toArray()], placement: matrix.toArray() });
18
+ function parseShape(meta) {
19
+ const box = new Box3().setFromArray(numbers(meta.box, 6));
20
+ if (box.isEmpty())
21
+ fail("empty source box");
22
+ return { box, matrix: new Matrix4().fromArray(numbers(meta.placement, 16)) };
23
+ }
24
+ /** The bounds every drawable level declares, in the space of the Lod that holds it. */
25
+ export const placedBox = ({ box, matrix }) => box.clone().applyMatrix4(matrix);
26
+ const MAGIC = 0x33444f4c;
27
+ export async function encodeLevel(object, kind, shape, materials) {
28
+ if (object.matrixAutoUpdate)
29
+ object.updateMatrix();
30
+ const box = boundingBox(object).applyMatrix4(object.matrix);
31
+ if (box.isEmpty())
32
+ throw new Error(`CachedLodLoader: the ${kind} level draws nothing`);
33
+ const bounds = placedBox(shape);
34
+ // Rounding in welds and bakes may move a vertex by a hair.
35
+ if (!bounds
36
+ .clone()
37
+ .expandByScalar(bounds.getSize(box.min.clone()).length() * 1e-4)
38
+ .containsBox(box))
39
+ throw new Error(`CachedLodLoader: the ${kind} level extends beyond the source's bounds; derived shapes, such as a low shell, must stay inside the source`);
40
+ const payload = await encodePayload(object, kind, materials);
41
+ const header = new TextEncoder().encode(JSON.stringify({
42
+ ...shapeFields(shape),
43
+ name: object.name,
44
+ ...measure(object),
45
+ matrix: object.matrix.toArray(),
46
+ matrixAutoUpdate: object.matrixAutoUpdate,
47
+ castShadow: object.castShadow,
48
+ receiveShadow: object.receiveShadow,
49
+ }));
50
+ const bytes = new Uint8Array(8 + header.length + payload.length);
51
+ const data = new DataView(bytes.buffer);
52
+ data.setUint32(0, MAGIC, true);
53
+ data.setUint32(4, header.length, true);
54
+ bytes.set(header, 8);
55
+ bytes.set(payload, 8 + header.length);
56
+ return bytes;
57
+ }
58
+ async function encodePayload(object, kind, materials) {
59
+ switch (kind) {
60
+ case "simplify":
61
+ return encodeMeshAsync(object, materials);
62
+ case "baked":
63
+ if (!isMesh(object))
64
+ throw new Error("CachedLodLoader: baked level is not a mesh");
65
+ return encodeBakedMeshAsync(object);
66
+ case "impostor":
67
+ if (!isImpostorMesh(object))
68
+ throw new Error("CachedLodLoader: impostor level is not an ImpostorMesh");
69
+ return encodeImpostorAsync(object.impostor);
70
+ }
71
+ }
72
+ /** Decode a level placed as it was built; `materials` are the source's, which a simplified level draws with. */
73
+ export async function decodeLevel(kind, { level, payload }, materials, draw) {
74
+ const object = kind === "simplify"
75
+ ? await decodeMeshAsync(payload, await materials())
76
+ : kind === "baked"
77
+ ? await decodeBakedMeshAsync(payload)
78
+ : new ImpostorMesh(await decodeImpostorAsync(payload), 1, draw);
79
+ object.name = level.name;
80
+ level.matrix.decompose(object.position, object.quaternion, object.scale);
81
+ object.matrix.copy(level.matrix);
82
+ object.matrixAutoUpdate = level.matrixAutoUpdate;
83
+ object.castShadow = level.castShadow;
84
+ object.receiveShadow = level.receiveShadow;
85
+ if (level.deviation !== undefined)
86
+ recordDeviation(object, level.deviation);
87
+ return object;
88
+ }
89
+ export function readLevel(bytes) {
90
+ if (bytes.length < 8)
91
+ fail("missing header");
92
+ const data = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
93
+ const length = data.getUint32(4, true);
94
+ if (data.getUint32(0, true) !== MAGIC || length > bytes.length - 8)
95
+ fail("invalid header");
96
+ const meta = object(JSON.parse(new TextDecoder().decode(bytes.subarray(8, 8 + length))));
97
+ if (typeof meta.name !== "string" ||
98
+ typeof meta.castShadow !== "boolean" ||
99
+ typeof meta.receiveShadow !== "boolean" ||
100
+ typeof meta.matrixAutoUpdate !== "boolean")
101
+ fail("invalid level settings");
102
+ const deviation = meta.deviation === undefined ? undefined : finite(meta.deviation);
103
+ if (deviation !== undefined && deviation < 0)
104
+ fail("negative deviation");
105
+ const texels = meta.texels === undefined ? undefined : finite(meta.texels);
106
+ if (texels !== undefined && texels <= 0)
107
+ fail("invalid texels");
108
+ return {
109
+ shape: parseShape(meta),
110
+ level: {
111
+ name: meta.name,
112
+ deviation,
113
+ texels,
114
+ matrix: new Matrix4().fromArray(numbers(meta.matrix, 16)),
115
+ matrixAutoUpdate: meta.matrixAutoUpdate,
116
+ castShadow: meta.castShadow,
117
+ receiveShadow: meta.receiveShadow,
118
+ },
119
+ payload: bytes.subarray(8 + length),
120
+ };
121
+ }
122
+ function object(value) {
123
+ if (typeof value !== "object" || value === null || Array.isArray(value))
124
+ fail("expected metadata object");
125
+ return Object.fromEntries(Object.entries(value));
126
+ }
127
+ function finite(value) {
128
+ if (typeof value !== "number" || !Number.isFinite(value))
129
+ fail("expected finite number");
130
+ return value;
131
+ }
132
+ function numbers(value, count) {
133
+ if (!Array.isArray(value) || value.length !== count)
134
+ fail(`expected ${count} numbers`);
135
+ return value.map(finite);
136
+ }
137
+ function fail(reason) {
138
+ throw new Error(`CachedLodLoader: invalid cache (${reason})`);
139
+ }
140
+ //# sourceMappingURL=level.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level.js","sourceRoot":"","sources":["../../src/loader/level.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { LoadingManager } from "three/webgpu";
2
+ import type { LodLevel } from "../levels/index.js";
3
+ import { CachedLodLoader as BrowserCachedLodLoader, type CachedLodLoaderOptions } from "./index.js";
4
+ import type { LodRequest } from "./request.js";
5
+ /**
6
+ * CachedLodLoader in Node, as the vitecache plugin and the glts CLI run it: `loadAsync` builds and saves every level of
7
+ * the ladder, each with the public files the ladder's loads read and the installed versions of three and of the
8
+ * packages its .glts sources import. A load that reads anything else, such as a URL off the public directory or a module
9
+ * a .glts source imports from a CDN, fails, since no stored level could be checked against it. Served paths such as
10
+ * `/trees/oak.glts`, and `file:` URLs in the public directory, as a headless .glts script's manager resolves them to,
11
+ * load from vitecache's public directory (see `publicURL`), and `.glts` sources through a GLTSLoader of the load's own;
12
+ * bakes draw on a WebGPU device of @drawcall/webgpu. The manager only resolves the request's URL.
13
+ *
14
+ * Each `loadAsync` loads and bakes with what it makes for itself, which it frees before resolving, so loads may run
15
+ * concurrently. The levels it returns load their stored bytes as in browsers, and none holds the source: the source
16
+ * level, and a simplified level, which draws with the source's materials, load the source again when a camera needs
17
+ * them, as the glts CLI's renders of a .glts script that draws a Lod do.
18
+ */
19
+ export declare class CachedLodLoader extends BrowserCachedLodLoader {
20
+ constructor(manager?: LoadingManager, options?: CachedLodLoaderOptions);
21
+ loadAsync(request: LodRequest): Promise<LodLevel[]>;
22
+ /** Nothing to free: each load frees what it made. */
23
+ dispose(): Promise<void>;
24
+ /** A `file:` URL in the public directory as its served path; others as in browsers. */
25
+ protected publicPath(url: string): string;
26
+ }