@woosh/meep-engine 3.28.0 → 3.29.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 (482) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/binary/BitSet.d.ts +16 -0
  4. package/src/core/binary/BitSet.d.ts.map +1 -1
  5. package/src/core/binary/BitSet.js +159 -49
  6. package/src/core/binary/allocator/OffsetAllocator.d.ts +48 -0
  7. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  8. package/src/core/binary/allocator/OffsetAllocator.js +208 -9
  9. package/src/core/binary/compression/compress_bytes.d.ts +20 -0
  10. package/src/core/binary/compression/compress_bytes.d.ts.map +1 -0
  11. package/src/core/binary/compression/compress_bytes.js +35 -0
  12. package/src/core/binary/compression/decompress_bytes_into.d.ts +30 -0
  13. package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -0
  14. package/src/core/binary/compression/decompress_bytes_into.js +87 -0
  15. package/src/core/binary/compression/deflate_decompress_bound.d.ts +27 -0
  16. package/src/core/binary/compression/deflate_decompress_bound.d.ts.map +1 -0
  17. package/src/core/binary/compression/deflate_decompress_bound.js +32 -0
  18. package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts +24 -0
  19. package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts.map +1 -0
  20. package/src/core/geom/3d/quadric/quadric_attribute_add.js +31 -0
  21. package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts +46 -0
  22. package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts.map +1 -0
  23. package/src/core/geom/3d/quadric/quadric_attribute_reduce.js +104 -0
  24. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts +62 -0
  25. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts.map +1 -0
  26. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js +158 -0
  27. package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts +21 -0
  28. package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts.map +1 -0
  29. package/src/core/geom/3d/quadric/quadric_attribute_size.js +24 -0
  30. package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts +34 -0
  31. package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts.map +1 -0
  32. package/src/core/geom/3d/quadric/quadric_attribute_solve.js +55 -0
  33. package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts +28 -0
  34. package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts.map +1 -0
  35. package/src/core/geom/3d/quadric/quadric_attribute_sub.js +35 -0
  36. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts +15 -0
  37. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts.map +1 -1
  38. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +35 -0
  39. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts +93 -0
  40. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts.map +1 -0
  41. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.js +128 -0
  42. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts +38 -0
  43. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -0
  44. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +113 -0
  45. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +47 -1
  46. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  47. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +677 -8
  48. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts +22 -0
  49. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts.map +1 -0
  50. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.js +46 -0
  51. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts +19 -0
  52. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts.map +1 -0
  53. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.js +49 -0
  54. package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts +63 -0
  55. package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts.map +1 -0
  56. package/src/core/graph/layout/layered/BoxLayoutOptions.js +80 -0
  57. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.d.ts +35 -0
  58. package/src/core/graph/layout/layered/LayoutBoxGraph.d.ts.map +1 -0
  59. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.js +53 -1
  60. package/src/core/graph/layout/layered/layout_assign_coordinates.d.ts.map +1 -0
  61. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.js +72 -68
  62. package/src/core/graph/layout/layered/layout_assign_layers.d.ts.map +1 -0
  63. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.js +4 -2
  64. package/src/core/graph/layout/layered/layout_break_cycles.d.ts.map +1 -0
  65. package/src/core/graph/layout/layered/layout_insert_lanes.d.ts.map +1 -0
  66. package/src/core/graph/layout/layered/layout_order_layers.d.ts.map +1 -0
  67. package/src/core/graph/layout/layered/layout_orient_links.d.ts.map +1 -0
  68. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +7 -51
  69. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
  70. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +8 -69
  71. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +1 -1
  72. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +6 -6
  73. package/src/core/model/node-graph/visual/layout/route_grid_build.js +1 -1
  74. package/src/engine/graphics3/DebugDrawSystem.d.ts +7 -5
  75. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
  76. package/src/engine/graphics3/DebugDrawSystem.js +206 -203
  77. package/src/engine/graphics3/DecalSystem.d.ts +4 -5
  78. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  79. package/src/engine/graphics3/DecalSystem.js +5 -5
  80. package/src/engine/graphics3/FogOfWarSystem.d.ts +7 -12
  81. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -1
  82. package/src/engine/graphics3/FogOfWarSystem.js +8 -12
  83. package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
  84. package/src/shade/RENDERER_CONTRACT.md +12 -7
  85. package/src/shade/playground/caldera/README.md +529 -0
  86. package/src/shade/playground/caldera/caldera_format.d.ts +151 -0
  87. package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -0
  88. package/src/shade/playground/caldera/caldera_format.js +241 -0
  89. package/src/shade/playground/caldera/index.html +126 -0
  90. package/src/shade/playground/caldera/main.d.ts.map +1 -0
  91. package/src/shade/playground/caldera/main.js +1565 -0
  92. package/src/shade/playground/mesh_row_ceiling/README.md +85 -0
  93. package/src/shade/playground/mesh_row_ceiling/index.html +31 -0
  94. package/src/shade/playground/mesh_row_ceiling/main.d.ts +2 -0
  95. package/src/shade/playground/mesh_row_ceiling/main.d.ts.map +1 -0
  96. package/src/shade/playground/mesh_row_ceiling/main.js +389 -0
  97. package/src/shade/playground/vgeo_runtime/README.md +5 -3
  98. package/src/shade/playground/vgeo_runtime/main.js +3 -2
  99. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +3 -3
  100. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -1
  101. package/src/shade/playground/vgeo_runtime/sample_asset.js +3 -3
  102. package/src/shade/playground/vgeo_scene/README.md +103 -24
  103. package/src/shade/playground/vgeo_scene/main.js +525 -24
  104. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  105. package/src/shade/renderer/GraphicsContext.js +6 -0
  106. package/src/shade/renderer/Renderer.d.ts +2 -0
  107. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  108. package/src/shade/renderer/Renderer.js +23 -0
  109. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  110. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +100 -8
  111. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +69 -33
  112. package/src/shade/renderer/extension/RenderExtension.d.ts +15 -18
  113. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  114. package/src/shade/renderer/extension/RenderExtension.js +15 -19
  115. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +5 -5
  116. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  117. package/src/shade/renderer/extension/RenderExtensionRegistry.js +29 -166
  118. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  119. package/src/shade/renderer/geometry/GPUGeometryManager.js +73 -16
  120. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  121. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -3
  122. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +663 -0
  123. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +100 -5
  124. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  125. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +688 -81
  126. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
  127. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +155 -64
  128. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +30 -13
  129. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +3 -3
  130. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
  131. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +57 -7
  132. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  133. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +63 -9
  134. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts +40 -0
  135. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts.map +1 -0
  136. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.js +24 -0
  137. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +91 -0
  138. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -0
  139. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +91 -0
  140. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts +24 -0
  141. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts.map +1 -0
  142. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.js +25 -0
  143. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +77 -0
  144. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -0
  145. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +84 -0
  146. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +19 -6
  147. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -1
  148. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js +20 -7
  149. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts +19 -0
  150. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts.map +1 -0
  151. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.js +58 -0
  152. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts +18 -0
  153. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts.map +1 -0
  154. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.js +116 -0
  155. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts +18 -0
  156. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -0
  157. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +545 -0
  158. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts +16 -0
  159. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -0
  160. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +110 -0
  161. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +2 -27
  162. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
  163. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +120 -1564
  164. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts +26 -0
  165. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts.map +1 -0
  166. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.js +123 -0
  167. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts +26 -0
  168. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts.map +1 -0
  169. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.js +78 -0
  170. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts +24 -0
  171. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -0
  172. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +337 -0
  173. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts +29 -0
  174. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -0
  175. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +147 -0
  176. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts +37 -0
  177. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts.map +1 -0
  178. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js +243 -0
  179. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts +29 -0
  180. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -0
  181. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +117 -0
  182. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +46 -0
  183. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +1 -0
  184. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +45 -0
  185. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +64 -0
  186. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -0
  187. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +68 -0
  188. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +12 -7
  189. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -1
  190. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.js +33 -11
  191. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts +58 -0
  192. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.js +79 -0
  194. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts +39 -0
  195. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts.map +1 -0
  196. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.js +68 -0
  197. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts +53 -0
  198. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts.map +1 -0
  199. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.js +243 -0
  200. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +24 -8
  201. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
  202. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +250 -25
  203. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +12 -8
  204. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -1
  205. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +58 -50
  206. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +8 -1
  207. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
  208. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +18 -3
  209. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts +38 -0
  210. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts.map +1 -0
  211. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js +81 -0
  212. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +23 -5
  213. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -1
  214. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js +28 -21
  215. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.js +1 -1
  216. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  217. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +224 -60
  218. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +15 -0
  219. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -1
  220. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +17 -0
  221. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +17 -0
  222. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -1
  223. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +19 -0
  224. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +10 -1
  225. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -1
  226. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +103 -9
  227. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +14 -2
  228. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -1
  229. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +38 -14
  230. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts +6 -2
  231. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +28 -5
  233. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts +32 -0
  234. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts.map +1 -0
  235. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js +93 -0
  236. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +20 -6
  237. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  238. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +22 -8
  239. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts +16 -0
  240. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts.map +1 -0
  241. package/src/shade/renderer/geometry/virtual/format/attribute/{vgeo_layers_copy_vertex.js → vgeo_layers_copy_corner.js} +8 -8
  242. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts +18 -7
  243. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts.map +1 -1
  244. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +19 -8
  245. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.d.ts +3 -3
  246. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +3 -3
  247. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts +27 -0
  248. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts.map +1 -0
  249. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.js +97 -0
  250. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts +7 -3
  251. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts.map +1 -1
  252. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +21 -11
  253. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts +21 -0
  254. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts.map +1 -0
  255. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.js +41 -0
  256. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +19 -1
  257. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  258. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +20 -1
  259. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts +25 -0
  260. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts.map +1 -0
  261. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.js +24 -0
  262. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts +5 -0
  263. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts.map +1 -1
  264. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +5 -0
  265. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.d.ts.map +1 -1
  266. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +5 -0
  267. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts +10 -3
  268. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts.map +1 -1
  269. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +37 -3
  270. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +21 -13
  271. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  272. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +37 -13
  273. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts +8 -2
  274. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts.map +1 -1
  275. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +14 -2
  276. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +18 -0
  277. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  278. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +19 -1
  279. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +6 -0
  280. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts +21 -0
  281. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts.map +1 -0
  282. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.js +20 -0
  283. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts +9 -0
  284. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts.map +1 -1
  285. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +10 -1
  286. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +1 -2
  287. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +10 -3
  288. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts +20 -0
  289. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts.map +1 -0
  290. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.js +43 -0
  291. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +4 -2
  292. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
  293. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +8 -4
  294. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  295. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +2 -2
  296. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts +6 -4
  297. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts.map +1 -1
  298. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.js +6 -4
  299. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +13 -2
  300. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  301. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +13 -2
  302. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +5 -1
  303. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -1
  304. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +14 -1
  305. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -1
  306. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +1 -0
  307. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts +4 -1
  308. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts.map +1 -1
  309. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js +53 -11
  310. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
  311. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +7 -3
  312. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts +12 -2
  313. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  314. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +111 -33
  315. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts +6 -2
  316. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  317. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +112 -42
  318. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts +2 -2
  319. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  320. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +51 -21
  321. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
  322. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  323. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +9 -0
  324. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  325. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +34 -0
  326. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
  327. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +18 -0
  328. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  329. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +47 -19
  330. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +1 -0
  331. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +22 -4
  332. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +7 -2
  333. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -1
  334. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +8 -3
  335. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  336. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +10 -0
  337. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  338. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +13 -11
  339. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -1
  340. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +13 -11
  341. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  342. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +4 -0
  343. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  344. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -4
  345. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +6 -2
  346. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
  347. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +90 -12
  348. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +22 -0
  349. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -0
  350. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +21 -0
  351. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  352. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +13 -8
  353. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  354. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
  355. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  356. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +4 -12
  357. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  358. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  359. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +4 -5
  360. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  361. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +5 -3
  362. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
  363. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +11 -4
  364. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  365. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -3
  366. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
  367. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +3 -0
  368. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  369. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +94 -90
  370. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  371. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +13 -5
  372. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  373. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +96 -89
  374. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
  375. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +3 -1
  376. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.d.ts.map +1 -1
  377. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.js +4 -1
  378. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +100 -89
  380. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +31 -7
  382. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +1 -7
  384. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  385. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +161 -153
  386. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  387. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +2 -7
  388. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  389. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +4 -8
  390. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  391. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +5 -8
  392. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +25 -0
  393. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts.map +1 -0
  394. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +24 -0
  395. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +10 -0
  396. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  397. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +30 -21
  398. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +0 -1
  399. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +0 -1
  400. package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +0 -1
  401. package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +0 -1
  402. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +0 -1
  403. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +0 -1
  404. package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +0 -1
  405. package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts +0 -61
  406. package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts.map +0 -1
  407. package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
  408. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts +0 -18
  409. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +0 -1
  410. package/src/shade/playground/vgeo_viewer/select_cut.d.ts +0 -173
  411. package/src/shade/playground/vgeo_viewer/select_cut.d.ts.map +0 -1
  412. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts +0 -52
  413. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts.map +0 -1
  414. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts +0 -24
  415. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts.map +0 -1
  416. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts +0 -32
  417. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
  418. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts +0 -59
  419. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
  420. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts +0 -44
  421. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts.map +0 -1
  422. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts +0 -20
  423. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts.map +0 -1
  424. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts +0 -73
  425. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts.map +0 -1
  426. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +0 -13
  427. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +0 -1
  428. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts +0 -12
  429. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts.map +0 -1
  430. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts +0 -36
  431. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts.map +0 -1
  432. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts +0 -13
  433. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts.map +0 -1
  434. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts +0 -19
  435. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts.map +0 -1
  436. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts +0 -29
  437. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts.map +0 -1
  438. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts +0 -31
  439. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
  440. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts +0 -18
  441. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts.map +0 -1
  442. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts +0 -14
  443. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts.map +0 -1
  444. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts +0 -12
  445. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts.map +0 -1
  446. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts +0 -14
  447. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts.map +0 -1
  448. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts +0 -11
  449. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts.map +0 -1
  450. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts +0 -46
  451. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts.map +0 -1
  452. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +0 -22
  453. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +0 -1
  454. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts +0 -29
  455. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts.map +0 -1
  456. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts +0 -9
  457. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts.map +0 -1
  458. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts +0 -10
  459. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts.map +0 -1
  460. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts +0 -15
  461. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts.map +0 -1
  462. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts +0 -16
  463. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts.map +0 -1
  464. package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts +0 -10
  465. package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts.map +0 -1
  466. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts +0 -17
  467. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts.map +0 -1
  468. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts +0 -3
  469. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts.map +0 -1
  470. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts +0 -8
  471. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +0 -1
  472. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.d.ts +0 -0
  473. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.d.ts +0 -0
  474. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.d.ts +0 -0
  475. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.js +0 -0
  476. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.d.ts +0 -0
  477. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.js +0 -0
  478. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.d.ts +0 -0
  479. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.js +0 -0
  480. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.d.ts +0 -0
  481. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.js +0 -0
  482. /package/src/shade/playground/{vgeo_viewer → caldera}/main.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"VGEO_CLUSTER_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qCAFU,MAAM,CAEyB"}
