@woosh/meep-engine 3.26.0 → 3.28.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 (449) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +542 -0
  4. package/src/core/binary/lz4/LZ4_LEVEL.d.ts +33 -0
  5. package/src/core/binary/lz4/LZ4_LEVEL.d.ts.map +1 -0
  6. package/src/core/binary/lz4/LZ4_LEVEL.js +32 -0
  7. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts +33 -0
  8. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts.map +1 -0
  9. package/src/core/binary/lz4/lz4_compress_block_at_level.js +47 -0
  10. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts +40 -0
  11. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts.map +1 -0
  12. package/src/core/binary/lz4/lz4_compress_block_hc.js +1382 -0
  13. package/src/core/binary/lz4/lz4_decompress_block.d.ts +2 -1
  14. package/src/core/binary/lz4/lz4_decompress_block.d.ts.map +1 -1
  15. package/src/core/binary/lz4/lz4_decompress_block.js +31 -6
  16. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts +15 -0
  17. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts.map +1 -0
  18. package/src/core/geom/3d/mat4/m4_linear_determinant.js +24 -0
  19. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts +4 -2
  20. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts.map +1 -1
  21. package/src/core/geom/3d/mat4/m4_normal_matrix3.js +21 -11
  22. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +14 -7
  23. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  24. package/src/core/geom/3d/shape/HeightMapShape3D.js +87 -78
  25. package/src/engine/Engine.d.ts.map +1 -1
  26. package/src/engine/Engine.js +38 -1
  27. package/src/engine/graphics3/GraphicsEngine.d.ts +5 -1
  28. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  29. package/src/engine/graphics3/GraphicsEngine.js +834 -830
  30. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  31. package/src/shade/RENDERER_CONTRACT.md +19 -10
  32. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
  33. package/src/shade/playground/vgeo_runtime/README.md +186 -27
  34. package/src/shade/playground/vgeo_runtime/index.html +112 -62
  35. package/src/shade/playground/vgeo_runtime/main.js +678 -88
  36. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +18 -0
  37. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
  38. package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +23 -5
  39. package/src/shade/playground/vgeo_scene/README.md +408 -0
  40. package/src/shade/playground/vgeo_scene/index.html +144 -0
  41. package/src/shade/playground/vgeo_scene/main.d.ts +2 -0
  42. package/src/shade/playground/vgeo_scene/main.d.ts.map +1 -0
  43. package/src/shade/playground/vgeo_scene/main.js +1716 -0
  44. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
  45. package/src/shade/renderer/Renderer.d.ts +4 -1
  46. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  47. package/src/shade/renderer/Renderer.js +5 -2
  48. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +1 -2
  49. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +11 -0
  50. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  51. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +16 -8
  52. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  53. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +16 -11
  54. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  55. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +3 -29
  56. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts +22 -0
  57. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts.map +1 -0
  58. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.js +49 -0
  59. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +77 -7
  60. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +36 -23
  61. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +17 -14
  62. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +19 -1
  63. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  64. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +21 -1
  65. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.d.ts.map +1 -1
  66. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +5 -9
  67. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts +32 -0
  68. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts.map +1 -0
  69. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +59 -0
  70. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
  71. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts +44 -0
  72. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
  73. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +36 -0
  74. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
  75. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_levels.js → level/vgeo_build_levels.js} +61 -95
  76. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts +19 -0
  77. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts.map +1 -0
  78. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.js → level/vgeo_build_root_group.js} +1 -1
  79. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +73 -0
  80. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -0
  81. package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.js → mesh/VirtualGeometryMesh.js} +7 -7
  82. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +29 -0
  83. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -0
  84. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_normals.js → mesh/vgeo_compute_vertex_normals.js} +3 -3
  85. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +31 -0
  86. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -0
  87. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.js → mesh/vgeo_compute_vertex_tangents.js} +5 -5
  88. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +46 -0
  89. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -0
  90. package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.js → mesh/vgeo_normalize_source.js} +9 -9
  91. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts +13 -0
  92. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts.map +1 -0
  93. package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.js → page/vgeo_assemble_pages.js} +63 -16
  94. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts +13 -0
  95. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts.map +1 -0
  96. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.js → page/vgeo_build_page_nodes.js} +4 -4
  97. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts +22 -0
  98. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts.map +1 -0
  99. package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.js → page/vgeo_page_node_count.js} +2 -2
  100. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +52 -0
  101. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -0
  102. package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.js → partition/VGeoFaceGraph.js} +1 -1
  103. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts +14 -0
  104. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -0
  105. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts +29 -0
  106. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts.map +1 -0
  107. package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.js → partition/vgeo_partition_graph.js} +2 -2
  108. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts +41 -0
  109. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts.map +1 -0
  110. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.js +92 -0
  111. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts +10 -0
  112. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts.map +1 -0
  113. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.js → partition/vgeo_split_face_set.js} +12 -55
  114. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts +15 -0
  115. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -0
  116. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set_packed.js → partition/vgeo_split_face_set_packed.js} +3 -3
  117. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts +12 -0
  118. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts.map +1 -0
  119. package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.js → sphere/vgeo_bounding_sphere.js} +3 -3
  120. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts +18 -0
  121. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts.map +1 -0
  122. package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.js → sphere/vgeo_containing_sphere.js} +3 -3
  123. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts +9 -0
  124. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts.map +1 -0
  125. package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.js → sphere/vgeo_sphere_inflate_to_contain.js} +1 -1
  126. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +24 -0
  127. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
  128. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +20 -0
  129. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
  130. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +14 -0
  131. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
  132. package/src/shade/renderer/geometry/virtual/build/{vgeo_extract_submesh.js → submesh/vgeo_extract_submesh.js} +5 -5
  133. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +12 -0
  134. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
  135. package/src/shade/renderer/geometry/virtual/build/{vgeo_gather_faces.js → submesh/vgeo_gather_faces.js} +2 -2
  136. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts +11 -0
  137. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts.map +1 -0
  138. package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.js → submesh/vgeo_narrow_indices.js} +3 -3
  139. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
  140. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  141. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +10 -11
  142. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +22 -0
  143. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  144. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +24 -0
  145. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts +8 -2
  146. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts.map +1 -1
  147. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +8 -2
  148. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +12 -0
  149. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  150. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +13 -0
  151. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +8 -1
  152. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  153. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +11 -3
  154. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +9 -0
  155. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  156. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +10 -1
  157. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts +15 -0
  158. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts.map +1 -0
  159. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js +15 -0
  160. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts +18 -0
  161. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map +1 -0
  162. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js +17 -0
  163. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts +8 -0
  164. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts.map +1 -0
  165. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js +7 -0
  166. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +3 -0
  167. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -0
  168. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts +14 -0
  169. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts.map +1 -0
  170. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js +13 -0
  171. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts +11 -0
  172. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map +1 -0
  173. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js +10 -0
  174. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +28 -0
  175. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
  176. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +7 -3
  177. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +20 -0
  178. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
  179. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +20 -2
  180. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +4 -0
  181. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
  182. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +4 -0
  183. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +29 -3
  184. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  185. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +81 -122
  186. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +40 -0
  187. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  188. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +44 -0
  189. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +69 -0
  190. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -0
  191. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +236 -0
  192. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +14 -0
  193. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
  194. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +15 -0
  195. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts +31 -0
  196. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map +1 -0
  197. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js +32 -0
  198. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +10 -0
  199. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
  200. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +21 -1
  201. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts +15 -0
  202. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts.map +1 -0
  203. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js +84 -0
  204. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts +22 -0
  205. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -0
  206. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +96 -0
  207. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  208. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +63 -3
  209. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  210. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +219 -17
  211. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  212. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +156 -11
  213. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +656 -0
  214. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +33 -36
  215. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -1
  216. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +109 -193
  217. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +109 -29
  218. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  219. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +173 -105
  220. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
  221. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +109 -26
  222. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +548 -0
  223. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +29 -50
  224. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  225. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +55 -487
  226. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts +84 -0
  227. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -0
  228. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +393 -0
  229. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts +234 -0
  230. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -0
  231. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +1388 -0
  232. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts +81 -0
  233. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts.map +1 -0
  234. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.js +89 -0
  235. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +53 -34
  236. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  237. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +407 -124
  238. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +100 -0
  239. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -0
  240. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +219 -0
  241. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts +17 -0
  242. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts.map +1 -0
  243. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js +47 -0
  244. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts +20 -0
  245. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts.map +1 -0
  246. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js +19 -0
  247. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -1
  248. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +30 -12
  249. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +8 -8
  250. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  251. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +11 -73
  252. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts +19 -0
  253. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -0
  254. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +98 -0
  255. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts +31 -0
  256. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -0
  257. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +99 -0
  258. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts +17 -0
  259. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts.map +1 -0
  260. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.js +39 -0
  261. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  262. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +18 -1
  263. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -1
  264. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +5 -15
  265. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts +3 -0
  266. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts.map +1 -0
  267. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.js +77 -0
  268. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts +3 -0
  269. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -0
  270. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +130 -0
  271. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
  272. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +32 -37
  273. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  274. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +576 -230
  275. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +15 -18
  276. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -1
  277. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +19 -28
  278. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  279. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +45 -25
  280. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  281. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +11 -0
  282. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  283. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +0 -1
  284. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +12 -10
  285. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +1 -0
  286. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +8 -0
  287. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +7 -2
  288. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -1
  289. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +8 -3
  290. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +2 -0
  291. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +19 -0
  292. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -1
  293. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +1 -1
  294. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts +5 -0
  295. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts.map +1 -0
  296. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js +22 -0
  297. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts +14 -0
  298. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts.map +1 -0
  299. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js +13 -0
  300. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts +17 -0
  301. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map +1 -0
  302. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js +16 -0
  303. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts +15 -0
  304. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts.map +1 -0
  305. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js +16 -0
  306. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts +23 -0
  307. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts.map +1 -0
  308. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js +28 -0
  309. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts +2 -0
  310. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts.map +1 -0
  311. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js +13 -0
  312. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +10 -5
  313. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -1
  314. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +15 -6
  315. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +6 -1
  316. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  317. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +38 -1
  318. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  319. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +4 -3
  320. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  321. package/src/shade/renderer/loader/gltf/load_gltf.js +0 -19
  322. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  323. package/src/shade/renderer/material/chunk_material_draw_side.d.ts +14 -0
  324. package/src/shade/renderer/material/chunk_material_draw_side.d.ts.map +1 -0
  325. package/src/shade/renderer/material/chunk_material_draw_side.js +34 -0
  326. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  327. package/src/shade/renderer/material/standard/fragment_gbuffer.js +8 -1
  328. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  329. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +6 -3
  330. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  331. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +6 -3
  332. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  333. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +13 -1
  334. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  335. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +19 -5
  336. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +23 -5
  338. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.js +12 -5
  340. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  341. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -4
  342. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts +22 -0
  343. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts.map +1 -0
  344. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.js +36 -0
  345. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +2 -0
  346. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  347. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  348. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +15 -0
  349. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -0
  350. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +35 -0
  351. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  352. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +3 -5
  353. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  354. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +3 -4
  355. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts +10 -1
  356. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
  357. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +38 -29
  358. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts +5 -0
  359. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts.map +1 -1
  360. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.js +63 -55
  361. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  362. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -4
  363. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
  364. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +1 -0
  365. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  366. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +7 -7
  367. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  368. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +83 -78
  369. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  370. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +44 -53
  371. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
  372. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -2
  373. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
  374. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -2
  375. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
  376. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +19 -2
  377. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +7 -4
  378. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -2
  380. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js +15 -4
  382. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +16 -5
  384. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.d.ts.map +1 -1
  385. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +16 -5
  386. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  387. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +2 -1
  388. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.d.ts.map +1 -1
  389. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.js +4 -0
  390. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  391. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +16 -7
  392. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  393. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +85 -89
  394. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  395. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +28 -32
  396. package/src/shade/renderer/scene/GPUSceneContext.d.ts +22 -2
  397. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  398. package/src/shade/renderer/scene/GPUSceneContext.js +61 -4
  399. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +19 -0
  400. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts.map +1 -1
  401. package/src/shade/renderer/scene/NODE3D_STRUCT.js +34 -0
  402. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts +9 -0
  403. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts.map +1 -0
  404. package/src/shade/renderer/scene/chunk_node3d_flags.js +23 -0
  405. package/src/shade/renderer/scene/chunk_scene_database_access.d.ts.map +1 -1
  406. package/src/shade/renderer/scene/chunk_scene_database_access.js +15 -1
  407. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  408. package/src/shade/renderer/scene/rows/GPUSceneRows.js +9 -1
  409. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts +7 -0
  410. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts.map +1 -1
  411. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.js +16 -4
  412. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts +12 -0
  413. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -0
  414. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +18 -0
  415. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts +24 -0
  416. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts.map +1 -0
  417. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js +33 -0
  418. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  419. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +92 -16
  420. package/src/shade/renderer/view/GPUViewContext.d.ts +5 -0
  421. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  422. package/src/shade/renderer/view/GPUViewContext.js +21 -0
  423. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  424. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +74 -3
  425. package/src/shade/playground/vgeo_viewer/README.md +0 -150
  426. package/src/shade/playground/vgeo_viewer/cut_geometry.js +0 -460
  427. package/src/shade/playground/vgeo_viewer/index.html +0 -77
  428. package/src/shade/playground/vgeo_viewer/main.js +0 -1343
  429. package/src/shade/playground/vgeo_viewer/select_cut.js +0 -481
  430. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +0 -258
  431. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +0 -1
  432. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +0 -723
  433. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +0 -49
  434. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +0 -1
  435. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
  436. package/src/shade/renderer/loader/gltf/fix_up_material_sides.js +0 -109
  437. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.js +0 -78
  438. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +0 -100
  439. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.js +0 -26
  440. package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
  441. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts +0 -3
  442. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts.map +0 -1
  443. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
  444. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
  445. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +0 -0
  446. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +0 -0
  447. /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.js → partition/vgeo_graph_components.js} +0 -0
  448. /package/src/shade/renderer/geometry/virtual/build/{VGeoGatheredFaces.js → submesh/VGeoGatheredFaces.js} +0 -0
  449. /package/src/shade/renderer/geometry/virtual/build/{VGeoSubmesh.js → submesh/VGeoSubmesh.js} +0 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @typedef {import("./GPUVirtualGeometryRuntime.js").GPUVirtualGeometryRuntime} GPUVirtualGeometryRuntime
