@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
@@ -1,28 +1,25 @@
1
1
  import { assert } from "../../../../../../core/assert.js";
2
- import {
3
- bt_face_read_triangle_vertices
4
- } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js";
5
2
  import { build_tangent_from_normal } from "../../../normals/build_tangent_from_normal.js";
6
3
  import { geometry_build_tangents } from "../../../normals/geometry_build_tangents.js";
7
4
  import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
8
5
 
9
6
  /**
10
- * One vertex's tangent, on its way into the format's channel.
7
+ * One corner's tangent, on its way into the format's channel.
11
8
  * @type {Float32Array}
12
9
  */
13
10
  const scratch_tangent = new Float32Array(4);
14
11
 
15
12
  /**
16
- * One face's corners.
17
- * @type {Uint32Array}
13
+ * One corner's normal, read back out of the channel it ships in.
14
+ * @type {Float32Array}
18
15
  */
19
- const scratch_triangle = new Uint32Array(3);
16
+ const scratch_normal = new Float32Array(3);
20
17
 
21
18
  /**
22
- * Vertex tangents of a mesh, written into its tangent channel.
19
+ * Tangents of a mesh, written into its tangent channel.
23
20
  *
24
21
  * A tangent is a direction *in the texture parameterization*, so where the mesh carries a `UV0` this
25
- * is Lengyel's per-triangle solve accumulated per vertex and orthogonalized against the normal —
22
+ * is Lengyel's per-triangle solve accumulated per **wedge** and orthogonalized against the normal —
26
23
  * {@link geometry_build_tangents}, the same pass {@link Geometry#computeTangents} runs, so an asset
27
24
  * that goes through the virtual-geometry builder gets the frame it would have got anywhere else.
28
25
  * Where the mesh carries no UVs there is no parameterization to be tangent to, and the frame becomes
@@ -32,22 +29,26 @@ const scratch_triangle = new Uint32Array(3);
32
29
  * the format's flat default, which is parallel to the normal over a whole band of any closed
33
30
  * surface and degenerates the frame there.
34
31
  *
32
+ * **Per wedge, and that is not a re-indexing of a per-vertex solve.** Lengyel's accumulation is over
33
+ * the triangles that share a value, and at a chart boundary the two sides do not: their UVs run in
34
+ * different directions and averaging them gives a tangent that is tangent to neither. So the solve
35
+ * is fed a mesh whose *vertices are the wedges* — the same substitution the cluster gather makes,
36
+ * and for the same reason — and the answer comes back one per wedge, which is then written to every
37
+ * corner of it.
38
+ *
35
39
  * `pinned` carries the same meaning and the same reason as it does for
36
40
  * {@link vgeo_compute_vertex_normals}: a vertex two groups share must carry byte-identical values in
37
41
  * both, or the seam a cut is allowed to put between them shades as a crease.
38
42
  *
39
- * The flat arrays this builds are indexed by *vertex id*, holes and all, so a pool with released
40
- * slots needs no compaction and no remap — a released slot is simply a triangle corner nothing
41
- * names.
42
- *
43
- * @param {VirtualGeometryMesh} mesh whose tangent and normal layers are sized by the vertex pool
43
+ * @param {VirtualGeometryMesh} mesh whose tangent and normal layers are sized by the loop pool
44
44
  * @param {Set<number>} pinned vertex ids to leave exactly as they are; empty for a mesh nothing has
45
45
  * locked yet
46
+ * @param {BtWedgeSet} wedges which corners of each vertex shade as one
46
47
  *
47
48
  * @author Alex Goldring
48
49
  * @copyright Company Named Limited (c) 2026
49
50
  */
