@woosh/meep-engine 3.22.0 → 3.23.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 (267) hide show
  1. package/package.json +1 -1
  2. package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts +118 -0
  3. package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts.map +1 -0
  4. package/src/core/geom/3d/hash-grid/PointHashGrid3.js +283 -0
  5. package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -1
  6. package/src/core/geom/3d/shape/BoxShape3D.js +6 -17
  7. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
  8. package/src/core/geom/3d/shape/CapsuleShape3D.js +3 -14
  9. package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
  10. package/src/core/geom/3d/shape/CylinderShape3D.js +3 -21
  11. package/src/core/geom/3d/shape/PlaneShape3D.d.ts +105 -0
  12. package/src/core/geom/3d/shape/PlaneShape3D.d.ts.map +1 -0
  13. package/src/core/geom/3d/shape/PlaneShape3D.js +251 -0
  14. package/src/core/geom/3d/shape/SphereShape3D.js +3 -3
  15. package/src/core/geom/3d/shape/json/shape_to_type.d.ts.map +1 -1
  16. package/src/core/geom/3d/shape/json/shape_to_type.js +3 -0
  17. package/src/core/geom/3d/shape/json/type_adapters.d.ts +14 -0
  18. package/src/core/geom/3d/shape/json/type_adapters.d.ts.map +1 -1
  19. package/src/core/geom/3d/shape/json/type_adapters.js +15 -0
  20. package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts +51 -0
  21. package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts.map +1 -0
  22. package/src/core/geom/3d/shape/sdf/sdf3_box.js +113 -0
  23. package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts +46 -0
  24. package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts.map +1 -0
  25. package/src/core/geom/3d/shape/sdf/sdf3_capsule.js +82 -0
  26. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts +60 -0
  27. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts.map +1 -0
  28. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.js +126 -0
  29. package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.d.ts +50 -0
  30. package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.d.ts.map +1 -0
  31. package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.js +53 -0
  32. package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts +52 -0
  33. package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts.map +1 -0
  34. package/src/core/geom/3d/shape/sdf/sdf3_plane.js +61 -0
  35. package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts +41 -0
  36. package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts.map +1 -0
  37. package/src/core/geom/3d/shape/sdf/sdf3_sphere.js +71 -0
  38. package/src/core/process/ConcurrencyGate.d.ts +103 -0
  39. package/src/core/process/ConcurrencyGate.d.ts.map +1 -0
  40. package/src/core/process/ConcurrencyGate.js +207 -0
  41. package/src/engine/asset/AssetManager.d.ts +10 -0
  42. package/src/engine/asset/AssetManager.d.ts.map +1 -1
  43. package/src/engine/asset/AssetManager.js +10 -0
  44. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +30 -13
  45. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +26 -0
  46. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -0
  47. package/src/engine/graphics3/pose/collect_entity_playbacks.js +40 -0
  48. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  49. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +74 -101
  50. package/src/engine/physics/cloth/MEASUREMENTS.md +1287 -4
  51. package/src/engine/physics/cloth/PLAN.md +1967 -1581
  52. package/src/engine/physics/cloth/build/ClothProxy.d.ts +147 -0
  53. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -0
  54. package/src/engine/physics/cloth/build/ClothProxy.js +207 -0
  55. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +70 -0
  56. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -0
  57. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +256 -0
  58. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +176 -0
  59. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -0
  60. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +435 -0
  61. package/src/engine/physics/cloth/collider/ClothColliderKind.d.ts +12 -0
  62. package/src/engine/physics/cloth/collider/ClothColliderKind.d.ts.map +1 -0
  63. package/src/engine/physics/cloth/collider/ClothColliderKind.js +38 -0
  64. package/src/engine/physics/cloth/collider/ClothColliderRecord.d.ts +120 -0
  65. package/src/engine/physics/cloth/collider/ClothColliderRecord.d.ts.map +1 -0
  66. package/src/engine/physics/cloth/collider/ClothColliderRecord.js +137 -0
  67. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts +25 -0
  68. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -0
  69. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +190 -0
  70. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +44 -0
  71. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -0
  72. package/src/engine/physics/cloth/collider/cloth_collider_pack.js +173 -0
  73. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +94 -0
  74. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -0
  75. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +275 -0
  76. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts +126 -0
  77. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -0
  78. package/src/engine/physics/cloth/ecs/ClothCollider.js +199 -0
  79. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +9 -0
  80. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts.map +1 -0
  81. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +32 -0
  82. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +114 -0
  83. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -0
  84. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +243 -0
  85. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +66 -57
  86. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +109 -1
  87. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  88. package/src/engine/physics/cloth/ecs/ClothInstance.js +479 -363
  89. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +95 -0
  90. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -0
  91. package/src/engine/physics/cloth/ecs/ClothRig.js +140 -0
  92. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +30 -1
  93. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  94. package/src/engine/physics/cloth/ecs/ClothSystem.js +1021 -773
  95. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +90 -0
  96. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -0
  97. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +374 -0
  98. package/src/engine/physics/cloth/ecs/cloth_dynamics_library.d.ts +32 -3
  99. package/src/engine/physics/cloth/ecs/cloth_dynamics_library.d.ts.map +1 -1
  100. package/src/engine/physics/cloth/ecs/cloth_dynamics_library.js +283 -254
  101. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +59 -0
  102. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -0
  103. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +328 -0
  104. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +13 -0
  105. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -0
  106. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +288 -0
  107. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +58 -0
  108. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -0
  109. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +199 -0
  110. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +8 -63
  111. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  112. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +317 -645
  113. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +61 -0
  114. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  115. package/src/engine/physics/cloth/ecs/cloth_write_back.js +212 -449
  116. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +49 -0
  117. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -0
  118. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +115 -0
  119. package/src/engine/physics/cloth/playground/README.md +155 -1
  120. package/src/engine/physics/cloth/playground/collide.html +178 -0
  121. package/src/engine/physics/cloth/playground/collide_build.d.ts +95 -0
  122. package/src/engine/physics/cloth/playground/collide_build.d.ts.map +1 -0
  123. package/src/engine/physics/cloth/playground/collide_build.js +315 -0
  124. package/src/engine/physics/cloth/playground/collide_main.d.ts +2 -0
  125. package/src/engine/physics/cloth/playground/collide_main.d.ts.map +1 -0
  126. package/src/engine/physics/cloth/playground/collide_main.js +720 -0
  127. package/src/engine/physics/cloth/playground/garment.html +182 -0
  128. package/src/engine/physics/cloth/playground/garment_build.d.ts +78 -0
  129. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -0
  130. package/src/engine/physics/cloth/playground/garment_build.js +359 -0
  131. package/src/engine/physics/cloth/playground/garment_main.d.ts +2 -0
  132. package/src/engine/physics/cloth/playground/garment_main.d.ts.map +1 -0
  133. package/src/engine/physics/cloth/playground/garment_main.js +633 -0
  134. package/src/engine/physics/cloth/solver/ClothState.d.ts +208 -5
  135. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  136. package/src/engine/physics/cloth/solver/ClothState.js +302 -8
  137. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +87 -0
  138. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -0
  139. package/src/engine/physics/cloth/solver/cloth_contact_find.js +343 -0
  140. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +112 -0
  141. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -0
  142. package/src/engine/physics/cloth/solver/cloth_self_find.js +448 -0
  143. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts +4 -1
  144. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  145. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +16 -1
  146. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +112 -5
  147. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +117 -6
  149. package/src/engine/physics/cloth/solver/cloth_step.d.ts +40 -9
  150. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/solver/cloth_step.js +122 -10
  152. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts +95 -0
  153. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts.map +1 -0
  154. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.js +285 -0
  155. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts +129 -0
  156. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -0
  157. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +501 -0
  158. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +75 -0
  159. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -0
  160. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +202 -0
  161. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  162. package/src/shade/playground/vgeo_viewer/README.md +18 -0
  163. package/src/shade/playground/vgeo_viewer/main.js +87 -50
  164. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  165. package/src/shade/renderer/buffer/table/GPUDatabase.js +191 -62
  166. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +94 -2
  167. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  168. package/src/shade/renderer/buffer/table/GPUTypedTable.js +414 -2
  169. package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.d.ts +14 -0
  170. package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.d.ts.map +1 -0
  171. package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.js +13 -0
  172. package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.d.ts +17 -0
  173. package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.d.ts.map +1 -0
  174. package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.js +116 -0
  175. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +9 -4
  176. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  177. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +843 -734
  178. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +12 -0
  179. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  180. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +13 -0
  181. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +17 -0
  182. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  183. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +185 -30
  184. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +17 -0
  185. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +141 -24
  186. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +204 -64
  187. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +110 -10
  188. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +19 -0
  189. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +19 -6
  190. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
  191. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +26 -7
  192. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +173 -14
  193. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  194. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +458 -51
  195. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +49 -13
  196. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
  197. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +52 -14
  198. package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.d.ts +20 -0
  199. package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.d.ts.map +1 -0
  200. package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.js +19 -0
  201. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.d.ts +27 -0
  202. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.d.ts.map +1 -0
  203. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.js +48 -0
  204. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.d.ts +29 -0
  205. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.d.ts.map +1 -0
  206. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.js +60 -0
  207. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +8 -1
  208. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
  209. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +32 -2
  210. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +258 -0
  211. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +1 -0
  212. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +723 -0
  213. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +49 -0
  214. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +1 -0
  215. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +50 -0
  216. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  217. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  218. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts +3 -0
  219. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts.map +1 -1
  220. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +121 -21
  221. package/src/shade/renderer/texture/virtual/README.md +6 -4
  222. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  223. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +7 -0
  224. package/src/shade/renderer/texture/virtual/source/VTSourceTiled.d.ts +3 -3
  225. package/src/shade/renderer/texture/virtual/source/VTSourceTiled.js +3 -3
  226. package/src/engine/ecs/system/SystemExecutionPhase.d.ts +0 -9
  227. package/src/engine/ecs/system/SystemExecutionPhase.d.ts.map +0 -1
  228. package/src/engine/graphics/texture/virtual/NOTES.md +0 -128
  229. package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.d.ts +0 -6
  230. package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.d.ts.map +0 -1
  231. package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.js +0 -5
  232. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.d.ts +0 -49
  233. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.d.ts.map +0 -1
  234. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.js +0 -264
  235. package/src/engine/graphics/texture/virtual/VirtualTextureUsage.d.ts +0 -44
  236. package/src/engine/graphics/texture/virtual/VirtualTextureUsage.d.ts.map +0 -1
  237. package/src/engine/graphics/texture/virtual/VirtualTextureUsage.js +0 -228
  238. package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.d.ts +0 -3
  239. package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.d.ts.map +0 -1
  240. package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.js +0 -73
  241. package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.d.ts +0 -14
  242. package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.d.ts.map +0 -1
  243. package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.js +0 -85
  244. package/src/engine/graphics/texture/virtual/debug/UsageDebugView.d.ts +0 -12
  245. package/src/engine/graphics/texture/virtual/debug/UsageDebugView.d.ts.map +0 -1
  246. package/src/engine/graphics/texture/virtual/debug/UsageDebugView.js +0 -63
  247. package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.d.ts +0 -12
  248. package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.d.ts.map +0 -1
  249. package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.js +0 -243
  250. package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.d.ts +0 -30
  251. package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.d.ts.map +0 -1
  252. package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.js +0 -39
  253. package/src/engine/graphics/texture/virtual/tile/compose_finger_print.d.ts +0 -9
  254. package/src/engine/graphics/texture/virtual/tile/compose_finger_print.d.ts.map +0 -1
  255. package/src/engine/graphics/texture/virtual/tile/compose_finger_print.js +0 -24
  256. package/src/engine/graphics/texture/virtual/tile/compose_tile_address.d.ts +0 -9
  257. package/src/engine/graphics/texture/virtual/tile/compose_tile_address.d.ts.map +0 -1
  258. package/src/engine/graphics/texture/virtual/tile/compose_tile_address.js +0 -26
  259. package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.d.ts +0 -11
  260. package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.d.ts.map +0 -1
  261. package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.js +0 -12
  262. package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.d.ts +0 -7
  263. package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.d.ts.map +0 -1
  264. package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.js +0 -16
  265. package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.d.ts +0 -7
  266. package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.d.ts.map +0 -1
  267. package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.js +0 -35
