@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
@@ -0,0 +1,147 @@
1
+ import { bt_mesh_build_face_graph } from "../../../../../../core/graph/metis/bt_mesh_build_face_graph.js";
2
+ import { VGeoFaceGraph } from "../partition/VGeoFaceGraph.js";
3
+ import { vgeo_build_cluster_graph } from "./vgeo_build_cluster_graph.js";
4
+ import { vgeo_build_group_step } from "./vgeo_build_group_step.js";
5
+ import { vgeo_error_bands } from "./vgeo_error_bands.js";
6
+ import { vgeo_partition_into_groups } from "./vgeo_partition_into_groups.js";
7
+ import { vgeo_try_repack } from "./vgeo_try_repack.js";
8
+
9
+ /**
10
+ * The frontier's clusters ordered by error, which is what a band is a slice of.
11
+ *
12
+ * @param {VGeoFrontier} frontier
13
+ * @returns {{order: number[], errors: number[]}} cluster indices ascending by error, and their
14
+ * errors in the same order
15
+ */
16
+ function order_by_error(frontier) {
17
+ const order = frontier.clusters.map((cluster, index) => index);
18
+
19
+ order.sort(
20
+ (a, b) => (frontier.clusters[a].self_error - frontier.clusters[b].self_error) || (a - b)
21
+ );
22
+
23
+ return { order, errors: order.map((index) => frontier.clusters[index].self_error) };
24
+ }
25
+
26
+ /**
27
+ * One round: pick a band, group it, simplify each group, and report what it produced.
28
+ *
29
+ * Every group is speculative and judged on its own. One that comes back with no fewer clusters than
30
+ * it consumed is simply dropped — its clusters return to the frontier, to be grouped differently by
31
+ * a later round — rather than failing the round for everyone else. A group that cannot be
32
+ * simplified is no different in kind from a group that could not be formed, and the frontier already
33
+ * knows what to do with those: nothing, for now.
34
+ *
35
+ * The round as a whole is accepted only when it *strictly* shrinks the frontier. Failing that it
36
+ * widens the band, and failing that it grows the group — small groups starve the simplifier, and a
37
+ * wider band gives a fine region coarser neighbours to merge with.
38
+ *
39
+ * @param {VGeoFrontier} frontier
40
+ * @param {number} level of the parents this round would produce
41
+ * @param {VGeoLevelOptions} options
42
+ * @returns {{steps: VGeoGroupStep[], repacks: VGeoGroupRepack[], merged: Set<number>}|undefined}
43
+ * what to commit and which frontier clusters it consumed; `undefined` when nothing this round
44
+ * could try made the frontier smaller
45
+ *
46
+ * @author Alex Goldring
47
+ * @copyright Company Named Limited (c) 2026
48
+ */
49
+ export function vgeo_run_round(frontier, level, options) {
50
+ const face_graph = new VGeoFaceGraph(
51
+ frontier.mesh.topology, bt_mesh_build_face_graph(frontier.mesh.topology), frontier.wedges
52
+ );
53
+
54
+ const cluster_graph = vgeo_build_cluster_graph(frontier, face_graph);
55
+
56
+ const ordered = order_by_error(frontier);
57
+
58
+ const bands = vgeo_error_bands(
59
+ ordered.errors, options.error_band_growth, options.error_band_min_fraction
60
+ );
61
+
62
+ let group_size = options.group_size;
63
+
64
+ for (; ;) {
65
+ for (const range of bands) {
66
+ const band = ordered.order.slice(range.start, range.end);
67
+
68
+ band.sort((a, b) => a - b);
69
+
70
+ const groups = vgeo_partition_into_groups(frontier, band, cluster_graph, group_size);
71
+
72
+ if (groups.length === 0) {
73
+ continue;
74
+ }
75
+
76
+ const group_of_face = new Int32Array(frontier.mesh.topology.faces.size).fill(-1);
77
+
78
+ groups.forEach((group, group_index) => {
79
+ for (const cluster of group) {
80
+ for (const face of frontier.cluster_faces[cluster]) {
81
+ group_of_face[face] = group_index;
82
+ }
83
+ }
84
+ });
85
+
86
+ const steps = [];
87
+ const repacks = [];
88
+
89
+ let consumed = 0;
90
+ let produced = 0;
91
+
92
+ const merged = new Set();
93
+
94
+ groups.forEach((group, group_index) => {
95
+ const parent_target = Math.max(
96
+ 1, Math.ceil(group.length * options.simplification_ratio)
97
+ );
98
+
99
+ const repack = vgeo_try_repack(frontier, group, parent_target);
100
+
101
+ if (repack !== undefined) {
102
+ repacks.push(repack);
103
+
104
+ consumed += group.length;
105
+ produced += repack.clusters.length;
106
+
107
+ for (const cluster of group) {
108
+ merged.add(cluster);
109
+ }
110
+
111
+ return;
112
+ }
113
+
114
+ const step = vgeo_build_group_step(
115
+ frontier, group, group_of_face, group_index, level, options
116
+ );
117
+
118
+ if (step === undefined || step.parent_clusters.length >= group.length) {
119
+ // Refused. Nothing has been mutated — the step worked on a copy of the geometry
120
+ // and a copy of the quadrics — so its clusters simply stay where they are.
121
+ return;
122
+ }
123
+
124
+ steps.push(step);
125
+
126
+ consumed += group.length;
127
+ produced += step.parent_clusters.length;
128
+
129
+ for (const cluster of group) {
130
+ merged.add(cluster);
131
+ }
132
+ });
133
+
134
+ if (produced < consumed) {
135
+ return { steps, repacks, merged };
136
+ }
137
+ }
138
+
139
+ // No band made progress. Growing the group gives the simplifier more interior to work with
140
+ // relative to its locked perimeter, which is the thing that stalls first.
141
+ if (group_size >= frontier.clusters.length) {
142
+ return undefined;
143
+ }
144
+
145
+ group_size = Math.min(frontier.clusters.length, group_size * 2);
146
+ }
147
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Stitch a round's output back into one mesh: freshly simplified clusters, and the clusters the
3
+ * round left alone, side by side.
4
+ *
5
+ * Vertices are unified by the id they had in the frontier below, never by position: a vertex two
6
+ * groups share is pinned, so both carry it unmoved and unmistakably, while a vertex only one group
7
+ * holds is its own even if a collapse happened to place it exactly where another landed. An
8
+ * untouched cluster names its vertices in that same space, so it stitches to its simplified
9
+ * neighbour along exactly the boundary that neighbour was forbidden to move.
10
+ *
11
+ * **Wedges are unified the same way and separately**, by the frontier wedge each contributed corner
12
+ * came from. Two contributions that share a pinned boundary vertex name the same wedges there, so
13
+ * they arrive as one and the seam shades continuously; a wedge only one group has — one a collapse
14
+ * inside it adopted, say — is its own, which is right, because its corners are that group's alone.
15
+ * The new frontier's wedge ids are handed out here, and they are what the round's accumulated
16
+ * attribute quadrics are re-indexed into.
17
+ *
18
+ * @param {VGeoContribution[]} contributions parallel to the clusters of the frontier being built
19
+ * @param {(BinaryDataLayer|null)[]} template_layers the channels the frontier below carries, which
20
+ * the frontier being stitched carries too
21
+ * @returns {{mesh: VirtualGeometryMesh, cluster_faces: number[][], source_vertex_ids: Uint32Array, wedges: BtWedgeSet, source_wedge_ids: Uint32Array}}
22
+ * the two id maps naming, for every vertex and every wedge of the new mesh, the one of the old
23
+ * mesh it came from — which is how the accumulated quadrics follow it across the seam
24
+ *
25
+ * @author Alex Goldring
26
+ * @copyright Company Named Limited (c) 2026
27
+ */
28
+ export function vgeo_stitch_frontier(contributions: VGeoContribution[], template_layers: (BinaryDataLayer | null)[]): {
29
+ mesh: VirtualGeometryMesh;
30
+ cluster_faces: number[][];
31
+ source_vertex_ids: Uint32Array;
32
+ wedges: BtWedgeSet;
33
+ source_wedge_ids: Uint32Array;
34
+ };
35
+ import { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
36
+ import { BtWedgeSet } from "../../../../../../core/geom/3d/topology/struct/binary/BtWedgeSet.js";
37
+ //# sourceMappingURL=vgeo_stitch_frontier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_stitch_frontier.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,oDAVW,gBAAgB,EAAE,mBAClB,CAAC,kBAAgB,IAAI,CAAC,EAAE,GAEtB;IAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAAC,iBAAiB,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,gBAAgB,EAAE,WAAW,CAAA;CAAC,CAmNrJ;oCAzOmC,gCAAgC;2BANzC,qEAAqE"}
@@ -0,0 +1,243 @@
1
+ import {
2
+ BinaryTopology, NULL_POINTER
3
+ } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
4
+ import { BtWedgeSet } from "../../../../../../core/geom/3d/topology/struct/binary/BtWedgeSet.js";
5
+ import {
6
+ bt_mesh_from_indexed_geometry
7
+ } from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
8
+ import { vgeo_layers_copy_corner } from "../../format/attribute/vgeo_layers_copy_corner.js";
9
+ import { vgeo_layers_like } from "../../format/attribute/vgeo_layers_like.js";
10
+ import { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
11
+
12
+ /**
13
+ * Stitch a round's output back into one mesh: freshly simplified clusters, and the clusters the
14
+ * round left alone, side by side.
15
+ *
16
+ * Vertices are unified by the id they had in the frontier below, never by position: a vertex two
17
+ * groups share is pinned, so both carry it unmoved and unmistakably, while a vertex only one group
18
+ * holds is its own even if a collapse happened to place it exactly where another landed. An
19
+ * untouched cluster names its vertices in that same space, so it stitches to its simplified
20
+ * neighbour along exactly the boundary that neighbour was forbidden to move.
21
+ *
22
+ * **Wedges are unified the same way and separately**, by the frontier wedge each contributed corner
23
+ * came from. Two contributions that share a pinned boundary vertex name the same wedges there, so
24
+ * they arrive as one and the seam shades continuously; a wedge only one group has — one a collapse
25
+ * inside it adopted, say — is its own, which is right, because its corners are that group's alone.
26
+ * The new frontier's wedge ids are handed out here, and they are what the round's accumulated
27
+ * attribute quadrics are re-indexed into.
28
+ *
29
+ * @param {VGeoContribution[]} contributions parallel to the clusters of the frontier being built
30
+ * @param {(BinaryDataLayer|null)[]} template_layers the channels the frontier below carries, which
31
+ * the frontier being stitched carries too
32
+ * @returns {{mesh: VirtualGeometryMesh, cluster_faces: number[][], source_vertex_ids: Uint32Array, wedges: BtWedgeSet, source_wedge_ids: Uint32Array}}
33
+ * the two id maps naming, for every vertex and every wedge of the new mesh, the one of the old
34
+ * mesh it came from — which is how the accumulated quadrics follow it across the seam
35
+ *
36
+ * @author Alex Goldring
37
+ * @copyright Company Named Limited (c) 2026
38
+ */
39
+ export function vgeo_stitch_frontier(contributions, template_layers) {
40
+ /**
41
+ * `source vertex id -> index in the frontier being built`.
42
+ * @type {Map<number, number>}
43
+ */
44
+ const index_of_source = new Map();
45
+
46
+ /**
47
+ * `source wedge id -> wedge index in the frontier being built`.
48
+ * @type {Map<number, number>}
49
+ */
50
+ const wedge_of_source = new Map();
51
+
52
+ const positions = [];
53
+ const indices = [];
54
+ const cluster_faces = [];
55
+
56
+ const source_wedge_ids = [];
57
+
58
+ /**
59
+ * The mesh each contribution's corners are named in, so a corner needs an index rather than a
60
+ * reference.
61
+ * @type {BinaryTopology[]}
62
+ */
63
+ const topologies = contributions.map((geometry) => geometry.topology);
64
+
65
+ let corner_count = 0;
66
+
67
+ for (const geometry of contributions) {
68
+ corner_count += geometry.indices.length;
69
+ }
70
+
71
+ /*
72
+ Per output corner, where its record comes from. Per *corner*, not per vertex: a seam vertex's
73
+ corners disagree, and picking a representative is exactly the thing that lost them — which is
74
+ six entries per triangle rather than one per vertex, so they are typed arrays sized up front
75
+ rather than lists that grow.
76
+ */
77
+ const corner_contribution = new Uint32Array(corner_count);
78
+ const corner_loop = new Uint32Array(corner_count);
79
+ const corner_wedge = new Uint32Array(corner_count);
80
+
81
+ let corner_cursor = 0;
82
+ let face_cursor = 0;
83
+
84
+ for (const geometry of contributions) {
85
+ const remap = new Uint32Array(geometry.local_vertex_ids.length);
86
+ const wedges = new Uint32Array(geometry.local_vertex_ids.length);
87
+
88
+ geometry.local_vertex_ids.forEach((local, i) => {
89
+ const source = geometry.source_vertex_ids[i];
90
+
91
+ let target = index_of_source.get(source);
92
+
93
+ if (target === undefined) {
94
+ target = positions.length / 3;
95
+
96
+ index_of_source.set(source, target);
97
+
98
+ positions.push(
99
+ geometry.positions[i * 3],
100
+ geometry.positions[i * 3 + 1],
101
+ geometry.positions[i * 3 + 2]
102
+ );
103
+ }
104
+
105
+ remap[i] = target;
106
+
107
+ const source_wedge = geometry.source_wedge_ids[i];
108
+
109
+ let wedge = wedge_of_source.get(source_wedge);
110
+
111
+ if (wedge === undefined) {
112
+ wedge = source_wedge_ids.length;
113
+
114
+ wedge_of_source.set(source_wedge, wedge);
115
+ source_wedge_ids.push(source_wedge);
116
+ }
117
+
118
+ wedges[i] = wedge;
119
+ });
120
+
121
+ const triangle_count = geometry.indices.length / 3;
122
+
123
+ const faces = [];
124
+
125
+ const contribution = cluster_faces.length;
126
+
127
+ for (let i = 0; i < geometry.indices.length; i++) {
128
+ const local = geometry.indices[i];
129
+
130
+ indices.push(remap[local]);
131
+
132
+ corner_contribution[corner_cursor] = contribution;
133
+ corner_loop[corner_cursor] = geometry.attribute_ids[local];
134
+ corner_wedge[corner_cursor] = wedges[local];
135
+
136
+ corner_cursor++;
137
+ }
138
+
139
+ for (let i = 0; i < triangle_count; i++) {
140
+ faces.push(face_cursor + i);
141
+ }
142
+
143
+ face_cursor += triangle_count;
144
+
145
+ cluster_faces.push(faces);
146
+ }
147
+
148
+ const topology = new BinaryTopology();
149
+
150
+ // Before the vertices: adding a layer widens every record already in the block, and a frontier
151
+ // holds every vertex of a level.
152
+ const layers = vgeo_layers_like(topology, template_layers);
153
+
154
+ bt_mesh_from_indexed_geometry(topology, Uint32Array.from(indices), Float32Array.from(positions));
155
+
156
+ if (topology.faces.count() !== face_cursor) {
157
+ // The corner walk below reads face `t` as the `t`th triangle of the index list. See
158
+ // `vgeo_extract_submesh`, which throws for the same reason and cannot use an assert either.
159
+ throw new Error(
160
+ `stitching ${face_cursor} triangles produced ${topology.faces.count()} faces, so the `
161
+ + `corners of the result cannot be matched to the corners they came from`
162
+ );
163
+ }
164
+
165
+ const wedges = new BtWedgeSet();
166
+
167
+ wedges.count = source_wedge_ids.length;
168
+ wedges.parent = Uint32Array.from({ length: wedges.count }, (_, wedge) => wedge);
169
+ wedges.next_of_wedge = new Uint32Array(wedges.count).fill(NULL_POINTER);
170
+ wedges.first_of_vertex = new Uint32Array(topology.vertices.size).fill(NULL_POINTER);
171
+ wedges.of_loop = new Uint32Array(topology.loops.size).fill(NULL_POINTER);
172
+
173
+ /**
174
+ * Which vertex each new wedge sits at, so the lists below are built once each.
175
+ * @type {Uint32Array}
176
+ */
177
+ const vertex_of_wedge = new Uint32Array(wedges.count).fill(NULL_POINTER);
178
+
179
+ for (let face = 0; face < face_cursor; face++) {
180
+ let loop = topology.face_read_loop(face);
181
+
182
+ for (let corner = 0; corner < 3; corner++) {
183
+ const index = face * 3 + corner;
184
+
185
+ const wedge = corner_wedge[index];
186
+
187
+ const vertex = topology.loop_read_vertex(loop);
188
+
189
+ if (vertex_of_wedge[wedge] === NULL_POINTER) {
190
+ vertex_of_wedge[wedge] = vertex;
191
+ } else if (vertex_of_wedge[wedge] !== vertex) {
192
+ /*
193
+ A wedge is a set of corners **at one vertex**, and everything above rests on two
194
+ contributions that name the same frontier wedge naming the same frontier vertex too.
195
+ That holds for a reason rather than by luck — a wedge a collapse moved belonged to a
196
+ victim, a victim is never a group's pinned boundary, and so nothing outside that
197
+ group can name it — but the reason is three steps long and nothing else would notice
198
+ if it stopped being true. The corners would simply be split across two vertices with
199
+ one list between them, and the asset would ship shaded from whichever face was
200
+ walked last.
201
+ */
202
+ throw new Error(
203
+ `stitching put wedge ${wedge} on vertices ${vertex_of_wedge[wedge]} and `
204
+ + `${vertex}: a wedge belongs to exactly one vertex`
205
+ );
206
+ }
207
+
208
+ wedges.of_loop[loop] = wedge;
209
+
210
+ const source_loop = corner_loop[index];
211
+
212
+ if (source_loop !== NULL_POINTER) {
213
+ vgeo_layers_copy_corner(
214
+ topology, topologies[corner_contribution[index]], source_loop, loop
215
+ );
216
+ }
217
+
218
+ loop = topology.loop_read_next(loop);
219
+ }
220
+ }
221
+
222
+ for (let wedge = 0; wedge < wedges.count; wedge++) {
223
+ if (vertex_of_wedge[wedge] !== NULL_POINTER) {
224
+ wedges.attach(wedge, vertex_of_wedge[wedge]);
225
+ }
226
+ }
227
+
228
+ const mesh = new VirtualGeometryMesh(topology, layers);
229
+
230
+ const source_vertex_ids = new Uint32Array(index_of_source.size);
231
+
232
+ for (const [source, target] of index_of_source) {
233
+ source_vertex_ids[target] = source;
234
+ }
235
+
236
+ return {
237
+ mesh,
238
+ cluster_faces,
239
+ source_vertex_ids,
240
+ wedges,
241
+ source_wedge_ids: Uint32Array.from(source_wedge_ids),
242
+ };
243
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Leaves with room to spare between them, re-cut into fewer and fuller leaves.
3
+ *
4
+ * This is not a level of the DAG and must not become one. Nothing is simplified, so the new clusters
5
+ * carry the same error their inputs did -- zero -- and a step whose parent error equals its child
6
+ * error is a step the cut rule can never take: a cluster is drawn only while `project(parent) > tau`,
7
+ * and a parent at zero error projects to zero unconditionally. The leaves under it would be stored,
8
+ * paged, and never once selected. So the re-cut *replaces* them; they were a way of cutting this
9
+ * geometry up, and now there is a better one.
10
+ *
11
+ * It is what makes a scene of small separate parts tractable. A thousand twelve-triangle bolts are a
12
+ * thousand clusters at eight per cent fill, and no simplification is what they need -- they need to
13
+ * be cut up differently. Repacking is bounded by the grouping that proposed it, so what lands in one
14
+ * cluster is what the adjacency and proximity rules already judged to belong together.
15
+ *
16
+ * Only leaves. Above them the same re-cut would orphan a subtree, since a coarser cluster cannot be
17
+ * deleted -- something hangs off it.
18
+ *
19
+ * @param {VGeoFrontier} frontier
20
+ * @param {number[]} group_clusters cluster indices
21
+ * @param {number} parent_target how many clusters the group is aiming to become
22
+ * @returns {VGeoGroupRepack|undefined} `undefined` when the group must be simplified instead
23
+ *
24
+ * @author Alex Goldring
25
+ * @copyright Company Named Limited (c) 2026
26
+ */
27
+ export function vgeo_try_repack(frontier: VGeoFrontier, group_clusters: number[], parent_target: number): VGeoGroupRepack | undefined;
28
+ import { VGeoGroupRepack } from "./VGeoGroupRepack.js";
29
+ //# sourceMappingURL=vgeo_try_repack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_try_repack.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wEAPW,MAAM,EAAE,iBACR,MAAM,GACJ,eAAe,GAAC,SAAS,CAsFrC;gCA7G+B,sBAAsB"}
@@ -0,0 +1,117 @@
1
+ import { bt_mesh_build_face_graph } from "../../../../../../core/graph/metis/bt_mesh_build_face_graph.js";
2
+ import { VGEO_MAX_CLUSTER_TRIANGLE_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js";
3
+ import { VGEO_MAX_CLUSTER_VERTEX_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js";
4
+ import { VGeoFaceGraph } from "../partition/VGeoFaceGraph.js";
5
+ import { vgeo_split_face_set_packed } from "../partition/vgeo_split_face_set_packed.js";
6
+ import { vgeo_extract_submesh } from "../submesh/vgeo_extract_submesh.js";
7
+ import { vgeo_build_cluster } from "./vgeo_build_cluster.js";
8
+ import { VGeoGroupRepack } from "./VGeoGroupRepack.js";
9
+
10
+ /**
11
+ * Leaves with room to spare between them, re-cut into fewer and fuller leaves.
12
+ *
13
+ * This is not a level of the DAG and must not become one. Nothing is simplified, so the new clusters
14
+ * carry the same error their inputs did -- zero -- and a step whose parent error equals its child
15
+ * error is a step the cut rule can never take: a cluster is drawn only while `project(parent) > tau`,
16
+ * and a parent at zero error projects to zero unconditionally. The leaves under it would be stored,
17
+ * paged, and never once selected. So the re-cut *replaces* them; they were a way of cutting this
18
+ * geometry up, and now there is a better one.
19
+ *
20
+ * It is what makes a scene of small separate parts tractable. A thousand twelve-triangle bolts are a
21
+ * thousand clusters at eight per cent fill, and no simplification is what they need -- they need to
22
+ * be cut up differently. Repacking is bounded by the grouping that proposed it, so what lands in one
23
+ * cluster is what the adjacency and proximity rules already judged to belong together.
24
+ *
25
+ * Only leaves. Above them the same re-cut would orphan a subtree, since a coarser cluster cannot be
26
+ * deleted -- something hangs off it.
27
+ *
28
+ * @param {VGeoFrontier} frontier
29
+ * @param {number[]} group_clusters cluster indices
30
+ * @param {number} parent_target how many clusters the group is aiming to become
31
+ * @returns {VGeoGroupRepack|undefined} `undefined` when the group must be simplified instead
32
+ *
33
+ * @author Alex Goldring
34
+ * @copyright Company Named Limited (c) 2026
35
+ */
36
+ export function vgeo_try_repack(frontier, group_clusters, parent_target) {
37
+ const face_ids = [];
38
+
39
+ for (const cluster of group_clusters) {
40
+ if (frontier.clusters[cluster].child_group !== undefined) {
41
+ return undefined;
42
+ }
43
+
44
+ for (const face of frontier.cluster_faces[cluster]) {
45
+ face_ids.push(face);
46
+ }
47
+ }
48
+
49
+ // Only when the target is already met -- there is nothing to simplify, so the reduction has to
50
+ // come from re-cutting. A group over its target has real geometry to lose and belongs on the
51
+ // simplification path.
52
+ if (face_ids.length > parent_target * VGEO_MAX_CLUSTER_TRIANGLE_COUNT) {
53
+ return undefined;
54
+ }
55
+
56
+ face_ids.sort((a, b) => a - b);
57
+
58
+ const submesh = vgeo_extract_submesh(frontier.mesh, face_ids, frontier.wedges);
59
+
60
+ const face_graph = new VGeoFaceGraph(
61
+ submesh.mesh.topology, bt_mesh_build_face_graph(submesh.mesh.topology), submesh.wedges
62
+ );
63
+
64
+ /**
65
+ *
66
+ * @type {number[]}
67
+ */
68
+ const all = [];
69
+
70
+ const vertex_count = face_graph.graph.vertex_count;
71
+ for (let vertex = 0; vertex < vertex_count; vertex++) {
72
+ all.push(vertex);
73
+ }
74
+
75
+ const parts = vgeo_split_face_set_packed(
76
+ face_graph, all, VGEO_MAX_CLUSTER_TRIANGLE_COUNT, VGEO_MAX_CLUSTER_VERTEX_COUNT
77
+ );
78
+
79
+ if (parts.length >= group_clusters.length) {
80
+ // The vertex ceiling bit before the triangle one, and re-cutting bought nothing.
81
+ return undefined;
82
+ }
83
+
84
+ const repack = new VGeoGroupRepack();
85
+
86
+ repack.replaced = group_clusters.map((cluster) => frontier.clusters[cluster]);
87
+
88
+ for (const part of parts) {
89
+ const part_face_ids = part.map((dense) => face_graph.vertex_face_ids[dense]);
90
+
91
+ part_face_ids.sort((a, b) => a - b);
92
+
93
+ const built = vgeo_build_cluster(submesh.mesh, part_face_ids, 0, submesh.wedges);
94
+
95
+ // A leaf's own bounds are its LOD-metric sphere, and it deviates from nothing.
96
+ built.cluster.self_sphere = built.cluster.bounds_sphere.slice();
97
+ built.cluster.self_error = 0;
98
+
99
+ repack.clusters.push(built.cluster);
100
+
101
+ repack.geometry.push({
102
+ positions: built.gathered.positions,
103
+ indices: built.gathered.indices,
104
+ local_vertex_ids: built.gathered.vertex_ids,
105
+ source_vertex_ids: Uint32Array.from(
106
+ built.gathered.vertex_ids, (local) => submesh.source_vertex_ids[local]
107
+ ),
108
+ attribute_ids: built.gathered.attribute_ids,
109
+ source_wedge_ids: Uint32Array.from(
110
+ built.gathered.wedge_ids, (wedge) => submesh.source_wedge_ids[wedge]
111
+ ),
112
+ topology: submesh.mesh.topology,
113
+ });
114
+ }
115
+
116
+ return repack;
117
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * How far two triangles may turn across a shared edge before the builder stops pretending the
3
+ * surface is smooth there, in degrees.
4
+ *
5
+ * Only ever applied to normals the builder *synthesizes*. A source that authored its own normals has
6
+ * already answered this question, and its answer is the one that ships.
7
+ *
8
+ * **What it is for.** Averaging every face around a vertex into one direction is right for a surface
9
+ * and wrong for a corner, and a mesh does not say which it is — so an angle has to. A cube is the
10
+ * whole argument: its eight corner vertices each meet three faces, and one direction for all three
11
+ * is ninety degrees wrong for two of them. Measured on Zorah's `mesh1[0]`, whose source is
12
+ * `POSITION`-only and so gets every normal from this pass, the angle between a shipped corner's
13
+ * normal and the normal of the triangle that corner belongs to ran to a mean of 8.60 degrees and a
14
+ * p99 of 37.66 at LOD 0 — the numbers `WEDGE_PLAN_2026_09_18.md` §1 records — before a single
15
+ * collapse.
16
+ *
17
+ * **Why 45.** A threshold splits a curve as readily as a corner, so it is a trade: too low and a
18
+ * coarsely tessellated cylinder gains a crease at every segment, too high and a box stays soft.
19
+ * Swept over that same primitive, over its whole DAG:
20
+ *
21
+ * | crease | vertices/triangle | LOD 0 mean | LOD 0 p99 | all levels p99 | share over 30° |
22
+ * |---|---|---|---|---|---|
23
+ * | none | 0.641 | 8.60 | 37.66 | 54.27 | 6.5% |
24
+ * | 60° | 0.646 | 8.42 | 35.26 | 52.60 | 6.2% |
25
+ * | **45°** | **0.661** | **8.05** | **32.19** | **50.29** | **5.3%** |
26
+ * | 30° | 0.724 | 7.04 | 26.88 | 45.97 | 3.6% |
27
+ * | 20° | 0.880 | 5.53 | 20.58 | 38.65 | 2.0% |
28
+ *
29
+ * A wedge is a shipped vertex, so that first column is very nearly the size of the asset: 45 degrees
30
+ * costs 3%, 30 costs 13% and 20 costs 37%. The curve is smooth because *this* mesh's residual is
31
+ * mostly tessellation rather than creases — it keeps improving as the threshold falls, right through
32
+ * the range where a cylinder would start faceting, which is the sign that the number below is a
33
+ * judgement about content and not a fact about arithmetic. Hard-surface content is where it earns
34
+ * its keep and where the choice is obvious: every edge of a box is ninety degrees, and any threshold
35
+ * under that keeps all of them.
36
+ *
37
+ * So it is also {@link VGeoBuildOptions#crease_angle}, and a conversion of one kind of content can
38
+ * say so.
39
+ *
40
+ * @type {number}
41
+ *
42
+ * @author Alex Goldring
43
+ * @copyright Company Named Limited (c) 2026
44
+ */
45
+ export const VGEO_CREASE_ANGLE: number;
46
+ //# sourceMappingURL=VGEO_CREASE_ANGLE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGEO_CREASE_ANGLE.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,gCALU,MAAM,CAKoB"}