@woosh/meep-engine 3.25.0 → 3.27.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 (295) hide show
  1. package/package.json +1 -1
  2. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +542 -0
  3. package/src/core/binary/lz4/LZ4_LEVEL.d.ts +33 -0
  4. package/src/core/binary/lz4/LZ4_LEVEL.d.ts.map +1 -0
  5. package/src/core/binary/lz4/LZ4_LEVEL.js +32 -0
  6. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts +33 -0
  7. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts.map +1 -0
  8. package/src/core/binary/lz4/lz4_compress_block_at_level.js +47 -0
  9. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts +40 -0
  10. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts.map +1 -0
  11. package/src/core/binary/lz4/lz4_compress_block_hc.js +1382 -0
  12. package/src/core/binary/lz4/lz4_decompress_block.d.ts +2 -1
  13. package/src/core/binary/lz4/lz4_decompress_block.d.ts.map +1 -1
  14. package/src/core/binary/lz4/lz4_decompress_block.js +31 -6
  15. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +66 -0
  16. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  17. package/src/core/geom/3d/shape/HeightMapShape3D.js +314 -20
  18. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  19. package/src/core/geom/3d/shape/PosedShape3D.js +57 -0
  20. package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
  21. package/src/core/geom/3d/shape/TransformedShape3D.js +102 -0
  22. package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
  23. package/src/core/geom/3d/shape/UnionShape3D.js +64 -0
  24. package/src/engine/physics/cloth/MEASUREMENTS.md +582 -0
  25. package/src/engine/physics/cloth/PLAN.md +330 -49
  26. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +84 -17
  27. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
  28. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +451 -42
  29. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +65 -7
  30. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  31. package/src/engine/physics/cloth/ecs/ClothInstance.js +72 -8
  32. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +25 -4
  33. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  34. package/src/engine/physics/cloth/ecs/ClothSystem.js +75 -8
  35. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +41 -4
  36. package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
  37. package/src/engine/physics/cloth/ecs/ClothWorld.js +207 -63
  38. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +10 -0
  39. package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
  40. package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +17 -1
  41. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +27 -3
  42. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
  43. package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +28 -3
  44. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +75 -10
  45. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
  46. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +131 -12
  47. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -0
  48. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
  49. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +249 -201
  50. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -0
  51. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  52. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +62 -1
  53. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  54. package/src/engine/physics/cloth/ecs/cloth_write_back.js +18 -10
  55. package/src/engine/physics/cloth/playground/collide_main.js +1 -1
  56. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +29 -8
  57. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
  58. package/src/engine/physics/cloth/solver/cloth_contact_find.js +37 -9
  59. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +12 -2
  60. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  61. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +12 -2
  62. package/src/engine/physics/cloth/solver/cloth_step_instance.js +1 -1
  63. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts +9 -2
  64. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts.map +1 -1
  65. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.js +9 -2
  66. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +23 -9
  67. package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts.map +1 -1
  68. package/src/engine/physics/cloth/wind/AbstractClothWind.js +23 -9
  69. package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts +7 -5
  70. package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts.map +1 -1
  71. package/src/engine/physics/cloth/wind/ClothAmbientWind.js +12 -9
  72. package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
  73. package/src/engine/physics/cloth/wind/ClothFluidWind.js +5 -2
  74. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +7 -2
  75. package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
  76. package/src/engine/physics/cloth/wind/cloth_sample_air.js +12 -5
  77. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  78. package/src/shade/playground/vgeo_runtime/README.md +167 -22
  79. package/src/shade/playground/vgeo_runtime/index.html +112 -62
  80. package/src/shade/playground/vgeo_runtime/main.js +660 -83
  81. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
  82. package/src/shade/playground/vgeo_viewer/sample_asset.js +19 -2
  83. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +11 -0
  84. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  85. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +16 -8
  86. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  87. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +16 -11
  88. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +73 -5
  89. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +26 -15
  90. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +5 -3
  91. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +18 -0
  92. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  93. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +20 -0
  94. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
  95. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +56 -9
  96. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  97. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -0
  98. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +22 -0
  99. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  100. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +24 -0
  101. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +12 -0
  102. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  103. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +13 -0
  104. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +8 -1
  105. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  106. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +11 -3
  107. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +9 -0
  108. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  109. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +10 -1
  110. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts +18 -0
  111. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map +1 -0
  112. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js +17 -0
  113. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts +8 -0
  114. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts.map +1 -0
  115. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js +7 -0
  116. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +3 -0
  117. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -0
  118. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts +14 -0
  119. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts.map +1 -0
  120. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js +13 -0
  121. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts +11 -0
  122. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map +1 -0
  123. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js +10 -0
  124. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +20 -0
  125. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
  126. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +20 -2
  127. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +4 -0
  128. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
  129. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +4 -0
  130. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +29 -3
  131. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  132. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +81 -122
  133. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +40 -0
  134. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  135. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +44 -0
  136. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +69 -0
  137. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -0
  138. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +236 -0
  139. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +14 -0
  140. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
  141. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +15 -0
  142. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts +31 -0
  143. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map +1 -0
  144. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js +32 -0
  145. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +10 -0
  146. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
  147. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +21 -1
  148. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts +15 -0
  149. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts.map +1 -0
  150. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js +84 -0
  151. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts +22 -0
  152. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -0
  153. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +96 -0
  154. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  155. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +55 -0
  156. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  157. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +202 -13
  158. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  159. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +147 -10
  160. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +637 -0
  161. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +33 -36
  162. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -1
  163. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +109 -193
  164. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +58 -28
  165. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  166. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +77 -105
  167. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
  168. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +105 -22
  169. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +548 -0
  170. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +29 -50
  171. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  172. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +47 -489
  173. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts +84 -0
  174. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -0
  175. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +393 -0
  176. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts +234 -0
  177. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -0
  178. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +1363 -0
  179. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts +81 -0
  180. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts.map +1 -0
  181. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.js +89 -0
  182. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +53 -34
  183. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  184. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +407 -124
  185. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +100 -0
  186. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -0
  187. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +219 -0
  188. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts +17 -0
  189. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts.map +1 -0
  190. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js +47 -0
  191. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts +20 -0
  192. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js +19 -0
  194. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -1
  195. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +30 -12
  196. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  197. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +15 -0
  198. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  199. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +18 -1
  200. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -1
  201. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +5 -15
  202. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts +3 -0
  203. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts.map +1 -0
  204. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.js +77 -0
  205. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts +3 -0
  206. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -0
  207. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +186 -0
  208. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
  209. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +20 -8
  210. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  211. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +580 -188
  212. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +15 -18
  213. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -1
  214. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +19 -28
  215. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  216. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +45 -25
  217. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  218. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +11 -0
  219. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  220. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +0 -1
  221. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +12 -10
  222. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +1 -0
  223. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +8 -0
  224. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +7 -2
  225. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -1
  226. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +8 -3
  227. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +2 -0
  228. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +19 -0
  229. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -1
  230. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +1 -1
  231. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts +5 -0
  232. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts.map +1 -0
  233. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js +22 -0
  234. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts +14 -0
  235. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts.map +1 -0
  236. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js +13 -0
  237. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts +17 -0
  238. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map +1 -0
  239. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js +16 -0
  240. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts +15 -0
  241. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts.map +1 -0
  242. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js +16 -0
  243. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts +23 -0
  244. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts.map +1 -0
  245. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js +28 -0
  246. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts +2 -0
  247. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts.map +1 -0
  248. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js +13 -0
  249. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +10 -5
  250. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -1
  251. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +15 -6
  252. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +6 -1
  253. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  254. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +38 -1
  255. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  256. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +4 -3
  257. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  258. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  259. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +6 -3
  260. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  261. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +6 -3
  262. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  263. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  264. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -4
  265. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +2 -0
  266. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  267. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  268. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  269. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +3 -5
  270. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  271. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +3 -4
  272. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  273. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -4
  274. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  275. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +7 -7
  276. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  277. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +83 -78
  278. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  279. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +7 -1
  280. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  281. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +7 -1
  282. package/src/shade/renderer/scene/GPUSceneContext.d.ts +22 -2
  283. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  284. package/src/shade/renderer/scene/GPUSceneContext.js +59 -4
  285. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  286. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +92 -16
  287. package/src/shade/renderer/view/GPUViewContext.d.ts +5 -0
  288. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  289. package/src/shade/renderer/view/GPUViewContext.js +21 -0
  290. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  291. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +74 -3
  292. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +0 -723
  293. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
  294. package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
  295. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Words of frontier one view keeps: one bit per page row of the tier it cuts against.
