@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
@@ -33,7 +33,7 @@ accepted-and-waiting one.
33
33
  - **Cluster-count simplification target** `[M §2.2]`, and a minimum cluster fill through the
34
34
  generalized leaf repack `[V §3.3]`.
35
35
  - **Compactness-weighted cluster adjacency** `[M §2.3]` — `compactness()` in
36
- `build/vgeo_build_levels.js`.
36
+ `build/level/vgeo_build_levels.js`.
37
37
  - **Speculative groups, rejected individually** `[M §2.4]`.
38
38
  - **Per-level summary table in the file head** `[V §4.1, §6.1]` — VGEO_FORMAT §4.1.
39
39
  - **A traversal metric on the page DAG, and a group tree inside each page** `[V §2.1, §6.3]` —
@@ -72,12 +72,13 @@ accepted-and-waiting one.
72
72
  362 non-root groups have split parents: 355 of 576 camera positions double-drew, up to 10.7%
73
73
  of drawn triangles, before. Zero after. It reads as corrupt geometry rather than as a missing
74
74
  page, which is why the tool that found it could not name it.
75
- - **A CPU cut against a partially resident container** — `playground/vgeo_viewer/`.
76
- `select_cut.js` is the runtime's rule rather than a debug approximation of it; the viewer is
77
- what makes clamping, streaming and eviction watchable, and `__state()` is what makes it
78
- assertable from a headless browser. It draws through Shade's direct geometry path, not the
79
- meshlet pipeline — so it proves the DAG and the format, and proves nothing about the engine
80
- seam.
75
+ - **A CPU cut against a partially resident container** —
76
+ `runtime/cut/__fixtures__/vgeo_select_cut.js`. It is the runtime's rule rather than a debug
77
+ approximation of it, and `vgeo_select_cut.spec.js` holds it to the format's guarantees. A
78
+ `vgeo_viewer` playground used to draw it on screen through Shade's direct geometry path, which is
79
+ what made clamping, streaming and eviction watchable; once `playground/vgeo_runtime/` could show
80
+ all of that through the meshlet pipeline, the page was a second renderer and a second streaming
81
+ loop for no gain, and it was retired. The traversal stayed, because it is the oracle.
81
82
 
82
83
  - **The GPU runtime** — `runtime/`, and [runtime/RUNTIME_PLAN.md](./runtime/RUNTIME_PLAN.md) for the
83
84
  design and the adversarial review that reshaped it. The cut is a wavefront BFS over the page DAG
@@ -95,7 +96,7 @@ accepted-and-waiting one.
95
96
  evaluator does not. §6 states the fact without stating it as a term of the rule, because §4 was
96
97
  written for a traversal.
97
98
  - **Page size decides whether that state is even reachable.** At the 8 KB pages
98
- `select_cut.spec.js` uses, a torus puts exactly one group in every page — so a blocked group is
99
+ `vgeo_select_cut.spec.js` uses, a torus puts exactly one group in every page — so a blocked group is
99
100
  a blocked page, no page is ever mixed, and no page is ever entered twice. Measured: 40 pages
100
101
  withheld one at a time and 60 random residency subsets produced *no* mixed page. At 64 KB the
101
102
  median page holds eight groups and it is ordinary. A spec for anything about mixed selectability
@@ -120,7 +121,7 @@ prefetch.
120
121
  ### 2.1 A partitioning fallback for when METIS fails `[M §3.3]`, `[V §3.2]` — LANDED
121
122
 
122
123
  `core/graph/graph_partition_spectral.js` — recursive spectral bisection over CSR, matrix-free,
123
- signature-compatible with `metis_partition_kway`. `build/vgeo_partition_graph.js` tries METIS
124
+ signature-compatible with `metis_partition_kway`. `build/partition/vgeo_partition_graph.js` tries METIS
124
125
  and falls back to it; both of the builder's partitioning sites go through that wrapper.
125
126
 
126
127
  Notes worth keeping:
@@ -212,7 +213,7 @@ installed page can be re-tested without walking back to its parent.
212
213
  width at the top. This one has *no* paging question by construction: it is inside a page, it
213
214
  ships and evicts with it, and it cannot dangle.
214
215
 
215
- Both landed together; VGEO_FORMAT §6.1–6.2 specifies them, `build/vgeo_build_page_nodes.js`
216
+ Both landed together; VGEO_FORMAT §6.1–6.2 specifies them, `build/page/vgeo_build_page_nodes.js`
216
217
  builds them. Notes worth keeping:
