@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
|
@@ -3,13 +3,17 @@ import { VGEO_ATTRIBUTES } from "../attribute/VGEO_ATTRIBUTES.js";
|
|
|
3
3
|
import { VGEO_CHILD_OFFSET } from "../frame/VGEO_CHILD_OFFSET.js";
|
|
4
4
|
import { VGEO_CHILD_TABLE_ENTRY_SIZE } from "../frame/VGEO_CHILD_TABLE_ENTRY_SIZE.js";
|
|
5
5
|
import { VGEO_CLUSTER_OFFSET } from "../cluster/VGEO_CLUSTER_OFFSET.js";
|
|
6
|
+
import { VGEO_CLUSTER_OFFSET_V4 } from "../cluster/VGEO_CLUSTER_OFFSET_V4.js";
|
|
6
7
|
import { VGEO_CLUSTER_RECORD_SIZE } from "../cluster/VGEO_CLUSTER_RECORD_SIZE.js";
|
|
8
|
+
import { VGEO_CODEC_DEFLATE } from "../frame/VGEO_CODEC_DEFLATE.js";
|
|
7
9
|
import { VGEO_CODEC_LZ4 } from "../frame/VGEO_CODEC_LZ4.js";
|
|
8
10
|
import { VGEO_CODEC_RAW } from "../frame/VGEO_CODEC_RAW.js";
|
|
9
11
|
import { vgeo_decode_frame_blob } from "../frame/vgeo_decode_frame_blob.js";
|
|
12
|
+
import { VGEO_FORMAT_VERSION } from "../header/VGEO_FORMAT_VERSION.js";
|
|
10
13
|
import { VGEO_FRAME_HEADER_SIZE } from "../frame/VGEO_FRAME_HEADER_SIZE.js";
|
|
11
14
|
import { VGEO_FRAME_OFFSET } from "../frame/VGEO_FRAME_OFFSET.js";
|
|
12
15
|
import { vgeo_frame_decode_bound } from "../frame/vgeo_frame_decode_bound.js";
|
|
16
|
+
import { VGEO_GROUP_OFFSET } from "../page/VGEO_GROUP_OFFSET.js";
|
|
13
17
|
import { VGEO_GROUP_RECORD_SIZE } from "../page/VGEO_GROUP_RECORD_SIZE.js";
|
|
14
18
|
import { VGEO_METRIC_OFFSET } from "../page/VGEO_METRIC_OFFSET.js";
|
|
15
19
|
import { VGEO_NODE_OFFSET } from "../page/VGEO_NODE_OFFSET.js";
|
|
@@ -17,6 +21,7 @@ import { VGEO_NODE_RECORD_SIZE } from "../page/VGEO_NODE_RECORD_SIZE.js";
|
|
|
17
21
|
import { VGEO_PAGE_HEADER_SIZE } from "../page/VGEO_PAGE_HEADER_SIZE.js";
|
|
18
22
|
import { VGEO_PAGE_MAGIC } from "../frame/VGEO_PAGE_MAGIC.js";
|
|
19
23
|
import { VGEO_PAGE_OFFSET } from "../page/VGEO_PAGE_OFFSET.js";
|
|
24
|
+
import { VGEO_PAGE_OFFSET_V5 } from "../page/VGEO_PAGE_OFFSET_V5.js";
|
|
20
25
|
import { VGEO_PARENT_ENTRY_SIZE } from "../page/VGEO_PARENT_ENTRY_SIZE.js";
|
|
21
26
|
import { VGEO_PARENT_PAGE_ENTRY_SIZE } from "../page/VGEO_PARENT_PAGE_ENTRY_SIZE.js";
|
|
22
27
|
import { vgeo_read_frame_extent } from "../frame/vgeo_read_frame_extent.js";
|
|
@@ -48,17 +53,27 @@ const NORMAL_COMPRESSION_FLAG = VGEO_ATTRIBUTES[VGEO_ATTRIBUTE.NORMAL].compressi
|
|
|
48
53
|
* `decoded_size` is four bytes of untrusted file, and honouring one that no block of that length
|
|
49
54
|
* could produce turns corruption into an out-of-memory throw rather than a rejected file.
|
|
50
55
|
*
|
|
56
|
+
* It is asynchronous because {@link VGEO_CODEC_DEFLATE} is — the platform only offers its zlib as a
|
|
57
|
+
* stream — and a reader that could not read a deflate page would be refusing assets over an
|
|
58
|
+
* implementation detail. Everything after the decode is the same synchronous walk of the page's own
|
|
59
|
+
* tables it has always been, and a raw or LZ4 page never leaves the caller's turn.
|
|
60
|
+
*
|
|
51
61
|
* @param {Uint8Array} frame_bytes the frame's exact range, from its first byte
|
|
52
62
|
* @param {number} page_index the frame ordinal this range was fetched as — the caller knows it from
|
|
53
63
|
* the child-table entry or the directory record that named the range
|
|
54
|
-
* @
|
|
64
|
+
* @param {number} [format_version] the container header's, which decides how a cluster record
|
|
65
|
+
* (§7) and a page header (§6.1) are laid out: version 5 put `subtree_aabb` at offset 40 and
|
|
66
|
+
* moved everything after it, and version 6 widened the page band to `u16` over
|
|
67
|
+
* `node_table_offset`. Defaults to the current version, which is what a caller holding no
|
|
68
|
+
* header should assume — the frame itself does not carry one.
|
|
69
|
+
* @returns {Promise<VGeoPage>}
|
|
55
70
|
* @throws {Error} when the range is not a frame, uses a codec with no decoder here, or does not
|
|
56
71
|
* decode as its own header says
|
|
57
72
|
*
|
|
58
73
|
* @author Alex Goldring
|
|
59
74
|
* @copyright Company Named Limited (c) 2026
|
|
60
75
|
*/
|
|
61
|
-
export function vgeo_read_page(frame_bytes, page_index) {
|
|
76
|
+
export async function vgeo_read_page(frame_bytes, page_index, format_version = VGEO_FORMAT_VERSION) {
|
|
62
77
|
const frame_view = new DataView(
|
|
63
78
|
frame_bytes.buffer, frame_bytes.byteOffset, frame_bytes.byteLength
|
|
64
79
|
);
|
|
@@ -88,10 +103,15 @@ export function vgeo_read_page(frame_bytes, page_index) {
|
|
|
88
103
|
// decoder indexes `frame_bytes` with, and the caller keeps the absolute one.
|
|
89
104
|
const frame = vgeo_read_frame_extent(frame_view, 0, page_index);
|
|
90
105
|
|
|
91
|
-
if (
|
|
106
|
+
if (
|
|
107
|
+
frame.codec !== VGEO_CODEC_RAW
|
|
108
|
+
&& frame.codec !== VGEO_CODEC_LZ4
|
|
109
|
+
&& frame.codec !== VGEO_CODEC_DEFLATE
|
|
110
|
+
) {
|
|
92
111
|
throw new Error(
|
|
93
112
|
`page ${page_index} uses codec ${frame.codec};`
|
|
94
|
-
+ ` this reader decodes ${VGEO_CODEC_RAW} (raw)
|
|
113
|
+
+ ` this reader decodes ${VGEO_CODEC_RAW} (raw), ${VGEO_CODEC_LZ4} (lz4)`
|
|
114
|
+
+ ` and ${VGEO_CODEC_DEFLATE} (deflate)`
|
|
95
115
|
);
|
|
96
116
|
}
|
|
97
117
|
|
|
@@ -119,16 +139,25 @@ export function vgeo_read_page(frame_bytes, page_index) {
|
|
|
119
139
|
|
|
120
140
|
const bytes = new Uint8Array(frame.decoded_size);
|
|
121
141
|
|
|
122
|
-
vgeo_decode_frame_blob(bytes, 0, frame_bytes, frame);
|
|
142
|
+
await vgeo_decode_frame_blob(bytes, 0, frame_bytes, frame);
|
|
123
143
|
|
|
124
144
|
result.bytes = bytes;
|
|
125
145
|
result.data = new DataView(bytes.buffer);
|
|
126
146
|
|
|
147
|
+
/*
|
|
148
|
+
Version 6 widened `min_level` and `max_level` to `u16` and spent `node_table_offset` on the
|
|
149
|
+
four bytes, so the page header's fields at offsets 4..8 and 20..24 mean different things either
|
|
150
|
+
side of it. Everything else in a page — the group table's base, the other table offsets, the
|
|
151
|
+
parent section, the metric — is where it always was, which is why only these two readers take
|
|
152
|
+
the flag.
|
|
153
|
+
*/
|
|
154
|
+
const legacy_page = format_version < 6;
|
|
155
|
+
|
|
127
156
|
read_child_table(result, frame_view, frame);
|
|
128
|
-
read_page_header(result);
|
|
157
|
+
read_page_header(result, legacy_page);
|
|
129
158
|
read_group_table(result);
|
|
130
|
-
read_node_table(result);
|
|
131
|
-
read_cluster_table(result);
|
|
159
|
+
read_node_table(result, legacy_page);
|
|
160
|
+
read_cluster_table(result, format_version);
|
|
132
161
|
read_parent_tables(result);
|
|
133
162
|
|
|
134
163
|
return result;
|
|
@@ -210,13 +239,23 @@ function read_child_table(page, frame_view, frame) {
|
|
|
210
239
|
* past.
|
|
211
240
|
*
|
|
212
241
|
* @param {VGeoPage} page
|
|
242
|
+
* @param {boolean} legacy the container is `format_version` 5 or older
|
|
213
243
|
*/
|
|
214
|
-
function read_node_table(page) {
|
|
244
|
+
function read_node_table(page, legacy) {
|
|
215
245
|
const data = page.data;
|
|
216
246
|
|
|
217
247
|
const count = page.node_count;
|
|
218
248
|
|
|
219
|
-
|
|
249
|
+
/*
|
|
250
|
+
Stored through version 5, derived from 6 on, and the same number either way: the group table
|
|
251
|
+
follows the page header and the node table follows the group table, both by construction
|
|
252
|
+
(§6.1). What stands between a `group_count` that is wrong and a read past the page is the
|
|
253
|
+
extent check below, and that stood there when the offset was stored too.
|
|
254
|
+
*/
|
|
255
|
+
const table = legacy
|
|
256
|
+
? data.getUint32(VGEO_PAGE_OFFSET_V5.NODE_TABLE_OFFSET, LE)
|
|
257
|
+
: VGEO_PAGE_HEADER_SIZE
|
|
258
|
+
+ data.getUint16(VGEO_PAGE_OFFSET.GROUP_COUNT, LE) * VGEO_GROUP_RECORD_SIZE;
|
|
220
259
|
|
|
221
260
|
const end = table + count * VGEO_NODE_RECORD_SIZE;
|
|
222
261
|
|
|
@@ -263,8 +302,9 @@ function read_node_table(page) {
|
|
|
263
302
|
|
|
264
303
|
/**
|
|
265
304
|
* @param {VGeoPage} page
|
|
305
|
+
* @param {boolean} legacy the container is `format_version` 5 or older
|
|
266
306
|
*/
|
|
267
|
-
function read_page_header(page) {
|
|
307
|
+
function read_page_header(page, legacy) {
|
|
268
308
|
const data = page.data;
|
|
269
309
|
|
|
270
310
|
if (page.bytes.byteLength < VGEO_PAGE_HEADER_SIZE) {
|
|
@@ -275,9 +315,17 @@ function read_page_header(page) {
|
|
|
275
315
|
}
|
|
276
316
|
|
|
277
317
|
page.cluster_count = data.getUint16(VGEO_PAGE_OFFSET.CLUSTER_COUNT, LE);
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
318
|
+
|
|
319
|
+
if (legacy) {
|
|
320
|
+
page.min_level = data.getUint8(VGEO_PAGE_OFFSET_V5.MIN_LEVEL);
|
|
321
|
+
page.max_level = data.getUint8(VGEO_PAGE_OFFSET_V5.MAX_LEVEL);
|
|
322
|
+
page.node_count = data.getUint16(VGEO_PAGE_OFFSET_V5.NODE_COUNT, LE);
|
|
323
|
+
} else {
|
|
324
|
+
page.min_level = data.getUint16(VGEO_PAGE_OFFSET.MIN_LEVEL, LE);
|
|
325
|
+
page.max_level = data.getUint16(VGEO_PAGE_OFFSET.MAX_LEVEL, LE);
|
|
326
|
+
page.node_count = data.getUint16(VGEO_PAGE_OFFSET.NODE_COUNT, LE);
|
|
327
|
+
}
|
|
328
|
+
|
|
281
329
|
page.payload_offset = data.getUint32(VGEO_PAGE_OFFSET.PAYLOAD_OFFSET, LE);
|
|
282
330
|
page.payload_size = data.getUint32(VGEO_PAGE_OFFSET.PAYLOAD_SIZE, LE);
|
|
283
331
|
}
|
|
@@ -298,10 +346,14 @@ function read_group_table(page) {
|
|
|
298
346
|
for (let i = 0; i < count; i++) {
|
|
299
347
|
const record = VGEO_PAGE_HEADER_SIZE + i * VGEO_GROUP_RECORD_SIZE;
|
|
300
348
|
|
|
301
|
-
page.group_cluster_first[i] =
|
|
302
|
-
|
|
303
|
-
page.
|
|
304
|
-
|
|
349
|
+
page.group_cluster_first[i] =
|
|
350
|
+
data.getUint16(record + VGEO_GROUP_OFFSET.CLUSTER_FIRST, LE);
|
|
351
|
+
page.group_cluster_count[i] =
|
|
352
|
+
data.getUint16(record + VGEO_GROUP_OFFSET.CLUSTER_COUNT, LE);
|
|
353
|
+
page.group_parent_count[i] =
|
|
354
|
+
data.getUint16(record + VGEO_GROUP_OFFSET.PARENT_CLUSTER_COUNT, LE);
|
|
355
|
+
page.group_parent_first[i] =
|
|
356
|
+
data.getUint16(record + VGEO_GROUP_OFFSET.PARENT_FIRST, LE);
|
|
305
357
|
}
|
|
306
358
|
}
|
|
307
359
|
|
|
@@ -357,10 +409,21 @@ function read_parent_tables(page) {
|
|
|
357
409
|
|
|
358
410
|
/**
|
|
359
411
|
* @param {VGeoPage} page
|
|
412
|
+
* @param {number} format_version of the container this page came out of
|
|
360
413
|
*/
|
|
361
|
-
function read_cluster_table(page) {
|
|
414
|
+
function read_cluster_table(page, format_version) {
|
|
362
415
|
const data = page.data;
|
|
363
416
|
|
|
417
|
+
/*
|
|
418
|
+
Version 5 replaced `bounds_sphere` and `cone_reserved` with `subtree_aabb`, which moved every
|
|
419
|
+
field from offset 40 on, so reading an older record by the current offsets does not lose a
|
|
420
|
+
field — it takes `child_ref` out of the middle of a box. The fifty gigabytes of converted
|
|
421
|
+
version-4 containers are why this branch exists rather than a refusal.
|
|
422
|
+
*/
|
|
423
|
+
const legacy = format_version < 5;
|
|
424
|
+
|
|
425
|
+
const offsets = legacy ? VGEO_CLUSTER_OFFSET_V4 : VGEO_CLUSTER_OFFSET;
|
|
426
|
+
|
|
364
427
|
const count = page.cluster_count;
|
|
365
428
|
|
|
366
429
|
const table = data.getUint32(VGEO_PAGE_OFFSET.CLUSTER_TABLE_OFFSET, LE);
|
|
@@ -376,7 +439,7 @@ function read_cluster_table(page) {
|
|
|
376
439
|
|
|
377
440
|
page.self_sphere = new Float32Array(count * 4);
|
|
378
441
|
page.parent_sphere = new Float32Array(count * 4);
|
|
379
|
-
page.
|
|
442
|
+
page.subtree_aabb = new Float32Array(count * 6);
|
|
380
443
|
page.aabb = new Float32Array(count * 6);
|
|
381
444
|
page.self_error = new Float32Array(count);
|
|
382
445
|
page.parent_error = new Float32Array(count);
|
|
@@ -394,29 +457,49 @@ function read_cluster_table(page) {
|
|
|
394
457
|
|
|
395
458
|
for (let c = 0; c < 4; c++) {
|
|
396
459
|
page.self_sphere[i * 4 + c] =
|
|
397
|
-
data.getFloat32(record +
|
|
460
|
+
data.getFloat32(record + offsets.SELF_SPHERE + c * 4, LE);
|
|
398
461
|
page.parent_sphere[i * 4 + c] =
|
|
399
|
-
data.getFloat32(record +
|
|
400
|
-
page.bounds_sphere[i * 4 + c] =
|
|
401
|
-
data.getFloat32(record + VGEO_CLUSTER_OFFSET.BOUNDS_SPHERE + c * 4, LE);
|
|
462
|
+
data.getFloat32(record + offsets.PARENT_SPHERE + c * 4, LE);
|
|
402
463
|
}
|
|
403
464
|
|
|
404
465
|
for (let c = 0; c < 6; c++) {
|
|
405
|
-
page.aabb[i * 6 + c] =
|
|
406
|
-
|
|
466
|
+
page.aabb[i * 6 + c] = data.getFloat32(record + offsets.AABB + c * 4, LE);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
if (legacy) {
|
|
470
|
+
/*
|
|
471
|
+
The cube around `self_sphere`, which format §11.7 makes contain every vertex below the
|
|
472
|
+
cluster — so it is a conservative subtree bound, which is the whole of what the cut's
|
|
473
|
+
test asks of this column. It is looser than the box a version-5 build computes, and
|
|
474
|
+
looser in exactly the way the sphere the kernel also tests already is.
|
|
475
|
+
*/
|
|
476
|
+
const cx = page.self_sphere[i * 4];
|
|
477
|
+
const cy = page.self_sphere[i * 4 + 1];
|
|
478
|
+
const cz = page.self_sphere[i * 4 + 2];
|
|
479
|
+
const r = page.self_sphere[i * 4 + 3];
|
|
480
|
+
|
|
481
|
+
page.subtree_aabb[i * 6] = cx - r;
|
|
482
|
+
page.subtree_aabb[i * 6 + 1] = cy - r;
|
|
483
|
+
page.subtree_aabb[i * 6 + 2] = cz - r;
|
|
484
|
+
page.subtree_aabb[i * 6 + 3] = cx + r;
|
|
485
|
+
page.subtree_aabb[i * 6 + 4] = cy + r;
|
|
486
|
+
page.subtree_aabb[i * 6 + 5] = cz + r;
|
|
487
|
+
} else {
|
|
488
|
+
for (let c = 0; c < 6; c++) {
|
|
489
|
+
page.subtree_aabb[i * 6 + c] =
|
|
490
|
+
data.getFloat32(record + offsets.SUBTREE_AABB + c * 4, LE);
|
|
491
|
+
}
|
|
407
492
|
}
|
|
408
493
|
|
|
409
|
-
page.self_error[i] = data.getFloat32(record +
|
|
410
|
-
page.parent_error[i] = data.getFloat32(record +
|
|
411
|
-
page.child_ref[i] = data.getUint16(record +
|
|
412
|
-
page.child_group[i] = data.getUint16(record +
|
|
413
|
-
page.encoding_flags[i] = data.getUint32(record +
|
|
414
|
-
page.cluster_payload_offset[i] =
|
|
415
|
-
|
|
416
|
-
page.
|
|
417
|
-
|
|
418
|
-
page.vertex_count[i] = data.getUint8(record + VGEO_CLUSTER_OFFSET.VERTEX_COUNT);
|
|
419
|
-
page.triangle_count[i] = data.getUint8(record + VGEO_CLUSTER_OFFSET.TRIANGLE_COUNT);
|
|
494
|
+
page.self_error[i] = data.getFloat32(record + offsets.SELF_ERROR, LE);
|
|
495
|
+
page.parent_error[i] = data.getFloat32(record + offsets.PARENT_ERROR, LE);
|
|
496
|
+
page.child_ref[i] = data.getUint16(record + offsets.CHILD_REF, LE);
|
|
497
|
+
page.child_group[i] = data.getUint16(record + offsets.CHILD_GROUP, LE);
|
|
498
|
+
page.encoding_flags[i] = data.getUint32(record + offsets.ENCODING_FLAGS, LE);
|
|
499
|
+
page.cluster_payload_offset[i] = data.getUint32(record + offsets.PAYLOAD_OFFSET, LE);
|
|
500
|
+
page.cluster_payload_size[i] = data.getUint32(record + offsets.PAYLOAD_SIZE, LE);
|
|
501
|
+
page.vertex_count[i] = data.getUint8(record + offsets.VERTEX_COUNT);
|
|
502
|
+
page.triangle_count[i] = data.getUint8(record + offsets.TRIANGLE_COUNT);
|
|
420
503
|
|
|
421
504
|
if ((page.encoding_flags[i] & NORMAL_COMPRESSION_FLAG) === 0) {
|
|
422
505
|
page.per_vertex_normal_cluster_count++;
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Audit a `.vgeo` file.
|
|
3
3
|
*
|
|
4
|
+
* It is asynchronous for the one reason the reader is: {@link VGEO_CODEC_DEFLATE} decodes through
|
|
5
|
+
* the platform's streaming zlib, and a validator that could not decode a deflate page would pass
|
|
6
|
+
* every file it could not read.
|
|
7
|
+
*
|
|
4
8
|
* @param {BinaryBuffer} buffer the whole file, with `capacity` equal to its length
|
|
5
|
-
* @returns {VGeoDefect[]} in discovery order; empty when the file satisfies every invariant
|
|
9
|
+
* @returns {Promise<VGeoDefect[]>} in discovery order; empty when the file satisfies every invariant
|
|
6
10
|
*/
|
|
7
|
-
export function vgeo_validate_container(buffer: BinaryBuffer): VGeoDefect[]
|
|
11
|
+
export function vgeo_validate_container(buffer: BinaryBuffer): Promise<VGeoDefect[]>;
|
|
8
12
|
import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
|
|
9
13
|
import { VGeoDefect } from "./VGeoDefect.js";
|
|
10
14
|
//# sourceMappingURL=vgeo_validate_container.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_validate_container.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vgeo_validate_container.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js"],"names":[],"mappings":"AA+xDA;;;;;;;;;GASG;AACH,gDAHW,YAAY,GACV,QAAQ,UAAU,EAAE,CAAC,CAqFjC;6BA53D4B,4CAA4C;2BAoD9C,iBAAiB"}
|
|
@@ -2,6 +2,7 @@ import { BinaryBuffer } from "../../../../../core/binary/BinaryBuffer.js";
|
|
|
2
2
|
import { round_up } from "../../../../../core/math/round_up.js";
|
|
3
3
|
import { VGEO_CHILD_TABLE_ENTRY_SIZE } from "./frame/VGEO_CHILD_TABLE_ENTRY_SIZE.js";
|
|
4
4
|
import { VGEO_CLUSTER_RECORD_SIZE } from "./cluster/VGEO_CLUSTER_RECORD_SIZE.js";
|
|
5
|
+
import { VGEO_CODEC_DEFLATE } from "./frame/VGEO_CODEC_DEFLATE.js";
|
|
5
6
|
import { VGEO_CODEC_LZ4 } from "./frame/VGEO_CODEC_LZ4.js";
|
|
6
7
|
import { VGEO_CODEC_RAW } from "./frame/VGEO_CODEC_RAW.js";
|
|
7
8
|
import { vgeo_compute_asset_id } from "./checksum/vgeo_compute_asset_id.js";
|
|
@@ -20,6 +21,7 @@ import { VGEO_FRAME_ALIGNMENT } from "./frame/VGEO_FRAME_ALIGNMENT.js";
|
|
|
20
21
|
import { vgeo_frame_decode_bound } from "./frame/vgeo_frame_decode_bound.js";
|
|
21
22
|
import { VGEO_FRAME_HEADER_SIZE } from "./frame/VGEO_FRAME_HEADER_SIZE.js";
|
|
22
23
|
import { VGEO_FRAME_OFFSET } from "./frame/VGEO_FRAME_OFFSET.js";
|
|
24
|
+
import { VGEO_GROUP_OFFSET } from "./page/VGEO_GROUP_OFFSET.js";
|
|
23
25
|
import { VGEO_GROUP_RECORD_SIZE } from "./page/VGEO_GROUP_RECORD_SIZE.js";
|
|
24
26
|
import { VGEO_HASH_ALGO_XXH3 } from "./header/VGEO_HASH_ALGO_XXH3.js";
|
|
25
27
|
import { VGEO_HEADER_OFFSET } from "./header/VGEO_HEADER_OFFSET.js";
|
|
@@ -241,9 +243,16 @@ function check_header(buffer, out) {
|
|
|
241
243
|
const format_version = buffer.readUint16();
|
|
242
244
|
|
|
243
245
|
if (format_version !== VGEO_FORMAT_VERSION) {
|
|
246
|
+
/*
|
|
247
|
+
Fatal rather than one defect among many. Record layouts move between versions — 5 put
|
|
248
|
+
`subtree_aabb` where `bounds_sphere` was and shifted everything after it — so reading on
|
|
249
|
+
would decode every cluster of another version's file by this version's sequence and report
|
|
250
|
+
a page's worth of invented defects about fields that are not there. The reader keeps the
|
|
251
|
+
older layouts; this does not.
|
|
252
|
+
*/
|
|
244
253
|
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, `format_version is ${format_version}, this validator knows ${VGEO_FORMAT_VERSION}`));
|
|
245
254
|
|
|
246
|
-
|
|
255
|
+
return false;
|
|
247
256
|
}
|
|
248
257
|
|
|
249
258
|
const min_reader_version = buffer.readUint16();
|
|
@@ -352,7 +361,7 @@ function check_header(buffer, out) {
|
|
|
352
361
|
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, 'reserved u16 at 100 is not zero'));
|
|
353
362
|
}
|
|
354
363
|
|
|
355
|
-
const level_count = buffer.
|
|
364
|
+
const level_count = buffer.readUint16();
|
|
356
365
|
|
|
357
366
|
if (level_count < 1) {
|
|
358
367
|
out.push(new VGeoDefect(VGEO_DEFECT.HEADER, 'level_count is 0'));
|
|
@@ -372,10 +381,9 @@ function check_header(buffer, out) {
|
|
|
372
381
|
usable = false;
|
|
373
382
|
}
|
|
374
383
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
384
|
+
// Byte 103 was reserved through `format_version` 5 and is `level_count`'s high byte from 6 on,
|
|
385
|
+
// so there is nothing left to check between it and `source_vertex_count`; the read above landed
|
|
386
|
+
// at 104 and the one below expects to start there.
|
|
379
387
|
const source_vertex_count = Number(buffer.readUint64());
|
|
380
388
|
|
|
381
389
|
if (source_vertex_count < 3) {
|
|
@@ -502,10 +510,12 @@ function check_frames(buffer, frames, out) {
|
|
|
502
510
|
out.push(new VGeoDefect(VGEO_DEFECT.FRAME, `page ${frame.page_index}: magic is 0x${magic.toString(16)}, expected 0x${VGEO_PAGE_MAGIC.toString(16)}`));
|
|
503
511
|
}
|
|
504
512
|
|
|
505
|
-
const decodable = frame.codec === VGEO_CODEC_RAW
|
|
513
|
+
const decodable = frame.codec === VGEO_CODEC_RAW
|
|
514
|
+
|| frame.codec === VGEO_CODEC_LZ4
|
|
515
|
+
|| frame.codec === VGEO_CODEC_DEFLATE;
|
|
506
516
|
|
|
507
517
|
if (!decodable) {
|
|
508
|
-
out.push(new VGeoDefect(VGEO_DEFECT.FRAME, `page ${frame.page_index}: codec is ${frame.codec}, this validator knows ${VGEO_CODEC_RAW} (raw)
|
|
518
|
+
out.push(new VGeoDefect(VGEO_DEFECT.FRAME, `page ${frame.page_index}: codec is ${frame.codec}, this validator knows ${VGEO_CODEC_RAW} (raw), ${VGEO_CODEC_LZ4} (lz4) and ${VGEO_CODEC_DEFLATE} (deflate)`));
|
|
509
519
|
}
|
|
510
520
|
|
|
511
521
|
if (frame.flags !== 0) {
|
|
@@ -570,9 +580,9 @@ function check_frames(buffer, frames, out) {
|
|
|
570
580
|
* @param {VGeoFrameExtent} frame
|
|
571
581
|
* @param {number} level_count
|
|
572
582
|
* @param {VGeoDefect[]} out
|
|
573
|
-
* @returns {DecodedPage|undefined} `undefined` when the page is too malformed to read further
|
|
583
|
+
* @returns {Promise<DecodedPage|undefined>} `undefined` when the page is too malformed to read further
|
|
574
584
|
*/
|
|
575
|
-
function decode_page(buffer, frame, level_count, out) {
|
|
585
|
+
async function decode_page(buffer, frame, level_count, out) {
|
|
576
586
|
const page = new DecodedPage();
|
|
577
587
|
|
|
578
588
|
page.page_index = frame.page_index;
|
|
@@ -599,7 +609,7 @@ function decode_page(buffer, frame, level_count, out) {
|
|
|
599
609
|
|
|
600
610
|
page.buffer = buffer;
|
|
601
611
|
page.base = blob;
|
|
602
|
-
} else if (frame.codec === VGEO_CODEC_LZ4) {
|
|
612
|
+
} else if (frame.codec === VGEO_CODEC_LZ4 || frame.codec === VGEO_CODEC_DEFLATE) {
|
|
603
613
|
// Bounded by `check_frames`, which has reported it, before it is believed — so a corrupt
|
|
604
614
|
// length field is a defect rather than an allocation.
|
|
605
615
|
if (frame.decoded_size > vgeo_frame_decode_bound(frame.codec, frame.stored_size)) {
|
|
@@ -612,7 +622,7 @@ function decode_page(buffer, frame, level_count, out) {
|
|
|
612
622
|
page.buffer.setCapacity(frame.decoded_size);
|
|
613
623
|
|
|
614
624
|
try {
|
|
615
|
-
vgeo_decode_frame_blob(page.buffer.raw_bytes, 0, buffer.raw_bytes, frame);
|
|
625
|
+
await vgeo_decode_frame_blob(page.buffer.raw_bytes, 0, buffer.raw_bytes, frame);
|
|
616
626
|
} catch (error) {
|
|
617
627
|
// Not suppression — the decoder's own message is what says *how* the blob is malformed,
|
|
618
628
|
// and a validator that threw here would be unable to report the one thing it exists to
|
|
@@ -640,15 +650,17 @@ function decode_page(buffer, frame, level_count, out) {
|
|
|
640
650
|
|
|
641
651
|
page.group_count = decoded.readUint16();
|
|
642
652
|
page.cluster_count = decoded.readUint16();
|
|
643
|
-
page.min_level = decoded.
|
|
644
|
-
page.max_level = decoded.
|
|
645
|
-
|
|
646
|
-
page.node_count = decoded.readUint16();
|
|
653
|
+
page.min_level = decoded.readUint16();
|
|
654
|
+
page.max_level = decoded.readUint16();
|
|
647
655
|
|
|
648
656
|
page.cluster_table_offset = decoded.readUint32();
|
|
649
657
|
page.payload_offset = decoded.readUint32();
|
|
650
658
|
page.payload_size = decoded.readUint32();
|
|
651
|
-
|
|
659
|
+
|
|
660
|
+
page.node_count = decoded.readUint16();
|
|
661
|
+
|
|
662
|
+
// What `node_table_offset` occupied through version 5, kept zero rather than reused (§11.10).
|
|
663
|
+
const node_reserved = decoded.readUint16();
|
|
652
664
|
|
|
653
665
|
page.parent_table_offset = decoded.readUint32();
|
|
654
666
|
page.parent_entry_count = decoded.readUint16();
|
|
@@ -670,6 +682,10 @@ function decode_page(buffer, frame, level_count, out) {
|
|
|
670
682
|
return undefined;
|
|
671
683
|
}
|
|
672
684
|
|
|
685
|
+
if (node_reserved !== 0) {
|
|
686
|
+
out.push(new VGeoDefect(VGEO_DEFECT.PAGE_LAYOUT, `page ${frame.page_index}: the reserved u16 at ${VGEO_PAGE_OFFSET.NODE_COUNT + 2} of the page header is ${node_reserved}, not zero`));
|
|
687
|
+
}
|
|
688
|
+
|
|
673
689
|
if (page.min_level > page.max_level) {
|
|
674
690
|
out.push(new VGeoDefect(VGEO_DEFECT.PAGE_LAYOUT, `page ${frame.page_index}: min_level ${page.min_level} exceeds max_level ${page.max_level}`));
|
|
675
691
|
}
|
|
@@ -686,13 +702,14 @@ function decode_page(buffer, frame, level_count, out) {
|
|
|
686
702
|
return undefined;
|
|
687
703
|
}
|
|
688
704
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
705
|
+
/*
|
|
706
|
+
Derived rather than read: the page header has carried no such field since `format_version` 6,
|
|
707
|
+
and it never carried anything else — the group table follows the header and the node table
|
|
708
|
+
follows the group table. The cross-check the stored copy used to provide has not been lost with
|
|
709
|
+
it, because `cluster_table_offset` *is* stored and can only agree one line down if
|
|
710
|
+
`group_count` and `node_count` both do.
|
|
711
|
+
*/
|
|
712
|
+
page.node_table_offset = VGEO_PAGE_HEADER_SIZE + page.group_count * VGEO_GROUP_RECORD_SIZE;
|
|
696
713
|
|
|
697
714
|
const expected_cluster_table_offset = page.node_table_offset
|
|
698
715
|
+ page.node_count * VGEO_NODE_RECORD_SIZE;
|
|
@@ -1071,13 +1088,25 @@ function read_groups(page, out) {
|
|
|
1071
1088
|
let expected_parent_first = 0;
|
|
1072
1089
|
|
|
1073
1090
|
for (let g = 0; g < page.group_count; g++) {
|
|
1074
|
-
|
|
1091
|
+
const record = VGEO_PAGE_HEADER_SIZE + g * VGEO_GROUP_RECORD_SIZE;
|
|
1092
|
+
|
|
1093
|
+
/**
|
|
1094
|
+
* Each field is sought to by name rather than read in a run, so that this audit and
|
|
1095
|
+
* `vgeo_read_page` address the record through the same table — a validator that agreed
|
|
1096
|
+
* with the reader only by having been written in the same order is a validator that stops
|
|
1097
|
+
* agreeing the first time a field moves.
|
|
1098
|
+
*/
|
|
1099
|
+
const read = (field) => {
|
|
1100
|
+
page.seek(record + field);
|
|
1101
|
+
|
|
1102
|
+
return buffer.readUint16();
|
|
1103
|
+
};
|
|
1075
1104
|
|
|
1076
1105
|
const group = {
|
|
1077
|
-
cluster_first:
|
|
1078
|
-
cluster_count:
|
|
1079
|
-
parent_cluster_count:
|
|
1080
|
-
parent_first:
|
|
1106
|
+
cluster_first: read(VGEO_GROUP_OFFSET.CLUSTER_FIRST),
|
|
1107
|
+
cluster_count: read(VGEO_GROUP_OFFSET.CLUSTER_COUNT),
|
|
1108
|
+
parent_cluster_count: read(VGEO_GROUP_OFFSET.PARENT_CLUSTER_COUNT),
|
|
1109
|
+
parent_first: read(VGEO_GROUP_OFFSET.PARENT_FIRST),
|
|
1081
1110
|
};
|
|
1082
1111
|
|
|
1083
1112
|
if (group.cluster_count < 1 || group.cluster_count > VGEO_MAX_GROUP_CLUSTER_COUNT) {
|
|
@@ -1285,11 +1314,10 @@ function read_clusters(page, out) {
|
|
|
1285
1314
|
self_error: buffer.readFloat32(),
|
|
1286
1315
|
parent_error: buffer.readFloat32(),
|
|
1287
1316
|
parent_sphere: read_sphere(buffer),
|
|
1288
|
-
|
|
1317
|
+
subtree_aabb: read_aabb(buffer),
|
|
1289
1318
|
aabb: read_aabb(buffer),
|
|
1290
1319
|
child_ref: buffer.readUint16(),
|
|
1291
1320
|
child_group: buffer.readUint16(),
|
|
1292
|
-
cone_reserved: buffer.readUint32(),
|
|
1293
1321
|
encoding_flags: buffer.readUint32(),
|
|
1294
1322
|
payload_offset: buffer.readUint32(),
|
|
1295
1323
|
payload_size: buffer.readUint32(),
|
|
@@ -1297,14 +1325,12 @@ function read_clusters(page, out) {
|
|
|
1297
1325
|
triangle_count: buffer.readUint8(),
|
|
1298
1326
|
};
|
|
1299
1327
|
|
|
1300
|
-
|
|
1328
|
+
// six bytes at 106; `cone_reserved` and the four bytes that followed the record's counts
|
|
1329
|
+
// went into `subtree_aabb` when format_version moved to 5
|
|
1330
|
+
if (buffer.readUint16() !== 0 || buffer.readUint32() !== 0) {
|
|
1301
1331
|
out.push(new VGeoDefect(VGEO_DEFECT.CLUSTER, `page ${page.page_index} cluster ${c}: reserved tail is not zero`));
|
|
1302
1332
|
}
|
|
1303
1333
|
|
|
1304
|
-
if (cluster.cone_reserved !== 0) {
|
|
1305
|
-
out.push(new VGeoDefect(VGEO_DEFECT.CLUSTER, `page ${page.page_index} cluster ${c}: cone_reserved is not zero`));
|
|
1306
|
-
}
|
|
1307
|
-
|
|
1308
1334
|
result.push(cluster);
|
|
1309
1335
|
}
|
|
1310
1336
|
|
|
@@ -1375,7 +1401,6 @@ function check_cluster_record(page, cluster, object_sphere, object_bounds, out)
|
|
|
1375
1401
|
const named_spheres = [
|
|
1376
1402
|
['self_sphere', cluster.self_sphere],
|
|
1377
1403
|
['parent_sphere', cluster.parent_sphere],
|
|
1378
|
-
['bounds_sphere', cluster.bounds_sphere],
|
|
1379
1404
|
];
|
|
1380
1405
|
|
|
1381
1406
|
for (const [name, sphere] of named_spheres) {
|
|
@@ -1384,8 +1409,26 @@ function check_cluster_record(page, cluster, object_sphere, object_bounds, out)
|
|
|
1384
1409
|
}
|
|
1385
1410
|
}
|
|
1386
1411
|
|
|
1387
|
-
|
|
1388
|
-
|
|
1412
|
+
for (const [name, box] of [['aabb', cluster.aabb], ['subtree_aabb', cluster.subtree_aabb]]) {
|
|
1413
|
+
if (!box.every(Number.isFinite)) {
|
|
1414
|
+
out.push(new VGeoDefect(VGEO_DEFECT.METRIC, `${where}: ${name} is not finite`));
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
/*
|
|
1419
|
+
The cut culls a cluster — and with it every cluster reachable below it, because the child group
|
|
1420
|
+
is only ever entered through this one — on `subtree_aabb`, so it must contain this cluster's own
|
|
1421
|
+
box before §11.17's cross-page half checks it contains the child group's boxes. Exact, on the
|
|
1422
|
+
stored values: the builder unions float32 extremes and a union of representable numbers is
|
|
1423
|
+
representable, so there is nothing here for a tolerance to absorb.
|
|
1424
|
+
*/
|
|
1425
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
1426
|
+
if (cluster.subtree_aabb[axis] > cluster.aabb[axis]
|
|
1427
|
+
|| cluster.subtree_aabb[axis + 3] < cluster.aabb[axis + 3]) {
|
|
1428
|
+
out.push(new VGeoDefect(VGEO_DEFECT.METRIC, `${where}: subtree_aabb does not contain the cluster's own aabb on axis ${axis}`));
|
|
1429
|
+
|
|
1430
|
+
break;
|
|
1431
|
+
}
|
|
1389
1432
|
}
|
|
1390
1433
|
|
|
1391
1434
|
if (!Number.isFinite(cluster.self_error) || cluster.self_error < 0) {
|
|
@@ -1417,8 +1460,22 @@ function check_cluster_record(page, cluster, object_sphere, object_bounds, out)
|
|
|
1417
1460
|
break;
|
|
1418
1461
|
}
|
|
1419
1462
|
|
|
1420
|
-
|
|
1421
|
-
|
|
1463
|
+
/*
|
|
1464
|
+
§11.7. The cut's first per-cluster frustum test is on `self_sphere`, and a reader meeting a
|
|
1465
|
+
container written before `subtree_aabb` existed stands this sphere's cube in for that box —
|
|
1466
|
+
both are conservative only because the sphere holds the cluster's own vertices, and by
|
|
1467
|
+
monotonicity every vertex below it. The builder has always made it so and nothing checked
|
|
1468
|
+
it; what used to be checked here was `bounds_sphere`, which the record no longer carries.
|
|
1469
|
+
*/
|
|
1470
|
+
if (!sphere_contains_point(cluster.self_sphere, x, y, z)) {
|
|
1471
|
+
out.push(new VGeoDefect(VGEO_DEFECT.METRIC, `${where}: self_sphere does not contain vertex ${v}`));
|
|
1472
|
+
|
|
1473
|
+
break;
|
|
1474
|
+
}
|
|
1475
|
+
|
|
1476
|
+
if (x < cluster.subtree_aabb[0] || y < cluster.subtree_aabb[1] || z < cluster.subtree_aabb[2]
|
|
1477
|
+
|| x > cluster.subtree_aabb[3] || y > cluster.subtree_aabb[4] || z > cluster.subtree_aabb[5]) {
|
|
1478
|
+
out.push(new VGeoDefect(VGEO_DEFECT.METRIC, `${where}: subtree_aabb does not contain vertex ${v}`));
|
|
1422
1479
|
|
|
1423
1480
|
break;
|
|
1424
1481
|
}
|
|
@@ -1553,6 +1610,28 @@ function check_dag(pages, page_groups, page_clusters, level_count, out) {
|
|
|
1553
1610
|
|
|
1554
1611
|
break;
|
|
1555
1612
|
}
|
|
1613
|
+
|
|
1614
|
+
/*
|
|
1615
|
+
§11.17, the half no single record can settle. The runtime culls this cluster and
|
|
1616
|
+
everything under it on its `subtree_aabb`, and what is under it is exactly this
|
|
1617
|
+
child group — so a box that does not contain a child's box is a hole the size of
|
|
1618
|
+
that child's whole subtree, inside the frustum, with nothing left standing in over
|
|
1619
|
+
it. Exact, like the containment above it.
|
|
1620
|
+
*/
|
|
1621
|
+
let escapes = -1;
|
|
1622
|
+
|
|
1623
|
+
for (let axis = 0; axis < 3 && escapes < 0; axis++) {
|
|
1624
|
+
if (child.subtree_aabb[axis] < cluster.subtree_aabb[axis]
|
|
1625
|
+
|| child.subtree_aabb[axis + 3] > cluster.subtree_aabb[axis + 3]) {
|
|
1626
|
+
escapes = axis;
|
|
1627
|
+
}
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
if (escapes >= 0) {
|
|
1631
|
+
out.push(new VGeoDefect(VGEO_DEFECT.METRIC, `${where}: subtree_aabb does not contain the subtree_aabb of cluster ${child.index} of the group it refines into, on axis ${escapes}`));
|
|
1632
|
+
|
|
1633
|
+
break;
|
|
1634
|
+
}
|
|
1556
1635
|
}
|
|
1557
1636
|
}
|
|
1558
1637
|
}
|
|
@@ -1701,8 +1780,8 @@ function check_directory(buffer, frames, pages, out) {
|
|
|
1701
1780
|
continue;
|
|
1702
1781
|
}
|
|
1703
1782
|
|
|
1704
|
-
reconstructed.
|
|
1705
|
-
reconstructed.
|
|
1783
|
+
reconstructed.writeUint16(page.min_level);
|
|
1784
|
+
reconstructed.writeUint16(page.max_level);
|
|
1706
1785
|
reconstructed.writeUint16(i === 0 ? VGEO_DIRECTORY_FLAG_ROOT_PAGE : 0);
|
|
1707
1786
|
reconstructed.writeUint16(page.group_count);
|
|
1708
1787
|
reconstructed.writeUint16(page.cluster_count);
|
|
@@ -1745,10 +1824,14 @@ function check_directory(buffer, frames, pages, out) {
|
|
|
1745
1824
|
/**
|
|
1746
1825
|
* Audit a `.vgeo` file.
|
|
1747
1826
|
*
|
|
1827
|
+
* It is asynchronous for the one reason the reader is: {@link VGEO_CODEC_DEFLATE} decodes through
|
|
1828
|
+
* the platform's streaming zlib, and a validator that could not decode a deflate page would pass
|
|
1829
|
+
* every file it could not read.
|
|
1830
|
+
*
|
|
1748
1831
|
* @param {BinaryBuffer} buffer the whole file, with `capacity` equal to its length
|
|
1749
|
-
* @returns {VGeoDefect[]} in discovery order; empty when the file satisfies every invariant
|
|
1832
|
+
* @returns {Promise<VGeoDefect[]>} in discovery order; empty when the file satisfies every invariant
|
|
1750
1833
|
*/
|
|
1751
|
-
export function vgeo_validate_container(buffer) {
|
|
1834
|
+
export async function vgeo_validate_container(buffer) {
|
|
1752
1835
|
const out = [];
|
|
1753
1836
|
|
|
1754
1837
|
if (!check_header(buffer, out)) {
|
|
@@ -1757,7 +1840,7 @@ export function vgeo_validate_container(buffer) {
|
|
|
1757
1840
|
|
|
1758
1841
|
buffer.position = VGEO_HEADER_OFFSET.LEVEL_COUNT;
|
|
1759
1842
|
|
|
1760
|
-
const level_count = buffer.
|
|
1843
|
+
const level_count = buffer.readUint16();
|
|
1761
1844
|
|
|
1762
1845
|
buffer.position = VGEO_HEADER_OFFSET.TOTAL_CLUSTERS;
|
|
1763
1846
|
|
|
@@ -1781,7 +1864,7 @@ export function vgeo_validate_container(buffer) {
|
|
|
1781
1864
|
const pages = [];
|
|
1782
1865
|
|
|
1783
1866
|
for (const frame of frames) {
|
|
1784
|
-
const page = decode_page(buffer, frame, level_count, out);
|
|
1867
|
+
const page = await decode_page(buffer, frame, level_count, out);
|
|
1785
1868
|
|
|
1786
1869
|
if (page === undefined) {
|
|
1787
1870
|
return out;
|