@@ -11,6 +11,8 @@ import { inspect_gpu_buffer } from "../inspect_gpu_buffer.js";
11
11
  import { inspect_gpu_buffer_typed } from "../inspect_gpu_buffer_typed.js";
12
12
  import { GPU_DATABASE_BUFFER_ELEMENT_TYPE } from "./GPU_DATABASE_BUFFER_ELEMENT_TYPE.js";
13
13
  import { gpu_table_element_upload_shader } from "./gpu_table_element_upload_shader.js";
14
+ import { gpu_table_partial_upload_shader } from "./gpu_table_partial_upload_shader.js";
15
+ import { GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS } from "./GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.js";
14
16
  import { GPUPageMetadata } from "./GPUPageMetadata.js";
15
17
  import { GPUTypedTable } from "./GPUTypedTable.js";
16
18
  import { PageBufferPool } from "./PageBufferPool.js";
@@ -521,70 +523,17 @@ export class GPUDatabase {
521
523
  // transfer elements (chunked)
522
524
  for (let i = 0; i < table_count; i++) {
523
525
  const table = tables[i];
524
- const upload_data = table.element_upload_buffer;
525
- const cursor = upload_data.position;
526
526
 
527
- if (cursor === 0) {
528
- // no data
529
- continue;
530
- }
531
-
532
- const table_descriptor = table.descriptor;
533
- const record_stride = table_descriptor.packed_element_size_bytes + u32.size;
534
- const total_element_count = cursor / record_stride;
535
-
536
- assert.isNonNegativeInteger(total_element_count, 'total_element_count');
537
-
538
- // Chunk the upload to avoid oversized transient buffers
539
- const max_elements_per_chunk = Math.max(1, Math.floor(UPLOAD_CHUNK_SIZE / record_stride));
540
-
541
- let elements_uploaded = 0;
542
-
543
- while (elements_uploaded < total_element_count) {
544
- const chunk_count = Math.min(max_elements_per_chunk, total_element_count - elements_uploaded);
545
- const chunk_byte_offset = elements_uploaded * record_stride;
546
- const chunk_byte_size = chunk_count * record_stride;
547
-
548
- assert.isNonNegativeInteger(chunk_count, 'chunk_count');
549
-
550
- // immediate data — a plain value written straight into the pass, not a buffer
551
- const settings = {
552
- count: chunk_count,
553
- // record_size is read by the upload shader as a count of
554
- // GPU_DATABASE_BUFFER_ELEMENT_TYPE (u32) units. Records
555
- // are stored at type.size stride (no record-level padding),
556
- // with WGSL alignment applied within fields and array elements.
557
- record_size: table_descriptor.packed_element_size_bytes / GPU_DATABASE_BUFFER_ELEMENT_TYPE.size,
558
- elements_per_page: table_descriptor.elements_per_page,
559
- page_lookup_address: table_descriptor.page_lookup_address,
560
- page_header_words: table_descriptor.page_header_words,
561
- page_limit: table_descriptor.page_limit,
562
- };
563
-
564
- const upload_buffer = encoder.allocateTransientBufferAndLoad(
565
- upload_data.data,
566
- GPUBufferUsage.STORAGE,
567
- chunk_byte_offset,
568
- chunk_byte_size
569
- );
570
-
571
- gpu_table_element_upload_shader.dispatchThreads({
572
- encoder,
573
- bindings: {
574
- settings,
575
- upload_buffer,
576
- database: this.buffer,
577
- },
578
- thread_count_x: chunk_count,
579
- });
580
-
581
- elements_uploaded += chunk_count;
582
- }
527
+ // Whole records first, sub-record ranges second. In one update cycle a row normally
528
+ // has a pending write in one stream or the other, never both — `GPUTypedTable` patches
529
+ // or retires across the two as writes come in. The one case it reconciles through a
530
+ // bounded scan rather than an index is a range landing on a whole record queued long
531
+ // before it, and that case leaves both entries live. This order is what settles it,
532
+ // and it settles it the way append order already did: the range lands on top.
533
+ this.#upload_element_records(table, encoder);
534
+ this.#upload_partial_ranges(table, encoder);
583
535
 
584
- // reset upload buffer
585
- table.element_upload_buffer.position = 0;
586
-
587
- // Trim upload buffer if it grew too large
536
+ // Trim upload buffers if they grew too large
588
537
  table.trim_upload_buffer();
589
538
  }
590
539
 
@@ -605,6 +554,186 @@ export class GPUDatabase {
605
554
  }
606
555
  }