217
218
 
218
219
  - The tree needs no partitioner. A page's groups arrive in Morton order of their centroid, so
@@ -243,7 +244,7 @@ for the first few bands, which are also the cheapest to walk.
243
244
  LOD-metric sphere and error range (VGEO_FORMAT §5, §6.2), and every page carries a fanout-4 tree
244
245
  over its own groups (§6.1). The writer emits them, `vgeo_validate_container` checks them
245
246
  (§11.10–11.11) with corruption tests behind both checks, and **nothing reads either**.
246
- `VGeoPage` records `node_count` and stops; `select_cut.js` descends group by group.
247
+ `VGeoPage` records `node_count` and stops; `vgeo_select_cut` descends group by group.
247
248
 
248
249
  This is not a defect to fix on its own account. Building a consumer for its own sake would fix
249
250
  the interface before the pass that has to live with it, and the CPU traversal does not need the
@@ -339,9 +340,11 @@ several cuts per frame for exactly this reason.
339
340
 
340
341
  So the plan is **a cut per view**, with the setup shared rather than the result: the traversal
341
342
  kernel, the residency state, and the page working set are all view-independent, and only the
342
- projection and threshold differ. And where a view does not justify a cut at all — a distant
343
- cascade, a low-resolution reflection — it should be able to take a proxy (§3.2) instead. That
344
- choice belongs to the view, not to the geometry.
343
+ projection and threshold differ. That half is built — a cut runs per expansion site per view, and
344
+ what it costs is measured in CUT_PLAN_2026_09_14 §0, which also plans to keep each view's cut
345
+ between frames rather than re-walking it from the root. And where a view does not justify a cut
346
+ at all — a distant cascade, a low-resolution reflection — it should be able to take a proxy
347
+ (§3.2) instead. That choice belongs to the view, not to the geometry.
345
348
 
346
349
  ### 3.4 GPU-driven allocation `[V §4.3]`
347
350
 
@@ -17,6 +17,24 @@ export class VGeoBuildOptions {
17
17
  * @type {number}
18
18
  */
19
19
  codec: number;
20
+ /**
21
+ * How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
22
+ * top of the reference's hash-chain levels.
23
+ *
24
+ * **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
25
+ * container built at any of them reads in every build of the reader that exists; the level is
26
+ * how long the *encoder* spent, and that is all.
27
+ *
28
+ * Nine rather than twelve because the ladder above it is not worth its time on this payload:
29
+ * measured over 2,718 real pages, the whole run from 3 to 12 is 0.077 percentage points of
30
+ * ratio, and 10 to 12 cost 15-40% more time for the last thousandth of it. Nine rather than
31
+ * three for the same reason in the other direction — it is 0.077 points smaller for about 5%
32
+ * more time. Nine rather than one because the fast encoder gives up 2.5% of every page to save
33
+ * compression time that is a couple of percent of a build.
34
+ *
35
+ * @type {number}
36
+ */
37
+ codec_level: number;
20
38
  /**
21
39
  * How close two source vertices have to be to count as one point, as a fraction of the
22
40
  * geometry's own bounding-box diagonal. **Leave it alone.** It is the one knob here that can
@@ -68,5 +86,5 @@ export class VGeoBuildOptions {
68
86
  */
69
87
  level_options: VGeoLevelOptions;
70
88
  }
71
- import { VGeoLevelOptions } from "./VGeoLevelOptions.js";
89
+ import { VGeoLevelOptions } from "./level/VGeoLevelOptions.js";
72
90
  //# sourceMappingURL=VGeoBuildOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VGeoBuildOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH;IACI;;;;;;;;;;OAUG;IACH,OAFU,MAAM,CAEO;IAEvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,YAFU,MAAM,CAEE;IAElB;;;;;;;;;;;;;;OAcG;IACH,mBAFU,MAAM,CAE2B;IAE3C;;OAEG;IACH,eAFU,gBAAgB,CAEa;CAC1C;iCA1EgC,uBAAuB"}
