@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
@@ -4,36 +4,33 @@
4
4
  * One function rather than two agreeing conventions: the pass that creates the buffer and the
5
5
  * params block that tells the kernel where to write both come from here, and so does anything that
6
6
  * reads it back. A layout computed twice is a layout that drifts, and the way it drifts is a want
7
- * list written over a stamp region, which reads as wants that never resolve.
7
+ * list written over the touch bits, which reads as wants that never resolve.
8
8
  *
9
- * The stamps are the reason the buffer is per **frame** rather than per invocation: a page touched
10
- * from two buckets is one touch, and a page wanted by two views is one want. Being cleared exactly
11
- * once, at creation, is what makes a plain flag enough and saves carrying a frame counter through
12
- * every comparison.
9
+ * **Header, touch bits, want records — and the whole of it is read back.** Two regions used to sit
10
+ * between the header and the lists and neither was the CPU's business: a stamp word per page row
11
+ * and a stamp word per lookup word, cleared with the transient every frame and mapped back with
12
+ * it. At the playground's 4,096 slots that was 344 KB a frame across the bus for 33 KB of lists,
13
+ * and the lookup-sized half of it grew with every registered geometry rather than with anything
14
+ * seen. The touch stamps are the touch bits now — one bit per row, which is both the dedup and
15
+ * the record — and the want stamps live in a persistent, frame-tagged buffer the pool owns and
16
+ * nothing reads back (RUNTIME_PLAN_2026_09_14 §2.2, §2.3).
13
17
  *
14
18
  * @param {Object} options
15
- * @param {number} options.page_row_capacity one touch stamp per page-table row
16
- * @param {number} options.lookup_word_count one want stamp per lookup word, so a want's stamp is
17
- * its geometry's lookup offset plus the child page index — which is the whole reason the page
18
- * lookup has its own buffer and its own allocator
19
+ * @param {number} options.page_row_capacity one touch bit per page-table row
19
20
  * @param {number} options.want_capacity records
20
- * @param {number} options.touch_capacity records
21
- * @returns {{touch_stamp_base: number, want_stamp_base: number, want_base: number,
22
- * touch_base: number, word_count: number}}
21
+ * @returns {{touch_bits_base: number, touch_word_count: number, want_base: number,
22
+ * word_count: number}}
23
23
  *
24
24
  * @author Alex Goldring
25
25
  * @copyright Company Named Limited (c) 2026
26
26
  */