1
+ {"version":3,"file":"VGEO_CLUSTER_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,qCAFU,MAAM,CAEyB"}
@@ -2,11 +2,16 @@
2
2
  * Words in one selection-buffer cluster row.
3
3
  *
4
4
  * Not rounded up to a power of two. At the million resident clusters
5
- * `VIRTUAL_GEOMETRY_DESIGN.md` §4 targets, thirteen words is 52 MB and sixteen is 64 — and the
6
- * addressing is a multiply either way, so the padding would buy nothing and cost twelve megabytes.
5
+ * `VIRTUAL_GEOMETRY_DESIGN.md` §4 targets, nineteen words is 76 MB and thirty-two is 128 — and the
6
+ * addressing is a multiply either way, so the padding would buy nothing and cost fifty megabytes.
7
+ *
8
+ * Nineteen since the frustum test moved onto the subtree box: thirteen were the cut rule's operands
9
+ * and the edge, and the last six are {@link VGEO_CLUSTER_ROW_OFFSET.CULL_BOX}. On a 64 KB page the
10
+ * widest page of a converted Zorah container goes from 851 words of its 2,048-word slot to 1,163,
11
+ * so the stride {@link vgeo_runtime_page_slot_words} picks still holds it with room over.
7
12
  *
8
13
  * @author Alex Goldring