607
556
 
557
+ /**
558
+ * Dispatch a table's pending whole-record writes, chunked so no single transient buffer grows
559
+ * past {@link UPLOAD_CHUNK_SIZE}. Rewinds the buffer.
560
+ *
561
+ * @param {GPUTypedTable} table
562
+ * @param {ShadeGPUCommandContext} encoder
563
+ */
564
+ #upload_element_records(table, encoder) {
565
+ const upload_data = table.element_upload_buffer;
566
+ const cursor = upload_data.position;
567
+
568
+ if (cursor === 0) {
569
+ // no data
570
+ return;
571
+ }
572
+
573
+ const table_descriptor = table.descriptor;
574
+ const record_stride = table_descriptor.packed_element_size_bytes + u32.size;
575
+ const total_element_count = cursor / record_stride;
576
+
577
+ assert.isNonNegativeInteger(total_element_count, 'total_element_count');
578
+
579
+ // Chunk the upload to avoid oversized transient buffers
580
+ const max_elements_per_chunk = Math.max(1, Math.floor(UPLOAD_CHUNK_SIZE / record_stride));
581
+
582
+ let elements_uploaded = 0;
583
+
584
+ while (elements_uploaded < total_element_count) {
585
+ const chunk_count = Math.min(max_elements_per_chunk, total_element_count - elements_uploaded);
586
+ const chunk_byte_offset = elements_uploaded * record_stride;
587
+ const chunk_byte_size = chunk_count * record_stride;
588
+
589
+ assert.isNonNegativeInteger(chunk_count, 'chunk_count');
590
+
591
+ // immediate data — a plain value written straight into the pass, not a buffer
592
+ const settings = {
593
+ count: chunk_count,
594
+ // record_size is read by the upload shader as a count of
595
+ // GPU_DATABASE_BUFFER_ELEMENT_TYPE (u32) units. Records
596
+ // are stored at type.size stride (no record-level padding),
597
+ // with WGSL alignment applied within fields and array elements.
598
+ record_size: table_descriptor.packed_element_size_bytes / GPU_DATABASE_BUFFER_ELEMENT_TYPE.size,
599
+ elements_per_page: table_descriptor.elements_per_page,
600
+ page_lookup_address: table_descriptor.page_lookup_address,
601
+ page_header_words: table_descriptor.page_header_words,
602
+ page_limit: table_descriptor.page_limit,
603
+ };
604
+
605
+ const upload_buffer = encoder.allocateTransientBufferAndLoad(
606
+ upload_data.data,
607
+ GPUBufferUsage.STORAGE,
608
+ chunk_byte_offset,
609
+ chunk_byte_size
610
+ );
611
+
612
+ gpu_table_element_upload_shader.dispatchThreads({
613
+ encoder,
614
+ bindings: {
615
+ settings,
616
+ upload_buffer,
617
+ database: this.buffer,
618
+ },
619
+ thread_count_x: chunk_count,
620
+ });
621
+
622
+ elements_uploaded += chunk_count;
623
+ }
624
+
625
+ // reset upload buffer
626
+ upload_data.position = 0;
627
+ }
628
+
629
+ /**
630
+ * Dispatch a table's pending sub-record ("partial") writes and rewind both of that stream's
631
+ * buffers.
632
+ *
633
+ * The stream is a fixed-stride descriptor array plus a data blob the descriptors index. One
634
+ * thread per descriptor, so chunking is a descriptor count — but the data words a chunk's
635
+ * descriptors reach have to travel with it. That works because both buffers are append-only
636
+ * and grow together: descriptor `data_offset` is non-decreasing, so a run of descriptors owns
637
+ * one contiguous slice of the blob. The dispatch carries the slice's base and the shader
638
+ * subtracts it.
639
+ *
640
+ * @param {GPUTypedTable} table
641
+ * @param {ShadeGPUCommandContext} encoder
642
+ */
643
+ #upload_partial_ranges(table, encoder) {
644
+ const descriptors = table.partial_upload_descriptors;
645
+ const descriptor_cursor = descriptors.position;
646
+
647
+ if (descriptor_cursor === 0) {
648
+ // nothing pending — the cost of the whole feature to a table that never uses it
649
+ return;
650
+ }
651
+
652
+ const data = table.partial_upload_data;
653
+ const word_size = GPU_DATABASE_BUFFER_ELEMENT_TYPE.size;
654
+ const descriptor_stride = GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS * word_size;
655
+ const total_descriptor_count = descriptor_cursor / descriptor_stride;
656
+
657
+ assert.isNonNegativeInteger(total_descriptor_count, 'total_descriptor_count');
658
+
659
+ const descriptor_words = new Uint32Array(descriptors.data, 0, descriptor_cursor / word_size);
660
+
661
+ const table_descriptor = table.descriptor;
662
+
663
+ const max_descriptors_per_chunk = Math.max(1, Math.floor(UPLOAD_CHUNK_SIZE / descriptor_stride));
664
+
665
+ let descriptors_uploaded = 0;
666
+
667
+ while (descriptors_uploaded < total_descriptor_count) {
668
+ const chunk_data_start = descriptor_words[descriptors_uploaded * GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS + 3];
669
+
670
+ let chunk_count = 0;
671
+ let chunk_data_end = chunk_data_start;
672
+
673
+ while (
674
+ chunk_count < max_descriptors_per_chunk
675
+ && descriptors_uploaded + chunk_count < total_descriptor_count
676
+ ) {
677
+ const base = (descriptors_uploaded + chunk_count) * GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS;
678
+ const range_end = descriptor_words[base + 3] + descriptor_words[base + 2];
679
+ const next_data_end = Math.max(chunk_data_end, range_end);
680
+
681
+ // Always take one descriptor, however big its range — a range can't exceed a
682
+ // record, and a record can't exceed a page.
683
+ if (chunk_count > 0 && (next_data_end - chunk_data_start) * word_size > UPLOAD_CHUNK_SIZE) {
684
+ break;
685
+ }
686
+
687
+ chunk_data_end = next_data_end;
688
+ chunk_count++;
689
+ }
690
+
691
+ // A chunk whose descriptors were all retired reads no data at all, and a zero-sized
692
+ // transient buffer is not allocatable. Every descriptor appended at least one word, so
693
+ // one word is always there to bind.
694
+ const chunk_data_bytes = Math.max(word_size, (chunk_data_end - chunk_data_start) * word_size);
695
+
696
+ const settings = {
697
+ count: chunk_count,
698
+ record_size: table_descriptor.packed_element_size_bytes / word_size,
699
+ elements_per_page: table_descriptor.elements_per_page,
700
+ page_lookup_address: table_descriptor.page_lookup_address,
701
+ page_header_words: table_descriptor.page_header_words,
702
+ page_limit: table_descriptor.page_limit,
703
+ data_word_base: chunk_data_start,
704
+ };
705
+
706
+ const descriptor_buffer = encoder.allocateTransientBufferAndLoad(
707
+ descriptors.data,
708
+ GPUBufferUsage.STORAGE,
709
+ descriptors_uploaded * descriptor_stride,
710
+ chunk_count * descriptor_stride
711
+ );
712
+
713
+ const data_buffer = encoder.allocateTransientBufferAndLoad(
714
+ data.data,
715
+ GPUBufferUsage.STORAGE,
716
+ chunk_data_start * word_size,
717
+ chunk_data_bytes
718
+ );
719
+
720
+ gpu_table_partial_upload_shader.dispatchThreads({
721
+ encoder,
722
+ bindings: {
723
+ settings,
724
+ descriptors: descriptor_buffer,
725
+ data: data_buffer,
726
+ database: this.buffer,
727
+ },
728
+ thread_count_x: chunk_count,
729
+ });
730
+
731
+ descriptors_uploaded += chunk_count;
732
+ }
733
+
734
+ table.rewind_partial_upload();
735
+ }
736
+
608
737
  /**
609
738
  * Build and upload the per-page GPU header for every page flagged in
610
739
  * {@link GPUTypedTable.header_dirty_pages}. Header layout:
@@ -24,6 +24,26 @@ export class GPUTypedTable<T> {
24
24
  * @type {BinaryBuffer}
25
25
  */
