@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,104 @@
1
+ import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
2
+
3
+ /**
4
+ * The 3-D quadric an attribute quadric becomes once its attributes have been solved out of it.
5
+ *
6
+ * ## Why there is one at all
7
+ *
8
+ * The accumulated form is a quadratic in `3 + m` unknowns — a position and a value per channel. But
9
+ * the channels appear in it only as `-2 s_i (G_i . v + D_i) + s_i^2 W`, which is minimised exactly,
10
+ * with no search, at `s_i = (G_i . v + D_i) / W`. Substituting that back removes them, and what is
11
+ * left is a quadric in the position alone:
12
+ *
13
+ * ```
14
+ * A = P - SUM_i (G_i G_i^T) / W
15
+ * b = q - SUM_i (D_i G_i) / W
16
+ * c = r - SUM_i (D_i^2) / W
17
+ * ```
18
+ *
19
+ * That is the whole reason to hold Hoppe's form rather than the `(3 + m)`-dimensional lift: placing
20
+ * the vertex stays a 3x3 solve however many channels the mesh carries, and the channels' influence
21
+ * on *where it goes* is not lost — it is in `A` and `b`.
22
+ *
23
+ * The output is {@link Quadric3}-shaped, so `quadric3_optimize` places the vertex and
24
+ * `quadric3_evaluate` reads the attribute error at a position, both unchanged.
25
+ *
26
+ * ## What its weight is not
27
+ *
28
+ * Slot 10 carries the accumulated triangle count, as the header did. It is **not** a plane count,
29
+ * and {@link quadric3_distance} on this quadric is not a length: the value is an attribute residual
30
+ * in whatever units the caller's weights put it in. A caller wanting a length evaluates the *pure
31
+ * geometric* quadric at the position this one helped choose, which is the whole of the units
32
+ * discipline (`VIRTUAL_GEOMETRY_DESIGN.md` §3).
33
+ *
34
+ * A quadric that has accumulated nothing has no attributes to solve out and reduces to zero, which
35
+ * is what an empty quadric should add to a sum.
36
+ *
37
+ * @param {number[]|Float32Array|Float64Array} out destination, `QUADRIC3_SIZE` elements from
38
+ * `out_offset`, overwritten
39
+ * @param {number} out_offset
40
+ * @param {ArrayLike<number>} q `quadric_attribute_size(components)` elements from `q_offset`
41
+ * @param {number} q_offset
42
+ * @param {number} components number of scalar channels
43
+ *
44
+ * @author Alex Goldring
45
+ * @copyright Company Named Limited (c) 2026
46
+ */
47
+ export function quadric_attribute_reduce(out, out_offset, q, q_offset, components) {
48
+ const weight = q[q_offset + 10];
49
+
50
+ if (weight <= 0) {
51
+ for (let i = 0; i < QUADRIC3_SIZE; i++) {
52
+ out[out_offset + i] = 0;
53
+ }
54
+
55
+ return;
56
+ }
57
+
58
+ let a00 = q[q_offset];
59
+ let a01 = q[q_offset + 1];
60
+ let a02 = q[q_offset + 2];
61
+ let a11 = q[q_offset + 4];
62
+ let a12 = q[q_offset + 5];
63
+ let a22 = q[q_offset + 7];
64
+
65
+ let b0 = q[q_offset + 3];
66
+ let b1 = q[q_offset + 6];
67
+ let b2 = q[q_offset + 8];
68
+
69
+ let c = q[q_offset + 9];
70
+
71
+ for (let component = 0; component < components; component++) {
72
+ const tail = q_offset + QUADRIC3_SIZE + component * 4;
73
+
74
+ const gx = q[tail];
75
+ const gy = q[tail + 1];
76
+ const gz = q[tail + 2];
77
+ const d = q[tail + 3];
78
+
79
+ a00 -= gx * gx / weight;
80
+ a01 -= gx * gy / weight;
81
+ a02 -= gx * gz / weight;
82
+ a11 -= gy * gy / weight;
83
+ a12 -= gy * gz / weight;
84
+ a22 -= gz * gz / weight;
85
+
86
+ b0 -= d * gx / weight;
87
+ b1 -= d * gy / weight;
88
+ b2 -= d * gz / weight;
89
+
90
+ c -= d * d / weight;
91
+ }
92
+
93
+ out[out_offset] = a00;
94
+ out[out_offset + 1] = a01;
95
+ out[out_offset + 2] = a02;
96
+ out[out_offset + 3] = b0;
97
+ out[out_offset + 4] = a11;
98
+ out[out_offset + 5] = a12;
99
+ out[out_offset + 6] = b1;
100
+ out[out_offset + 7] = a22;
101
+ out[out_offset + 8] = b2;
102
+ out[out_offset + 9] = c;
103
+ out[out_offset + 10] = weight;
104
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Set an attribute quadric to one triangle's contribution: how much a candidate `(position,
3
+ * attributes)` disagrees with the linear field this triangle's corners describe.
4
+ *
5
+ * ## What the field is
6
+ *
7
+ * Over a triangle, an attribute that interpolates its three corners is an affine function of
8
+ * position, `s(p) = g . p + d`. Three corner values give three equations in four unknowns; the
9
+ * fourth is that the field does not vary *off* the surface, `g . n = 0`, which is what makes it a
10
+ * function of the surface rather than of space. With `e1 = b - a`, `e2 = c - a` and `n` their unit
11
+ * cross product:
12
+ *
13
+ * ```
14
+ * g = ( (s_b - s_a) * (e2 x n) + (s_c - s_a) * (n x e1) ) / |e1 x e2|
15
+ * d = s_a - g . a
16
+ * ```
17
+ *
18
+ * The error of a candidate `(v, s)` against this triangle is then `(g . v + d - s)^2` per channel,
19
+ * and what is accumulated here is everything in that expression that does not involve `s`, plus the
20
+ * two terms per channel that do. {@link quadric_attribute_reduce} does the rest, once, at solve
21
+ * time.
22
+ *
23
+ * ## Weights
24
+ *
25
+ * `g` carries units of *attribute per length*, so the error above is dimensionless while the
26
+ * geometric quadric beside it evaluates to a squared length. Adding those without saying how they
27
+ * compare is meaningless, so each channel carries a weight with units of length and the field is
28
+ * built over `weight * s` rather than over `s`. {@link quadric_attribute_solve} divides it back out.
29
+ *
30
+ * ## Slivers
31
+ *
32
+ * `g` divides by twice the triangle's area, so a sliver produces an enormous gradient off a
33
+ * negligible amount of surface. A triangle whose corners are within `EPSILON` of collinear
34
+ * contributes nothing at all rather than that: the quadric is zeroed and `false` comes back.
35
+ * The test is on the sine of the corner angle rather than on the area, so it names slivers and not
36
+ * merely small triangles — a small well-shaped triangle has a large gradient *and means it*.
37
+ *
38
+ * @param {number[]|Float32Array|Float64Array} out destination, `quadric_attribute_size(components)`
39
+ * elements from `out_offset`, overwritten
40
+ * @param {number} out_offset
41
+ * @param {number} components number of scalar channels
42
+ * @param {ArrayLike<number>} weights one per channel, `components` elements
43
+ * @param {number} ax first corner
44
+ * @param {number} ay
45
+ * @param {number} az
46
+ * @param {number} bx second corner
47
+ * @param {number} by
48
+ * @param {number} bz
49
+ * @param {number} cx third corner
50
+ * @param {number} cy
51
+ * @param {number} cz
52
+ * @param {ArrayLike<number>} values the attribute vector the three corners are read out of
53
+ * @param {number} a_offset first corner's record within `values`
54
+ * @param {number} b_offset
55
+ * @param {number} c_offset
56
+ * @returns {boolean} whether the triangle described a field at all
57
+ *
58
+ * @author Alex Goldring
59
+ * @copyright Company Named Limited (c) 2026
60
+ */
61
+ export function quadric_attribute_set_from_triangle(out: number[] | Float32Array | Float64Array, out_offset: number, components: number, weights: ArrayLike<number>, ax: number, ay: number, az: number, bx: number, by: number, bz: number, cx: number, cy: number, cz: number, values: ArrayLike<number>, a_offset: number, b_offset: number, c_offset: number): boolean;
62
+ //# sourceMappingURL=quadric_attribute_set_from_triangle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quadric_attribute_set_from_triangle.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,yDAvBW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,cACN,MAAM,WACN,UAAU,MAAM,CAAC,MACjB,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,UACN,UAAU,MAAM,CAAC,YACjB,MAAM,YACN,MAAM,YACN,MAAM,GACJ,OAAO,CAkGnB"}
@@ -0,0 +1,158 @@
1
+ import { assert } from "../../../assert.js";
2
+ import { EPSILON } from "../../../math/EPSILON.js";
3
+ import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
4
+
5
+ /**
6
+ * Set an attribute quadric to one triangle's contribution: how much a candidate `(position,
7
+ * attributes)` disagrees with the linear field this triangle's corners describe.
8
+ *
9
+ * ## What the field is
10
+ *
11
+ * Over a triangle, an attribute that interpolates its three corners is an affine function of
12
+ * position, `s(p) = g . p + d`. Three corner values give three equations in four unknowns; the
13
+ * fourth is that the field does not vary *off* the surface, `g . n = 0`, which is what makes it a
14
+ * function of the surface rather than of space. With `e1 = b - a`, `e2 = c - a` and `n` their unit
15
+ * cross product:
16
+ *
17
+ * ```
18
+ * g = ( (s_b - s_a) * (e2 x n) + (s_c - s_a) * (n x e1) ) / |e1 x e2|
19
+ * d = s_a - g . a
20
+ * ```
21
+ *
22
+ * The error of a candidate `(v, s)` against this triangle is then `(g . v + d - s)^2` per channel,
23
+ * and what is accumulated here is everything in that expression that does not involve `s`, plus the
24
+ * two terms per channel that do. {@link quadric_attribute_reduce} does the rest, once, at solve
25
+ * time.
26
+ *
27
+ * ## Weights
28
+ *
29
+ * `g` carries units of *attribute per length*, so the error above is dimensionless while the
30
+ * geometric quadric beside it evaluates to a squared length. Adding those without saying how they
31
+ * compare is meaningless, so each channel carries a weight with units of length and the field is
32
+ * built over `weight * s` rather than over `s`. {@link quadric_attribute_solve} divides it back out.
33
+ *
34
+ * ## Slivers
35
+ *
36
+ * `g` divides by twice the triangle's area, so a sliver produces an enormous gradient off a
37
+ * negligible amount of surface. A triangle whose corners are within `EPSILON` of collinear
38
+ * contributes nothing at all rather than that: the quadric is zeroed and `false` comes back.
39
+ * The test is on the sine of the corner angle rather than on the area, so it names slivers and not
40
+ * merely small triangles — a small well-shaped triangle has a large gradient *and means it*.
41
+ *
42
+ * @param {number[]|Float32Array|Float64Array} out destination, `quadric_attribute_size(components)`
43
+ * elements from `out_offset`, overwritten
44
+ * @param {number} out_offset
45
+ * @param {number} components number of scalar channels
46
+ * @param {ArrayLike<number>} weights one per channel, `components` elements
47
+ * @param {number} ax first corner
48
+ * @param {number} ay
49
+ * @param {number} az
50
+ * @param {number} bx second corner
51
+ * @param {number} by
52
+ * @param {number} bz
53
+ * @param {number} cx third corner
54
+ * @param {number} cy
55
+ * @param {number} cz
56
+ * @param {ArrayLike<number>} values the attribute vector the three corners are read out of
57
+ * @param {number} a_offset first corner's record within `values`
58
+ * @param {number} b_offset
59
+ * @param {number} c_offset
60
+ * @returns {boolean} whether the triangle described a field at all
61
+ *
62
+ * @author Alex Goldring
63
+ * @copyright Company Named Limited (c) 2026
64
+ */
65
+ export function quadric_attribute_set_from_triangle(
66
+ out, out_offset, components, weights,
67
+ ax, ay, az, bx, by, bz, cx, cy, cz,
68
+ values, a_offset, b_offset, c_offset
69
+ ) {
70
+ assert.isNonNegativeInteger(components, 'components');
71
+
72
+ const size = QUADRIC3_SIZE + components * 4;
73
+
74
+ for (let i = 0; i < size; i++) {
75
+ out[out_offset + i] = 0;
76
+ }
77
+
78
+ const e1x = bx - ax;
79
+ const e1y = by - ay;
80
+ const e1z = bz - az;
81
+
82
+ const e2x = cx - ax;
83
+ const e2y = cy - ay;
84
+ const e2z = cz - az;
85
+
86
+ const nx = e1y * e2z - e1z * e2y;
87
+ const ny = e1z * e2x - e1x * e2z;
88
+ const nz = e1x * e2y - e1y * e2x;
89
+
90
+ const determinant = Math.sqrt(nx * nx + ny * ny + nz * nz);
91
+
92
+ const e1_length = Math.sqrt(e1x * e1x + e1y * e1y + e1z * e1z);
93
+ const e2_length = Math.sqrt(e2x * e2x + e2y * e2y + e2z * e2z);
94
+
95
+ // `determinant` is `|e1| |e2| sin(angle)`, so this is the sine, and a scale-free sliver test.
96
+ if (determinant <= EPSILON * e1_length * e2_length) {
97
+ return false;
98
+ }
99
+
100
+ const unit_nx = nx / determinant;
101
+ const unit_ny = ny / determinant;
102
+ const unit_nz = nz / determinant;
103
+
104
+ // The two columns of the inverse that the corner differences multiply: e2 x n, and n x e1.
105
+ const p1x = e2y * unit_nz - e2z * unit_ny;
106
+ const p1y = e2z * unit_nx - e2x * unit_nz;
107
+ const p1z = e2x * unit_ny - e2y * unit_nx;
108
+
109
+ const p2x = unit_ny * e1z - unit_nz * e1y;
110
+ const p2y = unit_nz * e1x - unit_nx * e1z;
111
+ const p2z = unit_nx * e1y - unit_ny * e1x;
112
+
113
+ for (let component = 0; component < components; component++) {
114
+ const weight = weights[component];
115
+
116
+ const sa = values[a_offset + component] * weight;
117
+ const sb = values[b_offset + component] * weight;
118
+ const sc = values[c_offset + component] * weight;
119
+
120
+ const db = (sb - sa) / determinant;
121
+ const dc = (sc - sa) / determinant;
122
+
123
+ const gx = db * p1x + dc * p2x;
124
+ const gy = db * p1y + dc * p2y;
125
+ const gz = db * p1z + dc * p2z;
126
+
127
+ const d = sa - (gx * ax + gy * ay + gz * az);
128
+
129
+ // P += g g^T, in the header's `A` slots
130
+ out[out_offset] += gx * gx;
131
+ out[out_offset + 1] += gx * gy;
132
+ out[out_offset + 2] += gx * gz;
133
+ out[out_offset + 4] += gy * gy;
134
+ out[out_offset + 5] += gy * gz;
135
+ out[out_offset + 7] += gz * gz;
136
+
137
+ // q += d g, in the header's `b` slots
138
+ out[out_offset + 3] += d * gx;
139
+ out[out_offset + 6] += d * gy;
140
+ out[out_offset + 8] += d * gz;
141
+
142
+ // r += d^2, in the header's `c` slot
143
+ out[out_offset + 9] += d * d;
144
+
145
+ const tail = out_offset + QUADRIC3_SIZE + component * 4;
146
+
147
+ out[tail] = gx;
148
+ out[tail + 1] = gy;
149
+ out[tail + 2] = gz;
150
+ out[tail + 3] = d;
151
+ }
152
+
153
+ // One triangle, weighing one -- the convention `quadric3_set_from_vector4` sets for the
154
+ // geometric quadric this one is summed with, and what makes the two commensurate.
155
+ out[out_offset + 10] = 1;
156
+
157
+ return true;
158
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * How many elements an attribute quadric over `components` scalar channels occupies.
3
+ *
4
+ * `QUADRIC3_SIZE` of header — which is a {@link Quadric3} in layout as well as in size, so every
5
+ * `quadric3_*` function reads it — followed by four per channel: the accumulated gradient and the
6
+ * accumulated offset of that channel's linear field.
7
+ *
8
+ * This is Hoppe's form (*New Quadric Metric for Simplifying Meshes with Appearance Attributes*,
9
+ * 1999) rather than the naive lift of Garland & Heckbert's metric into `3 + m` dimensions, which
10
+ * would need `(m + 4)(m + 5) / 2` elements and a solve of the same order. Both answer the same
11
+ * question; at five channels this is 31 elements against 36, at thirteen it is 63 against 136, and
12
+ * the placement solve stays 3x3 either way.
13
+ *
14
+ * @param {number} components number of scalar channels
15
+ * @returns {number}
16
+ *
17
+ * @author Alex Goldring
18
+ * @copyright Company Named Limited (c) 2026
19
+ */
20
+ export function quadric_attribute_size(components: number): number;
21
+ //# sourceMappingURL=quadric_attribute_size.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quadric_attribute_size.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_size.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,mDANW,MAAM,GACJ,MAAM,CAOlB"}
@@ -0,0 +1,24 @@
1
+ import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
2
+
3
+ /**
4
+ * How many elements an attribute quadric over `components` scalar channels occupies.
5
+ *
6
+ * `QUADRIC3_SIZE` of header — which is a {@link Quadric3} in layout as well as in size, so every
7
+ * `quadric3_*` function reads it — followed by four per channel: the accumulated gradient and the
8
+ * accumulated offset of that channel's linear field.
9
+ *
10
+ * This is Hoppe's form (*New Quadric Metric for Simplifying Meshes with Appearance Attributes*,
11
+ * 1999) rather than the naive lift of Garland & Heckbert's metric into `3 + m` dimensions, which
12
+ * would need `(m + 4)(m + 5) / 2` elements and a solve of the same order. Both answer the same
13
+ * question; at five channels this is 31 elements against 36, at thirteen it is 63 against 136, and
14
+ * the placement solve stays 3x3 either way.
15
+ *
16
+ * @param {number} components number of scalar channels
17
+ * @returns {number}
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+ export function quadric_attribute_size(components) {
23
+ return QUADRIC3_SIZE + components * 4;
24
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The attribute values that best explain everything a quadric has accumulated, at a given position.
3
+ *
4
+ * `s_i = (G_i . v + D_i) / W`, which is exact rather than iterative: the channels enter the
5
+ * accumulated error only quadratically and separably, so each one's minimum is where its derivative
6
+ * is zero and there is nothing to search. {@link quadric_attribute_reduce} is the same substitution
7
+ * seen from the other side.
8
+ *
9
+ * The result is a **fit**, not an average, and it is not confined to the values that went in. That is
10
+ * correct and is the point: a linear field extrapolates, and a vertex placed a little outside the
11
+ * patch it stands for should carry the value the patch's field has *there*. A caller whose channel
12
+ * has a range — a colour, say — clamps afterwards; a caller whose channel is a direction
13
+ * renormalizes.
14
+ *
15
+ * Nothing comes back for a quadric that has accumulated nothing. There is no field to evaluate, and
16
+ * inventing one would be worse than leaving the caller its own value.
17
+ *
18
+ * @param {number[]|Float32Array|Float64Array} out destination, `components` elements from
19
+ * `out_offset`, written only when this returns `true`
20
+ * @param {number} out_offset
21
+ * @param {ArrayLike<number>} q `quadric_attribute_size(components)` elements from `q_offset`
22
+ * @param {number} q_offset
23
+ * @param {number} components number of scalar channels
24
+ * @param {ArrayLike<number>} weights one per channel, the same ones the quadric was built with
25
+ * @param {number} x position to evaluate the field at
26
+ * @param {number} y
27
+ * @param {number} z
28
+ * @returns {boolean} whether there was a field to evaluate
29
+ *
30
+ * @author Alex Goldring
31
+ * @copyright Company Named Limited (c) 2026
32
+ */
33
+ export function quadric_attribute_solve(out: number[] | Float32Array | Float64Array, out_offset: number, q: ArrayLike<number>, q_offset: number, components: number, weights: ArrayLike<number>, x: number, y: number, z: number): boolean;
34
+ //# sourceMappingURL=quadric_attribute_solve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quadric_attribute_solve.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_solve.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,6CAfW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,KACN,UAAU,MAAM,CAAC,YACjB,MAAM,cACN,MAAM,WACN,UAAU,MAAM,CAAC,KACjB,MAAM,KACN,MAAM,KACN,MAAM,GACJ,OAAO,CAyBnB"}
@@ -0,0 +1,55 @@
1
+ import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
2
+
3
+ /**
4
+ * The attribute values that best explain everything a quadric has accumulated, at a given position.
5
+ *
6
+ * `s_i = (G_i . v + D_i) / W`, which is exact rather than iterative: the channels enter the
7
+ * accumulated error only quadratically and separably, so each one's minimum is where its derivative
8
+ * is zero and there is nothing to search. {@link quadric_attribute_reduce} is the same substitution
9
+ * seen from the other side.
10
+ *
11
+ * The result is a **fit**, not an average, and it is not confined to the values that went in. That is
12
+ * correct and is the point: a linear field extrapolates, and a vertex placed a little outside the
13
+ * patch it stands for should carry the value the patch's field has *there*. A caller whose channel
14
+ * has a range — a colour, say — clamps afterwards; a caller whose channel is a direction
15
+ * renormalizes.
16
+ *
17
+ * Nothing comes back for a quadric that has accumulated nothing. There is no field to evaluate, and
18
+ * inventing one would be worse than leaving the caller its own value.
19
+ *
20
+ * @param {number[]|Float32Array|Float64Array} out destination, `components` elements from
21
+ * `out_offset`, written only when this returns `true`
22
+ * @param {number} out_offset
23
+ * @param {ArrayLike<number>} q `quadric_attribute_size(components)` elements from `q_offset`
24
+ * @param {number} q_offset
25
+ * @param {number} components number of scalar channels
26
+ * @param {ArrayLike<number>} weights one per channel, the same ones the quadric was built with
27
+ * @param {number} x position to evaluate the field at
28
+ * @param {number} y
29
+ * @param {number} z
30
+ * @returns {boolean} whether there was a field to evaluate
31
+ *
32
+ * @author Alex Goldring
33
+ * @copyright Company Named Limited (c) 2026
34
+ */
35
+ export function quadric_attribute_solve(
36
+ out, out_offset, q, q_offset, components, weights, x, y, z
37
+ ) {
38
+ const weight = q[q_offset + 10];
39
+
40
+ if (weight <= 0) {
41
+ return false;
42
+ }
43
+
44
+ for (let component = 0; component < components; component++) {
45
+ const tail = q_offset + QUADRIC3_SIZE + component * 4;
46
+
47
+ const value = (q[tail] * x + q[tail + 1] * y + q[tail + 2] * z + q[tail + 3]) / weight;
48
+
49
+ // Built over `weight * s` so the residual would compare with a squared length; this is where
50
+ // that comes back off.
51
+ out[out_offset + component] = value / weights[component];
52
+ }
53
+
54
+ return true;
55
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Subtract one attribute quadric from another, elementwise — the inverse of
3
+ * {@link quadric_attribute_add}.
4
+ *
5
+ * What it is for is the same thing {@link quadric3_sub} is for: recovering what a pass *added* to a
6
+ * quadric, when two passes started from the same one. Two group steps sharing a pinned boundary
7
+ * vertex each begin from that vertex's quadric and each fold their own victims onto it, so the two
8
+ * results overlap by exactly the quadric they both began with; adding them whole would count the
9
+ * source under that vertex twice.
10
+ *
11
+ * The difference of two quadrics is not itself a sum of anything, and its weight can come out
12
+ * negative. Nothing here objects — a gain is meant to be added back to the quadric it was measured
13
+ * against, not evaluated on its own.
14
+ *
15
+ * @param {number[]|Float32Array|Float64Array} out `quadric_attribute_size(components)` elements from
16
+ * `out_offset`; may alias either input
17
+ * @param {number} out_offset
18
+ * @param {ArrayLike<number>} a
19
+ * @param {number} a_offset
20
+ * @param {ArrayLike<number>} b subtracted from `a`
21
+ * @param {number} b_offset
22
+ * @param {number} components number of scalar channels
23
+ *
24
+ * @author Alex Goldring
25
+ * @copyright Company Named Limited (c) 2026
26
+ */
27
+ export function quadric_attribute_sub(out: number[] | Float32Array | Float64Array, out_offset: number, a: ArrayLike<number>, a_offset: number, b: ArrayLike<number>, b_offset: number, components: number): void;
28
+ //# sourceMappingURL=quadric_attribute_sub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quadric_attribute_sub.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_sub.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,2CAZW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,KACN,UAAU,MAAM,CAAC,YACjB,MAAM,KACN,UAAU,MAAM,CAAC,YACjB,MAAM,cACN,MAAM,QAWhB"}
@@ -0,0 +1,35 @@
1
+ import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
2
+
3
+ /**
4
+ * Subtract one attribute quadric from another, elementwise — the inverse of
5
+ * {@link quadric_attribute_add}.
6
+ *
7
+ * What it is for is the same thing {@link quadric3_sub} is for: recovering what a pass *added* to a
8
+ * quadric, when two passes started from the same one. Two group steps sharing a pinned boundary
9
+ * vertex each begin from that vertex's quadric and each fold their own victims onto it, so the two
10
+ * results overlap by exactly the quadric they both began with; adding them whole would count the
11
+ * source under that vertex twice.
12
+ *
13
+ * The difference of two quadrics is not itself a sum of anything, and its weight can come out
14
+ * negative. Nothing here objects — a gain is meant to be added back to the quadric it was measured
15
+ * against, not evaluated on its own.
16
+ *
17
+ * @param {number[]|Float32Array|Float64Array} out `quadric_attribute_size(components)` elements from
18
+ * `out_offset`; may alias either input
19
+ * @param {number} out_offset
20
+ * @param {ArrayLike<number>} a
21
+ * @param {number} a_offset
22
+ * @param {ArrayLike<number>} b subtracted from `a`
23
+ * @param {number} b_offset
24
+ * @param {number} components number of scalar channels
25
+ *
26
+ * @author Alex Goldring
27
+ * @copyright Company Named Limited (c) 2026
28
+ */
29
+ export function quadric_attribute_sub(out, out_offset, a, a_offset, b, b_offset, components) {
30
+ const size = QUADRIC3_SIZE + components * 4;
31
+
32
+ for (let i = 0; i < size; i++) {
33
+ out[out_offset + i] = a[a_offset + i] - b[b_offset + i];
34
+ }
35
+ }
@@ -107,6 +107,21 @@ export class BinaryDataBlock {
107
107
  * @param {number} source_id element id in `source`
108
108
  */
109
109
  copy_record(id: number, source: BinaryDataBlock, source_id: number): void;
110
+ /**
111
+ * Do two records hold the same bytes?
112
+ *
113
+ * Bytes, not values, and that is the point: this is the test a *wedge* is defined by — a set of
114
+ * corners at one vertex that shade identically — and identity has to be exact for the grouping
115
+ * to be an equivalence relation. A tolerance is not transitive, so grouping by one would depend
116
+ * on the order the corners were visited in, and two runs over the same mesh could disagree.
117
+ *
118
+ * Every byte of the record, so a block gaining a layer needs nothing here.
119
+ *
120
+ * @param {number} a element id in this block
121
+ * @param {number} b element id in this block
122
+ * @returns {boolean}
123
+ */
124
+ record_equal(a: number, b: number): boolean;
110
125
  /**
111
126
  * Take on another block's layers and contents.
112
127
  *
@@ -1 +1 @@
1
- {"version":3,"file":"BinaryDataBlock.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAwCI;;OAEG;IACH,kBAFW,iBAAiB,EAM3B;IAED;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,gCAEC;IAED;;;OAGG;IACH,uBAEC;IAED;;OAEG;IACH,uBAEC;IAED;;OAEG;IACH,0BAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH,gBAJW,cAAc,cACd,MAAM,GACJ,eAAe,CAa3B;IAED;;;OAGG;IACH,0BAFW,MAAM,QAUhB;IAED;;;OAGG;IACH,sBAEC;IAED;;OAEG;IACH,aAQC;IAED;;;;;;;;OAQG;IACH,QAHW,MAAM,KACN,MAAM,QAiBhB;IAED;;;;;;;;;;;;;;OAcG;IACH,gBAJW,MAAM,UACN,eAAe,aACf,MAAM,QAchB;IAED;;;;;;;;OAQG;IACH,YAFW,eAAe,QAyBzB;IA8CL;;;;OAIG;IACH,4BAFU,OAAO,CAE0B;;CAP1C;6BAlTY,OAAO,8CAA8C,EAAE,cAAc;gCACrE,OAAO,wBAAwB,EAAE,iBAAiB;gCAJ/B,sBAAsB"}
1
+ {"version":3,"file":"BinaryDataBlock.d.ts","sourceRoot":"","sources":["../../../../../../../../src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IAwCI;;OAEG;IACH,kBAFW,iBAAiB,EAM3B;IAED;;;OAGG;IACH,0BAEC;IAED;;;OAGG;IACH,gCAEC;IAED;;;OAGG;IACH,uBAEC;IAED;;OAEG;IACH,uBAEC;IAED;;OAEG;IACH,0BAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH,gBAJW,cAAc,cACd,MAAM,GACJ,eAAe,CAa3B;IAED;;;OAGG;IACH,0BAFW,MAAM,QAUhB;IAED;;;OAGG;IACH,sBAEC;IAED;;OAEG;IACH,aAQC;IAED;;;;;;;;OAQG;IACH,QAHW,MAAM,KACN,MAAM,QAiBhB;IAED;;;;;;;;;;;;;;OAcG;IACH,gBAJW,MAAM,UACN,eAAe,aACf,MAAM,QAchB;IAED;;;;;;;;;;;;;OAaG;IACH,gBAJW,MAAM,KACN,MAAM,GACJ,OAAO,CAqBnB;IAED;;;;;;;;OAQG;IACH,YAFW,eAAe,QAyBzB;IA8CL;;;;OAIG;IACH,4BAFU,OAAO,CAE0B;;CAP1C;6BArVY,OAAO,8CAA8C,EAAE,cAAc;gCACrE,OAAO,wBAAwB,EAAE,iBAAiB;gCAJ/B,sBAAsB"}
@@ -233,6 +233,41 @@ export class BinaryDataBlock {
233
233
  );
234
234
  }
235
235
 
236
+ /**
237
+ * Do two records hold the same bytes?
238
+ *
239
+ * Bytes, not values, and that is the point: this is the test a *wedge* is defined by — a set of
240
+ * corners at one vertex that shade identically — and identity has to be exact for the grouping
241
+ * to be an equivalence relation. A tolerance is not transitive, so grouping by one would depend
242
+ * on the order the corners were visited in, and two runs over the same mesh could disagree.
243
+ *
244
+ * Every byte of the record, so a block gaining a layer needs nothing here.
245
+ *
246
+ * @param {number} a element id in this block
247
+ * @param {number} b element id in this block
248
+ * @returns {boolean}
249
+ */
250
+ record_equal(a, b) {
251
+ if (a === b) {
252
+ return true;
253
+ }
254
+
255
+ const record_size = this.#record_size;
256
+
257
+ const from_a = a * record_size;
258
+ const from_b = b * record_size;
259
+
260
+ const data = this.#data_uint8;
261
+
262
+ for (let offset = 0; offset < record_size; offset++) {
263
+ if (data[from_a + offset] !== data[from_b + offset]) {
264
+ return false;
265
+ }
266
+ }
267
+
268
+ return true;
269
+ }
270
+
236
271
  /**
237
272
  * Take on another block's layers and contents.
238
273
  *