9
14
  * @copyright Company Named Limited (c) 2026
10
15
  * @type {number}
11
16
  */
12
- export const VGEO_CLUSTER_ROW_WORDS = 13;
17
+ export const VGEO_CLUSTER_ROW_WORDS = 19;
@@ -14,5 +14,6 @@ export namespace VGEO_CUT_STAT {
14
14
  let WAVEFRONTS: number;
15
15
  let QUEUE_REMAINING: number;
16
16
  let CULLED_CLUSTER: number;
17
+ let CULLED_CLUSTER_BOX: number;
17
18
  }
18
19
  //# sourceMappingURL=VGEO_CUT_STAT.d.ts.map
@@ -107,4 +107,14 @@ export const VGEO_CUT_STAT = {
107
107
  * (RUNTIME_PLAN_2026_09_14 §0, §2.1).
108
108
  */
109
109
  CULLED_CLUSTER: 14,
110
+ /**
111
+ * Of the clusters the frustum discarded, the ones the LOD sphere let through and the subtree box
112
+ * caught — what the tighter bound of `CULL_PLAN_2026_09_16` is worth, per frame and per view.
113
+ *
114
+ * A container written before `format_version` 5 carries no such box and the reader stands the
115
+ * sphere's own cube in for it, which rejects nothing the sphere did not: **this counter reading
116
+ * zero is how an older container announces itself**, and it is the measurement behind that
117
+ * promise rather than an argument for it.
118
+ */
119
+ CULLED_CLUSTER_BOX: 15,
110
120
  };
