@drawcall/lod 0.2.0 → 0.3.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 (364) hide show
  1. package/README.md +8 -6
  2. package/dist/bake.d.ts +22 -0
  3. package/dist/bake.js +88 -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 +12 -6
  15. package/dist/baked/index.js +22 -20
  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 +13 -10
  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.js +1 -1
  24. package/dist/baked/interior/rooms.js.map +1 -1
  25. package/dist/baked/low.js +5 -4
  26. package/dist/baked/low.js.map +1 -1
  27. package/dist/baked/raster.js +6 -6
  28. package/dist/baked/raster.js.map +1 -1
  29. package/dist/baked/textures.d.ts +17 -0
  30. package/dist/baked/textures.js +95 -0
  31. package/dist/baked/textures.js.map +1 -0
  32. package/dist/baked/transfer.js +19 -18
  33. package/dist/baked/transfer.js.map +1 -1
  34. package/dist/baked/unwrap.js +4 -3
  35. package/dist/baked/unwrap.js.map +1 -1
  36. package/dist/baked/xatlas.js.map +1 -1
  37. package/dist/codec/container.d.ts +8 -0
  38. package/dist/codec/container.js +63 -0
  39. package/dist/codec/container.js.map +1 -0
  40. package/dist/codec/mesh.d.ts +8 -0
  41. package/dist/{mesh/codec.js → codec/mesh.js} +80 -52
  42. package/dist/codec/mesh.js.map +1 -0
  43. package/dist/dispose.d.ts +7 -4
  44. package/dist/dispose.js +20 -22
  45. package/dist/dispose.js.map +1 -1
  46. package/dist/gpu.d.ts +39 -0
  47. package/dist/gpu.js +41 -0
  48. package/dist/gpu.js.map +1 -0
  49. package/dist/impostor/bake/atlas.d.ts +4 -4
  50. package/dist/impostor/bake/atlas.js +12 -12
  51. package/dist/impostor/bake/atlas.js.map +1 -1
  52. package/dist/impostor/bake/fit.d.ts +8 -0
  53. package/dist/impostor/bake/fit.js +28 -0
  54. package/dist/impostor/bake/fit.js.map +1 -0
  55. package/dist/impostor/bake/index.d.ts +22 -14
  56. package/dist/impostor/bake/index.js +41 -134
  57. package/dist/impostor/bake/index.js.map +1 -1
  58. package/dist/impostor/bake/materials.d.ts +3 -3
  59. package/dist/impostor/bake/materials.js +51 -13
  60. package/dist/impostor/bake/materials.js.map +1 -1
  61. package/dist/impostor/bake/sheet.d.ts +8 -0
  62. package/dist/impostor/bake/sheet.js +90 -0
  63. package/dist/impostor/bake/sheet.js.map +1 -0
  64. package/dist/impostor/bake/source.d.ts +2 -2
  65. package/dist/impostor/bake/source.js +8 -19
  66. package/dist/impostor/bake/source.js.map +1 -1
  67. package/dist/impostor/codec.d.ts +4 -5
  68. package/dist/impostor/codec.js +36 -109
  69. package/dist/impostor/codec.js.map +1 -1
  70. package/dist/impostor/impostor.d.ts +31 -7
  71. package/dist/impostor/impostor.js +21 -6
  72. package/dist/impostor/impostor.js.map +1 -1
  73. package/dist/impostor/ktx2/encode.d.ts +26 -0
  74. package/dist/impostor/ktx2/encode.js +117 -0
  75. package/dist/impostor/ktx2/encode.js.map +1 -0
  76. package/dist/impostor/ktx2/transcode.d.ts +3 -0
  77. package/dist/impostor/ktx2/transcode.js +99 -0
  78. package/dist/impostor/ktx2/transcode.js.map +1 -0
  79. package/dist/impostor/ktx2/uastc.d.ts +7 -0
  80. package/dist/impostor/ktx2/uastc.js +64 -0
  81. package/dist/impostor/ktx2/uastc.js.map +1 -0
  82. package/dist/impostor/ktx2/wasm/encoder.d.ts +4 -0
  83. package/dist/impostor/ktx2/wasm/encoder.js +10 -0
  84. package/dist/impostor/ktx2/wasm/encoder.js.map +1 -0
  85. package/dist/impostor/ktx2/wasm/transcoder.d.ts +3 -0
  86. package/dist/impostor/ktx2/wasm/transcoder.js +9 -0
  87. package/dist/impostor/ktx2/wasm/transcoder.js.map +1 -0
  88. package/dist/impostor/ktx2/worker.d.ts +1 -0
  89. package/dist/impostor/ktx2/worker.js +12 -0
  90. package/dist/impostor/ktx2/worker.js.map +1 -0
  91. package/dist/impostor/mesh/card.d.ts +3 -3
  92. package/dist/impostor/mesh/card.js +7 -7
  93. package/dist/impostor/mesh/card.js.map +1 -1
  94. package/dist/impostor/mesh/index.d.ts +5 -4
  95. package/dist/impostor/mesh/index.js +8 -9
  96. package/dist/impostor/mesh/index.js.map +1 -1
  97. package/dist/impostor/mesh/material.d.ts +18 -9
  98. package/dist/impostor/mesh/material.js +40 -27
  99. package/dist/impostor/mesh/material.js.map +1 -1
  100. package/dist/impostor/mesh/surface.d.ts +1 -1
  101. package/dist/impostor/mesh/surface.js +13 -9
  102. package/dist/impostor/mesh/surface.js.map +1 -1
  103. package/dist/impostor/mesh/textures.d.ts +3 -3
  104. package/dist/impostor/mesh/textures.js +24 -34
  105. package/dist/impostor/mesh/textures.js.map +1 -1
  106. package/dist/index.d.ts +15 -10
  107. package/dist/index.js +13 -8
  108. package/dist/index.js.map +1 -1
  109. package/dist/instanced/camera.d.ts +46 -0
  110. package/dist/instanced/camera.js +70 -0
  111. package/dist/instanced/camera.js.map +1 -0
  112. package/dist/instanced/chunk.d.ts +97 -0
  113. package/dist/instanced/chunk.js +156 -0
  114. package/dist/instanced/chunk.js.map +1 -0
  115. package/dist/instanced/chunks.d.ts +60 -0
  116. package/dist/instanced/chunks.js +208 -0
  117. package/dist/instanced/chunks.js.map +1 -0
  118. package/dist/instanced/cull.d.ts +28 -0
  119. package/dist/instanced/cull.js +22 -0
  120. package/dist/instanced/cull.js.map +1 -0
  121. package/dist/instanced/index.d.ts +96 -66
  122. package/dist/instanced/index.js +229 -288
  123. package/dist/instanced/index.js.map +1 -1
  124. package/dist/instanced/key.d.ts +19 -0
  125. package/dist/instanced/key.js +45 -0
  126. package/dist/instanced/key.js.map +1 -0
  127. package/dist/instanced/levels.d.ts +60 -0
  128. package/dist/instanced/levels.js +130 -0
  129. package/dist/instanced/levels.js.map +1 -0
  130. package/dist/instanced/lists.d.ts +70 -0
  131. package/dist/instanced/lists.js +133 -0
  132. package/dist/instanced/lists.js.map +1 -0
  133. package/dist/instanced/measure.d.ts +28 -0
  134. package/dist/instanced/measure.js +203 -0
  135. package/dist/instanced/measure.js.map +1 -0
  136. package/dist/instanced/meshes.d.ts +42 -51
  137. package/dist/instanced/meshes.js +158 -180
  138. package/dist/instanced/meshes.js.map +1 -1
  139. package/dist/instanced/mirror.d.ts +20 -0
  140. package/dist/instanced/mirror.js +37 -0
  141. package/dist/instanced/mirror.js.map +1 -0
  142. package/dist/instanced/pages/buffers.d.ts +37 -0
  143. package/dist/instanced/pages/buffers.js +15 -0
  144. package/dist/instanced/pages/buffers.js.map +1 -0
  145. package/dist/instanced/pages/chunk.d.ts +51 -0
  146. package/dist/instanced/pages/chunk.js +81 -0
  147. package/dist/instanced/pages/chunk.js.map +1 -0
  148. package/dist/instanced/pages/index.d.ts +74 -0
  149. package/dist/instanced/pages/index.js +269 -0
  150. package/dist/instanced/pages/index.js.map +1 -0
  151. package/dist/instanced/pages/passes.d.ts +21 -0
  152. package/dist/instanced/pages/passes.js +52 -0
  153. package/dist/instanced/pages/passes.js.map +1 -0
  154. package/dist/instanced/pages/slots.d.ts +11 -0
  155. package/dist/instanced/pages/slots.js +90 -0
  156. package/dist/instanced/pages/slots.js.map +1 -0
  157. package/dist/instanced/pages/workgroup.d.ts +14 -0
  158. package/dist/instanced/pages/workgroup.js +38 -0
  159. package/dist/instanced/pages/workgroup.js.map +1 -0
  160. package/dist/instanced/raycast.d.ts +13 -11
  161. package/dist/instanced/raycast.js +33 -40
  162. package/dist/instanced/raycast.js.map +1 -1
  163. package/dist/instanced/rows.d.ts +108 -0
  164. package/dist/instanced/rows.js +209 -0
  165. package/dist/instanced/rows.js.map +1 -0
  166. package/dist/instanced/shape.d.ts +25 -0
  167. package/dist/instanced/shape.js +51 -0
  168. package/dist/instanced/shape.js.map +1 -0
  169. package/dist/instanced/sort.d.ts +63 -0
  170. package/dist/instanced/sort.js +162 -0
  171. package/dist/instanced/sort.js.map +1 -0
  172. package/dist/instanced/update.d.ts +30 -0
  173. package/dist/instanced/update.js +207 -0
  174. package/dist/instanced/update.js.map +1 -0
  175. package/dist/levels/bounds.d.ts +21 -0
  176. package/dist/levels/bounds.js +42 -0
  177. package/dist/levels/bounds.js.map +1 -0
  178. package/dist/levels/cameras.d.ts +48 -0
  179. package/dist/levels/cameras.js +122 -0
  180. package/dist/levels/cameras.js.map +1 -0
  181. package/dist/levels/compile/contexts.d.ts +30 -0
  182. package/dist/levels/compile/contexts.js +18 -0
  183. package/dist/levels/compile/contexts.js.map +1 -0
  184. package/dist/levels/compile/index.d.ts +39 -0
  185. package/dist/levels/compile/index.js +185 -0
  186. package/dist/levels/compile/index.js.map +1 -0
  187. package/dist/levels/compile/pipelines.d.ts +26 -0
  188. package/dist/levels/compile/pipelines.js +177 -0
  189. package/dist/levels/compile/pipelines.js.map +1 -0
  190. package/dist/levels/compiles.d.ts +29 -0
  191. package/dist/levels/compiles.js +50 -0
  192. package/dist/levels/compiles.js.map +1 -0
  193. package/dist/levels/draw.d.ts +102 -0
  194. package/dist/levels/draw.js +401 -0
  195. package/dist/levels/draw.js.map +1 -0
  196. package/dist/levels/fade.d.ts +69 -0
  197. package/dist/levels/fade.js +150 -0
  198. package/dist/levels/fade.js.map +1 -0
  199. package/dist/levels/index.d.ts +99 -0
  200. package/dist/levels/index.js +155 -0
  201. package/dist/levels/index.js.map +1 -0
  202. package/dist/levels/item.d.ts +38 -0
  203. package/dist/levels/item.js +97 -0
  204. package/dist/levels/item.js.map +1 -0
  205. package/dist/levels/load.d.ts +31 -0
  206. package/dist/levels/load.js +142 -0
  207. package/dist/levels/load.js.map +1 -0
  208. package/dist/levels/manager.d.ts +159 -0
  209. package/dist/levels/manager.js +339 -0
  210. package/dist/levels/manager.js.map +1 -0
  211. package/dist/{material.js → levels/material.js} +4 -3
  212. package/dist/levels/material.js.map +1 -0
  213. package/dist/levels/renderer.d.ts +29 -0
  214. package/dist/levels/renderer.js +41 -0
  215. package/dist/levels/renderer.js.map +1 -0
  216. package/dist/levels/requests.d.ts +49 -0
  217. package/dist/levels/requests.js +95 -0
  218. package/dist/levels/requests.js.map +1 -0
  219. package/dist/levels/screen.d.ts +14 -0
  220. package/dist/levels/screen.js +21 -0
  221. package/dist/levels/screen.js.map +1 -0
  222. package/dist/levels/wait.d.ts +27 -0
  223. package/dist/levels/wait.js +61 -0
  224. package/dist/levels/wait.js.map +1 -0
  225. package/dist/loader/build.d.ts +10 -0
  226. package/dist/loader/build.js +28 -0
  227. package/dist/loader/build.js.map +1 -0
  228. package/dist/loader/cache.d.ts +6 -9
  229. package/dist/loader/cache.js +17 -24
  230. package/dist/loader/cache.js.map +1 -1
  231. package/dist/loader/context.d.ts +46 -0
  232. package/dist/loader/context.js +91 -0
  233. package/dist/loader/context.js.map +1 -0
  234. package/dist/loader/{provenance.d.ts → dependencies.d.ts} +5 -3
  235. package/dist/loader/{provenance.js → dependencies.js} +12 -4
  236. package/dist/loader/dependencies.js.map +1 -0
  237. package/dist/loader/index.d.ts +62 -0
  238. package/dist/loader/index.js +284 -0
  239. package/dist/loader/index.js.map +1 -0
  240. package/dist/loader/level.d.ts +41 -0
  241. package/dist/loader/level.js +140 -0
  242. package/dist/loader/level.js.map +1 -0
  243. package/dist/loader/request.d.ts +87 -0
  244. package/dist/loader/request.js +59 -0
  245. package/dist/loader/request.js.map +1 -0
  246. package/dist/loader/url.d.ts +5 -2
  247. package/dist/loader/url.js +10 -6
  248. package/dist/loader/url.js.map +1 -1
  249. package/dist/lod.d.ts +81 -40
  250. package/dist/lod.js +196 -149
  251. package/dist/lod.js.map +1 -1
  252. package/dist/meshopt.d.ts +6 -0
  253. package/dist/meshopt.js +19 -0
  254. package/dist/meshopt.js.map +1 -0
  255. package/dist/simplify/cards.d.ts +14 -0
  256. package/dist/simplify/cards.js +128 -0
  257. package/dist/simplify/cards.js.map +1 -0
  258. package/dist/{simplify.d.ts → simplify/index.d.ts} +7 -4
  259. package/dist/{simplify.js → simplify/index.js} +41 -23
  260. package/dist/simplify/index.js.map +1 -0
  261. package/dist/{bounds.d.ts → source/detail.d.ts} +4 -23
  262. package/dist/{bounds.js → source/detail.js} +19 -51
  263. package/dist/source/detail.js.map +1 -0
  264. package/dist/source/deviation.js +6 -6
  265. package/dist/source/deviation.js.map +1 -1
  266. package/dist/source/{shading.d.ts → evaluator.d.ts} +10 -10
  267. package/dist/source/{shading.js → evaluator.js} +5 -5
  268. package/dist/source/evaluator.js.map +1 -0
  269. package/dist/source/{trace.d.ts → raycaster.d.ts} +6 -6
  270. package/dist/source/{trace.js → raycaster.js} +8 -8
  271. package/dist/source/raycaster.js.map +1 -0
  272. package/dist/source/{texels.d.ts → sampler.d.ts} +1 -1
  273. package/dist/source/{texels.js → sampler.js} +3 -3
  274. package/dist/source/sampler.js.map +1 -0
  275. package/dist/source/source.d.ts +1 -1
  276. package/dist/source/source.js +1 -1
  277. package/dist/source/source.js.map +1 -1
  278. package/dist/source/surface.js +1 -1
  279. package/dist/source/surface.js.map +1 -1
  280. package/dist/task.d.ts +6 -0
  281. package/dist/{pause.js → task.js} +5 -5
  282. package/dist/task.js.map +1 -0
  283. package/dist/three.d.ts +13 -24
  284. package/dist/three.js +26 -53
  285. package/dist/three.js.map +1 -1
  286. package/dist/tsl.d.ts +8 -12
  287. package/dist/tsl.js +11 -39
  288. package/dist/tsl.js.map +1 -1
  289. package/dist/typegpu.d.ts +37 -0
  290. package/dist/typegpu.js +37 -0
  291. package/dist/typegpu.js.map +1 -0
  292. package/dist/wind/bounds.js +2 -2
  293. package/dist/wind/bounds.js.map +1 -1
  294. package/dist/wind/hooks.d.ts +7 -4
  295. package/dist/wind/hooks.js +5 -2
  296. package/dist/wind/hooks.js.map +1 -1
  297. package/dist/wind/index.d.ts +2 -2
  298. package/dist/wind/index.js +15 -15
  299. package/dist/wind/index.js.map +1 -1
  300. package/dist/wind/sway.d.ts +2 -0
  301. package/dist/wind/sway.js +4 -1
  302. package/dist/wind/sway.js.map +1 -1
  303. package/package.json +18 -8
  304. package/skills/lod/SKILL.md +108 -31
  305. package/dist/bounds.js.map +0 -1
  306. package/dist/compile.d.ts +0 -4
  307. package/dist/compile.js +0 -100
  308. package/dist/compile.js.map +0 -1
  309. package/dist/deferred.d.ts +0 -12
  310. package/dist/deferred.js +0 -27
  311. package/dist/deferred.js.map +0 -1
  312. package/dist/fade.d.ts +0 -36
  313. package/dist/fade.js +0 -112
  314. package/dist/fade.js.map +0 -1
  315. package/dist/instanced/args.d.ts +0 -20
  316. package/dist/instanced/args.js +0 -77
  317. package/dist/instanced/args.js.map +0 -1
  318. package/dist/instanced/blocks.d.ts +0 -66
  319. package/dist/instanced/blocks.js +0 -294
  320. package/dist/instanced/blocks.js.map +0 -1
  321. package/dist/instanced/dirty.d.ts +0 -15
  322. package/dist/instanced/dirty.js +0 -96
  323. package/dist/instanced/dirty.js.map +0 -1
  324. package/dist/instanced/parts.d.ts +0 -14
  325. package/dist/instanced/parts.js +0 -79
  326. package/dist/instanced/parts.js.map +0 -1
  327. package/dist/instanced/select.d.ts +0 -92
  328. package/dist/instanced/select.js +0 -315
  329. package/dist/instanced/select.js.map +0 -1
  330. package/dist/instanced/store.d.ts +0 -31
  331. package/dist/instanced/store.js +0 -96
  332. package/dist/instanced/store.js.map +0 -1
  333. package/dist/levels.d.ts +0 -95
  334. package/dist/levels.js +0 -171
  335. package/dist/levels.js.map +0 -1
  336. package/dist/loader/bundle.d.ts +0 -25
  337. package/dist/loader/bundle.js +0 -241
  338. package/dist/loader/bundle.js.map +0 -1
  339. package/dist/loader/provenance.js.map +0 -1
  340. package/dist/loader.d.ts +0 -55
  341. package/dist/loader.js +0 -239
  342. package/dist/loader.js.map +0 -1
  343. package/dist/material.js.map +0 -1
  344. package/dist/mesh/codec.d.ts +0 -4
  345. package/dist/mesh/codec.js.map +0 -1
  346. package/dist/pause.d.ts +0 -6
  347. package/dist/pause.js.map +0 -1
  348. package/dist/queue.d.ts +0 -2
  349. package/dist/queue.js +0 -33
  350. package/dist/queue.js.map +0 -1
  351. package/dist/renderer.d.ts +0 -21
  352. package/dist/renderer.js +0 -83
  353. package/dist/renderer.js.map +0 -1
  354. package/dist/residency.d.ts +0 -44
  355. package/dist/residency.js +0 -205
  356. package/dist/residency.js.map +0 -1
  357. package/dist/simplify.js.map +0 -1
  358. package/dist/source/shading.js.map +0 -1
  359. package/dist/source/texels.js.map +0 -1
  360. package/dist/source/trace.js.map +0 -1
  361. package/dist/view.d.ts +0 -45
  362. package/dist/view.js +0 -131
  363. package/dist/view.js.map +0 -1
  364. /package/dist/{material.d.ts → levels/material.d.ts} +0 -0
