@woosh/meep-engine 3.26.0 → 3.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (449) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +542 -0
  4. package/src/core/binary/lz4/LZ4_LEVEL.d.ts +33 -0
  5. package/src/core/binary/lz4/LZ4_LEVEL.d.ts.map +1 -0
  6. package/src/core/binary/lz4/LZ4_LEVEL.js +32 -0
  7. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts +33 -0
  8. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts.map +1 -0
  9. package/src/core/binary/lz4/lz4_compress_block_at_level.js +47 -0
  10. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts +40 -0
  11. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts.map +1 -0
  12. package/src/core/binary/lz4/lz4_compress_block_hc.js +1382 -0
  13. package/src/core/binary/lz4/lz4_decompress_block.d.ts +2 -1
  14. package/src/core/binary/lz4/lz4_decompress_block.d.ts.map +1 -1
  15. package/src/core/binary/lz4/lz4_decompress_block.js +31 -6
  16. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts +15 -0
  17. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts.map +1 -0
  18. package/src/core/geom/3d/mat4/m4_linear_determinant.js +24 -0
  19. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts +4 -2
  20. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts.map +1 -1
  21. package/src/core/geom/3d/mat4/m4_normal_matrix3.js +21 -11
  22. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +14 -7
  23. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  24. package/src/core/geom/3d/shape/HeightMapShape3D.js +87 -78
  25. package/src/engine/Engine.d.ts.map +1 -1
  26. package/src/engine/Engine.js +38 -1
  27. package/src/engine/graphics3/GraphicsEngine.d.ts +5 -1
  28. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  29. package/src/engine/graphics3/GraphicsEngine.js +834 -830
  30. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  31. package/src/shade/RENDERER_CONTRACT.md +19 -10
  32. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
  33. package/src/shade/playground/vgeo_runtime/README.md +186 -27
  34. package/src/shade/playground/vgeo_runtime/index.html +112 -62
  35. package/src/shade/playground/vgeo_runtime/main.js +678 -88
  36. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +18 -0
  37. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
  38. package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +23 -5
  39. package/src/shade/playground/vgeo_scene/README.md +408 -0
  40. package/src/shade/playground/vgeo_scene/index.html +144 -0
  41. package/src/shade/playground/vgeo_scene/main.d.ts +2 -0
  42. package/src/shade/playground/vgeo_scene/main.d.ts.map +1 -0
  43. package/src/shade/playground/vgeo_scene/main.js +1716 -0
  44. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
  45. package/src/shade/renderer/Renderer.d.ts +4 -1
  46. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  47. package/src/shade/renderer/Renderer.js +5 -2
  48. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +1 -2
  49. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +11 -0
  50. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  51. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +16 -8
  52. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  53. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +16 -11
  54. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  55. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +3 -29
  56. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts +22 -0
  57. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts.map +1 -0
  58. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.js +49 -0
  59. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +77 -7
  60. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +36 -23
  61. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +17 -14
  62. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +19 -1
  63. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  64. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +21 -1
  65. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.d.ts.map +1 -1
  66. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +5 -9
  67. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts +32 -0
  68. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts.map +1 -0
  69. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +59 -0
  70. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
  71. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts +44 -0
  72. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
  73. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +36 -0
  74. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
  75. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_levels.js → level/vgeo_build_levels.js} +61 -95
  76. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts +19 -0
  77. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts.map +1 -0
  78. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.js → level/vgeo_build_root_group.js} +1 -1
  79. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +73 -0
  80. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -0
  81. package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.js → mesh/VirtualGeometryMesh.js} +7 -7
  82. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +29 -0
  83. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -0
  84. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_normals.js → mesh/vgeo_compute_vertex_normals.js} +3 -3
  85. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +31 -0
  86. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -0
  87. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.js → mesh/vgeo_compute_vertex_tangents.js} +5 -5
  88. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +46 -0
  89. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -0
  90. package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.js → mesh/vgeo_normalize_source.js} +9 -9
  91. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts +13 -0
  92. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts.map +1 -0
  93. package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.js → page/vgeo_assemble_pages.js} +63 -16
  94. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts +13 -0
  95. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts.map +1 -0
  96. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.js → page/vgeo_build_page_nodes.js} +4 -4
  97. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts +22 -0
  98. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts.map +1 -0
  99. package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.js → page/vgeo_page_node_count.js} +2 -2
  100. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +52 -0
  101. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -0
  102. package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.js → partition/VGeoFaceGraph.js} +1 -1
  103. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts +14 -0
  104. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -0
  105. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts +29 -0
  106. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts.map +1 -0
  107. package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.js → partition/vgeo_partition_graph.js} +2 -2
  108. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts +41 -0
  109. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts.map +1 -0
  110. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.js +92 -0
  111. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts +10 -0
  112. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts.map +1 -0
  113. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.js → partition/vgeo_split_face_set.js} +12 -55
  114. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts +15 -0
  115. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -0
  116. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set_packed.js → partition/vgeo_split_face_set_packed.js} +3 -3
  117. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts +12 -0
  118. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts.map +1 -0
  119. package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.js → sphere/vgeo_bounding_sphere.js} +3 -3
  120. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts +18 -0
  121. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts.map +1 -0
  122. package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.js → sphere/vgeo_containing_sphere.js} +3 -3
  123. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts +9 -0
  124. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts.map +1 -0
  125. package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.js → sphere/vgeo_sphere_inflate_to_contain.js} +1 -1
  126. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +24 -0
  127. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
  128. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +20 -0
  129. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
  130. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +14 -0
  131. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
  132. package/src/shade/renderer/geometry/virtual/build/{vgeo_extract_submesh.js → submesh/vgeo_extract_submesh.js} +5 -5
  133. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +12 -0
  134. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
  135. package/src/shade/renderer/geometry/virtual/build/{vgeo_gather_faces.js → submesh/vgeo_gather_faces.js} +2 -2
  136. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts +11 -0
  137. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts.map +1 -0
  138. package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.js → submesh/vgeo_narrow_indices.js} +3 -3
  139. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
  140. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  141. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +10 -11
  142. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +22 -0
  143. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  144. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +24 -0
  145. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts +8 -2
  146. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts.map +1 -1
  147. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +8 -2
  148. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +12 -0
  149. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  150. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +13 -0
  151. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +8 -1
  152. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  153. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +11 -3
  154. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +9 -0
  155. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  156. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +10 -1
  157. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts +15 -0
  158. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts.map +1 -0
  159. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js +15 -0
  160. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts +18 -0
  161. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map +1 -0
  162. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js +17 -0
  163. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts +8 -0
  164. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts.map +1 -0
  165. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js +7 -0
  166. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +3 -0
  167. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -0
  168. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts +14 -0
  169. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts.map +1 -0
  170. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js +13 -0
  171. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts +11 -0
  172. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map +1 -0
  173. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js +10 -0
  174. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +28 -0
  175. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
  176. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +7 -3
  177. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +20 -0
  178. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
  179. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +20 -2
  180. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +4 -0
  181. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
  182. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +4 -0
  183. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +29 -3
  184. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  185. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +81 -122
  186. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +40 -0
  187. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  188. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +44 -0
  189. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +69 -0
  190. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -0
  191. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +236 -0
  192. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +14 -0
  193. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
  194. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +15 -0
  195. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts +31 -0
  196. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map +1 -0
  197. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js +32 -0
  198. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +10 -0
  199. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
  200. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +21 -1
  201. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts +15 -0
  202. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts.map +1 -0
  203. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js +84 -0
  204. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts +22 -0
  205. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -0
  206. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +96 -0
  207. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  208. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +63 -3
  209. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  210. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +219 -17
  211. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  212. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +156 -11
  213. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +656 -0
  214. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +33 -36
  215. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -1
  216. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +109 -193
  217. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +109 -29
  218. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  219. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +173 -105
  220. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
  221. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +109 -26
  222. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +548 -0
  223. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +29 -50
  224. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  225. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +55 -487
  226. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts +84 -0
  227. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -0
  228. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +393 -0
  229. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts +234 -0
  230. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -0
  231. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +1388 -0
  232. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts +81 -0
  233. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts.map +1 -0
  234. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.js +89 -0
  235. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +53 -34
  236. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  237. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +407 -124
  238. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +100 -0
  239. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -0
  240. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +219 -0
  241. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts +17 -0
  242. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts.map +1 -0
  243. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js +47 -0
  244. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts +20 -0
  245. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts.map +1 -0
  246. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js +19 -0
  247. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -1
  248. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +30 -12
  249. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +8 -8
  250. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  251. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +11 -73
  252. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts +19 -0
  253. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -0
  254. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +98 -0
  255. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts +31 -0
  256. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -0
  257. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +99 -0
  258. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts +17 -0
  259. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts.map +1 -0
  260. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.js +39 -0
  261. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  262. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +18 -1
  263. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -1
  264. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +5 -15
  265. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts +3 -0
  266. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts.map +1 -0
  267. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.js +77 -0
  268. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts +3 -0
  269. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -0
  270. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +130 -0
  271. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
  272. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +32 -37
  273. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  274. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +576 -230
  275. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +15 -18
  276. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -1
  277. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +19 -28
  278. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  279. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +45 -25
  280. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  281. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +11 -0
  282. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  283. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +0 -1
  284. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +12 -10
  285. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +1 -0
  286. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +8 -0
  287. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +7 -2
  288. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -1
  289. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +8 -3
  290. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +2 -0
  291. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +19 -0
  292. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -1
  293. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +1 -1
  294. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts +5 -0
  295. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts.map +1 -0
  296. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js +22 -0
  297. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts +14 -0
  298. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts.map +1 -0
  299. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js +13 -0
  300. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts +17 -0
  301. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map +1 -0
  302. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js +16 -0
  303. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts +15 -0
  304. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts.map +1 -0
  305. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js +16 -0
  306. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts +23 -0
  307. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts.map +1 -0
  308. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js +28 -0
  309. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts +2 -0
  310. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts.map +1 -0
  311. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js +13 -0
  312. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +10 -5
  313. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -1
  314. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +15 -6
  315. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +6 -1
  316. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  317. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +38 -1
  318. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  319. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +4 -3
  320. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  321. package/src/shade/renderer/loader/gltf/load_gltf.js +0 -19
  322. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  323. package/src/shade/renderer/material/chunk_material_draw_side.d.ts +14 -0
  324. package/src/shade/renderer/material/chunk_material_draw_side.d.ts.map +1 -0
  325. package/src/shade/renderer/material/chunk_material_draw_side.js +34 -0
  326. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  327. package/src/shade/renderer/material/standard/fragment_gbuffer.js +8 -1
  328. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  329. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +6 -3
  330. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  331. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +6 -3
  332. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  333. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +13 -1
  334. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  335. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +19 -5
  336. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +23 -5
  338. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.js +12 -5
  340. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  341. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -4
  342. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts +22 -0
  343. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts.map +1 -0
  344. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.js +36 -0
  345. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +2 -0
  346. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  347. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  348. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +15 -0
  349. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -0
  350. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +35 -0
  351. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  352. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +3 -5
  353. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  354. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +3 -4
  355. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts +10 -1
  356. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
  357. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +38 -29
  358. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts +5 -0
  359. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts.map +1 -1
  360. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.js +63 -55
  361. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  362. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -4
  363. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
  364. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +1 -0
  365. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  366. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +7 -7
  367. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  368. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +83 -78
  369. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  370. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +44 -53
  371. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
  372. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -2
  373. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
  374. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -2
  375. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
  376. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +19 -2
  377. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +7 -4
  378. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -2
  380. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js +15 -4
  382. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +16 -5
  384. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.d.ts.map +1 -1
  385. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +16 -5
  386. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  387. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +2 -1
  388. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.d.ts.map +1 -1
  389. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.js +4 -0
  390. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  391. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +16 -7
  392. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  393. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +85 -89
  394. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  395. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +28 -32
  396. package/src/shade/renderer/scene/GPUSceneContext.d.ts +22 -2
  397. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  398. package/src/shade/renderer/scene/GPUSceneContext.js +61 -4
  399. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +19 -0
  400. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts.map +1 -1
  401. package/src/shade/renderer/scene/NODE3D_STRUCT.js +34 -0
  402. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts +9 -0
  403. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts.map +1 -0
  404. package/src/shade/renderer/scene/chunk_node3d_flags.js +23 -0
  405. package/src/shade/renderer/scene/chunk_scene_database_access.d.ts.map +1 -1
  406. package/src/shade/renderer/scene/chunk_scene_database_access.js +15 -1
  407. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  408. package/src/shade/renderer/scene/rows/GPUSceneRows.js +9 -1
  409. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts +7 -0
  410. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts.map +1 -1
  411. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.js +16 -4
  412. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts +12 -0
  413. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -0
  414. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +18 -0
  415. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts +24 -0
  416. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts.map +1 -0
  417. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js +33 -0
  418. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  419. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +92 -16
  420. package/src/shade/renderer/view/GPUViewContext.d.ts +5 -0
  421. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  422. package/src/shade/renderer/view/GPUViewContext.js +21 -0
  423. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  424. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +74 -3
  425. package/src/shade/playground/vgeo_viewer/README.md +0 -150
  426. package/src/shade/playground/vgeo_viewer/cut_geometry.js +0 -460
  427. package/src/shade/playground/vgeo_viewer/index.html +0 -77
  428. package/src/shade/playground/vgeo_viewer/main.js +0 -1343
  429. package/src/shade/playground/vgeo_viewer/select_cut.js +0 -481
  430. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +0 -258
  431. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +0 -1
  432. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +0 -723
  433. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +0 -49
  434. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +0 -1
  435. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
  436. package/src/shade/renderer/loader/gltf/fix_up_material_sides.js +0 -109
  437. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.js +0 -78
  438. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +0 -100
  439. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.js +0 -26
  440. package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
  441. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts +0 -3
  442. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts.map +0 -1
  443. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
  444. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
  445. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +0 -0
  446. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +0 -0
  447. /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.js → partition/vgeo_graph_components.js} +0 -0
  448. /package/src/shade/renderer/geometry/virtual/build/{VGeoGatheredFaces.js → submesh/VGeoGatheredFaces.js} +0 -0
  449. /package/src/shade/renderer/geometry/virtual/build/{VGeoSubmesh.js → submesh/VGeoSubmesh.js} +0 -0