@@ -5,4 +5,4 @@
5
5
  * @copyright Company Named Limited (c) 2026
6
6
  * @type {number}
7
7
  */
8
- export const VGEO_CUT_STAT_COUNT = 15;
8
+ export const VGEO_CUT_STAT_COUNT = 16;
@@ -5,21 +5,23 @@
5
5
  * are a factor of fifteen apart, so the number here is a **choice** rather than a derivation and it
6
6
  * is worth writing down which.
7
7
  *
8
- * **The provable bound is about half the page size.** A page's decoded bytes are
8
+ * **The provable bound is close to the page size.** A page's decoded bytes are
9
9
  * `56 + 32·nodes + 8·groups + 112·clusters + payload`, and its runtime rows are
10
- * `32·nodes + 16·groups + 52·clusters`. Every group holds at least one cluster (format §11.1) and
10
+ * `32·nodes + 16·groups + 76·clusters`. Every group holds at least one cluster (format §11.1) and
11
11
  * the node tree over `g` groups has at most `(g+2)/2` nodes, so the runtime side is at most
12
- * `84·clusters + 32` against a decoded side of at least `56 + 112·clusters` — a ratio of 0.75, or
13
- * 0.53 once a cluster's minimum payload is counted. A stride sized that way is correct for every
14
- * container the format admits and wastes an order of magnitude on every container anyone builds.
12
+ * `108·clusters + 32` against a decoded side of at least `56 + 112·clusters` — a ratio just under
13
+ * one, or about 0.7 once a cluster's minimum payload is counted. A stride sized that way is correct
14
+ * for every container the format admits and wastes an order of magnitude on every container anyone
15
+ * builds.
15
16
  *
16
- * **The measured maximum is 3.9%.** A 160×80 torus built at 16, 32, 64 and 128 KB pages put its
17
- * widest page's rows at 3.7%, 3.9%, 3.4% and 3.5% of the page size respectively, because a page is
18
- * overwhelmingly payload: 38 clusters in a 64 KB page is 4.5 KB of records against 59 KB of
19
- * vertices and indices.
17
+ * **The measured maximum is about 7%.** The widest page of a converted Zorah container — 52
18
+ * clusters, 5 nodes, 15 groups, 25 parent entries — comes to 1,163 words against a 64 KB page,
19
+ * which is 7.1% of it, because a page is overwhelmingly payload: 52 clusters is 4.5 KB of records
20
+ * against 59 KB of vertices and indices. It was 3.9% before the cluster row carried a cull box
21
+ * (`CULL_PLAN_2026_09_16` §2.4), and the eighth below still holds it at 1.76× rather than 3.2×.
20
22
  *
21
- * So this takes **an eighth of the page**, which is 3.2× the widest measured page at the tightest
22
- * page size, and an install that does not fit is **refused and counted** rather than overrunning
23
+ * So this takes **an eighth of the page**, which is 1.76× the widest measured page, and an install
24
+ * that does not fit is **refused and counted** rather than overrunning
23
25
  * its slot — the same direction `register` takes for a container built at the wrong page size, and
24
26
  * for the same reason: a tier that silently reconciles a size it was not built for is a tier whose
25
27
  * pages point into each other. A caller holding an asset this refuses raises `page_slot_words`,
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_runtime_page_slot_words.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wDANW,MAAM,GACJ,MAAM,CAUlB"}
1
+ {"version":3,"file":"vgeo_runtime_page_slot_words.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wDANW,MAAM,GACJ,MAAM,CAUlB"}
@@ -7,21 +7,23 @@ import { assert } from "../../../../../core/assert.js";
7
7
  * are a factor of fifteen apart, so the number here is a **choice** rather than a derivation and it
8
8
  * is worth writing down which.
9
9
  *
10
- * **The provable bound is about half the page size.** A page's decoded bytes are
10
+ * **The provable bound is close to the page size.** A page's decoded bytes are
11
11
  * `56 + 32·nodes + 8·groups + 112·clusters + payload`, and its runtime rows are
12
- * `32·nodes + 16·groups + 52·clusters`. Every group holds at least one cluster (format §11.1) and
12
+ * `32·nodes + 16·groups + 76·clusters`. Every group holds at least one cluster (format §11.1) and
13
13
  * the node tree over `g` groups has at most `(g+2)/2` nodes, so the runtime side is at most
14
- * `84·clusters + 32` against a decoded side of at least `56 + 112·clusters` — a ratio of 0.75, or
15
- * 0.53 once a cluster's minimum payload is counted. A stride sized that way is correct for every
16
- * container the format admits and wastes an order of magnitude on every container anyone builds.
14
+ * `108·clusters + 32` against a decoded side of at least `56 + 112·clusters` — a ratio just under
15
+ * one, or about 0.7 once a cluster's minimum payload is counted. A stride sized that way is correct
16
+ * for every container the format admits and wastes an order of magnitude on every container anyone
17
+ * builds.
17
18
  *
18
- * **The measured maximum is 3.9%.** A 160×80 torus built at 16, 32, 64 and 128 KB pages put its
19
- * widest page's rows at 3.7%, 3.9%, 3.4% and 3.5% of the page size respectively, because a page is
20
- * overwhelmingly payload: 38 clusters in a 64 KB page is 4.5 KB of records against 59 KB of
21
- * vertices and indices.
19
+ * **The measured maximum is about 7%.** The widest page of a converted Zorah container — 52
20
+ * clusters, 5 nodes, 15 groups, 25 parent entries — comes to 1,163 words against a 64 KB page,
21
+ * which is 7.1% of it, because a page is overwhelmingly payload: 52 clusters is 4.5 KB of records
22
+ * against 59 KB of vertices and indices. It was 3.9% before the cluster row carried a cull box
23
+ * (`CULL_PLAN_2026_09_16` §2.4), and the eighth below still holds it at 1.76× rather than 3.2×.
22
24
  *