27
- export function vgeo_cut_feedback_layout({ page_row_capacity, lookup_word_count, want_capacity, touch_capacity, }: {
27
+ export function vgeo_cut_feedback_layout({ page_row_capacity, want_capacity }: {
28
28
  page_row_capacity: number;
29
- lookup_word_count: number;
30
29
  want_capacity: number;
31
- touch_capacity: number;
32
30
  }): {
33
- touch_stamp_base: number;
34
- want_stamp_base: number;
31
+ touch_bits_base: number;
32
+ touch_word_count: number;
35
33
  want_base: number;
36
- touch_base: number;
37
34
  word_count: number;
38
35
  };
39
36
  //# sourceMappingURL=vgeo_cut_feedback_layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_cut_feedback_layout.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IAZ2B,iBAAiB,EAAjC,MAAM;IACU,iBAAiB,EAAjC,MAAM;IAGU,aAAa,EAA7B,MAAM;IACU,cAAc,EAA9B,MAAM;IACJ;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAClF,UAAgB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CA4B7C"}
1
+ {"version":3,"file":"vgeo_cut_feedback_layout.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IAR2B,iBAAiB,EAAjC,MAAM;IACU,aAAa,EAA7B,MAAM;IACJ;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAClF,UAAgB,EAAE,MAAM,CAAA;CAAC,CAmBzB"}
@@ -8,47 +8,38 @@ import { VGEO_WANT_WORDS } from "../layout/VGEO_WANT_WORDS.js";
8
8
  * One function rather than two agreeing conventions: the pass that creates the buffer and the
9
9
  * params block that tells the kernel where to write both come from here, and so does anything that
10
10
  * reads it back. A layout computed twice is a layout that drifts, and the way it drifts is a want
11
- * list written over a stamp region, which reads as wants that never resolve.
11
+ * list written over the touch bits, which reads as wants that never resolve.
12
12
  *
13
- * The stamps are the reason the buffer is per **frame** rather than per invocation: a page touched
14
- * from two buckets is one touch, and a page wanted by two views is one want. Being cleared exactly
15
- * once, at creation, is what makes a plain flag enough and saves carrying a frame counter through
16
- * every comparison.
13
+ * **Header, touch bits, want records — and the whole of it is read back.** Two regions used to sit
14
+ * between the header and the lists and neither was the CPU's business: a stamp word per page row
15
+ * and a stamp word per lookup word, cleared with the transient every frame and mapped back with
16
+ * it. At the playground's 4,096 slots that was 344 KB a frame across the bus for 33 KB of lists,
17
+ * and the lookup-sized half of it grew with every registered geometry rather than with anything
18
+ * seen. The touch stamps are the touch bits now — one bit per row, which is both the dedup and
19
+ * the record — and the want stamps live in a persistent, frame-tagged buffer the pool owns and
20
+ * nothing reads back (RUNTIME_PLAN_2026_09_14 §2.2, §2.3).
17
21
  *
18
22
  * @param {Object} options
19
- * @param {number} options.page_row_capacity one touch stamp per page-table row
20
- * @param {number} options.lookup_word_count one want stamp per lookup word, so a want's stamp is
21
- * its geometry's lookup offset plus the child page index — which is the whole reason the page
22
- * lookup has its own buffer and its own allocator
23
+ * @param {number} options.page_row_capacity one touch bit per page-table row
23
24
  * @param {number} options.want_capacity records
24
- * @param {number} options.touch_capacity records
25
- * @returns {{touch_stamp_base: number, want_stamp_base: number, want_base: number,
26
- * touch_base: number, word_count: number}}
25
+ * @returns {{touch_bits_base: number, touch_word_count: number, want_base: number,
26
+ * word_count: number}}
27
27
  *
28
28
  * @author Alex Goldring
29
29
  * @copyright Company Named Limited (c) 2026
30
30
  */
31
- export function vgeo_cut_feedback_layout({
32
- page_row_capacity,
33
- lookup_word_count,
34
- want_capacity,
35
- touch_capacity,
36
- }) {
31
+ export function vgeo_cut_feedback_layout({ page_row_capacity, want_capacity }) {
37
32
  assert.isNonNegativeInteger(page_row_capacity, 'page_row_capacity');
38
- assert.isNonNegativeInteger(lookup_word_count, 'lookup_word_count');
39
33
  assert.isNonNegativeInteger(want_capacity, 'want_capacity');
40
- assert.isNonNegativeInteger(touch_capacity, 'touch_capacity');
41
34
 
42
- const touch_stamp_base = VGEO_FEEDBACK_OFFSET.HEADER_WORDS;
43
- const want_stamp_base = touch_stamp_base + page_row_capacity;
44
- const want_base = want_stamp_base + lookup_word_count;
45
- const touch_base = want_base + want_capacity * VGEO_WANT_WORDS;
35
+ const touch_bits_base = VGEO_FEEDBACK_OFFSET.HEADER_WORDS;
36
+ const touch_word_count = Math.max(1, Math.ceil(page_row_capacity / 32));
37
+ const want_base = touch_bits_base + touch_word_count;
46
38
 
47
39
  return {
48
- touch_stamp_base,
49
- want_stamp_base,
40
+ touch_bits_base,
41
+ touch_word_count,
50
42
  want_base,
51
- touch_base,
52
- word_count: touch_base + touch_capacity,
43
+ word_count: want_base + want_capacity * VGEO_WANT_WORDS,
53
44
  };
54
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graph_vgeo_expand_instances_to_meshlets.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH;IAX+B,KAAK;IACT,YAAY,EAA5B,MAAM;IACU,eAAe,EAA/B,MAAM;IACkB,IAAI;IACO,OAAO;IACb,MAAM;IACjC,MAAM,CAmRlB"}
1
+ {"version":3,"file":"graph_vgeo_expand_instances_to_meshlets.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH;IAX+B,KAAK;IACT,YAAY,EAA5B,MAAM;IACU,eAAe,EAA/B,MAAM;IACkB,IAAI;IACO,OAAO;IACb,MAAM;IACjC,MAAM,CAsSlB"}
@@ -9,6 +9,7 @@ import { graph_prefix_scan_csdldf } from "../../../gpu_primitive/prefix_sum/v1/g
9
9
  import { RasterizationCollectionType } from "../../../rasterize/expand/RasterizationCollectionType.js";
10
10
  import { shader_vgeo_cut_collect } from "./cut/shader_vgeo_cut_collect.js";
11
11
  import { shader_vgeo_cut_queue_prepare } from "./cut/shader_vgeo_cut_queue_prepare.js";
12
+ import { shader_vgeo_cut_queue_remainder } from "./cut/shader_vgeo_cut_queue_remainder.js";
12
13
  import { shader_vgeo_cut_seed } from "./cut/shader_vgeo_cut_seed.js";
13
14
  import { shader_vgeo_cut_traverse } from "./cut/shader_vgeo_cut_traverse.js";
14
15
  import { VGEO_CUT_WORKGROUP_SIZE } from "./cut/VGEO_CUT_WORKGROUP_SIZE.js";
@@ -87,6 +88,30 @@ export function graph_vgeo_expand_instances_to_meshlets({
87
88
  meshlet_capacity: Math.max(1, limits.get_limit(RasterizationCollectionType.Meshlets)),
88
89
  });
89
90
 
91
+ /*
92
+ This view's own uniform, written here rather than when the frame opened. `projection_k` is
93
+ the render target's height over the camera's field of view, so it belongs to a view and not
94
+ to a frame — one buffer for the frame meant a shadow cascade cutting against whichever view
95
+ opened it. The capacities above are frame-global and collapse to a `Math.min` across sites,
96
+ and writing after `declare_collections` is what puts the smallest of them in the buffer that
97
+ this view's passes read.
98
+ */
99
+ const view_cut = view.virtual_geometry_cut;
100
+
101
+ view_cut.set_projection({
102
+ screen_height: Math.max(1, view.resolution[1]),
103
+ fov_y: view.camera.camera.fov,
104
+ });
105
+
106
+ /*
107
+ Sized against the tier this cut names rows of, before the params that carry its bound.
108
+ A page row is what the frontier records, so the tier's capacity is the only thing it
109
+ has to agree with.
110
+ */
111
+ view_cut.resize_frontier(pool.page_row_capacity);
112
+
113
+ view_cut.write_params({ runtime });
114
+
90
115
  // ----- collect: which of these instances are virtual, and where is the camera in each one -----
91
116
 
92
117
  const collect_command = graph_build_indirect_dispatch_command(
@@ -100,7 +125,7 @@ export function graph_vgeo_expand_instances_to_meshlets({
100
125
  encoder: context.encoder,
101
126
  command: resources.get(data.command),
102
127
  bindings: {
103
- params: runtime.params_buffer,
128
+ params: view_cut.params_buffer,
104
129
  camera: view.camera.buffer,
105
130
  scene_database: scene.scene_database_buffer,
106
131
  geometries: scene.geometries.buffer_metadata,
@@ -162,7 +187,7 @@ export function graph_vgeo_expand_instances_to_meshlets({
162
187
  encoder: context.encoder,
163
188
  command: resources.get(data.command),
164
189
  bindings: {
165
- params: runtime.params_buffer,
190
+ params: view_cut.params_buffer,
166
191
  vg_arena: pool.buffer_arena,
167
192
  prefix_sums: resources.get(data.prefix_sums),
168
193
  instances: resources.get(data.instances),
@@ -196,8 +221,7 @@ export function graph_vgeo_expand_instances_to_meshlets({
196
221
  /*
197
222
  The two queues ping-pong, so *which* of them holds work is not a property of either buffer —
198
223
  it moves every iteration. Carrying the roles rather than the buffers is what makes the tail
199
- pass below correct at any `max_iterations`: it was written as `queue_a`, which is the produced
200
- queue only when the iteration count is even, and the default of 64 is (REVIEW_LEDGER M8).
224
+ pass below correct at any `max_iterations` rather than only at an even one (REVIEW_LEDGER M8).
201
225
  */
202
226
  let ready_queue = seed_data.queue_out;
203
227
  let spare_queue = spare_spawn.create("vg queue b", queue_descriptor);
@@ -218,11 +242,10 @@ export function graph_vgeo_expand_instances_to_meshlets({
218
242
  shader_vgeo_cut_queue_prepare.dispatch({
219
243
  encoder: context.encoder,
220
244
  bindings: {
221
- params: runtime.params_buffer,
245
+ params: view_cut.params_buffer,
222
246
  queue_ready: resources.get(data.queue_ready),
223
247
  queue_spare: resources.get(data.queue_spare),
224
248
  command: resources.get(data.command),
225
- feedback: resources.get(data.feedback),
226
249
  }
227
250
  });
228
251
  }
@@ -238,8 +261,6 @@ export function graph_vgeo_expand_instances_to_meshlets({
238
261
  const ready = prepare_data.queue_ready = prepare_pass.write(ready_queue);
239
262
  const spare = prepare_data.queue_spare = prepare_pass.write(spare_queue);
240
263
 
241
- feedback = prepare_data.feedback = prepare_pass.write(feedback);
242
-
243
264
  prepare_data.command = prepare_pass.create(
244
265
  `vg command ${iteration}`, INDIRECT_COMPUTE_COMMAND_DESCRIPTOR
245
266
  );
@@ -252,14 +273,16 @@ export function graph_vgeo_expand_instances_to_meshlets({
252
273
  encoder: context.encoder,
253
274
  command: resources.get(data.command),
254
275
  bindings: {
255
- params: runtime.params_buffer,
276
+ params: view_cut.params_buffer,
256
277
  vg_lookup: pool.buffer_lookup,
257
278
  vg_arena: pool.buffer_arena,
279
+ vg_want_stamps: pool.buffer_want_stamps,
258
280
  instances: resources.get(data.instances),
259
281
  queue_in: resources.get(data.queue_in),
260
282
  queue_out: resources.get(data.queue_out),
261
283
  claim: resources.get(data.claim),
262
284
  feedback: resources.get(data.feedback),
285
+ frontier: view_cut.frontier_buffer,
263
286
  out_meshlets: resources.get(data.out_meshlets),
264
287
  }
265
288
  });
@@ -282,35 +305,32 @@ export function graph_vgeo_expand_instances_to_meshlets({
282
305
  }
283
306
 
284
307
  /*
285
- One more prepare, for its counters alone. The loop above records a fixed number of
286
- prepare/traverse pairs and the queue can still hold work when the last of them finishes — a
287
- subtree never descended, which is a hole rather than a coarse stand-in, and the one degradation
288
- §4.5 admits. Nothing recorded it. This pass leaves the outstanding count in
289
- `VGEO_CUT_STAT.QUEUE_REMAINING`, and the dispatch command it also produces is simply not used.
290
-
291
- `ready_queue` and not `queue_a`: the prepare pass reports the count of `queue_ready` and
292
- *zeroes* `queue_spare`, so binding the drained queue as ready would report a count of work
293
- already done and destroy the count of the work that was left. Which buffer holds which
308
+ One more pass, for one number. The loop above records a fixed number of prepare/traverse pairs
309
+ and the queue can still hold work when the last of them finishes — a subtree never descended,
310
+ which is a hole rather than a coarse stand-in, and the one degradation §4.5 admits. This is
311
+ where `VGEO_CUT_STAT.QUEUE_REMAINING` comes from.
312
+
313
+ It is not the prepare pass: that one runs *between* wavefronts and once per iteration per
314
+ expansion site, so what it could report is a frontier rather than a remainder, and the next
315
+ site would overwrite it. See {@link shader_vgeo_cut_queue_remainder}.
316
+
317
+ `ready_queue` and not either buffer by name: which of the two holds the produced queue
294
318
  alternates per iteration, so the roles are carried through the loop rather than named here.
295
319
  */
296
320
  const tail_data = {};
297
321
 
298
322
  const tail_pass = graph.add("vg queue tail", tail_data, (data, resources, context) => {
299
- shader_vgeo_cut_queue_prepare.dispatch({
323
+ shader_vgeo_cut_queue_remainder.dispatch({
300
324
  encoder: context.encoder,
301
325
  bindings: {
302
- params: runtime.params_buffer,
326
+ params: view_cut.params_buffer,
303
327
  queue_ready: resources.get(data.queue_ready),
304
- queue_spare: resources.get(data.queue_spare),
305
- command: resources.get(data.command),
306
328
  feedback: resources.get(data.feedback),
307
329
  }
308
330
  });
309
331
  });
310
332
 
311
- tail_data.queue_ready = tail_pass.write(ready_queue);
312
- tail_data.queue_spare = tail_pass.write(spare_queue);
313
- tail_data.command = tail_pass.create("vg command tail", INDIRECT_COMPUTE_COMMAND_DESCRIPTOR);
333
+ tail_data.queue_ready = tail_pass.read(ready_queue);
314
334
 
315
335
  feedback = tail_data.feedback = tail_pass.write(feedback);
316
336
 
@@ -13,5 +13,6 @@ export namespace VGEO_CUT_STAT {
13
13
  let INSTANCES_DROPPED: number;
14
14
  let WAVEFRONTS: number;
15
15
  let QUEUE_REMAINING: number;
16
+ let CULLED_CLUSTER: number;
16
17
  }
17
18
  //# sourceMappingURL=VGEO_CUT_STAT.d.ts.map
@@ -96,4 +96,15 @@ export const VGEO_CUT_STAT = {
96
96
  * number that was outstanding at the end.
97
97
  */
98
98
  QUEUE_REMAINING: 13,
99
+ /**
100
+ * Clusters discarded by the frustum before they could draw, clamp or refine.
101
+ *
102
+ * {@link CULLED_FRUSTUM} is a node's whole subtree; this is one cluster, and it is the one that
103
+ * matters for residency. A cluster claims — and touches — its child page the moment it refines,
104
+ * and the frustum used to be consulted only at the child's nodes, after the claim. Zoomed in on
105
+ * a wall, every cluster of the wall at that level refined whether or not it was on screen,
106
+ * 4,044 rows of 4,096 were touched a frame, and nothing was ever cold enough to evict
107
+ * (RUNTIME_PLAN_2026_09_14 §0, §2.1).
108
+ */
109
+ CULLED_CLUSTER: 14,
99
110
  };
@@ -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 = 14;
8
+ export const VGEO_CUT_STAT_COUNT = 15;
@@ -1,6 +1,5 @@
1
1
  export namespace VGEO_FEEDBACK_OFFSET {
2
2
  let WANT_COUNT: number;
3
- let TOUCH_COUNT: number;
4
3
  let STATS: number;
5
4
  let HEADER_WORDS: number;
6
5
  }
@@ -4,24 +4,26 @@ import { VGEO_CUT_STAT_COUNT } from "./VGEO_CUT_STAT_COUNT.js";
4
4
  * Word offsets in the feedback buffer — the one thing the cut hands back to the CPU, and the only
5
5
  * place in the runtime where a GPU pass and a host frame meet.
6
6
  *
7
- * Header first, then the two lists, so a readback of the header alone tells a saturated frame how
8
- * much of the rest is worth mapping. Design §6: the wants loop tolerates its transport — multi-frame
9
- * `mapAsync` latency, a small in-flight cap, and frames where feedback is skipped entirely.
7
+ * Header first, then the touch bits, then the want records; see `vgeo_cut_feedback_layout` for the
8
+ * two that move. Design §6: the wants loop tolerates its transport — multi-frame `mapAsync`
9
+ * latency, a small in-flight cap, and frames where feedback is skipped entirely.
10
+ *
11
+ * There is no touch count any more. A touch is one bit per page row (RUNTIME_PLAN_2026_09_14
12
+ * §2.2), so the list it used to count, and the capacity that list could overflow, are gone.
10
13
  *
11
14
  * @author Alex Goldring
12
15
  * @copyright Company Named Limited (c) 2026
13
16
  */
14
17
  export const VGEO_FEEDBACK_OFFSET = {
15
18
  WANT_COUNT: 0,
16
- TOUCH_COUNT: 1,
17
19
  /**
18
- * Counters live in the header so that a frame whose lists overflowed still says so.
20
+ * Counters live in the header so that a frame whose list overflowed still says so.
19
21
  */
20
- STATS: 2,
22
+ STATS: 1,
21
23
  /**
22
- * Where the want records begin. The lists themselves are sized by the caller's options and
23
- * their bases travel in the params block, because a graph resource's size is a host-side
24
- * decision and the kernel must not assume one.
24
+ * Where the touch bits begin. The want records follow them, and their base travels in the
25
+ * params block because a graph resource's size is a host-side decision and the kernel must not
26
+ * assume one.
25
27
  */
26
- HEADER_WORDS: 2 + VGEO_CUT_STAT_COUNT,
28
+ HEADER_WORDS: 1 + VGEO_CUT_STAT_COUNT,
27
29
  };
@@ -3,5 +3,6 @@ export namespace VGEO_GROUP_ROW_OFFSET {
3
3
  let CLUSTER_COUNT: number;
4
4
  let FLAGS: number;
5
5
  let PARENT_COUNT: number;
6
+ let PARENT_FIRST: number;
6
7
  }
7
8
  //# sourceMappingURL=VGEO_GROUP_ROW_OFFSET.d.ts.map
@@ -33,4 +33,12 @@ export const VGEO_GROUP_ROW_OFFSET = {
33
33
  * copy has been evicted underneath this tier still has a correct answer.
34
34
  */
35
35
  PARENT_COUNT: 3,
36
+ /**
37
+ * Where this group's run in the page's parent rows starts; {@link PARENT_COUNT} is its length.
38
+ *
39
+ * Zero on a page from a container written before `format_version` 4, which carries no upward
40
+ * edge — and so is that page's `PARENT_ENTRY_COUNT`, which is what a reader checks rather than
41
+ * asking the container its version.
42
+ */
43
+ PARENT_FIRST: 4,
36
44
  };
@@ -1,6 +1,11 @@
1
1
  /**
2
- * Words in one group row. Four rather than three so a group block stays 16-byte aligned, which
3
- * costs nothing — a page carries a handful of groups against hundreds of clusters.
2
+ * Words in one group row.
3
+ *
4
+ * Five, and not padded back up to eight. Four used to buy a 16-byte-aligned group block for nothing,
5
+ * and the fifth word — `PARENT_FIRST` — spends that alignment rather than doubling the row: the
6
+ * cluster block that follows is 13 words a row and was never 16-byte aligned internally either, so
7
+ * there was nothing downstream the property was protecting. A page carries a handful of groups
8
+ * against hundreds of clusters, so neither choice is measurable; this one is only smaller.
4
9
  *
5
10
  * @author Alex Goldring
6
11
  * @copyright Company Named Limited (c) 2026
@@ -1 +1 @@
1
- {"version":3,"file":"VGEO_GROUP_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,mCAFU,MAAM,CAEsB"}
1
+ {"version":3,"file":"VGEO_GROUP_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,mCAFU,MAAM,CAEsB"}
@@ -1,9 +1,14 @@
1
1
  /**
2
- * Words in one group row. Four rather than three so a group block stays 16-byte aligned, which
3
- * costs nothing — a page carries a handful of groups against hundreds of clusters.
2
+ * Words in one group row.
3
+ *
4
+ * Five, and not padded back up to eight. Four used to buy a 16-byte-aligned group block for nothing,
5
+ * and the fifth word — `PARENT_FIRST` — spends that alignment rather than doubling the row: the
6
+ * cluster block that follows is 13 words a row and was never 16-byte aligned internally either, so
7
+ * there was nothing downstream the property was protecting. A page carries a handful of groups
8
+ * against hundreds of clusters, so neither choice is measurable; this one is only smaller.
4
9
  *
5
10
  * @author Alex Goldring
6
11
  * @copyright Company Named Limited (c) 2026
7
12
  * @type {number}
8
13
  */
9
- export const VGEO_GROUP_ROW_WORDS = 4;
14
+ export const VGEO_GROUP_ROW_WORDS = 5;
@@ -7,5 +7,7 @@ export namespace VGEO_PAGE_ROW_OFFSET {
7
7
  let ORDINAL: number;
8
8
  let GEOMETRY_ROW: number;
9
9
  let DECODED_SIZE: number;
10
+ let PARENT_ENTRY_COUNT: number;
11
+ let GENERATION: number;
10
12
  }
11
13
  //# sourceMappingURL=VGEO_PAGE_ROW_OFFSET.d.ts.map
@@ -58,4 +58,23 @@ export const VGEO_PAGE_ROW_OFFSET = {
58
58
  * down itself cannot drift.
59
59
  */
60
60
  DECODED_SIZE: 7,
61
+ /**
62
+ * Entries in this page's parent rows — the sum of every group's `PARENT_COUNT`, and the bound
63
+ * a walk up must stay inside.
64
+ *
65
+ * **Zero says the container has no upward edge**, which is every container written before
66
+ * `format_version` 4. A kernel that wants to coarsen reads this rather than asking what version
67
+ * the asset is, and takes zero as "re-descend instead".
68
+ */
69
+ PARENT_ENTRY_COUNT: 8,
70
+ /**
71
+ * `VGeoRuntimeTables`' own generation for this row, mirrored here at install.
72
+ *
73
+ * A page row is reused: an eviction bumps the counter, so a value stored beside a row reference
74
+ * stays true only while the row still holds the occupant it was written against. Anything that
75
+ * outlives a frame — a cut kept between frames is the case this is for — stores the generation
76
+ * it saw and compares, which is one equality and no clock. A frame number would need an
77
+ * ordering argument instead, and would still not separate two installs inside one frame.
78
+ */
79
+ GENERATION: 9,
61
80
  };
@@ -1 +1 @@
1
- {"version":3,"file":"VGEO_PAGE_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,kCAFU,MAAM,CAEqB"}
1
+ {"version":3,"file":"VGEO_PAGE_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,kCAFU,MAAM,CAEsB"}
@@ -5,4 +5,4 @@
5
5
  * @copyright Company Named Limited (c) 2026
6
6
  * @type {number}
7
7
  */
8
- export const VGEO_PAGE_ROW_WORDS = 8;
8
+ export const VGEO_PAGE_ROW_WORDS = 10;
@@ -0,0 +1,5 @@
1
+ export namespace VGEO_PARENT_ROW_OFFSET {
2
+ let PAGE_INDEX: number;
3
+ let CLUSTER: number;
4
+ }
5
+ //# sourceMappingURL=VGEO_PARENT_ROW_OFFSET.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_PARENT_ROW_OFFSET.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Word offsets within one parent row.
3
+ *
4
+ * A group's parents are the clusters that would be drawn in its place if the camera pulled back, so
5
+ * the row names a cluster the way a cluster row names its child: a global page index, and an index
6
+ * within that page. What a coarsening kernel does with the pair is what the descent already does
7
+ * with `CHILD_PAGE_INDEX`/`CHILD_GROUP` — resolve the page through `vg_lookup`, then read the row.
8
+ *
9
+ * @author Alex Goldring
10
+ * @copyright Company Named Limited (c) 2026
11
+ */
12
+ export const VGEO_PARENT_ROW_OFFSET = {
13
+ /**
14
+ * The container page index holding this parent, resolved at install: `SAME_PAGE` has already
15
+ * become this page's own index, so a reader here never meets a sentinel.
16
+ */
17
+ PAGE_INDEX: 0,
18
+ /**
19
+ * Cluster index within that page.
20
+ */
21
+ CLUSTER: 1,
22
+ };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Words in one parent row — the arena's copy of a group-parent entry (`VGEO_FORMAT.md` §6.3).
3
+ *
4
+ * Two, where the file's entry is one word, because the file's `parent_ref` indexes a per-page table
5
+ * and the arena's does not: an install resolves it to a **global container page index**, exactly as
6
+ * it resolves `child_ref`, so the kernel's lookup path is the same in both directions and there is
7
+ * no `SAME_PAGE` branch in the shader.
8
+ *
9
+ * @author Alex Goldring
10
+ * @copyright Company Named Limited (c) 2026
11
+ * @type {number}
12
+ */
13
+ export const VGEO_PARENT_ROW_WORDS: number;
14
+ //# sourceMappingURL=VGEO_PARENT_ROW_WORDS.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_PARENT_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,oCAFU,MAAM,CAEuB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Words in one parent row — the arena's copy of a group-parent entry (`VGEO_FORMAT.md` §6.3).
3
+ *
4
+ * Two, where the file's entry is one word, because the file's `parent_ref` indexes a per-page table
5
+ * and the arena's does not: an install resolves it to a **global container page index**, exactly as
6
+ * it resolves `child_ref`, so the kernel's lookup path is the same in both directions and there is
7
+ * no `SAME_PAGE` branch in the shader.
8
+ *
9
+ * @author Alex Goldring
10
+ * @copyright Company Named Limited (c) 2026
11
+ * @type {number}
12
+ */
13
+ export const VGEO_PARENT_ROW_WORDS = 2;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Set in a queue item's `target` when it names an entry of a page's parent rows — one step of a
3
+ * walk *up* — rather than a node to descend or a group to evaluate.
4
+ *
5
+ * It is its own item kind rather than a page visit produced directly because of the claim. A page
6
+ * visit carries the promise that its producer already claimed the page, and a group with several
7
+ * parents produces several of them at once: the producer would have to claim each, count only the
8
+ * ones it won, and then hand any lane of the wave a rule for building the k-th *won* page out of
9
+ * five numbers. One extra hop costs a queue round trip on a path that moves under one entry a frame
10
+ * (CUT_PLAN_2026_09_14 §6.7) and keeps the claim exactly where every other page visit puts it.
11
+ *
12
+ * @author Alex Goldring
13
+ * @copyright Company Named Limited (c) 2026
14
+ * @type {number}
15
+ */
16
+ export const VGEO_QUEUE_TARGET_PARENT_BIT: number;
17
+ //# sourceMappingURL=VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_QUEUE_TARGET_PARENT_BIT.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,2CAFU,MAAM,CAEuC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Set in a queue item's `target` when it names an entry of a page's parent rows — one step of a
3
+ * walk *up* — rather than a node to descend or a group to evaluate.
4
+ *
5
+ * It is its own item kind rather than a page visit produced directly because of the claim. A page
6
+ * visit carries the promise that its producer already claimed the page, and a group with several
7
+ * parents produces several of them at once: the producer would have to claim each, count only the
8
+ * ones it won, and then hand any lane of the wave a rule for building the k-th *won* page out of
9
+ * five numbers. One extra hop costs a queue round trip on a path that moves under one entry a frame
10
+ * (CUT_PLAN_2026_09_14 §6.7) and keeps the claim exactly where every other page visit puts it.
11
+ *
12
+ * @author Alex Goldring
13
+ * @copyright Company Named Limited (c) 2026
14
+ * @type {number}
15
+ */
16
+ export const VGEO_QUEUE_TARGET_PARENT_BIT = 0x40000000;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Spawn one page-fetch worker.
3
+ *
4
+ * The `new Worker(new URL(..., import.meta.url), { type: "module" })` form is what the consumer's
5
+ * bundler detects and what vite serves as-is, and it lives in a module no spec imports, because
6
+ * `import.meta` is a parse error under a CommonJS transform — the same arrangement
7
+ * `makeClothWorker` keeps for the same reason.
8
+ *
9
+ * @returns {Worker}
10
+ *
11
+ * @author Alex Goldring
12
+ * @copyright Company Named Limited (c) 2026
13
+ */
14
+ export function make_vgeo_page_worker(): Worker;
15
+ //# sourceMappingURL=make_vgeo_page_worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make_vgeo_page_worker.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,yCALa,MAAM,CAOlB"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Spawn one page-fetch worker.
3
+ *
4
+ * The `new Worker(new URL(..., import.meta.url), { type: "module" })` form is what the consumer's
5
+ * bundler detects and what vite serves as-is, and it lives in a module no spec imports, because
6
+ * `import.meta` is a parse error under a CommonJS transform — the same arrangement
7
+ * `makeClothWorker` keeps for the same reason.
8
+ *
9
+ * @returns {Worker}
10
+ *
11
+ * @author Alex Goldring
12
+ * @copyright Company Named Limited (c) 2026
13
+ */
14
+ export function make_vgeo_page_worker() {
15
+ return new Worker(new URL("./vgeo_page.worker.js", import.meta.url), { type: "module" });
16
+ }