@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
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @typedef {import("./header/VGeoLevelRecord.js").VGeoLevelRecord} VGeoLevelRecord
3
+ */
1
4
  /**
2
5
  * Everything the `.vgeo` header carries that the page list does not.
3
6
  *
@@ -17,6 +20,24 @@ export class VGeoWriteOptions {
17
20
  * @type {number}
18
21
  */
19
22
  codec: number;
23
+ /**
24
+ * How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
25
+ * top of the reference's hash-chain levels.
26
+ *
27
+ * **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
28
+ * container built at any of them reads in every build of the reader that exists; the level is
29
+ * how long the *encoder* spent, and that is all.
30
+ *
31
+ * Nine rather than twelve because the ladder above it is not worth its time on this payload:
32
+ * measured over 2,718 real pages, the whole run from 3 to 12 is 0.077 percentage points of
33
+ * ratio, and 10 to 12 cost 15-40% more time for the last thousandth of it. Nine rather than
34
+ * three for the same reason in the other direction — it is 0.077 points smaller for about 5%
35
+ * more time. Nine rather than one because the fast encoder gives up 2.5% of every page to save
36
+ * compression time that is a couple of percent of a build.
37
+ *
38
+ * @type {number}
39
+ */
40
+ codec_level: number;
20
41
  /**
21
42
  * One per level, coarsest last. `level_count` is its length.
22
43
  * @type {VGeoLevelRecord[]}
@@ -60,4 +81,5 @@ export class VGeoWriteOptions {
60
81
  */
61
82
  nominal_page_size: number;
62
83
  }
84
+ export type VGeoLevelRecord = import("./header/VGeoLevelRecord.js").VGeoLevelRecord;
63
85
  //# sourceMappingURL=VGeoWriteOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VGeoWriteOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH;IACI;;;;;;;;;;OAUG;IACH,OAFU,MAAM,CAEO;IAEvB;;;OAGG;IACH,QAFU,iBAAiB,CAEf;IAEZ;;;OAGG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,mBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,uBAFU,MAAM,CAEU;IAE1B;;;;;;;;;;OAUG;IACH,mBAFU,MAAM,CAEM;CACzB"}
1
+ {"version":3,"file":"VGeoWriteOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js"],"names":[],"mappings":"AAGA;;GAEG;AAEH;;;;;GAKG;AACH;IACI;;;;;;;;;;OAUG;IACH,OAFU,MAAM,CAEO;IAEvB;;;;;;;;;;;;;;;;OAgBG;IACH,aAFU,MAAM,CAEmB;IAEnC;;;OAGG;IACH,QAFU,eAAe,EAAE,CAEf;IAEZ;;;OAGG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,mBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,uBAFU,MAAM,CAEU;IAE1B;;;;;;;;;;OAUG;IACH,mBAFU,MAAM,CAEM;CACzB;8BA1FY,OAAO,6BAA6B,EAAE,eAAe"}
@@ -1,5 +1,10 @@
1
+ import { LZ4_LEVEL } from "../../../../../core/binary/lz4/LZ4_LEVEL.js";
1
2
  import { VGEO_CODEC_LZ4 } from "./frame/VGEO_CODEC_LZ4.js";
2
3
 
4
+ /**
5
+ * @typedef {import("./header/VGeoLevelRecord.js").VGeoLevelRecord} VGeoLevelRecord
6
+ */
7
+
3
8
  /**
4
9
  * Everything the `.vgeo` header carries that the page list does not.
5
10
  *
@@ -20,6 +25,25 @@ export class VGeoWriteOptions {
20
25
  */
21
26
  codec = VGEO_CODEC_LZ4;
22
27
 
28
+ /**
29
+ * How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
30
+ * top of the reference's hash-chain levels.
31
+ *
32
+ * **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
33
+ * container built at any of them reads in every build of the reader that exists; the level is
34
+ * how long the *encoder* spent, and that is all.
35
+ *
36
+ * Nine rather than twelve because the ladder above it is not worth its time on this payload:
37
+ * measured over 2,718 real pages, the whole run from 3 to 12 is 0.077 percentage points of
38
+ * ratio, and 10 to 12 cost 15-40% more time for the last thousandth of it. Nine rather than
39
+ * three for the same reason in the other direction — it is 0.077 points smaller for about 5%
40
+ * more time. Nine rather than one because the fast encoder gives up 2.5% of every page to save
41
+ * compression time that is a couple of percent of a build.
42
+ *
43
+ * @type {number}
44
+ */
45
+ codec_level = LZ4_LEVEL.HC_DEFAULT;
46
+
23
47
  /**
24
48
  * One per level, coarsest last. `level_count` is its length.
25
49
  * @type {VGeoLevelRecord[]}
@@ -1,7 +1,13 @@
1
1
  /**
2
2
  * Read one vertex's value for one channel, falling back to the format's default for a channel this
3
- * geometry does not carry — which is exactly what the container does with it, since the payload
4
- * never omits a section and constant-compresses the missing ones to the same values.
3
+ * geometry does not carry.
4
+ *
5
+ * These are the **unencoded** defaults, for a caller that is going to encode what it reads.
6
+ * `vgeo_encode_cluster_payload` never reaches them: a channel the geometry lacks takes its
7
+ * `ENCODED_DEFAULTS` path instead, which emits Shade's encoded constant directly. The two are not
8
+ * everywhere the same value — colour's encoded default carries an alpha byte that
9
+ * `encode_colors_to_u32` does not write — so which of the two a caller wants is a real question,
10
+ * and the answer is: this one only when the value is about to be encoded from scratch.
5
11
  *
6
12
  * @param {Float32Array|number[]} target
7
13
  * @param {number} target_offset
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_attributes_read.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,6CATW,YAAY,GAAC,MAAM,EAAE,iBACrB,MAAM,UACN,CAAC,kBAAgB,IAAI,CAAC,EAAE,aACxB,MAAM,UACN,MAAM,QAmBhB"}
1
+ {"version":3,"file":"vgeo_attributes_read.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,6CATW,YAAY,GAAC,MAAM,EAAE,iBACrB,MAAM,UACN,CAAC,kBAAgB,IAAI,CAAC,EAAE,aACxB,MAAM,UACN,MAAM,QAmBhB"}
@@ -2,8 +2,14 @@ import { VGEO_ATTRIBUTES } from "./VGEO_ATTRIBUTES.js";
2
2
 
3
3
  /**
4
4
  * Read one vertex's value for one channel, falling back to the format's default for a channel this
5
- * geometry does not carry — which is exactly what the container does with it, since the payload
6
- * never omits a section and constant-compresses the missing ones to the same values.
5
+ * geometry does not carry.
6
+ *
7
+ * These are the **unencoded** defaults, for a caller that is going to encode what it reads.
8
+ * `vgeo_encode_cluster_payload` never reaches them: a channel the geometry lacks takes its
9
+ * `ENCODED_DEFAULTS` path instead, which emits Shade's encoded constant directly. The two are not
10
+ * everywhere the same value — colour's encoded default carries an alpha byte that
11
+ * `encode_colors_to_u32` does not write — so which of the two a caller wants is a real question,
12
+ * and the answer is: this one only when the value is about to be encoded from scratch.
7
13
  *
8
14
  * @param {Float32Array|number[]} target
9
15
  * @param {number} target_offset
@@ -49,6 +49,18 @@ export class VirtualGeometryCluster {
49
49
  * @type {VirtualGeometryGroup|undefined}
50
50
  */
51
51
  child_group: VirtualGeometryGroup | undefined;
52
+ /**
53
+ * Index of this cluster within its page's cluster table, assigned at write time.
54
+ *
55
+ * A cluster is named from two directions and the second one is why this exists: its own page
56
+ * addresses it by position, and every group it refines into names it back through the
57
+ * group-parent table (format §6.3). The count that table is sized by is a property of the
58
+ * *other* page, so the number has to be resolved once across the whole page set rather than
59
+ * rediscovered while a page is being written.
60
+ *
61
+ * @type {number}
62
+ */
63
+ index_in_page: number;
52
64
  /**
53
65
  * @type {number}
54
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"VirtualGeometryCluster.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,aAFU,YAAY,CAEY;IAElC;;;OAGG;IACH,YAFU,MAAM,CAED;IAEf;;;;OAIG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,cAFU,MAAM,CAEwB;IAExC;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,MAFU,YAAY,CAEK;IAE3B;;;;OAIG;IACH,aAFU,uBAAqB,SAAS,CAEhB;IAExB;;OAEG;IACH,cAFU,MAAM,CAEC;IAEjB;;OAEG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,SAFU,UAAU,CAEQ;CAC/B"}
1
+ {"version":3,"file":"VirtualGeometryCluster.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;OAIG;IACH,aAFU,YAAY,CAEY;IAElC;;;OAGG;IACH,YAFU,MAAM,CAED;IAEf;;;;OAIG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,cAFU,MAAM,CAEwB;IAExC;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,MAFU,YAAY,CAEK;IAE3B;;;;OAIG;IACH,aAFU,uBAAqB,SAAS,CAEhB;IAExB;;;;;;;;;;OAUG;IACH,eAFU,MAAM,CAEE;IAElB;;OAEG;IACH,cAFU,MAAM,CAEC;IAEjB;;OAEG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,gBAFU,MAAM,CAEG;IAEnB;;;OAGG;IACH,SAFU,UAAU,CAEQ;CAC/B"}
@@ -57,6 +57,19 @@ export class VirtualGeometryCluster {
57
57
  */
58
58
  child_group = undefined;
59
59
 
60
+ /**
61
+ * Index of this cluster within its page's cluster table, assigned at write time.
62
+ *
63
+ * A cluster is named from two directions and the second one is why this exists: its own page
64
+ * addresses it by position, and every group it refines into names it back through the
65
+ * group-parent table (format §6.3). The count that table is sized by is a property of the
66
+ * *other* page, so the number has to be resolved once across the whole page set rather than
67
+ * rediscovered while a page is being written.
68
+ *
69
+ * @type {number}
70
+ */
71
+ index_in_page = 0;
72
+
60
73
  /**
61
74
  * @type {number}
62
75
  */
@@ -12,13 +12,20 @@
12
12
  * header's `decoded_size` is what {@link vgeo_decode_frame_blob} decodes against, and the frame's
13
13
  * checksum is what proves the stored bytes arrived intact.
14
14
  *
15
+ * The level is how hard the encoder looks for matches, and nothing else: every level writes the
16
+ * same LZ4 block format, so it is a build-time decision with no reader consequence at all. What it
17
+ * buys on a page of encoded geometry is about 2.5% over the fast encoder, almost all of which is
18
+ * already there at level 3; what it costs is roughly an order of magnitude of encoder throughput,
19
+ * which over a whole conversion comes to a couple of percent of the build.
20
+ *
15
21
  * @param {Uint8Array} bytes the decoded page
16
22
  * @param {number} codec the codec to attempt, one of {@link VGEO_CODEC_RAW} or {@link VGEO_CODEC_LZ4}
23
+ * @param {number} [level] how hard to look, one of {@link LZ4_LEVEL}'s; the raw codec ignores it
17
24
  * @returns {VGeoFrameBlob}
18
25
  *
19
26
  * @author Alex Goldring
20
27
  * @copyright Company Named Limited (c) 2026
21
28
  */
22
- export function vgeo_encode_frame_blob(bytes: Uint8Array, codec: number): VGeoFrameBlob;
29
+ export function vgeo_encode_frame_blob(bytes: Uint8Array, codec: number, level?: number): VGeoFrameBlob;
23
30
  import { VGeoFrameBlob } from "./VGeoFrameBlob.js";
24
31
  //# sourceMappingURL=vgeo_encode_frame_blob.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_encode_frame_blob.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,8CAPW,UAAU,SACV,MAAM,GACJ,aAAa,CAgCzB;8BAlD6B,oBAAoB"}
1
+ {"version":3,"file":"vgeo_encode_frame_blob.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,8CARW,UAAU,SACV,MAAM,UACN,MAAM,GACJ,aAAa,CAgCzB;8BAzD6B,oBAAoB"}
@@ -1,5 +1,6 @@
1
1
  import { assert } from "../../../../../../core/assert.js";
2
- import { lz4_compress_block } from "../../../../../../core/binary/lz4/lz4_compress_block.js";
2
+ import { LZ4_LEVEL } from "../../../../../../core/binary/lz4/LZ4_LEVEL.js";
3
+ import { lz4_compress_block_at_level } from "../../../../../../core/binary/lz4/lz4_compress_block_at_level.js";
3
4
  import { lz4_compress_bound } from "../../../../../../core/binary/lz4/lz4_compress_bound.js";
4
5
  import { VGEO_CODEC_LZ4 } from "./VGEO_CODEC_LZ4.js";
5
6
  import { VGEO_CODEC_RAW } from "./VGEO_CODEC_RAW.js";
@@ -19,14 +20,21 @@ import { VGeoFrameBlob } from "./VGeoFrameBlob.js";
19
20
  * header's `decoded_size` is what {@link vgeo_decode_frame_blob} decodes against, and the frame's
20
21
  * checksum is what proves the stored bytes arrived intact.
21
22
  *
23
+ * The level is how hard the encoder looks for matches, and nothing else: every level writes the
24
+ * same LZ4 block format, so it is a build-time decision with no reader consequence at all. What it
25
+ * buys on a page of encoded geometry is about 2.5% over the fast encoder, almost all of which is
26
+ * already there at level 3; what it costs is roughly an order of magnitude of encoder throughput,
27
+ * which over a whole conversion comes to a couple of percent of the build.
28
+ *
22
29
  * @param {Uint8Array} bytes the decoded page
23
30
  * @param {number} codec the codec to attempt, one of {@link VGEO_CODEC_RAW} or {@link VGEO_CODEC_LZ4}
31
+ * @param {number} [level] how hard to look, one of {@link LZ4_LEVEL}'s; the raw codec ignores it
24
32
  * @returns {VGeoFrameBlob}
25
33
  *
26
34
  * @author Alex Goldring
27
35
  * @copyright Company Named Limited (c) 2026
28
36
  */
29
- export function vgeo_encode_frame_blob(bytes, codec) {
37
+ export function vgeo_encode_frame_blob(bytes, codec, level = LZ4_LEVEL.HC_DEFAULT) {
30
38
  assert.defined(bytes, 'bytes');
31
39
 
32
40
  const result = new VGeoFrameBlob();
@@ -42,7 +50,7 @@ export function vgeo_encode_frame_blob(bytes, codec) {
42
50
 
43
51
  const scratch = new Uint8Array(lz4_compress_bound(bytes.length));
44
52
 
45
- const end = lz4_compress_block(scratch, 0, scratch.length, bytes, 0, bytes.length);
53
+ const end = lz4_compress_block_at_level(scratch, 0, scratch.length, bytes, 0, bytes.length, level);
46
54
 
47
55
  if (end < bytes.length) {
48
56
  result.codec = VGEO_CODEC_LZ4;
@@ -1,6 +1,15 @@
1
1
  /**
2
2
  * Bumped only when the container layout itself changes. A new payload encoding is a per-asset
3
3
  * capability gate instead, so it does not move this.
4
+ *
5
+ * 4 added the parent tables (§6.3, §6.4) — the format's first upward edge. {@link
6
+ * VGEO_MIN_READER_VERSION} deliberately did **not** move with it: the tables occupy bytes that were
7
+ * reserved and written as zero, and they sit between the cluster records and the payload, so every
8
+ * offset a version-3 reader computes still lands where it did and such a reader reads a version-4
9
+ * file correctly by ignoring them. A version-4 reader meeting a version-3 file finds
10
+ * `parent_table_offset` zero and takes the same absence as "this container has no upward edge",
11
+ * which is true.
12
+ *
4
13
  * @type {number}
5
14
  */
6
15
  export const VGEO_FORMAT_VERSION: number;
@@ -1 +1 @@
1
- {"version":3,"file":"VGEO_FORMAT_VERSION.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,kCAFU,MAAM,CAEqB"}
1
+ {"version":3,"file":"VGEO_FORMAT_VERSION.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,kCAFU,MAAM,CAEqB"}
@@ -1,6 +1,15 @@
1
1
  /**
2
2
  * Bumped only when the container layout itself changes. A new payload encoding is a per-asset
3
3
  * capability gate instead, so it does not move this.
4
+ *
5
+ * 4 added the parent tables (§6.3, §6.4) — the format's first upward edge. {@link
6
+ * VGEO_MIN_READER_VERSION} deliberately did **not** move with it: the tables occupy bytes that were
7
+ * reserved and written as zero, and they sit between the cluster records and the payload, so every
8
+ * offset a version-3 reader computes still lands where it did and such a reader reads a version-4
9
+ * file correctly by ignoring them. A version-4 reader meeting a version-3 file finds
10
+ * `parent_table_offset` zero and takes the same absence as "this container has no upward edge",
11
+ * which is true.
12
+ *
4
13
  * @type {number}
5
14
  */
6
- export const VGEO_FORMAT_VERSION = 3;
15
+ export const VGEO_FORMAT_VERSION = 4;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Group record field offsets, relative to the record's own start.
3
+ *
4
+ * The record is `VGEO_GROUP_RECORD_SIZE` bytes and `VGEO_FORMAT.md` §6.2 is where the layout is
5
+ * stated; this is that statement in code, so the writer, the reader and the audit address the same
6
+ * bytes by the same names rather than each counting them out again.
7
+ */
8
+ export type VGEO_GROUP_OFFSET = number;
9
+ export namespace VGEO_GROUP_OFFSET {
10
+ let CLUSTER_FIRST: number;
11
+ let CLUSTER_COUNT: number;
12
+ let PARENT_CLUSTER_COUNT: number;
13
+ let PARENT_FIRST: number;
14
+ }
15
+ //# sourceMappingURL=VGEO_GROUP_OFFSET.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_GROUP_OFFSET.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js"],"names":[],"mappings":";;;;;;;gCAOU,MAAM"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Group record field offsets, relative to the record's own start.
3
+ *
4
+ * The record is `VGEO_GROUP_RECORD_SIZE` bytes and `VGEO_FORMAT.md` §6.2 is where the layout is
5
+ * stated; this is that statement in code, so the writer, the reader and the audit address the same
6
+ * bytes by the same names rather than each counting them out again.
7
+ *
8
+ * @enum {number}
9
+ */
10
+ export const VGEO_GROUP_OFFSET = {
11
+ CLUSTER_FIRST: 0,
12
+ CLUSTER_COUNT: 2,
13
+ PARENT_CLUSTER_COUNT: 4,
14
+ PARENT_FIRST: 6,
15
+ };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Most entries one page's group-parent table may hold, and therefore the largest `parent_first` the
3
+ * u16 in a group record can name.
4
+ *
5
+ * The cap exists because the arithmetic does not forbid overflow on its own: `parent_entry_count` is
6
+ * the sum of `parent_cluster_count` over a page's groups and `group_count` is itself a u16, so a
7
+ * dense enough page could in principle run past what `parent_first` can index. `child_ref` has no
8
+ * such problem — it indexes distinct child *pages*.
9
+ *
10
+ * It is a cap rather than a wider field because the measured distance is not close. Across 8,899
11
+ * pages of 30 converted Zorah containers the worst page carries **26** parent entries against a mean
12
+ * of 17.4, and the most parents any one group has is 5 — so this bound stands 2,521x above the worst
13
+ * real page, and paying a u32 for it would cost the group record its 8-byte size.
14
+ *
15
+ * @type {number}
16
+ */
17
+ export const VGEO_MAX_PARENT_ENTRY_COUNT: number;
18
+ //# sourceMappingURL=VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_MAX_PARENT_ENTRY_COUNT.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,0CAFU,MAAM,CAEkC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Most entries one page's group-parent table may hold, and therefore the largest `parent_first` the
3
+ * u16 in a group record can name.
4
+ *
5
+ * The cap exists because the arithmetic does not forbid overflow on its own: `parent_entry_count` is
6
+ * the sum of `parent_cluster_count` over a page's groups and `group_count` is itself a u16, so a
7
+ * dense enough page could in principle run past what `parent_first` can index. `child_ref` has no
8
+ * such problem — it indexes distinct child *pages*.
9
+ *
10
+ * It is a cap rather than a wider field because the measured distance is not close. Across 8,899
11
+ * pages of 30 converted Zorah containers the worst page carries **26** parent entries against a mean
12
+ * of 17.4, and the most parents any one group has is 5 — so this bound stands 2,521x above the worst
13
+ * real page, and paying a u32 for it would cost the group record its 8-byte size.
14
+ *
15
+ * @type {number}
16
+ */
17
+ export const VGEO_MAX_PARENT_ENTRY_COUNT = 0xFFFF;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Largest legal parent-page-table index, one below {@link VGEO_SAME_PAGE}, which a parent reference
3
+ * spends the same sentinel on that a child reference does.
4
+ *
5
+ * @type {number}
6
+ */
7
+ export const VGEO_MAX_PARENT_REF: number;
8
+ //# sourceMappingURL=VGEO_MAX_PARENT_REF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_MAX_PARENT_REF.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,kCAFU,MAAM,CAE0B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Largest legal parent-page-table index, one below {@link VGEO_SAME_PAGE}, which a parent reference
3
+ * spends the same sentinel on that a child reference does.
4
+ *
5
+ * @type {number}
6
+ */
7
+ export const VGEO_MAX_PARENT_REF = 0xFFFD;
@@ -12,6 +12,9 @@ export namespace VGEO_PAGE_OFFSET {
12
12
  let PAYLOAD_OFFSET: number;
13
13
  let PAYLOAD_SIZE: number;
14
14
  let NODE_TABLE_OFFSET: number;
15
+ let PARENT_TABLE_OFFSET: number;
16
+ let PARENT_ENTRY_COUNT: number;
17
+ let PARENT_PAGE_COUNT: number;
15
18
  let METRIC: number;
16
19
  }
17
20
  //# sourceMappingURL=VGEO_PAGE_OFFSET.d.ts.map
@@ -12,5 +12,21 @@ export const VGEO_PAGE_OFFSET = {
12
12
  PAYLOAD_OFFSET: 12,
13
13
  PAYLOAD_SIZE: 16,
14
14
  NODE_TABLE_OFFSET: 20,
15
+ /**
16
+ * Start of this page's parent section, which is the parent-page table immediately followed by
17
+ * the group-parent table. Zero means the page carries neither, which is what every container
18
+ * written before `format_version` 4 says: those bytes were reserved and written as zero, so the
19
+ * absence is self-describing and no version test is needed to read it.
20
+ */
21
+ PARENT_TABLE_OFFSET: 24,
22
+ /**
23
+ * Entries in the group-parent table — the sum of `parent_cluster_count` over this page's
24
+ * groups, and the bound every `parent_first` plus its count must stay within.
25
+ */
26
+ PARENT_ENTRY_COUNT: 28,
27
+ /**
28
+ * Entries in the parent-page table, which the group-parent table's `parent_ref` indexes.
29
+ */
30
+ PARENT_PAGE_COUNT: 30,
15
31
  METRIC: 32,
16
32
  };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Bytes of one entry in a decoded page's group-parent table: `parent_ref u16`, then
3
+ * `parent_cluster u16`.
4
+ *
5
+ * Four rather than the child table's 48, because the two references are not symmetric. A child
6
+ * reference has to carry a fetch range and a metric, since the child may be absent and the decision
7
+ * to fetch it is made before it arrives. A parent of a group in the cut is resident already —
8
+ * `VGEO_GROUP_FLAG_SELECTABLE` is exactly "every parent reference is live" — so a parent reference
9
+ * has nothing to decide and needs only to say where.
10
+ *
11
+ * @type {number}
12
+ */
13
+ export const VGEO_PARENT_ENTRY_SIZE: number;
14
+ //# sourceMappingURL=VGEO_PARENT_ENTRY_SIZE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_PARENT_ENTRY_SIZE.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,qCAFU,MAAM,CAEwB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Bytes of one entry in a decoded page's group-parent table: `parent_ref u16`, then
3
+ * `parent_cluster u16`.
4
+ *
5
+ * Four rather than the child table's 48, because the two references are not symmetric. A child
6
+ * reference has to carry a fetch range and a metric, since the child may be absent and the decision
7
+ * to fetch it is made before it arrives. A parent of a group in the cut is resident already —
8
+ * `VGEO_GROUP_FLAG_SELECTABLE` is exactly "every parent reference is live" — so a parent reference
9
+ * has nothing to decide and needs only to say where.
10
+ *
11
+ * @type {number}
12
+ */
13
+ export const VGEO_PARENT_ENTRY_SIZE = 4;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Bytes of one entry in a decoded page's parent-page table: `page_index u32`, the global frame
3
+ * ordinal of a page holding a parent of one of this page's groups.
4
+ *
5
+ * Deduplicated, so the group-parent table's `parent_ref` is an index into this and a page named by
6
+ * several groups is stored once — the same shape the child table has, for the same reason.
7
+ *
8
+ * @type {number}
9
+ */
10
+ export const VGEO_PARENT_PAGE_ENTRY_SIZE: number;
11
+ //# sourceMappingURL=VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,0CAFU,MAAM,CAE6B"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Bytes of one entry in a decoded page's parent-page table: `page_index u32`, the global frame
3
+ * ordinal of a page holding a parent of one of this page's groups.
4
+ *
5
+ * Deduplicated, so the group-parent table's `parent_ref` is an index into this and a page named by
6
+ * several groups is stored once — the same shape the child table has, for the same reason.
7
+ *
8
+ * @type {number}
9
+ */
10
+ export const VGEO_PARENT_PAGE_ENTRY_SIZE = 4;
@@ -7,5 +7,33 @@
7
7
  * @returns {VGeoEncodedPayload}
8
8
  */
9
9
  export function vgeo_encode_cluster_payload(positions: Float32Array, indices: Uint8Array, vertex_ids: Uint32Array, layers: (BinaryDataLayer | null)[]): VGeoEncodedPayload;
10
+ /**
11
+ * Encode one cluster's geometry into a `SHADE_MESHLET_V1` payload: the local index section, then
12
+ * every attribute section in the frozen order, each either one value per vertex or — when every
13
+ * vertex agrees, or the source simply lacks the attribute — a single constant-compressed value.
14
+ *
15
+ * The encoders themselves are Shade's, unmodified. That is the whole point of the encoding's
16
+ * "byte-compatible with the data pool" claim: uploading a payload is a copy, so it has to be the
17
+ * same bits Shade's own encoder would have produced.
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+ /**
23
+ * The encoded word a section carries when the source lacks the attribute — Shade's
24
+ * `ENCODED_ATTRIBUTE_DEFAULT_VALUES`, in this format's own attribute order, so that a `.vgeo`
25
+ * payload and a `MeshletBatch` payload of the same geometry differ nowhere.
26
+ *
27
+ * Colour's default is opaque white with its alpha byte set, while `encode_colors_to_u32` writes only
28
+ * three channels and leaves alpha zero. That asymmetry is Shade's, and matching it is the point.
29
+ *
30
+ * Exported so that `vgeo_encode_cluster_payload.spec.js` can hold it against Shade's own table
31
+ * rather than against nothing — it is the fourth of the four tables the byte-compatibility claim
32
+ * rests on, and was for a long time the only one no test compared.
33
+ *
34
+ * @readonly
35
+ * @type {number[][]}
36
+ */
37
+ export const ENCODED_DEFAULTS: number[][];
10
38
  import { VGeoEncodedPayload } from "./VGeoEncodedPayload.js";
11
39
  //# sourceMappingURL=vgeo_encode_cluster_payload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_encode_cluster_payload.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js"],"names":[],"mappings":"AAgHA;;;;;;;GAOG;AACH,uDAPW,YAAY,WACZ,UAAU,cACV,WAAW,UACX,CAAC,kBAAgB,IAAI,CAAC,EAAE,GAEtB,kBAAkB,CAiF9B;mCA1LkC,yBAAyB"}
1
+ {"version":3,"file":"vgeo_encode_cluster_payload.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js"],"names":[],"mappings":"AAoHA;;;;;;;GAOG;AACH,uDAPW,YAAY,WACZ,UAAU,cACV,WAAW,UACX,CAAC,kBAAgB,IAAI,CAAC,EAAE,GAEtB,kBAAkB,CAiF9B;AA5LD;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;GAcG;AACH,+BAFU,MAAM,EAAE,EAAE,CAEe;mCA9BA,yBAAyB"}
@@ -28,16 +28,20 @@ import { VGeoEncodedPayload } from "./VGeoEncodedPayload.js";
28
28
 
29
29
  /**
30
30
  * The encoded word a section carries when the source lacks the attribute — Shade's
31
- * `ENCODED_ATTRIBUTE_DEFAULT_VALUES`, reproduced so that a `.vgeo` payload and a `MeshletBatch`
32
- * payload of the same geometry differ nowhere.
31
+ * `ENCODED_ATTRIBUTE_DEFAULT_VALUES`, in this format's own attribute order, so that a `.vgeo`
32
+ * payload and a `MeshletBatch` payload of the same geometry differ nowhere.
33
33
  *
34
34
  * Colour's default is opaque white with its alpha byte set, while `encode_colors_to_u32` writes only
35
35
  * three channels and leaves alpha zero. That asymmetry is Shade's, and matching it is the point.
36
36
  *
37
+ * Exported so that `vgeo_encode_cluster_payload.spec.js` can hold it against Shade's own table
38
+ * rather than against nothing — it is the fourth of the four tables the byte-compatibility claim
39
+ * rests on, and was for a long time the only one no test compared.
40
+ *
37
41
  * @readonly
38
42
  * @type {number[][]}
39
43
  */
40
- const ENCODED_DEFAULTS = [];
44
+ export const ENCODED_DEFAULTS = [];
41
45
 
42
46
  {
43
47
  const normal = new Uint32Array(1);
@@ -82,6 +82,26 @@ export class VGeoByteSource {
82
82
  * @type {number}
83
83
  */
84
84
  bytes_read: number;
85
+ /**
86
+ * What another thread needs to open this source again: a URL with its length, a Blob, or the
87
+ * bytes. Set by the three constructors below and by `vgeo_fetch_byte_source`; `undefined` for
88
+ * a source built by hand, which then stays on the thread that built it.
89
+ *
90
+ * @type {{kind: 'url', url: string, byte_length: number, init?: object}
91
+ * | {kind: 'blob', blob: Blob} | {kind: 'memory', bytes: Uint8Array} | undefined}
92
+ */
93
+ descriptor: {
94
+ kind: 'url';
95
+ url: string;
96
+ byte_length: number;
97
+ init?: object;
98
+ } | {
99
+ kind: 'blob';
100
+ blob: Blob;
101
+ } | {
102
+ kind: 'memory';
103
+ bytes: Uint8Array;
104
+ } | undefined;
85
105
  /**
86
106
  * @returns {string}
87
107
  */
@@ -1 +1 @@
1
- {"version":3,"file":"VGeoByteSource.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IA8GI;;;;;;;;;;OAUG;IACH,iBAJW,UAAU,GAAC,WAAW,SACtB,MAAM,GACJ,cAAc,CAU1B;IAED;;;;;;;;;;;;;;;OAeG;IACH,uBAJW,IAAI,SACJ,MAAM,GACJ,cAAc,CAU1B;IA5HD;;;;;;OAMG;IACH,yBANW,MAAM,eACG,MAAM,QAAE,MAAM,QAAE,WAAW,iBAAI,QAAQ,UAAU,CAAC,SAG3D,MAAM,EAUhB;IA7CD;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,eAFU,MAAM,CAEE;IAElB;;;;OAIG;IACH,YAFU,MAAM,CAED;IA8Bf;;OAEG;IACH,mBAEC;IAED;;;;;OAKG;IACH,uBAGC;IAED;;;;;;;OAOG;IACH,kBAPW,MAAM,eACN,MAAM,WACN,WAAW,GACT,QAAQ,UAAU,CAAC,CAsC/B;;CAgDJ"}
1
+ {"version":3,"file":"VGeoByteSource.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IAwHI;;;;;;;;;;OAUG;IACH,iBAJW,UAAU,GAAC,WAAW,SACtB,MAAM,GACJ,cAAc,CAc1B;IAED;;;;;;;;;;;;;;;OAeG;IACH,uBAJW,IAAI,SACJ,MAAM,GACJ,cAAc,CAc1B;IApID;;;;;;OAMG;IACH,yBANW,MAAM,eACG,MAAM,QAAE,MAAM,QAAE,WAAW,iBAAI,QAAQ,UAAU,CAAC,SAG3D,MAAM,EAUhB;IAvDD;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,eAFU,MAAM,CAEE;IAElB;;;;OAIG;IACH,YAFU,MAAM,CAED;IAEf;;;;;;;OAOG;IACH,YAHU;QAAC,IAAI,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAC,GAC/D;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAC,GAAG;QAAC,IAAI,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAC,GAAG,SAAS,CAE9D;IA8BvB;;OAEG;IACH,mBAEC;IAED;;;;;OAKG;IACH,uBAGC;IAED;;;;;;;OAOG;IACH,kBAPW,MAAM,eACN,MAAM,WACN,WAAW,GACT,QAAQ,UAAU,CAAC,CAsC/B;;CAwDJ"}
@@ -50,6 +50,16 @@ export class VGeoByteSource {
50
50
  */
51
51
  bytes_read = 0;
52
52
 
53
+ /**
54
+ * What another thread needs to open this source again: a URL with its length, a Blob, or the
55
+ * bytes. Set by the three constructors below and by `vgeo_fetch_byte_source`; `undefined` for
56
+ * a source built by hand, which then stays on the thread that built it.
57
+ *
58
+ * @type {{kind: 'url', url: string, byte_length: number, init?: object}
59
+ * | {kind: 'blob', blob: Blob} | {kind: 'memory', bytes: Uint8Array} | undefined}
60
+ */
61
+ descriptor = undefined;
62
+
53
63
  /**
54
64
  * @type {function(number, number, AbortSignal=): Promise<Uint8Array>}
55
65
  */
@@ -154,11 +164,15 @@ export class VGeoByteSource {
154
164
  static of(bytes, name = 'a buffer in memory') {
155
165
  const array = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
156
166
 
157
- return new VGeoByteSource(
167
+ const source = new VGeoByteSource(
158
168
  array.byteLength,
159
169
  async (offset, length) => array.subarray(offset, offset + length),
160
170
  name
161
171
  );
172
+
173
+ source.descriptor = { kind: 'memory', bytes: array };
174
+
175
+ return source;
162
176
  }
163
177
 
164
178
  /**
@@ -178,12 +192,16 @@ export class VGeoByteSource {
178
192
  * @returns {VGeoByteSource}
179
193
  */
180
194
  static from_blob(blob, name = blob.name ?? 'a blob') {
181
- return new VGeoByteSource(
195
+ const source = new VGeoByteSource(
182
196
  blob.size,
183
197
  async (offset, length) => new Uint8Array(
184
198
  await blob.slice(offset, offset + length).arrayBuffer()
185
199
  ),
186
200
  name
187
201
  );
202
+
203
+ source.descriptor = { kind: 'blob', blob };
204
+
205
+ return source;
188
206
  }
189
207
  }