@@ -0,0 +1,73 @@
1
+ /**
2
+ * A level of geometry as the builder handles it: a `BinaryTopology` carrying the positions, the
3
+ * connectivity, and the per-vertex attributes all together.
4
+ *
5
+ * Everything per-vertex lives in the topology. It has to: an edge collapse moves and removes
6
+ * vertices, and the topology is the only thing that knows which. A vertex data layer is addressed
7
+ * by vertex id and sized by the vertex pool, so a channel cannot fall out of step with the mesh it
8
+ * describes — there is no second array to resize, no invariant to assert, and no way for the
9
+ * simplifier to leave a live vertex without a slot.
10
+ *
11
+ * The channels are named by their index into {@link VGEO_ATTRIBUTES}, which is the format's frozen
12
+ * table — {@link layers} has one slot per entry, holding a layer or null.
13
+ *
14
+ * @author Alex Goldring
15
+ * @copyright Company Named Limited (c) 2026
16
+ */
17
+ export class VirtualGeometryMesh {
18
+ /**
19
+ * Take a geometry apart into the form the builder simplifies: its positions and index become a
20
+ * topology, its other attributes become vertex data layers on that same topology.
21
+ *
22
+ * The attribute values are copied in, not adopted. The builder re-derives the shading frame as
23
+ * it coarsens, and the caller's geometry is no longer where that lands.
24
+ *
25
+ * The normal and tangent channels are declared whether or not the geometry carries them: they
26
+ * are what the shading model reads, so the builder owes an asset both. What it does not have,
27
+ * {@link synthesized} records, and {@link vgeo_normalize_source} fills.
28
+ *
29
+ * @param {Geometry} geometry triangles, with a position attribute; the index is synthesized when
30
+ * the geometry does not carry one
31
+ * @returns {VirtualGeometryMesh}
32
+ */
33
+ static from_geometry(geometry: Geometry): VirtualGeometryMesh;
34
+ /**
35
+ * @param {BinaryTopology} topology
36
+ * @param {(BinaryDataLayer|null)[]} layers declared on `topology`
37
+ */
38
+ constructor(topology: BinaryTopology, layers: (BinaryDataLayer | null)[]);
39
+ /**
40
+ * Positions, connectivity, and the vertex data block the {@link layers} address.
41
+ * @type {BinaryTopology}
42
+ */
43
+ topology: BinaryTopology;
44
+ /**
45
+ * One slot per {@link VGEO_ATTRIBUTES} entry, holding the vertex data layer that carries that
46
+ * channel or null where this geometry does not carry it.
47
+ * {@link VGEO_ATTRIBUTE.POSITION}'s slot is always null — position is the topology's own.
48
+ * @type {(BinaryDataLayer|null)[]}
49
+ */
50
+ layers: (BinaryDataLayer | null)[];
51
+ /**
52
+ * One flag per {@link VGEO_ATTRIBUTES} entry, true where the channel exists because the builder
53
+ * added it rather than because the source geometry carried it.
54
+ *
55
+ * Read once, by {@link vgeo_normalize_source}, and for one reason: a synthesized channel has to
56
+ * be derived from the *welded* mesh, which does not exist yet when the channel is declared.
57
+ * Normalization fuses coincident vertices, and a normal derived before that fuse is the average
58
+ * of one side of a seam — the very defect deriving it is supposed to avoid.
59
+ *
60
+ * An authored channel is never among these. A hand-tuned normal is data, and the builder is not
61
+ * entitled to replace it.
62
+ *
63
+ * @type {boolean[]}
64
+ */
65
+ synthesized: boolean[];
66
+ /**
67
+ * Ids of every allocated face, ascending.
68
+ * @returns {number[]}
69
+ */
70
+ face_ids(): number[];
71
+ }
72
+ import { BinaryTopology } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
73
+ //# sourceMappingURL=VirtualGeometryMesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualGeometryMesh.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;GAeG;AACH;IA6CI;;;;;;;;;;;;;;OAcG;IACH,0CAFa,mBAAmB,CA8G/B;IAzID;;;OAGG;IACH,sBAHW,cAAc,UACd,CAAC,kBAAgB,IAAI,CAAC,EAAE,EAUlC;IA1CD;;;OAGG;IACH,UAFU,cAAc,CAER;IAEhB;;;;;OAKG;IACH,QAFU,CAAC,kBAAgB,IAAI,CAAC,EAAE,CAEtB;IAEZ;;;;;;;;;;;;;OAaG;IACH,aAFU,OAAO,EAAE,CAEyC;IA6I5D;;;OAGG;IACH,YAFa,MAAM,EAAE,CAcpB;CACJ;+BApN8B,yEAAyE"}
@@ -1,12 +1,12 @@
1
- import { assert } from "../../../../../core/assert.js";
2
- import { BinaryTopology } from "../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
+ import { BinaryTopology } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
3
3
  import {
4
4
  bt_mesh_from_indexed_geometry
5
- } from "../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
6
- import { StandardAttributes } from "../../StandardAttributes.js";
7
- import { vgeo_layers_declare } from "../format/attribute/vgeo_layers_declare.js";
8
- import { VGEO_ATTRIBUTE } from "../format/attribute/VGEO_ATTRIBUTE.js";
9
- import { VGEO_ATTRIBUTES } from "../format/attribute/VGEO_ATTRIBUTES.js";
5
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
6
+ import { StandardAttributes } from "../../../StandardAttributes.js";
7
+ import { vgeo_layers_declare } from "../../format/attribute/vgeo_layers_declare.js";
8
+ import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
9
+ import { VGEO_ATTRIBUTES } from "../../format/attribute/VGEO_ATTRIBUTES.js";
10
10
 