23
- * So this takes **an eighth of the page**, which is 3.2× the widest measured page at the tightest
24
- * page size, and an install that does not fit is **refused and counted** rather than overrunning
25
+ * So this takes **an eighth of the page**, which is 1.76× the widest measured page, and an install
26
+ * that does not fit is **refused and counted** rather than overrunning
25
27
  * its slot — the same direction `register` takes for a container built at the wrong page size, and
26
28
  * for the same reason: a tier that silently reconciles a size it was not built for is a tier whose
27
29
  * pages point into each other. A caller holding an asset this refuses raises `page_slot_words`,
@@ -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":"AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qDAXW,WAAW,UACX,YAAY,QAEZ,MAAM,mBAEJ,MAAM,CAkIlB"}
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,CAsIlB"}
@@ -109,6 +109,10 @@ export function vgeo_runtime_write_page_block(words, floats, base, page) {
109
109
  page.parent_sphere[cluster * 4 + c];
110
110
  }
111
111
 
112
+ for (let c = 0; c < 6; c++) {
113
+ floats[row + VGEO_CLUSTER_ROW_OFFSET.CULL_BOX + c] = page.subtree_aabb[cluster * 6 + c];
114
+ }
115
+
112
116
  floats[row + VGEO_CLUSTER_ROW_OFFSET.SELF_ERROR] = page.self_error[cluster];
113
117
  floats[row + VGEO_CLUSTER_ROW_OFFSET.PARENT_ERROR] = page.parent_error[cluster];
114
118
 
@@ -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":"AAmGA,+CAIG;8BAnG2B,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":"AAkGA,+CAIG;8BAlG2B,kCAAkC"}
@@ -26,11 +26,10 @@ const PUSH_CONSTANTS = WebGPUStruct.from({
26
26
  capacity: u32,
27
27
  });
28
28
 
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.
29
+ // per-dispatch, eight bytes, read-only: immediate data rather than a uniform buffer
30
+ resources.setImmediate("settings", PUSH_CONSTANTS);
31
+
32
32
  resources.createGroup()
33
- .addUniform("settings", PUSH_CONSTANTS)
34
33
  .addStorageBuffer('hashMapData', HASH_MAP_DATA_STRUCT, true)
35
34
  .addStorageBuffer("voxelData", WebGPUArray.from(vec4u))
36
35
  .addStorageBuffer('evictionRequests', EVICTION_STRUCT);
@@ -6,16 +6,20 @@
6
6
  * @param {number} buffer_input_offset where to start reading from, in bytes
7
7
  * @param {GPUBuffer} buffer_command
8
8
  * @param {number} buffer_command_offset where to start writing at, in bytes
9
+ * @param {boolean} [fold] spread a count past one dimension's limit over `y` and `z` instead of
10
+ * clamping it away. Only for a shader that reads its index through
11
+ * {@link chunk_grid3d_to_index} — see {@link create_pipeline}.
9
12
  */
10
- export function build_indirect_compute_dispatch_command(elements_per_workgroup: number, encoder: ShadeGPUCommandContext, buffer_input: GPUBuffer, buffer_input_offset: number, buffer_command: GPUBuffer, buffer_command_offset: number): void;
13
+ export function build_indirect_compute_dispatch_command(elements_per_workgroup: number, encoder: ShadeGPUCommandContext, buffer_input: GPUBuffer, buffer_input_offset: number, buffer_command: GPUBuffer, buffer_command_offset: number, fold?: boolean): void;
11
14
  /**
12
15
  *
13
16
  * @param {FrameGraph} graph
14
17
  * @param {number} input input buffer ID
15
18
  * @param {number} [workgroup_size]
19
+ * @param {boolean} [fold] see {@link build_indirect_compute_dispatch_command}
16
20
  * @returns {number}
17
21
  */
18
- export function graph_build_indirect_dispatch_command(graph: FrameGraph, input: number, workgroup_size?: number): number;
22
+ export function graph_build_indirect_dispatch_command(graph: FrameGraph, input: number, workgroup_size?: number, fold?: boolean): number;
19
23
  export const INDIRECT_COMPUTE_COMMAND_DESCRIPTOR: BufferResourceDescriptor;
20
24
  import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
21
25
  //# sourceMappingURL=IndirectComputeCommandBuildPass.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IndirectComputeCommandBuildPass.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js"],"names":[],"mappings":"AA4GA;;;;;;;;GAQG;AACH,gFAPW,MAAM,iFAGN,MAAM,oDAEN,MAAM,QAoFhB;AAED;;;;;;GAMG;AACH,gFAJW,MAAM,mBACN,MAAM,GACJ,MAAM,CAiClB;AAxID,2EAIE;yCArGuC,mDAAmD"}
1
+ {"version":3,"file":"IndirectComputeCommandBuildPass.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js"],"names":[],"mappings":"AAoLA;;;;;;;;;;;GAWG;AACH,gFAVW,MAAM,iFAGN,MAAM,oDAEN,MAAM,SACN,OAAO,QAuFjB;AAED;;;;;;;GAOG;AACH,gFALW,MAAM,mBACN,MAAM,SACN,OAAO,GACL,MAAM,CAkClB;AA9ID,2EAIE;yCA7KuC,mDAAmD"}
@@ -8,6 +8,46 @@ import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDe
8
8
  import { STRUCT_DISPATCH_COMPUTE_COMMAND } from "./STRUCT_DISPATCH_COMPUTE_COMMAND.js";
9
9
 
