@woosh/meep-engine 3.27.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/mat4/m4_linear_determinant.d.ts +15 -0
- package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts.map +1 -0
- package/src/core/geom/3d/mat4/m4_linear_determinant.js +24 -0
- package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts +4 -2
- package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_normal_matrix3.js +21 -11
- 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/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +38 -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/GraphicsEngine.d.ts +5 -1
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +834 -830
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
- package/src/shade/RENDERER_CONTRACT.md +31 -17
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
- 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 +32 -16
- package/src/shade/playground/vgeo_runtime/main.js +21 -7
- package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.d.ts +3 -3
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
- package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +12 -11
- package/src/shade/playground/vgeo_scene/README.md +487 -0
- package/src/shade/playground/vgeo_scene/index.html +144 -0
- package/src/shade/playground/vgeo_scene/main.d.ts +2 -0
- package/src/shade/playground/vgeo_scene/main.d.ts.map +1 -0
- package/src/shade/playground/vgeo_scene/main.js +2217 -0
- 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 +6 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +28 -2
- 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 +70 -35
- 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/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +3 -29
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts +22 -0
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.js +49 -0
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +159 -66
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +40 -21
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +15 -14
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +58 -8
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +64 -10
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +5 -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/VGeoLevel.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.d.ts → level/VGeoLevelOptions.d.ts} +19 -6
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +20 -7
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
- 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 +11 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +308 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.d.ts → level/vgeo_build_root_group.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.js → level/vgeo_build_root_group.js} +1 -1
- 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/{VirtualGeometryMesh.d.ts → mesh/VirtualGeometryMesh.d.ts} +13 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.js → mesh/VirtualGeometryMesh.js} +40 -18
- 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 +45 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +300 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.d.ts → 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 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +151 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.d.ts → mesh/vgeo_normalize_source.d.ts} +8 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.js → mesh/vgeo_normalize_source.js} +27 -12
- 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/{vgeo_assemble_pages.d.ts → page/vgeo_assemble_pages.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.js → page/vgeo_assemble_pages.js} +9 -9
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.d.ts → page/vgeo_build_page_nodes.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.js → page/vgeo_build_page_nodes.js} +4 -4
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.js → page/vgeo_page_node_count.js} +2 -2
- package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.d.ts → partition/VGeoFaceGraph.d.ts} +23 -5
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.js → partition/VGeoFaceGraph.js} +28 -21
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.js → partition/vgeo_partition_graph.js} +2 -2
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts +41 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.js +92 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.js → partition/vgeo_split_face_set.js} +13 -56
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +371 -0
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.js → sphere/vgeo_bounding_sphere.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.js → sphere/vgeo_containing_sphere.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.js → sphere/vgeo_sphere_inflate_to_contain.js} +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +42 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +37 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +39 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +23 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +135 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +95 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.js → submesh/vgeo_narrow_indices.js} +3 -3
- 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 +37 -16
- 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_attributes_read.d.ts +8 -2
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +8 -2
- 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_GROUP_OFFSET.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js +15 -0
- 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 +32 -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 +15 -7
- 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 +120 -37
- 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 +130 -47
- 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 +60 -22
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +21 -2
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +52 -2
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +97 -1
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +4 -4
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +10 -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/VGeoResidency.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +59 -34
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +8 -8
- 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 +45 -88
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +116 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +99 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.js +39 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +7 -63
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +13 -30
- 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 +53 -71
- 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/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +0 -19
- package/src/shade/renderer/material/chunk_material_draw_side.d.ts +14 -0
- package/src/shade/renderer/material/chunk_material_draw_side.d.ts.map +1 -0
- package/src/shade/renderer/material/chunk_material_draw_side.js +34 -0
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +8 -1
- 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/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +13 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +19 -5
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +23 -5
- package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.js +12 -5
- 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/rasterization_opaque_buckets.d.ts +22 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.js +36 -0
- 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/chunk_triangle_winding_is_reversed.d.ts +15 -0
- package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +35 -0
- 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/RASTERIZATION_BUCKET_LIMIT.d.ts +10 -1
- package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +38 -29
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts +5 -0
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.js +63 -55
- 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/graph_meshlets_rasterize.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +1 -0
- 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/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +44 -53
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -2
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -2
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +19 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +7 -4
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -2
- package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js +15 -4
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +16 -5
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +16 -5
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +2 -1
- package/src/shade/renderer/rasterize/native/rasterization_shader_resources.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/rasterization_shader_resources.js +4 -0
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +16 -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 +81 -95
- 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 +26 -39
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +2 -0
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +19 -0
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/scene/NODE3D_STRUCT.js +34 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.d.ts +9 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.d.ts.map +1 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.js +23 -0
- package/src/shade/renderer/scene/chunk_scene_database_access.d.ts.map +1 -1
- package/src/shade/renderer/scene/chunk_scene_database_access.js +15 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +9 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.js +16 -4
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +18 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js +33 -0
- 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/README.md +0 -150
- 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/cut_geometry.js +0 -460
- package/src/shade/playground/vgeo_viewer/index.html +0 -77
- package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/main.js +0 -1343
- 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/playground/vgeo_viewer/select_cut.js +0 -481
- 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/VGeoGatheredFaces.js +0 -25
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
- 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/VGeoSubmesh.js +0 -20
- 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.map +0 -1
- 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_levels.js +0 -1786
- 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.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_normals.js +0 -75
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.js +0 -143
- 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_extract_submesh.js +0 -41
- 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_gather_faces.js +0 -71
- 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.map +0 -1
- 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.map +0 -1
- 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.map +0 -1
- 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.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.js +0 -207
- 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/geometry/virtual/residency/VGeoResidencyManager.d.ts +0 -258
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +0 -49
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.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/loader/gltf/fix_up_material_sides.js +0 -109
- 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/graph_triangles_filter_by_material_side.js +0 -78
- 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/expand/shader_filter_triangle_by_material_side.js +0 -100
- 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/shade/renderer/rasterize/forward/chunk_material_side_should_draw.js +0 -26
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.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
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.d.ts → level/VGeoLevel.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.d.ts → level/VGeoLevelSummary.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.d.ts → page/vgeo_page_node_count.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.d.ts → partition/vgeo_graph_components.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.js → partition/vgeo_graph_components.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.d.ts → partition/vgeo_partition_graph.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.d.ts → partition/vgeo_split_face_set.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set_packed.d.ts → partition/vgeo_split_face_set_packed.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.d.ts → sphere/vgeo_bounding_sphere.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.d.ts → sphere/vgeo_containing_sphere.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.d.ts → sphere/vgeo_sphere_inflate_to_contain.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.d.ts → submesh/vgeo_narrow_indices.d.ts} +0 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BinaryTopology, NULL_POINTER
|
|
3
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
|
|
4
|
+
import { BtWedgeSet } from "../../../../../../core/geom/3d/topology/struct/binary/BtWedgeSet.js";
|
|
5
|
+
import {
|
|
6
|
+
bt_mesh_from_indexed_geometry
|
|
7
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
|
|
8
|
+
import { vgeo_layers_copy_corner } from "../../format/attribute/vgeo_layers_copy_corner.js";
|
|
9
|
+
import { vgeo_layers_like } from "../../format/attribute/vgeo_layers_like.js";
|
|
10
|
+
import { vgeo_gather_faces } from "./vgeo_gather_faces.js";
|
|
11
|
+
import { VGeoSubmesh } from "./VGeoSubmesh.js";
|
|
12
|
+
import { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Extract a face set into a standalone mesh, attributes and all.
|
|
16
|
+
*
|
|
17
|
+
* **Wedges are not vertices here.** The gather deduped on the wedge, because that is what a cluster
|
|
18
|
+
* payload's vertices are; a mesh's are not. Two wedges of one vertex are one point and one piece of
|
|
19
|
+
* connectivity, and giving them a vertex each would shred face adjacency along every seam — which
|
|
20
|
+
* is the move `WEDGE_PLAN_2026_09_18.md` §8 rejects and the reason the weld exists at all. So the
|
|
21
|
+
* gather's output is folded back onto one vertex per position and the wedges travel on the corners,
|
|
22
|
+
* where they belong.
|
|
23
|
+
*
|
|
24
|
+
* @param {VirtualGeometryMesh} source
|
|
25
|
+
* @param {number[]} face_ids
|
|
26
|
+
* @param {BtWedgeSet} source_wedges which corners of `source` shade as one
|
|
27
|
+
* @returns {VGeoSubmesh}
|
|
28
|
+
*
|
|
29
|
+
* @author Alex Goldring
|
|
30
|
+
* @copyright Company Named Limited (c) 2026
|
|
31
|
+
*/
|
|
32
|
+
export function vgeo_extract_submesh(source, face_ids, source_wedges) {
|
|
33
|
+
const gathered = vgeo_gather_faces(source, face_ids, source_wedges);
|
|
34
|
+
|
|
35
|
+
const wedge_count = gathered.wedge_ids.length;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* `source vertex id -> local vertex id`.
|
|
39
|
+
* @type {Map<number, number>}
|
|
40
|
+
*/
|
|
41
|
+
const local_of_vertex = new Map();
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The local vertex each gathered wedge sits at.
|
|
45
|
+
* @type {Uint32Array}
|
|
46
|
+
*/
|
|
47
|
+
const vertex_of_wedge = new Uint32Array(wedge_count);
|
|
48
|
+
|
|
49
|
+
const source_vertex_ids = [];
|
|
50
|
+
const positions = [];
|
|
51
|
+
|
|
52
|
+
gathered.vertex_ids.forEach((vertex, wedge) => {
|
|
53
|
+
let local = local_of_vertex.get(vertex);
|
|
54
|
+
|
|
55
|
+
if (local === undefined) {
|
|
56
|
+
local = source_vertex_ids.length;
|
|
57
|
+
|
|
58
|
+
local_of_vertex.set(vertex, local);
|
|
59
|
+
source_vertex_ids.push(vertex);
|
|
60
|
+
|
|
61
|
+
positions.push(
|
|
62
|
+
gathered.positions[wedge * 3],
|
|
63
|
+
gathered.positions[wedge * 3 + 1],
|
|
64
|
+
gathered.positions[wedge * 3 + 2]
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
vertex_of_wedge[wedge] = local;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const topology = new BinaryTopology();
|
|
72
|
+
|
|
73
|
+
// Before the vertices, so no record has to be widened. See {@link VirtualGeometryMesh.from_geometry}.
|
|
74
|
+
const layers = vgeo_layers_like(topology, source.layers);
|
|
75
|
+
|
|
76
|
+
bt_mesh_from_indexed_geometry(
|
|
77
|
+
topology,
|
|
78
|
+
Uint32Array.from(gathered.indices, (wedge) => vertex_of_wedge[wedge]),
|
|
79
|
+
Float32Array.from(positions)
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
if (topology.faces.count() !== face_ids.length) {
|
|
83
|
+
// The corner walk below reads face `t` as the `t`th triangle of the index list, so a builder
|
|
84
|
+
// that dropped or reordered one would silently hand every corner the wrong appearance. A
|
|
85
|
+
// thrown build beats a wrong asset, and this cannot be an `assert` for exactly that reason:
|
|
86
|
+
// asserts are stripped from what ships.
|
|
87
|
+
throw new Error(
|
|
88
|
+
`extracting ${face_ids.length} faces produced ${topology.faces.count()}, so the corners `
|
|
89
|
+
+ `of the result cannot be matched to the corners they came from`
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const wedges = new BtWedgeSet();
|
|
94
|
+
|
|
95
|
+
wedges.count = wedge_count;
|
|
96
|
+
wedges.parent = Uint32Array.from({ length: wedge_count }, (_, wedge) => wedge);
|
|
97
|
+
wedges.next_of_wedge = new Uint32Array(wedge_count).fill(NULL_POINTER);
|
|
98
|
+
wedges.first_of_vertex = new Uint32Array(topology.vertices.size).fill(NULL_POINTER);
|
|
99
|
+
wedges.of_loop = new Uint32Array(topology.loops.size).fill(NULL_POINTER);
|
|
100
|
+
|
|
101
|
+
for (let wedge = 0; wedge < wedge_count; wedge++) {
|
|
102
|
+
wedges.attach(wedge, vertex_of_wedge[wedge]);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
Corner by corner, through the wedge each one names — which is the copy §6.1 could not make.
|
|
107
|
+
Going through the *vertex* was exact only while every corner of a vertex agreed; it does not
|
|
108
|
+
agree any more, and that is the point. The two meshes' loops are matched up here because the
|
|
109
|
+
faces were built from this very index list, in this order.
|
|
110
|
+
*/
|
|
111
|
+
for (let face = 0; face < face_ids.length; face++) {
|
|
112
|
+
let loop = topology.face_read_loop(face);
|
|
113
|
+
|
|
114
|
+
for (let corner = 0; corner < 3; corner++) {
|
|
115
|
+
const wedge = gathered.indices[face * 3 + corner];
|
|
116
|
+
|
|
117
|
+
wedges.of_loop[loop] = wedge;
|
|
118
|
+
|
|
119
|
+
vgeo_layers_copy_corner(
|
|
120
|
+
topology, source.topology, gathered.attribute_ids[wedge], loop
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
loop = topology.loop_read_next(loop);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const result = new VGeoSubmesh();
|
|
128
|
+
|
|
129
|
+
result.mesh = new VirtualGeometryMesh(topology, layers);
|
|
130
|
+
result.source_vertex_ids = Uint32Array.from(source_vertex_ids);
|
|
131
|
+
result.wedges = wedges;
|
|
132
|
+
result.source_wedge_ids = gathered.wedge_ids;
|
|
133
|
+
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gather a face set: unique **wedges** in first-use order, local indices, coordinates copied out,
|
|
3
|
+
* and one corner per output vertex for the appearance to be read through.
|
|
4
|
+
*
|
|
5
|
+
* A wedge, not a vertex, and that is the whole of what a seam costs. Two corners of one vertex that
|
|
6
|
+
* shade differently cannot share an output vertex: the payload carries one value per vertex, so a
|
|
7
|
+
* hard edge or a texture chart boundary has to be two of them. It costs exactly what it has always
|
|
8
|
+
* cost anywhere else — a seam is an extra vertex in every renderer ever written — and it costs it
|
|
9
|
+
* *here*, at the gather, rather than in the topology, where splitting would shred face adjacency
|
|
10
|
+
* (`WEDGE_PLAN_2026_09_18.md` §8).
|
|
11
|
+
*
|
|
12
|
+
* A mesh with no seams has one wedge per vertex, every corner of a vertex resolves to it, and this
|
|
13
|
+
* dedupes on the vertex exactly as it always did.
|
|
14
|
+
*
|
|
15
|
+
* First-use order is what makes the result depend only on the face list, not on the pool's history.
|
|
16
|
+
*
|
|
17
|
+
* @param {VirtualGeometryMesh} mesh
|
|
18
|
+
* @param {number[]} face_ids allocated triangular faces
|
|
19
|
+
* @param {BtWedgeSet} wedges which corners of each vertex shade as one
|
|
20
|
+
* @returns {VGeoGatheredFaces}
|
|
21
|
+
*/
|
|
22
|
+
export function vgeo_gather_faces(mesh: VirtualGeometryMesh, face_ids: number[], wedges: BtWedgeSet): VGeoGatheredFaces;
|
|
23
|
+
import { VGeoGatheredFaces } from "./VGeoGatheredFaces.js";
|
|
24
|
+
//# sourceMappingURL=vgeo_gather_faces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_gather_faces.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uEAJW,MAAM,EAAE,uBAEN,iBAAiB,CAgE7B;kCA5FiC,wBAAwB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
+
import { NULL_POINTER } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
|
|
3
|
+
import { VGeoGatheredFaces } from "./VGeoGatheredFaces.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @author Alex Goldring
|
|
7
|
+
* @copyright Company Named Limited (c) 2026
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const scratch_coordinate = new Float32Array(3);
|
|
11
|
+
|
|
12
|
+
/**
|
|
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.
|
|
25
|
+
*
|
|
26
|
+
* First-use order is what makes the result depend only on the face list, not on the pool's history.
|
|
27
|
+
*
|
|
28
|
+
* @param {VirtualGeometryMesh} mesh
|
|
29
|
+
* @param {number[]} face_ids allocated triangular faces
|
|
30
|
+
* @param {BtWedgeSet} wedges which corners of each vertex shade as one
|
|
31
|
+
* @returns {VGeoGatheredFaces}
|
|
32
|
+
*/
|
|
33
|
+
export function vgeo_gather_faces(mesh, face_ids, wedges) {
|
|
34
|
+
const topology = mesh.topology;
|
|
35
|
+
|
|
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.
|
|
39
|
+
* @type {Map<number, number>}
|
|
40
|
+
*/
|
|
41
|
+
const local_of_wedge = new Map();
|
|
42
|
+
|
|
43
|
+
const vertex_ids = [];
|
|
44
|
+
const wedge_ids = [];
|
|
45
|
+
const attribute_ids = [];
|
|
46
|
+
const indices = new Uint32Array(face_ids.length * 3);
|
|
47
|
+
|
|
48
|
+
face_ids.forEach((face, face_index) => {
|
|
49
|
+
const first_loop = topology.face_read_loop(face);
|
|
50
|
+
|
|
51
|
+
assert.notEqual(first_loop, NULL_POINTER, `face ${face} has no loop`);
|
|
52
|
+
|
|
53
|
+
let loop = first_loop;
|
|
54
|
+
|
|
55
|
+
for (let i = 0; i < 3; i++) {
|
|
56
|
+
const wedge = wedges.find(wedges.of_loop[loop]);
|
|
57
|
+
|
|
58
|
+
let local = local_of_wedge.get(wedge);
|
|
59
|
+
|
|
60
|
+
if (local === undefined) {
|
|
61
|
+
local = wedge_ids.length;
|
|
62
|
+
|
|
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);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
indices[face_index * 3 + i] = local;
|
|
71
|
+
|
|
72
|
+
loop = topology.loop_read_next(loop);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
assert.equal(loop, first_loop, `face ${face} is not an allocated triangle`);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const result = new VGeoGatheredFaces();
|
|
79
|
+
|
|
80
|
+
result.vertex_ids = Uint32Array.from(vertex_ids);
|
|
81
|
+
result.wedge_ids = Uint32Array.from(wedge_ids);
|
|
82
|
+
result.attribute_ids = Uint32Array.from(attribute_ids);
|
|
83
|
+
result.indices = indices;
|
|
84
|
+
result.positions = new Float32Array(vertex_ids.length * 3);
|
|
85
|
+
|
|
86
|
+
vertex_ids.forEach((vertex, local) => {
|
|
87
|
+
topology.vertex_read_coordinate(scratch_coordinate, 0, vertex);
|
|
88
|
+
|
|
89
|
+
result.positions[local * 3] = scratch_coordinate[0];
|
|
90
|
+
result.positions[local * 3 + 1] = scratch_coordinate[1];
|
|
91
|
+
result.positions[local * 3 + 2] = scratch_coordinate[2];
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_narrow_indices.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.js"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,kEALa,UAAU,CAiBtB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { assert } from "
|
|
2
|
-
import { VGEO_MAX_CLUSTER_TRIANGLE_COUNT } from "
|
|
3
|
-
import { VGEO_MAX_CLUSTER_VERTEX_COUNT } from "
|
|
1
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
+
import { VGEO_MAX_CLUSTER_TRIANGLE_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js";
|
|
3
|
+
import { VGEO_MAX_CLUSTER_VERTEX_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* The 8-bit local index list a cluster payload carries.
|
|
@@ -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":"AA8GA
|
|
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"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { aabb3_array_combine } from "../../../../../core/geom/3d/aabb/aabb3_array_combine.js";
|
|
2
3
|
import { vgeo_attribute_mask } from "../format/attribute/vgeo_attribute_mask.js";
|
|
3
4
|
import { vgeo_write_container } from "../format/vgeo_write_container.js";
|
|
4
5
|
import { VGeoLevelRecord } from "../format/header/VGeoLevelRecord.js";
|
|
5
6
|
import { VGeoWriteOptions } from "../format/VGeoWriteOptions.js";
|
|
6
|
-
import { vgeo_assemble_pages } from "./vgeo_assemble_pages.js";
|
|
7
|
-
import { vgeo_build_levels } from "./vgeo_build_levels.js";
|
|
8
|
-
import { vgeo_build_root_group } from "./vgeo_build_root_group.js";
|
|
9
|
-
import { vgeo_containing_sphere } from "./vgeo_containing_sphere.js";
|
|
10
|
-
import { vgeo_normalize_source } from "./vgeo_normalize_source.js";
|
|
7
|
+
import { vgeo_assemble_pages } from "./page/vgeo_assemble_pages.js";
|
|
8
|
+
import { vgeo_build_levels } from "./level/vgeo_build_levels.js";
|
|
9
|
+
import { vgeo_build_root_group } from "./level/vgeo_build_root_group.js";
|
|
10
|
+
import { vgeo_containing_sphere } from "./sphere/vgeo_containing_sphere.js";
|
|
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";
|
|
11
14
|
import { VGeoBuildResult } from "./VGeoBuildResult.js";
|
|
12
|
-
import { VGeoLevelSummary } from "./VGeoLevelSummary.js";
|
|
13
|
-
import { VirtualGeometryMesh } from "./VirtualGeometryMesh.js";
|
|
15
|
+
import { VGeoLevelSummary } from "./level/VGeoLevelSummary.js";
|
|
16
|
+
import { VirtualGeometryMesh } from "./mesh/VirtualGeometryMesh.js";
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
19
|
* The whole builder pipeline, from a triangle soup to `.vgeo` bytes.
|
|
@@ -46,10 +49,7 @@ function compute_object_bounds(levels) {
|
|
|
46
49
|
for (const cluster of level.clusters) {
|
|
47
50
|
spheres.push(cluster.bounds_sphere);
|
|
48
51
|
|
|
49
|
-
|
|
50
|
-
bounds[axis] = Math.min(bounds[axis], cluster.aabb[axis]);
|
|
51
|
-
bounds[axis + 3] = Math.max(bounds[axis + 3], cluster.aabb[axis + 3]);
|
|
52
|
-
}
|
|
52
|
+
aabb3_array_combine(bounds, 0, bounds, 0, cluster.aabb, 0);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -123,17 +123,21 @@ function level_summary_to_record(summary) {
|
|
|
123
123
|
* geometry that arrives without them is given them by normalization, off the welded mesh — see
|
|
124
124
|
* {@link vgeo_normalize_source}.
|
|
125
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
|
+
*
|
|
126
130
|
* @param {Geometry} geometry the source, in object space
|
|
127
131
|
* @param {VGeoBuildOptions} options
|
|
128
|
-
* @returns {VGeoBuildResult}
|
|
132
|
+
* @returns {Promise<VGeoBuildResult>}
|
|
129
133
|
*/
|
|
130
|
-
export function vgeo_build(geometry, options) {
|
|
134
|
+
export async function vgeo_build(geometry, options) {
|
|
131
135
|
assert.greaterThan(options.weld_ratio, 0, 'options.weld_ratio');
|
|
132
136
|
assert.isPositiveInteger(options.nominal_page_size, 'options.nominal_page_size');
|
|
133
137
|
|
|
134
138
|
const mesh = VirtualGeometryMesh.from_geometry(geometry);
|
|
135
139
|
|
|
136
|
-
const weld_distance = vgeo_normalize_source(mesh, options.weld_ratio);
|
|
140
|
+
const weld_distance = vgeo_normalize_source(mesh, options.weld_ratio, options.crease_angle);
|
|
137
141
|
|
|
138
142
|
const source_face_count = mesh.topology.faces.count();
|
|
139
143
|
const source_vertex_count = mesh.topology.vertices.count();
|
|
@@ -141,7 +145,18 @@ export function vgeo_build(geometry, options) {
|
|
|
141
145
|
assert.greaterThan(source_face_count, 0, 'the source mesh has no faces left after normalization');
|
|
142
146
|
assert.greaterThanOrEqual(source_vertex_count, 3, 'source vertex count');
|
|
143
147
|
|
|
144
|
-
|
|
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
|
+
);
|
|
145
160
|
|
|
146
161
|
const top = levels[levels.length - 1];
|
|
147
162
|
|
|
@@ -155,6 +170,12 @@ export function vgeo_build(geometry, options) {
|
|
|
155
170
|
|
|
156
171
|
top.groups = [vgeo_build_root_group(root, top.index)];
|
|
157
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
|
+
|
|
158
179
|
const object = compute_object_bounds(levels);
|
|
159
180
|
|
|
160
181
|
const pages = vgeo_assemble_pages(
|
|
@@ -185,7 +206,7 @@ export function vgeo_build(geometry, options) {
|
|
|
185
206
|
|
|
186
207
|
const result = new VGeoBuildResult();
|
|
187
208
|
|
|
188
|
-
result.buffer = vgeo_write_container(pages, write_options);
|
|
209
|
+
result.buffer = await vgeo_write_container(pages, write_options);
|
|
189
210
|
result.page_count = pages.length;
|
|
190
211
|
result.source_vertex_count = source_vertex_count;
|
|
191
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 = [];
|