@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.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/binary/BitSet.d.ts +16 -0
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +159 -49
- package/src/core/binary/allocator/OffsetAllocator.d.ts +48 -0
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +208 -9
- package/src/core/binary/compression/compress_bytes.d.ts +20 -0
- package/src/core/binary/compression/compress_bytes.d.ts.map +1 -0
- package/src/core/binary/compression/compress_bytes.js +35 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts +30 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -0
- package/src/core/binary/compression/decompress_bytes_into.js +87 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts +27 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts.map +1 -0
- package/src/core/binary/compression/deflate_decompress_bound.js +32 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.js +31 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts +46 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.js +104 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts +62 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js +158 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts +21 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.js +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts +34 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.js +55 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts +28 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts +15 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts +93 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.js +128 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts +38 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +113 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +47 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +677 -8
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts +22 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.js +46 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts +19 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.js +49 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts +63 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts.map +1 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.js +80 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.d.ts +35 -0
- package/src/core/graph/layout/layered/LayoutBoxGraph.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.js +53 -1
- package/src/core/graph/layout/layered/layout_assign_coordinates.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.js +72 -68
- package/src/core/graph/layout/layered/layout_assign_layers.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.js +4 -2
- package/src/core/graph/layout/layered/layout_break_cycles.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_insert_lanes.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_order_layers.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_orient_links.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +7 -51
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +8 -69
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +1 -1
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +6 -6
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +1 -1
- package/src/engine/graphics3/DebugDrawSystem.d.ts +7 -5
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +206 -203
- package/src/engine/graphics3/DecalSystem.d.ts +4 -5
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +5 -5
- package/src/engine/graphics3/FogOfWarSystem.d.ts +7 -12
- package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -1
- package/src/engine/graphics3/FogOfWarSystem.js +8 -12
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
- package/src/shade/RENDERER_CONTRACT.md +12 -7
- package/src/shade/playground/caldera/README.md +529 -0
- package/src/shade/playground/caldera/caldera_format.d.ts +151 -0
- package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -0
- package/src/shade/playground/caldera/caldera_format.js +241 -0
- package/src/shade/playground/caldera/index.html +126 -0
- package/src/shade/playground/caldera/main.d.ts.map +1 -0
- package/src/shade/playground/caldera/main.js +1565 -0
- package/src/shade/playground/mesh_row_ceiling/README.md +85 -0
- package/src/shade/playground/mesh_row_ceiling/index.html +31 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts +2 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts.map +1 -0
- package/src/shade/playground/mesh_row_ceiling/main.js +389 -0
- package/src/shade/playground/vgeo_runtime/README.md +5 -3
- package/src/shade/playground/vgeo_runtime/main.js +3 -2
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +3 -3
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -1
- package/src/shade/playground/vgeo_runtime/sample_asset.js +3 -3
- package/src/shade/playground/vgeo_scene/README.md +103 -24
- package/src/shade/playground/vgeo_scene/main.js +525 -24
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +6 -0
- package/src/shade/renderer/Renderer.d.ts +2 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +23 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +100 -8
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +69 -33
- package/src/shade/renderer/extension/RenderExtension.d.ts +15 -18
- package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtension.js +15 -19
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +5 -5
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +29 -166
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +73 -16
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -3
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +663 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +100 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +688 -81
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +155 -64
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +30 -13
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +3 -3
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +57 -7
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +63 -9
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts +40 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.js +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.js +25 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +77 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +84 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +19 -6
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js +20 -7
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.js +58 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.js +116 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +545 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +110 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +2 -27
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +120 -1564
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.js +123 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.js +78 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +337 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +147 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts +37 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +117 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +46 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +45 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +64 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +68 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +12 -7
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.js +33 -11
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts +58 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.js +79 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.js +68 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts +53 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +24 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +250 -25
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +12 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +58 -50
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +8 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +18 -3
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts +38 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js +81 -0
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +23 -5
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js +28 -21
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.js +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +224 -60
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +17 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +19 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +10 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +103 -9
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +14 -2
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +38 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +28 -5
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts +32 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js +93 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +20 -6
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +22 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/{vgeo_layers_copy_vertex.js → vgeo_layers_copy_corner.js} +8 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts +18 -7
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +19 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.d.ts +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts +27 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.js +97 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts +7 -3
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +21 -11
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.js +41 -0
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +19 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +20 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts +25 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.js +24 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts +10 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +37 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +21 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +37 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts +8 -2
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +14 -2
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +19 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +6 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.js +20 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +10 -1
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +1 -2
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +10 -3
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.js +43 -0
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +4 -2
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +8 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.js +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +5 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +14 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts +4 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js +53 -11
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +7 -3
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts +12 -2
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +111 -33
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +112 -42
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +51 -21
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +34 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +18 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +47 -19
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +22 -4
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +7 -2
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +8 -3
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +4 -0
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -4
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +6 -2
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +90 -12
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +22 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +21 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +13 -8
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +4 -12
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +4 -5
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +5 -3
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +11 -4
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -3
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +3 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +94 -90
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +13 -5
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +96 -89
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +3 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.js +4 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +100 -89
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +31 -7
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +1 -7
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +161 -153
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +2 -7
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +4 -8
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +5 -8
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +25 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +24 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +10 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +30 -21
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts +0 -61
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts +0 -18
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts +0 -173
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts +0 -52
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts +0 -24
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts +0 -32
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts +0 -59
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts +0 -44
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts +0 -20
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts +0 -73
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +0 -13
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts +0 -36
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts +0 -13
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts +0 -19
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts +0 -29
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts +0 -31
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts +0 -18
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts +0 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts +0 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts +0 -11
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts +0 -46
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +0 -22
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts +0 -29
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts +0 -9
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts +0 -10
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts +0 -15
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts +0 -16
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts.map +0 -1
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts +0 -10
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts +0 -17
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts +0 -3
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts +0 -8
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +0 -1
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.js +0 -0
- /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
|
|
223
|
-
*
|
|
224
|
-
*
|
|
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 {
|
|
308
|
+
* @returns {boolean}
|
|
289
309
|
*/
|
|
290
|
-
|
|
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
|
|
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
|
-
|
|
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"}
|