10
10
  /**
11
+ * How a workgroup count that does not fit one dimension is spread over three.
12
+ *
13
+ * `maxComputeWorkgroupsPerDimension` is 65,535 on Chrome/Dawn and {@link Renderer#initialize} does
14
+ * not raise it — an adapter will not hand up more. At the engine's group size of 128 that is
15
+ * 8,388,480 elements in one dimension, which a real scene passes: a map of a million ordinary mesh
16
+ * rows expands to twelve million meshlets.
17
+ *
18
+ * Neither of the things that happen there is acceptable. A command **over** the limit makes
19
+ * `dispatchWorkgroupsIndirect` do nothing at all — measured against Dawn on nvidia/lovelace, where
20
+ * 65,535 workgroups run and 65,536 write not one element, with no validation error and nothing
21
+ * logged. Clamping it back into range, which is what this pass used to do, is the milder version of
22
+ * the same thing: a pass that silently covers its first 8,388,480 elements and no more. Neither
23
+ * moves a counter, because the collection's own `count` is written by a different pass.
24
+ *
25
+ * So the count is folded instead: `x` fills to the limit, then `y`, then `z`. Nothing is dropped
26
+ * and the reachable size becomes 65,535³ groups, which is not a limit anyone will meet.
27
+ *
28
+ * **A folded command's shader has to read its index accordingly.** `global_invocation_id.x` only
29
+ * carries the x dimension, so a shader that keeps using it would run its first 8,388,480 elements
30
+ * once per `y`, which is worse than dropping the rest. Fold and index are one decision:
31
+ *
32
+ * ```wgsl
33
+ * fn main(
34
+ * @builtin(workgroup_id) workgroup_id : vec3<u32>,
35
+ * @builtin(num_workgroups) group_count : vec3<u32>,
36
+ * @builtin(local_invocation_index) local_index : u32,
37
+ * ){
38
+ * let index = grid3d_to_index(workgroup_id, group_count.xy) * GROUP_SIZEu + local_index;
39
+ *
40
+ * if(index >= count){ return; }
41
+ * ```
42
+ *
43
+ * {@link chunk_grid3d_to_index} is the same flattening the light and decal clusters use, and a
44
+ * folded grid is exactly a 3D grid whose extents happen to be a dispatch's. When the count fits,
45
+ * `y` and `z` are 1 and the expression is `global_invocation_id.x` term for term, so a pass under
46
+ * the ceiling pays nothing for this.
47
+ *
48
+ * Folding is opt-in because it is only safe once the shader indexes this way, and most passes
49
+ * driven by this builder cannot reach the ceiling to begin with — a scene is capped at 3,047,424
50
+ * mesh rows by the `transforms` table, which is 23,808 groups.
11
51
  *
12
52
  * @param {PipelineCacheKey} key
13
53
  * @returns {ComputePipelineDescriptor}
@@ -17,6 +57,28 @@ function create_pipeline(key) {
17
57
  const device = key.device;
18
58
  const max_workgroup_count = device.limits.maxComputeWorkgroupsPerDimension;
19
59
 
60
+ //language=WGSL
61
+ const clamped_dispatch = `
62
+ // clamp, it's generally better to be wrong than to fail
63
+ command = ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref}(
64
+ min( ${max_workgroup_count}u, desired_groups ),
65
+ 1u,
66
+ 1u
67
+ );`;
68
+
69
+ //language=WGSL
70
+ const folded_dispatch = `
71
+ const LIMIT = ${max_workgroup_count}u;
72
+
73
+ // x to the limit, what is left of it in rows of x, what is left of those in slices of x*y
74
+ let rows = divide_round_up(desired_groups, LIMIT);
75
+ let slices = divide_round_up(rows, LIMIT);
76
+
77
+ command = ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref}(
78
+ min( desired_groups, LIMIT ),
79
+ min( max( rows, 1u ), LIMIT ),
80
+ max( slices, 1u )
81
+ );`;
20
82
 
21
83
  //language=WGSL
22
84
  const shader_code = `
@@ -25,22 +87,22 @@ function create_pipeline(key) {
25
87
  @group(0) @binding(0) var<storage, read> input : u32;
26
88
  @group(0) @binding(1) var<storage, read_write> command : ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref};
27
89
 
90
+ fn divide_round_up(value: u32, divisor: u32) -> u32 {
91
+ return (value + divisor - 1u) / divisor;
92
+ }
93
+
28
94
  @compute @workgroup_size(1, 1, 1)
29
95
  fn main(){
30
96
 
31
97
  let elements_per_group = ${key.elements_per_workgroup}u;
32
- let desired_dispatch_x = (input + elements_per_group - 1u) / elements_per_group;
33
-
34
- // clamp, it's generally better to be wrong than to fail
35
- let dispatch_x = min( ${max_workgroup_count}, desired_dispatch_x );
36
-
37
- command = ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref}(dispatch_x, 1u, 1u);
98
+ let desired_groups = divide_round_up(input, elements_per_group);
99
+ ${key.fold ? folded_dispatch : clamped_dispatch}
38
100
 
39
101
  }
40
102
  `;
41
103
 
42
104
  return ComputePipelineDescriptor.simplified({
43
- label: "IndirectComputeCommandBuildPass",
105
+ label: key.fold ? "IndirectComputeCommandBuildPass/folded" : "IndirectComputeCommandBuildPass",
44
106
  code:
45
107
  shader_code,
46
108
  bindings: [[
@@ -64,14 +126,23 @@ class PipelineCacheKey {
64
126
  */
65
127
  elements_per_workgroup = 256
66
128
 