26
26
  element_upload_buffer: BinaryBuffer;
27
+ /**
28
+ * Sub-record ranges waiting to be uploaded, as fixed-stride descriptors:
29
+ * `[u32 element_index, u32 word_offset, u32 word_count, u32 data_offset]`, where `word_offset`
30
+ * is relative to the start of the record and `data_offset` indexes {@link partial_upload_data}.
31
+ *
32
+ * Separate from {@link element_upload_buffer} because ranges are variable length, and the
33
+ * whole-record shader can only index its buffer by thread id while every record is the same
34
+ * size. See {@link set_bytes} for how the two streams stay out of each other's way.
35
+ *
36
+ * Consumed and rewound by {@link GPUDatabase.update}.
37
+ * @type {BinaryBuffer}
38
+ */
39
+ partial_upload_descriptors: BinaryBuffer;
40
+ /**
41
+ * The words {@link partial_upload_descriptors} point at, appended in descriptor order — so a
42
+ * run of descriptors always owns a contiguous slice of this blob, which is what lets the
43
+ * upload be chunked.
44
+ * @type {BinaryBuffer}
45
+ */
46
+ partial_upload_data: BinaryBuffer;
27
47
  /**
28
48
  * When a page is updated - it is marked as dirty.
29
49
  *
@@ -96,8 +116,79 @@ export class GPUTypedTable<T> {
96
116
  */