@@ -1,79 +0,0 @@
1
- import { Matrix4 } from "three/webgpu";
2
- import { levelMaterial } from "../material.js";
3
- import { isImpostorMesh, isInstancedMesh, isLOD, isMesh, rejectSkinned } from "../three.js";
4
- // A level template split into the parts an InstancedLod draws, placed in the instance's space.
5
- const IDENTITY = new Matrix4();
6
- /** Template meshes and material groups, placed once in the instance's space. */
7
- export function parts(object, level) {
8
- rejectSkinned(object, "InstancedLod");
9
- object.updateWorldMatrix(true, true);
10
- const outside = object.parent ? object.parent.matrixWorld.clone().invert() : new Matrix4();
11
- const found = [];
12
- object.traverse((node) => {
13
- if (isLOD(node))
14
- throw new Error("InstancedLod: levels cannot contain a Lod or InstancedLod; nest them with Lod");
15
- if (isInstancedMesh(node) && !isImpostorMesh(node))
16
- throw new Error(`InstancedLod: levels cannot contain an InstancedMesh ("${node.name}")`);
17
- if (!isMesh(node))
18
- return;
19
- const placement = outside.clone().multiply(node.matrixWorld);
20
- ranges(node).forEach((range, group) => found.push({ template: node, placement, group, draw: { level, ...range } }));
21
- });
22
- return found;
23
- }
24
- /** The index (or vertex) ranges `mesh` draws, clipped to its draw range; group order is preserved even for empty draws. */
25
- function ranges(mesh) {
26
- const { geometry } = mesh;
27
- const indexed = geometry.index !== null;
28
- const total = geometry.index?.count ?? geometry.getAttribute("position").count;
29
- const groups = Array.isArray(mesh.material) ? geometry.groups : [{ start: 0, count: total }];
30
- return groups.map(({ start, count }) => {
31
- const first = Math.min(total, Math.max(0, start, geometry.drawRange.start));
32
- const end = Math.min(total, start + count, geometry.drawRange.start + geometry.drawRange.count);
33
- return { count: Math.max(0, end - first), start: first, indexed };
34
- });
35
- }
36
- /** The faded material of `mesh`'s material group `group`. */
37
- export function groupMaterial(mesh, group) {
38
- if (!Array.isArray(mesh.material))
39
- return levelMaterial(mesh.material);
40
- const index = mesh.geometry.groups[group]?.materialIndex ?? 0;
41
- const material = mesh.material[index];
42
- if (!material)
43
- throw new Error(`InstancedLod: "${mesh.name}" has no material ${index}`);
44
- return levelMaterial(material);
45
- }
46
- /** Placed copies of geometries, shared by every InstancedLod drawing the same mesh the same way. */
47
- const copies = new WeakMap();
48
- /** `geometry` moved by `placement`: itself for the identity, else a copy made once. */
49
- export function placed(geometry, placement) {
50
- if (placement.equals(IDENTITY))
51
- return geometry;
52
- const known = copies.get(geometry) ?? [];
53
- copies.set(geometry, known);
54
- const hit = known.find((entry) => entry.placement.equals(placement));
55
- if (hit)
56
- return hit.geometry;
57
- const copy = geometry.clone();
58
- const box = copy.boundingBox;
59
- const sphere = copy.boundingSphere;
60
- // applyMatrix4 otherwise recomputes both bounds by walking the transformed vertices.
61
- copy.boundingBox = null;
62
- copy.boundingSphere = null;
63
- // Translations leave normals and tangents unchanged; scanning them stalls large source arrivals.
64
- if (placement.clone().setPosition(0, 0, 0).equals(IDENTITY)) {
65
- const position = copy.getAttribute("position");
66
- if (position) {
67
- position.applyMatrix4(placement);
68
- position.needsUpdate = true;
69
- }
70
- }
71
- else
72
- copy.applyMatrix4(placement);
73
- copy.boundingBox = box?.applyMatrix4(placement) ?? null;
74
- copy.boundingSphere = sphere?.applyMatrix4(placement) ?? null;
75
- geometry.addEventListener("dispose", () => copy.dispose());
76
- known.push({ placement: placement.clone(), geometry: copy });
77
- return copy;
78
- }
79
- //# sourceMappingURL=parts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/instanced/parts.ts"],"names":[],"mappings":"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"}
@@ -1,92 +0,0 @@
1
- import { type IndirectStorageBufferAttribute, StorageBufferAttribute, StorageInstancedBufferAttribute, Vector3, type ComputeNode, type Node, type Renderer, type Sphere } from "three/webgpu";
2
- /** The slots every level draws from, `count` per level that draws, from its `first`. */
3
- interface Slots {
4
- readonly matrices: StorageInstancedBufferAttribute;
5
- readonly fades: StorageBufferAttribute;
6
- /** RGB and a pad per slot, once the instances have colours */
7
- colors: StorageInstancedBufferAttribute | null;
8
- }
9
- /** One indirect draw: a level's mesh, drawing `count` indices (or vertices) from `start`. */
10
- export interface IndirectDraw {
11
- level: number;
12
- count: number;
13
- start: number;
14
- indexed: boolean;
15
- }
16
- export declare class Selection {
17
- private draws;
18
- /** The instances' matrices, as `setMatrixAt` writes them. */
19
- readonly matrices: StorageBufferAttribute;
20
- /** The instances' colours (RGB, padded to four floats), once there are any. */
21
- colors: StorageBufferAttribute | null;
22
- readonly count: number;
23
- readonly slots: Slots;
24
- /** Per level, its first slot, or null for a level that draws nothing. */
25
- readonly first: Array<number | null>;
26
- /** Shared page containing this selection's draws, `ARGS_BYTES` apart. */
27
- get args(): IndirectStorageBufferAttribute;
28
- /** Byte offset of this selection's first draw in its page. */
29
- get argsOffset(): number;
30
- readonly eye: import("three/webgpu").UniformNode<"vec3", Vector3>;
31
- /** Pixels per unit of subtense (perspective) or of size (orthographic), × Lod.quality. */
32
- readonly scale: import("three/webgpu").UniformNode<"float", number>;
33
- readonly ortho: import("three/webgpu").UniformNode<"uint", number>;
34
- readonly fades: import("three/webgpu").UniformNode<"uint", number>;
35
- /** The level every instance draws, or -1. */
36
- readonly forced: import("three/webgpu").UniformNode<"int", number>;
37
- /** Per level, its maxPixels (any finite stand-in for level 0's Infinity). */
38
- readonly maxPixels: Array<{
39
- value: number;
40
- } & Node<"float">>;
41
- private readonly counts;
42
- private slice;
43
- private readonly routes;
44
- private readonly previous;
45
- private readonly starts;
46
- private readonly bounds;
47
- readonly progress: import("three/webgpu").UniformNode<"float", number>;
48
- private readonly drawCount;
49
- private readonly records;
50
- private readonly arguments;
51
- private readonly argsStart;
52
- private kernels;
53
- /**
54
- * The renderers whose buffers hold the selection for the view and instances as they are
55
- * (each renderer keeps its own copy of the buffers): see `aim` and `changed`.
56
- */
57
- private readonly current;
58
- private revision;
59
- private stable;
60
- private readonly colorRenderers;
61
- private rendererCount;
62
- constructor(
63
- /** 16 floats per instance */
64
- matrices: Float32Array,
65
- /** One instance's bounding sphere, in its own space. */
66
- sphere: Sphere,
67
- /** Per level, whether it draws anything. */
68
- drawing: readonly boolean[], draws: readonly IndirectDraw[], fallback: readonly number[]);
69
- private allocate;
70
- /** Slots and kernels survive arrivals; only the variable-size draw table is replaced. */
71
- append(draws: readonly IndirectDraw[]): number;
72
- /** Residency is data, including the previous route for the arrival's dither fade. */
73
- route(fallback: readonly number[], fade?: boolean): void;
74
- private writeDraws;
75
- /** Select for this view next; the uniforms are set and compared here. */
76
- aim(eye: Vector3, scale: number, ortho: boolean, fades: boolean, forced: number | null, levels: readonly {
77
- maxPixels: number;
78
- }[], stable?: object): void;
79
- /** The instances changed since the last selection. */
80
- changed(): void;
81
- /** The passes `renderer` has to run for the selection to be current in its buffers, or none. */
82
- take(renderer: Renderer): ComputeNode[];
83
- /** Carry `colors` (4 floats per instance) with the instances from now on, into the slots. */
84
- useColors(colors: Float32Array): void;
85
- /** Frees its buffers and passes. */
86
- dispose(): void;
87
- private passes;
88
- /** The pass that fills the slots. */
89
- private selectPass;
90
- private argumentsPass;
91
- }
92
- export {};
@@ -1,315 +0,0 @@
1
- import { StorageBufferAttribute, StorageInstancedBufferAttribute, Vector3, Vector4, } from "three/webgpu";
2
- import { Fn, If, Loop, Return, atomicAdd, atomicLoad, atomicStore, distance, float, instanceIndex, int, max, smoothstep, storage, uint, uniform, vec4, } from "three/tsl";
3
- import { at } from "../at.js";
4
- import { FADE } from "../levels.js";
5
- import { maxScale } from "../tsl.js";
6
- import { ARGS_BYTES, args } from "./args.js";
7
- const CURRENT = [];
8
- export class Selection {
9
- draws;
10
- /** The instances' matrices, as `setMatrixAt` writes them. */
11
- matrices;
12
- /** The instances' colours (RGB, padded to four floats), once there are any. */
13
- colors = null;
14
- count;
15
- slots;
16
- /** Per level, its first slot, or null for a level that draws nothing. */
17
- first;
18
- /** Shared page containing this selection's draws, `ARGS_BYTES` apart. */
19
- get args() {
20
- return this.slice.attribute;
21
- }
22
- /** Byte offset of this selection's first draw in its page. */
23
- get argsOffset() {
24
- return this.slice.offset;
25
- }
26
- // What the view sets before each selection (see InstancedLod.update).
27
- eye = uniform(new Vector3());
28
- /** Pixels per unit of subtense (perspective) or of size (orthographic), × Lod.quality. */
29
- scale = uniform(0);
30
- ortho = uniform(0, "uint");
31
- fades = uniform(0, "uint");
32
- /** The level every instance draws, or -1. */
33
- forced = uniform(-1, "int");
34
- /** Per level, its maxPixels (any finite stand-in for level 0's Infinity). */
35
- maxPixels;
36
- counts;
37
- slice;
38
- routes;
39
- previous;
40
- // Crowd dimensions are data; equal ladders share shader modules regardless of capacity.
41
- starts;
42
- bounds = uniform(new Vector4());
43
- progress = uniform(1);
44
- drawCount = uniform(0, "uint");
45
- records = storage(new StorageBufferAttribute(new Uint32Array(4), 4), "uvec4", 0)
46
- .setName("lodDraws")
47
- .toReadOnly();
48
- arguments = storage(new StorageBufferAttribute(new Uint32Array(5), 1), "uint", 0).setName("lodDrawArgs");
49
- // Allocation location must not specialize the arguments pass for every crowd.
50
- argsStart = uniform(0, "uint");
51
- kernels = null;
52
- /**
53
- * The renderers whose buffers hold the selection for the view and instances as they are
54
- * (each renderer keeps its own copy of the buffers): see `aim` and `changed`.
55
- */
56
- current = new WeakMap();
57
- revision = 0;
58
- stable;
59
- colorRenderers = new WeakSet();
60
- rendererCount = 0;
61
- constructor(
62
- /** 16 floats per instance */
63
- matrices,
64
- /** One instance's bounding sphere, in its own space. */
65
- sphere,
66
- /** Per level, whether it draws anything. */
67
- drawing, draws, fallback) {
68
- this.draws = draws;
69
- const count = matrices.length / 16;
70
- this.count = count;
71
- this.matrices = new StorageBufferAttribute(matrices, 16);
72
- let next = 0;
73
- this.first = drawing.map((draws) => (draws ? next++ * count : null));
74
- this.starts = this.first.map((first) => uniform(first ?? 0, "uint"));
75
- this.bounds.value.set(sphere.center.x, sphere.center.y, sphere.center.z, sphere.radius);
76
- const slots = Math.max(next * count, 1);
77
- this.slots = { matrices: new StorageInstancedBufferAttribute(slots, 16), fades: new StorageBufferAttribute(slots, 1), colors: null };
78
- this.maxPixels = drawing.map(() => uniform(0));
79
- this.counts = new StorageBufferAttribute(new Uint32Array(drawing.length), 1);
80
- this.slice = this.allocate(draws);
81
- this.argsStart.value = this.argsOffset / 4;
82
- this.routes = fallback.map((level) => uniform(level, "int"));
83
- this.previous = fallback.map((level) => uniform(level, "int"));
84
- this.writeDraws(draws);
85
- }
86
- allocate(draws) {
87
- const values = new Uint32Array((draws.length * ARGS_BYTES) / 4);
88
- draws.forEach((draw, k) => {
89
- const base = (k * ARGS_BYTES) / 4;
90
- const first = at(this.first, draw.level);
91
- if (first === null)
92
- throw new Error("InstancedLod: a draw of a level that draws nothing");
93
- // indexed: count, instances, first index, base vertex, first instance;
94
- // else: count, instances, first vertex, first instance.
95
- values[base] = draw.count;
96
- values[base + 2] = draw.start;
97
- values[base + (draw.indexed ? 4 : 3)] = first;
98
- });
99
- return args.take(values);
100
- }
101
- /** Slots and kernels survive arrivals; only the variable-size draw table is replaced. */
102
- append(draws) {
103
- const offset = this.draws.length * ARGS_BYTES;
104
- const previous = this.slice;
105
- this.draws = [...this.draws, ...draws];
106
- this.slice = this.allocate(this.draws);
107
- this.argsStart.value = this.argsOffset / 4;
108
- this.writeDraws(this.draws);
109
- previous.dispose();
110
- this.changed();
111
- return offset;
112
- }
113
- /** Residency is data, including the previous route for the arrival's dither fade. */
114
- route(fallback, fade = false) {
115
- fallback.forEach((level, i) => {
116
- const route = at(this.routes, i);
117
- const previous = at(this.previous, i);
118
- previous.value = fade ? route.value : level;
119
- route.value = level;
120
- });
121
- this.progress.value = fade ? 0 : 1;
122
- this.changed();
123
- }
124
- writeDraws(draws) {
125
- const values = new Uint32Array(Math.max(draws.length, 1) * 4);
126
- draws.forEach((draw, i) => values.set([draw.level, draw.count, draw.start, Number(draw.indexed)], i * 4));
127
- const previous = this.records.value;
128
- this.records.value = new StorageBufferAttribute(values, 4);
129
- this.arguments.value = this.args;
130
- this.drawCount.value = draws.length;
131
- previous.dispose();
132
- }
133
- /** Select for this view next; the uniforms are set and compared here. */
134
- aim(eye, scale, ortho, fades, forced, levels, stable) {
135
- const same = this.eye.value.equals(eye) &&
136
- this.scale.value === scale &&
137
- this.ortho.value === Number(ortho) &&
138
- this.fades.value === Number(fades) &&
139
- this.forced.value === (forced ?? -1) &&
140
- levels.every((level, l) => at(this.maxPixels, l).value === Math.min(level.maxPixels, 3.4e38));
141
- // The caller can prove that changed views still produce the same solid slots.
142
- const reuse = stable !== undefined && stable === this.stable;
143
- this.stable = stable;
144
- if (same)
145
- return;
146
- if (!reuse)
147
- this.revision++;
148
- this.eye.value.copy(eye);
149
- this.scale.value = scale;
150
- this.ortho.value = Number(ortho);
151
- this.fades.value = Number(fades);
152
- this.forced.value = forced ?? -1;
153
- // any finite stand-in for level 0's Infinity
154
- levels.forEach((level, l) => {
155
- at(this.maxPixels, l).value = Math.min(level.maxPixels, 3.4e38);
156
- });
157
- }
158
- /** The instances changed since the last selection. */
159
- changed() {
160
- this.revision++;
161
- this.stable = undefined;
162
- }
163
- /** The passes `renderer` has to run for the selection to be current in its buffers, or none. */
164
- take(renderer) {
165
- if (this.current.get(renderer) === this.revision)
166
- return CURRENT;
167
- const first = !this.current.has(renderer);
168
- if (first) {
169
- this.rendererCount = Math.min(2, this.rendererCount + 1);
170
- }
171
- // Three clears updateRanges globally after one backend uploads them. A second,
172
- // lagging renderer needs the whole current source, including earlier edits.
173
- // Initial buffer creation also leaves ranges uncleared; start it with none.
174
- if (first || this.rendererCount > 1) {
175
- this.matrices.clearUpdateRanges();
176
- }
177
- if (this.colors && (!this.colorRenderers.has(renderer) || this.rendererCount > 1)) {
178
- this.colorRenderers.add(renderer);
179
- this.colors.clearUpdateRanges();
180
- }
181
- this.current.set(renderer, this.revision);
182
- return this.passes();
183
- }
184
- /** Carry `colors` (4 floats per instance) with the instances from now on, into the slots. */
185
- useColors(colors) {
186
- if (this.colors)
187
- return;
188
- this.colors = new StorageBufferAttribute(colors, 4);
189
- this.slots.colors = new StorageInstancedBufferAttribute(this.slots.matrices.count, 4);
190
- for (const kernel of this.kernels ?? [])
191
- kernel.dispose();
192
- this.kernels = null;
193
- this.changed();
194
- }
195
- /** Frees its buffers and passes. */
196
- dispose() {
197
- const { slots } = this;
198
- for (const attribute of [this.matrices, this.colors, this.counts, slots.matrices, slots.fades, slots.colors])
199
- attribute?.dispose();
200
- for (const kernel of this.kernels ?? [])
201
- kernel.dispose();
202
- this.kernels = null;
203
- this.slice.dispose();
204
- this.records.value.dispose();
205
- }
206
- passes() {
207
- this.kernels ??= [this.selectPass(), this.argumentsPass()];
208
- return this.kernels;
209
- }
210
- /** The pass that fills the slots. */
211
- selectPass() {
212
- const { count, colors, slots } = this;
213
- const matrices = storage(this.matrices, "mat4", 0).setName("lodSourceMatrices");
214
- const sources = colors ? storage(colors, "vec4", 0).setName("lodSourceColors") : null;
215
- const counts = storage(this.counts, "uint", 0).setName("lodCounts").toAtomic();
216
- const out = {
217
- matrices: storage(slots.matrices, "mat4", 0).setName("lodSlotMatrices"),
218
- fades: storage(slots.fades, "float", 0).setName("lodSlotFades"),
219
- colors: slots.colors && storage(slots.colors, "vec4", 0).setName("lodSlotColors"),
220
- };
221
- return Fn(() => {
222
- const m = matrices.element(instanceIndex).toVar();
223
- const r = this.bounds.w.mul(maxScale(m)).toVar();
224
- If(r.equal(0), () => Return());
225
- const centre = m.mul(vec4(this.bounds.xyz, 1)).xyz;
226
- const size = r.mul(2).mul(this.scale);
227
- const height = this.ortho
228
- .equal(uint(1))
229
- .select(size, size.div(max(distance(centre, this.eye), 1e-6)))
230
- .toVar();
231
- // The levels' maxPixels fall from level to level: the last one it fits is its level.
232
- const chosen = int(0).toVar();
233
- const top = float(0).toVar();
234
- this.maxPixels.forEach((maxPixels, l) => {
235
- if (l === 0)
236
- return;
237
- If(height.lessThanEqual(maxPixels), () => {
238
- chosen.assign(l);
239
- top.assign(maxPixels);
240
- });
241
- });
242
- If(this.forced.greaterThanEqual(0), () => void chosen.assign(this.forced));
243
- const t = float(0).toVar();
244
- If(this.fades.equal(uint(1)).and(chosen.greaterThan(0)), () => void t.assign(smoothstep(top.mul(1 - FADE), top, height)));
245
- const selected = chosen.toVar();
246
- const finer = chosen.sub(1).toVar();
247
- const before = chosen.toVar();
248
- const beforeFiner = chosen.sub(1).toVar();
249
- this.routes.forEach((route, level) => {
250
- If(chosen.equal(level), () => {
251
- selected.assign(route);
252
- finer.assign(this.routes[level - 1] ?? route);
253
- before.assign(this.previous[level] ?? route);
254
- beforeFiner.assign(this.previous[level - 1] ?? this.previous[level] ?? route);
255
- });
256
- });
257
- const afterFade = selected.equal(finer).select(float(0), t).toVar();
258
- const beforeFade = before.equal(beforeFiner).select(float(0), t).toVar();
259
- t.assign(afterFade);
260
- // Mirrors residency.handover: only two slots per instance, including at a height boundary.
261
- If(this.progress.lessThan(1).and(before.notEqual(selected).or(beforeFiner.notEqual(finer))), () => {
262
- If(this.progress.lessThan(1 / 3), () => {
263
- selected.assign(before);
264
- finer.assign(beforeFiner);
265
- t.assign(beforeFade.greaterThan(0).select(beforeFade.add(float(1).sub(beforeFade).mul(this.progress).mul(3)), float(0)));
266
- })
267
- .ElseIf(this.progress.lessThan(2 / 3), () => {
268
- selected.assign(afterFade.greaterThan(0).select(finer, selected));
269
- finer.assign(beforeFade.greaterThan(0).select(beforeFiner, before));
270
- t.assign(float(1).sub(this.progress.sub(1 / 3).mul(3)));
271
- })
272
- .Else(() => {
273
- t.assign(afterFade.greaterThan(0).select(float(1).sub(float(1)
274
- .sub(afterFade)
275
- .mul(this.progress.sub(2 / 3))
276
- .mul(3)), float(0)));
277
- });
278
- If(selected.equal(finer), () => void t.assign(0));
279
- });
280
- const emit = (level, first, fade) => {
281
- const slot = atomicAdd(counts.element(level), uint(1)).add(first).toVar();
282
- out.matrices.element(slot).assign(m);
283
- out.fades.element(slot).assign(fade);
284
- if (out.colors && sources)
285
- out.colors.element(slot).assign(sources.element(instanceIndex));
286
- };
287
- this.first.forEach((first, level) => {
288
- if (first === null)
289
- return;
290
- const start = at(this.starts, level);
291
- If(selected.equal(level), () => emit(level, start, t));
292
- // The finer neighbour fading out with it.
293
- If(finer.equal(level).and(t.greaterThan(0)), () => emit(level, start, t.negate()));
294
- });
295
- })().compute(count);
296
- }
297
- argumentsPass() {
298
- const counts = storage(this.counts, "uint", 0).setName("lodCounts").toAtomic();
299
- return Fn(() => {
300
- Loop({ start: uint(0), end: this.drawCount, type: "uint", condition: "<" }, ({ i }) => {
301
- const draw = this.records.element(i).toVar();
302
- const first = uint(0).toVar();
303
- this.starts.forEach((value, level) => If(draw.x.equal(level), () => void first.assign(value)));
304
- const base = this.argsStart.add(i.mul(ARGS_BYTES / 4));
305
- this.arguments.element(base).assign(draw.y);
306
- this.arguments.element(base.add(1)).assign(atomicLoad(counts.element(draw.x)));
307
- this.arguments.element(base.add(2)).assign(draw.z);
308
- this.arguments.element(base.add(3)).assign(draw.w.equal(1).select(uint(0), first));
309
- this.arguments.element(base.add(4)).assign(draw.w.equal(1).select(first, uint(0)));
310
- });
311
- this.first.forEach((_, l) => atomicStore(counts.element(l), uint(0)));
312
- })().compute(1);
313
- }
314
- }
315
- //# sourceMappingURL=select.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/instanced/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EACtB,+BAA+B,EAC/B,OAAO,EACP,OAAO,GAKR,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,EAAE,EACF,EAAE,EACF,IAAI,EACJ,MAAM,EACN,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,EACR,KAAK,EACL,aAAa,EACb,GAAG,EACH,GAAG,EACH,UAAU,EACV,OAAO,EACP,IAAI,EACJ,OAAO,EACP,IAAI,GACL,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAkB,MAAM,WAAW,CAAC;AAE7D,MAAM,OAAO,GAAkB,EAAE,CAAC;AA8BlC,MAAM,OAAO,SAAS;IA8DV;IA7DV,6DAA6D;IACpD,QAAQ,CAAyB;IAC1C,+EAA+E;IAC/E,MAAM,GAAkC,IAAI,CAAC;IACpC,KAAK,CAAS;IACd,KAAK,CAAQ;IACtB,yEAAyE;IAChE,KAAK,CAAuB;IACrC,yEAAyE;IACzE,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IAC9B,CAAC;IACD,8DAA8D;IAC9D,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,sEAAsE;IAC7D,GAAG,GAAG,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IACtC,0FAA0F;IACjF,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3B,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpC,6CAA6C;IACpC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,6EAA6E;IACpE,SAAS,CAA2C;IAE5C,MAAM,CAAyB;IACxC,KAAK,CAAY;IACR,MAAM,CAAyC;IAC/C,QAAQ,CAAyC;IAClE,wFAAwF;IACvE,MAAM,CAA0C;IAChD,MAAM,GAAG,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IACxC,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACd,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,GAAG,OAAO,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;SAC9F,OAAO,CAAC,UAAU,CAAC;SACnB,UAAU,EAAE,CAAC;IACC,SAAS,GAAG,OAAO,CAAC,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1H,8EAA8E;IAC7D,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,GAAyB,IAAI,CAAC;IAC7C;;;OAGG;IACc,OAAO,GAAG,IAAI,OAAO,EAAoB,CAAC;IACnD,QAAQ,GAAG,CAAC,CAAC;IACb,MAAM,CAAqB;IAClB,cAAc,GAAG,IAAI,OAAO,EAAY,CAAC;IAClD,aAAa,GAAG,CAAC,CAAC;IAE1B;IACE,6BAA6B;IAC7B,QAAsB;IACtB,wDAAwD;IACxD,MAAc;IACd,4CAA4C;IAC5C,OAA2B,EACnB,KAA8B,EACtC,QAA2B;QADnB,UAAK,GAAL,KAAK,CAAyB;QAGtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,sBAAsB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,+BAA+B,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACrI,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAsB,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAEO,QAAQ,CAAC,KAA8B;QAC7C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACxB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,KAAK,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC1F,uEAAuE;YACvE,wDAAwD;YACxD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAC9B,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,yFAAyF;IACzF,MAAM,CAAC,KAA8B;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,QAA2B,EAAE,IAAI,GAAG,KAAK;QAC7C,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACtC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAC5C,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,UAAU,CAAC,KAA8B;QAC/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1G,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,yEAAyE;IACzE,GAAG,CAAC,GAAY,EAAE,KAAa,EAAE,KAAc,EAAE,KAAc,EAAE,MAAqB,EAAE,MAAwC,EAAE,MAAe;QAC/I,MAAM,IAAI,GACR,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK;YAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QAChG,8EAA8E;QAC9E,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;QAC7D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;QACjC,6CAA6C;QAC7C,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC1B,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,OAAO;QACL,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,gGAAgG;IAChG,IAAI,CAAC,QAAkB;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC;QACjE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,+EAA+E;QAC/E,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,KAAK,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;YAClF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,6FAA6F;IAC7F,SAAS,CAAC,MAAoB;QAC5B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,oCAAoC;IACpC,OAAO;QACL,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,KAAK,MAAM,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACnI,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE;YAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,qCAAqC;IAC7B,UAAU;QAChB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/E,MAAM,GAAG,GAAG;YACV,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;YACvE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;YAC/D,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;SAClF,CAAC;QACF,OAAO,EAAE,CAAC,GAAG,EAAE;YACb,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;YAClD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACjD,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACnD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK;iBACtB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACd,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;iBAC7D,KAAK,EAAE,CAAC;YACX,qFAAqF;YACrF,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;gBACtC,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO;gBACpB,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE;oBACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACjB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3E,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC3B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1H,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACnC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE;oBAC3B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;oBAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;oBAC7C,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;gBAChF,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACpE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YACzE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACpB,2FAA2F;YAC3F,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE;gBAChG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE;oBACrC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACxB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBAC1B,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3H,CAAC,CAAC;qBACC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE;oBAC1C,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAClE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;oBACpE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,CAAC,CAAC;qBACD,IAAI,CAAC,GAAG,EAAE;oBACT,CAAC,CAAC,MAAM,CACN,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAC7B,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CACV,KAAK,CAAC,CAAC,CAAC;yBACL,GAAG,CAAC,SAAS,CAAC;yBACd,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;yBAC7B,GAAG,CAAC,CAAC,CAAC,CACV,EACD,KAAK,CAAC,CAAC,CAAC,CACT,CACF,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACL,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAmB,EAAE,IAAmB,EAAE,EAAE;gBACvE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC1E,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACrC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO;oBAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;YAC7F,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAClC,IAAI,KAAK,KAAK,IAAI;oBAAE,OAAO;gBAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACrC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvD,0CAA0C;gBAC1C,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAEO,aAAa;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/E,OAAO,EAAE,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;gBACpF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBACnF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF"}
@@ -1,31 +0,0 @@
1
- import { Matrix4, type Color } from "three/webgpu";
2
- import type { Blocks } from "./blocks.js";
3
- import type { Selection } from "./select.js";
4
- /** The CPU side of every instance, as `setMatrixAt` and `setColorAt` write it, and its edits not yet measured and uploaded. */
5
- export declare class Store {
6
- readonly count: number;
7
- /** Instance matrices, 16 floats each: the selection uploads them from here. */
8
- readonly matrices: Float32Array;
9
- /** Instance colours, 4 floats each, once `setColor` was called. */
10
- colors: Float32Array | null;
11
- /** Each instance's bounding sphere, centre and radius, in the InstancedLod's space. */
12
- readonly spheres: Float32Array;
13
- private readonly matrixChanges;
14
- private readonly colorChanges;
15
- /** Where edits upload to, while there is one. */
16
- private selection;
17
- constructor(count: number);
18
- check(index: number): void;
19
- setMatrix(index: number, matrix: Matrix4): void;
20
- getMatrix(index: number, matrix: Matrix4): Matrix4;
21
- setColor(index: number, color: Color): void;
22
- /** White unless set. */
23
- getColor(index: number, color: Color): Color;
24
- /** Upload edits to `selection` from now on, colours included once there are any; null stops uploading. */
25
- attach(selection: Selection | null): void;
26
- /** Take `source`'s matrices and colours, all of them pending. */
27
- copy(source: Store): void;
28
- /** Measure only changed matrices into `blocks`; matrix and colour uploads have separate ranges. */
29
- measure(blocks: Blocks): void;
30
- private measureChanges;
31
- }
@@ -1,96 +0,0 @@
1
- import { Matrix4 } from "three/webgpu";
2
- import { Dirty, upload } from "./dirty.js";
3
- const IDENTITY = new Matrix4();
4
- /** The CPU side of every instance, as `setMatrixAt` and `setColorAt` write it, and its edits not yet measured and uploaded. */
5
- export class Store {
6
- count;
7
- /** Instance matrices, 16 floats each: the selection uploads them from here. */
8
- matrices;
9
- /** Instance colours, 4 floats each, once `setColor` was called. */
10
- colors = null;
11
- /** Each instance's bounding sphere, centre and radius, in the InstancedLod's space. */
12
- spheres;
13
- matrixChanges;
14
- colorChanges;
15
- /** Where edits upload to, while there is one. */
16
- selection = null;
17
- constructor(count) {
18
- this.count = count;
19
- this.matrices = new Float32Array(count * 16);
20
- this.spheres = new Float32Array(count * 4);
21
- for (let i = 0; i < count; i++)
22
- IDENTITY.toArray(this.matrices, i * 16);
23
- this.matrixChanges = new Dirty(count);
24
- this.colorChanges = new Dirty(count);
25
- this.matrixChanges.all();
26
- }
27
- check(index) {
28
- if (!Number.isInteger(index) || index < 0 || index >= this.count)
29
- throw new Error(`InstancedLod: index ${index} is not in 0..${this.count - 1}`);
30
- }
31
- setMatrix(index, matrix) {
32
- this.check(index);
33
- matrix.toArray(this.matrices, index * 16);
34
- this.matrixChanges.add(index);
35
- }
36
- getMatrix(index, matrix) {
37
- this.check(index);
38
- return matrix.fromArray(this.matrices, index * 16);
39
- }
40
- setColor(index, color) {
41
- this.check(index);
42
- if (!this.colors) {
43
- this.colors = new Float32Array(this.count * 4).fill(1);
44
- if (this.selection) {
45
- this.selection.useColors(this.colors);
46
- this.colorChanges.all();
47
- }
48
- }
49
- color.toArray(this.colors, index * 4);
50
- this.colorChanges.add(index);
51
- }
52
- /** White unless set. */
53
- getColor(index, color) {
54
- this.check(index);
55
- return this.colors ? color.fromArray(this.colors, index * 4) : color.setRGB(1, 1, 1);
56
- }
57
- /** Upload edits to `selection` from now on, colours included once there are any; null stops uploading. */
58
- attach(selection) {
59
- this.selection = selection;
60
- if (selection && this.colors)
61
- selection.useColors(this.colors);
62
- }
63
- /** Take `source`'s matrices and colours, all of them pending. */
64
- copy(source) {
65
- this.matrices.set(source.matrices);
66
- this.colors = source.colors?.slice() ?? null;
67
- this.matrixChanges.all();
68
- if (this.colors)
69
- this.colorChanges.all();
70
- }
71
- /** Measure only changed matrices into `blocks`; matrix and colour uploads have separate ranges. */
72
- measure(blocks) {
73
- if (this.matrixChanges.empty && this.colorChanges.empty)
74
- return;
75
- this.measureChanges(blocks);
76
- }
77
- // Keep the closure-bearing work out of the unchanged path: V8 can allocate a
78
- // lexical context on entry even when a function returns before its callbacks.
79
- measureChanges(blocks) {
80
- const { selection } = this;
81
- const matricesChanged = !this.matrixChanges.empty;
82
- this.matrixChanges.drain((start, end) => {
83
- blocks.measure(start, end);
84
- if (selection)
85
- upload(selection.matrices, start, end);
86
- });
87
- this.colorChanges.drain((start, end) => {
88
- if (selection?.colors)
89
- upload(selection.colors, start, end);
90
- });
91
- selection?.changed();
92
- if (matricesChanged)
93
- blocks.refit();
94
- }
95
- }
96
- //# sourceMappingURL=store.js.map