11
11
  /**
12
12
  * A level of geometry as the builder handles it: a `BinaryTopology` carrying the positions, the
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Area-weighted vertex normals of a mesh, written into its normal channel.
3
+ *
4
+ * The geometry a mesh actually has is the answer for that mesh: carrying a surviving vertex's
5
+ * original normal through a dozen collapses shades a coarse level by whichever vertices happened to
6
+ * win, which is visibly wrong.
7
+ *
8
+ * **Except where the vertex was pinned.** A pinned vertex is one the step was forbidden to move, and
9
+ * every group that touches it carries it — which is exactly what lets a cut place two levels of
10
+ * detail side by side without a crack. That guarantee has to cover what the vertex *carries*, not
11
+ * only where it is: recomputed here, a pinned vertex would get the average of the faces on this
12
+ * side of the seam only, the group across the seam would get the average of its own, and the two
13
+ * would disagree by however much the surface turns. So a pinned vertex keeps what it had, exactly
14
+ * as it keeps where it was, and the frame stays continuous across every cut the DAG admits.
15
+ *
16
+ * The pass itself is {@link bt_mesh_compute_vertex_normals}; all this adds is the pin rule and
17
+ * lifting its result out of the topology's own normal slots and into the format's normal attribute,
18
+ * which is where the encoder reads from.
19
+ *
20
+ * @param {VirtualGeometryMesh} mesh whose normal layer is sized by the vertex pool and so carries a
21
+ * slot for every live vertex by construction
22
+ * @param {Set<number>} pinned vertex ids to leave exactly as they are; empty for a mesh nothing has
23
+ * locked yet
24
+ *
25
+ * @author Alex Goldring
26
+ * @copyright Company Named Limited (c) 2026
27
+ */
28
+ export function vgeo_compute_vertex_normals(mesh: VirtualGeometryMesh, pinned: Set<number>): void;
29
+ //# sourceMappingURL=vgeo_compute_vertex_normals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_compute_vertex_normals.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,+EANW,IAAI,MAAM,CAAC,QAyCrB"}
@@ -1,8 +1,8 @@
1
- import { assert } from "../../../../../core/assert.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
2
  import {
3
3
  bt_mesh_compute_vertex_normals
4
- } from "../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_normals.js";
5
- import { VGEO_ATTRIBUTE } from "../format/attribute/VGEO_ATTRIBUTE.js";
4
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_normals.js";
5
+ import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
6
6
 
