@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,243 @@
|
|
|
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 { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Stitch a round's output back into one mesh: freshly simplified clusters, and the clusters the
|
|
14
|
+
* round left alone, side by side.
|
|
15
|
+
*
|
|
16
|
+
* Vertices are unified by the id they had in the frontier below, never by position: a vertex two
|
|
17
|
+
* groups share is pinned, so both carry it unmoved and unmistakably, while a vertex only one group
|
|
18
|
+
* holds is its own even if a collapse happened to place it exactly where another landed. An
|
|
19
|
+
* untouched cluster names its vertices in that same space, so it stitches to its simplified
|
|
20
|
+
* neighbour along exactly the boundary that neighbour was forbidden to move.
|
|
21
|
+
*
|
|
22
|
+
* **Wedges are unified the same way and separately**, by the frontier wedge each contributed corner
|
|
23
|
+
* came from. Two contributions that share a pinned boundary vertex name the same wedges there, so
|
|
24
|
+
* they arrive as one and the seam shades continuously; a wedge only one group has — one a collapse
|
|
25
|
+
* inside it adopted, say — is its own, which is right, because its corners are that group's alone.
|
|
26
|
+
* The new frontier's wedge ids are handed out here, and they are what the round's accumulated
|
|
27
|
+
* attribute quadrics are re-indexed into.
|
|
28
|
+
*
|
|
29
|
+
* @param {VGeoContribution[]} contributions parallel to the clusters of the frontier being built
|
|
30
|
+
* @param {(BinaryDataLayer|null)[]} template_layers the channels the frontier below carries, which
|
|
31
|
+
* the frontier being stitched carries too
|
|
32
|
+
* @returns {{mesh: VirtualGeometryMesh, cluster_faces: number[][], source_vertex_ids: Uint32Array, wedges: BtWedgeSet, source_wedge_ids: Uint32Array}}
|
|
33
|
+
* the two id maps naming, for every vertex and every wedge of the new mesh, the one of the old
|
|
34
|
+
* mesh it came from — which is how the accumulated quadrics follow it across the seam
|
|
35
|
+
*
|
|
36
|
+
* @author Alex Goldring
|
|
37
|
+
* @copyright Company Named Limited (c) 2026
|
|
38
|
+
*/
|
|
39
|
+
export function vgeo_stitch_frontier(contributions, template_layers) {
|
|
40
|
+
/**
|
|
41
|
+
* `source vertex id -> index in the frontier being built`.
|
|
42
|
+
* @type {Map<number, number>}
|
|
43
|
+
*/
|
|
44
|
+
const index_of_source = new Map();
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* `source wedge id -> wedge index in the frontier being built`.
|
|
48
|
+
* @type {Map<number, number>}
|
|
49
|
+
*/
|
|
50
|
+
const wedge_of_source = new Map();
|
|
51
|
+
|
|
52
|
+
const positions = [];
|
|
53
|
+
const indices = [];
|
|
54
|
+
const cluster_faces = [];
|
|
55
|
+
|
|
56
|
+
const source_wedge_ids = [];
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The mesh each contribution's corners are named in, so a corner needs an index rather than a
|
|
60
|
+
* reference.
|
|
61
|
+
* @type {BinaryTopology[]}
|
|
62
|
+
*/
|
|
63
|
+
const topologies = contributions.map((geometry) => geometry.topology);
|
|
64
|
+
|
|
65
|
+
let corner_count = 0;
|
|
66
|
+
|
|
67
|
+
for (const geometry of contributions) {
|
|
68
|
+
corner_count += geometry.indices.length;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
Per output corner, where its record comes from. Per *corner*, not per vertex: a seam vertex's
|
|
73
|
+
corners disagree, and picking a representative is exactly the thing that lost them — which is
|
|
74
|
+
six entries per triangle rather than one per vertex, so they are typed arrays sized up front
|
|
75
|
+
rather than lists that grow.
|
|
76
|
+
*/
|
|
77
|
+
const corner_contribution = new Uint32Array(corner_count);
|
|
78
|
+
const corner_loop = new Uint32Array(corner_count);
|
|
79
|
+
const corner_wedge = new Uint32Array(corner_count);
|
|
80
|
+
|
|
81
|
+
let corner_cursor = 0;
|
|
82
|
+
let face_cursor = 0;
|
|
83
|
+
|
|
84
|
+
for (const geometry of contributions) {
|
|
85
|
+
const remap = new Uint32Array(geometry.local_vertex_ids.length);
|
|
86
|
+
const wedges = new Uint32Array(geometry.local_vertex_ids.length);
|
|
87
|
+
|
|
88
|
+
geometry.local_vertex_ids.forEach((local, i) => {
|
|
89
|
+
const source = geometry.source_vertex_ids[i];
|
|
90
|
+
|
|
91
|
+
let target = index_of_source.get(source);
|
|
92
|
+
|
|
93
|
+
if (target === undefined) {
|
|
94
|
+
target = positions.length / 3;
|
|
95
|
+
|
|
96
|
+
index_of_source.set(source, target);
|
|
97
|
+
|
|
98
|
+
positions.push(
|
|
99
|
+
geometry.positions[i * 3],
|
|
100
|
+
geometry.positions[i * 3 + 1],
|
|
101
|
+
geometry.positions[i * 3 + 2]
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
remap[i] = target;
|
|
106
|
+
|
|
107
|
+
const source_wedge = geometry.source_wedge_ids[i];
|
|
108
|
+
|
|
109
|
+
let wedge = wedge_of_source.get(source_wedge);
|
|
110
|
+
|
|
111
|
+
if (wedge === undefined) {
|
|
112
|
+
wedge = source_wedge_ids.length;
|
|
113
|
+
|
|
114
|
+
wedge_of_source.set(source_wedge, wedge);
|
|
115
|
+
source_wedge_ids.push(source_wedge);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
wedges[i] = wedge;
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const triangle_count = geometry.indices.length / 3;
|
|
122
|
+
|
|
123
|
+
const faces = [];
|
|
124
|
+
|
|
125
|
+
const contribution = cluster_faces.length;
|
|
126
|
+
|
|
127
|
+
for (let i = 0; i < geometry.indices.length; i++) {
|
|
128
|
+
const local = geometry.indices[i];
|
|
129
|
+
|
|
130
|
+
indices.push(remap[local]);
|
|
131
|
+
|
|
132
|
+
corner_contribution[corner_cursor] = contribution;
|
|
133
|
+
corner_loop[corner_cursor] = geometry.attribute_ids[local];
|
|
134
|
+
corner_wedge[corner_cursor] = wedges[local];
|
|
135
|
+
|
|
136
|
+
corner_cursor++;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
for (let i = 0; i < triangle_count; i++) {
|
|
140
|
+
faces.push(face_cursor + i);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
face_cursor += triangle_count;
|
|
144
|
+
|
|
145
|
+
cluster_faces.push(faces);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const topology = new BinaryTopology();
|
|
149
|
+
|
|
150
|
+
// Before the vertices: adding a layer widens every record already in the block, and a frontier
|
|
151
|
+
// holds every vertex of a level.
|
|
152
|
+
const layers = vgeo_layers_like(topology, template_layers);
|
|
153
|
+
|
|
154
|
+
bt_mesh_from_indexed_geometry(topology, Uint32Array.from(indices), Float32Array.from(positions));
|
|
155
|
+
|
|
156
|
+
if (topology.faces.count() !== face_cursor) {
|
|
157
|
+
// The corner walk below reads face `t` as the `t`th triangle of the index list. See
|
|
158
|
+
// `vgeo_extract_submesh`, which throws for the same reason and cannot use an assert either.
|
|
159
|
+
throw new Error(
|
|
160
|
+
`stitching ${face_cursor} triangles produced ${topology.faces.count()} faces, so the `
|
|
161
|
+
+ `corners of the result cannot be matched to the corners they came from`
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const wedges = new BtWedgeSet();
|
|
166
|
+
|
|
167
|
+
wedges.count = source_wedge_ids.length;
|
|
168
|
+
wedges.parent = Uint32Array.from({ length: wedges.count }, (_, wedge) => wedge);
|
|
169
|
+
wedges.next_of_wedge = new Uint32Array(wedges.count).fill(NULL_POINTER);
|
|
170
|
+
wedges.first_of_vertex = new Uint32Array(topology.vertices.size).fill(NULL_POINTER);
|
|
171
|
+
wedges.of_loop = new Uint32Array(topology.loops.size).fill(NULL_POINTER);
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Which vertex each new wedge sits at, so the lists below are built once each.
|
|
175
|
+
* @type {Uint32Array}
|
|
176
|
+
*/
|
|
177
|
+
const vertex_of_wedge = new Uint32Array(wedges.count).fill(NULL_POINTER);
|
|
178
|
+
|
|
179
|
+
for (let face = 0; face < face_cursor; face++) {
|
|
180
|
+
let loop = topology.face_read_loop(face);
|
|
181
|
+
|
|
182
|
+
for (let corner = 0; corner < 3; corner++) {
|
|
183
|
+
const index = face * 3 + corner;
|
|
184
|
+
|
|
185
|
+
const wedge = corner_wedge[index];
|
|
186
|
+
|
|
187
|
+
const vertex = topology.loop_read_vertex(loop);
|
|
188
|
+
|
|
189
|
+
if (vertex_of_wedge[wedge] === NULL_POINTER) {
|
|
190
|
+
vertex_of_wedge[wedge] = vertex;
|
|
191
|
+
} else if (vertex_of_wedge[wedge] !== vertex) {
|
|
192
|
+
/*
|
|
193
|
+
A wedge is a set of corners **at one vertex**, and everything above rests on two
|
|
194
|
+
contributions that name the same frontier wedge naming the same frontier vertex too.
|
|
195
|
+
That holds for a reason rather than by luck — a wedge a collapse moved belonged to a
|
|
196
|
+
victim, a victim is never a group's pinned boundary, and so nothing outside that
|
|
197
|
+
group can name it — but the reason is three steps long and nothing else would notice
|
|
198
|
+
if it stopped being true. The corners would simply be split across two vertices with
|
|
199
|
+
one list between them, and the asset would ship shaded from whichever face was
|
|
200
|
+
walked last.
|
|
201
|
+
*/
|
|
202
|
+
throw new Error(
|
|
203
|
+
`stitching put wedge ${wedge} on vertices ${vertex_of_wedge[wedge]} and `
|
|
204
|
+
+ `${vertex}: a wedge belongs to exactly one vertex`
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
wedges.of_loop[loop] = wedge;
|
|
209
|
+
|
|
210
|
+
const source_loop = corner_loop[index];
|
|
211
|
+
|
|
212
|
+
if (source_loop !== NULL_POINTER) {
|
|
213
|
+
vgeo_layers_copy_corner(
|
|
214
|
+
topology, topologies[corner_contribution[index]], source_loop, loop
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
loop = topology.loop_read_next(loop);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
for (let wedge = 0; wedge < wedges.count; wedge++) {
|
|
223
|
+
if (vertex_of_wedge[wedge] !== NULL_POINTER) {
|
|
224
|
+
wedges.attach(wedge, vertex_of_wedge[wedge]);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const mesh = new VirtualGeometryMesh(topology, layers);
|
|
229
|
+
|
|
230
|
+
const source_vertex_ids = new Uint32Array(index_of_source.size);
|
|
231
|
+
|
|
232
|
+
for (const [source, target] of index_of_source) {
|
|
233
|
+
source_vertex_ids[target] = source;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return {
|
|
237
|
+
mesh,
|
|
238
|
+
cluster_faces,
|
|
239
|
+
source_vertex_ids,
|
|
240
|
+
wedges,
|
|
241
|
+
source_wedge_ids: Uint32Array.from(source_wedge_ids),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Leaves with room to spare between them, re-cut into fewer and fuller leaves.
|
|
3
|
+
*
|
|
4
|
+
* This is not a level of the DAG and must not become one. Nothing is simplified, so the new clusters
|
|
5
|
+
* carry the same error their inputs did -- zero -- and a step whose parent error equals its child
|
|
6
|
+
* error is a step the cut rule can never take: a cluster is drawn only while `project(parent) > tau`,
|
|
7
|
+
* and a parent at zero error projects to zero unconditionally. The leaves under it would be stored,
|
|
8
|
+
* paged, and never once selected. So the re-cut *replaces* them; they were a way of cutting this
|
|
9
|
+
* geometry up, and now there is a better one.
|
|
10
|
+
*
|
|
11
|
+
* It is what makes a scene of small separate parts tractable. A thousand twelve-triangle bolts are a
|
|
12
|
+
* thousand clusters at eight per cent fill, and no simplification is what they need -- they need to
|
|
13
|
+
* be cut up differently. Repacking is bounded by the grouping that proposed it, so what lands in one
|
|
14
|
+
* cluster is what the adjacency and proximity rules already judged to belong together.
|
|
15
|
+
*
|
|
16
|
+
* Only leaves. Above them the same re-cut would orphan a subtree, since a coarser cluster cannot be
|
|
17
|
+
* deleted -- something hangs off it.
|
|
18
|
+
*
|
|
19
|
+
* @param {VGeoFrontier} frontier
|
|
20
|
+
* @param {number[]} group_clusters cluster indices
|
|
21
|
+
* @param {number} parent_target how many clusters the group is aiming to become
|
|
22
|
+
* @returns {VGeoGroupRepack|undefined} `undefined` when the group must be simplified instead
|
|
23
|
+
*
|
|
24
|
+
* @author Alex Goldring
|
|
25
|
+
* @copyright Company Named Limited (c) 2026
|
|
26
|
+
*/
|
|
27
|
+
export function vgeo_try_repack(frontier: VGeoFrontier, group_clusters: number[], parent_target: number): VGeoGroupRepack | undefined;
|
|
28
|
+
import { VGeoGroupRepack } from "./VGeoGroupRepack.js";
|
|
29
|
+
//# sourceMappingURL=vgeo_try_repack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_try_repack.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wEAPW,MAAM,EAAE,iBACR,MAAM,GACJ,eAAe,GAAC,SAAS,CAsFrC;gCA7G+B,sBAAsB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { bt_mesh_build_face_graph } from "../../../../../../core/graph/metis/bt_mesh_build_face_graph.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
|
+
import { VGeoFaceGraph } from "../partition/VGeoFaceGraph.js";
|
|
5
|
+
import { vgeo_split_face_set_packed } from "../partition/vgeo_split_face_set_packed.js";
|
|
6
|
+
import { vgeo_extract_submesh } from "../submesh/vgeo_extract_submesh.js";
|
|
7
|
+
import { vgeo_build_cluster } from "./vgeo_build_cluster.js";
|
|
8
|
+
import { VGeoGroupRepack } from "./VGeoGroupRepack.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Leaves with room to spare between them, re-cut into fewer and fuller leaves.
|
|
12
|
+
*
|
|
13
|
+
* This is not a level of the DAG and must not become one. Nothing is simplified, so the new clusters
|
|
14
|
+
* carry the same error their inputs did -- zero -- and a step whose parent error equals its child
|
|
15
|
+
* error is a step the cut rule can never take: a cluster is drawn only while `project(parent) > tau`,
|
|
16
|
+
* and a parent at zero error projects to zero unconditionally. The leaves under it would be stored,
|
|
17
|
+
* paged, and never once selected. So the re-cut *replaces* them; they were a way of cutting this
|
|
18
|
+
* geometry up, and now there is a better one.
|
|
19
|
+
*
|
|
20
|
+
* It is what makes a scene of small separate parts tractable. A thousand twelve-triangle bolts are a
|
|
21
|
+
* thousand clusters at eight per cent fill, and no simplification is what they need -- they need to
|
|
22
|
+
* be cut up differently. Repacking is bounded by the grouping that proposed it, so what lands in one
|
|
23
|
+
* cluster is what the adjacency and proximity rules already judged to belong together.
|
|
24
|
+
*
|
|
25
|
+
* Only leaves. Above them the same re-cut would orphan a subtree, since a coarser cluster cannot be
|
|
26
|
+
* deleted -- something hangs off it.
|
|
27
|
+
*
|
|
28
|
+
* @param {VGeoFrontier} frontier
|
|
29
|
+
* @param {number[]} group_clusters cluster indices
|
|
30
|
+
* @param {number} parent_target how many clusters the group is aiming to become
|
|
31
|
+
* @returns {VGeoGroupRepack|undefined} `undefined` when the group must be simplified instead
|
|
32
|
+
*
|
|
33
|
+
* @author Alex Goldring
|
|
34
|
+
* @copyright Company Named Limited (c) 2026
|
|
35
|
+
*/
|
|
36
|
+
export function vgeo_try_repack(frontier, group_clusters, parent_target) {
|
|
37
|
+
const face_ids = [];
|
|
38
|
+
|
|
39
|
+
for (const cluster of group_clusters) {
|
|
40
|
+
if (frontier.clusters[cluster].child_group !== undefined) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
for (const face of frontier.cluster_faces[cluster]) {
|
|
45
|
+
face_ids.push(face);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Only when the target is already met -- there is nothing to simplify, so the reduction has to
|
|
50
|
+
// come from re-cutting. A group over its target has real geometry to lose and belongs on the
|
|
51
|
+
// simplification path.
|
|
52
|
+
if (face_ids.length > parent_target * VGEO_MAX_CLUSTER_TRIANGLE_COUNT) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
face_ids.sort((a, b) => a - b);
|
|
57
|
+
|
|
58
|
+
const submesh = vgeo_extract_submesh(frontier.mesh, face_ids, frontier.wedges);
|
|
59
|
+
|
|
60
|
+
const face_graph = new VGeoFaceGraph(
|
|
61
|
+
submesh.mesh.topology, bt_mesh_build_face_graph(submesh.mesh.topology), submesh.wedges
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
* @type {number[]}
|
|
67
|
+
*/
|
|
68
|
+
const all = [];
|
|
69
|
+
|
|
70
|
+
const vertex_count = face_graph.graph.vertex_count;
|
|
71
|
+
for (let vertex = 0; vertex < vertex_count; vertex++) {
|
|
72
|
+
all.push(vertex);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const parts = vgeo_split_face_set_packed(
|
|
76
|
+
face_graph, all, VGEO_MAX_CLUSTER_TRIANGLE_COUNT, VGEO_MAX_CLUSTER_VERTEX_COUNT
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
if (parts.length >= group_clusters.length) {
|
|
80
|
+
// The vertex ceiling bit before the triangle one, and re-cutting bought nothing.
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const repack = new VGeoGroupRepack();
|
|
85
|
+
|
|
86
|
+
repack.replaced = group_clusters.map((cluster) => frontier.clusters[cluster]);
|
|
87
|
+
|
|
88
|
+
for (const part of parts) {
|
|
89
|
+
const part_face_ids = part.map((dense) => face_graph.vertex_face_ids[dense]);
|
|
90
|
+
|
|
91
|
+
part_face_ids.sort((a, b) => a - b);
|
|
92
|
+
|
|
93
|
+
const built = vgeo_build_cluster(submesh.mesh, part_face_ids, 0, submesh.wedges);
|
|
94
|
+
|
|
95
|
+
// A leaf's own bounds are its LOD-metric sphere, and it deviates from nothing.
|
|
96
|
+
built.cluster.self_sphere = built.cluster.bounds_sphere.slice();
|
|
97
|
+
built.cluster.self_error = 0;
|
|
98
|
+
|
|
99
|
+
repack.clusters.push(built.cluster);
|
|
100
|
+
|
|
101
|
+
repack.geometry.push({
|
|
102
|
+
positions: built.gathered.positions,
|
|
103
|
+
indices: built.gathered.indices,
|
|
104
|
+
local_vertex_ids: built.gathered.vertex_ids,
|
|
105
|
+
source_vertex_ids: Uint32Array.from(
|
|
106
|
+
built.gathered.vertex_ids, (local) => submesh.source_vertex_ids[local]
|
|
107
|
+
),
|
|
108
|
+
attribute_ids: built.gathered.attribute_ids,
|
|
109
|
+
source_wedge_ids: Uint32Array.from(
|
|
110
|
+
built.gathered.wedge_ids, (wedge) => submesh.source_wedge_ids[wedge]
|
|
111
|
+
),
|
|
112
|
+
topology: submesh.mesh.topology,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return repack;
|
|
117
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far two triangles may turn across a shared edge before the builder stops pretending the
|
|
3
|
+
* surface is smooth there, in degrees.
|
|
4
|
+
*
|
|
5
|
+
* Only ever applied to normals the builder *synthesizes*. A source that authored its own normals has
|
|
6
|
+
* already answered this question, and its answer is the one that ships.
|
|
7
|
+
*
|
|
8
|
+
* **What it is for.** Averaging every face around a vertex into one direction is right for a surface
|
|
9
|
+
* and wrong for a corner, and a mesh does not say which it is — so an angle has to. A cube is the
|
|
10
|
+
* whole argument: its eight corner vertices each meet three faces, and one direction for all three
|
|
11
|
+
* is ninety degrees wrong for two of them. Measured on Zorah's `mesh1[0]`, whose source is
|
|
12
|
+
* `POSITION`-only and so gets every normal from this pass, the angle between a shipped corner's
|
|
13
|
+
* normal and the normal of the triangle that corner belongs to ran to a mean of 8.60 degrees and a
|
|
14
|
+
* p99 of 37.66 at LOD 0 — the numbers `WEDGE_PLAN_2026_09_18.md` §1 records — before a single
|
|
15
|
+
* collapse.
|
|
16
|
+
*
|
|
17
|
+
* **Why 45.** A threshold splits a curve as readily as a corner, so it is a trade: too low and a
|
|
18
|
+
* coarsely tessellated cylinder gains a crease at every segment, too high and a box stays soft.
|
|
19
|
+
* Swept over that same primitive, over its whole DAG:
|
|
20
|
+
*
|
|
21
|
+
* | crease | vertices/triangle | LOD 0 mean | LOD 0 p99 | all levels p99 | share over 30° |
|
|
22
|
+
* |---|---|---|---|---|---|
|
|
23
|
+
* | none | 0.641 | 8.60 | 37.66 | 54.27 | 6.5% |
|
|
24
|
+
* | 60° | 0.646 | 8.42 | 35.26 | 52.60 | 6.2% |
|
|
25
|
+
* | **45°** | **0.661** | **8.05** | **32.19** | **50.29** | **5.3%** |
|
|
26
|
+
* | 30° | 0.724 | 7.04 | 26.88 | 45.97 | 3.6% |
|
|
27
|
+
* | 20° | 0.880 | 5.53 | 20.58 | 38.65 | 2.0% |
|
|
28
|
+
*
|
|
29
|
+
* A wedge is a shipped vertex, so that first column is very nearly the size of the asset: 45 degrees
|
|
30
|
+
* costs 3%, 30 costs 13% and 20 costs 37%. The curve is smooth because *this* mesh's residual is
|
|
31
|
+
* mostly tessellation rather than creases — it keeps improving as the threshold falls, right through
|
|
32
|
+
* the range where a cylinder would start faceting, which is the sign that the number below is a
|
|
33
|
+
* judgement about content and not a fact about arithmetic. Hard-surface content is where it earns
|
|
34
|
+
* its keep and where the choice is obvious: every edge of a box is ninety degrees, and any threshold
|
|
35
|
+
* under that keeps all of them.
|
|
36
|
+
*
|
|
37
|
+
* So it is also {@link VGeoBuildOptions#crease_angle}, and a conversion of one kind of content can
|
|
38
|
+
* say so.
|
|
39
|
+
*
|
|
40
|
+
* @type {number}
|
|
41
|
+
*
|
|
42
|
+
* @author Alex Goldring
|
|
43
|
+
* @copyright Company Named Limited (c) 2026
|
|
44
|
+
*/
|
|
45
|
+
export const VGEO_CREASE_ANGLE: number;
|
|
46
|
+
//# sourceMappingURL=VGEO_CREASE_ANGLE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGEO_CREASE_ANGLE.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,gCALU,MAAM,CAKoB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How far two triangles may turn across a shared edge before the builder stops pretending the
|
|
3
|
+
* surface is smooth there, in degrees.
|
|
4
|
+
*
|
|
5
|
+
* Only ever applied to normals the builder *synthesizes*. A source that authored its own normals has
|
|
6
|
+
* already answered this question, and its answer is the one that ships.
|
|
7
|
+
*
|
|
8
|
+
* **What it is for.** Averaging every face around a vertex into one direction is right for a surface
|
|
9
|
+
* and wrong for a corner, and a mesh does not say which it is — so an angle has to. A cube is the
|
|
10
|
+
* whole argument: its eight corner vertices each meet three faces, and one direction for all three
|
|
11
|
+
* is ninety degrees wrong for two of them. Measured on Zorah's `mesh1[0]`, whose source is
|
|
12
|
+
* `POSITION`-only and so gets every normal from this pass, the angle between a shipped corner's
|
|
13
|
+
* normal and the normal of the triangle that corner belongs to ran to a mean of 8.60 degrees and a
|
|
14
|
+
* p99 of 37.66 at LOD 0 — the numbers `WEDGE_PLAN_2026_09_18.md` §1 records — before a single
|
|
15
|
+
* collapse.
|
|
16
|
+
*
|
|
17
|
+
* **Why 45.** A threshold splits a curve as readily as a corner, so it is a trade: too low and a
|
|
18
|
+
* coarsely tessellated cylinder gains a crease at every segment, too high and a box stays soft.
|
|
19
|
+
* Swept over that same primitive, over its whole DAG:
|
|
20
|
+
*
|
|
21
|
+
* | crease | vertices/triangle | LOD 0 mean | LOD 0 p99 | all levels p99 | share over 30° |
|
|
22
|
+
* |---|---|---|---|---|---|
|
|
23
|
+
* | none | 0.641 | 8.60 | 37.66 | 54.27 | 6.5% |
|
|
24
|
+
* | 60° | 0.646 | 8.42 | 35.26 | 52.60 | 6.2% |
|
|
25
|
+
* | **45°** | **0.661** | **8.05** | **32.19** | **50.29** | **5.3%** |
|
|
26
|
+
* | 30° | 0.724 | 7.04 | 26.88 | 45.97 | 3.6% |
|
|
27
|
+
* | 20° | 0.880 | 5.53 | 20.58 | 38.65 | 2.0% |
|
|
28
|
+
*
|
|
29
|
+
* A wedge is a shipped vertex, so that first column is very nearly the size of the asset: 45 degrees
|
|
30
|
+
* costs 3%, 30 costs 13% and 20 costs 37%. The curve is smooth because *this* mesh's residual is
|
|
31
|
+
* mostly tessellation rather than creases — it keeps improving as the threshold falls, right through
|
|
32
|
+
* the range where a cylinder would start faceting, which is the sign that the number below is a
|
|
33
|
+
* judgement about content and not a fact about arithmetic. Hard-surface content is where it earns
|
|
34
|
+
* its keep and where the choice is obvious: every edge of a box is ninety degrees, and any threshold
|
|
35
|
+
* under that keeps all of them.
|
|
36
|
+
*
|
|
37
|
+
* So it is also {@link VGeoBuildOptions#crease_angle}, and a conversion of one kind of content can
|
|
38
|
+
* say so.
|
|
39
|
+
*
|
|
40
|
+
* @type {number}
|
|
41
|
+
*
|
|
42
|
+
* @author Alex Goldring
|
|
43
|
+
* @copyright Company Named Limited (c) 2026
|
|
44
|
+
*/
|
|
45
|
+
export const VGEO_CREASE_ANGLE = 45;
|
package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a full unit of each channel is worth in position error, as a fraction of the geometry's own
|
|
3
|
+
* bounding-box diagonal. See {@link VGeoBuildOptions#attribute_weight_ratios}.
|
|
4
|
+
*
|
|
5
|
+
* ## What the number does and does not control
|
|
6
|
+
*
|
|
7
|
+
* It does **not** control the value a coarse vertex carries. That is a least-squares fit to the
|
|
8
|
+
* accumulated fields, and the weight cancels out of it exactly — multiplied in when the quadric is
|
|
9
|
+
* built, divided out when it is solved. The fit is the larger of the two wins by a long way and it
|
|
10
|
+
* needs no tuning at all.
|
|
11
|
+
*
|
|
12
|
+
* What the number controls is how much the channels get to move the vertex and price the collapse.
|
|
13
|
+
* A collapse that would smear a crease is charged for it, in units of length, at exactly the rate
|
|
14
|
+
* this names.
|
|
15
|
+
*
|
|
16
|
+
* ## How it was chosen
|
|
17
|
+
*
|
|
18
|
+
* Swept from `1e-9` — the term effectively off — to `1/2`, measuring how far the shipped normal field
|
|
19
|
+
* sits from the source's and what happened to `self_error`, which is the number the runtime's cut is
|
|
20
|
+
* driven by.
|
|
21
|
+
*
|
|
22
|
+
* On a 31,874-triangle Zorah primitive, the content the defect was found on:
|
|
23
|
+
*
|
|
24
|
+
* ```
|
|
25
|
+
* ratio normal error, mean over the DAG self_error at the root
|
|
26
|
+
* 1e-9 2.076 deg 1.00x
|
|
27
|
+
* 1/1024 1.857 deg 1.08x
|
|
28
|
+
* 1/64 1.807 deg 1.35x
|
|
29
|
+
* 1/8 2.059 deg 18.09x
|
|
30
|
+
* 1/4 2.191 deg 6.81x
|
|
31
|
+
* 1/2 2.326 deg 14.02x
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* Above `1/64` it is not a trade, it is a loss: eighteen times the geometric error for a normal field
|
|
35
|
+
* that is *worse* than leaving the term off. The reason is that this content is mostly smooth, and on
|
|
36
|
+
* smooth geometry there is no crease for the term to defend — a 48x24 sphere reads 5.29 degrees of
|
|
37
|
+
* worst-case normal error at every ratio from `1e-9` to `1/4`, unchanged to three figures.
|
|
38
|
+
*
|
|
39
|
+
* So `1/1024`: inside the 20% the plan allows `self_error` to move, worth about a tenth of a degree,
|
|
40
|
+
* and far enough below the cliff that no content falls off it by accident.
|
|
41
|
+
*
|
|
42
|
+
* ## When to raise it
|
|
43
|
+
*
|
|
44
|
+
* Content with hard creases, which is what the term is actually for. A cube subdivided sixteen ways
|
|
45
|
+
* per face — flat faces meeting at right angles, where collapsing *within* a face costs exactly zero
|
|
46
|
+
* geometric error and the metric has nothing else to say — goes from 14.9 degrees of worst-case
|
|
47
|
+
* normal error to **1.38** at `1/4`. (Subdivided twenty-four ways it reads a hundredth of a degree at
|
|
48
|
+
* every ratio, which is how sharply this depends on the geometry rather than on the setting.) That
|
|
49
|
+
* is the trade the number exists to make, and it is a per-asset decision rather than a default,
|
|
50
|
+
* because the same setting on Zorah costs seven times the error for nothing.
|
|
51
|
+
*
|
|
52
|
+
* The other channels take the same ratio for want of their own measurement. A texture coordinate and
|
|
53
|
+
* a colour are bounded the way a normal component is — roughly `[0, 1]`, roughly `[-1, 1]` — so the
|
|
54
|
+
* number is at least in the right place, and none of the content this was measured on carries them.
|
|
55
|
+
* Naming that here rather than implying they were each swept.
|
|
56
|
+
*
|
|
57
|
+
* @readonly
|
|
58
|
+
* @type {number[]}
|
|
59
|
+
*
|
|
60
|
+
* @author Alex Goldring
|
|
61
|
+
* @copyright Company Named Limited (c) 2026
|
|
62
|
+
*/
|
|
63
|
+
export const VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS: number[];
|
|
64
|
+
//# sourceMappingURL=VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map
|
package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,mDALU,MAAM,EAAE,CAOhB"}
|
package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { VGEO_ATTRIBUTE } from "../../format/attribute/VGEO_ATTRIBUTE.js";
|
|
2
|
+
import { VGEO_ATTRIBUTES } from "../../format/attribute/VGEO_ATTRIBUTES.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* What a full unit of each channel is worth in position error, as a fraction of the geometry's own
|
|
6
|
+
* bounding-box diagonal. See {@link VGeoBuildOptions#attribute_weight_ratios}.
|
|
7
|
+
*
|
|
8
|
+
* ## What the number does and does not control
|
|
9
|
+
*
|
|
10
|
+
* It does **not** control the value a coarse vertex carries. That is a least-squares fit to the
|
|
11
|
+
* accumulated fields, and the weight cancels out of it exactly — multiplied in when the quadric is
|
|
12
|
+
* built, divided out when it is solved. The fit is the larger of the two wins by a long way and it
|
|
13
|
+
* needs no tuning at all.
|
|
14
|
+
*
|
|
15
|
+
* What the number controls is how much the channels get to move the vertex and price the collapse.
|
|
16
|
+
* A collapse that would smear a crease is charged for it, in units of length, at exactly the rate
|
|
17
|
+
* this names.
|
|
18
|
+
*
|
|
19
|
+
* ## How it was chosen
|
|
20
|
+
*
|
|
21
|
+
* Swept from `1e-9` — the term effectively off — to `1/2`, measuring how far the shipped normal field
|
|
22
|
+
* sits from the source's and what happened to `self_error`, which is the number the runtime's cut is
|
|
23
|
+
* driven by.
|
|
24
|
+
*
|
|
25
|
+
* On a 31,874-triangle Zorah primitive, the content the defect was found on:
|
|
26
|
+
*
|
|
27
|
+
* ```
|
|
28
|
+
* ratio normal error, mean over the DAG self_error at the root
|
|
29
|
+
* 1e-9 2.076 deg 1.00x
|
|
30
|
+
* 1/1024 1.857 deg 1.08x
|
|
31
|
+
* 1/64 1.807 deg 1.35x
|
|
32
|
+
* 1/8 2.059 deg 18.09x
|
|
33
|
+
* 1/4 2.191 deg 6.81x
|
|
34
|
+
* 1/2 2.326 deg 14.02x
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* Above `1/64` it is not a trade, it is a loss: eighteen times the geometric error for a normal field
|
|
38
|
+
* that is *worse* than leaving the term off. The reason is that this content is mostly smooth, and on
|
|
39
|
+
* smooth geometry there is no crease for the term to defend — a 48x24 sphere reads 5.29 degrees of
|
|
40
|
+
* worst-case normal error at every ratio from `1e-9` to `1/4`, unchanged to three figures.
|
|
41
|
+
*
|
|
42
|
+
* So `1/1024`: inside the 20% the plan allows `self_error` to move, worth about a tenth of a degree,
|
|
43
|
+
* and far enough below the cliff that no content falls off it by accident.
|
|
44
|
+
*
|
|
45
|
+
* ## When to raise it
|
|
46
|
+
*
|
|
47
|
+
* Content with hard creases, which is what the term is actually for. A cube subdivided sixteen ways
|
|
48
|
+
* per face — flat faces meeting at right angles, where collapsing *within* a face costs exactly zero
|
|
49
|
+
* geometric error and the metric has nothing else to say — goes from 14.9 degrees of worst-case
|
|
50
|
+
* normal error to **1.38** at `1/4`. (Subdivided twenty-four ways it reads a hundredth of a degree at
|
|
51
|
+
* every ratio, which is how sharply this depends on the geometry rather than on the setting.) That
|
|
52
|
+
* is the trade the number exists to make, and it is a per-asset decision rather than a default,
|
|
53
|
+
* because the same setting on Zorah costs seven times the error for nothing.
|
|
54
|
+
*
|
|
55
|
+
* The other channels take the same ratio for want of their own measurement. A texture coordinate and
|
|
56
|
+
* a colour are bounded the way a normal component is — roughly `[0, 1]`, roughly `[-1, 1]` — so the
|
|
57
|
+
* number is at least in the right place, and none of the content this was measured on carries them.
|
|
58
|
+
* Naming that here rather than implying they were each swept.
|
|
59
|
+
*
|
|
60
|
+
* @readonly
|
|
61
|
+
* @type {number[]}
|
|
62
|
+
*
|
|
63
|
+
* @author Alex Goldring
|
|
64
|
+
* @copyright Company Named Limited (c) 2026
|
|
65
|
+
*/
|
|
66
|
+
export const VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS = Object.freeze(
|
|
67
|
+
VGEO_ATTRIBUTES.map((_, attribute) => attribute === VGEO_ATTRIBUTE.POSITION ? 0 : 1 / 1024)
|
|
68
|
+
);
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* A level of geometry as the builder handles it: a `BinaryTopology` carrying the positions, the
|
|
3
3
|
* connectivity, and the per-vertex attributes all together.
|
|
4
4
|
*
|
|
5
|
-
* Everything per-
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* Everything per-element lives in the topology. It has to: a collapse moves and removes vertices and
|
|
6
|
+
* kills faces, and the topology is the only thing that knows which. A data layer is sized by its own
|
|
7
|
+
* pool, so a channel cannot fall out of step with the mesh it describes — there is no second array
|
|
8
|
+
* to resize, no invariant to assert, and no way for the simplifier to leave a live element without a
|
|
9
|
+
* slot.
|
|
10
|
+
*
|
|
11
|
+
* **Position is the vertex's; appearance is the corner's.** A hard edge and a texture seam are both
|
|
12
|
+
* one geometric vertex that shades two ways, and no per-vertex record can hold that — so the
|
|
13
|
+
* channels are loop data. See `WEDGE_PLAN_2026_09_18.md` §2.
|
|
10
14
|
*
|
|
11
15
|
* The channels are named by their index into {@link VGEO_ATTRIBUTES}, which is the format's frozen
|
|
12
16
|
* table — {@link layers} has one slot per entry, holding a layer or null.
|
|
@@ -42,9 +46,10 @@ export class VirtualGeometryMesh {
|
|
|
42
46
|
*/
|
|
43
47
|
topology: BinaryTopology;
|
|
44
48
|
/**
|
|
45
|
-
* One slot per {@link VGEO_ATTRIBUTES} entry, holding the
|
|
49
|
+
* One slot per {@link VGEO_ATTRIBUTES} entry, holding the **loop** data layer that carries that
|
|
46
50
|
* channel or null where this geometry does not carry it.
|
|
47
|
-
* {@link VGEO_ATTRIBUTE.POSITION}'s slot is always null — position is the topology's own
|
|
51
|
+
* {@link VGEO_ATTRIBUTE.POSITION}'s slot is always null — position is the topology's own, and is
|
|
52
|
+
* the one value that really is a vertex's rather than a corner's.
|
|
48
53
|
* @type {(BinaryDataLayer|null)[]}
|
|
49
54
|
*/
|
|
50
55
|
layers: (BinaryDataLayer | null)[];
|
|
@@ -69,5 +74,5 @@ export class VirtualGeometryMesh {
|
|
|
69
74
|
*/
|
|
70
75
|
face_ids(): number[];
|
|
71
76
|
}
|
|
72
|
-
import { BinaryTopology } from "
|
|
77
|
+
import { BinaryTopology } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
|
|
73
78
|
//# sourceMappingURL=VirtualGeometryMesh.d.ts.map
|