@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,99 @@
1
+ import { Color, type Box3, type Object3D } from "three/webgpu";
2
+ import type { d } from "typegpu";
3
+ import { type DrawLevels } from "./draw.js";
4
+ import { LevelHeights } from "./load.js";
5
+ /**
6
+ * One level of a Lod: an object given, or one `load` makes when a camera first needs it, which `box` bounds meanwhile.
7
+ * `lod.levels` holds the same shape, with `object` the Lod's own copy, once there is one: the template its level meshes
8
+ * are made from, never in the scene.
9
+ *
10
+ * Objects you give or load are yours to dispose, as a three Mesh never disposes its geometry or material; a Lod frees
11
+ * only what it made of them. CachedLodLoader's are freed when the last Lod holding them is disposed (see `hold`).
12
+ */
13
+ export interface LodLevel {
14
+ /** The level's object: yours to dispose. */
15
+ object?: Object3D;
16
+ /**
17
+ * Makes the level's object, yours to dispose. A load shared across several Lods runs once per Lod; memoize it to
18
+ * share one object.
19
+ */
20
+ load?: () => Promise<Object3D>;
21
+ /** A deferred level's bounds in the Lod's space; empty for a level that draws nothing. */
22
+ box?: Box3;
23
+ /**
24
+ * Largest on-screen height, in CSS pixels × Lod.quality, at which this level draws: Infinity for level 0, the finest;
25
+ * every later one at most (1 - Lod.fade) of its finer neighbour's, which leaves room for the fades. A deferred level
26
+ * needs one. A given level without one gets one measured from its surface deviation (see `simplify`, `bakeMesh`) or
27
+ * its impostor's texels, else half its finer neighbour's (512 for level 1), raised to leave room for the fades;
28
+ * `lod.levels` holds what it got.
29
+ */
30
+ maxPixels?: number;
31
+ /**
32
+ * Holds what the level's object comes from while a Lod draws it: every Lod made from the level, a copy or clone
33
+ * included, calls each distinct `hold` once as it is made, and the release it answers once it is disposed. CachedLodLoader's
34
+ * levels free what they loaded when the last release is called, which spends them: a Lod made from them later throws.
35
+ * CachedLodLoader's levels no Lod ever holds are never freed: they are yours until a Lod holds them.
36
+ */
37
+ hold?: () => () => void;
38
+ }
39
+ /** A level with its threshold, as `lod.levels` holds it. */
40
+ export type ThresholdedLevel = LodLevel & {
41
+ maxPixels: number;
42
+ };
43
+ /** Throws unless `levels` can be drawn: each given or deferred with a finite box, and thresholds as `LodLevel` says. */
44
+ export declare function checkLevels(levels: readonly ThresholdedLevel[], who: string): void;
45
+ /**
46
+ * `inputs` as `lod.levels` holds them: each object cloned, each threshold given or measured (see `LodLevel.maxPixels`)
47
+ * for a source `diameter` across. Throws unless they can be drawn.
48
+ */
49
+ export declare function levelsFrom(inputs: readonly LodLevel[], diameter: number, who: string): ThresholdedLevel[];
50
+ /** The bits of the levels that draw nothing: an empty object or box. */
51
+ export declare function emptyLevels(levels: readonly LodLevel[]): number;
52
+ /** Level `index`'s debug tint, or white. */
53
+ export declare const tintOf: (index: number, debug: boolean) => Color;
54
+ /** Surface deviation from the source, in the source's units. */
55
+ export declare const recordDeviation: (level: Object3D, deviation: number) => void;
56
+ export declare const deviationOf: (level: Object3D) => number | undefined;
57
+ /** What a level's default threshold is measured from: surface deviation, else impostor texels. */
58
+ interface Measured {
59
+ deviation?: number;
60
+ texels?: number;
61
+ }
62
+ export declare function measure(object: Object3D): Measured;
63
+ /** A level to find a threshold for: its own maxPixels, else what it measured. */
64
+ interface Measurable {
65
+ maxPixels?: number;
66
+ measured?: Measured;
67
+ }
68
+ /**
69
+ * Thresholds for `levels` of an object `diameter` across: each level's own maxPixels, else its measured surface
70
+ * deviation's or impostor texels' height, else half the previous one (512 for level 1), raised where needed to leave
71
+ * room for the fades. Throws if the result does not (see `checkLevels`).
72
+ */
73
+ export declare function resolveThresholds(levels: readonly Measurable[], diameter: number, who: string): number[];
74
+ /**
75
+ * A Lod's levels as levelsToDraw reads them (see `drawLevels`), checked and encoded again only when a
76
+ * threshold or the forced level has changed. What it returns is shared: read it, do not hold on to it.
77
+ */
78
+ export declare class EncodedLevels {
79
+ private readonly levels;
80
+ /** The bits of the levels that draw nothing. */
81
+ private readonly empty;
82
+ private readonly who;
83
+ private thresholds;
84
+ private forced;
85
+ /** For cameras that fade levels and for those that do not. */
86
+ private encoded;
87
+ constructor(levels: readonly ThresholdedLevel[],
88
+ /** The bits of the levels that draw nothing. */
89
+ empty: number, who: string);
90
+ /** The levels with `forced` the forced level, for a camera that `fades` levels or not. Throws unless they can be drawn. */
91
+ get(forced: number | null, fades: boolean): d.Infer<typeof DrawLevels>;
92
+ /**
93
+ * What `levels`, as `get` gave them, draw at each height with the levels of `loaded` loaded, all by default (see
94
+ * LevelHeights): worked out the first time it is asked, and anew with the levels.
95
+ */
96
+ heights(levels: d.Infer<typeof DrawLevels>, loaded?: number): LevelHeights;
97
+ private encode;
98
+ }
99
+ export {};
@@ -0,0 +1,155 @@
1
+ import { Color } from "three/webgpu";
2
+ import { at } from "../at.js";
3
+ import { levelBox } from "./bounds.js";
4
+ import { texelPixels } from "../impostor/impostor.js";
5
+ import { isImpostorMesh } from "../three.js";
6
+ import { FADE, MAX_LEVELS, drawLevels } from "./draw.js";
7
+ import { LevelHeights } from "./load.js";
8
+ /** Throws unless `levels` can be drawn: each given or deferred with a finite box, and thresholds as `LodLevel` says. */
9
+ export function checkLevels(levels, who) {
10
+ if (levels.length > MAX_LEVELS)
11
+ throw new Error(`${who}: ${levels.length} levels, but at most ${MAX_LEVELS}`);
12
+ levels.forEach(({ object, load, box }, i) => {
13
+ if (!object && !load)
14
+ throw new Error(`${who}: level ${i} has neither an object nor a load`);
15
+ if (!object && !box)
16
+ throw new Error(`${who}: deferred level ${i} needs a box`);
17
+ if (box && !box.isEmpty() && ![...box.min.toArray(), ...box.max.toArray()].every(Number.isFinite))
18
+ throw new Error(`${who}: level ${i}'s box must be finite`);
19
+ });
20
+ checkThresholds(levels.map(({ maxPixels }) => maxPixels), who);
21
+ }
22
+ /** Throws unless `thresholds` are maxPixels as `LodLevel` says. */
23
+ function checkThresholds(thresholds, who) {
24
+ thresholds.forEach((maxPixels, i) => {
25
+ if (i === 0 && maxPixels !== Infinity)
26
+ throw new Error(`${who}: level 0, the source, is used at any height: its maxPixels is Infinity, not ${maxPixels}`);
27
+ if (!(maxPixels > 0))
28
+ throw new Error(`${who}: maxPixels must be > 0, got ${maxPixels}`);
29
+ const finer = thresholds[i - 1];
30
+ if (finer !== undefined && maxPixels > finer * (1 - FADE))
31
+ throw new Error(`${who}: level ${i} has maxPixels ${maxPixels}, but at most ${finer * (1 - FADE)} (${1 - FADE} × level ${i - 1}'s ${finer}) leaves room for the fades`);
32
+ });
33
+ }
34
+ /**
35
+ * `inputs` as `lod.levels` holds them: each object cloned, each threshold given or measured (see `LodLevel.maxPixels`)
36
+ * for a source `diameter` across. Throws unless they can be drawn.
37
+ */
38
+ export function levelsFrom(inputs, diameter, who) {
39
+ const thresholds = resolveThresholds(inputs.map(({ object, maxPixels }) => ({ maxPixels, measured: object && maxPixels === undefined ? measure(object) : undefined })), diameter, who);
40
+ const levels = inputs.map((input, i) => ({ ...input, object: input.object?.clone(), maxPixels: at(thresholds, i) }));
41
+ checkLevels(levels, who);
42
+ return levels;
43
+ }
44
+ /** The bits of the levels that draw nothing: an empty object or box. */
45
+ export function emptyLevels(levels) {
46
+ return levels.reduce((bits, level, i) => (levelBox(level).isEmpty() ? bits | (1 << i) : bits), 0);
47
+ }
48
+ /** Debug tints by level index, see `Lod.debug`. */
49
+ const TINTS = [0xff6060, 0x60ff60, 0x6080ff, 0xffd040, 0xff60ff, 0x60ffff].map((hex) => new Color(hex));
50
+ const WHITE = new Color(1, 1, 1);
51
+ /** Level `index`'s debug tint, or white. */
52
+ export const tintOf = (index, debug) => (debug ? at(TINTS, index % TINTS.length) : WHITE);
53
+ /**
54
+ * Per simplified or baked object, its deviation: a side table, as three's objects have no typed place for it (userData
55
+ * is the app's).
56
+ */
57
+ const deviations = new WeakMap();
58
+ /** Surface deviation from the source, in the source's units. */
59
+ export const recordDeviation = (level, deviation) => void deviations.set(level, deviation);
60
+ export const deviationOf = (level) => deviations.get(level);
61
+ export function measure(object) {
62
+ return { deviation: deviationOf(object), texels: isImpostorMesh(object) ? texelPixels(object.impostor) : undefined };
63
+ }
64
+ /**
65
+ * Thresholds for `levels` of an object `diameter` across: each level's own maxPixels, else its measured surface
66
+ * deviation's or impostor texels' height, else half the previous one (512 for level 1), raised where needed to leave
67
+ * room for the fades. Throws if the result does not (see `checkLevels`).
68
+ */
69
+ export function resolveThresholds(levels, diameter, who) {
70
+ let finer = 1024;
71
+ const defaults = levels.map(({ maxPixels, measured }, index) => {
72
+ if (index === 0)
73
+ return Infinity;
74
+ const base = !measured
75
+ ? maxPixels
76
+ : measured.deviation !== undefined
77
+ ? diameter / Math.max(measured.deviation, diameter * 1e-4)
78
+ : (measured.texels ?? finer / 2);
79
+ if (base === undefined)
80
+ throw new Error(`${who}: deferred level ${index} needs maxPixels`);
81
+ finer = base;
82
+ return base;
83
+ });
84
+ const thresholds = levels.map(() => Infinity);
85
+ let next = 0;
86
+ for (let i = levels.length - 1; i > 0; i--) {
87
+ const value = levels[i]?.maxPixels ?? Math.max(at(defaults, i), 2 * next);
88
+ thresholds[i] = value;
89
+ next = value;
90
+ }
91
+ thresholds[0] = levels[0]?.maxPixels ?? Infinity;
92
+ checkThresholds(thresholds, who);
93
+ return thresholds;
94
+ }
95
+ /**
96
+ * A Lod's levels as levelsToDraw reads them (see `drawLevels`), checked and encoded again only when a
97
+ * threshold or the forced level has changed. What it returns is shared: read it, do not hold on to it.
98
+ */
99
+ export class EncodedLevels {
100
+ levels;
101
+ empty;
102
+ who;
103
+ thresholds = [];
104
+ forced = null;
105
+ /** For cameras that fade levels and for those that do not. */
106
+ encoded;
107
+ constructor(levels,
108
+ /** The bits of the levels that draw nothing. */
109
+ empty, who) {
110
+ this.levels = levels;
111
+ this.empty = empty;
112
+ this.who = who;
113
+ this.encoded = this.encode(null);
114
+ }
115
+ /** The levels with `forced` the forced level, for a camera that `fades` levels or not. Throws unless they can be drawn. */
116
+ get(forced, fades) {
117
+ let changed = forced !== this.forced;
118
+ for (let i = 0; i < this.levels.length && !changed; i++)
119
+ changed = this.levels[i]?.maxPixels !== this.thresholds[i];
120
+ if (changed)
121
+ this.encoded = this.encode(forced);
122
+ return (fades ? this.encoded.fading : this.encoded.still).levels;
123
+ }
124
+ /**
125
+ * What `levels`, as `get` gave them, draw at each height with the levels of `loaded` loaded, all by default (see
126
+ * LevelHeights): worked out the first time it is asked, and anew with the levels.
127
+ */
128
+ heights(levels, loaded = (1 << levels.count) - 1) {
129
+ const { fading, still } = this.encoded;
130
+ const encoding = levels === fading.levels ? fading : levels === still.levels ? still : null;
131
+ if (!encoding)
132
+ throw new Error(`${this.who}: heights of levels it did not encode, or no longer does`);
133
+ if (loaded === (1 << levels.count) - 1)
134
+ return (encoding.heights ??= new LevelHeights(levels));
135
+ const { loading } = encoding;
136
+ const found = loading.find((heights) => heights.loaded === loaded);
137
+ if (found)
138
+ return found;
139
+ const made = new LevelHeights(levels, loaded);
140
+ loading.unshift(made);
141
+ loading.length = Math.min(loading.length, 2);
142
+ return made;
143
+ }
144
+ encode(forced) {
145
+ const { levels, empty, who } = this;
146
+ checkLevels(levels, who);
147
+ if (forced !== null && !levels[forced])
148
+ throw new Error(`${who}: forceLevel ${forced} is not a level`);
149
+ this.thresholds = levels.map(({ maxPixels }) => maxPixels);
150
+ this.forced = forced;
151
+ const encoding = (fades) => ({ levels: drawLevels(levels, empty, forced, fades), heights: null, loading: [] });
152
+ return { fading: encoding(true), still: encoding(false) };
153
+ }
154
+ }
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/levels/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type LoadingManager, type Renderer } from "three/webgpu";
2
+ /**
3
+ * A Lod's item on a LoadingManager, held while it loads: the manager hears of it in a microtask, once the render that
4
+ * changed it has returned, so what an app's callback does, such as throw or render, happens outside three's render.
5
+ */
6
+ export declare class LoadingItem {
7
+ private readonly name;
8
+ /** The LoadingManager given; else three's default (see `manager`). */
9
+ given: LoadingManager | undefined;
10
+ /** The LoadingManager the held item started on, which it ends on. */
11
+ private holding;
12
+ /** Whether the Lod was updated since the item's last look at its renderer, the renders then, and whether a look is due. */
13
+ private updated;
14
+ private renders;
15
+ private looking;
16
+ /** `name` names the item: the Lod and its uuid. */
17
+ constructor(name: string);
18
+ /** Where the item goes. */
19
+ get manager(): LoadingManager;
20
+ /** A render updated the Lod: the next look at the renderer's renders does not end the item. */
21
+ touch(): void;
22
+ /**
23
+ * Hold the item if `held` and `renderer`, the one drawing the Lod, is known, else end it; while it is held, look at
24
+ * the renderer's renders (see `look`). Before a render has updated the Lod it holds none: a host loading the Lod
25
+ * renders it only once its LoadingManager is done.
26
+ */
27
+ sync(renderer: Renderer | null, held: boolean): void;
28
+ /** Report a failure on the LoadingManager the item is held on, and end the item. */
29
+ fail(): void;
30
+ private hold;
31
+ /**
32
+ * While the item is held, look a frame's time apart at the renderer's renders: a Lod its renderer rendered around for
33
+ * a frame without updating it (hidden, on a layer no camera tests, out of the scene) ends its item; its next update
34
+ * starts it again. Renders of other scenes in a separate task can end it early, and the next update reopens it; a
35
+ * renderer that only compiles holds a hidden Lod's item.
36
+ */
37
+ private look;
38
+ }
@@ -0,0 +1,89 @@
1
+ import { DefaultLoadingManager } from "three/webgpu";
2
+ /** How long a held item waits between looks at its renderer's renders (see `look`): a frame's time. */
3
+ const LOOK_MS = 16;
4
+ /**
5
+ * A Lod's item on a LoadingManager, held while it loads: the manager hears of it in a microtask, once the render that
6
+ * changed it has returned, so what an app's callback does, such as throw or render, happens outside three's render.
7
+ */
8
+ export class LoadingItem {
9
+ name;
10
+ /** The LoadingManager given; else three's default (see `manager`). */
11
+ given;
12
+ /** The LoadingManager the held item started on, which it ends on. */
13
+ holding;
14
+ /** Whether the Lod was updated since the item's last look at its renderer, the renders then, and whether a look is due. */
15
+ updated = false;
16
+ renders = 0;
17
+ looking = false;
18
+ /** `name` names the item: the Lod and its uuid. */
19
+ constructor(name) {
20
+ this.name = name;
21
+ }
22
+ /** Where the item goes. */
23
+ get manager() {
24
+ return this.given ?? DefaultLoadingManager;
25
+ }
26
+ /** A render updated the Lod: the next look at the renderer's renders does not end the item. */
27
+ touch() {
28
+ this.updated = true;
29
+ }
30
+ /**
31
+ * Hold the item if `held` and `renderer`, the one drawing the Lod, is known, else end it; while it is held, look at
32
+ * the renderer's renders (see `look`). Before a render has updated the Lod it holds none: a host loading the Lod
33
+ * renders it only once its LoadingManager is done.
34
+ */
35
+ sync(renderer, held) {
36
+ this.hold(held && renderer !== null);
37
+ if (!renderer || !this.holding || this.looking)
38
+ return;
39
+ // The first look only counts the renders: those still to come in this render are not without an update.
40
+ this.updated = true;
41
+ this.look(renderer);
42
+ }
43
+ /** Report a failure on the LoadingManager the item is held on, and end the item. */
44
+ fail() {
45
+ const manager = this.holding;
46
+ const { name } = this;
47
+ if (manager)
48
+ queueMicrotask(() => manager.itemError(name));
49
+ this.hold(false);
50
+ }
51
+ hold(held) {
52
+ if (held === (this.holding !== undefined))
53
+ return;
54
+ const { name } = this;
55
+ if (held) {
56
+ const manager = (this.holding = this.manager);
57
+ queueMicrotask(() => manager.itemStart(name));
58
+ return;
59
+ }
60
+ const manager = this.holding;
61
+ this.holding = undefined;
62
+ if (manager)
63
+ queueMicrotask(() => manager.itemEnd(name));
64
+ }
65
+ /**
66
+ * While the item is held, look a frame's time apart at the renderer's renders: a Lod its renderer rendered around for
67
+ * a frame without updating it (hidden, on a layer no camera tests, out of the scene) ends its item; its next update
68
+ * starts it again. Renders of other scenes in a separate task can end it early, and the next update reopens it; a
69
+ * renderer that only compiles holds a hidden Lod's item.
70
+ */
71
+ look(renderer) {
72
+ this.looking = true;
73
+ const timer = setTimeout(() => {
74
+ this.looking = false;
75
+ if (!this.holding)
76
+ return;
77
+ const renders = renderer.info.render.calls;
78
+ if (renders !== this.renders && !this.updated)
79
+ return this.hold(false);
80
+ this.renders = renders;
81
+ this.updated = false;
82
+ this.look(renderer);
83
+ }, LOOK_MS);
84
+ // A held item must not hold Node.js open.
85
+ if (typeof timer === "object" && timer !== null && "unref" in timer && typeof timer.unref === "function")
86
+ timer.unref();
87
+ }
88
+ }
89
+ //# sourceMappingURL=item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item.js","sourceRoot":"","sources":["../../src/levels/item.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { d } from "typegpu";
2
+ import { type Draw, type DrawLevels } from "./draw.js";
3
+ /**
4
+ * The bits of the levels to load for objects whose heights on a camera's screen lie in `ranges` (shortest and tallest,
5
+ * in px), read from `heights`, all levels loaded: every level a height in a range draws once all are loaded, the finer
6
+ * neighbour inside a fade included, and with any that draws something the coarsest level that draws something, which
7
+ * every draw waits for (see levelsToDraw). None where nothing draws.
8
+ */
9
+ export declare function levelsToLoad(ranges: Iterable<readonly [shortest: number, tallest: number]>, heights: LevelHeights): number;
10
+ /**
11
+ * The levels levelsToDraw draws with `levels` and the levels of `loaded` loaded, no arrival under way, at every height,
12
+ * by intervals of heights: worked out once, as it walks every cluster's heights each frame and each of its CPU calls
13
+ * through TypeGPU copies its arguments. What it draws changes only at a level's maxPixels and where its fade starts,
14
+ * whatever is loaded (which only says what stands in for a level): it is asked at the ends of a few f32 steps around
15
+ * each such height, and between them where it changes. levelsToDraw stays the only answer; this is where it changes.
16
+ */
17
+ export declare class LevelHeights {
18
+ readonly levels: d.Infer<typeof DrawLevels>;
19
+ readonly loaded: number;
20
+ /** The last f32 height of every interval but the last, ascending. */
21
+ private readonly ends;
22
+ /** The bits of the levels each interval draws: its level, and inside a fade the finer one too. */
23
+ private readonly drawn;
24
+ constructor(levels: d.Infer<typeof DrawLevels>, loaded?: number);
25
+ /** The bits of the levels objects from `shortest` to `tallest` px tall draw. */
26
+ drawnIn(shortest: number, tallest: number): number;
27
+ /** The interval holding `height`. */
28
+ private interval;
29
+ }
30
+ /** The bits of the levels `draw` draws: its level, and its finer one while it fades; none for level -1. */
31
+ export declare function drawnBits({ level, finer, fade }: d.Infer<typeof Draw>): number;
@@ -0,0 +1,144 @@
1
+ import { at } from "../at.js";
2
+ import { ANY_HEIGHT, FADE, levelsToDraw } from "./draw.js";
3
+ // Which levels a camera needs loaded, and which it can draw.
4
+ /**
5
+ * The bits of the levels to load for objects whose heights on a camera's screen lie in `ranges` (shortest and tallest,
6
+ * in px), read from `heights`, all levels loaded: every level a height in a range draws once all are loaded, the finer
7
+ * neighbour inside a fade included, and with any that draws something the coarsest level that draws something, which
8
+ * every draw waits for (see levelsToDraw). None where nothing draws.
9
+ */
10
+ export function levelsToLoad(ranges, heights) {
11
+ const { count, empty, coarsest } = heights.levels;
12
+ const all = (1 << count) - 1;
13
+ let wanted = 0;
14
+ for (const [shortest, tallest] of ranges) {
15
+ wanted |= heights.drawnIn(shortest, tallest);
16
+ // Every level that draws something is wanted already.
17
+ if ((wanted & ~empty) === (all & ~empty))
18
+ break;
19
+ }
20
+ return wanted & ~empty ? wanted | (1 << coarsest) : wanted;
21
+ }
22
+ /**
23
+ * How far, in f32 steps, a height where what levelsToDraw draws changes may lie from where `windowsOf` puts it: on the
24
+ * CPU, TypeGPU rounds heights and maxPixels to f32 and computes a fade's start from them, which moves it by a step.
25
+ */
26
+ const SLACK = 4;
27
+ /**
28
+ * The levels levelsToDraw draws with `levels` and the levels of `loaded` loaded, no arrival under way, at every height,
29
+ * by intervals of heights: worked out once, as it walks every cluster's heights each frame and each of its CPU calls
30
+ * through TypeGPU copies its arguments. What it draws changes only at a level's maxPixels and where its fade starts,
31
+ * whatever is loaded (which only says what stands in for a level): it is asked at the ends of a few f32 steps around
32
+ * each such height, and between them where it changes. levelsToDraw stays the only answer; this is where it changes.
33
+ */
34
+ export class LevelHeights {
35
+ levels;
36
+ loaded;
37
+ /** The last f32 height of every interval but the last, ascending. */
38
+ ends = [];
39
+ /** The bits of the levels each interval draws: its level, and inside a fade the finer one too. */
40
+ drawn = [];
41
+ constructor(levels, loaded = (1 << levels.count) - 1) {
42
+ this.levels = levels;
43
+ this.loaded = loaded;
44
+ const ask = (height) => drawnBits(levelsToDraw(height, levels, loaded, loaded, 1));
45
+ let below = ask(0);
46
+ this.drawn.push(below);
47
+ for (const [low, high] of windowsOf(levels)) {
48
+ if (ask(low) !== below)
49
+ throw new Error("Lod: levelsToDraw changes away from every maxPixels and fade start");
50
+ const above = ask(high);
51
+ // Every change inside the window: the last f32 height that draws what is below it, found by halving.
52
+ for (let from = low; below !== above;) {
53
+ let last = from;
54
+ let past = high;
55
+ while (step(last, 1) < past) {
56
+ const middle = halfway(last, past);
57
+ if (ask(middle) === below)
58
+ last = middle;
59
+ else
60
+ past = middle;
61
+ }
62
+ below = ask(past);
63
+ this.ends.push(last);
64
+ this.drawn.push(below);
65
+ from = past;
66
+ }
67
+ }
68
+ // levelsToDraw takes no infinite f32: the largest finite one stands for every height above.
69
+ if (ask(ANY_HEIGHT) !== below)
70
+ throw new Error("Lod: levelsToDraw changes above every maxPixels");
71
+ }
72
+ /** The bits of the levels objects from `shortest` to `tallest` px tall draw. */
73
+ drawnIn(shortest, tallest) {
74
+ const last = this.interval(tallest);
75
+ let bits = 0;
76
+ for (let i = this.interval(shortest); i <= last; i++)
77
+ bits |= at(this.drawn, i);
78
+ return bits;
79
+ }
80
+ /** The interval holding `height`. */
81
+ interval(height) {
82
+ // levelsToDraw reads a height as an f32.
83
+ const value = Math.fround(height);
84
+ const { ends } = this;
85
+ let index = 0;
86
+ let end = ends.length;
87
+ while (index < end) {
88
+ const middle = (index + end) >>> 1;
89
+ if (value > at(ends, middle))
90
+ index = middle + 1;
91
+ else
92
+ end = middle;
93
+ }
94
+ return index;
95
+ }
96
+ }
97
+ /** The bits of the levels `draw` draws: its level, and its finer one while it fades; none for level -1. */
98
+ export function drawnBits({ level, finer, fade }) {
99
+ if (level < 0)
100
+ return 0;
101
+ return (1 << level) | (fade > 0 ? 1 << finer : 0);
102
+ }
103
+ /**
104
+ * The f32 heights around which what levelsToDraw draws with `levels` may change, `SLACK` steps either side, ascending
105
+ * and merged where they overlap: every level's maxPixels but the source's, and where its fade starts.
106
+ */
107
+ function windowsOf(levels) {
108
+ const edges = [];
109
+ levels.maxPixels.forEach((maxPixels, level) => {
110
+ if (level === 0 || level >= levels.count)
111
+ return;
112
+ edges.push(Math.fround(maxPixels), Math.fround(Math.fround(maxPixels) * (1 - FADE)));
113
+ });
114
+ edges.sort((a, b) => a - b);
115
+ const windows = [];
116
+ for (const edge of edges) {
117
+ const low = step(edge, -SLACK);
118
+ const last = windows.at(-1);
119
+ if (last && low <= last[1])
120
+ last[1] = step(edge, SLACK);
121
+ else
122
+ windows.push([low, step(edge, SLACK)]);
123
+ }
124
+ return windows;
125
+ }
126
+ const float = new Float32Array(1);
127
+ const bits = new Uint32Array(float.buffer);
128
+ /** The bits of ANY_HEIGHT, the largest finite f32. */
129
+ const LARGEST = 0x7f7fffff;
130
+ /** The f32 `steps` steps from `value`, a height at or above 0, not below 0 nor above ANY_HEIGHT. */
131
+ function step(value, steps) {
132
+ float[0] = value;
133
+ bits[0] = Math.min(Math.max(at(bits, 0) + steps, 0), LARGEST);
134
+ return at(float, 0);
135
+ }
136
+ /** An f32 between the f32s `low` and `high`, two or more steps apart, at or above 0. */
137
+ function halfway(low, high) {
138
+ float[0] = low;
139
+ const from = at(bits, 0);
140
+ float[0] = high;
141
+ bits[0] = from + Math.floor((at(bits, 0) - from) / 2);
142
+ return at(float, 0);
143
+ }
144
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/levels/load.ts"],"names":[],"mappings":"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"}