97
117
  set(element_index: number, value: T): void;
98
118
  /**
99
- * Trim the upload buffer if it exceeds the configured limit.
100
- * Called after the upload buffer has been consumed during {@link GPUDatabase.update}.
119
+ * Overwrite one field (or sub-struct) of an existing record, leaving the rest of it untouched
120
+ * — on the CPU shadow and on the GPU alike.
121
+ *
122
+ * `byte_offset` says where the value lives inside the record; a caller takes it from the
123
+ * `offset` that its {@link WebGPUStruct} field already carries. Naming an offset rather than a
124
+ * field is deliberate: the table knows nothing about what its type means, and a caller
125
+ * updating several adjacent fields can hand over one covering range instead of three writes.
126
+ *
127
+ * @param {number} element_index row to patch; must already be occupied
128
+ * @param {number} byte_offset offset of the range within the record
129
+ * @param {*} value
130
+ * @param {WebGPUType} type type of `value` as it is laid out at `byte_offset`
131
+ */
132
+ set_range(element_index: number, byte_offset: number, value: any, type: WebGPUType): void;
133
+ /**
134
+ * Overwrite a byte range of an existing record from raw bytes — the primitive
135
+ * {@link set_range} is built on.
136
+ *
137
+ * The range is written to the CPU shadow and queued for the GPU as a sub-record ("partial")
138
+ * upload: a descriptor in {@link partial_upload_descriptors} plus its words in
139
+ * {@link partial_upload_data}, applied by `gpu_table_partial_upload_shader`. Nothing outside
140
+ * `[byte_offset, byte_offset + byte_length)` is serialized, uploaded, or touched, which is the
141
+ * entire point — a caller that owns twelve words of a forty-four word record should pay for
142
+ * twelve.
143
+ *
144
+ * The range must be a whole number of u32 words at a 4-byte-aligned offset. The database
145
+ * buffer is an `array<u32>`, so anything finer would need a masked read-modify-write on the
146
+ * GPU; every WGSL field is at least 4-byte aligned, so the restriction costs a real caller
147
+ * nothing.
148
+ *
149
+ * The row must already be occupied. A partial write patches a record, it never creates one:
150
+ * allocating a page here would publish a row whose other fields nobody ever wrote.
151
+ *
152
+ * ## Ordering
153
+ *
154
+ * Within one update cycle a word of a row must end up with exactly one pending writer, or the
155
+ * writes race — each upload entry is consumed by its own thread within a single dispatch, and
156
+ * the GPU is free to retire threads in any order. In append order:
157
+ *
158
+ * - **partial after whole-record** — the pending whole record is patched in place and nothing
159
+ * is appended, so the row is not in both streams at once. This is the one case bounded by
160
+ * {@link UPLOAD_BUFFER_DEDUP_LOOKBACK}, since it borrows {@link set}'s backwards scan. A
161
+ * whole record further back than the window is missed and the range is queued beside it —
162
+ * still correct, because {@link GPUDatabase.update} dispatches a table's whole records
163
+ * before its ranges, so the range lands on top of the record exactly as append order said.
164
+ * - **whole-record after partial** — {@link set} retires the row's pending descriptors (blanks
165
+ * their word count, making those threads no-ops); the whole record supersedes them.
166
+ * - **partial after partial, the same range or a sub-range of a pending one** — the pending
167
+ * descriptor's words are patched in place.
168
+ * - **partial after partial, disjoint ranges** — both stay. Different words, different
169
+ * threads, no race. This is what keeps a caller updating three scattered fields cheap.
170
+ * - **partial after partial, overlapping without containment** — the overlapping descriptors
171
+ * are retired and one covering their union is appended, its words read back out of the CPU
172
+ * shadow, which is already correct by then.
173
+ *
174
+ * Every case but the first is exact rather than windowed: a row's pending descriptors are
175
+ * indexed by id, so they are found however long the stream has grown.
176
+ *
177
+ * @param {number} element_index row to patch; must already be occupied
178
+ * @param {number} byte_offset offset of the range within the record, 4-byte aligned
179
+ * @param {ArrayBuffer|ArrayBufferView} source
180
+ * @param {number} [source_offset] byte offset into `source`
181
+ * @param {number} [byte_length] length of the range, a whole number of u32 words
182
+ */
183
+ set_bytes(element_index: number, byte_offset: number, source: ArrayBuffer | ArrayBufferView, source_offset?: number, byte_length?: number): void;
184
+ /**
185
+ * Drop the partial upload stream, its per-row index included. Called by
186
+ * {@link GPUDatabase.update} once the stream has been dispatched.
187
+ */
188
+ rewind_partial_upload(): void;
189
+ /**
190
+ * Trim the upload buffers if they exceed the configured limit.
191
+ * Called after the upload buffers have been consumed during {@link GPUDatabase.update}.
101
192
  */