7
7
  /**
8
8
  * One vertex's normal, on its way out of the topology's slot and into the format's channel.
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Vertex tangents of a mesh, written into its tangent channel.
3
+ *
4
+ * A tangent is a direction *in the texture parameterization*, so where the mesh carries a `UV0` this
5
+ * is Lengyel's per-triangle solve accumulated per vertex and orthogonalized against the normal —
6
+ * {@link geometry_build_tangents}, the same pass {@link Geometry#computeTangents} runs, so an asset
7
+ * that goes through the virtual-geometry builder gets the frame it would have got anywhere else.
8
+ * Where the mesh carries no UVs there is no parameterization to be tangent to, and the frame becomes
9
+ * an arbitrary but well-conditioned basis around the normal — Frisvad's, via
10
+ * {@link build_tangent_from_normal}. That is not a fallback for a broken input: a shading model that
11
+ * reads a tangent frame reads one whether or not the surface is textured, and the alternative is
12
+ * the format's flat default, which is parallel to the normal over a whole band of any closed
13
+ * surface and degenerates the frame there.
14
+ *
15
+ * `pinned` carries the same meaning and the same reason as it does for
16
+ * {@link vgeo_compute_vertex_normals}: a vertex two groups share must carry byte-identical values in
17
+ * both, or the seam a cut is allowed to put between them shades as a crease.
18
+ *
19
+ * The flat arrays this builds are indexed by *vertex id*, holes and all, so a pool with released
20
+ * slots needs no compaction and no remap — a released slot is simply a triangle corner nothing
21
+ * names.
22
+ *
23
+ * @param {VirtualGeometryMesh} mesh whose tangent and normal layers are sized by the vertex pool
24
+ * @param {Set<number>} pinned vertex ids to leave exactly as they are; empty for a mesh nothing has
25
+ * locked yet
26
+ *
27
+ * @author Alex Goldring
28
+ * @copyright Company Named Limited (c) 2026
29
+ */
30
+ export function vgeo_compute_vertex_tangents(mesh: VirtualGeometryMesh, pinned: Set<number>): void;
31
+ //# sourceMappingURL=vgeo_compute_vertex_tangents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_compute_vertex_tangents.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js"],"names":[],"mappings":"AAoBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,gFANW,IAAI,MAAM,CAAC,QAmGrB"}
@@ -1,10 +1,10 @@
1
- import { assert } from "../../../../../core/assert.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
2
  import {
3
3
  bt_face_read_triangle_vertices
4
- } from "../../../../../core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js";
5
- import { build_tangent_from_normal } from "../../normals/build_tangent_from_normal.js";
6
- import { geometry_build_tangents } from "../../normals/geometry_build_tangents.js";
7
- import { VGEO_ATTRIBUTE } from "../format/attribute/VGEO_ATTRIBUTE.js";
4
+ } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js";
5
+ import { build_tangent_from_normal } from "../../../normals/build_tangent_from_normal.js";
6
+ import { geometry_build_tangents } from "../../../normals/geometry_build_tangents.js";
7
+ import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
8
8
 
