@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
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
-
import {
|
|
3
|
-
bt_face_read_triangle_vertices
|
|
4
|
-
} from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js";
|
|
2
|
+
import { NULL_POINTER } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
|
|
5
3
|
import { VGeoGatheredFaces } from "./VGeoGatheredFaces.js";
|
|
6
4
|
|
|
7
5
|
/**
|
|
@@ -9,53 +7,79 @@ import { VGeoGatheredFaces } from "./VGeoGatheredFaces.js";
|
|
|
9
7
|
* @copyright Company Named Limited (c) 2026
|
|
10
8
|
*/
|
|
11
9
|
|
|
12
|
-
const scratch_triangle = new Uint32Array(3);
|
|
13
10
|
const scratch_coordinate = new Float32Array(3);
|
|
14
11
|
|
|
15
12
|
/**
|
|
16
|
-
* Gather a face set: unique
|
|
13
|
+
* Gather a face set: unique **wedges** in first-use order, local indices, coordinates copied out,
|
|
14
|
+
* and one corner per output vertex for the appearance to be read through.
|
|
15
|
+
*
|
|
16
|
+
* A wedge, not a vertex, and that is the whole of what a seam costs. Two corners of one vertex that
|
|
17
|
+
* shade differently cannot share an output vertex: the payload carries one value per vertex, so a
|
|
18
|
+
* hard edge or a texture chart boundary has to be two of them. It costs exactly what it has always
|
|
19
|
+
* cost anywhere else — a seam is an extra vertex in every renderer ever written — and it costs it
|
|
20
|
+
* *here*, at the gather, rather than in the topology, where splitting would shred face adjacency
|
|
21
|
+
* (`WEDGE_PLAN_2026_09_18.md` §8).
|
|
22
|
+
*
|
|
23
|
+
* A mesh with no seams has one wedge per vertex, every corner of a vertex resolves to it, and this
|
|
24
|
+
* dedupes on the vertex exactly as it always did.
|
|
17
25
|
*
|
|
18
26
|
* First-use order is what makes the result depend only on the face list, not on the pool's history.
|
|
19
27
|
*
|
|
20
28
|
* @param {VirtualGeometryMesh} mesh
|
|
21
29
|
* @param {number[]} face_ids allocated triangular faces
|
|
30
|
+
* @param {BtWedgeSet} wedges which corners of each vertex shade as one
|
|
22
31
|
* @returns {VGeoGatheredFaces}
|
|
23
32
|
*/
|
|
24
|
-
export function vgeo_gather_faces(mesh, face_ids) {
|
|
33
|
+
export function vgeo_gather_faces(mesh, face_ids, wedges) {
|
|
25
34
|
const topology = mesh.topology;
|
|
26
35
|
|
|
27
36
|
/**
|
|
37
|
+
* `wedge -> local`, over wedge *roots*: a merged wedge answers to the one it merged into, and
|
|
38
|
+
* two corners that resolve to the same root are one output vertex.
|
|
28
39
|
* @type {Map<number, number>}
|
|
29
40
|
*/
|
|
30
|
-
const
|
|
41
|
+
const local_of_wedge = new Map();
|
|
31
42
|
|
|
32
43
|
const vertex_ids = [];
|
|
44
|
+
const wedge_ids = [];
|
|
45
|
+
const attribute_ids = [];
|
|
33
46
|
const indices = new Uint32Array(face_ids.length * 3);
|
|
34
47
|
|
|
35
48
|
face_ids.forEach((face, face_index) => {
|
|
36
|
-
const
|
|
49
|
+
const first_loop = topology.face_read_loop(face);
|
|
50
|
+
|
|
51
|
+
assert.notEqual(first_loop, NULL_POINTER, `face ${face} has no loop`);
|
|
37
52
|
|
|
38
|
-
|
|
53
|
+
let loop = first_loop;
|
|
39
54
|
|
|
40
55
|
for (let i = 0; i < 3; i++) {
|
|
41
|
-
const
|
|
56
|
+
const wedge = wedges.find(wedges.of_loop[loop]);
|
|
42
57
|
|
|
43
|
-
let local =
|
|
58
|
+
let local = local_of_wedge.get(wedge);
|
|
44
59
|
|
|
45
60
|
if (local === undefined) {
|
|
46
|
-
local =
|
|
61
|
+
local = wedge_ids.length;
|
|
47
62
|
|
|
48
|
-
|
|
49
|
-
|
|
63
|
+
local_of_wedge.set(wedge, local);
|
|
64
|
+
|
|
65
|
+
wedge_ids.push(wedge);
|
|
66
|
+
vertex_ids.push(topology.loop_read_vertex(loop));
|
|
67
|
+
attribute_ids.push(loop);
|
|
50
68
|
}
|
|
51
69
|
|
|
52
70
|
indices[face_index * 3 + i] = local;
|
|
71
|
+
|
|
72
|
+
loop = topology.loop_read_next(loop);
|
|
53
73
|
}
|
|
74
|
+
|
|
75
|
+
assert.equal(loop, first_loop, `face ${face} is not an allocated triangle`);
|
|
54
76
|
});
|
|
55
77
|
|
|
56
78
|
const result = new VGeoGatheredFaces();
|
|
57
79
|
|
|
58
80
|
result.vertex_ids = Uint32Array.from(vertex_ids);
|
|
81
|
+
result.wedge_ids = Uint32Array.from(wedge_ids);
|
|
82
|
+
result.attribute_ids = Uint32Array.from(attribute_ids);
|
|
59
83
|
result.indices = indices;
|
|
60
84
|
result.positions = new Float32Array(vertex_ids.length * 3);
|
|
61
85
|
|
|
@@ -13,10 +13,14 @@
|
|
|
13
13
|
* geometry that arrives without them is given them by normalization, off the welded mesh — see
|
|
14
14
|
* {@link vgeo_normalize_source}.
|
|
15
15
|
*
|
|
16
|
+
* It is asynchronous only because the writer is, and the writer is because a page codec can be —
|
|
17
|
+
* {@link VGEO_CODEC_DEFLATE} is the platform's zlib and the platform only offers it as a stream.
|
|
18
|
+
* Every other step below is the same synchronous pipeline it has always been.
|
|
19
|
+
*
|
|
16
20
|
* @param {Geometry} geometry the source, in object space
|
|
17
21
|
* @param {VGeoBuildOptions} options
|
|
18
|
-
* @returns {VGeoBuildResult}
|
|
22
|
+
* @returns {Promise<VGeoBuildResult>}
|
|
19
23
|
*/
|
|
20
|
-
export function vgeo_build(geometry: Geometry, options: VGeoBuildOptions): VGeoBuildResult
|
|
24
|
+
export function vgeo_build(geometry: Geometry, options: VGeoBuildOptions): Promise<VGeoBuildResult>;
|
|
21
25
|
import { VGeoBuildResult } from "./VGeoBuildResult.js";
|
|
22
26
|
//# sourceMappingURL=vgeo_build.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_build.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/build/vgeo_build.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vgeo_build.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/build/vgeo_build.js"],"names":[],"mappings":"AA8GA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,2EAFa,QAAQ,eAAe,CAAC,CA0FpC;gCAhN+B,sBAAsB"}
|
|
@@ -9,6 +9,8 @@ import { vgeo_build_levels } from "./level/vgeo_build_levels.js";
|
|
|
9
9
|
import { vgeo_build_root_group } from "./level/vgeo_build_root_group.js";
|
|
10
10
|
import { vgeo_containing_sphere } from "./sphere/vgeo_containing_sphere.js";
|
|
11
11
|
import { vgeo_normalize_source } from "./mesh/vgeo_normalize_source.js";
|
|
12
|
+
import { vgeo_resolve_attribute_weights } from "./mesh/vgeo_resolve_attribute_weights.js";
|
|
13
|
+
import { vgeo_subtree_bounds } from "./vgeo_subtree_bounds.js";
|
|
12
14
|
import { VGeoBuildResult } from "./VGeoBuildResult.js";
|
|
13
15
|
import { VGeoLevelSummary } from "./level/VGeoLevelSummary.js";
|
|
14
16
|
import { VirtualGeometryMesh } from "./mesh/VirtualGeometryMesh.js";
|
|
@@ -121,17 +123,21 @@ function level_summary_to_record(summary) {
|
|
|
121
123
|
* geometry that arrives without them is given them by normalization, off the welded mesh — see
|
|
122
124
|
* {@link vgeo_normalize_source}.
|
|
123
125
|
*
|
|
126
|
+
* It is asynchronous only because the writer is, and the writer is because a page codec can be —
|
|
127
|
+
* {@link VGEO_CODEC_DEFLATE} is the platform's zlib and the platform only offers it as a stream.
|
|
128
|
+
* Every other step below is the same synchronous pipeline it has always been.
|
|
129
|
+
*
|
|
124
130
|
* @param {Geometry} geometry the source, in object space
|
|
125
131
|
* @param {VGeoBuildOptions} options
|
|
126
|
-
* @returns {VGeoBuildResult}
|
|
132
|
+
* @returns {Promise<VGeoBuildResult>}
|
|
127
133
|
*/
|
|
128
|
-
export function vgeo_build(geometry, options) {
|
|
134
|
+
export async function vgeo_build(geometry, options) {
|
|
129
135
|
assert.greaterThan(options.weld_ratio, 0, 'options.weld_ratio');
|
|
130
136
|
assert.isPositiveInteger(options.nominal_page_size, 'options.nominal_page_size');
|
|
131
137
|
|
|
132
138
|
const mesh = VirtualGeometryMesh.from_geometry(geometry);
|
|
133
139
|
|
|
134
|
-
const weld_distance = vgeo_normalize_source(mesh, options.weld_ratio);
|
|
140
|
+
const weld_distance = vgeo_normalize_source(mesh, options.weld_ratio, options.crease_angle);
|
|
135
141
|
|
|
136
142
|
const source_face_count = mesh.topology.faces.count();
|
|
137
143
|
const source_vertex_count = mesh.topology.vertices.count();
|
|
@@ -139,7 +145,18 @@ export function vgeo_build(geometry, options) {
|
|
|
139
145
|
assert.greaterThan(source_face_count, 0, 'the source mesh has no faces left after normalization');
|
|
140
146
|
assert.greaterThanOrEqual(source_vertex_count, 3, 'source vertex count');
|
|
141
147
|
|
|
142
|
-
|
|
148
|
+
/*
|
|
149
|
+
Resolved here, off the normalized source and before the level loop, for the same reason the weld
|
|
150
|
+
distance is a fraction of the source's own size: a conversion is many geometries at many sizes
|
|
151
|
+
and no single number is right for all of them. Once, so every level of the DAG is built against
|
|
152
|
+
the same statement of what a unit of each channel is worth -- the mesh shrinks as the build goes
|
|
153
|
+
on, and a weight re-derived per level would drift with it.
|
|
154
|
+
*/
|
|
155
|
+
const levels = vgeo_build_levels(
|
|
156
|
+
mesh,
|
|
157
|
+
options.level_options,
|
|
158
|
+
vgeo_resolve_attribute_weights(mesh, options.attribute_weight_ratios)
|
|
159
|
+
);
|
|
143
160
|
|
|
144
161
|
const top = levels[levels.length - 1];
|
|
145
162
|
|
|
@@ -153,6 +170,12 @@ export function vgeo_build(geometry, options) {
|
|
|
153
170
|
|
|
154
171
|
top.groups = [vgeo_build_root_group(root, top.index)];
|
|
155
172
|
|
|
173
|
+
/*
|
|
174
|
+
After the root's own fields and before anything reads a cluster: the page assembler and the
|
|
175
|
+
writer both take clusters as they are, and this is the last thing the DAG gains.
|
|
176
|
+
*/
|
|
177
|
+
vgeo_subtree_bounds(levels);
|
|
178
|
+
|
|
156
179
|
const object = compute_object_bounds(levels);
|
|
157
180
|
|
|
158
181
|
const pages = vgeo_assemble_pages(
|
|
@@ -183,7 +206,7 @@ export function vgeo_build(geometry, options) {
|
|
|
183
206
|
|
|
184
207
|
const result = new VGeoBuildResult();
|
|
185
208
|
|
|
186
|
-
result.buffer = vgeo_write_container(pages, write_options);
|
|
209
|
+
result.buffer = await vgeo_write_container(pages, write_options);
|
|
187
210
|
result.page_count = pages.length;
|
|
188
211
|
result.source_vertex_count = source_vertex_count;
|
|
189
212
|
result.source_face_count = source_face_count;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Give every cluster of a built DAG the AABB of its own geometry and of everything reachable below
|
|
3
|
+
* it, which is the bound the runtime cut culls on (`CULL_PLAN_2026_09_16` §3.1, FORMAT §11.17).
|
|
4
|
+
*
|
|
5
|
+
* **Why the subtree and not the cluster.** A simplification step consumes one group and produces
|
|
6
|
+
* several parents, and each parent's `child_group` is the *whole* consumed group — so a cluster's
|
|
7
|
+
* subtree carries its siblings' surface as well as its own, and doubles per level. The cut's
|
|
8
|
+
* per-cluster test decides whether to descend into that group at all, so a bound that covers only
|
|
9
|
+
* the cluster would cull a parent whose descendants are on screen, and a culled subtree is a hole.
|
|
10
|
+
*
|
|
11
|
+
* **Why a memoised walk rather than a pass by level.** A round leaves unmerged clusters in the
|
|
12
|
+
* frontier, so a group formed at round L can hold members created at any lower level, and
|
|
13
|
+
* `group.level` records where the group was formed rather than where its members were. Following
|
|
14
|
+
* `child_group` instead needs no such assumption. The DAG is acyclic (format §11.3) and a group is
|
|
15
|
+
* shared by its several parents, so memoising on the cluster makes this O(clusters + edges) with the
|
|
16
|
+
* shared work done once.
|
|
17
|
+
*
|
|
18
|
+
* Recursion is explicit: these DAGs run to forty levels but a page's group can hold thousands of
|
|
19
|
+
* clusters, and a native stack deep in the fine levels of a billion-triangle build is not worth the
|
|
20
|
+
* elegance.
|
|
21
|
+
*
|
|
22
|
+
* The union is of float32 extremes, so every bound it produces is exactly representable and
|
|
23
|
+
* contains what it was built from with no inflation — unlike a sphere, which is why the validator
|
|
24
|
+
* can check this one exactly.
|
|
25
|
+
*
|
|
26
|
+
* @param {VGeoLevel[]} levels as {@link vgeo_build_levels} leaves them
|
|
27
|
+
*
|
|
28
|
+
* @author Alex Goldring
|
|
29
|
+
* @copyright Company Named Limited (c) 2026
|
|
30
|
+
*/
|
|
31
|
+
export function vgeo_subtree_bounds(levels: VGeoLevel[]): void;
|
|
32
|
+
//# sourceMappingURL=vgeo_subtree_bounds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_subtree_bounds.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,4CALW,WAAW,QAiErB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { aabb3_array_combine } from "../../../../../core/geom/3d/aabb/aabb3_array_combine.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Give every cluster of a built DAG the AABB of its own geometry and of everything reachable below
|
|
5
|
+
* it, which is the bound the runtime cut culls on (`CULL_PLAN_2026_09_16` §3.1, FORMAT §11.17).
|
|
6
|
+
*
|
|
7
|
+
* **Why the subtree and not the cluster.** A simplification step consumes one group and produces
|
|
8
|
+
* several parents, and each parent's `child_group` is the *whole* consumed group — so a cluster's
|
|
9
|
+
* subtree carries its siblings' surface as well as its own, and doubles per level. The cut's
|
|
10
|
+
* per-cluster test decides whether to descend into that group at all, so a bound that covers only
|
|
11
|
+
* the cluster would cull a parent whose descendants are on screen, and a culled subtree is a hole.
|
|
12
|
+
*
|
|
13
|
+
* **Why a memoised walk rather than a pass by level.** A round leaves unmerged clusters in the
|
|
14
|
+
* frontier, so a group formed at round L can hold members created at any lower level, and
|
|
15
|
+
* `group.level` records where the group was formed rather than where its members were. Following
|
|
16
|
+
* `child_group` instead needs no such assumption. The DAG is acyclic (format §11.3) and a group is
|
|
17
|
+
* shared by its several parents, so memoising on the cluster makes this O(clusters + edges) with the
|
|
18
|
+
* shared work done once.
|
|
19
|
+
*
|
|
20
|
+
* Recursion is explicit: these DAGs run to forty levels but a page's group can hold thousands of
|
|
21
|
+
* clusters, and a native stack deep in the fine levels of a billion-triangle build is not worth the
|
|
22
|
+
* elegance.
|
|
23
|
+
*
|
|
24
|
+
* The union is of float32 extremes, so every bound it produces is exactly representable and
|
|
25
|
+
* contains what it was built from with no inflation — unlike a sphere, which is why the validator
|
|
26
|
+
* can check this one exactly.
|
|
27
|
+
*
|
|
28
|
+
* @param {VGeoLevel[]} levels as {@link vgeo_build_levels} leaves them
|
|
29
|
+
*
|
|
30
|
+
* @author Alex Goldring
|
|
31
|
+
* @copyright Company Named Limited (c) 2026
|
|
32
|
+
*/
|
|
33
|
+
export function vgeo_subtree_bounds(levels) {
|
|
34
|
+
/**
|
|
35
|
+
* Clusters whose `subtree_aabb` is final.
|
|
36
|
+
* @type {Set<VirtualGeometryCluster>}
|
|
37
|
+
*/
|
|
38
|
+
const done = new Set();
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Cluster, then the mark that says its children have been visited already.
|
|
42
|
+
* @type {(VirtualGeometryCluster|boolean)[]}
|
|
43
|
+
*/
|
|
44
|
+
const stack = [];
|
|
45
|
+
|
|
46
|
+
for (const level of levels) {
|
|
47
|
+
for (const root of level.clusters) {
|
|
48
|
+
if (done.has(root)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
stack.push(root, false);
|
|
53
|
+
|
|
54
|
+
while (stack.length > 0) {
|
|
55
|
+
const expanded = stack.pop();
|
|
56
|
+
const cluster = stack.pop();
|
|
57
|
+
|
|
58
|
+
if (done.has(cluster)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const group = cluster.child_group;
|
|
63
|
+
|
|
64
|
+
if (group !== undefined && !expanded) {
|
|
65
|
+
// come back to this one once its children are final
|
|
66
|
+
stack.push(cluster, true);
|
|
67
|
+
|
|
68
|
+
for (const child of group.clusters) {
|
|
69
|
+
if (!done.has(child)) {
|
|
70
|
+
stack.push(child, false);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
cluster.subtree_aabb.set(cluster.aabb);
|
|
78
|
+
|
|
79
|
+
if (group !== undefined) {
|
|
80
|
+
for (const child of group.clusters) {
|
|
81
|
+
aabb3_array_combine(
|
|
82
|
+
cluster.subtree_aabb, 0,
|
|
83
|
+
cluster.subtree_aabb, 0,
|
|
84
|
+
child.subtree_aabb, 0
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
done.add(cluster);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -9,20 +9,33 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export class VGeoWriteOptions {
|
|
11
11
|
/**
|
|
12
|
-
* Which codec to store page blobs under
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* Which codec to store page blobs under — {@link VGEO_CODEC_RAW}, {@link VGEO_CODEC_LZ4} or
|
|
13
|
+
* {@link VGEO_CODEC_DEFLATE}. Compressed by default because a page is a table of records and a
|
|
14
|
+
* payload of encoded words, and both repeat heavily — see the format's §5 note on what it comes
|
|
15
|
+
* to. It costs the reader one block decode per page, which lands on the page it was going to
|
|
16
|
+
* copy anyway.
|
|
16
17
|
*
|
|
17
18
|
* It is a request rather than a promise: {@link vgeo_encode_frame_blob} stores a page raw when
|
|
18
19
|
* compressing it would not make it smaller, so this can never grow a file.
|
|
19
20
|
*
|
|
21
|
+
* Deflate by default, matching {@link VGeoBuildOptions}. Nothing exercises this value today —
|
|
22
|
+
* `vgeo_build` sets it from the build options and the specs that drive the writer directly set
|
|
23
|
+
* it too — so it is here to agree with the builder rather than to decide anything, and two
|
|
24
|
+
* adjacent defaults that disagreed would be a trap for whoever wrote the next caller.
|
|
25
|
+
*
|
|
26
|
+
* Deflate is the denser of the two compressing codecs, 1.369x against LZ4's 1.295x over the
|
|
27
|
+
* pages of a 240x120 torus, for about four and a half times the decode: 126 MB/s of decoded
|
|
28
|
+
* output against 562. {@link VGEO_CODEC_LZ4} is the setting for a container whose pages arrive
|
|
29
|
+
* while someone is looking at it, because that decode is a page's arrival cost.
|
|
30
|
+
*
|
|
20
31
|
* @type {number}
|
|
21
32
|
*/
|
|
22
33
|
codec: number;
|
|
23
34
|
/**
|
|
24
35
|
* How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
|
|
25
|
-
* top of the reference's hash-chain levels.
|
|
36
|
+
* top of the reference's hash-chain levels. **LZ4 only, and the default codec is not LZ4** —
|
|
37
|
+
* `CompressionStream` exposes no level, so this does nothing at all unless {@link codec} was
|
|
38
|
+
* set to {@link VGEO_CODEC_LZ4}.
|
|
26
39
|
*
|
|
27
40
|
* **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
|
|
28
41
|
* container built at any of them reads in every build of the reader that exists; the level is
|
|
@@ -39,7 +52,8 @@ export class VGeoWriteOptions {
|
|
|
39
52
|
*/
|
|
40
53
|
codec_level: number;
|
|
41
54
|
/**
|
|
42
|
-
* One per level, coarsest last. `level_count` is its length
|
|
55
|
+
* One per level, coarsest last. `level_count` is its length, and the header can name up to
|
|
56
|
+
* {@link VGEO_MAX_LEVEL_COUNT} of them.
|
|
43
57
|
* @type {VGeoLevelRecord[]}
|
|
44
58
|
*/
|
|
45
59
|
levels: VGeoLevelRecord[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VGeoWriteOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js"],"names":[],"mappings":"AAGA;;GAEG;AAEH;;;;;GAKG;AACH;IACI
|
|
1
|
+
{"version":3,"file":"VGeoWriteOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js"],"names":[],"mappings":"AAGA;;GAEG;AAEH;;;;;GAKG;AACH;IACI;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAFU,MAAM,CAEW;IAE3B;;;;;;;;;;;;;;;;;;OAkBG;IACH,aAFU,MAAM,CAEmB;IAEnC;;;;OAIG;IACH,QAFU,eAAe,EAAE,CAEf;IAEZ;;;OAGG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,mBAFU,MAAM,CAEM;IAEtB;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,uBAFU,MAAM,CAEU;IAE1B;;;;;;;;;;OAUG;IACH,mBAFU,MAAM,CAEM;CACzB;8BAxGY,OAAO,6BAA6B,EAAE,eAAe"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LZ4_LEVEL } from "../../../../../core/binary/lz4/LZ4_LEVEL.js";
|
|
2
|
-
import {
|
|
2
|
+
import { VGEO_CODEC_DEFLATE } from "./frame/VGEO_CODEC_DEFLATE.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @typedef {import("./header/VGeoLevelRecord.js").VGeoLevelRecord} VGeoLevelRecord
|
|
@@ -13,21 +13,34 @@ import { VGEO_CODEC_LZ4 } from "./frame/VGEO_CODEC_LZ4.js";
|
|
|
13
13
|
*/
|
|
14
14
|
export class VGeoWriteOptions {
|
|
15
15
|
/**
|
|
16
|
-
* Which codec to store page blobs under
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* Which codec to store page blobs under — {@link VGEO_CODEC_RAW}, {@link VGEO_CODEC_LZ4} or
|
|
17
|
+
* {@link VGEO_CODEC_DEFLATE}. Compressed by default because a page is a table of records and a
|
|
18
|
+
* payload of encoded words, and both repeat heavily — see the format's §5 note on what it comes
|
|
19
|
+
* to. It costs the reader one block decode per page, which lands on the page it was going to
|
|
20
|
+
* copy anyway.
|
|
20
21
|
*
|
|
21
22
|
* It is a request rather than a promise: {@link vgeo_encode_frame_blob} stores a page raw when
|
|
22
23
|
* compressing it would not make it smaller, so this can never grow a file.
|
|
23
24
|
*
|
|
25
|
+
* Deflate by default, matching {@link VGeoBuildOptions}. Nothing exercises this value today —
|
|
26
|
+
* `vgeo_build` sets it from the build options and the specs that drive the writer directly set
|
|
27
|
+
* it too — so it is here to agree with the builder rather than to decide anything, and two
|
|
28
|
+
* adjacent defaults that disagreed would be a trap for whoever wrote the next caller.
|
|
29
|
+
*
|
|
30
|
+
* Deflate is the denser of the two compressing codecs, 1.369x against LZ4's 1.295x over the
|
|
31
|
+
* pages of a 240x120 torus, for about four and a half times the decode: 126 MB/s of decoded
|
|
32
|
+
* output against 562. {@link VGEO_CODEC_LZ4} is the setting for a container whose pages arrive
|
|
33
|
+
* while someone is looking at it, because that decode is a page's arrival cost.
|
|
34
|
+
*
|
|
24
35
|
* @type {number}
|
|
25
36
|
*/
|
|
26
|
-
codec =
|
|
37
|
+
codec = VGEO_CODEC_DEFLATE;
|
|
27
38
|
|
|
28
39
|
/**
|
|
29
40
|
* How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
|
|
30
|
-
* top of the reference's hash-chain levels.
|
|
41
|
+
* top of the reference's hash-chain levels. **LZ4 only, and the default codec is not LZ4** —
|
|
42
|
+
* `CompressionStream` exposes no level, so this does nothing at all unless {@link codec} was
|
|
43
|
+
* set to {@link VGEO_CODEC_LZ4}.
|
|
31
44
|
*
|
|
32
45
|
* **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
|
|
33
46
|
* container built at any of them reads in every build of the reader that exists; the level is
|
|
@@ -45,7 +58,8 @@ export class VGeoWriteOptions {
|
|
|
45
58
|
codec_level = LZ4_LEVEL.HC_DEFAULT;
|
|
46
59
|
|
|
47
60
|
/**
|
|
48
|
-
* One per level, coarsest last. `level_count` is its length
|
|
61
|
+
* One per level, coarsest last. `level_count` is its length, and the header can name up to
|
|
62
|
+
* {@link VGEO_MAX_LEVEL_COUNT} of them.
|
|
49
63
|
* @type {VGeoLevelRecord[]}
|
|
50
64
|
*/
|
|
51
65
|
levels = [];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy one corner's every channel between two meshes declared from the same template.
|
|
3
|
+
*
|
|
4
|
+
* One run of bytes, not one call per channel: the channels of a corner are one interleaved record,
|
|
5
|
+
* and {@link vgeo_layers_like} is what guarantees the two records line up.
|
|
6
|
+
*
|
|
7
|
+
* @param {BinaryTopology} target
|
|
8
|
+
* @param {BinaryTopology} source
|
|
9
|
+
* @param {number} source_loop
|
|
10
|
+
* @param {number} target_loop
|
|
11
|
+
*
|
|
12
|
+
* @author Alex Goldring
|
|
13
|
+
* @copyright Company Named Limited (c) 2026
|
|
14
|
+
*/
|
|
15
|
+
export function vgeo_layers_copy_corner(target: BinaryTopology, source: BinaryTopology, source_loop: number, target_loop: number): void;
|
|
16
|
+
//# sourceMappingURL=vgeo_layers_copy_corner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_layers_copy_corner.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,qGANW,MAAM,eACN,MAAM,QAoBhB"}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { assert } from "../../../../../../core/assert.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Copy one
|
|
4
|
+
* Copy one corner's every channel between two meshes declared from the same template.
|
|
5
5
|
*
|
|
6
|
-
* One run of bytes, not one call per channel: the channels of a
|
|
6
|
+
* One run of bytes, not one call per channel: the channels of a corner are one interleaved record,
|
|
7
7
|
* and {@link vgeo_layers_like} is what guarantees the two records line up.
|
|
8
8
|
*
|
|
9
9
|
* @param {BinaryTopology} target
|
|
10
10
|
* @param {BinaryTopology} source
|
|
11
|
-
* @param {number}
|
|
12
|
-
* @param {number}
|
|
11
|
+
* @param {number} source_loop
|
|
12
|
+
* @param {number} target_loop
|
|
13
13
|
*
|
|
14
14
|
* @author Alex Goldring
|
|
15
15
|
* @copyright Company Named Limited (c) 2026
|
|
16
16
|
*/
|
|
17
|
-
export function
|
|
18
|
-
const target_data = target.
|
|
17
|
+
export function vgeo_layers_copy_corner(target, source, source_loop, target_loop) {
|
|
18
|
+
const target_data = target.loop_data;
|
|
19
19
|
|
|
20
|
-
const source_data = source.
|
|
20
|
+
const source_data = source.loop_data;
|
|
21
21
|
|
|
22
22
|
if (target_data === null) {
|
|
23
23
|
// a geometry with position and nothing else — there is no record to move
|
|
@@ -28,5 +28,5 @@ export function vgeo_layers_copy_vertex(target, source, source_vertex, target_ve
|
|
|
28
28
|
|
|
29
29
|
assert.notNull(source_data, 'target was declared with channels the source does not carry');
|
|
30
30
|
|
|
31
|
-
target_data.copy_record(
|
|
31
|
+
target_data.copy_record(target_loop, source_data, source_loop);
|
|
32
32
|
}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Declare
|
|
2
|
+
* Declare loop data layers on a topology for the channels `carried` marks.
|
|
3
3
|
*
|
|
4
|
-
* The
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* The attributes a `.vgeo` carries live on the `BinaryTopology` the builder simplifies rather than
|
|
5
|
+
* beside it, because that is the only place a value can survive what the builder does to a mesh: a
|
|
6
|
+
* collapse frees vertices and kills faces, and the topology is what knows when. A layer is sized by
|
|
7
|
+
* its pool, so a channel is never a slot short of the mesh it describes and never has to be resized
|
|
8
|
+
* by hand.
|
|
9
|
+
*
|
|
10
|
+
* **On loops — corners — and not on vertices.** A vertex has one position and the surface has one
|
|
11
|
+
* shape there, but it does not have one *appearance*: a hard edge and a texture seam are both a
|
|
12
|
+
* single geometric vertex that shades two ways, and a per-vertex record cannot hold that. Welding
|
|
13
|
+
* the position is what the clusterer needs and splitting the appearance is what the artist authored,
|
|
14
|
+
* and those are different questions (`WEDGE_PLAN_2026_09_18.md` §2). `bt_loop_uv` reached the same
|
|
15
|
+
* place for the same reason, and `bt_mesh_compact` already compacts loop data with everything else.
|
|
16
|
+
*
|
|
17
|
+
* What a *loop* is rather than a vertex costs is duplication — three records per triangle against
|
|
18
|
+
* roughly one per two — and buys the only representation a seam has.
|
|
9
19
|
*
|
|
10
20
|
* Position is not among them. It lives in the topology's own vertex record, where the quadric solve
|
|
11
|
-
* moves it
|
|
21
|
+
* moves it — and it is the one value that genuinely is the vertex's, which is the whole distinction
|
|
22
|
+
* this storage is drawn along.
|
|
12
23
|
*
|
|
13
24
|
* The returned *channel set* is an array with one slot per {@link VGEO_ATTRIBUTES} entry, holding
|
|
14
25
|
* that channel's layer or null where the geometry does not carry it — the format has a fixed,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_layers_declare.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"vgeo_layers_declare.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,uEANW,OAAO,EAAE,GACP,CAAC,kBAAgB,IAAI,CAAC,EAAE,CAmBpC"}
|
|
@@ -3,16 +3,27 @@ import { VGEO_ATTRIBUTE } from "./VGEO_ATTRIBUTE.js";
|
|
|
3
3
|
import { VGEO_ATTRIBUTES } from "./VGEO_ATTRIBUTES.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Declare
|
|
6
|
+
* Declare loop data layers on a topology for the channels `carried` marks.
|
|
7
7
|
*
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* The attributes a `.vgeo` carries live on the `BinaryTopology` the builder simplifies rather than
|
|
9
|
+
* beside it, because that is the only place a value can survive what the builder does to a mesh: a
|
|
10
|
+
* collapse frees vertices and kills faces, and the topology is what knows when. A layer is sized by
|
|
11
|
+
* its pool, so a channel is never a slot short of the mesh it describes and never has to be resized
|
|
12
|
+
* by hand.
|
|
13
|
+
*
|
|
14
|
+
* **On loops — corners — and not on vertices.** A vertex has one position and the surface has one
|
|
15
|
+
* shape there, but it does not have one *appearance*: a hard edge and a texture seam are both a
|
|
16
|
+
* single geometric vertex that shades two ways, and a per-vertex record cannot hold that. Welding
|
|
17
|
+
* the position is what the clusterer needs and splitting the appearance is what the artist authored,
|
|
18
|
+
* and those are different questions (`WEDGE_PLAN_2026_09_18.md` §2). `bt_loop_uv` reached the same
|
|
19
|
+
* place for the same reason, and `bt_mesh_compact` already compacts loop data with everything else.
|
|
20
|
+
*
|
|
21
|
+
* What a *loop* is rather than a vertex costs is duplication — three records per triangle against
|
|
22
|
+
* roughly one per two — and buys the only representation a seam has.
|
|
13
23
|
*
|
|
14
24
|
* Position is not among them. It lives in the topology's own vertex record, where the quadric solve
|
|
15
|
-
* moves it
|
|
25
|
+
* moves it — and it is the one value that genuinely is the vertex's, which is the whole distinction
|
|
26
|
+
* this storage is drawn along.
|
|
16
27
|
*
|
|
17
28
|
* The returned *channel set* is an array with one slot per {@link VGEO_ATTRIBUTES} entry, holding
|
|
18
29
|
* that channel's layer or null where the geometry does not carry it — the format has a fixed,
|
|
@@ -37,7 +48,7 @@ export function vgeo_layers_declare(topology, carried) {
|
|
|
37
48
|
continue;
|
|
38
49
|
}
|
|
39
50
|
|
|
40
|
-
result[attribute] = topology.
|
|
51
|
+
result[attribute] = topology.loop_data_add_layer(
|
|
41
52
|
BinaryDataType.Float32, VGEO_ATTRIBUTES[attribute].components
|
|
42
53
|
);
|
|
43
54
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Declare the same channels `template` holds on another topology.
|
|
3
3
|
*
|
|
4
|
-
* Used wherever the builder rebuilds a
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Used wherever the builder rebuilds a mesh — extracting a group, stitching a level — and needs
|
|
5
|
+
* somewhere to copy the old values into. Because the declarations are the same, in the same order,
|
|
6
|
+
* the two blocks share a record layout and a corner can be moved across as one run of bytes.
|
|
7
7
|
*
|
|
8
8
|
* @param {BinaryTopology} topology receives the layers
|
|
9
9
|
* @param {(BinaryDataLayer|null)[]} template channel set to mirror
|
|
@@ -3,9 +3,9 @@ import { vgeo_layers_declare } from "./vgeo_layers_declare.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* Declare the same channels `template` holds on another topology.
|
|
5
5
|
*
|
|
6
|
-
* Used wherever the builder rebuilds a
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Used wherever the builder rebuilds a mesh — extracting a group, stitching a level — and needs
|
|
7
|
+
* somewhere to copy the old values into. Because the declarations are the same, in the same order,
|
|
8
|
+
* the two blocks share a record layout and a corner can be moved across as one run of bytes.
|
|
9
9
|
*
|
|
10
10
|
* @param {BinaryTopology} topology receives the layers
|
|
11
11
|
* @param {(BinaryDataLayer|null)[]} template channel set to mirror
|