1
+ {"version":3,"file":"VGeoBuildOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH;IACI;;;;;;;;;;OAUG;IACH,OAFU,MAAM,CAEO;IAEvB;;;;;;;;;;;;;;;;OAgBG;IACH,aAFU,MAAM,CAEmB;IAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,YAFU,MAAM,CAEE;IAElB;;;;;;;;;;;;;;OAcG;IACH,mBAFU,MAAM,CAE2B;IAE3C;;OAEG;IACH,eAFU,gBAAgB,CAEa;CAC1C;iCA7FgC,6BAA6B"}
@@ -1,6 +1,7 @@
1
+ import { LZ4_LEVEL } from "../../../../../core/binary/lz4/LZ4_LEVEL.js";
1
2
  import { VGEO_CODEC_LZ4 } from "../format/frame/VGEO_CODEC_LZ4.js";
2
3
  import { VGEO_DEFAULT_PAGE_SIZE } from "../format/page/VGEO_DEFAULT_PAGE_SIZE.js";
3
- import { VGeoLevelOptions } from "./VGeoLevelOptions.js";
4
+ import { VGeoLevelOptions } from "./level/VGeoLevelOptions.js";
4
5
 
5
6
  /**
6
7
  * Knobs the builder pipeline exposes.
@@ -22,6 +23,25 @@ export class VGeoBuildOptions {
22
23
  */
23
24
  codec = VGEO_CODEC_LZ4;
24
25
 