3
+ *
4
+ * The frontier is the set of pages a view's cut is standing on, and it is a **bitmask over page
5
+ * rows** rather than a list of groups because that is the granularity everything else in the cut
6
+ * already speaks: a page is what `vg_claim_page` claims, what a page visit evaluates whole, and what
7
+ * both directions of the traversal cross. A reseed hands the descent those pages instead of node 0
8
+ * of the root, and CUT_PLAN_2026_09_14 §7.5's coarsen path carries it the rest of the way.
9
+ *
10
+ * It is small. A 4,096-row tier is 128 words — half a kilobyte a view — against the 120–160 KB §5
11
+ * sizes a group-level frontier at, and it needs no allocator, no compaction and no entry format.
12
+ * What it gives up is per-instance keying (§1.1): two instances of one geometry at different
13
+ * distances share one page set, which is a superset of each one's own and therefore correct, but
14
+ * costs the closer instance a few page visits it did not need.
15
+ *
16
+ * @param {number} page_row_capacity
17
+ * @returns {number} words
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+ export function vgeo_frontier_words(page_row_capacity: number): number;
23
+ //# sourceMappingURL=vgeo_frontier_words.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_frontier_words.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uDANW,MAAM,GACJ,MAAM,CASlB"}
@@ -0,0 +1,28 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+
3
+ /**
4
+ * Words of frontier one view keeps: one bit per page row of the tier it cuts against.
5
+ *
6
+ * The frontier is the set of pages a view's cut is standing on, and it is a **bitmask over page
7
+ * rows** rather than a list of groups because that is the granularity everything else in the cut
8
+ * already speaks: a page is what `vg_claim_page` claims, what a page visit evaluates whole, and what
9
+ * both directions of the traversal cross. A reseed hands the descent those pages instead of node 0
10
+ * of the root, and CUT_PLAN_2026_09_14 §7.5's coarsen path carries it the rest of the way.
11
+ *
12
+ * It is small. A 4,096-row tier is 128 words — half a kilobyte a view — against the 120–160 KB §5
13
+ * sizes a group-level frontier at, and it needs no allocator, no compaction and no entry format.
14
+ * What it gives up is per-instance keying (§1.1): two instances of one geometry at different
15
+ * distances share one page set, which is a superset of each one's own and therefore correct, but
16
+ * costs the closer instance a few page visits it did not need.
17
+ *
18
+ * @param {number} page_row_capacity
19
+ * @returns {number} words
20
+ *
21
+ * @author Alex Goldring
22
+ * @copyright Company Named Limited (c) 2026
23
+ */
24
+ export function vgeo_frontier_words(page_row_capacity) {
25
+ assert.isNonNegativeInteger(page_row_capacity, 'page_row_capacity');
26
+
27
+ return Math.ceil(page_row_capacity / 32);
28
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vgeo_page.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_page.worker.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { vgeo_page_worker_serve } from "../format/read/vgeo_page_worker_serve.js";
2
+
3
+ /**
4
+ * The page-fetch worker: reads, verifies and decodes pages off the main thread.
5
+ *
6
+ * Nothing here but the serve call; the protocol lives with the core in `format/read/` so a spec can
7
+ * run it over a loopback, and this file exists so that {@link make_vgeo_page_worker} has a module
8
+ * to point a `Worker` at.
9
+ *
10
+ * @author Alex Goldring
11
+ * @copyright Company Named Limited (c) 2026
12
+ */
13
+ vgeo_page_worker_serve(self);
@@ -1,18 +1,23 @@
1
1
  /**
2
2
  * How many arena words one page's block runs to.
3
3
  *
4
- * A page is **one allocation** — `[node rows][group rows][cluster rows]`, back to back — so this is
5
- * the whole of what installing it costs the arena and the whole of what evicting it returns. Every
6
- * base inside the block is a count away from the block's own start, which is why a page row carries
7
- * three counts and one offset and nothing can move inside a resident page.
4
+ * A page is **one allocation** — `[node rows][group rows][cluster rows][parent rows]`, back to
5
+ * back — so this is the whole of what installing it costs the arena and the whole of what evicting
6
+ * it returns. Every base inside the block is a count away from the block's own start, which is why
7
+ * a page row carries the counts and nothing can move inside a resident page.
8
+ *
9
+ * The parent rows are last because they are the section a page may not have: a container written
10
+ * before `format_version` 4 carries no upward edge, `parent_entry_count` is zero, and the block is
11
+ * exactly what it was.
8
12
  *
9
13
  * @param {number} node_count
10
14
  * @param {number} group_count
11
15
  * @param {number} cluster_count
16
+ * @param {number} [parent_entry_count]
12
17
  * @returns {number} words
13
18
  *
14
19
  * @author Alex Goldring
15
20
  * @copyright Company Named Limited (c) 2026
16
21
  */
17
- export function vgeo_runtime_page_block_words(node_count: number, group_count: number, cluster_count: number): number;
22
+ export function vgeo_runtime_page_block_words(node_count: number, group_count: number, cluster_count: number, parent_entry_count?: number): number;
18
23
  //# sourceMappingURL=vgeo_runtime_page_block_words.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_runtime_page_block_words.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,0DARW,MAAM,eACN,MAAM,iBACN,MAAM,GACJ,MAAM,CASlB"}
1
+ {"version":3,"file":"vgeo_runtime_page_block_words.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,0DATW,MAAM,eACN,MAAM,iBACN,MAAM,uBACN,MAAM,GACJ,MAAM,CAYlB"}
@@ -1,25 +1,34 @@
1
1
  import { VGEO_CLUSTER_ROW_WORDS } from "./layout/VGEO_CLUSTER_ROW_WORDS.js";
2
2
  import { VGEO_GROUP_ROW_WORDS } from "./layout/VGEO_GROUP_ROW_WORDS.js";
3
3
  import { VGEO_NODE_ROW_WORDS } from "./layout/VGEO_NODE_ROW_WORDS.js";
4
+ import { VGEO_PARENT_ROW_WORDS } from "./layout/VGEO_PARENT_ROW_WORDS.js";
4
5
 
5
6
  /**
6
7
  * How many arena words one page's block runs to.
7
8
  *
8
- * A page is **one allocation** — `[node rows][group rows][cluster rows]`, back to back — so this is
9
- * the whole of what installing it costs the arena and the whole of what evicting it returns. Every
10
- * base inside the block is a count away from the block's own start, which is why a page row carries
11
- * three counts and one offset and nothing can move inside a resident page.
9
+ * A page is **one allocation** — `[node rows][group rows][cluster rows][parent rows]`, back to
10
+ * back — so this is the whole of what installing it costs the arena and the whole of what evicting
11
+ * it returns. Every base inside the block is a count away from the block's own start, which is why
12
+ * a page row carries the counts and nothing can move inside a resident page.
13
+ *
14
+ * The parent rows are last because they are the section a page may not have: a container written
15
+ * before `format_version` 4 carries no upward edge, `parent_entry_count` is zero, and the block is
16
+ * exactly what it was.
12
17
  *
13
18
  * @param {number} node_count
14
19
  * @param {number} group_count
15
20
  * @param {number} cluster_count
21
+ * @param {number} [parent_entry_count]
16
22
  * @returns {number} words
17
23
  *
18
24
  * @author Alex Goldring
19
25
  * @copyright Company Named Limited (c) 2026
20
26
  */
21
- export function vgeo_runtime_page_block_words(node_count, group_count, cluster_count) {
27
+ export function vgeo_runtime_page_block_words(
28
+ node_count, group_count, cluster_count, parent_entry_count = 0
29
+ ) {
22
30
  return node_count * VGEO_NODE_ROW_WORDS
23
31
  + group_count * VGEO_GROUP_ROW_WORDS
24
- + cluster_count * VGEO_CLUSTER_ROW_WORDS;
32
+ + cluster_count * VGEO_CLUSTER_ROW_WORDS
33
+ + parent_entry_count * VGEO_PARENT_ROW_WORDS;
25
34
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Lay one decoded page's node, group and cluster rows into the arena.
2
+ * Lay one decoded page's node, group, cluster and parent rows into the arena.
3
3
  *
4
4
  * This is the whole of what a page install writes besides its payload, and it is deliberately a
5
5
  * free function over two views rather than a method: the pool calls it against a mapped GPU upload
@@ -14,6 +14,11 @@
14
14
  * resolves to a page that is trivially resident — itself — and falls straight through to the
15
15
  * selectability question, which is the only one it was ever really asking.
16
16
  *
17
+ * The parent rows (format §6.3) get the same treatment for the same reason, off the page's own
18
+ * parent-page table rather than its child table. A page from a container written before
19
+ * `format_version` 4 has no such table, so the section is empty and the page row's
20
+ * `PARENT_ENTRY_COUNT` says zero — which is what a kernel checks, rather than asking a version.
21
+ *
17
22
  * Group selectability is **not** written here. It changes after install, as the reader's activation
18
23
  * cascades run, and it is the one field of a resident page that moves.
19
24
  *
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_runtime_write_page_block.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qDAXW,WAAW,UACX,YAAY,QAEZ,MAAM,mBAEJ,MAAM,CAoGlB"}
1
+ {"version":3,"file":"vgeo_runtime_write_page_block.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qDAXW,WAAW,UACX,YAAY,QAEZ,MAAM,mBAEJ,MAAM,CAkIlB"}
@@ -10,9 +10,11 @@ import { VGEO_NODE_ROW_LEAF_BIT } from "./layout/VGEO_NODE_ROW_LEAF_BIT.js";
10
10
  import { VGEO_NODE_ROW_OFFSET } from "./layout/VGEO_NODE_ROW_OFFSET.js";
11
11
  import { VGEO_NODE_ROW_WORDS } from "./layout/VGEO_NODE_ROW_WORDS.js";
12
12
  import { VGEO_NO_CHILD_PAGE } from "./layout/VGEO_NO_CHILD_PAGE.js";
13
+ import { VGEO_PARENT_ROW_OFFSET } from "./layout/VGEO_PARENT_ROW_OFFSET.js";
14
+ import { VGEO_PARENT_ROW_WORDS } from "./layout/VGEO_PARENT_ROW_WORDS.js";
13
15
 
14
16
  /**
15
- * Lay one decoded page's node, group and cluster rows into the arena.
17
+ * Lay one decoded page's node, group, cluster and parent rows into the arena.
16
18
  *
17
19
  * This is the whole of what a page install writes besides its payload, and it is deliberately a
18
20
  * free function over two views rather than a method: the pool calls it against a mapped GPU upload
@@ -27,6 +29,11 @@ import { VGEO_NO_CHILD_PAGE } from "./layout/VGEO_NO_CHILD_PAGE.js";
27
29
  * resolves to a page that is trivially resident — itself — and falls straight through to the
28
30
  * selectability question, which is the only one it was ever really asking.
29
31
  *
32
+ * The parent rows (format §6.3) get the same treatment for the same reason, off the page's own
33
+ * parent-page table rather than its child table. A page from a container written before
34
+ * `format_version` 4 has no such table, so the section is empty and the page row's
35
+ * `PARENT_ENTRY_COUNT` says zero — which is what a kernel checks, rather than asking a version.
36
+ *
30
37
  * Group selectability is **not** written here. It changes after install, as the reader's activation
31
38
  * cascades run, and it is the one field of a resident page that moves.
32
39
  *
@@ -51,6 +58,7 @@ export function vgeo_runtime_write_page_block(words, floats, base, page) {
51
58
 
52
59
  const group_base = base + node_count * VGEO_NODE_ROW_WORDS;
53
60
  const cluster_base = group_base + group_count * VGEO_GROUP_ROW_WORDS;
61
+ const parent_base = cluster_base + cluster_count * VGEO_CLUSTER_ROW_WORDS;
54
62
 
55
63
  let broken_child_refs = 0;
56
64
 
@@ -84,6 +92,7 @@ export function vgeo_runtime_write_page_block(words, floats, base, page) {
84
92
  tier's answer costs.
85
93
  */
86
94
  words[row + VGEO_GROUP_ROW_OFFSET.PARENT_COUNT] = page.group_parent_count[group];
95
+ words[row + VGEO_GROUP_ROW_OFFSET.PARENT_FIRST] = page.group_parent_first[group] ?? 0;
87
96
 
88
97
  // not selectable until activation says so; a page installs drawing nothing. Any other
89
98
  // default draws a group before the ancestors it hangs off have arrived.
@@ -134,5 +143,33 @@ export function vgeo_runtime_write_page_block(words, floats, base, page) {
134
143
  words[row + VGEO_CLUSTER_ROW_OFFSET.CHILD_REF] = child_ref;
135
144
  }
136
145
 
146
+ for (let entry = 0; entry < page.parent_ref.length; entry++) {
147
+ const row = parent_base + entry * VGEO_PARENT_ROW_WORDS;
148
+
149
+ const parent_ref = page.parent_ref[entry];
150
+
151
+ /*
152
+ A parent_ref outside the page's parent-page table is the upward twin of a broken child_ref
153
+ and is counted with it: format §11.16 forbids it, validation is off by default, and the
154
+ cluster it would have named does not exist. Pointing it at this page would be worse than
155
+ admitting there is nothing there — VGEO_NO_CHILD_PAGE never resolves, so a walk up stops
156
+ and the fallback re-descends, which is correct rather than merely safe.
157
+ */
158
+ let parent_page_index;
159
+
160
+ if (parent_ref === VGEO_SAME_PAGE) {
161
+ parent_page_index = page.index;
162
+ } else if (parent_ref < page.parent_page_index.length) {
163
+ parent_page_index = page.parent_page_index[parent_ref];
164
+ } else {
165
+ parent_page_index = VGEO_NO_CHILD_PAGE;
166
+
167
+ broken_child_refs++;
168
+ }
169
+
170
+ words[row + VGEO_PARENT_ROW_OFFSET.PAGE_INDEX] = parent_page_index;
171
+ words[row + VGEO_PARENT_ROW_OFFSET.CLUSTER] = page.parent_cluster[entry];
172
+ }
173
+
137
174
  return broken_child_refs;
138
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shader_sharc_evict.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js"],"names":[],"mappings":"AAkGA,+CAIG;8BAlG2B,kCAAkC"}
1
+ {"version":3,"file":"shader_sharc_evict.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js"],"names":[],"mappings":"AAmGA,+CAIG;8BAnG2B,kCAAkC"}
@@ -26,10 +26,11 @@ const PUSH_CONSTANTS = WebGPUStruct.from({
26
26
  capacity: u32,
27
27
  });
28
28
 
29
- // per-dispatch, eight bytes, read-only: immediate data rather than a uniform buffer
30
- resources.setImmediate("settings", PUSH_CONSTANTS);
31
-
29
+ // TODO(chrome-153): uniform, not immediate — Dawn 153 overwrites immediate data on
30
+ // dispatchWorkgroupsIndirect, so this reads garbage. The graph pass turns the plain
31
+ // value into a transient uniform, so no call site changes.
32
32
  resources.createGroup()
33
+ .addUniform("settings", PUSH_CONSTANTS)
33
34
  .addStorageBuffer('hashMapData', HASH_MAP_DATA_STRUCT, true)
34
35
  .addStorageBuffer("voxelData", WebGPUArray.from(vec4u))
35
36
  .addStorageBuffer('evictionRequests', EVICTION_STRUCT);
@@ -13,7 +13,7 @@ export class TinyGltf {
13
13
  * @readonly
14
14
  * @type {TextureFormat}
15
15
  */
16
- static readonly "__#240@#UNCOMPRESSED_TARGET": TextureFormat;
16
+ static readonly "__#247@#UNCOMPRESSED_TARGET": TextureFormat;
17
17
  /**
18
18
  * @param {AssetManager} assetManager
19
19
  * @param {AssetRequestScope} [scope]
@@ -1 +1 @@
1
- {"version":3,"file":"shader_particle_emit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_emit.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,kDAA8E;AAE9E;;;;;;;;GAQG;AACH,4BAFU,YAAY,CAOK;AAoD3B,iDAIG;6BAxG0B,mCAAmC;8BAGlC,+BAA+B"}
1
+ {"version":3,"file":"shader_particle_emit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_emit.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,kDAA8E;AAE9E;;;;;;;;GAQG;AACH,4BAFU,YAAY,CAOK;AAuD3B,iDAIG;6BA3G0B,mCAAmC;8BAGlC,+BAA+B"}
@@ -52,8 +52,9 @@ export const EMIT_SETTINGS = WebGPUStruct.from({
52
52
 
53
53
  const resources = new ShaderResourceSetDescriptor();
54
54
 
55
- resources.setImmediate('settings', EMIT_SETTINGS);
56
-
55
+ // TODO(chrome-153): uniform, not immediate — Dawn 153 overwrites immediate data on
56
+ // dispatchWorkgroupsIndirect, so this reads garbage. The graph pass turns the plain
57
+ // value into a transient uniform, so no call site changes.
57
58
  resources.createGroup()
58
59
  .addStorageBuffer("scene_database", WebGPUArray.u32, false)
59
60
  .addStorageBuffer("emitter_database", WebGPUArray.u32, false)
@@ -62,7 +63,9 @@ resources.createGroup()
62
63
  .addStorageBuffer("pool", WebGPUArray.u32, true)
63
64
  .addStorageBuffer("alive_out", WebGPUArray.u32, true)
64
65
  .addStorageBuffer("dead", WebGPUArray.u32, true)
65
- .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
66
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true)
67
+ // last in the group, so the storage bindings keep the indices the specs read by
68
+ .addUniform('settings', EMIT_SETTINGS);
66
69
 
67
70
  const body = CodeChunk.from(
68
71
  /* language=wgsl */
@@ -1 +1 @@
1
- {"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":";AAuDA;;;;;GAKG;AACH,gCAFU,YAAY,CAMS;AAsD/B,qDAIG;iDApH8C,yBAAyB;6BAJ7C,mCAAmC;8BAClC,+BAA+B"}
1
+ {"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":";AAuDA;;;;;GAKG;AACH,gCAFU,YAAY,CAMS;AAyD/B,qDAIG;iDAvH8C,yBAAyB;6BAJ7C,mCAAmC;8BAClC,+BAA+B"}
@@ -67,8 +67,9 @@ export const SIMULATE_SETTINGS = WebGPUStruct.from({
67
67
 
68
68
  const resources = new ShaderResourceSetDescriptor();
69
69
 
70
- resources.setImmediate('settings', SIMULATE_SETTINGS);
71
-
70
+ // TODO(chrome-153): uniform, not immediate — Dawn 153 overwrites immediate data on
71
+ // dispatchWorkgroupsIndirect, so this reads garbage. The graph pass turns the plain
72
+ // value into a transient uniform, so no call site changes.
72
73
  resources.createGroup()
73
74
  .addStorageBuffer("scene_database", WebGPUArray.u32, false)
74
75
  .addStorageBuffer("emitter_database", WebGPUArray.u32, false)
@@ -77,7 +78,9 @@ resources.createGroup()
77
78
  .addStorageBuffer("sim_list", WebGPUArray.u32, false)
78
79
  .addStorageBuffer("alive_out", WebGPUArray.u32, true)
79
80
  .addStorageBuffer("dead", WebGPUArray.u32, true)
80
- .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
81
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true)
82
+ // last in the group, so the storage bindings keep the indices the specs read by
83
+ .addUniform('settings', SIMULATE_SETTINGS);
81
84
 
82
85
 
83
86
  const body = CodeChunk.from(/* language=wgsl */ `
@@ -53,7 +53,7 @@ export class NSS {
53
53
  * @returns {number}
54
54
  */
55
55
  static recommended_jitter_sequence_size(upscale_ratio: number): number;
56
- static "__#173@#preprocess_tensor_descriptor"(render_w: any, render_h: any): TextureResourceDescriptor;
56
+ static "__#180@#preprocess_tensor_descriptor"(render_w: any, render_h: any): TextureResourceDescriptor;
57
57
  /**
58
58
  * @param {GraphicsContext} graphics
59
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"prepare_meshlet_draw_commands_by_material.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;GAeG;AACH,uKAJa;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAA;CAAC,CAgUnH"}
1
+ {"version":3,"file":"prepare_meshlet_draw_commands_by_material.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;GAeG;AACH,uKAJa;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAA;CAAC,CAwUnH"}
@@ -2,7 +2,7 @@ import { assert } from "../../../../core/assert.js";
2
2
  import { ceilPowerOfTwo } from "../../../../core/binary/operations/ceilPowerOfTwo.js";
3
3
  import { round_up } from "../../../../core/math/round_up.js";
4
4
  import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
5
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
+ import { u32, vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
6
6
  import { STRUCT_UNINDEXED_DRAW_COMMAND } from "../../gpu_primitive/indirect/STRUCT_UNINDEXED_DRAW_COMMAND.js";
7
7
  import { cpu_build_hash_table } from "../../gpu_primitive/hash_table/cpu_build_hash_table.js";
8
8
  import { graph_prefix_scan_csdldf } from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
@@ -22,7 +22,7 @@ import { shader_count_meshlets_by_material } from "./shader_count_meshlets_by_ma
22
22
  import {
23
23
  shader_make_meshlet_indirect_draw_commands_by_material
24
24
  } from "./shader_make_meshlet_indirect_draw_commands_by_material.js";
25
- import { shader_read_out_bucket } from "./shader_read_out_bucket.js";
25
+ import { PUSH_CONSTANTS, shader_read_out_bucket } from "./shader_read_out_bucket.js";
26
26
  import { shader_sort_meshlets_by_material } from "./shader_sort_meshlets_by_material.js";
27
27
 
28
28
  /**
@@ -83,11 +83,16 @@ export function graph_prepare_meshlet_draw_commands_by_material({
83
83
  0
84
84
  );
85
85
 
86
+ // TODO(chrome-153): transient uniform, not an immediate value — see the shader.
87
+ const u_settings = encoder.allocateTransientValueBuffer(PUSH_CONSTANTS, {
88
+ bucket_id,
89
+ });
90
+
86
91
  shader_read_out_bucket.dispatchIndirect({
87
92
  encoder,
88
93
  command,
89
94
  bindings: {
90
- settings: { bucket_id },
95
+ settings: u_settings,
91
96
  input: buckets_buffer,
92
97
  output,
93
98
  }
@@ -160,12 +165,15 @@ export function graph_prepare_meshlet_draw_commands_by_material({
160
165
  const hzb = resources.get(data.texture_hzb);
161
166
  const command = resources.get(data.command);
162
167
 
168
+ // TODO(chrome-153): transient uniform, not an immediate value — see the shader.
169
+ const u_resolution = encoder.allocateTransientValueBuffer(vec2u, resolution);
170
+
163
171
  shader_hzb_meshlet_filter_1way_full.dispatchIndirect({
164
172
  encoder,
165
173
  command,
166
174
  bindings: {
167
175
  camera: camera_state,
168
- resolution,
176
+ resolution: u_resolution,
169
177
  scene_database: scene.scene_database_buffer,
170
178
  meshlet_metadata: scene.geometries.meshlets.buffer_metadata,
171
179
  texture_hzb: hzb.obtainView(),
@@ -1,3 +1,5 @@
1
+ export const PUSH_CONSTANTS: WebGPUStruct;
1
2
  export const shader_read_out_bucket: ComputeShader;
3
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
2
4
  import { ComputeShader } from "../../shader/ComputeShader.js";
3
5
  //# sourceMappingURL=shader_read_out_bucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_read_out_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js"],"names":[],"mappings":"AAqDA,mDAIE;8BApD4B,+BAA+B"}
1
+ {"version":3,"file":"shader_read_out_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js"],"names":[],"mappings":"AAcA,0CAEG;AAsCH,mDAIE;6BAzD2B,mCAAmC;8BAIlC,+BAA+B"}
@@ -1,58 +1,59 @@
1
- import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
- import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
4
- import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
- import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
6
- import { ComputeShader } from "../../shader/ComputeShader.js";
7
- import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
8
- import {
9
- RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ
10
- } from "../expand/bucket/RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ.js";
11
-
12
-
13
- const resources = new ShaderResourceSetDescriptor();
14
-
15
- const PUSH_CONSTANTS = WebGPUStruct.from({
16
- bucket_id: u32,
17
- });
18
-
19
- // per-dispatch, four bytes, read-only: immediate data rather than a pooled buffer, a staging copy
20
- // and a bind group of its own
21
- resources.setImmediate("settings", PUSH_CONSTANTS);
22
-
23
- resources.createGroup()
24
- .addStorageBuffer("input", RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ)
25
- .addStorageBuffer("output", COLLECTION_U32_STRUCT_READ, true)
26
-
27
- const body = CodeChunk.from(
28
- //language=WGSL
29
- `
30
- @compute @workgroup_size(${COMPUTE_SHADER_DEFAULT_GROUP_SIZE})
31
- fn main(@builtin(global_invocation_id) global_id : vec3<u32>){
32
-
33
- let input_index = global_id.x;
34
-
35
- let bucket_header = input.headers[settings.bucket_id];
36
- let bucket_size = bucket_header.count;
37
-
38
- if(input_index == 0){
39
- output.count = bucket_size;
40
- }
41
-
42
- if(input_index >= bucket_size){
43
- return;
44
- }
45
-
46
- // just copy
47
- let mesh_index = input.elements[input_index + bucket_header.offset];
48
-
49
- output.elements[input_index] = mesh_index;
50
- }
51
- `
52
- );
53
-
54
- export const shader_read_out_bucket = ComputeShader.from({
55
- label: 'Read out bucket',
56
- resources,
57
- body,
1
+ import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
3
+ import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
6
+ import { ComputeShader } from "../../shader/ComputeShader.js";
7
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
8
+ import {
9
+ RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ
10
+ } from "../expand/bucket/RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ.js";
11
+
12
+
13
+ const resources = new ShaderResourceSetDescriptor();
14
+
15
+ export const PUSH_CONSTANTS = WebGPUStruct.from({
16
+ bucket_id: u32,
17
+ });
18
+
19
+ // TODO(chrome-153): uniform, not immediate — Dawn 153 overwrites immediate data on
20
+ // dispatchWorkgroupsIndirect, so this reads 65535 and culls everything. Revert 7c9700b87.
21
+ resources.createGroup()
22
+ .addUniform("settings", PUSH_CONSTANTS);
23
+
24
+ resources.createGroup()
25
+ .addStorageBuffer("input", RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ)
26
+ .addStorageBuffer("output", COLLECTION_U32_STRUCT_READ, true)
27
+
28
+ const body = CodeChunk.from(
29
+ //language=WGSL
30
+ `
31
+ @compute @workgroup_size(${COMPUTE_SHADER_DEFAULT_GROUP_SIZE})
32
+ fn main(@builtin(global_invocation_id) global_id : vec3<u32>){
33
+
34
+ let input_index = global_id.x;
35
+
36
+ let bucket_header = input.headers[settings.bucket_id];
37
+ let bucket_size = bucket_header.count;
38
+
39
+ if(input_index == 0){
40
+ output.count = bucket_size;
41
+ }
42
+
43
+ if(input_index >= bucket_size){
44
+ return;
45
+ }
46
+
47
+ // just copy
48
+ let mesh_index = input.elements[input_index + bucket_header.offset];
49
+
50
+ output.elements[input_index] = mesh_index;
51
+ }
52
+ `
53
+ );
54
+
55
+ export const shader_read_out_bucket = ComputeShader.from({
56
+ label: 'Read out bucket',
57
+ resources,
58
+ body,
58
59
  })
@@ -1 +1 @@
1
- {"version":3,"file":"shader_hzb_mesh_filter_2way.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js"],"names":[],"mappings":"AA8GA,wDAIG;8BAjG2B,kCAAkC"}
1
+ {"version":3,"file":"shader_hzb_mesh_filter_2way.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js"],"names":[],"mappings":"AA4GA,wDAIG;8BA/F2B,kCAAkC"}
@@ -21,12 +21,10 @@ import { ShaderResourceSetDescriptor } from "../../../shader/resource/ShaderReso
21
21
 
22
22
  const resources = new ShaderResourceSetDescriptor();
23
23
 
24
- // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer — the same
25
- // shape shader_read_out_bucket already uses. camera_previous stays a uniform: it is a scene buffer,
26
- // not a per-dispatch value.
27
- resources.setImmediate("bucket_index", U32_CONTAINER_STRUCT);
28
-
24
+ // TODO(chrome-153): uniform, not immediate — Dawn 153 overwrites immediate data on
25
+ // dispatchWorkgroupsIndirect, so this reads 65535 and culls everything. Revert 22893f0a7.
29
26
  resources.createGroup()
27
+ .addUniform("bucket_index", U32_CONTAINER_STRUCT)
30
28
  .addStorageBuffer("bucket_data", RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ)
31
29
 
32
30
  resources.createGroup()
@@ -1 +1 @@
1
- {"version":3,"file":"shader_hzb_meshlet_filter_1way_full.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js"],"names":[],"mappings":"AA8GA;;;GAGG;AACH,kDAFU,aAAa,CAMpB;8BApG2B,kCAAkC"}
1
+ {"version":3,"file":"shader_hzb_meshlet_filter_1way_full.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js"],"names":[],"mappings":"AA6GA;;;GAGG;AACH,kDAFU,aAAa,CAMpB;8BAnG2B,kCAAkC"}
@@ -23,12 +23,11 @@ import { MESHLET_COLLECTION_WRITE_STRUCT } from "../../MESHLET_COLLECTION_WRITE_
23
23
 
24
24
  const resources = new ShaderResourceSetDescriptor();
25
25
 
26
- // per-dispatch, eight bytes, read-only: immediate data rather than a uniform buffer. camera stays
27
- // a uniform — it is a scene buffer, not a per-dispatch value.
28
- resources.setImmediate("resolution", vec2u);
29
-
26
+ // TODO(chrome-153): uniform, not immediate — Dawn 153 overwrites immediate data on
27
+ // dispatchWorkgroupsIndirect, so this reads 65535 and culls everything. Revert 22893f0a7.
30
28
  resources.createGroup()
31
29
  .addUniform("camera", CAMERA_UNIFORM_STRUCT)
30
+ .addUniform("resolution", vec2u)
32
31
  .addStorageBuffer("scene_database", WebGPUArray.from(u32))
33
32
  .addStorageBuffer("meshlet_metadata", WebGPUArray.from(MESHLET_METADATA_STRUCT))
34
33
  .addTexture("texture_hzb")
@@ -1 +1 @@
1
- {"version":3,"file":"shader_meshlets_extract_bucket.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js"],"names":[],"mappings":"AAiEA,2DAIG;8BA/D2B,qCAAqC"}
1
+ {"version":3,"file":"shader_meshlets_extract_bucket.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js"],"names":[],"mappings":"AAgEA,2DAIG;8BA9D2B,qCAAqC"}
@@ -13,11 +13,10 @@ import {
13
13
 
14
14
  const resources = new ShaderResourceSetDescriptor();
15
15
 
16
- // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer — the same
17
- // shape shader_read_out_bucket already uses
18
- resources.setImmediate("bucket_index", U32_CONTAINER_STRUCT);
19
-
16
+ // TODO(chrome-153): uniform, not immediate — Dawn 153 overwrites immediate data on
17
+ // dispatchWorkgroupsIndirect, so this reads 65535 and culls everything. Revert 22893f0a7.
20
18
  resources.createGroup()
19
+ .addUniform("bucket_index", U32_CONTAINER_STRUCT)
21
20
  .addStorageBuffer("bucket_data", WebGPUStruct.from({
22
21
  headers: RASTERIZATION_BUCKET_SORT_OUTPUT_HEADER_STRUCT_READ,
23
22
  elements: WebGPUArray.from(MESHLET_DEFINITION_STRUCT)
@@ -1 +1 @@
1
- {"version":3,"file":"pass_mesh_cull.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH,qCAJW,qBAAqB,0EAoD/B;AAvED;IACI,yBAAqB;IACrB,4BAAwB;IAExB,YAAQ;IAER;;OAEG;IACH,yBAAQ;IAER,qBAAiB;IACjB,gBAAY;IAEZ,gBAAY;CACf"}
1
+ {"version":3,"file":"pass_mesh_cull.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,qCAJW,qBAAqB,0EAmD/B;AAtED;IACI,yBAAqB;IACrB,4BAAwB;IAExB,YAAQ;IAER;;OAEG;IACH,yBAAQ;IAER,qBAAiB;IACjB,gBAAY;IAEZ,gBAAY;CACf"}