102
193
  trim_upload_buffer(): void;
103
194
  /**
@@ -163,6 +254,7 @@ export class GPUTypedTable<T> {
163
254
  }
164
255
  export type GPUTypedTableDescriptor = import("./GPUTypedTableDescriptor.js").GPUTypedTableDescriptor;
165
256
  export type PageBufferPool = import("./PageBufferPool.js").PageBufferPool;
257
+ export type WebGPUType = import("../../shader/type/WebGPUType.js").WebGPUType;
166
258
  import { GPUPageMetadata } from "./GPUPageMetadata.js";
167
259
  import { BinaryBuffer } from "../../../../core/binary/BinaryBuffer.js";
168
260
  import { BitSet } from "../../../../core/binary/BitSet.js";
@@ -1 +1 @@
1
- {"version":3,"file":"GPUTypedTable.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUTypedTable.js"],"names":[],"mappings":"AA4CA;;;GAGG;AACH;IAmDI;;;OAGG;IACH,wBAFW,uBAAuB,EASjC;IA5DD;;OAEG;IACH,YAFU,uBAAuB,CAEtB;IAEX;;;;OAIG;IACH,OAFU,IAAI,MAAM,EAAC,eAAe,CAAC,CAEnB;IAElB;;;;OAIG;IACH,uBAFU,YAAY,CAE6D;IAEnF;;;;;OAKG;IACH,iBAFU,MAAM,CAEe;IAE/B;;;;OAIG;IACH,WAFU,MAAM,CAES;IAEzB;;;;;;OAMG;IACH,oBAFU,MAAM,CAEkB;IAElC;;;OAGG;IACH,kBAFU,cAAc,GAAC,SAAS,CAEjB;IAejB;;;;;OAKG;IACH,WAHW,CAAC,GACC,MAAM,CAQlB;IAED;;;;;OAKG;IACH,sBAFW,MAAM,QAkChB;IAED;;;;;;;;;;OAUG;IACH,cAcC;IAoED;;;;;;OAMG;IACH,mBAJW,MAAM,GACJ,CAAC,GAAC,SAAS,CA4BvB;IAgDD;;;OAGG;IACH,cAsBC;IA+BD;;;;OAIG;IACH,mBAHW,MAAM,SACN,CAAC,QAkFX;IAED;;;OAGG;IACH,2BAIC;IAED;;OAEG;IACH,oBAEC;IAED;;;;;;;;;;OAUG;IACH,+BAEC;IAED;;;;;;;;;;OAUG;IACH,mCAJW,WAAW,UACX,MAAM,GACL,MAAM,CAoBjB;IAED;;;;;;;;;;;;OAYG;IACH,kCAMC;IAED;;;;;;;;;;;;;;OAcG;IACH,mCAHW,MAAM,GACL,MAAM,CAKjB;IAED,mBAEC;;CACJ;sCAnkBY,OAAO,8BAA8B,EAAE,uBAAuB;6BAC9D,OAAO,qBAAqB,EAAE,cAAc;gCAJzB,sBAAsB;6BAPzB,yCAAyC;uBAC/C,mCAAmC"}
1
+ {"version":3,"file":"GPUTypedTable.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUTypedTable.js"],"names":[],"mappings":"AAoFA;;;GAGG;AACH;IAkGI;;;OAGG;IACH,wBAFW,uBAAuB,EASjC;IA3GD;;OAEG;IACH,YAFU,uBAAuB,CAEtB;IAEX;;;;OAIG;IACH,OAFU,IAAI,MAAM,EAAC,eAAe,CAAC,CAEnB;IAElB;;;;OAIG;IACH,uBAFU,YAAY,CAE6D;IAEnF;;;;;;;;;;;OAWG;IACH,4BAFU,YAAY,CAE6B;IAEnD;;;;;OAKG;IACH,qBAFU,YAAY,CAEsB;IA2B5C;;;;;OAKG;IACH,iBAFU,MAAM,CAEe;IAE/B;;;;OAIG;IACH,WAFU,MAAM,CAES;IAEzB;;;;;;OAMG;IACH,oBAFU,MAAM,CAEkB;IAElC;;;OAGG;IACH,kBAFU,cAAc,GAAC,SAAS,CAEjB;IAejB;;;;;OAKG;IACH,WAHW,CAAC,GACC,MAAM,CAQlB;IAED;;;;;OAKG;IACH,sBAFW,MAAM,QAkChB;IAED;;;;;;;;;;OAUG;IACH,cAcC;IAwED;;;;;;OAMG;IACH,mBAJW,MAAM,GACJ,CAAC,GAAC,SAAS,CA4BvB;IAgDD;;;OAGG;IACH,cAsBC;IA+BD;;;;OAIG;IACH,mBAHW,MAAM,SACN,CAAC,QAuFX;IAED;;;;;;;;;;;;;OAaG;IACH,yBALW,MAAM,eACN,MAAM,oBAEN,UAAU,QAqBpB;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiDG;IACH,yBANW,MAAM,eACN,MAAM,UACN,WAAW,GAAC,eAAe,kBAC3B,MAAM,gBACN,MAAM,QAoEhB;IAiJD;;;OAGG;IACH,8BAMC;IAED;;;OAGG;IACH,2BAYC;IAED;;OAEG;IACH,oBAEC;IAED;;;;;;;;;;OAUG;IACH,+BAEC;IAED;;;;;;;;;;OAUG;IACH,mCAJW,WAAW,UACX,MAAM,GACL,MAAM,CAoBjB;IAED;;;;;;;;;;;;OAYG;IACH,kCAMC;IAED;;;;;;;;;;;;;;OAcG;IACH,mCAHW,MAAM,GACL,MAAM,CAKjB;IAED,mBAEC;;CACJ;sCA79BY,OAAO,8BAA8B,EAAE,uBAAuB;6BAC9D,OAAO,qBAAqB,EAAE,cAAc;yBAC5C,OAAO,iCAAiC,EAAE,UAAU;gCALjC,sBAAsB;6BATzB,yCAAyC;uBAC/C,mCAAmC"}