9
9
  /**
10
10
  * One vertex's tangent, on its way into the format's channel.
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Bring a source mesh to the state the level loop assumes: no edge shorter than the weld tolerance,
3
+ * coincident vertices fused, nothing dangling, and consistent topology.
4
+ *
5
+ * The short-edge pass is not optional — the merge's own contract requires it, because merging two
6
+ * vertices that share a face leaves a loop cycle visiting one vertex twice, and no boundary walk can
7
+ * get through the non-manifold edge that produces.
8
+ *
9
+ * It **collapses** those edges rather than killing them, and the difference is the whole surface.
10
+ * `bt_mesh_kill_short_edges` deletes both faces of every edge it names, which is right for a soup
11
+ * and wrong here: the weld behind it closes most of the resulting holes and leaves the rest, and a
12
+ * hole left in the source is a hole in every level of the DAG built on it. Measured on the Stanford
13
+ * dragon, closed to begin with: killing opened 18,438 boundary edges and left 281 of them standing;
14
+ * collapsing leaves none.
15
+ *
16
+ * Neither is the fuse that follows it. The merge re-points vertex references but leaves the two
17
+ * edges that now connect the same pair as two distinct edges, and face adjacency is read off radial
18
+ * cycles — so without the fuse, two triangles welded along a seam still look unrelated to every
19
+ * query downstream, and the clusterer shreds the mesh along every UV seam it has.
20
+ *
21
+ * Nor is the degenerate-face kill. The short-edge pass clears the pairs an *edge* is short enough to
22
+ * name, but the merge is a hash grid: two corners of one face up to twice the tolerance apart can
23
+ * still land on a common master and become one vertex, leaving a face that visits it twice.
24
+ *
25
+ * The tolerance is a fraction of the mesh's own size rather than a distance, and it is resolved here
26
+ * — once, off the source's bounds, before any pass has removed anything — so every pass below welds
27
+ * the same amount of the same surface. A conversion is many geometries at many sizes, and there is
28
+ * no one distance that is right for all of them.
29
+ *
30
+ * The shading frame is regularized too, and last. A geometry that arrived without normals or without
31
+ * tangents is given them here rather than at the door, because *here* is the first point at which
32
+ * the mesh is the one the rest of the build will see: derived before the weld, a normal at a seam
33
+ * vertex would be the average of whichever side of the seam the exporter happened to split it into,
34
+ * and the fuse would then pick one of those halves to keep. Derived after it, the vertex has its
35
+ * whole ring. Channels the source did carry are left exactly as they came.
36
+ *
37
+ * @param {VirtualGeometryMesh} mesh mutated in place
38
+ * @param {number} weld_ratio fraction of the bounding-box diagonal; see
39
+ * {@link VGeoBuildOptions#weld_ratio}
40
+ * @returns {number} the object-space distance the ratio came to for this mesh
41
+ *
42
+ * @author Alex Goldring
43
+ * @copyright Company Named Limited (c) 2026
44
+ */
45
+ export function vgeo_normalize_source(mesh: VirtualGeometryMesh, weld_ratio: number): number;
46
+ //# sourceMappingURL=vgeo_normalize_source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_normalize_source.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js"],"names":[],"mappings":"AA+BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,6EAPW,MAAM,GAEJ,MAAM,CAyClB"}
@@ -1,24 +1,24 @@
1
- import { assert } from "../../../../../core/assert.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
2
  import {
3
3
  bt_mesh_cleanup_faceless_references
4
- } from "../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_cleanup_faceless_references.js";
4
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_cleanup_faceless_references.js";
5
5
  import {
6
6
  bt_mesh_collapse_short_edges
7
- } from "../../../../../core/geom/3d/topology/struct/binary/io/edge/bt_mesh_collapse_short_edges.js";
7
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/edge/bt_mesh_collapse_short_edges.js";
8
8
  import {
9
9
  bt_mesh_fuse_duplicate_edges
10
- } from "../../../../../core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js";
10
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/edge/bt_mesh_fuse_duplicate_edges.js";
11
11
  import {
12
12
  bt_mesh_kill_degenerate_faces
13
- } from "../../../../../core/geom/3d/topology/struct/binary/io/face/bt_mesh_kill_degenerate_faces.js";
13
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/face/bt_mesh_kill_degenerate_faces.js";
14
14
  import {
15
15
  bt_merge_vertices_by_distance
16
- } from "../../../../../core/geom/3d/topology/struct/binary/io/vertex/bt_merge_vertices_by_distance.js";
16
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/vertex/bt_merge_vertices_by_distance.js";
17
17
  import {
18
18
  bt_mesh_relative_merge_distance
19
- } from "../../../../../core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_relative_merge_distance.js";
20
- import { bt_mesh_validate } from "../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js";
21
- import { VGEO_ATTRIBUTE } from "../format/attribute/VGEO_ATTRIBUTE.js";
19
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_relative_merge_distance.js";
20
+ import { bt_mesh_validate } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js";
21
+ import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
22
22
  import { vgeo_compute_vertex_normals } from "./vgeo_compute_vertex_normals.js";
