@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/dist/levels.js DELETED
@@ -1,171 +0,0 @@
1
- import { Color } from "three/webgpu";
2
- import { texelPixels } from "./impostor/impostor.js";
3
- import { isImpostorMesh, isLOD } from "./three.js";
4
- import { at } from "./at.js";
5
- /** Share of each level's range over which its finer neighbour fades out. */
6
- export const FADE = 0.1;
7
- /** One owner's resolved threshold and drawable, separate from its reusable description. */
8
- export class Level {
9
- input;
10
- index;
11
- ladder;
12
- tint = new Color(1, 1, 1);
13
- box;
14
- object;
15
- nested;
16
- explicit;
17
- base = Infinity;
18
- value = Infinity;
19
- constructor(input, index, ladder) {
20
- this.input = input;
21
- this.index = index;
22
- this.ladder = ladder;
23
- this.explicit = input.maxPixels ?? null;
24
- if (input.maxPixels !== undefined)
25
- checkThreshold(input.maxPixels, index);
26
- this.box = input.box;
27
- if (this.box && !this.box.isEmpty() && ![...this.box.min.toArray(), ...this.box.max.toArray()].every(Number.isFinite))
28
- throw new Error("Lod: a deferred level's box must be finite");
29
- this.object = input.object?.clone();
30
- this.nested = this.object ? isLOD(this.object) : false;
31
- }
32
- get maxPixels() {
33
- return this.value;
34
- }
35
- set maxPixels(value) {
36
- checkThreshold(value, this.index);
37
- this.explicit = value;
38
- resolve(this.ladder);
39
- }
40
- }
41
- function checkThreshold(value, index) {
42
- if (index === 0 && value !== Infinity)
43
- throw new Error(`Lod: level 0, the source, is used at any height: its maxPixels is Infinity, not ${value}`);
44
- if (!(value > 0))
45
- throw new Error(`Lod: maxPixels must be > 0, got ${value}`);
46
- }
47
- const deviations = new WeakMap();
48
- /** Surface deviation from the source, in the source's units. */
49
- export const recordDeviation = (level, deviation) => void deviations.set(level, deviation);
50
- export const deviationOf = (level) => deviations.get(level);
51
- /** Descriptions for a new owner, retaining threshold edits and sharing deferred decode. */
52
- export function cloneLevels(levels) {
53
- return levels.map((level) => {
54
- const { input, explicit } = level;
55
- if (input.load)
56
- return { ...input, maxPixels: level.maxPixels };
57
- return { object: input.object, ...(explicit === null ? {} : { maxPixels: explicit }) };
58
- });
59
- }
60
- export function measure(object) {
61
- return { deviation: deviationOf(object), texels: isImpostorMesh(object) ? texelPixels(object.impostor) : undefined };
62
- }
63
- function bases(levels, diameter) {
64
- let finer = 1024;
65
- return levels.map(({ maxPixels, measured }, index) => {
66
- if (index === 0)
67
- return Infinity;
68
- const base = !measured
69
- ? maxPixels
70
- : measured.deviation !== undefined
71
- ? diameter / Math.max(measured.deviation, diameter * 1e-4)
72
- : (measured.texels ?? finer / 2);
73
- if (base === undefined)
74
- throw new Error("Lod: a deferred level needs maxPixels");
75
- finer = base;
76
- return base;
77
- });
78
- }
79
- /** Resolve thresholds from measurements without constructing renderer state. */
80
- export function resolveThresholds(levels, diameter) {
81
- const defaults = bases(levels, diameter);
82
- const thresholds = levels.map((level, index) => {
83
- if (level.maxPixels !== undefined)
84
- checkThreshold(level.maxPixels, index);
85
- return { index, explicit: level.maxPixels ?? null, base: defaults[index] ?? Infinity, value: Infinity };
86
- });
87
- resolve(thresholds);
88
- validate(thresholds.map(({ value }) => ({ maxPixels: value })));
89
- return thresholds.map(({ value }) => value);
90
- }
91
- /** Resolve defaults once, retaining writable owner thresholds. */
92
- export function estimate(levels, diameter) {
93
- const defaults = bases(levels.map(({ input }) => ({ maxPixels: input.maxPixels, measured: input.object && measure(input.object) })), diameter);
94
- levels.forEach((level, index) => {
95
- level.base = defaults[index] ?? Infinity;
96
- });
97
- resolve(levels);
98
- }
99
- function resolve(levels) {
100
- let next = 0;
101
- for (let i = levels.length - 1; i >= 0; i--) {
102
- const level = at(levels, i);
103
- level.value = level.index === 0 ? Infinity : (level.explicit ?? Math.max(level.base, 2 * next));
104
- next = level.value;
105
- }
106
- }
107
- /** Throws when neighbouring fades overlap. */
108
- export function validate(levels) {
109
- levels.forEach((level, i) => {
110
- const finer = levels[i - 1];
111
- if (finer && level.maxPixels > finer.maxPixels * (1 - FADE))
112
- throw new Error(`Lod: level ${i} has maxPixels ${level.maxPixels}, but at most ${finer.maxPixels * (1 - FADE)} (${1 - FADE} × level ${i - 1}'s ${finer.maxPixels}) leaves room for the fades`);
113
- });
114
- }
115
- /** The level drawn at `height`: the last one it fits, or `forceLevel`. */
116
- export function levelAt(levels, height, forceLevel) {
117
- const level = levels[forceLevel ?? lastFitting(levels, height)];
118
- if (!level)
119
- throw new Error(`Lod: forceLevel ${forceLevel} is not a level`);
120
- return level;
121
- }
122
- /** The coarsest level whose maxPixels `height` still fits; level 0 fits any height. */
123
- export function lastFitting(levels, height) {
124
- for (let i = levels.length - 1; i > 0; i--)
125
- if (height <= at(levels, i).maxPixels)
126
- return i;
127
- return 0;
128
- }
129
- /**
130
- * How far `level` has faded in over its finer neighbour at `height`, in [0, 1): 0 when
131
- * no fade is under way (the finer level is gone). See fade.ts for how both draw it.
132
- */
133
- export function fadeProgress(levels, level, height) {
134
- const finer = levels[level.index - 1];
135
- if (!finer || level.nested || finer.nested)
136
- return 0;
137
- const top = level.maxPixels;
138
- const t = Math.min(Math.max((height - top * (1 - FADE)) / (top * FADE), 0), 1);
139
- // smoothstep, as the GPU's selection computes it
140
- return t * t * (3 - 2 * t);
141
- }
142
- /** Debug tints by level index, see `Lod.debug`. */
143
- const TINTS = [0xff6060, 0x60ff60, 0x6080ff, 0xffd040, 0xff60ff, 0x60ffff].map((hex) => new Color(hex));
144
- /** Give each level its debug tint, or white. */
145
- export function tintLevels(levels, debug) {
146
- for (const level of levels)
147
- level.tint.set(debug ? (TINTS[level.index % TINTS.length] ?? 0xffffff) : 0xffffff);
148
- }
149
- // Start refinement 20% below its lower fade bound, leaving time for decode and GPU preparation.
150
- export const DEMAND = 0.8;
151
- /** Logical demand and the next finer fade partner, including a small approach margin. */
152
- export function demandLevels(levels, height, forced) {
153
- const desired = levelAt(levels, height, forced);
154
- if (forced !== null)
155
- return [desired];
156
- const finer = levels[desired.index - 1];
157
- return finer && height >= DEMAND * desired.maxPixels * (1 - FADE) ? [desired, finer] : [desired];
158
- }
159
- /** Nearest ready finer level, else nearest coarser; -1 draws nothing until one is ready. */
160
- export function fallbacks(levels, ready) {
161
- return levels.map((_, index) => {
162
- for (let finer = index; finer >= 0; finer--)
163
- if (ready.has(at(levels, finer)))
164
- return finer;
165
- for (let coarser = index + 1; coarser < levels.length; coarser++)
166
- if (ready.has(at(levels, coarser)))
167
- return coarser;
168
- return -1;
169
- });
170
- }
171
- //# sourceMappingURL=levels.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"levels.js","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import { type Object3D } from "three/webgpu";
2
- import { disposeRejected } from "../dispose.js";
3
- import { type ImpostorMeshOptions } from "../impostor/mesh/index.js";
4
- import { type LodLevel } from "../levels.js";
5
- import type { LevelRequest } from "../loader.js";
6
- export type Kind = "source" | LevelRequest["type"];
7
- /** The ladder indices whose payload is saved as its own entry: every derived drawable level except the inlined coarsest. */
8
- export declare function separateLevels(kinds: readonly Kind[]): number[];
9
- /**
10
- * Inline coarse derived payloads; a source-only request leaves its source deferred. The index
11
- * keeps what thresholds are measured from, not thresholds or impostor draw options, so changing
12
- * either reuses the cache. `levels` maps each deferred level index to its payload.
13
- */
14
- export declare function encode(objects: readonly Object3D[], kinds: readonly Kind[]): Promise<{
15
- index: Uint8Array;
16
- levels: Map<number, Uint8Array>;
17
- }>;
18
- /** What a request sets per level at decode, without changing cached content. */
19
- interface Requested {
20
- maxPixels?: number;
21
- draw?: ImpostorMeshOptions;
22
- }
23
- /** Index metadata exposes every drawable level without decoding its payload. `requested` holds level i's request at i. */
24
- export declare function decode(bytes: Uint8Array, requested: readonly Requested[], loadSource: () => Promise<Object3D>, loadLevel: (index: number) => Promise<Uint8Array>, onLevel?: (object: Object3D, index: number) => void | Promise<void>, release?: typeof disposeRejected): LodLevel[];
25
- export {};
@@ -1,241 +0,0 @@
1
- import { Box3, Group, Matrix4 } from "three/webgpu";
2
- import { decodeBakedMeshAsync, encodeBakedMesh } from "../baked/codec.js";
3
- import { boundingBox, measureLevels } from "../bounds.js";
4
- import { loadOnce } from "../deferred.js";
5
- import { disposeRejected } from "../dispose.js";
6
- import { decodeImpostorAsync, encodeImpostor } from "../impostor/codec.js";
7
- import { ImpostorMesh } from "../impostor/mesh/index.js";
8
- import { measure, recordDeviation, resolveThresholds } from "../levels.js";
9
- import { isImpostorMesh, isMesh } from "../three.js";
10
- import { decodeMeshAsync, encodeMesh } from "../mesh/codec.js";
11
- /** The coarsest drawable level, whose payload the index inlines unless it is the source, which loads from its URL. */
12
- function coarsestOf(kinds) {
13
- return kinds.reduce((last, kind, index) => (kind === "empty" ? last : index), -1);
14
- }
15
- /** The ladder indices whose payload is saved as its own entry: every derived drawable level except the inlined coarsest. */
16
- export function separateLevels(kinds) {
17
- const coarsest = coarsestOf(kinds);
18
- return kinds.flatMap((kind, index) => (kind === "source" || kind === "empty" || index === coarsest ? [] : [index]));
19
- }
20
- /**
21
- * Inline coarse derived payloads; a source-only request leaves its source deferred. The index
22
- * keeps what thresholds are measured from, not thresholds or impostor draw options, so changing
23
- * either reuses the cache. `levels` maps each deferred level index to its payload.
24
- */
25
- export async function encode(objects, kinds) {
26
- const payloads = [];
27
- const metadata = [];
28
- const materials = materialsOf(objects[0]);
29
- if (kinds.length !== objects.length)
30
- throw new Error("LodLoader: level kinds do not match levels");
31
- for (const [level, object] of objects.entries()) {
32
- const kind = kinds[level];
33
- if (!kind)
34
- throw new Error("LodLoader: missing level kind");
35
- const box = boundingBox(object);
36
- if (box.isEmpty() && kind !== "empty")
37
- throw new Error(`LodLoader: ${kind} level ${level} has an empty box`);
38
- const bytes = await payload(object, kind, materials);
39
- if (object.matrixAutoUpdate)
40
- object.updateMatrix();
41
- metadata.push({
42
- kind,
43
- name: object.name,
44
- ...measure(object),
45
- box: box.isEmpty() ? null : [...box.min.toArray(), ...box.max.toArray()],
46
- matrix: object.matrix.toArray(),
47
- matrixAutoUpdate: object.matrixAutoUpdate,
48
- castShadow: object.castShadow,
49
- receiveShadow: object.receiveShadow,
50
- length: bytes.byteLength,
51
- });
52
- payloads.push(bytes);
53
- }
54
- const coarsest = coarsestOf(kinds);
55
- if (coarsest < 0)
56
- throw new Error("LodLoader: cache has no drawable level");
57
- const coarse = coarsest > 0 ? payloads[coarsest] : new Uint8Array();
58
- if (!coarse)
59
- throw new Error("LodLoader: missing coarse payload");
60
- const header = new TextEncoder().encode(JSON.stringify(metadata));
61
- const index = new Uint8Array(8 + header.length + coarse.length);
62
- const view = new DataView(index.buffer);
63
- view.setUint32(0, 0x32444f4c, true);
64
- view.setUint32(4, header.length, true);
65
- index.set(header, 8);
66
- index.set(coarse, 8 + header.length);
67
- const levels = new Map(separateLevels(kinds).map((level) => {
68
- const bytes = payloads[level];
69
- if (!bytes)
70
- throw new Error(`LodLoader: missing payload ${level}`);
71
- return [level, bytes];
72
- }));
73
- return { index, levels };
74
- }
75
- async function payload(object, kind, materials) {
76
- switch (kind) {
77
- case "source":
78
- case "empty":
79
- return new Uint8Array();
80
- case "simplify":
81
- return encodeMesh(object, materials);
82
- case "baked":
83
- if (!isMesh(object))
84
- throw new Error("LodLoader: baked level is not a mesh");
85
- return encodeBakedMesh(object);
86
- case "impostor":
87
- if (!isImpostorMesh(object))
88
- throw new Error("LodLoader: impostor level is not an ImpostorMesh");
89
- return encodeImpostor(object.impostor);
90
- }
91
- }
92
- /** The inverse of `payload`; `read` has checked that a source or empty level has no bytes. */
93
- async function decodePayload(kind, bytes, loadSource, materials, draw) {
94
- switch (kind) {
95
- case "source":
96
- return loadSource();
97
- case "empty":
98
- return new Group();
99
- case "simplify":
100
- return decodeMeshAsync(await bytes(), await materials());
101
- case "baked":
102
- return decodeBakedMeshAsync(await bytes());
103
- case "impostor":
104
- return new ImpostorMesh(await decodeImpostorAsync(await bytes()), 1, draw);
105
- }
106
- }
107
- /** Index metadata exposes every drawable level without decoding its payload. `requested` holds level i's request at i. */
108
- export function decode(bytes, requested, loadSource, loadLevel, onLevel, release = disposeRejected) {
109
- const { metadata, coarsest, coarse } = read(bytes);
110
- if (requested.length !== metadata.length)
111
- fail("level count");
112
- const diameter = measureLevels(metadata, "LodLoader").own.radius * 2;
113
- const thresholds = resolveThresholds(metadata.map(({ deviation, texels }, index) => ({ maxPixels: requested[index]?.maxPixels, measured: { deviation, texels } })), diameter);
114
- const materials = async () => {
115
- const source = levels[0];
116
- if (!source)
117
- fail("missing source materials");
118
- return materialsOf(source.object ?? (await loadOnce(source.load).promise));
119
- };
120
- const levels = metadata.map((level, index) => {
121
- const load = async () => {
122
- const levelBytes = async () => {
123
- const payload = index === coarsest && coarsest > 0 ? coarse : await loadLevel(index);
124
- if (payload.length !== level.length)
125
- fail(`level ${index} payload length`);
126
- return payload;
127
- };
128
- const loaded = await decodePayload(level.kind, levelBytes, loadSource, materials, requested[index]?.draw);
129
- try {
130
- place(loaded, level);
131
- if (level.deviation !== undefined)
132
- recordDeviation(loaded, level.deviation);
133
- await onLevel?.(loaded, index);
134
- return loaded;
135
- }
136
- catch (error) {
137
- release(loaded);
138
- throw error;
139
- }
140
- };
141
- return {
142
- load,
143
- maxPixels: thresholds[index] ?? fail("missing threshold"),
144
- box: level.box.clone().applyMatrix4(level.matrix),
145
- };
146
- });
147
- return levels;
148
- }
149
- function materialsOf(object) {
150
- const materials = [];
151
- object?.traverse((node) => {
152
- if (isMesh(node))
153
- for (const material of [node.material].flat())
154
- materials.push(material);
155
- });
156
- return materials;
157
- }
158
- function place(object, level) {
159
- object.name = level.name;
160
- level.matrix.decompose(object.position, object.quaternion, object.scale);
161
- object.matrix.copy(level.matrix);
162
- object.matrixAutoUpdate = level.matrixAutoUpdate;
163
- object.castShadow = level.castShadow;
164
- object.receiveShadow = level.receiveShadow;
165
- }
166
- function read(bytes) {
167
- if (bytes.length < 8)
168
- fail("missing header");
169
- const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
170
- const length = view.getUint32(4, true);
171
- if (view.getUint32(0, true) !== 0x32444f4c || length > bytes.length - 8)
172
- fail("invalid header");
173
- const parsed = JSON.parse(new TextDecoder().decode(bytes.subarray(8, 8 + length)));
174
- if (!Array.isArray(parsed) || !parsed.length)
175
- fail("missing levels");
176
- const metadata = parsed.map((value) => {
177
- const meta = object(value);
178
- const kind = meta.kind;
179
- if (kind !== "simplify" && kind !== "baked" && kind !== "impostor" && kind !== "empty" && kind !== "source")
180
- fail("unknown level kind");
181
- if (typeof meta.name !== "string" ||
182
- typeof meta.castShadow !== "boolean" ||
183
- typeof meta.receiveShadow !== "boolean" ||
184
- typeof meta.matrixAutoUpdate !== "boolean")
185
- fail("invalid level settings");
186
- const size = finite(meta.length);
187
- if (!Number.isSafeInteger(size) || size < 0)
188
- fail("invalid payload length");
189
- const box = meta.box === null ? new Box3() : new Box3().setFromArray(numbers(meta.box, 6));
190
- if (box.isEmpty() && kind !== "empty")
191
- fail("drawable level has an empty box");
192
- if ((kind === "empty" || kind === "source") !== (size === 0))
193
- fail("invalid level payload length");
194
- const matrix = new Matrix4().fromArray(numbers(meta.matrix, 16));
195
- const deviation = meta.deviation === undefined ? undefined : finite(meta.deviation);
196
- if (deviation !== undefined && deviation < 0)
197
- fail("negative deviation");
198
- const texels = meta.texels === undefined ? undefined : finite(meta.texels);
199
- if (texels !== undefined && texels <= 0)
200
- fail("invalid texels");
201
- const level = {
202
- kind,
203
- name: meta.name,
204
- deviation,
205
- texels,
206
- box,
207
- matrix,
208
- matrixAutoUpdate: meta.matrixAutoUpdate,
209
- castShadow: meta.castShadow,
210
- receiveShadow: meta.receiveShadow,
211
- length: size,
212
- };
213
- return level;
214
- });
215
- const coarsest = coarsestOf(metadata.map((level) => level.kind));
216
- if (coarsest < 0)
217
- fail("no drawable level");
218
- const size = coarsest > 0 ? metadata[coarsest]?.length : 0;
219
- if (size === undefined || bytes.length !== 8 + length + size)
220
- fail("invalid coarse payload length");
221
- return { metadata, coarsest, coarse: bytes.subarray(8 + length) };
222
- }
223
- function object(value) {
224
- if (typeof value !== "object" || value === null || Array.isArray(value))
225
- fail("expected metadata object");
226
- return Object.fromEntries(Object.entries(value));
227
- }
228
- function finite(value) {
229
- if (typeof value !== "number" || !Number.isFinite(value))
230
- fail("expected finite number");
231
- return value;
232
- }
233
- function numbers(value, count) {
234
- if (!Array.isArray(value) || value.length !== count)
235
- fail(`expected ${count} numbers`);
236
- return value.map(finite);
237
- }
238
- function fail(reason) {
239
- throw new Error(`LodLoader: invalid cache (${reason})`);
240
- }
241
- //# sourceMappingURL=bundle.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/loader/bundle.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import { CacheEntry, type CacheEntryOptions, type Dependencies } from "vitecache";
2
- import type { LevelRequest } from "../loader.js";
3
- /** Persistent cache location. Generator packages are discovered from GLTS source provenance. */
4
- export type LodCacheOptions = Pick<CacheEntryOptions, "basePath" | "root">;
5
- /**
6
- * The index of a ladder: keyed by the requested URLs, levels and bundled modules, and saved with what loading the sources
7
- * revealed, so vitecache rechecks those without loading the sources.
8
- */
9
- export declare function indexEntry(inputs: Dependencies, levels: readonly LevelRequest[], modules: Readonly<Record<string, string>>, options?: LodCacheOptions): CacheEntry;
10
- /**
11
- * A level payload saved apart from its index, addressed by the index's content: a valid index vouches for its payloads,
12
- * and rebuilds write new ones rather than replacing those a live ladder or another build still reads.
13
- */
14
- export declare function payloadEntry(index: string, level: number, options?: LodCacheOptions): CacheEntry;
15
- export declare function sha256(bytes: Uint8Array): Promise<string>;
@@ -1,75 +0,0 @@
1
- import { CacheEntry } from "vitecache";
2
- import { urlQuery } from "./url.js";
3
- const version = "lod-levels@18";
4
- /**
5
- * The index of a ladder: keyed by the requested URLs, levels and bundled modules, and saved with what loading the sources
6
- * revealed, so vitecache rechecks those without loading the sources.
7
- */
8
- export function indexEntry(inputs, levels, modules, options) {
9
- // vitecache resolves URLs to file paths; keep generation parameters in the key.
10
- const queries = {};
11
- for (const [name, dependency] of Object.entries(inputs)) {
12
- const query = dependency.url === undefined ? "" : urlQuery(dependency.url);
13
- if (query)
14
- queries[name] = query;
15
- }
16
- return new CacheEntry({
17
- basePath: options?.basePath,
18
- root: options?.root,
19
- version,
20
- dependencies: {
21
- ...inputs,
22
- "lod:levels": { value: levels.map(parameters) },
23
- "lod:modules": { value: modules },
24
- "lod:queries": { value: queries },
25
- // Only packages the app installs resolve from its root; this package's own dependencies are covered by its version and `version` above.
26
- "lod:package": { package: "@drawcall/lod" },
27
- "lod:three": { package: "three" },
28
- },
29
- });
30
- }
31
- /**
32
- * A level payload saved apart from its index, addressed by the index's content: a valid index vouches for its payloads,
33
- * and rebuilds write new ones rather than replacing those a live ladder or another build still reads.
34
- */
35
- export function payloadEntry(index, level, options) {
36
- return new CacheEntry({
37
- basePath: options?.basePath,
38
- root: options?.root,
39
- version,
40
- dependencies: { "lod:index": { value: index }, "lod:level": { value: level } },
41
- });
42
- }
43
- export async function sha256(bytes) {
44
- const hash = await crypto.subtle.digest("SHA-256", new Uint8Array(bytes));
45
- return Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join("");
46
- }
47
- /** What derives each level's content. Switch thresholds and impostor draw options apply at decode, so changing one reuses the cache. */
48
- function parameters(level) {
49
- switch (level.type) {
50
- case "empty":
51
- return { type: level.type };
52
- case "simplify":
53
- return { type: level.type, ratio: level.ratio ?? null };
54
- case "baked":
55
- return {
56
- type: level.type,
57
- ratio: level.ratio ?? null,
58
- textureSize: level.textureSize ?? null,
59
- low: level.low ?? null,
60
- interior: level.interior ?? null,
61
- };
62
- case "impostor":
63
- return {
64
- type: level.type,
65
- // The impostor bakes its top mip for this height too.
66
- maxPixels: level.maxPixels ?? null,
67
- layout: level.layout ?? null,
68
- frames: level.frames ?? null,
69
- resolution: level.resolution ?? null,
70
- emissive: level.emissive ?? null,
71
- supersample: level.supersample ?? null,
72
- };
73
- }
74
- }
75
- //# sourceMappingURL=cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/loader/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA6D,MAAM,WAAW,CAAC;AAElG,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKpC,MAAM,OAAO,GAAG,eAAe,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,MAAoB,EACpB,MAA+B,EAC/B,OAAyC,EACzC,OAAyB;IAEzB,gFAAgF;IAChF,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC3E,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,UAAU,CAAC;QACpB,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,OAAO;QACP,YAAY,EAAE;YACZ,GAAG,MAAM;YACT,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC/C,aAAa,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;YACjC,aAAa,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;YACjC,wIAAwI;YACxI,aAAa,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;YAC3C,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;SAClC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,OAAyB;IAClF,OAAO,IAAI,UAAU,CAAC;QACpB,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,OAAO;QACP,YAAY,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;KAC/E,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,KAAiB;IAC5C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,wIAAwI;AACxI,SAAS,UAAU,CAAC,KAAmB;IACrC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;QAC1D,KAAK,OAAO;YACV,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;gBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;gBACtC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI;gBACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;aACjC,CAAC;QACJ,KAAK,UAAU;YACb,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,sDAAsD;gBACtD,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;gBAClC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;gBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;gBACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;aACvC,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -1,30 +0,0 @@
1
- import type { LoadingManager, Object3D } from "three/webgpu";
2
- import type { Dependencies, SavedDependencies } from "vitecache";
3
- /** The requested assets, and the files and packages loading them revealed, for saving with the index built from them. */
4
- export declare class Provenance {
5
- private readonly manager;
6
- readonly inputs: Dependencies;
7
- private readonly resources;
8
- /** Kept whole: a GLTS source reports what it has observed so far, so it is read when saving. */
9
- private readonly scripts;
10
- constructor(urls: Readonly<Record<string, string>>, manager: LoadingManager);
11
- capture(url: string, object: Object3D, result: unknown): void;
12
- /** The requested URLs, resolved as `inputs` holds them. */
13
- get requested(): string[];
14
- /**
15
- * What the captured assets were built from so far, beyond the requested URLs, or why that cannot be validated later:
16
- * a CDN module fetched at runtime, which bundled moduleSources cannot vouch for, or a cross-origin resource, which
17
- * vitecache cannot hash.
18
- */
19
- dependencies(): {
20
- dependencies: SavedDependencies;
21
- } | {
22
- reason: string;
23
- };
24
- }
25
- /**
26
- * Digests of the bundled modules each input script's GLTS loader links, by input name. They are known before a source runs,
27
- * so they key its levels: a source's bundled module hashes come from these moduleSources. Any change to them, such as a new
28
- * bare import in any .glts, therefore invalidates every GLTS-derived level.
29
- */
30
- export declare function bundledModules(urls: Readonly<Record<string, string>>, manager: LoadingManager): Promise<Record<string, string>>;