50
- export function vgeo_compute_vertex_tangents(mesh, pinned) {
51
+ export function vgeo_compute_vertex_tangents(mesh, pinned, wedges) {
51
52
  const tangents = mesh.layers[VGEO_ATTRIBUTE.TANGENT];
52
53
  const normals = mesh.layers[VGEO_ATTRIBUTE.NORMAL];
53
54
 
@@ -56,49 +57,37 @@ export function vgeo_compute_vertex_tangents(mesh, pinned) {
56
57
 
57
58
  const topology = mesh.topology;
58
59
 
59
- const vertex_pool = topology.vertices;
60
- const vertex_pool_size = vertex_pool.size;
61
-
62
- const normal_data = new Float32Array(vertex_pool_size * 3);
63
-
64
- for (let vertex = 0; vertex < vertex_pool_size; vertex++) {
65
- if (vertex_pool.is_allocated(vertex)) {
66
- normals.read(normal_data, vertex * 3, vertex);
67
- }
68
- }
60
+ const loop_pool = topology.loops;
69
61
 
70
62
  const uv = mesh.layers[VGEO_ATTRIBUTE.UV0];
71
63
 
72
64
  if (uv === null) {
73
- for (let vertex = 0; vertex < vertex_pool_size; vertex++) {
74
- if (!vertex_pool.is_allocated(vertex) || pinned.has(vertex)) {
65
+ for (let loop = 0; loop < loop_pool.size; loop++) {
66
+ if (!loop_pool.is_allocated(loop)) {
67
+ continue;
68
+ }
69
+
70
+ if (pinned.has(topology.loop_read_vertex(loop))) {
75
71
  continue;
76
72
  }
77
73
 
78
- const address = vertex * 3;
74
+ normals.read(scratch_normal, 0, loop);
79
75
 
80
76
  build_tangent_from_normal(
81
- normal_data[address], normal_data[address + 1], normal_data[address + 2],
82
- 0, scratch_tangent
77
+ scratch_normal[0], scratch_normal[1], scratch_normal[2], 0, scratch_tangent
83
78
  );
84
79
 
85
- tangents.write(vertex, scratch_tangent, 0);
80
+ tangents.write(loop, scratch_tangent, 0);
86
81
  }
87
82
 
88
83
  return;
89
84
  }
90
85
 
91
- const position_data = new Float32Array(vertex_pool_size * 3);
92
- const uv_data = new Float32Array(vertex_pool_size * 2);
93
-
94
- for (let vertex = 0; vertex < vertex_pool_size; vertex++) {
95
- if (!vertex_pool.is_allocated(vertex)) {
96
- continue;
97
- }
86
+ const wedge_count = wedges.count;
98
87
 
99
- topology.vertex_read_coordinate(position_data, vertex * 3, vertex);
100
- uv.read(uv_data, vertex * 2, vertex);
101
- }
88
+ const position_data = new Float32Array(wedge_count * 3);
89
+ const normal_data = new Float32Array(wedge_count * 3);
90
+ const uv_data = new Float32Array(wedge_count * 2);
102
91
 
103
92
  const face_pool = topology.faces;
104
93
 
@@ -109,26 +98,45 @@ export function vgeo_compute_vertex_tangents(mesh, pinned) {
109
98
  continue;
110
99
  }
111
100
 
112
- const read = bt_face_read_triangle_vertices(scratch_triangle, topology, face);
101
+ const first_loop = topology.face_read_loop(face);
102
+
103
+ let loop = first_loop;
104
+
105
+ for (let corner = 0; corner < 3; corner++) {
106
+ const wedge = wedges.find(wedges.of_loop[loop]);
107
+
108
+ indices.push(wedge);
109
+
110
+ topology.vertex_read_coordinate(
111
+ position_data, wedge * 3, topology.loop_read_vertex(loop)
112
+ );
113
+
114
+ normals.read(normal_data, wedge * 3, loop);
115
+ uv.read(uv_data, wedge * 2, loop);
113
116
 
114
- assert.equal(read, true, `face ${face} is not an allocated triangle`);
117
+ loop = topology.loop_read_next(loop);
118
+ }
115
119
 
116
- indices.push(scratch_triangle[0], scratch_triangle[1], scratch_triangle[2]);
120
+ assert.equal(loop, first_loop, `face ${face} is not an allocated triangle`);
117
121
  }
118
122
 
119
- const tangent_data = new Float32Array(vertex_pool_size * 4);
123
+ const tangent_data = new Float32Array(wedge_count * 4);
120
124
 
121
125
  geometry_build_tangents(
122
- indices.length, indices, vertex_pool_size,
126
+ indices.length, indices, wedge_count,
123
127
  uv_data, position_data, normal_data, tangent_data
124
128
  );
125
129
 
126
- for (let vertex = 0; vertex < vertex_pool_size; vertex++) {
127
- if (!vertex_pool.is_allocated(vertex) || pinned.has(vertex)) {
130
+ for (let loop = 0; loop < loop_pool.size; loop++) {
131
+ if (!loop_pool.is_allocated(loop)) {
132
+ continue;
133
+ }
134
+
135
+ if (pinned.has(topology.loop_read_vertex(loop))) {
128
136
  continue;
129
137
  }
130
138
 
131
- const address = vertex * 4;
139
+ const address = wedges.find(wedges.of_loop[loop]) * 4;
132
140
 
133
141
  // A tangent that came out non-finite is a frame the shading model cannot use and the
134
142
  // octahedral encoder cannot represent, and it would reach the asset as a silently wrong
@@ -138,6 +146,6 @@ export function vgeo_compute_vertex_tangents(mesh, pinned) {
138
146
  assert.isFinite(tangent_data[address + 2], 'tangent z');
139
147
  assert.isFinite(tangent_data[address + 3], 'tangent handedness');
140
148
 
141
- tangents.write(vertex, tangent_data, address);
149
+ tangents.write(loop, tangent_data, address);
142
150
  }
143
151
  }
@@ -34,13 +34,20 @@
34
34
  * and the fuse would then pick one of those halves to keep. Derived after it, the vertex has its
35
35
  * whole ring. Channels the source did carry are left exactly as they came.
36
36
  *
37
+ * **And the weld no longer flattens what it fused.** It merges *positions*, because connectivity is
38
+ * what it is for; the corners it re-points keep the values they arrived with, so a vertex the source
39
+ * split to say its two sides shade differently comes out of here still saying it. That is
40
+ * `WEDGE_PLAN_2026_09_18.md` §6.2, and the line it deleted was a whole module.
41
+ *
37
42
  * @param {VirtualGeometryMesh} mesh mutated in place
38
43
  * @param {number} weld_ratio fraction of the bounding-box diagonal; see
39
44
  * {@link VGeoBuildOptions#weld_ratio}
45
+ * @param {number} [crease_angle] degrees; see {@link VGeoBuildOptions#crease_angle}. Only reaches a
46
+ * channel the source did not author.
40
47
  * @returns {number} the object-space distance the ratio came to for this mesh
41
48
  *
42
49
  * @author Alex Goldring
43
50
  * @copyright Company Named Limited (c) 2026
44
51
  */
45
- export function vgeo_normalize_source(mesh: VirtualGeometryMesh, weld_ratio: number): number;
52
+ export function vgeo_normalize_source(mesh: VirtualGeometryMesh, weld_ratio: number, crease_angle?: number): number;
46
53
  //# sourceMappingURL=vgeo_normalize_source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_normalize_source.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js"],"names":[],"mappings":"AA+BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,6EAPW,MAAM,GAEJ,MAAM,CAyClB"}
1
+ {"version":3,"file":"vgeo_normalize_source.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js"],"names":[],"mappings":"AAiCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,6EATW,MAAM,iBAEN,MAAM,GAEJ,MAAM,CA+ClB"}
@@ -19,6 +19,8 @@ import {
19
19
  } from "../../../../../../core/geom/3d/topology/struct/binary/io/vertex/bt_mesh_relative_merge_distance.js";
20
20
  import { bt_mesh_validate } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js";
21
21
  import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
22
+ import { vgeo_mesh_wedges } from "../../format/attribute/vgeo_mesh_wedges.js";
23
+ import { VGEO_CREASE_ANGLE } from "./VGEO_CREASE_ANGLE.js";
22
24
  import { vgeo_compute_vertex_normals } from "./vgeo_compute_vertex_normals.js";
23
25
  import { vgeo_compute_vertex_tangents } from "./vgeo_compute_vertex_tangents.js";
24
26
 
@@ -65,15 +67,22 @@ const NOTHING_PINNED = new Set();
65
67
  * and the fuse would then pick one of those halves to keep. Derived after it, the vertex has its
66
68
  * whole ring. Channels the source did carry are left exactly as they came.
67
69
  *
70
+ * **And the weld no longer flattens what it fused.** It merges *positions*, because connectivity is
71
+ * what it is for; the corners it re-points keep the values they arrived with, so a vertex the source
72
+ * split to say its two sides shade differently comes out of here still saying it. That is
73
+ * `WEDGE_PLAN_2026_09_18.md` §6.2, and the line it deleted was a whole module.
74
+ *
68
75
  * @param {VirtualGeometryMesh} mesh mutated in place
69
76
  * @param {number} weld_ratio fraction of the bounding-box diagonal; see
70
77
  * {@link VGeoBuildOptions#weld_ratio}
78
+ * @param {number} [crease_angle] degrees; see {@link VGeoBuildOptions#crease_angle}. Only reaches a
79
+ * channel the source did not author.
71
80
  * @returns {number} the object-space distance the ratio came to for this mesh
72
81
  *
73
82
  * @author Alex Goldring
74
83
  * @copyright Company Named Limited (c) 2026
75
84
  */
76
- export function vgeo_normalize_source(mesh, weld_ratio) {
85
+ export function vgeo_normalize_source(mesh, weld_ratio, crease_angle = VGEO_CREASE_ANGLE) {
77
86
  const topology = mesh.topology;
78
87
 
79
88
  const weld_distance = bt_mesh_relative_merge_distance(topology, weld_ratio);
@@ -101,11 +110,17 @@ export function vgeo_normalize_source(mesh, weld_ratio) {
101
110
  // Normals first: the tangent solve reads them, and a synthesized normal beside an authored
102
111
  // tangent is still the pair the frame is built from.
103
112
  if (mesh.synthesized[VGEO_ATTRIBUTE.NORMAL]) {
104
- vgeo_compute_vertex_normals(mesh, NOTHING_PINNED);
113
+ vgeo_compute_vertex_normals(mesh, NOTHING_PINNED, crease_angle);
105
114
  }
106
115
 
116
+ /*
117
+ And the wedges only once the normals are settled, because a crease the pass above just made is
118
+ one of the things a wedge is. A tangent it has not computed yet is uniform and splits nothing,
119
+ and the one it is about to compute is a function of the wedge -- so this partition is the same
120
+ one `vgeo_build_leaf_frontier` reads back afterwards, with or without the tangent in it.
121
+ */
107
122
  if (mesh.synthesized[VGEO_ATTRIBUTE.TANGENT]) {
108
- vgeo_compute_vertex_tangents(mesh, NOTHING_PINNED);
123
+ vgeo_compute_vertex_tangents(mesh, NOTHING_PINNED, vgeo_mesh_wedges(topology));
109
124
  }
110
125
 
111
126
  return weld_distance;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Turn the per-channel weight *ratios* an asset is built with into the per-component weights the
3
+ * simplifier's metric needs, against this mesh's own size.
4
+ *
5
+ * ## Why there is a weight at all
6
+ *
7
+ * An attribute quadric's gradient carries units of *attribute per length*, so what it evaluates to
8
+ * is dimensionless, while the geometric quadric beside it evaluates to a squared length. Summing
9
+ * those without saying how a unit of one compares with a unit of the other is meaningless — the
10
+ * answer would depend on nothing but the arbitrary range the channel happens to use. The weight is
11
+ * that statement: how many object-space units of position error a full unit of this channel is
12
+ * worth.
13
+ *
14
+ * ## Why it is a ratio
15
+ *
16
+ * For the same reason {@link VGeoBuildOptions#weld_ratio} is. A conversion is many geometries at
17
+ * many sizes, and a fixed distance that is right for a doorknob is wrong for a cathedral; a fraction
18
+ * of the geometry's own diagonal is right for both.
19
+ *
20
+ * **Resolve it once, off the source, before any pass has removed anything**, and hand the result
21
+ * down — every level of the DAG has to be built against the same statement, and the mesh shrinks as
22
+ * the build goes on.
23
+ *
24
+ * The result is indexed by *component of the attribute vector*, not by channel: a normal's three
25
+ * components share one ratio because they are one direction, and the simplifier wants the number
26
+ * beside the value it multiplies.
27
+ *
28
+ * @param {VirtualGeometryMesh} mesh
29
+ * @param {ArrayLike<number>} ratios one per {@link VGEO_ATTRIBUTES} entry; see
30
+ * {@link VGeoBuildOptions#attribute_weight_ratios}
31
+ * @returns {Float64Array} one weight per component of {@link vgeo_attribute_vector_layout}'s vector;
32
+ * empty where the mesh carries no travelling channel at all
33
+ *
34
+ * @author Alex Goldring
35
+ * @copyright Company Named Limited (c) 2026
36
+ */
37
+ export function vgeo_resolve_attribute_weights(mesh: VirtualGeometryMesh, ratios: ArrayLike<number>): Float64Array;
38
+ //# sourceMappingURL=vgeo_resolve_attribute_weights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vgeo_resolve_attribute_weights.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,kFARW,UAAU,MAAM,CAAC,GAEf,YAAY,CAsCxB"}
@@ -0,0 +1,81 @@
1
+ import { assert } from "../../../../../../core/assert.js";
2
+ import { AABB3 } from "../../../../../../core/geom/3d/aabb/AABB3.js";
3
+ import {
4
+ bt_mesh_compute_bounding_box
5
+ } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_compute_bounding_box.js";
6
+ import { vgeo_attribute_vector_layout } from "./vgeo_attribute_vector_layout.js";
7
+
8
+ /**
9
+ * @type {AABB3}
10
+ */
11
+ const scratch_bounds = new AABB3();
12
+
13
+ /**
14
+ * Turn the per-channel weight *ratios* an asset is built with into the per-component weights the
15
+ * simplifier's metric needs, against this mesh's own size.
16
+ *
17
+ * ## Why there is a weight at all
18
+ *
19
+ * An attribute quadric's gradient carries units of *attribute per length*, so what it evaluates to
20
+ * is dimensionless, while the geometric quadric beside it evaluates to a squared length. Summing
21
+ * those without saying how a unit of one compares with a unit of the other is meaningless — the
22
+ * answer would depend on nothing but the arbitrary range the channel happens to use. The weight is
23
+ * that statement: how many object-space units of position error a full unit of this channel is
24
+ * worth.
25
+ *
26
+ * ## Why it is a ratio
27
+ *
28
+ * For the same reason {@link VGeoBuildOptions#weld_ratio} is. A conversion is many geometries at
29
+ * many sizes, and a fixed distance that is right for a doorknob is wrong for a cathedral; a fraction
30
+ * of the geometry's own diagonal is right for both.
31
+ *
32
+ * **Resolve it once, off the source, before any pass has removed anything**, and hand the result
33
+ * down — every level of the DAG has to be built against the same statement, and the mesh shrinks as
34
+ * the build goes on.
35
+ *
36
+ * The result is indexed by *component of the attribute vector*, not by channel: a normal's three
37
+ * components share one ratio because they are one direction, and the simplifier wants the number
38
+ * beside the value it multiplies.
39
+ *
40
+ * @param {VirtualGeometryMesh} mesh
41
+ * @param {ArrayLike<number>} ratios one per {@link VGEO_ATTRIBUTES} entry; see
42
+ * {@link VGeoBuildOptions#attribute_weight_ratios}
43
+ * @returns {Float64Array} one weight per component of {@link vgeo_attribute_vector_layout}'s vector;
44
+ * empty where the mesh carries no travelling channel at all
45
+ *
46
+ * @author Alex Goldring
47
+ * @copyright Company Named Limited (c) 2026
48
+ */
49
+ export function vgeo_resolve_attribute_weights(mesh, ratios) {
50
+ const layout = vgeo_attribute_vector_layout(mesh.layers);
51
+
52
+ const result = new Float64Array(layout.components);
53
+
54
+ if (layout.components === 0) {
55
+ return result;
56
+ }
57
+
58
+ bt_mesh_compute_bounding_box(scratch_bounds, mesh.topology);
59
+
60
+ const diagonal = Math.hypot(
61
+ scratch_bounds.width, scratch_bounds.height, scratch_bounds.depth
62
+ );
63
+
64
+ assert.greaterThan(
65
+ diagonal, 0,
66
+ 'the mesh has no extent for an attribute weight to be a fraction of: every vertex is one point'
67
+ );
68
+
69
+ for (const channel of layout.channels) {
70
+ const weight = ratios[channel.attribute] * diagonal;
71
+
72
+ // A weight of zero makes the channel's whole contribution vanish from the metric and then
73
+ // divides the fit by it, which reaches the asset as a silently infinite value rather than as
74
+ // a channel that does not matter.
75
+ assert.greaterThan(weight, 0, `weight of attribute ${channel.attribute}`);
76
+
77
+ result.fill(weight, channel.offset, channel.offset + channel.count);
78
+ }
79
+
80
+ return result;
81
+ }
@@ -1,9 +1,17 @@
1
+ /**
2
+ * A face-adjacency graph together with the mesh it came from, kept so that repeated splits over the
3
+ * same level do not rebuild it.
4
+ *
5
+ * @author Alex Goldring
6
+ * @copyright Company Named Limited (c) 2026
7
+ */
1
8
  export class VGeoFaceGraph {
2
9
  /**
3
10
  * @param {BinaryTopology} mesh
4
11
  * @param {BinaryTopologyFaceGraph} face_graph
12
+ * @param {BtWedgeSet} wedges
5
13
  */
6
- constructor(mesh: BinaryTopology, face_graph: BinaryTopologyFaceGraph);
14
+ constructor(mesh: BinaryTopology, face_graph: BinaryTopologyFaceGraph, wedges: BtWedgeSet);
7
15
  /**
8
16
  * @type {BinaryTopology}
9
17
  */
@@ -19,10 +27,15 @@ export class VGeoFaceGraph {
19
27
  */
20
28
  vertex_face_ids: Uint32Array;
21
29
  /**
22
- * Scratch stamp for unique-vertex counting, one entry per mesh vertex slot.
30
+ * Which corners of each vertex shade as one, because that is what a cluster's vertices are.
31
+ * @type {BtWedgeSet}
32
+ */
33
+ wedges: BtWedgeSet;
34
+ /**
35
+ * Scratch stamp for unique-wedge counting, one entry per wedge id.
23
36
  * @type {Int32Array}
24
37
  */
25
- vertex_stamp: Int32Array;
38
+ wedge_stamp: Int32Array;
26
39
  /**
27
40
  * Monotonic stamp value, so the scratch never needs clearing.
28
41
  * @type {number}
@@ -42,11 +55,16 @@ export class VGeoFaceGraph {
42
55
  */
43
56
  member_index: Uint32Array;
44
57
  /**
45
- * How many distinct mesh vertices a set of dense face-graph vertices touches.
58
+ * How many distinct **wedges** a set of dense face-graph vertices touches.
59
+ *
60
+ * Wedges and not vertices, because the ceiling this feeds is the meshlet's vertex limit and a
61
+ * meshlet carries one record per wedge: two corners of a vertex that shade differently are two
62
+ * of its vertices. Counting the mesh's instead reads low at every crease and every chart
63
+ * boundary — measured, on a scene of separate hard-edged parts, at 240 against a cap of 128.
46
64
  *
47
65
  * @param {number[]|Int32Array} members dense face-graph vertices
48
66
  * @returns {number}
49
67
  */
50
- count_unique_vertices(members: number[] | Int32Array): number;
68
+ count_unique_wedges(members: number[] | Int32Array): number;
51
69
  }
52
70
  //# sourceMappingURL=VGeoFaceGraph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VGeoFaceGraph.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js"],"names":[],"mappings":"AAcA;IA4CI;;;OAGG;IACH,uEAMC;IArDD;;OAEG;IACH,qBAAY;IAEZ;;;OAGG;IACH,kBAAa;IAEb;;;OAGG;IACH,iBAFU,WAAW,CAEE;IAEvB;;;OAGG;IACH,cAFU,UAAU,CAEA;IAEpB;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;;;OAWG;IACH,cAFU,WAAW,CAED;IAcpB;;;;;OAKG;IACH,+BAHW,MAAM,EAAE,GAAC,UAAU,GACjB,MAAM,CA2BlB;CACJ"}
1
+ {"version":3,"file":"VGeoFaceGraph.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH;IAkDI;;;;OAIG;IACH,2FAOC;IA7DD;;OAEG;IACH,qBAAY;IAEZ;;;OAGG;IACH,kBAAa;IAEb;;;OAGG;IACH,iBAFU,WAAW,CAEE;IAEvB;;;OAGG;IACH,mBAAc;IAEd;;;OAGG;IACH,aAFU,UAAU,CAED;IAEnB;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;;;OAWG;IACH,cAFU,WAAW,CAED;IAgBpB;;;;;;;;;;OAUG;IACH,6BAHW,MAAM,EAAE,GAAC,UAAU,GACjB,MAAM,CA4BlB;CACJ"}
@@ -1,7 +1,3 @@
1
- import {
2
- bt_face_read_triangle_vertices
3
- } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js";
4
-
5
1
  /**
6
2
  * A face-adjacency graph together with the mesh it came from, kept so that repeated splits over the
7
3
  * same level do not rebuild it.
@@ -9,9 +5,6 @@ import {
9
5
  * @author Alex Goldring
10
6
  * @copyright Company Named Limited (c) 2026
11
7
  */
12
-
13
- const scratch_triangle = new Uint32Array(3);
14
-
15
8
  export class VGeoFaceGraph {
16
9
  /**
17
10
  * @type {BinaryTopology}
@@ -31,10 +24,16 @@ export class VGeoFaceGraph {
31
24
  vertex_face_ids = null;
32
25
 
33
26
  /**
34
- * Scratch stamp for unique-vertex counting, one entry per mesh vertex slot.
27
+ * Which corners of each vertex shade as one, because that is what a cluster's vertices are.
28
+ * @type {BtWedgeSet}
29
+ */
30
+ wedges = null;
31
+
32
+ /**
33
+ * Scratch stamp for unique-wedge counting, one entry per wedge id.
35
34
  * @type {Int32Array}
36
35
  */
37
- vertex_stamp = null;
36
+ wedge_stamp = null;
38
37
 
39
38
  /**
40
39
  * Monotonic stamp value, so the scratch never needs clearing.
@@ -59,42 +58,50 @@ export class VGeoFaceGraph {
59
58
  /**
60
59
  * @param {BinaryTopology} mesh
61
60
  * @param {BinaryTopologyFaceGraph} face_graph
61
+ * @param {BtWedgeSet} wedges
62
62
  */
63
- constructor(mesh, face_graph) {
63
+ constructor(mesh, face_graph, wedges) {
64
64
  this.mesh = mesh;
65
65
  this.graph = face_graph.graph;
66
66
  this.vertex_face_ids = face_graph.vertex_face_ids;
67
- this.vertex_stamp = new Int32Array(mesh.vertices.size).fill(-1);
67
+ this.wedges = wedges;
68
+ this.wedge_stamp = new Int32Array(wedges.parent.length).fill(-1);
68
69
  this.member_index = new Uint32Array(face_graph.graph.vertex_count);
69
70
  }
70
71
 
71
72
  /**
72
- * How many distinct mesh vertices a set of dense face-graph vertices touches.
73
+ * How many distinct **wedges** a set of dense face-graph vertices touches.
74
+ *
75
+ * Wedges and not vertices, because the ceiling this feeds is the meshlet's vertex limit and a
76
+ * meshlet carries one record per wedge: two corners of a vertex that shade differently are two
77
+ * of its vertices. Counting the mesh's instead reads low at every crease and every chart
78
+ * boundary — measured, on a scene of separate hard-edged parts, at 240 against a cap of 128.
73
79
  *
74
80
  * @param {number[]|Int32Array} members dense face-graph vertices
75
81
  * @returns {number}
76
82
  */
77
- count_unique_vertices(members) {
83
+ count_unique_wedges(members) {
78
84
  const stamp = this.stamp++;
79
85
 
80
86
  let count = 0;
81
87
 
82
88
  const vertex_face_ids = this.vertex_face_ids;
83
89
  const mesh = this.mesh;
84
- const vertex_stamp = this.vertex_stamp;
90
+ const wedges = this.wedges;
91
+ const wedge_stamp = this.wedge_stamp;
85
92
 
86
93
  for (const member of members) {
94
+ let loop = mesh.face_read_loop(vertex_face_ids[member]);
87
95
 
88
- const face = vertex_face_ids[member];
89
- bt_face_read_triangle_vertices(scratch_triangle, mesh, face);
96
+ for (let corner = 0; corner < 3; corner++) {
97
+ const wedge = wedges.find(wedges.of_loop[loop]);
90
98
 
91
- for (let i = 0; i < 3; i++) {
92
- const vertex = scratch_triangle[i];
93
-
94
- if (vertex_stamp[vertex] !== stamp) {
95
- vertex_stamp[vertex] = stamp;
99
+ if (wedge_stamp[wedge] !== stamp) {
100
+ wedge_stamp[wedge] = stamp;
96
101
  count++;
97
102
  }
103
+
104
+ loop = mesh.loop_read_next(loop);
98
105
  }
99
106
  }
100
107
 
@@ -115,7 +115,7 @@ export function vgeo_split_face_set(face_graph, members, max_faces, max_vertices
115
115
  for (const component of components) {
116
116
  if (
117
117
  component.length <= max_faces
118
- && face_graph.count_unique_vertices(component) <= max_vertices
118
+ && face_graph.count_unique_wedges(component) <= max_vertices
119
119
  ) {
120
120
  result.push(component);
121
121
 
@@ -1 +1 @@
1
- {"version":3,"file":"vgeo_split_face_set_packed.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js"],"names":[],"mappings":"AAwLA;;;;;;;;;;;;GAYG;AACH,+EALW,MAAM,EAAE,aACR,MAAM,gBACN,MAAM,GACJ,MAAM,EAAE,EAAE,CAWtB"}
1
+ {"version":3,"file":"vgeo_split_face_set_packed.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js"],"names":[],"mappings":"AAmVA;;;;;;;;;;;;GAYG;AACH,+EALW,MAAM,EAAE,aACR,MAAM,gBACN,MAAM,GACJ,MAAM,EAAE,EAAE,CAoBtB"}