@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
@@ -219,14 +219,30 @@ export class OffsetAllocator {
219
219
  * The one node whose neighbour-next is {@link NODE_UNUSED}, so the one describing the arena's
220
220
  * end. {@link OffsetAllocator#grow} needs it in O(1) and has nothing to walk the chain from.
221
221
  *
222
- * Maintained by `#insertNodeIntoBin`, which is the only place a node's end offset is ever set:
223
- * `allocate` only shrinks the node it hands out, and `free_node` re-inserts every merged region
224
- * through that same method.
222
+ * Maintained by `#insertNodeIntoBin`, which is where a node's end offset is set: `allocate`
223
+ * only shrinks the node it hands out, and `free_node` re-inserts every merged region through
224
+ * that same method. The one other writer of an end offset is {@link slide_down}, which moves a
225
+ * free node past the used one it swaps with and sets this itself when that puts the free
226
+ * node at the end.
225
227
  * uint32
226
228
  * @type {number}
227
229
  */
228
230
  #tail_node = NODE_UNUSED;
229
231
 
232
+ /**
233
+ * The one node whose neighbour-prev is {@link NODE_UNUSED}, so the one describing the arena's
234
+ * start. {@link first_used_node} needs it in O(1).
235
+ *
236
+ * Kept from the chain's links rather than from the offset a node is inserted at: a node is
237
+ * inserted with no links and linked by its caller, and a zero-sized node at offset 0 would
238
+ * otherwise be mislabelled. Set by `reset`, by `free_node` when the merged node has no
239
+ * predecessor, by `grow` when it stretches a free run that is the whole arena, and by
240
+ * {@link slide_down} when the used node moves to the front.
241
+ * uint32
242
+ * @type {number}
243
+ */
244
+ #head_node = NODE_UNUSED;
245
+
230
246
  /**
231
247
  *
232
248
  * @param {number} size amount of contiguous elements managed by this allocator (typically bytes)
@@ -283,24 +299,49 @@ export class OffsetAllocator {
283
299
  }
284
300
 
285
301
  /**
302
+ * Whether {@link allocate}`(size)` would land, without allocating: exactly its refusal test —
303
+ * a node left to describe a remainder with, and a filed run of a bin at or above the one the
304
+ * request is looked up from. Node exhaustion is the shortfall no arena size answers, and a
305
+ * probe that ignored it would send a caller to grow for nothing.
286
306
  *
287
307
  * @param {number} size
288
- * @returns {Allocation}
308
+ * @returns {boolean}
289
309
  */
290
- allocate(size) {
310
+ can_allocate(size) {
291
311
  assert.isNonNegativeInteger(size, 'size');
292
312
 
313
+ return this.#allocation_bin(size) !== ALLOCATOR_NO_SPACE;
314
+ }
315
+
316
+ /**
317
+ * The bin {@link allocate}`(size)` takes from, or {@link ALLOCATOR_NO_SPACE} when it is refused.
318
+ *
319
+ * @param {number} size
320
+ * @returns {number}
321
+ */
322
+ #allocation_bin(size) {
293
323
  // Out of allocations?
294
324
  if (this.freeOffset === 0) {
295
- return Allocation.from(ALLOCATOR_NO_SPACE, ALLOCATOR_NO_SPACE);
325
+ return ALLOCATOR_NO_SPACE;
296
326
  }
297
327
 
298
328
  // Round up to the bin index that fits the size: every run filed there or above is
299
329
  // large enough, because a run is filed by rounding its size DOWN.
300
- const bin_index = this.#find_bin_at_least(uintToFloatRoundUp(size));
330
+ return this.#find_bin_at_least(uintToFloatRoundUp(size));
331
+ }
332
+
333
+ /**
334
+ *
335
+ * @param {number} size
336
+ * @returns {Allocation}
337
+ */
338
+ allocate(size) {
339
+ assert.isNonNegativeInteger(size, 'size');
340
+
341
+ const bin_index = this.#allocation_bin(size);
301
342
 
302
343
  if (bin_index === ALLOCATOR_NO_SPACE) {
303
- // out of space
344
+ // out of space, or out of nodes
304
345
  return Allocation.from(ALLOCATOR_NO_SPACE, ALLOCATOR_NO_SPACE);
305
346
  }
306
347
 
@@ -455,7 +496,162 @@ export class OffsetAllocator {
455
496
  if (neighborPrev !== NODE_UNUSED) {
456
497
  nodes.writeCellValue(combinedNodeIndex, NODE_FIELD_NEIGHBOR_PREV, neighborPrev);
457
498
  nodes.writeCellValue(neighborPrev, NODE_FIELD_NEIGHBOR_NEXT, combinedNodeIndex);
499
+ } else {
500
+ // nothing before it: the merged region starts the arena
501
+ this.#head_node = combinedNodeIndex;
502
+ }
503
+ }
504
+
505
+ /**
506
+ * The used node that starts the arena, or {@link ALLOCATOR_NO_SPACE} when nothing is used.
507
+ *
508
+ * Free nodes never adjoin (`free_node` merges both sides), so at most one free node sits
509
+ * before the first used one, and this is a walk of at most one link.
510
+ *
511
+ * @returns {number} node index
512
+ */
513
+ first_used_node() {
514
+ const head = this.#head_node;
515
+
516
+ if (head === NODE_UNUSED) {
517
+ return ALLOCATOR_NO_SPACE;
518
+ }
519
+
520
+ const nodes = this.nodes;
521
+
522
+ if ((nodes.readCellValue(head, NODE_FIELD_FLAGS) & NODE_FLAGS_USED) !== 0) {
523
+ return head;
524
+ }
525
+
526
+ const next = nodes.readCellValue(head, NODE_FIELD_NEIGHBOR_NEXT);
527
+
528
+ return next === NODE_UNUSED ? ALLOCATOR_NO_SPACE : next;
529
+ }
530
+
531
+ /**
532
+ * The used node after `node_index` in address order, or {@link ALLOCATOR_NO_SPACE} at the
533
+ * arena's end. At most one free node sits between two used ones, so a walk of at most two
534
+ * links.
535
+ *
536
+ * @param {number} node_index a used node
537
+ * @returns {number} node index
538
+ */
539
+ next_used_node(node_index) {
540
+ assert.isNonNegativeInteger(node_index, 'node_index');
541
+
542
+ const nodes = this.nodes;
543
+
544
+ assert.notEqual(nodes.readCellValue(node_index, NODE_FIELD_FLAGS) & NODE_FLAGS_USED, 0, 'node is not in use');
545
+
546
+ let next = nodes.readCellValue(node_index, NODE_FIELD_NEIGHBOR_NEXT);
547
+
548
+ if (next === NODE_UNUSED) {
549
+ return ALLOCATOR_NO_SPACE;
550
+ }
551
+
552
+ if ((nodes.readCellValue(next, NODE_FIELD_FLAGS) & NODE_FLAGS_USED) === 0) {
553
+ next = nodes.readCellValue(next, NODE_FIELD_NEIGHBOR_NEXT);
554
+
555
+ if (next === NODE_UNUSED) {
556
+ return ALLOCATOR_NO_SPACE;
557
+ }
558
+ }
559
+
560
+ return next;
561
+ }
562
+
563
+ /**
564
+ * Move a used range down over the free range immediately before it, in O(1).
565
+ *
566
+ * The two nodes swap places: the used node's offset drops by the free node's size, the free
567
+ * node's offset rises by the used node's size. The free node's size — and so its bin — is
568
+ * unchanged, so its bin-list membership is untouched. If the free node then adjoins a free
569
+ * successor the two are merged, which returns one node to the freelist; nothing here ever
570
+ * takes a node. The used node keeps its index, so an {@link Allocation} a caller holds for it
571
+ * is still its handle — the caller updates the allocation's `offset` by the returned delta,
572
+ * as this method does not know the object.
573
+ *
574
+ * A sliding compactor walks the used nodes in address order calling this on each: every hole
575
+ * passed gathers into one free node just behind the walk, and the walk ends with all free
576
+ * space in one run at the tail (COMPACTION_PLAN_2026_09_16 §4.2–4.3).
577
+ *
578
+ * @param {number} node_index a used node
579
+ * @returns {number} how far the range moved: the free predecessor's size, or 0 when the
580
+ * predecessor is used or there is none
581
+ */
582
+ slide_down(node_index) {
583
+ assert.isNonNegativeInteger(node_index, 'node_index');
584
+
585
+ const nodes = this.nodes;
586
+
587
+ assert.notEqual(nodes.readCellValue(node_index, NODE_FIELD_FLAGS) & NODE_FLAGS_USED, 0, 'node is not in use');
588
+
589
+ const free_node = nodes.readCellValue(node_index, NODE_FIELD_NEIGHBOR_PREV);
590
+
591
+ if (
592
+ free_node === NODE_UNUSED
593
+ || (nodes.readCellValue(free_node, NODE_FIELD_FLAGS) & NODE_FLAGS_USED) !== 0
594
+ ) {
595
+ return 0;
596
+ }
597
+
598
+ const free_size = nodes.readCellValue(free_node, NODE_FIELD_DATA_SIZE);
599
+ const free_offset = nodes.readCellValue(free_node, NODE_FIELD_DATA_OFFSET);
600
+ const used_size = nodes.readCellValue(node_index, NODE_FIELD_DATA_SIZE);
601
+
602
+ const before = nodes.readCellValue(free_node, NODE_FIELD_NEIGHBOR_PREV);
603
+ const after = nodes.readCellValue(node_index, NODE_FIELD_NEIGHBOR_NEXT);
604
+
605
+ // the swap: [before] [used] [free] [after]
606
+ nodes.writeCellValue(node_index, NODE_FIELD_DATA_OFFSET, free_offset);
607
+ nodes.writeCellValue(free_node, NODE_FIELD_DATA_OFFSET, free_offset + used_size);
608
+
609
+ nodes.writeCellValue(node_index, NODE_FIELD_NEIGHBOR_PREV, before);
610
+ nodes.writeCellValue(node_index, NODE_FIELD_NEIGHBOR_NEXT, free_node);
611
+ nodes.writeCellValue(free_node, NODE_FIELD_NEIGHBOR_PREV, node_index);
612
+ nodes.writeCellValue(free_node, NODE_FIELD_NEIGHBOR_NEXT, after);
613
+
614
+ if (before !== NODE_UNUSED) {
615
+ nodes.writeCellValue(before, NODE_FIELD_NEIGHBOR_NEXT, node_index);
616
+ } else {
617
+ this.#head_node = node_index;
618
+ }
619
+
620
+ if (after === NODE_UNUSED) {
621
+ // the used node was the tail; the free node ends the arena now
622
+ this.#tail_node = free_node;
623
+
624
+ return free_size;
625
+ }
626
+
627
+ nodes.writeCellValue(after, NODE_FIELD_NEIGHBOR_PREV, free_node);
628
+
629
+ if ((nodes.readCellValue(after, NODE_FIELD_FLAGS) & NODE_FLAGS_USED) !== 0) {
630
+ return free_size;
631
+ }
632
+
633
+ // Two free nodes adjoin: merge them. Both leave their bins before either changes size —
634
+ // `#removeNodeFromBin` finds a node's bin from its current size — and the combined node
635
+ // is inserted last, so the freelist pops what the removes pushed and never underflows.
636
+ const after_size = nodes.readCellValue(after, NODE_FIELD_DATA_SIZE);
637
+ const after_next = nodes.readCellValue(after, NODE_FIELD_NEIGHBOR_NEXT);
638
+
639
+ this.#removeNodeFromBin(free_node);
640
+ this.#removeNodeFromBin(after);
641
+
642
+ const merged = this.#insertNodeIntoBin(free_size + after_size, free_offset + used_size);
643
+
644
+ nodes.writeCellValue(merged, NODE_FIELD_NEIGHBOR_PREV, node_index);
645
+ nodes.writeCellValue(node_index, NODE_FIELD_NEIGHBOR_NEXT, merged);
646
+
647
+ nodes.writeCellValue(merged, NODE_FIELD_NEIGHBOR_NEXT, after_next);
648
+
649
+ if (after_next !== NODE_UNUSED) {
650
+ nodes.writeCellValue(after_next, NODE_FIELD_NEIGHBOR_PREV, merged);
458
651
  }
652
+ // else: the merged node ends the arena, and `#insertNodeIntoBin` has made it the tail
653
+
654
+ return free_size;
459
655
  }
460
656
 
461
657
  /**
@@ -589,6 +785,9 @@ export class OffsetAllocator {
589
785
  if (tail_neighbour_prev !== NODE_UNUSED) {
590
786
  nodes.writeCellValue(grown_node, NODE_FIELD_NEIGHBOR_PREV, tail_neighbour_prev);
591
787
  nodes.writeCellValue(tail_neighbour_prev, NODE_FIELD_NEIGHBOR_NEXT, grown_node);
788
+ } else {
789
+ // the whole arena was one free run; the stretched one starts it
790
+ this.#head_node = grown_node;
592
791
  }
593
792
 
594
793
  return;
@@ -767,7 +966,7 @@ export class OffsetAllocator {
767
966
 
768
967
  // Start state: Whole storage as one big node
769
968
  // Algorithm will split remainders and push them back as smaller nodes
770
- this.#insertNodeIntoBin(this.size, 0);
969
+ this.#head_node = this.#insertNodeIntoBin(this.size, 0);
771
970
 
772
971
  }
773
972
 
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Compress pieces of one stream using the platform's compression API.
3
+ *
4
+ * The mirror of {@link decompress_bytes}, and written the same way for the same reason: the input
5
+ * goes through a pipe rather than a sequence of awaited writes, so that a failure on either side
6
+ * settles the other instead of deadlocking on backpressure. The input views must remain unchanged
7
+ * until the returned promise settles.
8
+ *
9
+ * There is no compression level here because the platform API does not expose one — `deflate-raw`
10
+ * is whatever the host's zlib defaults to. A caller that needs a level needs a different encoder.
11
+ *
12
+ * @param {Uint8Array[]} chunks
13
+ * @param {"deflate"|"deflate-raw"|"gzip"} [format] `deflate` writes the zlib header and checksum
14
+ * @returns {Promise<Uint8Array>}
15
+ *
16
+ * @author Alex Goldring
17
+ * @copyright Company Named Limited (c) 2026
18
+ */
19
+ export function compress_bytes(chunks: Uint8Array[], format?: "deflate" | "deflate-raw" | "gzip"): Promise<Uint8Array>;
20
+ //# sourceMappingURL=compress_bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress_bytes.d.ts","sourceRoot":"","sources":["../../../../../src/core/binary/compression/compress_bytes.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,uCAPW,UAAU,EAAE,WACZ,SAAS,GAAC,aAAa,GAAC,MAAM,GAC5B,QAAQ,UAAU,CAAC,CAqB/B"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Compress pieces of one stream using the platform's compression API.
3
+ *
4
+ * The mirror of {@link decompress_bytes}, and written the same way for the same reason: the input
5
+ * goes through a pipe rather than a sequence of awaited writes, so that a failure on either side
6
+ * settles the other instead of deadlocking on backpressure. The input views must remain unchanged
7
+ * until the returned promise settles.
8
+ *
9
+ * There is no compression level here because the platform API does not expose one — `deflate-raw`
10
+ * is whatever the host's zlib defaults to. A caller that needs a level needs a different encoder.
11
+ *
12
+ * @param {Uint8Array[]} chunks
13
+ * @param {"deflate"|"deflate-raw"|"gzip"} [format] `deflate` writes the zlib header and checksum
14
+ * @returns {Promise<Uint8Array>}
15
+ *
16
+ * @author Alex Goldring
17
+ * @copyright Company Named Limited (c) 2026
18
+ */
19
+ export async function compress_bytes(chunks, format = "deflate") {
20
+ let index = 0;
21
+
22
+ const input = new ReadableStream({
23
+ pull(controller) {
24
+ if (index === chunks.length) {
25
+ controller.close();
26
+ } else {
27
+ controller.enqueue(chunks[index++]);
28
+ }
29
+ }
30
+ });
31
+
32
+ const output = input.pipeThrough(new CompressionStream(format));
33
+
34
+ return new Uint8Array(await new Response(output).arrayBuffer());
35
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Decompress pieces of one stream straight into a buffer the caller already owns, writing at most
3
+ * `limit` bytes and refusing the stream the moment it would write more.
4
+ *
5
+ * {@link decompress_bytes} collects the whole output first and hands back a fresh array, which is
6
+ * the wrong shape twice over when the caller knows the decoded length in advance: it costs a second
7
+ * copy of every byte, and — the reason this exists — it gives a hostile stream the whole decode to
8
+ * expand into before anybody can notice it disagrees with the length that was declared. Deflate
9
+ * reaches 1032:1, so "check the size afterwards" is an attacker-chosen allocation.
10
+ *
11
+ * Here the bound is applied per chunk as the chunks arrive, so a stream that lies stops at the
12
+ * first chunk past the caller's buffer and nothing beyond it is ever held.
13
+ *
14
+ * Output shorter than `limit` is *not* an error here — the caller knows whether its length was a
15
+ * cap or an exact expectation, and gets the count back to check. The input views must remain
16
+ * unchanged until the returned promise settles.
17
+ *
18
+ * @param {Uint8Array} destination
19
+ * @param {number} offset where the decompressed bytes start
20
+ * @param {number} limit most bytes to write; `destination` must hold that many at `offset`
21
+ * @param {Uint8Array[]} chunks
22
+ * @param {"deflate"|"deflate-raw"|"gzip"} [format] `deflate` expects the zlib header and checksum
23
+ * @returns {Promise<number>} bytes written
24
+ * @throws {Error} when the stream is malformed, or produces more than `limit` bytes
25
+ *
26
+ * @author Alex Goldring
27
+ * @copyright Company Named Limited (c) 2026
28
+ */
29
+ export function decompress_bytes_into(destination: Uint8Array, offset: number, limit: number, chunks: Uint8Array[], format?: "deflate" | "deflate-raw" | "gzip"): Promise<number>;
30
+ //# sourceMappingURL=decompress_bytes_into.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decompress_bytes_into.d.ts","sourceRoot":"","sources":["../../../../../src/core/binary/compression/decompress_bytes_into.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,mDAXW,UAAU,UACV,MAAM,SACN,MAAM,UACN,UAAU,EAAE,WACZ,SAAS,GAAC,aAAa,GAAC,MAAM,GAC5B,QAAQ,MAAM,CAAC,CA8D3B"}
@@ -0,0 +1,87 @@
1
+ import { assert } from "../../assert.js";
2
+
3
+ /**
4
+ * Decompress pieces of one stream straight into a buffer the caller already owns, writing at most
5
+ * `limit` bytes and refusing the stream the moment it would write more.
6
+ *
7
+ * {@link decompress_bytes} collects the whole output first and hands back a fresh array, which is
8
+ * the wrong shape twice over when the caller knows the decoded length in advance: it costs a second
9
+ * copy of every byte, and — the reason this exists — it gives a hostile stream the whole decode to
10
+ * expand into before anybody can notice it disagrees with the length that was declared. Deflate
11
+ * reaches 1032:1, so "check the size afterwards" is an attacker-chosen allocation.
12
+ *
13
+ * Here the bound is applied per chunk as the chunks arrive, so a stream that lies stops at the
14
+ * first chunk past the caller's buffer and nothing beyond it is ever held.
15
+ *
16
+ * Output shorter than `limit` is *not* an error here — the caller knows whether its length was a
17
+ * cap or an exact expectation, and gets the count back to check. The input views must remain
18
+ * unchanged until the returned promise settles.
19
+ *
20
+ * @param {Uint8Array} destination
21
+ * @param {number} offset where the decompressed bytes start
22
+ * @param {number} limit most bytes to write; `destination` must hold that many at `offset`
23
+ * @param {Uint8Array[]} chunks
24
+ * @param {"deflate"|"deflate-raw"|"gzip"} [format] `deflate` expects the zlib header and checksum
25
+ * @returns {Promise<number>} bytes written
26
+ * @throws {Error} when the stream is malformed, or produces more than `limit` bytes
27
+ *
28
+ * @author Alex Goldring
29
+ * @copyright Company Named Limited (c) 2026
30
+ */
31
+ export async function decompress_bytes_into(destination, offset, limit, chunks, format = "deflate") {
32
+ assert.isNonNegativeInteger(offset, 'offset');
33
+ assert.isNonNegativeInteger(limit, 'limit');
34
+
35
+ // Ahead of the stream rather than at the first write past the end: the caller computed both of
36
+ // these from a length it read somewhere, and "your buffer is too small" is worth saying before
37
+ // a decode runs rather than as a `RangeError` from the middle of one.
38
+ assert.lessThanOrEqual(
39
+ offset + limit, destination.length,
40
+ 'the destination must hold `limit` bytes at `offset`'
41
+ );
42
+
43
+ let index = 0;
44
+
45
+ const input = new ReadableStream({
46
+ pull(controller) {
47
+ if (index === chunks.length) {
48
+ controller.close();
49
+ } else {
50
+ controller.enqueue(chunks[index++]);
51
+ }
52
+ }
53
+ });
54
+
55
+ const reader = input.pipeThrough(new DecompressionStream(format)).getReader();
56
+
57
+ let written = 0;
58
+
59
+ try {
60
+ for (;;) {
61
+ const { done, value } = await reader.read();
62
+
63
+ if (done) {
64
+ break;
65
+ }
66
+
67
+ if (written + value.length > limit) {
68
+ throw new Error(
69
+ `the stream decompresses to more than the ${limit} bytes it was given`
70
+ );
71
+ }
72
+
73
+ destination.set(value, offset + written);
74
+
75
+ written += value.length;
76
+ }
77
+ } catch (e) {
78
+ // The reader holds a lock on the stream and the pipe behind it is still pulling; cancelling
79
+ // is what lets the source see that nobody is reading any more. Its own rejection is not
80
+ // news — we are already throwing the reason.
81
+ await reader.cancel(e).catch(() => undefined);
82
+
83
+ throw e;
84
+ }
85
+
86
+ return written;
87
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The most bytes a raw DEFLATE stream of `size` bytes can decode to.
3
+ *
4
+ * The counterpart of {@link lz4_decompress_bound}, and it exists for the same reason: a caller that
5
+ * allocates against a *claimed* decoded size — a container header, a page frame — is taking an
6
+ * untrusted number, and a claim above this bound is one no stream of that length could satisfy.
7
+ * Checking it before allocating is what keeps a corrupt length field from becoming a multi-gigabyte
8
+ * allocation. It is a bound on a length field, not a substitute for bounding the decode itself:
9
+ * {@link decompress_bytes_into} is what stops a stream that lies in the other direction.
10
+ *
11
+ * The densest thing RFC 1951 can code is a run of maximal matches under a dynamic Huffman table
12
+ * chosen to make them cheap. A match copies at most 258 bytes and costs at least two bits: one for
13
+ * its length code — the literal/length alphabet always carries end-of-block as well, so two symbols,
14
+ * so one bit each — and one for its distance code, which RFC 1951 §3.2.7 gives a whole bit even
15
+ * when the alphabet has a single symbol in it. Four matches per input byte at 258 bytes apiece is
16
+ * **1032:1**, which is zlib's documented maximum and what is returned here. The block header only
17
+ * takes bits away from that budget, so no slack is added at the short end, and a zero-length stream
18
+ * decodes to nothing because it is not a stream at all.
19
+ *
20
+ * @param {number} size bytes of stream
21
+ * @returns {number}
22
+ *
23
+ * @author Alex Goldring
24
+ * @copyright Company Named Limited (c) 2026
25
+ */
26
+ export function deflate_decompress_bound(size: number): number;
27
+ //# sourceMappingURL=deflate_decompress_bound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deflate_decompress_bound.d.ts","sourceRoot":"","sources":["../../../../../src/core/binary/compression/deflate_decompress_bound.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,+CANW,MAAM,GACJ,MAAM,CASlB"}
@@ -0,0 +1,32 @@
1
+ import { assert } from "../../assert.js";
2
+
3
+ /**
4
+ * The most bytes a raw DEFLATE stream of `size` bytes can decode to.
5
+ *
6
+ * The counterpart of {@link lz4_decompress_bound}, and it exists for the same reason: a caller that
7
+ * allocates against a *claimed* decoded size — a container header, a page frame — is taking an
8
+ * untrusted number, and a claim above this bound is one no stream of that length could satisfy.
9
+ * Checking it before allocating is what keeps a corrupt length field from becoming a multi-gigabyte
10
+ * allocation. It is a bound on a length field, not a substitute for bounding the decode itself:
11
+ * {@link decompress_bytes_into} is what stops a stream that lies in the other direction.
12
+ *
13
+ * The densest thing RFC 1951 can code is a run of maximal matches under a dynamic Huffman table
14
+ * chosen to make them cheap. A match copies at most 258 bytes and costs at least two bits: one for
15
+ * its length code — the literal/length alphabet always carries end-of-block as well, so two symbols,
16
+ * so one bit each — and one for its distance code, which RFC 1951 §3.2.7 gives a whole bit even
17
+ * when the alphabet has a single symbol in it. Four matches per input byte at 258 bytes apiece is
18
+ * **1032:1**, which is zlib's documented maximum and what is returned here. The block header only
19
+ * takes bits away from that budget, so no slack is added at the short end, and a zero-length stream
20
+ * decodes to nothing because it is not a stream at all.
21
+ *
22
+ * @param {number} size bytes of stream
23
+ * @returns {number}
24
+ *
25
+ * @author Alex Goldring
26
+ * @copyright Company Named Limited (c) 2026
27
+ */
28
+ export function deflate_decompress_bound(size) {
29
+ assert.isNonNegativeInteger(size, 'size');
30
+
31
+ return size * 1032;
32
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Sum two attribute quadrics, elementwise.
3
+ *
4
+ * Elementwise is the whole of it, and that is deliberate: the reduction
5
+ * ({@link quadric_attribute_reduce}) divides by the accumulated weight, which is not a linear
6
+ * operation, so doing it here would make `add` depend on the order the quadrics arrived in. It is
7
+ * left to solve time, where the weight is final, and this stays associative — which is what lets a
8
+ * survivor absorb its victims one at a time and still hold what it would have held had they all
9
+ * been folded in at once.
10
+ *
11
+ * @param {number[]|Float32Array|Float64Array} out `quadric_attribute_size(components)` elements from
12
+ * `out_offset`; may alias either input
13
+ * @param {number} out_offset
14
+ * @param {ArrayLike<number>} a
15
+ * @param {number} a_offset
16
+ * @param {ArrayLike<number>} b
17
+ * @param {number} b_offset
18
+ * @param {number} components number of scalar channels
19
+ *
20
+ * @author Alex Goldring
21
+ * @copyright Company Named Limited (c) 2026
22
+ */
23
+ export function quadric_attribute_add(out: number[] | Float32Array | Float64Array, out_offset: number, a: ArrayLike<number>, a_offset: number, b: ArrayLike<number>, b_offset: number, components: number): void;
24
+ //# sourceMappingURL=quadric_attribute_add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quadric_attribute_add.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_add.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;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,31 @@
1
+ import { QUADRIC3_SIZE } from "./QUADRIC3_SIZE.js";
2
+
3
+ /**
4
+ * Sum two attribute quadrics, elementwise.
5
+ *
6
+ * Elementwise is the whole of it, and that is deliberate: the reduction
7
+ * ({@link quadric_attribute_reduce}) divides by the accumulated weight, which is not a linear
8
+ * operation, so doing it here would make `add` depend on the order the quadrics arrived in. It is
9
+ * left to solve time, where the weight is final, and this stays associative — which is what lets a
10
+ * survivor absorb its victims one at a time and still hold what it would have held had they all
11
+ * been folded in at once.
12
+ *
13
+ * @param {number[]|Float32Array|Float64Array} out `quadric_attribute_size(components)` elements from
14
+ * `out_offset`; may alias either input
15
+ * @param {number} out_offset
16
+ * @param {ArrayLike<number>} a
17
+ * @param {number} a_offset
18
+ * @param {ArrayLike<number>} b
19
+ * @param {number} b_offset
20
+ * @param {number} components number of scalar channels
21
+ *
22
+ * @author Alex Goldring
23
+ * @copyright Company Named Limited (c) 2026
24
+ */
25
+ export function quadric_attribute_add(out, out_offset, a, a_offset, b, b_offset, components) {
26
+ const size = QUADRIC3_SIZE + components * 4;
27
+
28
+ for (let i = 0; i < size; i++) {
29
+ out[out_offset + i] = a[a_offset + i] + b[b_offset + i];
30
+ }
31
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The 3-D quadric an attribute quadric becomes once its attributes have been solved out of it.
3
+ *
4
+ * ## Why there is one at all
5
+ *
6
+ * The accumulated form is a quadratic in `3 + m` unknowns — a position and a value per channel. But
7
+ * the channels appear in it only as `-2 s_i (G_i . v + D_i) + s_i^2 W`, which is minimised exactly,
8
+ * with no search, at `s_i = (G_i . v + D_i) / W`. Substituting that back removes them, and what is
9
+ * left is a quadric in the position alone:
10
+ *
11
+ * ```
12
+ * A = P - SUM_i (G_i G_i^T) / W
13
+ * b = q - SUM_i (D_i G_i) / W
14
+ * c = r - SUM_i (D_i^2) / W
15
+ * ```
16
+ *
17
+ * That is the whole reason to hold Hoppe's form rather than the `(3 + m)`-dimensional lift: placing
18
+ * the vertex stays a 3x3 solve however many channels the mesh carries, and the channels' influence
19
+ * on *where it goes* is not lost — it is in `A` and `b`.
20
+ *
21
+ * The output is {@link Quadric3}-shaped, so `quadric3_optimize` places the vertex and
22
+ * `quadric3_evaluate` reads the attribute error at a position, both unchanged.
23
+ *
24
+ * ## What its weight is not
25
+ *
26
+ * Slot 10 carries the accumulated triangle count, as the header did. It is **not** a plane count,
27
+ * and {@link quadric3_distance} on this quadric is not a length: the value is an attribute residual
28
+ * in whatever units the caller's weights put it in. A caller wanting a length evaluates the *pure
29
+ * geometric* quadric at the position this one helped choose, which is the whole of the units
30
+ * discipline (`VIRTUAL_GEOMETRY_DESIGN.md` §3).
31
+ *
32
+ * A quadric that has accumulated nothing has no attributes to solve out and reduces to zero, which
33
+ * is what an empty quadric should add to a sum.
34
+ *
35
+ * @param {number[]|Float32Array|Float64Array} out destination, `QUADRIC3_SIZE` elements from
36
+ * `out_offset`, overwritten
37
+ * @param {number} out_offset
38
+ * @param {ArrayLike<number>} q `quadric_attribute_size(components)` elements from `q_offset`
39
+ * @param {number} q_offset
40
+ * @param {number} components number of scalar channels
41
+ *
42
+ * @author Alex Goldring
43
+ * @copyright Company Named Limited (c) 2026
44
+ */
45
+ export function quadric_attribute_reduce(out: number[] | Float32Array | Float64Array, out_offset: number, q: ArrayLike<number>, q_offset: number, components: number): void;
46
+ //# sourceMappingURL=quadric_attribute_reduce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quadric_attribute_reduce.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/quadric/quadric_attribute_reduce.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,8CAVW,MAAM,EAAE,GAAC,YAAY,GAAC,YAAY,cAElC,MAAM,KACN,UAAU,MAAM,CAAC,YACjB,MAAM,cACN,MAAM,QA8DhB"}