3
+ */
4
+ /**
5
+ * What cutting is per **view** rather than per frame.
6
+ *
7
+ * A view owns this the way it owns its HZB and its previous camera, and for the same reason: these
8
+ * are the things two views must not share. The runtime above it owns what a *scene* has — the page
9
+ * tables, the arena, the pool — and a frame owns the feedback buffer every view writes into.
10
+ *
11
+ * ## Why the params are here and not on the runtime
12
+ *
13
+ * `projection_k` is `screen_height / (2·tan(fov_y/2))`: a property of a render target and a camera,
14
+ * which is to say of a view. One buffer on the runtime meant one value for the frame, written from
15
+ * whichever view opened it — so a shadow cascade cut against the main view's projection and
16
+ * selected a level for a screen it is not drawn to. That is a live defect independent of anything
17
+ * a kept cut needs, and the fix is that each view writes its own.
18
+ *
19
+ * **One buffer per view, not one buffer with an offset per view.** Views are few — a main view and
20
+ * a handful of cascades — and a uniform is tens of bytes, so the saving from packing them would be
21
+ * nothing against giving every per-view value a second index to be wrong in.
22
+ *
23
+ * @author Alex Goldring
24
+ * @copyright Company Named Limited (c) 2026
25
+ */
26
+ export class VGeoViewCut {
27
+ /**
28
+ * @param {Object} options
29
+ * @param {GPUDevice} options.device
30
+ * @param {string} [options.label] names the buffer in a capture
31
+ */
32
+ constructor({ device, label }: {
33
+ device: GPUDevice;
34
+ label?: string;
35
+ });
36
+ /**
37
+ * The uniform every pass of this view's cut reads.
38
+ *
39
+ * @returns {GPUBuffer}
40
+ */
41
+ get params_buffer(): GPUBuffer;
42
+ /**
43
+ * @returns {number}
44
+ */
45
+ get projection_k(): number;
46
+ /**
47
+ * Where this view's last cut stood, as one bit per page row.
48
+ *
49
+ * @returns {GPUBuffer|undefined}
50
+ */
51
+ get frontier_buffer(): any;
52
+ /**
53
+ * @returns {number}
54
+ */
55
+ get frontier_word_count(): number;
56
+ /**
57
+ * Size the frontier to the tier it will name rows of.
58
+ *
59
+ * Lazily, and re-made rather than grown when the tier's capacity changes: what it holds
60
+ * is row indices of that tier, so a bigger tier does not extend the old answer, it
61
+ * invalidates it. Dropping it costs one frame of root descent, which is the fallback
62
+ * every other invalidation takes too.
63
+ *
64
+ * @param {number} page_row_capacity
65
+ * @returns {void}
66
+ */
67
+ resize_frontier(page_row_capacity: number): void;
68
+ /**
69
+ * Take this view's projection from the target it draws to and the camera it draws with.
70
+ *
71
+ * @param {Object} options
72
+ * @param {number} options.screen_height pixels of the render target
73
+ * @param {number} options.fov_y radians
74
+ * @returns {void}
75
+ */
76
+ set_projection({ screen_height, fov_y }: {
77
+ screen_height: number;
78
+ fov_y: number;
79
+ }): void;
80
+ /**
81
+ * Publish the frame's shared settings and this view's own, as one uniform.
82
+ *
83
+ * Everything but `projection_k` and `flags` is a property of the runtime or the frame, so it is
84
+ * read from the runtime at write time rather than mirrored here — a second copy of `tau` is a
85
+ * second thing to forget to update.
86
+ *
87
+ * @param {Object} options
88
+ * @param {GPUVirtualGeometryRuntime} options.runtime inside an open frame
89
+ * @param {boolean} [options.coarsen] whether this view's cut may walk up
90
+ * @returns {void}
91
+ */
92
+ write_params({ runtime, coarsen }: {
93
+ runtime: GPUVirtualGeometryRuntime;
94
+ coarsen?: boolean;
95
+ }): void;
96
+ destroy(): void;
97
+ #private;
98
+ }
99
+ export type GPUVirtualGeometryRuntime = import("./GPUVirtualGeometryRuntime.js").GPUVirtualGeometryRuntime;
100
+ //# sourceMappingURL=VGeoViewCut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGeoViewCut.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js"],"names":[],"mappings":"AAOA;;GAEG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IAwCI;;;;OAIG;IACH;QAH8B,MAAM;QACR,KAAK,GAAtB,MAAM;OAehB;IAED;;;;OAIG;IACH,+BAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;;OAIG;IACH,2BAEC;IAED;;OAEG;IACH,kCAEC;IAED;;;;;;;;;;OAUG;IACH,mCAHW,MAAM,GACJ,IAAI,CAkBhB;IAED;;;;;;;OAOG;IACH;QAJ2B,aAAa,EAA7B,MAAM;QACU,KAAK,EAArB,MAAM;QACJ,IAAI,CAShB;IAED;;;;;;;;;;;OAWG;IACH;QAJ8C,OAAO,EAA1C,yBAAyB;QACP,OAAO,GAAzB,OAAO;QACL,IAAI,CA8BhB;IAED,gBAIC;;CACJ;wCAlNY,OAAO,gCAAgC,EAAE,yBAAyB"}
@@ -0,0 +1,219 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { VGEO_CUT_FLAG_COARSEN } from "./cut/VGEO_CUT_FLAG_COARSEN.js";
3
+ import { VGEO_CUT_FLAG_CULL } from "./cut/VGEO_CUT_FLAG_CULL.js";
4
+ import { VGEO_CUT_PARAMS_STRUCT } from "./cut/VGEO_CUT_PARAMS_STRUCT.js";
5
+ import { vgeo_frontier_words } from "./vgeo_frontier_words.js";
6
+ import { write_gpu_typed_buffer } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
7
+
8
+ /**
9
+ * @typedef {import("./GPUVirtualGeometryRuntime.js").GPUVirtualGeometryRuntime} GPUVirtualGeometryRuntime
10
+ */
11
+
12
+ /**
13
+ * What cutting is per **view** rather than per frame.
14
+ *
15
+ * A view owns this the way it owns its HZB and its previous camera, and for the same reason: these
16
+ * are the things two views must not share. The runtime above it owns what a *scene* has — the page
17
+ * tables, the arena, the pool — and a frame owns the feedback buffer every view writes into.
18
+ *
19
+ * ## Why the params are here and not on the runtime
20
+ *
21
+ * `projection_k` is `screen_height / (2·tan(fov_y/2))`: a property of a render target and a camera,
22
+ * which is to say of a view. One buffer on the runtime meant one value for the frame, written from
23
+ * whichever view opened it — so a shadow cascade cut against the main view's projection and
24
+ * selected a level for a screen it is not drawn to. That is a live defect independent of anything
25
+ * a kept cut needs, and the fix is that each view writes its own.
26
+ *
27
+ * **One buffer per view, not one buffer with an offset per view.** Views are few — a main view and
28
+ * a handful of cascades — and a uniform is tens of bytes, so the saving from packing them would be
29
+ * nothing against giving every per-view value a second index to be wrong in.
30
+ *
31
+ * @author Alex Goldring
32
+ * @copyright Company Named Limited (c) 2026
33
+ */
34
+ export class VGeoViewCut {
35
+ /**
36
+ * @type {GPUDevice}
37
+ */
38
+ #device;
39
+
40
+ /**
41
+ * @type {string}
42
+ */
43
+ #label;
44
+
45
+ /**
46
+ * @type {GPUBuffer}
47
+ */
48
+ #params;
49
+
50
+ /**
51
+ * Scratch for one params write, so a per-frame write allocates nothing.
52
+ * @type {ArrayBuffer}
53
+ */
54
+ #scratch;
55
+
56
+ /**
57
+ * `screen_height / (2 · tan(fov_y / 2))`, this view's.
58
+ * @type {number}
59
+ */
60
+ #projection_k = 1;
61
+
62
+ /**
63
+ * One bit per page row: the pages this view's cut drew from, kept between frames.
64
+ * Undefined until the first frame that knows how big the tier is.
65
+ * @type {GPUBuffer|undefined}
66
+ */
67
+ #frontier;
68
+
69
+ /**
70
+ * @type {number}
71
+ */
72
+ #frontier_word_count = 0;
73
+
74
+ /**
75
+ * @param {Object} options
76
+ * @param {GPUDevice} options.device
77
+ * @param {string} [options.label] names the buffer in a capture
78
+ */
79
+ constructor({ device, label = 'a view' }) {
80
+ assert.defined(device, 'device');
81
+
82
+ this.#device = device;
83
+ this.#label = label;
84
+
85
+ this.#params = device.createBuffer({
86
+ label: `VGeoViewCut/params (${label})`,
87
+ size: VGEO_CUT_PARAMS_STRUCT.aligned_size,
88
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
89
+ });
90
+
91
+ this.#scratch = new ArrayBuffer(VGEO_CUT_PARAMS_STRUCT.aligned_size);
92
+ }
93
+
94
+ /**
95
+ * The uniform every pass of this view's cut reads.
96
+ *
97
+ * @returns {GPUBuffer}
98
+ */
99
+ get params_buffer() {
100
+ return this.#params;
101
+ }
102
+
103
+ /**
104
+ * @returns {number}
105
+ */
106
+ get projection_k() {
107
+ return this.#projection_k;
108
+ }
109
+
110
+ /**
111
+ * Where this view's last cut stood, as one bit per page row.
112
+ *
113
+ * @returns {GPUBuffer|undefined}
114
+ */
115
+ get frontier_buffer() {
116
+ return this.#frontier;
117
+ }
118
+
119
+ /**
120
+ * @returns {number}
121
+ */
122
+ get frontier_word_count() {
123
+ return this.#frontier_word_count;
124
+ }
125
+
126
+ /**
127
+ * Size the frontier to the tier it will name rows of.
128
+ *
129
+ * Lazily, and re-made rather than grown when the tier's capacity changes: what it holds
130
+ * is row indices of that tier, so a bigger tier does not extend the old answer, it
131
+ * invalidates it. Dropping it costs one frame of root descent, which is the fallback
132
+ * every other invalidation takes too.
133
+ *
134
+ * @param {number} page_row_capacity
135
+ * @returns {void}
136
+ */
137
+ resize_frontier(page_row_capacity) {
138
+ const words = vgeo_frontier_words(page_row_capacity);
139
+
140
+ if (this.#frontier !== undefined && words === this.#frontier_word_count) {
141
+ return;
142
+ }
143
+
144
+ this.#frontier?.destroy();
145
+
146
+ this.#frontier_word_count = words;
147
+
148
+ this.#frontier = this.#device.createBuffer({
149
+ label: `VGeoViewCut/frontier (${this.#label})`,
150
+ size: Math.max(4, words * 4),
151
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
152
+ });
153
+ }
154
+
155
+ /**
156
+ * Take this view's projection from the target it draws to and the camera it draws with.
157
+ *
158
+ * @param {Object} options
159
+ * @param {number} options.screen_height pixels of the render target
160
+ * @param {number} options.fov_y radians
161
+ * @returns {void}
162
+ */
163
+ set_projection({ screen_height, fov_y }) {
164
+ assert.isNumber(screen_height, 'screen_height');
165
+ assert.greaterThan(screen_height, 0, 'screen_height');
166
+ assert.isNumber(fov_y, 'fov_y');
167
+ assert.greaterThan(fov_y, 0, 'fov_y');
168
+
169
+ this.#projection_k = screen_height / (2 * Math.tan(fov_y * 0.5));
170
+ }
171
+
172
+ /**
173
+ * Publish the frame's shared settings and this view's own, as one uniform.
174
+ *
175
+ * Everything but `projection_k` and `flags` is a property of the runtime or the frame, so it is
176
+ * read from the runtime at write time rather than mirrored here — a second copy of `tau` is a
177
+ * second thing to forget to update.
178
+ *
179
+ * @param {Object} options
180
+ * @param {GPUVirtualGeometryRuntime} options.runtime inside an open frame
181
+ * @param {boolean} [options.coarsen] whether this view's cut may walk up
182
+ * @returns {void}
183
+ */
184
+ write_params({ runtime, coarsen = false }) {
185
+ assert.defined(runtime, 'runtime');
186
+
187
+ const layout = runtime.feedback_layout;
188
+
189
+ assert.defined(layout, 'runtime.feedback_layout — begin_frame must have run');
190
+
191
+ write_gpu_typed_buffer({
192
+ tau: runtime.tau,
193
+ projection_k: this.#projection_k,
194
+ queue_capacity: runtime.queue_capacity,
195
+ claim_word_count: runtime.claim_word_capacity,
196
+ descent_steps: runtime.descent_steps,
197
+ page_slot_words: runtime.pool.page_slot_words,
198
+ touch_bits_base: layout.touch_bits_base,
199
+ want_base: layout.want_base,
200
+ want_capacity: runtime.want_capacity,
201
+ frontier_word_count: this.#frontier_word_count,
202
+ frame_tag: runtime.pool.frame,
203
+ instance_capacity: runtime.instance_capacity,
204
+ meshlet_capacity: runtime.meshlet_capacity,
205
+ flags: (runtime.cull_enabled ? VGEO_CUT_FLAG_CULL : 0)
206
+ | (coarsen ? VGEO_CUT_FLAG_COARSEN : 0),
207
+ }, VGEO_CUT_PARAMS_STRUCT, this.#scratch, 0);
208
+
209
+ this.#device.queue.writeBuffer(
210
+ this.#params, 0, this.#scratch, 0, VGEO_CUT_PARAMS_STRUCT.aligned_size
211
+ );
212
+ }
213
+
214
+ destroy() {
215
+ this.#params.destroy();
216
+
217
+ this.#frontier?.destroy();
218
+ }
219
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * What an executed cut item expands into — the three shapes a child can have.
3
+ *
4
+ * The traversal states its production as a *kind*, a count and a base rather than as children
5
+ * written anywhere, because any lane of the subgroup has to be able to build child `k` of any other
6
+ * lane's item out of a handful of shuffled words. A kind is what makes those words mean something
7
+ * without a second read of the row that produced them.
8
+ */
9
+ export type VGEO_CUT_EXPAND = number;
10
+ export namespace VGEO_CUT_EXPAND {
11
+ let NONE: number;
12
+ let NODES: number;
13
+ let CLUSTERS: number;
14
+ let PAGE: number;
15
+ let PARENTS: number;
16
+ }
17
+ //# sourceMappingURL=VGEO_CUT_EXPAND.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_CUT_EXPAND.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js"],"names":[],"mappings":";;;;;;;;8BAYU,MAAM"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * What an executed cut item expands into — the three shapes a child can have.
3
+ *
4
+ * The traversal states its production as a *kind*, a count and a base rather than as children
5
+ * written anywhere, because any lane of the subgroup has to be able to build child `k` of any other
6
+ * lane's item out of a handful of shuffled words. A kind is what makes those words mean something
7
+ * without a second read of the row that produced them.
8
+ *
9
+ * @see shader_vgeo_cut_traverse
10
+ *
11
+ * @author Alex Goldring
12
+ * @copyright Company Named Limited (c) 2026
13
+ * @enum {number}
14
+ */
15
+ export const VGEO_CUT_EXPAND = {
16
+ /**
17
+ * Nothing. Culled, below the cut, drawn, or clamped — every terminal case of the rule.
18
+ */
19
+ NONE: 0,
20
+ /**
21
+ * `count` child nodes of the same page, starting at node index `first`.
22
+ */
23
+ NODES: 1,
24
+ /**
25
+ * `count` clusters, spread over the `span` groups starting at group index `first`.
26
+ *
27
+ * The count is every cluster the leaf covers rather than a number of chunks: a lane no longer
28
+ * walks a run of them, so there is nothing to chunk. `span` is carried instead of assumed
29
+ * because the walk that maps child `k` back to a group has to terminate on a row the builder
30
+ * wrote, not on a bound this file believes about the format.
31
+ */
32
+ CLUSTERS: 2,
33
+ /**
34
+ * One node 0, in the page at `page_row` — a descent crossing a page boundary, already claimed
35
+ * by the lane that produced it.
36
+ */
37
+ PAGE: 3,
38
+ /**
39
+ * `count` entries of the parent rows of the page at `page_row`, starting at entry `first` —
40
+ * a group's whole parent list, which is one step of a walk up.
41
+ *
42
+ * Unlike {@link PAGE} these are **not** claimed by the producer; each child claims the page
43
+ * it resolves to when it is executed. See `VGEO_QUEUE_TARGET_PARENT_BIT` for why the claim
44
+ * cannot be hoisted into the producer the way the descent's can.
45
+ */
46
+ PARENTS: 4,
47
+ };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `VGEO_CUT_PARAMS_STRUCT.flags`: a cluster below the cut walks **up** instead of stopping.
3
+ *
4
+ * Every edge the descent follows points down, so a traversal that finds itself below the cut — its
5
+ * consuming step already projecting to no more than tau — can only stop, and a runtime that wanted
6
+ * to keep a cut between frames would have to answer every coarsening camera by re-descending from
7
+ * the root. With this set, such a cluster expands into the pages holding its group\x27s parents
8
+ * instead (format §6.3), and the walk continues until it reaches clusters the rule draws.
9
+ *
10
+ * Off by default, and the descent with it off is byte for byte the descent that shipped: the root
11
+ * seed reaches every group through a parent that projected above tau, so the branch this opens is
12
+ * one the descent does not take. It is a flag rather than a behaviour because the cut it belongs to
13
+ * is a *kept* one, which is per view, and CUT_PLAN_2026_09_14 §7.6 is where a view gets to say so.
14
+ *
15
+ * @author Alex Goldring
16
+ * @copyright Company Named Limited (c) 2026
17
+ * @type {number}
18
+ */
19
+ export const VGEO_CUT_FLAG_COARSEN: number;
20
+ //# sourceMappingURL=VGEO_CUT_FLAG_COARSEN.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_CUT_FLAG_COARSEN.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,oCAFU,MAAM,CAEuB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `VGEO_CUT_PARAMS_STRUCT.flags`: a cluster below the cut walks **up** instead of stopping.
3
+ *
4
+ * Every edge the descent follows points down, so a traversal that finds itself below the cut — its
5
+ * consuming step already projecting to no more than tau — can only stop, and a runtime that wanted
6
+ * to keep a cut between frames would have to answer every coarsening camera by re-descending from
7
+ * the root. With this set, such a cluster expands into the pages holding its group\x27s parents
8
+ * instead (format §6.3), and the walk continues until it reaches clusters the rule draws.
9
+ *
10
+ * Off by default, and the descent with it off is byte for byte the descent that shipped: the root
11
+ * seed reaches every group through a parent that projected above tau, so the branch this opens is
12
+ * one the descent does not take. It is a flag rather than a behaviour because the cut it belongs to
13
+ * is a *kept* one, which is per view, and CUT_PLAN_2026_09_14 §7.6 is where a view gets to say so.
14
+ *
15
+ * @author Alex Goldring
16
+ * @copyright Company Named Limited (c) 2026
17
+ * @type {number}
18
+ */
19
+ export const VGEO_CUT_FLAG_COARSEN = 2;
@@ -1 +1 @@
1
- {"version":3,"file":"VGEO_CUT_PARAMS_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,kDA+D2B;6BAjFE,yCAAyC"}
1
+ {"version":3,"file":"VGEO_CUT_PARAMS_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,kDAiF2B;6BAnGE,yCAAyC"}
@@ -41,9 +41,25 @@ export const VGEO_CUT_PARAMS_STRUCT = WebGPUStruct.from({
41
41
  */
42
42
  claim_word_count: u32,
43
43
  /**
44
- * How many clusters one group-chunk item covers.
44
+ * Words of this view's frontier bitmask — one bit per page row, and the bound a write
45
+ * into it is clamped against.
46
+ *
47
+ * Zero says this view keeps no frontier, which is what every cut did before one existed
48
+ * and what a cut still does when the flag is off: the bound rejects every write rather
49
+ * than a branch having to ask.
50
+ */
51
+ frontier_word_count: u32,
52
+ /**
53
+ * Steps of the descent one dispatch of the traversal runs before handing what it still holds
54
+ * back to the queue.
55
+ *
56
+ * WGSL will not let a loop around a subgroup operation have a non-uniform trip count, and
57
+ * nothing launders one — so the descent cannot stop when the wave runs dry. It runs this many
58
+ * times and masks, at about ten instructions a step for a wave with nothing left. That makes
59
+ * this a tuning knob between idle steps and dispatches, and not a safety bound:
60
+ * `VGEO_CUT_STAT.QUEUE_REMAINING` is what says it was set too low.
45
61
  */
46
- cluster_chunk: u32,
62
+ descent_steps: u32,
47
63
  /**
48
64
  * Arena words one page slot holds — the stride a page row is multiplied by.
49
65
  *
@@ -53,19 +69,21 @@ export const VGEO_CUT_PARAMS_STRUCT = WebGPUStruct.from({
53
69
  */
54
70
  page_slot_words: u32,
55
71
  /**
56
- * Word offset in the feedback buffer of the per-page-row touch stamps.
72
+ * Word offset in the feedback buffer of the touch bits — one per page row, set with an
73
+ * `atomicOr` when a page's claim is won. The bit is the dedup and the record at once, so there
74
+ * is no list to overflow and nothing per row to clear beyond the transient itself.
57
75
  */
58
- touch_stamp_base: u32,
59
- /**
60
- * Word offset in the feedback buffer of the per-lookup-word want stamps. A want's stamp index
61
- * is this plus the geometry's lookup offset plus the child page index, which is why the page
62
- * lookup has its own buffer and its own allocator: it makes that a compact, dense index.
63
- */
64
- want_stamp_base: u32,
76
+ touch_bits_base: u32,
65
77
  want_base: u32,
66
78
  want_capacity: u32,
67
- touch_base: u32,
68
- touch_capacity: u32,
79
+ /**
80
+ * What this frame writes into the want-stamp buffer to claim a want, and what it compares
81
+ * against to dedup one. The stamps are persistent and one per lookup word — one per page of
82
+ * every registered geometry — so they are not cleared per frame; a stamp holding this frame's
83
+ * tag was written this frame, and any other value was not. Never zero, which is what a fresh
84
+ * buffer holds.
85
+ */
86
+ frame_tag: u32,
69
87
  /**
70
88
  * Records the VG instance buffer holds, for the one append in the cut that had no bound.
71
89
  */
@@ -1,14 +1,14 @@
1
1
  /**
2
- * Addressing and arithmetic shared by every pass of the cut — how to find a row, and how to project
3
- * an error.
2
+ * The arithmetic the cut rule is written in: where the camera is in an instance's own space, what
3
+ * an object-space error projects to in pixels, and whether a sphere is worth descending into at all.
4
4
  *
5
- * The arena is `array<u32>` with hand-written accessors rather than a marshalled struct array,
6
- * because it holds three different row types in one allocation per page and no struct array can say
7
- * that. The offsets it indexes with are the `layout/` constants, so the CPU writer and the kernel
8
- * are reading the same numbers rather than two copies of them.
5
+ * Addressing moved to {@link chunk_vgeo_cut_arena}, which this pulls in — a pass that only wants to
6
+ * find a row should not have to take the frustum test with it, and the passes that did not want to
7
+ * wrote their own accessor instead.
9
8
  *
10
- * Every buffer named here has to be declared by the importing shader. That is the price of sharing
11
- * addressing across passes, and it is the same bargain `chunk_scene_database_access` makes.
9
+ * Every buffer named here has to be declared by the importing shader — `instances`, plus whatever
10
+ * the arena chunk needs. That is the price of sharing addressing across passes, and it is the same
11
+ * bargain `chunk_scene_database_access` makes.
12
12
  *
13
13
  * @author Alex Goldring
14
14
  * @copyright Company Named Limited (c) 2026
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_vgeo_cut_access.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;GAeG;AACH,oCAFU,SAAS,CAqIZ;0BA/JmB,0CAA0C"}
1
+ {"version":3,"file":"chunk_vgeo_cut_access.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,oCAFU,SAAS,CA+EQ;0BAjGD,0CAA0C"}
@@ -1,26 +1,18 @@
1
1
  import { CodeChunk } from "../../../../shader/compiler/CodeChunk.js";
2
- import { VGEO_CLUSTER_ROW_WORDS } from "../layout/VGEO_CLUSTER_ROW_WORDS.js";
3
- import { VGEO_GEOMETRY_ROW_WORDS } from "../layout/VGEO_GEOMETRY_ROW_WORDS.js";
4
- import { VGEO_GROUP_ROW_WORDS } from "../layout/VGEO_GROUP_ROW_WORDS.js";
5
2
  import { VGEO_INSTANCE_OFFSET } from "../layout/VGEO_INSTANCE_OFFSET.js";
6
- import { VGEO_INSTANCE_WORDS } from "../layout/VGEO_INSTANCE_WORDS.js";
7
- import { VGEO_NODE_ROW_LEAF_BIT } from "../layout/VGEO_NODE_ROW_LEAF_BIT.js";
8
- import { VGEO_NODE_ROW_OFFSET } from "../layout/VGEO_NODE_ROW_OFFSET.js";
9
- import { VGEO_NODE_ROW_WORDS } from "../layout/VGEO_NODE_ROW_WORDS.js";
10
- import { VGEO_PAGE_ROW_OFFSET } from "../layout/VGEO_PAGE_ROW_OFFSET.js";
11
- import { VGEO_PAGE_ROW_WORDS } from "../layout/VGEO_PAGE_ROW_WORDS.js";
3
+ import { chunk_vgeo_cut_arena } from "./chunk_vgeo_cut_arena.js";
12
4
 
13
5
  /**
14
- * Addressing and arithmetic shared by every pass of the cut — how to find a row, and how to project
15
- * an error.
6
+ * The arithmetic the cut rule is written in: where the camera is in an instance's own space, what
7
+ * an object-space error projects to in pixels, and whether a sphere is worth descending into at all.
16
8
  *
17
- * The arena is `array<u32>` with hand-written accessors rather than a marshalled struct array,
18
- * because it holds three different row types in one allocation per page and no struct array can say
19
- * that. The offsets it indexes with are the `layout/` constants, so the CPU writer and the kernel
20
- * are reading the same numbers rather than two copies of them.
9
+ * Addressing moved to {@link chunk_vgeo_cut_arena}, which this pulls in — a pass that only wants to
10
+ * find a row should not have to take the frustum test with it, and the passes that did not want to
11
+ * wrote their own accessor instead.
21
12
  *
22
- * Every buffer named here has to be declared by the importing shader. That is the price of sharing
23
- * addressing across passes, and it is the same bargain `chunk_scene_database_access` makes.
13
+ * Every buffer named here has to be declared by the importing shader — `instances`, plus whatever
14
+ * the arena chunk needs. That is the price of sharing addressing across passes, and it is the same
15
+ * bargain `chunk_scene_database_access` makes.
24
16
  *
25
17
  * @author Alex Goldring
26
18
  * @copyright Company Named Limited (c) 2026
@@ -29,16 +21,6 @@ import { VGEO_PAGE_ROW_WORDS } from "../layout/VGEO_PAGE_ROW_WORDS.js";
29
21
  export const chunk_vgeo_cut_access = CodeChunk.from(
30
22
  //language=WGSL
31
23
  `
32
- const VG_PAGE_ROW_WORDS = ${VGEO_PAGE_ROW_WORDS}u;
33
- const VG_NODE_ROW_WORDS = ${VGEO_NODE_ROW_WORDS}u;
34
- const VG_GROUP_ROW_WORDS = ${VGEO_GROUP_ROW_WORDS}u;
35
- const VG_CLUSTER_ROW_WORDS = ${VGEO_CLUSTER_ROW_WORDS}u;
36
- const VG_INSTANCE_WORDS = ${VGEO_INSTANCE_WORDS}u;
37
- const VG_GEOMETRY_ROW_WORDS = ${VGEO_GEOMETRY_ROW_WORDS}u;
38
-
39
- const VG_NODE_LEAF_BIT = ${VGEO_NODE_ROW_LEAF_BIT}u;
40
- const VG_NODE_CHILD_COUNT_MASK = 0xffu;
41
-
42
24
  /**
43
25
  * Any error at or above this is the root's +infinity, however the file spelled it.
44
26
  *
@@ -49,50 +31,6 @@ const VG_NODE_CHILD_COUNT_MASK = 0xffu;
49
31
  const VG_ERROR_INFINITE = 3.0e38;
50
32
  const VG_PROJECTION_MAX = 3.4e38;
51
33
 
52
- /**
53
- * A page's slot: its header, then its node, group and cluster rows.
54
- *
55
- * The stride is a uniform rather than a constant because the tier derives it from the page size its
56
- * containers are bounded at, and it is a **multiply** rather than a table read because format
57
- * §11.14 made that legal — design §6 asked for fixed-size page slots from the start and the bound
58
- * is what it was waiting for. There is no page table, no allocator, and no second storage binding
59
- * to keep coherent with this one.
60
- */
61
- fn vg_slot_base(page_row: u32) -> u32 {
62
- return page_row * params.page_slot_words;
63
- }
64
-
65
- fn vg_page_field(page_row: u32, field: u32) -> u32 {
66
- return vg_arena[vg_slot_base(page_row) + field];
67
- }
68
-
69
- fn vg_node_base(page_row: u32) -> u32 {
70
- return vg_slot_base(page_row) + VG_PAGE_ROW_WORDS;
71
- }
72
-
73
- fn vg_group_base(page_row: u32) -> u32 {
74
- return vg_node_base(page_row)
75
- + vg_page_field(page_row, ${VGEO_PAGE_ROW_OFFSET.NODE_COUNT}u) * VG_NODE_ROW_WORDS;
76
- }
77
-
78
- fn vg_cluster_base(page_row: u32) -> u32 {
79
- return vg_group_base(page_row)
80
- + vg_page_field(page_row, ${VGEO_PAGE_ROW_OFFSET.GROUP_COUNT}u) * VG_GROUP_ROW_WORDS;
81
- }
82
-
83
- fn vg_arena_f32(word: u32) -> f32 {
84
- return bitcast<f32>(vg_arena[word]);
85
- }
86
-
87
- fn vg_sphere_at(word: u32) -> vec4<f32> {
88
- return vec4<f32>(
89
- bitcast<f32>(vg_arena[word]),
90
- bitcast<f32>(vg_arena[word + 1u]),
91
- bitcast<f32>(vg_arena[word + 2u]),
92
- bitcast<f32>(vg_arena[word + 3u])
93
- );
94
- }
95
-
96
34
  fn vg_instance_f32(instance_base: u32, field: u32) -> f32 {
97
35
  return bitcast<f32>(instances[instance_base + field]);
98
36
  }
@@ -108,7 +46,7 @@ fn vg_instance_eye(instance_base: u32) -> vec3<f32> {
108
46
  /**
109
47
  * \`err_px = r_e * screen_height / (2 * tan(fov_y / 2) * d)\`, with \`d\` the distance to the
110
48
  * **closest point** of the sphere — design §4, and written in that order so that it agrees with
111
- * \`select_cut.js\` term for term rather than merely in the limit.
49
+ * \`vgeo_select_cut\` term for term rather than merely in the limit.
112
50
  *
113
51
  * Two conventions carry real weight. A zero error projects to zero **unconditionally**, so a leaf
114
52
  * — whose error is exactly zero — does not become undrawable the moment the camera enters its
@@ -157,4 +95,4 @@ fn vg_sphere_outside_frustum(instance_base: u32, sphere: vec4<f32>) -> bool {
157
95
 
158
96
  return false;
159
97
  }
160
- `, []);
98
+ `, [chunk_vgeo_cut_arena]);