67
- static from(device, elements_per_workgroup = 256) {
129
+ /**
130
+ * Whether a count past one dimension's limit is spread over `y` and `z` rather than clamped
131
+ * away. See {@link create_pipeline} — the shader it drives has to index for it.
132
+ * @type {boolean}
133
+ */
134
+ fold = false;
135
+
136
+ static from(device, elements_per_workgroup = 256, fold = false) {
68
137
  assert.defined(device, 'device');
69
138
  assert.isNonNegativeInteger(elements_per_workgroup, 'workgroup_size');
139
+ assert.isBoolean(fold, 'fold');
70
140
 
71
141
  const r = new PipelineCacheKey();
72
142
 
73
143
  r.device = device;
74
144
  r.elements_per_workgroup = elements_per_workgroup;
145
+ r.fold = fold;
75
146
 
76
147
  return r;
77
148
  }
@@ -79,11 +150,12 @@ class PipelineCacheKey {
79
150
  equals(other) {
80
151
  return this.device === other.device
81
152
  && this.elements_per_workgroup === other.elements_per_workgroup
153
+ && this.fold === other.fold
82
154
  ;
83
155
  }
84
156
 
85
157
  hash() {
86
- return this.elements_per_workgroup;
158
+ return this.elements_per_workgroup * 2 + (this.fold ? 1 : 0);
87
159
  }
88
160
  }
89
161
 
@@ -114,6 +186,9 @@ export const INDIRECT_COMPUTE_COMMAND_DESCRIPTOR = BufferResourceDescriptor.from
114
186
  * @param {number} buffer_input_offset where to start reading from, in bytes
115
187
  * @param {GPUBuffer} buffer_command
116
188
  * @param {number} buffer_command_offset where to start writing at, in bytes
189
+ * @param {boolean} [fold] spread a count past one dimension's limit over `y` and `z` instead of
190
+ * clamping it away. Only for a shader that reads its index through
191
+ * {@link chunk_grid3d_to_index} — see {@link create_pipeline}.
117
192
  */
118
193
  export function build_indirect_compute_dispatch_command(
119
194
  elements_per_workgroup,
@@ -122,6 +197,7 @@ export function build_indirect_compute_dispatch_command(
122
197
  buffer_input_offset,
123
198
  buffer_command,
124
199
  buffer_command_offset,
200
+ fold = false,
125
201
  ) {
126
202
  assert.defined(encoder, 'encoder');
127
203
  assert.notNull(encoder, 'encoder');
@@ -172,7 +248,7 @@ export function build_indirect_compute_dispatch_command(
172
248
 
173
249
  }
174
250
 
175
- const key = PipelineCacheKey.from(device, elements_per_workgroup);
251
+ const key = PipelineCacheKey.from(device, elements_per_workgroup, fold);
176
252
 
177
253
  const pipeline = pipeline_cache.getOrCompute(key, create_pipeline);
178
254
 
@@ -204,9 +280,10 @@ export function build_indirect_compute_dispatch_command(
204
280
  * @param {FrameGraph} graph
205
281
  * @param {number} input input buffer ID
206
282
  * @param {number} [workgroup_size]
283
+ * @param {boolean} [fold] see {@link build_indirect_compute_dispatch_command}
207
284
  * @returns {number}
208
285
  */
209
- export function graph_build_indirect_dispatch_command(graph, input, workgroup_size = 256) {
286
+ export function graph_build_indirect_dispatch_command(graph, input, workgroup_size = 256, fold = false) {
210
287
  const data = new IndirectComputeDispatchPassData();
211
288
 
212
289
  /**
@@ -226,7 +303,8 @@ export function graph_build_indirect_dispatch_command(graph, input, workgroup_si
226
303
  buffer_input,
227
304
  0,
228
305
  buffer_command,
229
- 0
306
+ 0,
307
+ fold,
230
308
  );
231
309
  };
232
310
 
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Workgroups per dimension that **every** WebGPU device allows.
3
+ *
4
+ * `maxComputeWorkgroupsPerDimension` has this as its default, and a device may only report more,
5
+ * never less — so a shader that writes an indirect dispatch command can fold against this literal
6
+ * and be certain the command is in range wherever it runs, without the device's own figure having
7
+ * to reach it through a binding.
8
+ *
9
+ * Folding sooner than a particular device would have needed costs nothing: the extents are only
10
+ * how the workgroups are arranged, and the shaders on the other side flatten them back with
11
+ * {@link chunk_grid3d_to_index} whatever they are. It is the other direction that is
12
+ * unrecoverable — a command over the device's limit does not run at all, and nothing reports it.
13
+ *
14
+ * {@link build_indirect_compute_dispatch_command} does not use this: it builds its pipeline per
15
+ * device and inlines the real figure. This is for {@link shader_prefix_sum_to_command}, which is a
16
+ * shared {@link ComputeShader} compiled once and cannot.
17
+ *
18
+ * @see https://www.w3.org/TR/webgpu/#limits
19
+ * @type {number}
20
+ */
21
+ export const WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION: number;
22
+ //# sourceMappingURL=WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qEAFU,MAAM,CAE4D"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Workgroups per dimension that **every** WebGPU device allows.
3
+ *
4
+ * `maxComputeWorkgroupsPerDimension` has this as its default, and a device may only report more,
5
+ * never less — so a shader that writes an indirect dispatch command can fold against this literal
6
+ * and be certain the command is in range wherever it runs, without the device's own figure having
7
+ * to reach it through a binding.
8
+ *
9
+ * Folding sooner than a particular device would have needed costs nothing: the extents are only
10
+ * how the workgroups are arranged, and the shaders on the other side flatten them back with
11
+ * {@link chunk_grid3d_to_index} whatever they are. It is the other direction that is
12
+ * unrecoverable — a command over the device's limit does not run at all, and nothing reports it.
13
+ *
14
+ * {@link build_indirect_compute_dispatch_command} does not use this: it builds its pipeline per
15
+ * device and inlines the real figure. This is for {@link shader_prefix_sum_to_command}, which is a
16
+ * shared {@link ComputeShader} compiled once and cannot.
17
+ *
18
+ * @see https://www.w3.org/TR/webgpu/#limits
19
+ * @type {number}
20
+ */
21
+ export const WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION = 65535;
@@ -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;AAuD3B,iDAIG;6BA3G0B,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":"AAaA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,kDAA8E;AAE9E;;;;;;;;GAQG;AACH,4BAFU,YAAY,CAOK;AA2D3B,iDAIG;6BAhH0B,mCAAmC;8BAIlC,+BAA+B"}
@@ -3,6 +3,7 @@ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
3
  import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
4
  import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
5
5
  import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
6
+ import { chunk_grid3d_to_index } from "../../shader/chunk/grid/chunk_grid3d_to_index.js";
6
7
  import { ComputeShader } from "../../shader/ComputeShader.js";
7
8
  import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
8
9
  import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
@@ -52,9 +53,8 @@ export const EMIT_SETTINGS = WebGPUStruct.from({
52
53
 
53
54
  const resources = new ShaderResourceSetDescriptor();
54
55
 
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.
56
+ resources.setImmediate('settings', EMIT_SETTINGS);
57
+
58
58
  resources.createGroup()
59
59
  .addStorageBuffer("scene_database", WebGPUArray.u32, false)
60
60
  .addStorageBuffer("emitter_database", WebGPUArray.u32, false)
@@ -63,9 +63,7 @@ resources.createGroup()
63
63
  .addStorageBuffer("pool", WebGPUArray.u32, true)
64
64
  .addStorageBuffer("alive_out", WebGPUArray.u32, true)
65
65
  .addStorageBuffer("dead", WebGPUArray.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
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
69
67
 
70
68
  const body = CodeChunk.from(
71
69
  /* language=wgsl */
@@ -74,8 +72,14 @@ const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
74
72
  const COUNTER_DEAD : u32 = ${PARTICLE_COUNTER.DEAD}u;
75
73
 
76
74
  @compute @workgroup_size(${PARTICLE_EMIT_WORKGROUP_SIZE}, 1, 1)
77
- fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
78
- let i = gid.x;
75
+ fn main(
76
+ @builtin(workgroup_id) workgroup_id : vec3<u32>,
77
+ @builtin(num_workgroups) group_count : vec3<u32>,
78
+ @builtin(local_invocation_index) local_index : u32,
79
+ ) {
80
+ // shader_prefix_sum_to_command folds its count over three dimensions, so the newborn this lane
81
+ // belongs to is the flattened workgroup, not gid.x. Identical while y and z are 1.
82
+ let i = grid3d_to_index(workgroup_id, group_count.xy) * ${PARTICLE_EMIT_WORKGROUP_SIZE}u + local_index;
79
83
 
80
84
  let assignment = particle_emit_assignment(&spawn_prefix.elements, spawn_prefix.count, i);
81
85
  if (!assignment.valid) { return; }
@@ -99,6 +103,7 @@ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
99
103
  alive_out[a] = slot;
100
104
  }
101
105
  `, [
106
+ chunk_grid3d_to_index,
102
107
  chunk_particle_emit_step,
103
108
  chunk_particle_vm_registers_fast,
104
109
  ]);
@@ -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;AAyD/B,qDAIG;iDAvH8C,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;AAsD/B,qDAIG;iDApH8C,yBAAyB;6BAJ7C,mCAAmC;8BAClC,+BAA+B"}
@@ -67,9 +67,8 @@ export const SIMULATE_SETTINGS = WebGPUStruct.from({
67
67
 
68
68
  const resources = new ShaderResourceSetDescriptor();
69
69
 
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.
70
+ resources.setImmediate('settings', SIMULATE_SETTINGS);
71
+
73
72
  resources.createGroup()
74
73
  .addStorageBuffer("scene_database", WebGPUArray.u32, false)
75
74
  .addStorageBuffer("emitter_database", WebGPUArray.u32, false)
@@ -78,9 +77,7 @@ resources.createGroup()
78
77
  .addStorageBuffer("sim_list", WebGPUArray.u32, false)
79
78
  .addStorageBuffer("alive_out", WebGPUArray.u32, true)
80
79
  .addStorageBuffer("dead", WebGPUArray.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);
80
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
84
81
 
85
82
 
86
83
  const body = CodeChunk.from(/* language=wgsl */ `
@@ -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,CAwUnH"}
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"}
@@ -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, vec2u } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
5
+ import { u32 } 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 { PUSH_CONSTANTS, shader_read_out_bucket } from "./shader_read_out_bucket.js";
25
+ import { 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,16 +83,11 @@ 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
-
91
86
  shader_read_out_bucket.dispatchIndirect({
92
87
  encoder,
93
88
  command,
94
89
  bindings: {
95
- settings: u_settings,
90
+ settings: { bucket_id },
96
91
  input: buckets_buffer,
97
92
  output,
98
93
  }
@@ -165,15 +160,12 @@ export function graph_prepare_meshlet_draw_commands_by_material({
165
160
  const hzb = resources.get(data.texture_hzb);
166
161
  const command = resources.get(data.command);
167
162
 
168
- // TODO(chrome-153): transient uniform, not an immediate value — see the shader.
169
- const u_resolution = encoder.allocateTransientValueBuffer(vec2u, resolution);
170
-
171
163
  shader_hzb_meshlet_filter_1way_full.dispatchIndirect({
172
164
  encoder,
173
165
  command,
174
166
  bindings: {
175
167
  camera: camera_state,
176
- resolution: u_resolution,
168
+ resolution,
177
169
  scene_database: scene.scene_database_buffer,
178
170
  meshlet_metadata: scene.geometries.meshlets.buffer_metadata,
179
171
  texture_hzb: hzb.obtainView(),
@@ -1,5 +1,3 @@
1
- export const PUSH_CONSTANTS: WebGPUStruct;
2
1
  export const shader_read_out_bucket: ComputeShader;
3
- import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
2
  import { ComputeShader } from "../../shader/ComputeShader.js";
5
3
  //# 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":"AAcA,0CAEG;AAsCH,mDAIE;6BAzD2B,mCAAmC;8BAIlC,+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":"AAqDA,mDAIE;8BApD4B,+BAA+B"}
@@ -12,14 +12,13 @@ import {
12
12
 
13
13
  const resources = new ShaderResourceSetDescriptor();
14
14
 
15
- export const PUSH_CONSTANTS = WebGPUStruct.from({
15
+ const PUSH_CONSTANTS = WebGPUStruct.from({
16
16
  bucket_id: u32,
17
17
  });
18
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);
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);
23
22
 
24
23
  resources.createGroup()
25
24
  .addStorageBuffer("input", RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ)