@woosh/meep-engine 3.28.0 → 3.29.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 (482) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/binary/BitSet.d.ts +16 -0
  4. package/src/core/binary/BitSet.d.ts.map +1 -1
  5. package/src/core/binary/BitSet.js +159 -49
  6. package/src/core/binary/allocator/OffsetAllocator.d.ts +48 -0
  7. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  8. package/src/core/binary/allocator/OffsetAllocator.js +208 -9
  9. package/src/core/binary/compression/compress_bytes.d.ts +20 -0
  10. package/src/core/binary/compression/compress_bytes.d.ts.map +1 -0
  11. package/src/core/binary/compression/compress_bytes.js +35 -0
  12. package/src/core/binary/compression/decompress_bytes_into.d.ts +30 -0
  13. package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -0
  14. package/src/core/binary/compression/decompress_bytes_into.js +87 -0
  15. package/src/core/binary/compression/deflate_decompress_bound.d.ts +27 -0
  16. package/src/core/binary/compression/deflate_decompress_bound.d.ts.map +1 -0
  17. package/src/core/binary/compression/deflate_decompress_bound.js +32 -0
  18. package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts +24 -0
  19. package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts.map +1 -0
  20. package/src/core/geom/3d/quadric/quadric_attribute_add.js +31 -0
  21. package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts +46 -0
  22. package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts.map +1 -0
  23. package/src/core/geom/3d/quadric/quadric_attribute_reduce.js +104 -0
  24. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts +62 -0
  25. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts.map +1 -0
  26. package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js +158 -0
  27. package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts +21 -0
  28. package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts.map +1 -0
  29. package/src/core/geom/3d/quadric/quadric_attribute_size.js +24 -0
  30. package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts +34 -0
  31. package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts.map +1 -0
  32. package/src/core/geom/3d/quadric/quadric_attribute_solve.js +55 -0
  33. package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts +28 -0
  34. package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts.map +1 -0
  35. package/src/core/geom/3d/quadric/quadric_attribute_sub.js +35 -0
  36. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts +15 -0
  37. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts.map +1 -1
  38. package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +35 -0
  39. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts +93 -0
  40. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts.map +1 -0
  41. package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.js +128 -0
  42. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts +38 -0
  43. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -0
  44. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +113 -0
  45. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +47 -1
  46. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  47. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +677 -8
  48. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts +22 -0
  49. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts.map +1 -0
  50. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.js +46 -0
  51. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts +19 -0
  52. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts.map +1 -0
  53. package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.js +49 -0
  54. package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts +63 -0
  55. package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts.map +1 -0
  56. package/src/core/graph/layout/layered/BoxLayoutOptions.js +80 -0
  57. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.d.ts +35 -0
  58. package/src/core/graph/layout/layered/LayoutBoxGraph.d.ts.map +1 -0
  59. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.js +53 -1
  60. package/src/core/graph/layout/layered/layout_assign_coordinates.d.ts.map +1 -0
  61. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.js +72 -68
  62. package/src/core/graph/layout/layered/layout_assign_layers.d.ts.map +1 -0
  63. package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.js +4 -2
  64. package/src/core/graph/layout/layered/layout_break_cycles.d.ts.map +1 -0
  65. package/src/core/graph/layout/layered/layout_insert_lanes.d.ts.map +1 -0
  66. package/src/core/graph/layout/layered/layout_order_layers.d.ts.map +1 -0
  67. package/src/core/graph/layout/layered/layout_orient_links.d.ts.map +1 -0
  68. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +7 -51
  69. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
  70. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +8 -69
  71. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +1 -1
  72. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +6 -6
  73. package/src/core/model/node-graph/visual/layout/route_grid_build.js +1 -1
  74. package/src/engine/graphics3/DebugDrawSystem.d.ts +7 -5
  75. package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
  76. package/src/engine/graphics3/DebugDrawSystem.js +206 -203
  77. package/src/engine/graphics3/DecalSystem.d.ts +4 -5
  78. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  79. package/src/engine/graphics3/DecalSystem.js +5 -5
  80. package/src/engine/graphics3/FogOfWarSystem.d.ts +7 -12
  81. package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -1
  82. package/src/engine/graphics3/FogOfWarSystem.js +8 -12
  83. package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
  84. package/src/shade/RENDERER_CONTRACT.md +12 -7
  85. package/src/shade/playground/caldera/README.md +529 -0
  86. package/src/shade/playground/caldera/caldera_format.d.ts +151 -0
  87. package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -0
  88. package/src/shade/playground/caldera/caldera_format.js +241 -0
  89. package/src/shade/playground/caldera/index.html +126 -0
  90. package/src/shade/playground/caldera/main.d.ts.map +1 -0
  91. package/src/shade/playground/caldera/main.js +1565 -0
  92. package/src/shade/playground/mesh_row_ceiling/README.md +85 -0
  93. package/src/shade/playground/mesh_row_ceiling/index.html +31 -0
  94. package/src/shade/playground/mesh_row_ceiling/main.d.ts +2 -0
  95. package/src/shade/playground/mesh_row_ceiling/main.d.ts.map +1 -0
  96. package/src/shade/playground/mesh_row_ceiling/main.js +389 -0
  97. package/src/shade/playground/vgeo_runtime/README.md +5 -3
  98. package/src/shade/playground/vgeo_runtime/main.js +3 -2
  99. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +3 -3
  100. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -1
  101. package/src/shade/playground/vgeo_runtime/sample_asset.js +3 -3
  102. package/src/shade/playground/vgeo_scene/README.md +103 -24
  103. package/src/shade/playground/vgeo_scene/main.js +525 -24
  104. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  105. package/src/shade/renderer/GraphicsContext.js +6 -0
  106. package/src/shade/renderer/Renderer.d.ts +2 -0
  107. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  108. package/src/shade/renderer/Renderer.js +23 -0
  109. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
  110. package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +100 -8
  111. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +69 -33
  112. package/src/shade/renderer/extension/RenderExtension.d.ts +15 -18
  113. package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
  114. package/src/shade/renderer/extension/RenderExtension.js +15 -19
  115. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +5 -5
  116. package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
  117. package/src/shade/renderer/extension/RenderExtensionRegistry.js +29 -166
  118. package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
  119. package/src/shade/renderer/geometry/GPUGeometryManager.js +73 -16
  120. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  121. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -3
  122. package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +663 -0
  123. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +100 -5
  124. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  125. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +688 -81
  126. package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
  127. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +155 -64
  128. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +30 -13
  129. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +3 -3
  130. package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
  131. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +57 -7
  132. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  133. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +63 -9
  134. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts +40 -0
  135. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts.map +1 -0
  136. package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.js +24 -0
  137. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +91 -0
  138. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -0
  139. package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +91 -0
  140. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts +24 -0
  141. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts.map +1 -0
  142. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.js +25 -0
  143. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +77 -0
  144. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -0
  145. package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +84 -0
  146. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +19 -6
  147. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -1
  148. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js +20 -7
  149. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts +19 -0
  150. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts.map +1 -0
  151. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.js +58 -0
  152. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts +18 -0
  153. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts.map +1 -0
  154. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.js +116 -0
  155. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts +18 -0
  156. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -0
  157. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +545 -0
  158. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts +16 -0
  159. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -0
  160. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +110 -0
  161. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +2 -27
  162. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
  163. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +120 -1564
  164. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts +26 -0
  165. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts.map +1 -0
  166. package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.js +123 -0
  167. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts +26 -0
  168. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts.map +1 -0
  169. package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.js +78 -0
  170. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts +24 -0
  171. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -0
  172. package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +337 -0
  173. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts +29 -0
  174. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -0
  175. package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +147 -0
  176. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts +37 -0
  177. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts.map +1 -0
  178. package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js +243 -0
  179. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts +29 -0
  180. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -0
  181. package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +117 -0
  182. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +46 -0
  183. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +1 -0
  184. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +45 -0
  185. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +64 -0
  186. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -0
  187. package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +68 -0
  188. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +12 -7
  189. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -1
  190. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.js +33 -11
  191. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts +58 -0
  192. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts.map +1 -0
  193. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.js +79 -0
  194. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts +39 -0
  195. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts.map +1 -0
  196. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.js +68 -0
  197. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts +53 -0
  198. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts.map +1 -0
  199. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.js +243 -0
  200. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +24 -8
  201. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
  202. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +250 -25
  203. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +12 -8
  204. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -1
  205. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +58 -50
  206. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +8 -1
  207. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
  208. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +18 -3
  209. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts +38 -0
  210. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts.map +1 -0
  211. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js +81 -0
  212. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +23 -5
  213. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -1
  214. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js +28 -21
  215. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.js +1 -1
  216. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
  217. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +224 -60
  218. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +15 -0
  219. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -1
  220. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +17 -0
  221. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +17 -0
  222. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -1
  223. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +19 -0
  224. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +10 -1
  225. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -1
  226. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +103 -9
  227. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +14 -2
  228. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -1
  229. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +38 -14
  230. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts +6 -2
  231. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  232. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +28 -5
  233. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts +32 -0
  234. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts.map +1 -0
  235. package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js +93 -0
  236. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +20 -6
  237. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  238. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +22 -8
  239. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts +16 -0
  240. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts.map +1 -0
  241. package/src/shade/renderer/geometry/virtual/format/attribute/{vgeo_layers_copy_vertex.js → vgeo_layers_copy_corner.js} +8 -8
  242. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts +18 -7
  243. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts.map +1 -1
  244. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +19 -8
  245. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.d.ts +3 -3
  246. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +3 -3
  247. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts +27 -0
  248. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts.map +1 -0
  249. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.js +97 -0
  250. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts +7 -3
  251. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts.map +1 -1
  252. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +21 -11
  253. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts +21 -0
  254. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts.map +1 -0
  255. package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.js +41 -0
  256. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +19 -1
  257. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  258. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +20 -1
  259. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts +25 -0
  260. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts.map +1 -0
  261. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.js +24 -0
  262. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts +5 -0
  263. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts.map +1 -1
  264. package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +5 -0
  265. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.d.ts.map +1 -1
  266. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +5 -0
  267. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts +10 -3
  268. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts.map +1 -1
  269. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +37 -3
  270. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +21 -13
  271. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  272. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +37 -13
  273. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts +8 -2
  274. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts.map +1 -1
  275. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +14 -2
  276. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +18 -0
  277. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  278. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +19 -1
  279. package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +6 -0
  280. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts +21 -0
  281. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts.map +1 -0
  282. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.js +20 -0
  283. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts +9 -0
  284. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts.map +1 -1
  285. package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +10 -1
  286. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +1 -2
  287. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +10 -3
  288. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts +20 -0
  289. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts.map +1 -0
  290. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.js +43 -0
  291. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +4 -2
  292. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
  293. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +8 -4
  294. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  295. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +2 -2
  296. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts +6 -4
  297. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts.map +1 -1
  298. package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.js +6 -4
  299. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +13 -2
  300. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  301. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +13 -2
  302. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +5 -1
  303. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -1
  304. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +14 -1
  305. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -1
  306. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +1 -0
  307. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts +4 -1
  308. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts.map +1 -1
  309. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js +53 -11
  310. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
  311. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +7 -3
  312. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts +12 -2
  313. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  314. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +111 -33
  315. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts +6 -2
  316. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  317. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +112 -42
  318. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts +2 -2
  319. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  320. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +51 -21
  321. package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
  322. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
  323. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +9 -0
  324. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  325. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +34 -0
  326. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
  327. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +18 -0
  328. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  329. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +47 -19
  330. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +1 -0
  331. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +22 -4
  332. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +7 -2
  333. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -1
  334. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +8 -3
  335. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  336. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +10 -0
  337. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  338. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +13 -11
  339. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -1
  340. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +13 -11
  341. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  342. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +4 -0
  343. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  344. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -4
  345. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +6 -2
  346. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
  347. package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +90 -12
  348. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +22 -0
  349. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -0
  350. package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +21 -0
  351. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  352. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +13 -8
  353. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  354. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
  355. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  356. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +4 -12
  357. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
  358. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  359. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +4 -5
  360. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  361. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +5 -3
  362. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
  363. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +11 -4
  364. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  365. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -3
  366. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
  367. package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +3 -0
  368. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
  369. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +94 -90
  370. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  371. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +13 -5
  372. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
  373. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +96 -89
  374. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
  375. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +3 -1
  376. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.d.ts.map +1 -1
  377. package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.js +4 -1
  378. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +100 -89
  380. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +31 -7
  382. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +1 -7
  384. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
  385. package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +161 -153
  386. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  387. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +2 -7
  388. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  389. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +4 -8
  390. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  391. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +5 -8
  392. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +25 -0
  393. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts.map +1 -0
  394. package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +24 -0
  395. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +10 -0
  396. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
  397. package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +30 -21
  398. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +0 -1
  399. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +0 -1
  400. package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +0 -1
  401. package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +0 -1
  402. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +0 -1
  403. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +0 -1
  404. package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +0 -1
  405. package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts +0 -61
  406. package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts.map +0 -1
  407. package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
  408. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts +0 -18
  409. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +0 -1
  410. package/src/shade/playground/vgeo_viewer/select_cut.d.ts +0 -173
  411. package/src/shade/playground/vgeo_viewer/select_cut.d.ts.map +0 -1
  412. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts +0 -52
  413. package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts.map +0 -1
  414. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts +0 -24
  415. package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts.map +0 -1
  416. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts +0 -32
  417. package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
  418. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts +0 -59
  419. package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
  420. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts +0 -44
  421. package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts.map +0 -1
  422. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts +0 -20
  423. package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts.map +0 -1
  424. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts +0 -73
  425. package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts.map +0 -1
  426. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +0 -13
  427. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +0 -1
  428. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts +0 -12
  429. package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts.map +0 -1
  430. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts +0 -36
  431. package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts.map +0 -1
  432. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts +0 -13
  433. package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts.map +0 -1
  434. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts +0 -19
  435. package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts.map +0 -1
  436. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts +0 -29
  437. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts.map +0 -1
  438. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts +0 -31
  439. package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
  440. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts +0 -18
  441. package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts.map +0 -1
  442. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts +0 -14
  443. package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts.map +0 -1
  444. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts +0 -12
  445. package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts.map +0 -1
  446. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts +0 -14
  447. package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts.map +0 -1
  448. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts +0 -11
  449. package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts.map +0 -1
  450. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts +0 -46
  451. package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts.map +0 -1
  452. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +0 -22
  453. package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +0 -1
  454. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts +0 -29
  455. package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts.map +0 -1
  456. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts +0 -9
  457. package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts.map +0 -1
  458. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts +0 -10
  459. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts.map +0 -1
  460. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts +0 -15
  461. package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts.map +0 -1
  462. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts +0 -16
  463. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts.map +0 -1
  464. package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts +0 -10
  465. package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts.map +0 -1
  466. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts +0 -17
  467. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts.map +0 -1
  468. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts +0 -3
  469. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts.map +0 -1
  470. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts +0 -8
  471. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +0 -1
  472. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.d.ts +0 -0
  473. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.d.ts +0 -0
  474. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.d.ts +0 -0
  475. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.js +0 -0
  476. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.d.ts +0 -0
  477. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.js +0 -0
  478. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.d.ts +0 -0
  479. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.js +0 -0
  480. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.d.ts +0 -0
  481. /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.js +0 -0
  482. /package/src/shade/playground/{vgeo_viewer → caldera}/main.d.ts +0 -0
@@ -44,13 +44,17 @@ export class VGeoPageFetcherCore {
44
44
  * @param {bigint|function(): bigint} options.asset_id_low64 what frames are checksummed against;
45
45
  * a function when the header is read after construction
46
46
  * @param {boolean} [options.verify_frames]
47
+ * @param {number|function(): number} [options.format_version] the container's, which decides
48
+ * how a cluster record is laid out (§7); a function when the header is read after
49
+ * construction, as with `asset_id_low64`. A worker is told it with the descriptor.
47
50
  * @param {number} [options.fetch_retries] attempts after the first
48
51
  * @param {number} [options.fetch_retry_backoff_ms] doubled per attempt
49
52
  */
50
- constructor({ read, asset_id_low64, verify_frames, fetch_retries, fetch_retry_backoff_ms, }: {
53
+ constructor({ read, asset_id_low64, verify_frames, format_version, fetch_retries, fetch_retry_backoff_ms, }: {
51
54
  read: (arg0: number, arg1: number, arg2: AbortSignal | undefined) => Promise<Uint8Array>;
52
55
  asset_id_low64: bigint | (() => bigint);
53
56
  verify_frames?: boolean;
57
+ format_version?: number | (() => number);
54
58
  fetch_retries?: number;
55
59
  fetch_retry_backoff_ms?: number;
56
60
  });
@@ -1 +1 @@
1
- {"version":3,"file":"VGeoPageFetcherCore.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH;IAYI;;;;OAIG;IACH,qBAJW,MAAM,cACN,OAAO,UACP,MAAM,EAQhB;IAtBD;;OAEG;IACH,YAFU,OAAO,CAEN;IAEX;;;OAGG;IACH,QAFU,MAAM,CAET;CAcV;AAED;;;;;;;;;;;;;GAaG;AACH;IA0BI;;;;;;;;;OASG;IACH;QARgF,IAAI,SAAhE,MAAM,QAAE,MAAM,QAAE,WAAW,iBAAI,QAAQ,UAAU,CAAC;QAExB,cAAc,EAAjD,MAAM,UAAa,MAAM,CAAA;QAEP,aAAa,GAA/B,OAAO;QACU,aAAa,GAA9B,MAAM;QACW,sBAAsB,GAAvC,MAAM;OAkBhB;IAED;;;;;;;OAOG;IACH,kBAPW,MAAM,gBACN,MAAM,cACN,MAAM,WACN,WAAW,GACT,QAAQ,QAAQ,CAAC,CA4B7B;;CAuDJ;uBAlMY,OAAO,eAAe,EAAE,QAAQ"}
1
+ {"version":3,"file":"VGeoPageFetcherCore.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH;IAYI;;;;OAIG;IACH,qBAJW,MAAM,cACN,OAAO,UACP,MAAM,EAQhB;IAtBD;;OAEG;IACH,YAFU,OAAO,CAEN;IAEX;;;OAGG;IACH,QAFU,MAAM,CAET;CAcV;AAED;;;;;;;;;;;;;GAaG;AACH;IA+BI;;;;;;;;;;;;OAYG;IACH;QAXgF,IAAI,SAAhE,MAAM,QAAE,MAAM,QAAE,WAAW,iBAAI,QAAQ,UAAU,CAAC;QAExB,cAAc,EAAjD,MAAM,UAAa,MAAM,CAAA;QAEP,aAAa,GAA/B,OAAO;QAC6B,cAAc,GAAlD,MAAM,UAAa,MAAM,CAAA;QAGR,aAAa,GAA9B,MAAM;QACW,sBAAsB,GAAvC,MAAM;OAoBhB;IAED;;;;;;;OAOG;IACH,kBAPW,MAAM,gBACN,MAAM,cACN,MAAM,WACN,WAAW,GACT,QAAQ,QAAQ,CAAC,CA4B7B;;CAyDJ;uBA9MY,OAAO,eAAe,EAAE,QAAQ"}
@@ -1,6 +1,7 @@
1
1
  import { assert } from "../../../../../../core/assert.js";
2
2
  import { BinaryBuffer } from "../../../../../../core/binary/BinaryBuffer.js";
3
3
  import { vgeo_compute_frame_checksum } from "../checksum/vgeo_compute_frame_checksum.js";
4
+ import { VGEO_FORMAT_VERSION } from "../header/VGEO_FORMAT_VERSION.js";
4
5
  import { VGEO_FRAME_OFFSET } from "../frame/VGEO_FRAME_OFFSET.js";
5
6
  import { vgeo_read_frame_extent } from "../frame/vgeo_read_frame_extent.js";
6
7
  import { vgeo_read_page } from "./vgeo_read_page.js";
@@ -74,6 +75,11 @@ export class VGeoPageFetcherCore {
74
75
  */
75
76
  #verify_frames;
76
77
 
78
+ /**
79
+ * @type {number|function(): number}
80
+ */
81
+ #format_version;
82
+
77
83
  /**
78
84
  * @type {number}
79
85
  */
@@ -91,6 +97,9 @@ export class VGeoPageFetcherCore {
91
97
  * @param {bigint|function(): bigint} options.asset_id_low64 what frames are checksummed against;
92
98
  * a function when the header is read after construction
93
99
  * @param {boolean} [options.verify_frames]
100
+ * @param {number|function(): number} [options.format_version] the container's, which decides
101
+ * how a cluster record is laid out (§7); a function when the header is read after
102
+ * construction, as with `asset_id_low64`. A worker is told it with the descriptor.
94
103
  * @param {number} [options.fetch_retries] attempts after the first
95
104
  * @param {number} [options.fetch_retry_backoff_ms] doubled per attempt
96
105
  */
@@ -98,6 +107,7 @@ export class VGeoPageFetcherCore {
98
107
  read,
99
108
  asset_id_low64,
100
109
  verify_frames = false,
110
+ format_version = VGEO_FORMAT_VERSION,
101
111
  fetch_retries = 2,
102
112
  fetch_retry_backoff_ms = 50,
103
113
  }) {
@@ -108,6 +118,7 @@ export class VGeoPageFetcherCore {
108
118
  this.#read = read;
109
119
  this.#asset_id_low64 = asset_id_low64;
110
120
  this.#verify_frames = verify_frames;
121
+ this.#format_version = format_version;
111
122
  this.#fetch_retries = fetch_retries;
112
123
  this.#fetch_retry_backoff_ms = fetch_retry_backoff_ms;
113
124
  }
@@ -161,7 +172,9 @@ export class VGeoPageFetcherCore {
161
172
  this.#verify_frame(bytes, page_index);
162
173
  }
163
174
 
164
- const page = vgeo_read_page(bytes, page_index);
175
+ const page = await vgeo_read_page(bytes, page_index, typeof this.#format_version === 'function'
176
+ ? this.#format_version()
177
+ : this.#format_version);
165
178
 
166
179
  page.frame_offset = frame_offset;
167
180
 
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_page_worker_serve.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AACH,6CANW;IAAC,SAAS,EAAE,WAAS,IAAI,CAAC;IAAC,WAAW,SAAW,MAAM,QAAE,WAAW,EAAE,iBAAI,IAAI,CAAA;CAAC,GAC7E,IAAI,CA+EhB"}
1
+ {"version":3,"file":"vgeo_page_worker_serve.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AACH,6CANW;IAAC,SAAS,EAAE,WAAS,IAAI,CAAC;IAAC,WAAW,SAAW,MAAM,QAAE,WAAW,EAAE,iBAAI,IAAI,CAAA;CAAC,GAC7E,IAAI,CAgFhB"}
@@ -62,6 +62,7 @@ export function vgeo_page_worker_serve(port) {
62
62
  core = new VGeoPageFetcherCore({
63
63
  read: (offset, length, signal) => source.read(offset, length, signal),
64
64
  asset_id_low64: data.asset_id_low64,
65
+ format_version: data.format_version,
65
66
  verify_frames: data.verify_frames,
66
67
  fetch_retries: data.fetch_retries,
67
68
  fetch_retry_backoff_ms: data.fetch_retry_backoff_ms,
@@ -12,12 +12,15 @@
12
12
  *
13
13
  * @param {Uint8Array} bytes the directory region, from its first byte
14
14
  * @param {number} page_count `total_pages` from the header
15
+ * @param {number} [format_version] the container header's, which decides where a record keeps
16
+ * everything from `min_level` on (§9). Defaults to the current version, which is what a caller
17
+ * holding no header should assume.
15
18
  * @returns {VGeoDirectory}
16
19
  * @throws {Error} when the bytes are shorter than the records the header says are there
17
20
  *
18
21
  * @author Alex Goldring
19
22
  * @copyright Company Named Limited (c) 2026
20
23
  */
21
- export function vgeo_read_directory(bytes: Uint8Array, page_count: number): VGeoDirectory;
24
+ export function vgeo_read_directory(bytes: Uint8Array, page_count: number, format_version?: number): VGeoDirectory;
22
25
  import { VGeoDirectory } from "./VGeoDirectory.js";
23
26
  //# sourceMappingURL=vgeo_read_directory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_read_directory.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,2CARW,UAAU,cACV,MAAM,GACJ,aAAa,CA4CzB;8BAjF6B,oBAAoB"}
1
+ {"version":3,"file":"vgeo_read_directory.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js"],"names":[],"mappings":"AAoDA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,2CAXW,UAAU,cACV,MAAM,mBACN,MAAM,GAGJ,aAAa,CAuDzB;8BA1H6B,oBAAoB"}
@@ -1,4 +1,5 @@
1
1
  import { VGEO_DIRECTORY_RECORD_SIZE } from "../directory/VGEO_DIRECTORY_RECORD_SIZE.js";
2
+ import { VGEO_FORMAT_VERSION } from "../header/VGEO_FORMAT_VERSION.js";
2
3
  import { VGeoDirectory } from "./VGeoDirectory.js";
3
4
 
4
5
  /**
@@ -12,6 +13,33 @@ const LE = true;
12
13
  * @enum {number}
13
14
  */
14
15
  const RECORD = {
16
+ FRAME_OFFSET: 0,
17
+ FETCH_SIZE: 8,
18
+ DECODED_SIZE: 12,
19
+ /**
20
+ * A byte each through `format_version` 5, a `u16` each from 6 on — which is what moved
21
+ * everything below them by two, into the eight bytes this record has always kept reserved. The
22
+ * record is still 32 bytes and the directory is still `32 * page_count`.
23
+ */
24
+ MIN_LEVEL: 16,
25
+ MAX_LEVEL: 18,
26
+ FLAGS: 20,
27
+ GROUP_COUNT: 22,
28
+ CLUSTER_COUNT: 24,
29
+ };
30
+
31
+ /**
32
+ * The same record as `format_version` 5 and earlier laid it out.
33
+ *
34
+ * The first three fields did not move, which is why a reader can size and place every fetch in the
35
+ * file from an old directory without knowing the version. Everything from `min_level` on did, so
36
+ * reading one of those records by the current offsets hands back a `min_level` with `max_level` in
37
+ * its high byte and a `cluster_count` taken out of reserved bytes — wrong, quietly, in derived data
38
+ * that nothing else cross-checks at read time.
39
+ *
40
+ * @enum {number}
41
+ */
42
+ const RECORD_V5 = {
15
43
  FRAME_OFFSET: 0,
16
44
  FETCH_SIZE: 8,
17
45
  DECODED_SIZE: 12,
@@ -36,13 +64,16 @@ const RECORD = {
36
64
  *
37
65
  * @param {Uint8Array} bytes the directory region, from its first byte
38
66
  * @param {number} page_count `total_pages` from the header
67
+ * @param {number} [format_version] the container header's, which decides where a record keeps
68
+ * everything from `min_level` on (§9). Defaults to the current version, which is what a caller
69
+ * holding no header should assume.
39
70
  * @returns {VGeoDirectory}
40
71
  * @throws {Error} when the bytes are shorter than the records the header says are there
41
72
  *
42
73
  * @author Alex Goldring
43
74
  * @copyright Company Named Limited (c) 2026
44
75
  */
45
- export function vgeo_read_directory(bytes, page_count) {
76
+ export function vgeo_read_directory(bytes, page_count, format_version = VGEO_FORMAT_VERSION) {
46
77
  const needed = page_count * VGEO_DIRECTORY_RECORD_SIZE;
47
78
 
48
79
  if (bytes.byteLength < needed) {
@@ -54,14 +85,18 @@ export function vgeo_read_directory(bytes, page_count) {
54
85
 
55
86
  const data = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
56
87
 
88
+ const legacy = format_version < 6;
89
+
90
+ const offsets = legacy ? RECORD_V5 : RECORD;
91
+
57
92
  const result = new VGeoDirectory();
58
93
 
59
94
  result.page_count = page_count;
60
95
  result.frame_offset = new Float64Array(page_count);
61
96
  result.fetch_size = new Uint32Array(page_count);
62
97
  result.decoded_size = new Uint32Array(page_count);
63
- result.min_level = new Uint8Array(page_count);
64
- result.max_level = new Uint8Array(page_count);
98
+ result.min_level = new Uint16Array(page_count);
99
+ result.max_level = new Uint16Array(page_count);
65
100
  result.flags = new Uint16Array(page_count);
66
101
  result.group_count = new Uint16Array(page_count);
67
102
  result.cluster_count = new Uint16Array(page_count);
@@ -69,14 +104,21 @@ export function vgeo_read_directory(bytes, page_count) {
69
104
  for (let i = 0; i < page_count; i++) {
70
105
  const record = i * VGEO_DIRECTORY_RECORD_SIZE;
71
106
 
72
- result.frame_offset[i] = Number(data.getBigUint64(record + RECORD.FRAME_OFFSET, LE));
73
- result.fetch_size[i] = data.getUint32(record + RECORD.FETCH_SIZE, LE);
74
- result.decoded_size[i] = data.getUint32(record + RECORD.DECODED_SIZE, LE);
75
- result.min_level[i] = data.getUint8(record + RECORD.MIN_LEVEL);
76
- result.max_level[i] = data.getUint8(record + RECORD.MAX_LEVEL);
77
- result.flags[i] = data.getUint16(record + RECORD.FLAGS, LE);
78
- result.group_count[i] = data.getUint16(record + RECORD.GROUP_COUNT, LE);
79
- result.cluster_count[i] = data.getUint16(record + RECORD.CLUSTER_COUNT, LE);
107
+ result.frame_offset[i] = Number(data.getBigUint64(record + offsets.FRAME_OFFSET, LE));
108
+ result.fetch_size[i] = data.getUint32(record + offsets.FETCH_SIZE, LE);
109
+ result.decoded_size[i] = data.getUint32(record + offsets.DECODED_SIZE, LE);
110
+
111
+ result.min_level[i] = legacy
112
+ ? data.getUint8(record + offsets.MIN_LEVEL)
113
+ : data.getUint16(record + offsets.MIN_LEVEL, LE);
114
+
115
+ result.max_level[i] = legacy
116
+ ? data.getUint8(record + offsets.MAX_LEVEL)
117
+ : data.getUint16(record + offsets.MAX_LEVEL, LE);
118
+
119
+ result.flags[i] = data.getUint16(record + offsets.FLAGS, LE);
120
+ result.group_count[i] = data.getUint16(record + offsets.GROUP_COUNT, LE);
121
+ result.cluster_count[i] = data.getUint16(record + offsets.CLUSTER_COUNT, LE);
80
122
  }
81
123
 
82
124
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_read_header.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wCATW,UAAU,GAER,mBAAmB,CAiH/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,+CAJW,UAAU,GACR,MAAM,CA4BlB;AAvLD;;;;;;;GAOG;AACH,kCAFU,MAAM,CAEoC;oCAjBhB,0BAA0B"}
1
+ {"version":3,"file":"vgeo_read_header.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wCATW,UAAU,GAER,mBAAmB,CAqH/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,+CAJW,UAAU,GACR,MAAM,CA4BlB;AA3LD;;;;;;;GAOG;AACH,kCAFU,MAAM,CAEoC;oCAjBhB,0BAA0B"}
@@ -128,7 +128,11 @@ export function vgeo_read_header(bytes) {
128
128
  result.object_bounds[i] = view.getFloat32(VGEO_HEADER_OFFSET.OBJECT_BOUNDS + i * 4, LE);
129
129
  }
130
130
 
131
- const level_count = view.getUint8(VGEO_HEADER_OFFSET.LEVEL_COUNT);
131
+ /*
132
+ A `u16` since `format_version` 6, over a byte that was reserved and written as zero — so this
133
+ reads every earlier container correctly as well, and no version test is needed for it.
134
+ */
135
+ const level_count = view.getUint16(VGEO_HEADER_OFFSET.LEVEL_COUNT, LE);
132
136
 
133
137
  const table_end = VGEO_HEADER_SIZE + level_count * VGEO_LEVEL_RECORD_SIZE;
134
138
 
@@ -188,8 +192,8 @@ export function vgeo_resident_head_size(bytes) {
188
192
  );
189
193
  }
190
194
 
191
- const table_end =
192
- VGEO_HEADER_SIZE + view.getUint8(VGEO_HEADER_OFFSET.LEVEL_COUNT) * VGEO_LEVEL_RECORD_SIZE;
195
+ const table_end = VGEO_HEADER_SIZE
196
+ + view.getUint16(VGEO_HEADER_OFFSET.LEVEL_COUNT, LE) * VGEO_LEVEL_RECORD_SIZE;
193
197
 
194
198
  const root_end = Number(view.getBigUint64(VGEO_HEADER_OFFSET.ROOT_PAGE_OFFSET, LE))
195
199
  + view.getUint32(VGEO_HEADER_OFFSET.ROOT_PAGE_FETCH_SIZE, LE);
@@ -11,16 +11,26 @@
11
11
  * `decoded_size` is four bytes of untrusted file, and honouring one that no block of that length
12
12
  * could produce turns corruption into an out-of-memory throw rather than a rejected file.
13
13
  *
14
+ * It is asynchronous because {@link VGEO_CODEC_DEFLATE} is — the platform only offers its zlib as a
15
+ * stream — and a reader that could not read a deflate page would be refusing assets over an
16
+ * implementation detail. Everything after the decode is the same synchronous walk of the page's own
17
+ * tables it has always been, and a raw or LZ4 page never leaves the caller's turn.
18
+ *
14
19
  * @param {Uint8Array} frame_bytes the frame's exact range, from its first byte
15
20
  * @param {number} page_index the frame ordinal this range was fetched as — the caller knows it from
16
21
  * the child-table entry or the directory record that named the range
17
- * @returns {VGeoPage}
22
+ * @param {number} [format_version] the container header's, which decides how a cluster record
23
+ * (§7) and a page header (§6.1) are laid out: version 5 put `subtree_aabb` at offset 40 and
24
+ * moved everything after it, and version 6 widened the page band to `u16` over
25
+ * `node_table_offset`. Defaults to the current version, which is what a caller holding no
26
+ * header should assume — the frame itself does not carry one.
27
+ * @returns {Promise<VGeoPage>}
18
28
  * @throws {Error} when the range is not a frame, uses a codec with no decoder here, or does not
19
29
  * decode as its own header says
20
30
  *
21
31
  * @author Alex Goldring
22
32
  * @copyright Company Named Limited (c) 2026
23
33
  */
24
- export function vgeo_read_page(frame_bytes: Uint8Array, page_index: number): VGeoPage;
34
+ export function vgeo_read_page(frame_bytes: Uint8Array, page_index: number, format_version?: number): Promise<VGeoPage>;
25
35
  import { VGeoPage } from "./VGeoPage.js";
26
36
  //# sourceMappingURL=vgeo_read_page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_read_page.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js"],"names":[],"mappings":"AAsCA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4CAVW,UAAU,cACV,MAAM,GAEJ,QAAQ,CAiFpB;yBAhHwB,eAAe"}
1
+ {"version":3,"file":"vgeo_read_page.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js"],"names":[],"mappings":"AA0CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,4CAfW,UAAU,cACV,MAAM,mBAEN,MAAM,GAKJ,QAAQ,QAAQ,CAAC,CA+F7B;yBAxIwB,eAAe"}
@@ -3,10 +3,13 @@ import { VGEO_ATTRIBUTES } from "../attribute/VGEO_ATTRIBUTES.js";
3
3
  import { VGEO_CHILD_OFFSET } from "../frame/VGEO_CHILD_OFFSET.js";
4
4
  import { VGEO_CHILD_TABLE_ENTRY_SIZE } from "../frame/VGEO_CHILD_TABLE_ENTRY_SIZE.js";
5
5
  import { VGEO_CLUSTER_OFFSET } from "../cluster/VGEO_CLUSTER_OFFSET.js";
6
+ import { VGEO_CLUSTER_OFFSET_V4 } from "../cluster/VGEO_CLUSTER_OFFSET_V4.js";
6
7
  import { VGEO_CLUSTER_RECORD_SIZE } from "../cluster/VGEO_CLUSTER_RECORD_SIZE.js";
8
+ import { VGEO_CODEC_DEFLATE } from "../frame/VGEO_CODEC_DEFLATE.js";
7
9
  import { VGEO_CODEC_LZ4 } from "../frame/VGEO_CODEC_LZ4.js";
8
10
  import { VGEO_CODEC_RAW } from "../frame/VGEO_CODEC_RAW.js";
9
11
  import { vgeo_decode_frame_blob } from "../frame/vgeo_decode_frame_blob.js";
12
+ import { VGEO_FORMAT_VERSION } from "../header/VGEO_FORMAT_VERSION.js";
10
13
  import { VGEO_FRAME_HEADER_SIZE } from "../frame/VGEO_FRAME_HEADER_SIZE.js";
11
14
  import { VGEO_FRAME_OFFSET } from "../frame/VGEO_FRAME_OFFSET.js";
12
15
  import { vgeo_frame_decode_bound } from "../frame/vgeo_frame_decode_bound.js";
@@ -18,6 +21,7 @@ import { VGEO_NODE_RECORD_SIZE } from "../page/VGEO_NODE_RECORD_SIZE.js";
18
21
  import { VGEO_PAGE_HEADER_SIZE } from "../page/VGEO_PAGE_HEADER_SIZE.js";
19
22
  import { VGEO_PAGE_MAGIC } from "../frame/VGEO_PAGE_MAGIC.js";
20
23
  import { VGEO_PAGE_OFFSET } from "../page/VGEO_PAGE_OFFSET.js";
24
+ import { VGEO_PAGE_OFFSET_V5 } from "../page/VGEO_PAGE_OFFSET_V5.js";
21
25
  import { VGEO_PARENT_ENTRY_SIZE } from "../page/VGEO_PARENT_ENTRY_SIZE.js";
22
26
  import { VGEO_PARENT_PAGE_ENTRY_SIZE } from "../page/VGEO_PARENT_PAGE_ENTRY_SIZE.js";
23
27
  import { vgeo_read_frame_extent } from "../frame/vgeo_read_frame_extent.js";
@@ -49,17 +53,27 @@ const NORMAL_COMPRESSION_FLAG = VGEO_ATTRIBUTES[VGEO_ATTRIBUTE.NORMAL].compressi
49
53
  * `decoded_size` is four bytes of untrusted file, and honouring one that no block of that length
50
54
  * could produce turns corruption into an out-of-memory throw rather than a rejected file.
51
55
  *
56
+ * It is asynchronous because {@link VGEO_CODEC_DEFLATE} is — the platform only offers its zlib as a
57
+ * stream — and a reader that could not read a deflate page would be refusing assets over an
58
+ * implementation detail. Everything after the decode is the same synchronous walk of the page's own
59
+ * tables it has always been, and a raw or LZ4 page never leaves the caller's turn.
60
+ *
52
61
  * @param {Uint8Array} frame_bytes the frame's exact range, from its first byte
53
62
  * @param {number} page_index the frame ordinal this range was fetched as — the caller knows it from
54
63
  * the child-table entry or the directory record that named the range
55
- * @returns {VGeoPage}
64
+ * @param {number} [format_version] the container header's, which decides how a cluster record
65
+ * (§7) and a page header (§6.1) are laid out: version 5 put `subtree_aabb` at offset 40 and
66
+ * moved everything after it, and version 6 widened the page band to `u16` over
67
+ * `node_table_offset`. Defaults to the current version, which is what a caller holding no
68
+ * header should assume — the frame itself does not carry one.
69
+ * @returns {Promise<VGeoPage>}
56
70
  * @throws {Error} when the range is not a frame, uses a codec with no decoder here, or does not
57
71
  * decode as its own header says
58
72
  *
59
73
  * @author Alex Goldring
60
74
  * @copyright Company Named Limited (c) 2026
61
75
  */
62
- export function vgeo_read_page(frame_bytes, page_index) {
76
+ export async function vgeo_read_page(frame_bytes, page_index, format_version = VGEO_FORMAT_VERSION) {
63
77
  const frame_view = new DataView(
64
78
  frame_bytes.buffer, frame_bytes.byteOffset, frame_bytes.byteLength
65
79
  );
@@ -89,10 +103,15 @@ export function vgeo_read_page(frame_bytes, page_index) {
89
103
  // decoder indexes `frame_bytes` with, and the caller keeps the absolute one.
90
104
  const frame = vgeo_read_frame_extent(frame_view, 0, page_index);
91
105
 
92
- if (frame.codec !== VGEO_CODEC_RAW && frame.codec !== VGEO_CODEC_LZ4) {
106
+ if (
107
+ frame.codec !== VGEO_CODEC_RAW
108
+ && frame.codec !== VGEO_CODEC_LZ4
109
+ && frame.codec !== VGEO_CODEC_DEFLATE
110
+ ) {
93
111
  throw new Error(
94
112
  `page ${page_index} uses codec ${frame.codec};`
95
- + ` this reader decodes ${VGEO_CODEC_RAW} (raw) and ${VGEO_CODEC_LZ4} (lz4)`
113
+ + ` this reader decodes ${VGEO_CODEC_RAW} (raw), ${VGEO_CODEC_LZ4} (lz4)`
114
+ + ` and ${VGEO_CODEC_DEFLATE} (deflate)`
96
115
  );
97
116
  }
98
117
 
@@ -120,16 +139,25 @@ export function vgeo_read_page(frame_bytes, page_index) {
120
139
 
121
140
  const bytes = new Uint8Array(frame.decoded_size);
122
141
 
123
- vgeo_decode_frame_blob(bytes, 0, frame_bytes, frame);
142
+ await vgeo_decode_frame_blob(bytes, 0, frame_bytes, frame);
124
143
 
125
144
  result.bytes = bytes;
126
145
  result.data = new DataView(bytes.buffer);
127
146
 
147
+ /*
148
+ Version 6 widened `min_level` and `max_level` to `u16` and spent `node_table_offset` on the
149
+ four bytes, so the page header's fields at offsets 4..8 and 20..24 mean different things either
150
+ side of it. Everything else in a page — the group table's base, the other table offsets, the
151
+ parent section, the metric — is where it always was, which is why only these two readers take
152
+ the flag.
153
+ */
154
+ const legacy_page = format_version < 6;
155
+
128
156
  read_child_table(result, frame_view, frame);
129
- read_page_header(result);
157
+ read_page_header(result, legacy_page);
130
158
  read_group_table(result);
131
- read_node_table(result);
132
- read_cluster_table(result);
159
+ read_node_table(result, legacy_page);
160
+ read_cluster_table(result, format_version);
133
161
  read_parent_tables(result);
134
162
 
135
163
  return result;
@@ -211,13 +239,23 @@ function read_child_table(page, frame_view, frame) {
211
239
  * past.
212
240
  *
213
241
  * @param {VGeoPage} page
242
+ * @param {boolean} legacy the container is `format_version` 5 or older
214
243
  */
215
- function read_node_table(page) {
244
+ function read_node_table(page, legacy) {
216
245
  const data = page.data;
217
246
 
218
247
  const count = page.node_count;
219
248
 
220
- const table = data.getUint32(VGEO_PAGE_OFFSET.NODE_TABLE_OFFSET, LE);
249
+ /*
250
+ Stored through version 5, derived from 6 on, and the same number either way: the group table
251
+ follows the page header and the node table follows the group table, both by construction
252
+ (§6.1). What stands between a `group_count` that is wrong and a read past the page is the
253
+ extent check below, and that stood there when the offset was stored too.
254
+ */
255
+ const table = legacy
256
+ ? data.getUint32(VGEO_PAGE_OFFSET_V5.NODE_TABLE_OFFSET, LE)
257
+ : VGEO_PAGE_HEADER_SIZE
258
+ + data.getUint16(VGEO_PAGE_OFFSET.GROUP_COUNT, LE) * VGEO_GROUP_RECORD_SIZE;
221
259
 
222
260
  const end = table + count * VGEO_NODE_RECORD_SIZE;
223
261
 
@@ -264,8 +302,9 @@ function read_node_table(page) {
264
302
 
265
303
  /**
266
304
  * @param {VGeoPage} page
305
+ * @param {boolean} legacy the container is `format_version` 5 or older
267
306
  */
268
- function read_page_header(page) {
307
+ function read_page_header(page, legacy) {
269
308
  const data = page.data;
270
309
 
271
310
  if (page.bytes.byteLength < VGEO_PAGE_HEADER_SIZE) {
@@ -276,9 +315,17 @@ function read_page_header(page) {
276
315
  }
277
316
 
278
317
  page.cluster_count = data.getUint16(VGEO_PAGE_OFFSET.CLUSTER_COUNT, LE);
279
- page.min_level = data.getUint8(VGEO_PAGE_OFFSET.MIN_LEVEL);
280
- page.max_level = data.getUint8(VGEO_PAGE_OFFSET.MAX_LEVEL);
281
- page.node_count = data.getUint16(VGEO_PAGE_OFFSET.NODE_COUNT, LE);
318
+
319
+ if (legacy) {
320
+ page.min_level = data.getUint8(VGEO_PAGE_OFFSET_V5.MIN_LEVEL);
321
+ page.max_level = data.getUint8(VGEO_PAGE_OFFSET_V5.MAX_LEVEL);
322
+ page.node_count = data.getUint16(VGEO_PAGE_OFFSET_V5.NODE_COUNT, LE);
323
+ } else {
324
+ page.min_level = data.getUint16(VGEO_PAGE_OFFSET.MIN_LEVEL, LE);
325
+ page.max_level = data.getUint16(VGEO_PAGE_OFFSET.MAX_LEVEL, LE);
326
+ page.node_count = data.getUint16(VGEO_PAGE_OFFSET.NODE_COUNT, LE);
327
+ }
328
+
282
329
  page.payload_offset = data.getUint32(VGEO_PAGE_OFFSET.PAYLOAD_OFFSET, LE);
283
330
  page.payload_size = data.getUint32(VGEO_PAGE_OFFSET.PAYLOAD_SIZE, LE);
284
331
  }
@@ -362,10 +409,21 @@ function read_parent_tables(page) {
362
409
 
363
410
  /**
364
411
  * @param {VGeoPage} page
412
+ * @param {number} format_version of the container this page came out of
365
413
  */
366
- function read_cluster_table(page) {
414
+ function read_cluster_table(page, format_version) {
367
415
  const data = page.data;
368
416
 
417
+ /*
418
+ Version 5 replaced `bounds_sphere` and `cone_reserved` with `subtree_aabb`, which moved every
419
+ field from offset 40 on, so reading an older record by the current offsets does not lose a
420
+ field — it takes `child_ref` out of the middle of a box. The fifty gigabytes of converted
421
+ version-4 containers are why this branch exists rather than a refusal.
422
+ */
423
+ const legacy = format_version < 5;
424
+
425
+ const offsets = legacy ? VGEO_CLUSTER_OFFSET_V4 : VGEO_CLUSTER_OFFSET;
426
+
369
427
  const count = page.cluster_count;
370
428
 
371
429
  const table = data.getUint32(VGEO_PAGE_OFFSET.CLUSTER_TABLE_OFFSET, LE);
@@ -381,7 +439,7 @@ function read_cluster_table(page) {
381
439
 
382
440
  page.self_sphere = new Float32Array(count * 4);
383
441
  page.parent_sphere = new Float32Array(count * 4);
384
- page.bounds_sphere = new Float32Array(count * 4);
442
+ page.subtree_aabb = new Float32Array(count * 6);
385
443
  page.aabb = new Float32Array(count * 6);
386
444
  page.self_error = new Float32Array(count);
387
445
  page.parent_error = new Float32Array(count);
@@ -399,29 +457,49 @@ function read_cluster_table(page) {
399
457
 
400
458
  for (let c = 0; c < 4; c++) {
401
459
  page.self_sphere[i * 4 + c] =
402
- data.getFloat32(record + VGEO_CLUSTER_OFFSET.SELF_SPHERE + c * 4, LE);
460
+ data.getFloat32(record + offsets.SELF_SPHERE + c * 4, LE);
403
461
  page.parent_sphere[i * 4 + c] =
404
- data.getFloat32(record + VGEO_CLUSTER_OFFSET.PARENT_SPHERE + c * 4, LE);
405
- page.bounds_sphere[i * 4 + c] =
406
- data.getFloat32(record + VGEO_CLUSTER_OFFSET.BOUNDS_SPHERE + c * 4, LE);
462
+ data.getFloat32(record + offsets.PARENT_SPHERE + c * 4, LE);
407
463
  }
408
464
 
409
465
  for (let c = 0; c < 6; c++) {
410
- page.aabb[i * 6 + c] =
411
- data.getFloat32(record + VGEO_CLUSTER_OFFSET.AABB + c * 4, LE);
466
+ page.aabb[i * 6 + c] = data.getFloat32(record + offsets.AABB + c * 4, LE);
467
+ }
468
+
469
+ if (legacy) {
470
+ /*
471
+ The cube around `self_sphere`, which format §11.7 makes contain every vertex below the
472
+ cluster — so it is a conservative subtree bound, which is the whole of what the cut's
473
+ test asks of this column. It is looser than the box a version-5 build computes, and
474
+ looser in exactly the way the sphere the kernel also tests already is.
475
+ */
476
+ const cx = page.self_sphere[i * 4];
477
+ const cy = page.self_sphere[i * 4 + 1];
478
+ const cz = page.self_sphere[i * 4 + 2];
479
+ const r = page.self_sphere[i * 4 + 3];
480
+
481
+ page.subtree_aabb[i * 6] = cx - r;
482
+ page.subtree_aabb[i * 6 + 1] = cy - r;
483
+ page.subtree_aabb[i * 6 + 2] = cz - r;
484
+ page.subtree_aabb[i * 6 + 3] = cx + r;
485
+ page.subtree_aabb[i * 6 + 4] = cy + r;
486
+ page.subtree_aabb[i * 6 + 5] = cz + r;
487
+ } else {
488
+ for (let c = 0; c < 6; c++) {
489
+ page.subtree_aabb[i * 6 + c] =
490
+ data.getFloat32(record + offsets.SUBTREE_AABB + c * 4, LE);
491
+ }
412
492
  }
413
493
 
414
- page.self_error[i] = data.getFloat32(record + VGEO_CLUSTER_OFFSET.SELF_ERROR, LE);
415
- page.parent_error[i] = data.getFloat32(record + VGEO_CLUSTER_OFFSET.PARENT_ERROR, LE);
416
- page.child_ref[i] = data.getUint16(record + VGEO_CLUSTER_OFFSET.CHILD_REF, LE);
417
- page.child_group[i] = data.getUint16(record + VGEO_CLUSTER_OFFSET.CHILD_GROUP, LE);
418
- page.encoding_flags[i] = data.getUint32(record + VGEO_CLUSTER_OFFSET.ENCODING_FLAGS, LE);
419
- page.cluster_payload_offset[i] =
420
- data.getUint32(record + VGEO_CLUSTER_OFFSET.PAYLOAD_OFFSET, LE);
421
- page.cluster_payload_size[i] =
422
- data.getUint32(record + VGEO_CLUSTER_OFFSET.PAYLOAD_SIZE, LE);
423
- page.vertex_count[i] = data.getUint8(record + VGEO_CLUSTER_OFFSET.VERTEX_COUNT);
424
- page.triangle_count[i] = data.getUint8(record + VGEO_CLUSTER_OFFSET.TRIANGLE_COUNT);
494
+ page.self_error[i] = data.getFloat32(record + offsets.SELF_ERROR, LE);
495
+ page.parent_error[i] = data.getFloat32(record + offsets.PARENT_ERROR, LE);
496
+ page.child_ref[i] = data.getUint16(record + offsets.CHILD_REF, LE);
497
+ page.child_group[i] = data.getUint16(record + offsets.CHILD_GROUP, LE);
498
+ page.encoding_flags[i] = data.getUint32(record + offsets.ENCODING_FLAGS, LE);
499
+ page.cluster_payload_offset[i] = data.getUint32(record + offsets.PAYLOAD_OFFSET, LE);
500
+ page.cluster_payload_size[i] = data.getUint32(record + offsets.PAYLOAD_SIZE, LE);
501
+ page.vertex_count[i] = data.getUint8(record + offsets.VERTEX_COUNT);
502
+ page.triangle_count[i] = data.getUint8(record + offsets.TRIANGLE_COUNT);
425
503
 
426
504
  if ((page.encoding_flags[i] & NORMAL_COMPRESSION_FLAG) === 0) {
427
505
  page.per_vertex_normal_cluster_count++;
@@ -1,10 +1,14 @@
1
1
  /**
2
2
  * Audit a `.vgeo` file.
3
3
  *
4
+ * It is asynchronous for the one reason the reader is: {@link VGEO_CODEC_DEFLATE} decodes through
5
+ * the platform's streaming zlib, and a validator that could not decode a deflate page would pass
6
+ * every file it could not read.
7
+ *
4
8
  * @param {BinaryBuffer} buffer the whole file, with `capacity` equal to its length
5
- * @returns {VGeoDefect[]} in discovery order; empty when the file satisfies every invariant
9
+ * @returns {Promise<VGeoDefect[]>} in discovery order; empty when the file satisfies every invariant
6
10
  */
7
- export function vgeo_validate_container(buffer: BinaryBuffer): VGeoDefect[];
11
+ export function vgeo_validate_container(buffer: BinaryBuffer): Promise<VGeoDefect[]>;
8
12
  import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
9
13
  import { VGeoDefect } from "./VGeoDefect.js";
10
14
  //# sourceMappingURL=vgeo_validate_container.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_validate_container.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js"],"names":[],"mappings":"AA6tDA;;;;;GAKG;AACH,gDAHW,YAAY,GACV,UAAU,EAAE,CAqFxB;6BAtzD4B,4CAA4C;2BAmD9C,iBAAiB"}
1
+ {"version":3,"file":"vgeo_validate_container.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js"],"names":[],"mappings":"AA+xDA;;;;;;;;;GASG;AACH,gDAHW,YAAY,GACV,QAAQ,UAAU,EAAE,CAAC,CAqFjC;6BA53D4B,4CAA4C;2BAoD9C,iBAAiB"}