23
23
  import { vgeo_compute_vertex_tangents } from "./vgeo_compute_vertex_tangents.js";
24
24
 
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Assign groups to pages.
3
+ *
4
+ * @param {VirtualGeometryGroup[][]} groups_by_level indexed by level; every group of every level,
5
+ * including the root level's
6
+ * @param {Float32Array} object_bounds `[min xyz, max xyz]` of the whole geometry, for the Morton grid
7
+ * @param {number} nominal_page_size decoded bytes per page, as a hard cap: no returned page decodes
8
+ * to more, and a group that cannot fit one on its own throws
9
+ * @returns {VirtualGeometryPage[]} in file order, root page first
10
+ */
11
+ export function vgeo_assemble_pages(groups_by_level: VirtualGeometryGroup[][], object_bounds: Float32Array, nominal_page_size: number): VirtualGeometryPage[];
12
+ import { VirtualGeometryPage } from "../../format/dag/VirtualGeometryPage.js";
13
+ //# sourceMappingURL=vgeo_assemble_pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_assemble_pages.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.js"],"names":[],"mappings":"AAwMA;;;;;;;;;GASG;AACH,qDAPW,sBAAsB,EAAE,iBAExB,YAAY,qBACZ,MAAM,GAEJ,mBAAmB,EAAE,CAiIjC;oCAzUmC,yCAAyC"}
@@ -1,10 +1,12 @@
1
- import { assert } from "../../../../../core/assert.js";
2
- import { v3_morton_encode_bounded } from "../../../../../core/geom/3d/morton/v3_morton_encode_bounded.js";
3
- import { VGEO_CLUSTER_RECORD_SIZE } from "../format/cluster/VGEO_CLUSTER_RECORD_SIZE.js";
4
- import { VGEO_GROUP_RECORD_SIZE } from "../format/page/VGEO_GROUP_RECORD_SIZE.js";
5
- import { VGEO_NODE_RECORD_SIZE } from "../format/page/VGEO_NODE_RECORD_SIZE.js";
6
- import { VGEO_PAGE_HEADER_SIZE } from "../format/page/VGEO_PAGE_HEADER_SIZE.js";
7
- import { VirtualGeometryPage } from "../format/dag/VirtualGeometryPage.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
+ import { v3_morton_encode_bounded } from "../../../../../../core/geom/3d/morton/v3_morton_encode_bounded.js";
3
+ import { VGEO_CLUSTER_RECORD_SIZE } from "../../format/cluster/VGEO_CLUSTER_RECORD_SIZE.js";
4
+ import { VGEO_GROUP_RECORD_SIZE } from "../../format/page/VGEO_GROUP_RECORD_SIZE.js";
5
+ import { VGEO_NODE_RECORD_SIZE } from "../../format/page/VGEO_NODE_RECORD_SIZE.js";
6
+ import { VGEO_PAGE_HEADER_SIZE } from "../../format/page/VGEO_PAGE_HEADER_SIZE.js";
7
+ import { VGEO_PARENT_ENTRY_SIZE } from "../../format/page/VGEO_PARENT_ENTRY_SIZE.js";
8
+ import { VGEO_PARENT_PAGE_ENTRY_SIZE } from "../../format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js";
9
+ import { VirtualGeometryPage } from "../../format/dag/VirtualGeometryPage.js";
8
10
  import { vgeo_build_page_nodes } from "./vgeo_build_page_nodes.js";
9
11
  import { vgeo_page_node_count } from "./vgeo_page_node_count.js";
10
12
 
@@ -31,18 +33,59 @@ import { vgeo_page_node_count } from "./vgeo_page_node_count.js";
31
33
  * @copyright Company Named Limited (c) 2026
32
34
  */
33
35
 
36
+ /**
37
+ * How many clusters, anywhere in the build, name each group as their child.
38
+ *
39
+ * The same count {@link vgeo_write_container} recomputes as `parent_cluster_count`, needed a step
40
+ * earlier because it is also the length of the group's slice of the page's group-parent table
41
+ * (format §6.3) and therefore part of what a page costs. It is a property of the DAG, which
42
+ * assembly does not change, so counting it here and counting it again at write time cannot
43
+ * disagree.
44
+ *
45
+ * @param {VirtualGeometryGroup[][]} groups_by_level
46
+ * @returns {Map<VirtualGeometryGroup, number>}
47
+ */
48
+ function count_group_parents(groups_by_level) {
49
+ const counts = new Map();
50
+
51
+ for (const groups of groups_by_level) {
52
+ for (const group of groups) {
53
+ for (const cluster of group.clusters) {
54
+ const child = cluster.child_group;
55
+
56
+ if (child !== undefined) {
57
+ counts.set(child, (counts.get(child) ?? 0) + 1);
58
+ }
59
+ }
60
+ }
61
+ }
62
+
63
+ return counts;
64
+ }
65
+
34
66
  /**
35
67
  * @param {VirtualGeometryGroup} group
68
+ * @param {Map<VirtualGeometryGroup, number>} parent_counts
36
69
  * @returns {number} bytes this group adds to a decoded page
37
70
  */