26
+ /**
27
+ * How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
28
+ * top of the reference's hash-chain levels.
29
+ *
30
+ * **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
31
+ * container built at any of them reads in every build of the reader that exists; the level is
32
+ * how long the *encoder* spent, and that is all.
33
+ *
34
+ * Nine rather than twelve because the ladder above it is not worth its time on this payload:
35
+ * measured over 2,718 real pages, the whole run from 3 to 12 is 0.077 percentage points of
36
+ * ratio, and 10 to 12 cost 15-40% more time for the last thousandth of it. Nine rather than
37
+ * three for the same reason in the other direction — it is 0.077 points smaller for about 5%
38
+ * more time. Nine rather than one because the fast encoder gives up 2.5% of every page to save
39
+ * compression time that is a couple of percent of a build.
40
+ *
41
+ * @type {number}
42
+ */
43
+ codec_level = LZ4_LEVEL.HC_DEFAULT;
44
+
25
45
  /**
26
46
  * How close two source vertices have to be to count as one point, as a fraction of the
27
47
  * geometry's own bounding-box diagonal. **Leave it alone.** It is the one knob here that can
@@ -1 +1 @@
1
- {"version":3,"file":"gltf_open_document.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js"],"names":[],"mappings":"AA6EA;;;;;;;;;;GAUG;AACH,8CARW,cAAc,yBACL,MAAM,KAAG,cAAc,4CAK9B,YAAY,CA+ExB;+BA1J8B,qBAAqB;6BACvB,mBAAmB"}
1
+ {"version":3,"file":"gltf_open_document.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js"],"names":[],"mappings":"AAyEA;;;;;;;;;;GAUG;AACH,8CARW,cAAc,yBACL,MAAM,KAAG,cAAc,4CAK9B,YAAY,CA+ExB;+BArJ8B,qBAAqB;6BACvB,mBAAmB"}
@@ -1,4 +1,5 @@
1
1
  import { assert } from "../../../../../../core/assert.js";
2
+ import { Base64 } from "../../../../../../core/binary/base64/Base64.js";
2
3
  import {
3
4
  GLTF_BUFFER_VIEW_EXTENSIONS
4
5
  } from "../../../../../../format/scene/gltf/ext/gltf_buffer_view_extensions.js";
@@ -26,6 +27,9 @@ import { GltfDocument } from "./GltfDocument.js";
26
27
  /**
27
28
  * Decode a `data:` URI's payload.
28
29
  *
30
+ * Through {@link Base64} rather than `atob`: the decode is the engine's own, so the builder runs
31
+ * the same one everywhere and does not need a `atob` to exist on whatever it is running under.
32
+ *
29
33
  * @param {string} uri
30
34
  * @returns {Uint8Array}
31
35
  * @throws {Error} for an encoding other than base64, which is the only one glTF defines
@@ -39,15 +43,7 @@ function read_data_uri(uri) {
39
43
  throw new Error(`unsupported data URI encoding in '${header}'`);
40
44
  }
41
45
 
42
- const binary = atob(uri.slice(comma + 1));
43
-
44
- const result = new Uint8Array(binary.length);
45
-
46
- for (let i = 0; i < binary.length; i++) {
47
- result[i] = binary.charCodeAt(i);
48
- }
49
-
50
- return result;
46
+ return new Uint8Array(Base64.decode(uri.slice(comma + 1)));
51
47
  }
52
48
 
53
49
  /**
@@ -0,0 +1,32 @@
1
+ /**
2
+ * One band of the DAG.
3
+ *
4
+ * A level is an ordinal, not a generation: `clusters` are the clusters the round of that index
5
+ * created, while `groups` are the groups the round *above* consumed — and those groups may hold
6
+ * clusters from any level at or below their own, because a cluster no round could use waits in the
7
+ * frontier until one can. What the ordinal guarantees is the only thing the format needs from it:
8
+ * every group sits strictly below the group holding its parents, so laying pages out by descending
9
+ * level makes every child reference point forward in the file.
10
+ *
11
+ * @author Alex Goldring
12
+ * @copyright Company Named Limited (c) 2026
13
+ */
14
+ export class VGeoLevel {
15
+ /**
16
+ * `0` = leaves.
17
+ * @type {number}
18
+ */
19
+ index: number;
20
+ /**
21
+ * The clusters this level's round created.
22
+ * @type {VirtualGeometryCluster[]}
23
+ */
24
+ clusters: VirtualGeometryCluster[];
25
+ /**
26
+ * The groups that sit in this level's band — the ones the round above consumed. Empty for the
27
+ * top level until the caller assigns its root group.
28
+ * @type {VirtualGeometryGroup[]}
29
+ */
30
+ groups: VirtualGeometryGroup[];
31
+ }
32
+ //# sourceMappingURL=VGeoLevel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGeoLevel.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/VGeoLevel.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,UAFU,wBAAwB,CAEpB;IAEd;;;;OAIG;IACH,QAFU,sBAAsB,CAEpB;CACf"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * How the round loop of {@link vgeo_build_levels} is allowed to behave.
3
+ *
4
+ * @author Alex Goldring
5
+ * @copyright Company Named Limited (c) 2026
6
+ */
7
+ export class VGeoLevelOptions {
8
+ /**
9
+ * Clusters a group starts out holding. Grows when a round fails to make progress — small groups
10
+ * starve the simplifier (the locked perimeter dominates), large ones lock a big spatial
11
+ * footprint into LOD lockstep.
12
+ * @type {number}
13
+ */
14
+ group_size: number;
15
+ /**
16
+ * Fraction of a group's *clusters* the step above it should come to. The design's halving,
17
+ * stated as the thing the DAG is actually for.
18
+ *
19
+ * A triangle ratio is a means and this is the end, and asking directly is what keeps parents
20
+ * full: the simplifier is given the triangle count that many clusters hold, rather than half of
21
+ * whatever the children happened to contain. Where the children are already full the two are the
22
+ * same number. Where they are not, this asks for less destruction, because the reduction is
23
+ * available from packing the geometry better instead.
24
+ * @type {number}
25
+ */
26
+ simplification_ratio: number;
27
+ /**
28
+ * How much error a single round is allowed to span, as a multiple of the band's floor. `1` would
29
+ * admit only the exact minimum and turn every distinct error value into its own round; a large
30
+ * value admits the whole frontier every time and is the level sweep this replaced.
31
+ *
32
+ * Four, measured. On a 98k-triangle sphere against a full sweep: 31% fewer clusters merged into
33
+ * groups more than twice as coarse as themselves, and 8% fewer at four times, for one extra
34
+ * level. Two is tighter on the first count — 41% fewer — but costs fourteen levels, and every
35
+ * level is a page band and a dependent fetch on the way down.
36
+ * @type {number}
37
+ */
38
+ error_band_growth: number;
39
+ /**
40
+ * Least share of the frontier a round is allowed to work on, whatever the octave says.
41
+ *
42
+ * The octave alone offers no guarantee of progress: geometry whose error is spread thinly and
43
+ * continuously — a UV sphere, whose poles carry triangles a fraction of the size of its
44
+ * equator's — puts only a handful of clusters in any one octave, and the build inches forward a
45
+ * few merges per round. That is not merely slow, it is unbounded: `level_count` is a u8, and a
46
+ * round loop whose count scales with the cluster count rather than its logarithm will run out of
47
+ * levels on a real asset. Widening the band until it holds a fixed share of the frontier bounds
48
+ * the depth logarithmically, and costs error uniformity only where the octave had nothing.
49
+ * @type {number}
50
+ */
51
+ error_band_min_fraction: number;
52
+ /**
53
+ * Refuse to build past this many levels. `level_count` is a u8 in the container, and a build
54
+ * that has not converged by then has something else wrong with it.
55
+ * @type {number}
56
+ */
57
+ max_levels: number;
58
+ }
59
+ //# sourceMappingURL=VGeoLevelOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGeoLevelOptions.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH;IACI;;;;;OAKG;IACH,YAFU,MAAM,CAED;IAEf;;;;;;;;;;OAUG;IACH,sBAFU,MAAM,CAEW;IAE3B;;;;;;;;;;OAUG;IACH,mBAFU,MAAM,CAEM;IAEtB;;;;;;;;;;;OAWG;IACH,yBAFU,MAAM,CAEe;IAE/B;;;;OAIG;IACH,YAFU,MAAM,CAEC;CACpB"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * What one band of the DAG came to.
3
+ *
4
+ * The counts are not a frontier size and do not have to fall monotonically: `cluster_count` is what
5
+ * the round of this index *created*, and a round merges a band of comparable error rather than the
6
+ * whole frontier, so a later round can produce fewer clusters than an earlier one — or more, when it
7
+ * finally reaches geometry that had been waiting.
8
+ *
9
+ * @author Alex Goldring
10
+ * @copyright Company Named Limited (c) 2026
11
+ */
12
+ export class VGeoLevelSummary {
13
+ level: number;
14
+ /**
15
+ * Clusters the round of this index created.
16
+ * @type {number}
17
+ */
18
+ cluster_count: number;
19
+ /**
20
+ * Groups sitting in this band — the ones the round above consumed.
21
+ * @type {number}
22
+ */
23
+ group_count: number;
24
+ triangle_count: number;
25
+ vertex_count: number;
26
+ /**
27
+ * Smallest object-space `r_e` any cluster of this level carries.
28
+ * @type {number}
29
+ */
30
+ min_error: number;
31
+ /**
32
+ * Largest object-space `r_e` any cluster of this level carries. The root's is the ceiling for
33
+ * the whole asset; between two levels there is no ordering, for the same reason the counts have
34
+ * none.
35
+ * @type {number}
36
+ */
37
+ max_error: number;
38
+ /**
39
+ * Largest LOD-metric sphere radius at this level.
40
+ * @type {number}
41
+ */
42
+ max_sphere_radius: number;
43
+ }
44
+ //# sourceMappingURL=VGeoLevelSummary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGeoLevelSummary.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH;IACI,cAAU;IAEV;;;OAGG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB,uBAAmB;IACnB,qBAAiB;IAEjB;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;;;OAKG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,mBAFU,MAAM,CAEM;CACzB"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Build the whole DAG, from a source mesh to a single root.
3
+ *
4
+ * @param {VirtualGeometryMesh} mesh the normalized source; consumed, not copied
5
+ * @param {VGeoLevelOptions} options
6
+ * @returns {VGeoLevel[]} leaves first; the last level holds exactly one cluster, the root
7
+ */
8
+ export function vgeo_build_levels(mesh: VirtualGeometryMesh, options: VGeoLevelOptions): VGeoLevel[];
9
+ /**
10
+ * One cluster's geometry expressed against the frontier it came out of, which is what lets the next
11
+ * frontier be stitched from a mixture of freshly simplified clusters and untouched ones.
12
+ */
13
+ export type VGeoContribution = {
14
+ positions: Float32Array;
15
+ /**
16
+ * local to {@link positions }
17
+ */
18
+ indices: Uint32Array;
19
+ /**
20
+ * ids in the mesh {@link topology } belongs to
21
+ */
22
+ local_vertex_ids: Uint32Array;
23
+ /**
24
+ * the same vertices, named in the frontier's mesh
25
+ */
26
+ source_vertex_ids: Uint32Array;
27
+ /**
28
+ * the mesh {@link local_vertex_ids } name vertices of, whose
29
+ * vertex data block holds their attributes
30
+ */
31
+ topology: BinaryTopology;
32
+ };
33
+ import { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
34
+ import { VGeoLevel } from "./VGeoLevel.js";
35
+ import { BinaryTopology } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
36
+ //# sourceMappingURL=vgeo_build_levels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_build_levels.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js"],"names":[],"mappings":"AAqiDA;;;;;;GAMG;AACH,wCAJW,mBAAmB,8BAEjB,SAAS,EAAE,CA6KvB;;;;;;eAtgDa,YAAY;;;;aACZ,WAAW;;;;sBACX,WAAW;;;;uBACX,WAAW;;;;;cACX,cAAc;;oCA5KQ,gCAAgC;0BAD1C,gBAAgB;+BAjCI,yEAAyE"}
@@ -1,45 +1,45 @@
1
- import { assert } from "../../../../../core/assert.js";
2
- import { aabb3_from_v3_array } from "../../../../../core/geom/3d/aabb/aabb3_from_v3_array.js";
3
- import { v3_morton_encode_bounded } from "../../../../../core/geom/3d/morton/v3_morton_encode_bounded.js";
4
- import { Quadric3 } from "../../../../../core/geom/3d/quadric/Quadric3.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
+ import { aabb3_from_v3_array } from "../../../../../../core/geom/3d/aabb/aabb3_from_v3_array.js";
3
+ import { v3_morton_encode_bounded } from "../../../../../../core/geom/3d/morton/v3_morton_encode_bounded.js";
4
+ import { Quadric3 } from "../../../../../../core/geom/3d/quadric/Quadric3.js";
5
5
  import {
6
6
  sphere_compute_bounding_of_2_spheres
7
- } from "../../../../../core/geom/3d/sphere/sphere_compute_bounding_of_2_spheres.js";
8
- import { BinaryTopology, NULL_POINTER, } from "../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
7
+ } from "../../../../../../core/geom/3d/sphere/sphere_compute_bounding_of_2_spheres.js";
8
+ import { BinaryTopology, NULL_POINTER, } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
9
9
  import {
10
10
  bt_mesh_compute_vertex_quadrics
11
- } from "../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js";
11
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js";
12
12
  import {
13
13
  bt_mesh_from_indexed_geometry
14
- } from "../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
14
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
15
15
  import {
16
16
  bt_mesh_simplify_with_quadrics
17
- } from "../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js";
18
- import { bt_edge_get } from "../../../../../core/geom/3d/topology/struct/binary/query/bt_edge_get.js";
19
- import { bt_mesh_validate } from "../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js";
20
- import { bt_mesh_build_face_graph } from "../../../../../core/graph/metis/bt_mesh_build_face_graph.js";
21
- import { vgeo_encode_cluster_payload } from "../format/payload/vgeo_encode_cluster_payload.js";
22
- import { vgeo_layers_copy_vertex } from "../format/attribute/vgeo_layers_copy_vertex.js";
23
- import { vgeo_layers_like } from "../format/attribute/vgeo_layers_like.js";
24
- import { VGEO_MAX_CLUSTER_TRIANGLE_COUNT } from "../format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js";
25
- import { VGEO_MAX_CLUSTER_VERTEX_COUNT } from "../format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js";
26
- import { VGEO_MAX_GROUP_CLUSTER_COUNT } from "../format/page/VGEO_MAX_GROUP_CLUSTER_COUNT.js";
27
- import { VirtualGeometryCluster } from "../format/dag/VirtualGeometryCluster.js";
28
- import { VirtualGeometryGroup } from "../format/dag/VirtualGeometryGroup.js";
29
- import { vgeo_bounding_sphere } from "./vgeo_bounding_sphere.js";
30
- import { vgeo_compute_vertex_normals } from "./vgeo_compute_vertex_normals.js";
31
- import { vgeo_compute_vertex_tangents } from "./vgeo_compute_vertex_tangents.js";
32
- import { vgeo_containing_sphere } from "./vgeo_containing_sphere.js";
33
- import { vgeo_extract_submesh } from "./vgeo_extract_submesh.js";
34
- import { vgeo_gather_faces } from "./vgeo_gather_faces.js";
35
- import { vgeo_graph_components } from "./vgeo_graph_components.js";
36
- import { vgeo_narrow_indices } from "./vgeo_narrow_indices.js";
37
- import { vgeo_partition_graph } from "./vgeo_partition_graph.js";
38
- import { vgeo_split_face_set } from "./vgeo_split_face_set.js";
39
- import { vgeo_split_face_set_packed } from "./vgeo_split_face_set_packed.js";
40
- import { VGeoFaceGraph } from "./VGeoFaceGraph.js";
17
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js";
18
+ import { bt_edge_get } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_edge_get.js";
19
+ import { bt_mesh_validate } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js";
20
+ import { bt_mesh_build_face_graph } from "../../../../../../core/graph/metis/bt_mesh_build_face_graph.js";
21
+ import { vgeo_encode_cluster_payload } from "../../format/payload/vgeo_encode_cluster_payload.js";
22
+ import { vgeo_layers_copy_vertex } from "../../format/attribute/vgeo_layers_copy_vertex.js";
23
+ import { vgeo_layers_like } from "../../format/attribute/vgeo_layers_like.js";
24
+ import { VGEO_MAX_CLUSTER_TRIANGLE_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js";
25
+ import { VGEO_MAX_CLUSTER_VERTEX_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js";
26
+ import { VGEO_MAX_GROUP_CLUSTER_COUNT } from "../../format/page/VGEO_MAX_GROUP_CLUSTER_COUNT.js";
27
+ import { VirtualGeometryCluster } from "../../format/dag/VirtualGeometryCluster.js";
28
+ import { VirtualGeometryGroup } from "../../format/dag/VirtualGeometryGroup.js";
29
+ import { vgeo_bounding_sphere } from "../sphere/vgeo_bounding_sphere.js";
30
+ import { vgeo_compute_vertex_normals } from "../mesh/vgeo_compute_vertex_normals.js";
31
+ import { vgeo_compute_vertex_tangents } from "../mesh/vgeo_compute_vertex_tangents.js";
32
+ import { vgeo_containing_sphere } from "../sphere/vgeo_containing_sphere.js";
33
+ import { vgeo_extract_submesh } from "../submesh/vgeo_extract_submesh.js";
34
+ import { vgeo_gather_faces } from "../submesh/vgeo_gather_faces.js";
35
+ import { vgeo_graph_components } from "../partition/vgeo_graph_components.js";
36
+ import { vgeo_narrow_indices } from "../submesh/vgeo_narrow_indices.js";
37
+ import { vgeo_partition_subgraph } from "../partition/vgeo_partition_subgraph.js";
38
+ import { vgeo_split_face_set } from "../partition/vgeo_split_face_set.js";
39
+ import { vgeo_split_face_set_packed } from "../partition/vgeo_split_face_set_packed.js";
40
+ import { VGeoFaceGraph } from "../partition/VGeoFaceGraph.js";
41
41
  import { VGeoLevel } from "./VGeoLevel.js";
42
- import { VirtualGeometryMesh } from "./VirtualGeometryMesh.js";
42
+ import { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
43
43
 
44
44
  /**
45
45
  * Build the cluster DAG: leaves out of the source mesh, then merge steps until one cluster is left.
@@ -434,30 +434,32 @@ function bundle_loose_clusters(frontier, loose, group_size) {
434
434
  return [];
435
435
  }
436
436
 
437
- const bounds = new Float32Array([
438
- Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY,
439
- Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY,
440
- ]);
437
+ // Gathered rather than read through the cluster list twice: the bounds and the codes are the
438
+ // same points, and this is the shape `vgeo_split_face_set_packed` already packs in.
439
+ const centres = new Float32Array(loose.length * 3);
441
440
 
442
- for (const cluster of loose) {
443
- const centre = frontier.clusters[cluster].bounds_sphere;
441
+ loose.forEach((cluster, index) => {
442
+ const sphere = frontier.clusters[cluster].bounds_sphere;
444
443
 
445
- for (let axis = 0; axis < 3; axis++) {
446
- bounds[axis] = Math.min(bounds[axis], centre[axis]);
447
- bounds[axis + 3] = Math.max(bounds[axis + 3], centre[axis]);
448
- }
449
- }
444
+ centres[index * 3] = sphere[0];
445
+ centres[index * 3 + 1] = sphere[1];
446
+ centres[index * 3 + 2] = sphere[2];
447
+ });
448
+
449
+ const bounds = new Float32Array(6);
450
+
451
+ aabb3_from_v3_array(bounds, centres, centres.length);
450
452
 
451
453
  /**
452
454
  * @type {Map<number, number>}
453
455
  */
454
456
  const codes = new Map();
455
457
 
456
- for (const cluster of loose) {
457
- const centre = frontier.clusters[cluster].bounds_sphere;
458
-
459
- codes.set(cluster, v3_morton_encode_bounded(centre[0], centre[1], centre[2], bounds));
460
- }
458
+ loose.forEach((cluster, index) => {
459
+ codes.set(cluster, v3_morton_encode_bounded(
460
+ centres[index * 3], centres[index * 3 + 1], centres[index * 3 + 2], bounds
461
+ ));
462
+ });
461
463
 
462
464
  const order = loose.slice();
463
465
 
@@ -621,6 +623,14 @@ function absorb_singleton_pieces(pieces, cluster_graph) {
621
623
  function partition_into_groups(frontier, band, cluster_graph, group_size) {
622
624
  const membership = new Int32Array(frontier.clusters.length).fill(-1);
623
625
 
626
+ /**
627
+ * Dense rather than a `Map`, and hoisted out of the component loop so it is one allocation per
628
+ * level. See {@link vgeo_partition_subgraph} for why the density is load-bearing rather than a
629
+ * micro-optimisation.
630
+ * @type {Uint32Array}
631
+ */
632
+ const local_index = new Uint32Array(frontier.clusters.length);
633
+
624
634
  for (const cluster of band) {
625
635
  membership[cluster] = 0;
626
636
  }
@@ -692,55 +702,11 @@ function partition_into_groups(frontier, band, cluster_graph, group_size) {
692
702
  membership[cluster] = token;
693
703
  }
694
704
 
695
- const local_index = new Map();
696
-
697
- component.forEach((cluster, index) => local_index.set(cluster, index));
698
-
699
- const local_addresses = new Uint32Array(component.length + 1);
700
- const local_adjacency = [];
701
- const local_weights = [];
702
-
703
- component.forEach((cluster, index) => {
704
- local_addresses[index] = local_adjacency.length;
705
-
706
- for (let i = cluster_graph.edge_addresses[cluster]; i < cluster_graph.edge_addresses[cluster + 1]; i++) {
707
- const other = cluster_graph.adjacency[i];
708
-
709
- if (membership[other] !== token) {
710
- continue;
711
- }
712
-
713
- local_adjacency.push(local_index.get(other));
714
- local_weights.push(cluster_graph.edge_weights[i]);
715
- }
716
- });
717
-
718
- local_addresses[component.length] = local_adjacency.length;
719
-
720
- const assignment = vgeo_partition_graph(
721
- component.length,
722
- part_count,
723
- local_addresses,
724
- Uint32Array.from(local_adjacency),
725
- Float32Array.from(local_weights),
726
- GROUP_SEED
705
+ const parts = vgeo_partition_subgraph(
706
+ cluster_graph, component, membership, token, part_count, GROUP_SEED, local_index
727
707
  );
728
708
 
729
- const parts = [];
730
-
731
- for (let i = 0; i < part_count; i++) {
732
- parts.push([]);
733
- }
734
-
735
- component.forEach((cluster, index) => {
736
- parts[assignment[index]].push(cluster);
737
- });
738
-
739
709
  for (const part of parts) {
740
- if (part.length === 0) {
741
- continue;
742
- }
743
-
744
710
  token++;
745
711
 
746
712
  for (const cluster of part) {
@@ -0,0 +1,19 @@
1
+ /**
2
+ * The root cluster has no simplification step above it, so nothing grouped it, and the format still
3
+ * wants every cluster in exactly one group. It gets a group of its own: the always-selectable entry
4
+ * point the runtime starts its cut from.
5
+ *
6
+ * There is exactly one of these because the DAG has exactly one root — a build that ends with
7
+ * several parentless clusters has not finished, and bundling them into a synthetic group would only
8
+ * hide that (see `vgeo_build_levels`).
9
+ *
10
+ * @param {VirtualGeometryCluster} cluster the root
11
+ * @param {number} level
12
+ * @returns {VirtualGeometryGroup}
13
+ *
14
+ * @author Alex Goldring
15
+ * @copyright Company Named Limited (c) 2026
16
+ */
17
+ export function vgeo_build_root_group(cluster: VirtualGeometryCluster, level: number): VirtualGeometryGroup;
18
+ import { VirtualGeometryGroup } from "../../format/dag/VirtualGeometryGroup.js";
19
+ //# sourceMappingURL=vgeo_build_root_group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_build_root_group.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,8EANW,MAAM,GACJ,oBAAoB,CAYhC;qCAzBoC,0CAA0C"}
@@ -1,4 +1,4 @@
1
- import { VirtualGeometryGroup } from "../format/dag/VirtualGeometryGroup.js";
1
+ import { VirtualGeometryGroup } from "../../format/dag/VirtualGeometryGroup.js";
2
2
 
3
3
  /**
4
4
  * The root cluster has no simplification step above it, so nothing grouped it, and the format still