38
- function group_size_in_page(group) {
71
+ function group_size_in_page(group, parent_counts) {
39
72
  let size = VGEO_GROUP_RECORD_SIZE;
40
73
 
41
74
  for (const cluster of group.clusters) {
42
75
  size += VGEO_CLUSTER_RECORD_SIZE + cluster.payload.byteLength;
43
76
  }
44
77
 
45
- return size;
78
+ /*
79
+ The group's slice of the group-parent table, plus an upper bound on what it contributes to the
80
+ page's parent-page table. The exact parent-page count is not knowable here — it is how many
81
+ *distinct* pages the parents land in, and which page a parent lands in is what this function is
82
+ helping to decide — so bound it by one page per entry, which no group can exceed. Measured on
83
+ converted assets the real ratio is 17.4 entries to 4.9 pages, so the bound overstates a page's
84
+ parent section by about half of a number that is itself a fifth of a percent of the page.
85
+ */
86
+ const parents = parent_counts.get(group) ?? 0;
87
+
88
+ return size + parents * (VGEO_PARENT_ENTRY_SIZE + VGEO_PARENT_PAGE_ENTRY_SIZE);
46
89
  }
47
90
 
48
91
  /**
@@ -96,10 +139,11 @@ function page_decoded_size(group_count, content) {
96
139
  * its own, which is one group and therefore one node.
97
140
  *
98
141
  * @param {VirtualGeometryGroup} group
142
+ * @param {Map<VirtualGeometryGroup, number>} parent_counts
99
143
  * @returns {number}
100
144
  */
101
- function group_minimum_page_size(group) {
102
- return page_decoded_size(1, group_size_in_page(group));
145
+ function group_minimum_page_size(group, parent_counts) {
146
+ return page_decoded_size(1, group_size_in_page(group, parent_counts));
103
147
  }
104
148
 
105
149
  /**
@@ -111,8 +155,9 @@ function group_minimum_page_size(group) {
111
155
  *
112
156
  * @param {VirtualGeometryGroup[][]} groups_by_level
113
157
  * @param {number} nominal_page_size
158
+ * @param {Map<VirtualGeometryGroup, number>} parent_counts
114
159
  */
115
- function reject_groups_larger_than_a_page(groups_by_level, nominal_page_size) {
160
+ function reject_groups_larger_than_a_page(groups_by_level, nominal_page_size, parent_counts) {
116
161
  let worst = undefined;
117
162
  let worst_level = 0;
118
163
  let worst_index = 0;
@@ -125,7 +170,7 @@ function reject_groups_larger_than_a_page(groups_by_level, nominal_page_size) {
125
170
  groups.forEach((group, index) => {
126
171
  total_count++;
127
172
 
128
- const needs = group_minimum_page_size(group);
173
+ const needs = group_minimum_page_size(group, parent_counts);
129
174
 
130
175
  if (needs > nominal_page_size) {
131
176
  over_count++;
@@ -167,7 +212,9 @@ export function vgeo_assemble_pages(groups_by_level, object_bounds, nominal_page
167
212
  assert.isPositiveInteger(nominal_page_size, 'nominal_page_size');
168
213
  assert.greaterThan(groups_by_level.length, 0, 'groups_by_level.length');
169
214
 
170
- reject_groups_larger_than_a_page(groups_by_level, nominal_page_size);
215
+ const parent_counts = count_group_parents(groups_by_level);
216
+
217
+ reject_groups_larger_than_a_page(groups_by_level, nominal_page_size, parent_counts);
171
218
 
172
219
  const pages = [];
173
220
 
@@ -214,7 +261,7 @@ export function vgeo_assemble_pages(groups_by_level, object_bounds, nominal_page
214
261
  for (const group of groups) {
215
262
  place(page, group);
216
263
 
217
- content += group_size_in_page(group);
264
+ content += group_size_in_page(group, parent_counts);
218
265
  }
219
266
 
220
267
  // The cap has no exception, and this is the one page the fill rule below does not get to
@@ -250,7 +297,7 @@ export function vgeo_assemble_pages(groups_by_level, object_bounds, nominal_page
250
297
  let content = 0;
251
298
 
252
299
  for (const entry of keyed) {
253
- const size = group_size_in_page(entry.group);
300
+ const size = group_size_in_page(entry.group, parent_counts);
254
301
 
255
302
  // What the page would come to *with* this group, node table and all — not what it came
256
303
  // to without it. The node table grows with the group count, so a page measured before
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Build the tree over a page's groups.
3
+ *
4
+ * Breadth-first, so that a node's children occupy a contiguous run of indices and every parent sits
5
+ * at a lower index than its children — which is what lets the metric be filled in by one backwards
6
+ * sweep, and what lets a reader walk the tree without a stack of anything but indices.
7
+ *
8
+ * @param {VirtualGeometryPage} page whose `groups` are already in the order they will be written
9
+ * @returns {VirtualGeometryPageNode[]} the tree, root first; never empty
10
+ */
11
+ export function vgeo_build_page_nodes(page: VirtualGeometryPage): VirtualGeometryPageNode[];
12
+ import { VirtualGeometryPageNode } from "../../format/dag/VirtualGeometryPageNode.js";
13
+ //# sourceMappingURL=vgeo_build_page_nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_build_page_nodes.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.js"],"names":[],"mappings":"AAsDA;;;;;;;;;GASG;AACH,kEAFa,uBAAuB,EAAE,CA8FrC;wCAvJuC,6CAA6C"}
@@ -1,9 +1,9 @@
1
- import { assert } from "../../../../../core/assert.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
2
  import {
3
3
  sphere_compute_bounding_of_2_spheres
4
- } from "../../../../../core/geom/3d/sphere/sphere_compute_bounding_of_2_spheres.js";
5
- import { VGEO_NODE_FANOUT } from "../format/page/VGEO_NODE_FANOUT.js";
6
- import { VirtualGeometryPageNode } from "../format/dag/VirtualGeometryPageNode.js";
4
+ } from "../../../../../../core/geom/3d/sphere/sphere_compute_bounding_of_2_spheres.js";
5
+ import { VGEO_NODE_FANOUT } from "../../format/page/VGEO_NODE_FANOUT.js";
6
+ import { VirtualGeometryPageNode } from "../../format/dag/VirtualGeometryPageNode.js";
7
7
 
8
8
  /**
9
9
  * Build a page's group tree, and the page's own metric with it.
@@ -0,0 +1,22 @@
1
+ /**
2
+ * How many nodes {@link vgeo_build_page_nodes} will put over a page holding `group_count` groups.
3
+ *
4
+ * The tree's shape is a function of the group *count* alone — every node covers a contiguous run of
5
+ * the page's Morton order and splits it into as-near-equal parts as integers allow — so the node
6
+ * table's size is known before the tree exists. Which is what the page assembler needs: the node
7
+ * table is part of the decoded page, and a page whose size is a hard bound has to be measured with
8
+ * it included, while the tree itself cannot be built until the page's last group has arrived.
9
+ *
10
+ * This duplicates the recurrence in {@link vgeo_build_page_nodes} rather than sharing it, because
11
+ * the two want different things from it — one wants the ranges and one wants only how many there
12
+ * are — and the cost of the duplication is a spec that runs both and compares.
13
+ *
14
+ * @author Alex Goldring
15
+ * @copyright Company Named Limited (c) 2026
16
+ */
17
+ /**
18
+ * @param {number} group_count
19
+ * @returns {number} nodes, at least one
20
+ */
21
+ export function vgeo_page_node_count(group_count: number): number;
22
+ //# sourceMappingURL=vgeo_page_node_count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_page_node_count.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AAEH;;;GAGG;AACH,kDAHW,MAAM,GACJ,MAAM,CA8BlB"}
@@ -1,5 +1,5 @@
1
- import { assert } from "../../../../../core/assert.js";
2
- import { VGEO_NODE_FANOUT } from "../format/page/VGEO_NODE_FANOUT.js";
1
+ import { assert } from "../../../../../../core/assert.js";
2
+ import { VGEO_NODE_FANOUT } from "../../format/page/VGEO_NODE_FANOUT.js";
3
3
 
4
4
  /**
5
5
  * How many nodes {@link vgeo_build_page_nodes} will put over a page holding `group_count` groups.
@@ -0,0 +1,52 @@
1
+ export class VGeoFaceGraph {
2
+ /**
3
+ * @param {BinaryTopology} mesh
4
+ * @param {BinaryTopologyFaceGraph} face_graph
5
+ */
6
+ constructor(mesh: BinaryTopology, face_graph: BinaryTopologyFaceGraph);
7
+ /**
8
+ * @type {BinaryTopology}
9
+ */
10
+ mesh: BinaryTopology;
11
+ /**
12
+ * CSR over dense face-graph vertices; edge weights are shared-edge counts.
13
+ * @type {MetisGraph}
14
+ */
15
+ graph: MetisGraph;
16
+ /**
17
+ * `vertex_face_ids[dense] = face id`.
18
+ * @type {Uint32Array}
19
+ */
20
+ vertex_face_ids: Uint32Array;
21
+ /**
22
+ * Scratch stamp for unique-vertex counting, one entry per mesh vertex slot.
23
+ * @type {Int32Array}
24
+ */
25
+ vertex_stamp: Int32Array;
26
+ /**
27
+ * Monotonic stamp value, so the scratch never needs clearing.
28
+ * @type {number}
29
+ */
30
+ stamp: number;
31
+ /**
32
+ * Scratch `graph vertex -> its position in the member list being split right now`, one entry per
33
+ * graph vertex. Only the entries of that member list mean anything, which is all
34
+ * {@link vgeo_split_face_set}'s partition step ever reads: it consults this exclusively for
35
+ * neighbours the membership stamp has already confirmed are members.
36
+ *
37
+ * Dense rather than a `Map` because the keys are dense face-graph vertices to begin with, and
38
+ * because a `Map` cannot answer this question at all past 2^24 entries — the leaf cut runs over
39
+ * every face of the mesh at once, so a mesh of more than 16.7M triangles in one connected
40
+ * component would otherwise stop the builder dead.
41
+ * @type {Uint32Array}
42
+ */
43
+ member_index: Uint32Array;
44
+ /**
45
+ * How many distinct mesh vertices a set of dense face-graph vertices touches.
46
+ *
47
+ * @param {number[]|Int32Array} members dense face-graph vertices
48
+ * @returns {number}
49
+ */
50
+ count_unique_vertices(members: number[] | Int32Array): number;
51
+ }
52
+ //# sourceMappingURL=VGeoFaceGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGeoFaceGraph.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js"],"names":[],"mappings":"AAcA;IA4CI;;;OAGG;IACH,uEAMC;IArDD;;OAEG;IACH,qBAAY;IAEZ;;;OAGG;IACH,kBAAa;IAEb;;;OAGG;IACH,iBAFU,WAAW,CAEE;IAEvB;;;OAGG;IACH,cAFU,UAAU,CAEA;IAEpB;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;;;OAWG;IACH,cAFU,WAAW,CAED;IAcpB;;;;;OAKG;IACH,+BAHW,MAAM,EAAE,GAAC,UAAU,GACjB,MAAM,CA2BlB;CACJ"}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  bt_face_read_triangle_vertices
3
- } from "../../../../../core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js";
3
+ } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js";
4
4
 
5
5
  /**
6
6
  * A face-adjacency graph together with the mesh it came from, kept so that repeated splits over the
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Not re-entrant: one call's stamps are live until it returns, and it neither yields nor calls back
3
+ * into itself.
4
+ *
5
+ * @param {Uint32Array} edge_addresses CSR row pointers
6
+ * @param {Uint32Array} adjacency CSR column indices
7
+ * @param {number[]} members vertices of the subgraph
8
+ * @param {Int32Array} membership one entry per graph vertex; an entry equal to `token` marks a
9
+ * member. The caller stamps it, so nested calls over shrinking sets stay correct.
10
+ * @param {number} token
11
+ * @returns {number[][]} components, each ascending, ordered by their lowest member
12
+ */
13
+ export function vgeo_graph_components(edge_addresses: Uint32Array, adjacency: Uint32Array, members: number[], membership: Int32Array, token: number): number[][];
14
+ //# sourceMappingURL=vgeo_graph_components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_graph_components.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.js"],"names":[],"mappings":"AA6CA;;;;;;;;;;;GAWG;AACH,sDARW,WAAW,aACX,WAAW,WACX,MAAM,EAAE,cACR,UAAU,SAEV,MAAM,GACJ,MAAM,EAAE,EAAE,CAmEtB"}