@woosh/meep-engine 3.27.0 → 3.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/binary/BitSet.d.ts +16 -0
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +159 -49
- package/src/core/binary/allocator/OffsetAllocator.d.ts +48 -0
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +208 -9
- package/src/core/binary/compression/compress_bytes.d.ts +20 -0
- package/src/core/binary/compression/compress_bytes.d.ts.map +1 -0
- package/src/core/binary/compression/compress_bytes.js +35 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts +30 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -0
- package/src/core/binary/compression/decompress_bytes_into.js +87 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts +27 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts.map +1 -0
- package/src/core/binary/compression/deflate_decompress_bound.js +32 -0
- package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts +15 -0
- package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts.map +1 -0
- package/src/core/geom/3d/mat4/m4_linear_determinant.js +24 -0
- package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts +4 -2
- package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_normal_matrix3.js +21 -11
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.js +31 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts +46 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.js +104 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts +62 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js +158 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts +21 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.js +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts +34 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.js +55 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts +28 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts +15 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts +93 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.js +128 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts +38 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +113 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +47 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +677 -8
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts +22 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.js +46 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts +19 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.js +49 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts +63 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts.map +1 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.js +80 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.d.ts +35 -0
- package/src/core/graph/layout/layered/LayoutBoxGraph.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.js +53 -1
- package/src/core/graph/layout/layered/layout_assign_coordinates.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.js +72 -68
- package/src/core/graph/layout/layered/layout_assign_layers.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.js +4 -2
- package/src/core/graph/layout/layered/layout_break_cycles.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_insert_lanes.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_order_layers.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_orient_links.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +7 -51
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +8 -69
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +1 -1
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +6 -6
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +1 -1
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +38 -1
- package/src/engine/graphics3/DebugDrawSystem.d.ts +7 -5
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +206 -203
- package/src/engine/graphics3/DecalSystem.d.ts +4 -5
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +5 -5
- package/src/engine/graphics3/FogOfWarSystem.d.ts +7 -12
- package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -1
- package/src/engine/graphics3/FogOfWarSystem.js +8 -12
- package/src/engine/graphics3/GraphicsEngine.d.ts +5 -1
- package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
- package/src/engine/graphics3/GraphicsEngine.js +834 -830
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
- package/src/shade/RENDERER_CONTRACT.md +31 -17
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
- package/src/shade/playground/caldera/README.md +529 -0
- package/src/shade/playground/caldera/caldera_format.d.ts +151 -0
- package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -0
- package/src/shade/playground/caldera/caldera_format.js +241 -0
- package/src/shade/playground/caldera/index.html +126 -0
- package/src/shade/playground/caldera/main.d.ts.map +1 -0
- package/src/shade/playground/caldera/main.js +1565 -0
- package/src/shade/playground/mesh_row_ceiling/README.md +85 -0
- package/src/shade/playground/mesh_row_ceiling/index.html +31 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts +2 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts.map +1 -0
- package/src/shade/playground/mesh_row_ceiling/main.js +389 -0
- package/src/shade/playground/vgeo_runtime/README.md +32 -16
- package/src/shade/playground/vgeo_runtime/main.js +21 -7
- package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.d.ts +3 -3
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
- package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +12 -11
- package/src/shade/playground/vgeo_scene/README.md +487 -0
- package/src/shade/playground/vgeo_scene/index.html +144 -0
- package/src/shade/playground/vgeo_scene/main.d.ts +2 -0
- package/src/shade/playground/vgeo_scene/main.d.ts.map +1 -0
- package/src/shade/playground/vgeo_scene/main.js +2217 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +6 -0
- package/src/shade/renderer/Renderer.d.ts +6 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +28 -2
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +100 -8
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +70 -35
- package/src/shade/renderer/extension/RenderExtension.d.ts +15 -18
- package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtension.js +15 -19
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +5 -5
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +29 -166
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +73 -16
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -3
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +663 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +100 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +688 -81
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +3 -29
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts +22 -0
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.js +49 -0
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +159 -66
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +40 -21
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +15 -14
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +58 -8
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +64 -10
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +5 -9
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts +40 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.js +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.js +25 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +77 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +84 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.d.ts → level/VGeoLevelOptions.d.ts} +19 -6
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +20 -7
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.js +58 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.js +116 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +545 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +110 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +308 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.d.ts → level/vgeo_build_root_group.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.js → level/vgeo_build_root_group.js} +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.js +123 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.js +78 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +337 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +147 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts +37 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +117 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +46 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +45 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +64 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +68 -0
- package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.d.ts → mesh/VirtualGeometryMesh.d.ts} +13 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.js → mesh/VirtualGeometryMesh.js} +40 -18
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts +58 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.js +79 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.js +68 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts +53 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +45 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +300 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.d.ts → mesh/vgeo_compute_vertex_tangents.d.ts} +12 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +151 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.d.ts → mesh/vgeo_normalize_source.d.ts} +8 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.js → mesh/vgeo_normalize_source.js} +27 -12
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts +38 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js +81 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.d.ts → page/vgeo_assemble_pages.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.js → page/vgeo_assemble_pages.js} +9 -9
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.d.ts → page/vgeo_build_page_nodes.d.ts} +1 -1
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.js → page/vgeo_build_page_nodes.js} +4 -4
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.js → page/vgeo_page_node_count.js} +2 -2
- package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.d.ts → partition/VGeoFaceGraph.d.ts} +23 -5
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.js → partition/VGeoFaceGraph.js} +28 -21
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.js → partition/vgeo_partition_graph.js} +2 -2
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts +41 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.js +92 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.js → partition/vgeo_split_face_set.js} +13 -56
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +371 -0
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.js → sphere/vgeo_bounding_sphere.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.js → sphere/vgeo_containing_sphere.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.js → sphere/vgeo_sphere_inflate_to_contain.js} +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +42 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +37 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +39 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +23 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +135 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +95 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.js → submesh/vgeo_narrow_indices.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +37 -16
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts +32 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js +93 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +20 -6
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +22 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts +8 -2
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +8 -2
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/{vgeo_layers_copy_vertex.js → vgeo_layers_copy_corner.js} +8 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts +18 -7
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +19 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.d.ts +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts +27 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.js +97 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts +7 -3
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +21 -11
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.js +41 -0
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +19 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +20 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts +25 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.js +24 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts +10 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +37 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +21 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +37 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts +8 -2
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +14 -2
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +19 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +6 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.js +20 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +10 -1
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js +15 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +1 -2
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +10 -3
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.js +43 -0
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +32 -2
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +15 -7
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.js +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +5 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +14 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts +4 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js +53 -11
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +7 -3
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts +12 -2
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +120 -37
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +130 -47
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +60 -22
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +21 -2
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +52 -2
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +97 -1
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +4 -4
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +59 -34
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +8 -8
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +45 -88
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +116 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +99 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.js +39 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +7 -63
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +13 -30
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +53 -71
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +22 -4
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +7 -2
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +8 -3
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +4 -0
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -4
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +6 -2
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +90 -12
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +22 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +21 -0
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +0 -19
- package/src/shade/renderer/material/chunk_material_draw_side.d.ts +14 -0
- package/src/shade/renderer/material/chunk_material_draw_side.d.ts.map +1 -0
- package/src/shade/renderer/material/chunk_material_draw_side.js +34 -0
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +8 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +13 -8
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +13 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +19 -5
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +23 -5
- package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.js +12 -5
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +4 -12
- package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts +22 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.js +36 -0
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +4 -5
- package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +15 -0
- package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +35 -0
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +5 -3
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +11 -4
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -3
- package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts +10 -1
- package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +38 -29
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts +5 -0
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.js +63 -55
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +3 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +94 -90
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +13 -5
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +96 -89
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +3 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.js +4 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +1 -0
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +100 -89
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +31 -7
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +1 -7
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +161 -153
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +2 -7
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +44 -53
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -2
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -2
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +19 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +7 -4
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -2
- package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js +15 -4
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +16 -5
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +16 -5
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +2 -1
- package/src/shade/renderer/rasterize/native/rasterization_shader_resources.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/rasterization_shader_resources.js +4 -0
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +16 -7
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +81 -95
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +26 -39
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +2 -0
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +19 -0
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/scene/NODE3D_STRUCT.js +34 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.d.ts +9 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.d.ts.map +1 -0
- package/src/shade/renderer/scene/chunk_node3d_flags.js +23 -0
- package/src/shade/renderer/scene/chunk_scene_database_access.d.ts.map +1 -1
- package/src/shade/renderer/scene/chunk_scene_database_access.js +15 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +9 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.js +16 -4
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts +12 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +18 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js +33 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +25 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +24 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +10 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +30 -21
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/README.md +0 -150
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts +0 -61
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/cut_geometry.js +0 -460
- package/src/shade/playground/vgeo_viewer/index.html +0 -77
- package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/main.js +0 -1343
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts +0 -173
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/select_cut.js +0 -481
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts +0 -24
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.js +0 -25
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts +0 -20
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.js +0 -20
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts +0 -36
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.js +0 -1786
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts +0 -29
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.js +0 -75
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.js +0 -143
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts +0 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.js +0 -41
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.js +0 -71
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.js +0 -207
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts +0 -16
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +0 -258
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +0 -49
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +0 -1
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts +0 -10
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts.map +0 -1
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.js +0 -109
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts +0 -17
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.js +0 -78
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts +0 -3
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +0 -100
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts +0 -8
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.js +0 -26
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts +0 -3
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts.map +0 -1
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.js +0 -0
- /package/src/shade/playground/{vgeo_viewer → caldera}/main.d.ts +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.d.ts → level/VGeoLevel.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.d.ts → level/VGeoLevelSummary.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.d.ts → page/vgeo_page_node_count.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.d.ts → partition/vgeo_graph_components.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.js → partition/vgeo_graph_components.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.d.ts → partition/vgeo_partition_graph.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.d.ts → partition/vgeo_split_face_set.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set_packed.d.ts → partition/vgeo_split_face_set_packed.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.d.ts → sphere/vgeo_bounding_sphere.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.d.ts → sphere/vgeo_containing_sphere.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.d.ts → sphere/vgeo_sphere_inflate_to_contain.d.ts} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.d.ts → submesh/vgeo_narrow_indices.d.ts} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# `mesh_row_ceiling` — where the rasterizer stops covering the scene
|
|
2
|
+
|
|
3
|
+
A grid of identical instances, with two knobs that move **one quantity each**, and a number for
|
|
4
|
+
whether the frame actually drew anything.
|
|
5
|
+
|
|
6
|
+
It exists because [`../caldera/`](../caldera/README.md) found a wall it could not name. That page
|
|
7
|
+
loads a real production map, and its one knob — `?placements=` — moves rows, distinct geometries and
|
|
8
|
+
meshlets together, so all it could say was "the picture stops being correct at 2²⁰ rows". Its repro
|
|
9
|
+
is a 14 GiB asset and about a minute a run.
|
|
10
|
+
|
|
11
|
+
This one opens in a couple of seconds on nothing but `vite`:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
node node_modules/vite/bin/vite.js --port 5181 --strictPort # from packages/meep-engine
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`/src/shade/playground/mesh_row_ceiling/index.html`
|
|
18
|
+
|
|
19
|
+
| parameter | what it moves |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `?rows=N` | how many instances. One geometry, one material, a regular grid — nothing else changes. |
|
|
22
|
+
| `?segments=N` | the geometry: an `N x N` plane instead of the unit box, which is `(N/8)²` meshlets. Same instances, same pixels, more meshlets. |
|
|
23
|
+
|
|
24
|
+
Sweeping `?segments=` with `?rows=` held still is the controlled experiment the other page could not
|
|
25
|
+
run: every setting draws the same picture from the same camera, so anything that moves in `coverage`
|
|
26
|
+
is the pipeline and not the scene.
|
|
27
|
+
|
|
28
|
+
## What it found
|
|
29
|
+
|
|
30
|
+
| scene | meshlets | coverage |
|
|
31
|
+
|---|---:|---:|
|
|
32
|
+
| `?rows=1100000` | 1,100,000 | 20.3 % |
|
|
33
|
+
| `?rows=150000&segments=32` | 2,400,000 | 9.7 % |
|
|
34
|
+
| `?rows=150000&segments=64` | 9,600,000 | **0 %** |
|
|
35
|
+
| `?rows=200000&segments=64` | 12,800,000 | **0 %** |
|
|
36
|
+
|
|
37
|
+
**1,100,000 rows draw**, so the ceiling was never on rows — 2²⁰ was where Caldera's own scene
|
|
38
|
+
happened to cross it. The three 150,000-row scenes are the *same* scene at three meshlet densities,
|
|
39
|
+
and the middle one is where it stops.
|
|
40
|
+
|
|
41
|
+
The number is `maxComputeWorkgroupsPerDimension` (65,535, and `Renderer.initialize` does not raise
|
|
42
|
+
it — an adapter will not hand up more) times the engine's group size of 128: **8,388,480 meshlets in
|
|
43
|
+
one dispatch dimension**. Past it, `shader_prefix_sum_to_command` wrote an indirect command asking
|
|
44
|
+
for more workgroups than the device allows, and a `dispatchWorkgroupsIndirect` in that state **does
|
|
45
|
+
not run at all**. Measured directly against Dawn on nvidia/lovelace from this page's own device:
|
|
46
|
+
|
|
47
|
+
| workgroups requested | elements written |
|
|
48
|
+
|---:|---:|
|
|
49
|
+
| 65,535 | 65,535 |
|
|
50
|
+
| 65,536 | **0** |
|
|
51
|
+
|
|
52
|
+
No validation error, nothing logged, `render` does not throw. And the meshlet collection's `count`
|
|
53
|
+
is written by a separate single-thread pass that runs either way, so every counter went on reporting
|
|
54
|
+
a complete frame over an element array the expansion had never filled in. What the rasterizer drew
|
|
55
|
+
was whatever the pooled frame-graph buffer last held — nothing here, and the "huge untextured
|
|
56
|
+
triangles fanning across the frame" `caldera` saw at 1.5 million rows.
|
|
57
|
+
|
|
58
|
+
The fix is in `IndirectComputeCommandBuildPass`: what will not fit in `x` is folded into `y` and
|
|
59
|
+
then `z`, and the passes these commands drive flatten the grid back with `chunk_grid3d_to_index` —
|
|
60
|
+
the same flattening the light and decal clusters use — instead of reading `global_invocation_id.x`,
|
|
61
|
+
which carries the x dimension alone. One thread per element still, nothing dropped, and while `y`
|
|
62
|
+
and `z` are 1 the index is `global_invocation_id.x` term for term, so a scene under the ceiling pays
|
|
63
|
+
nothing. `mesh_expand_dispatch_ceiling.spec.js` pins it — it runs the real WGSL under the emulator
|
|
64
|
+
over a grid that is deliberately more than one workgroup deep, which is the arithmetic a device
|
|
65
|
+
performs on a folded command.
|
|
66
|
+
|
|
67
|
+
After the fix the three 150,000-row scenes agree to within a rounding error — 9.74 %, 9.73 %,
|
|
68
|
+
9.74 % at 2.4M, 9.6M and 21.6M meshlets — which is what "the meshlet count no longer changes the
|
|
69
|
+
picture" looks like as a number.
|
|
70
|
+
|
|
71
|
+
## Driving it headless
|
|
72
|
+
|
|
73
|
+
`caldera`'s recipe, unchanged, and its first bullet is still the one that costs an hour:
|
|
74
|
+
**`--enable-unsafe-webgpu` and nothing else**. Open the page as Chrome's startup URL, pick the CDP
|
|
75
|
+
target by URL, and poll for `__ready` rather than trusting `load`.
|
|
76
|
+
|
|
77
|
+
`__state()` is the whole surface; `__page` reaches the renderer, its device and the scene context
|
|
78
|
+
for a session that wants to probe past it.
|
|
79
|
+
|
|
80
|
+
## What it is not
|
|
81
|
+
|
|
82
|
+
Not a benchmark. Every instance is the same shape at the same size on a regular grid with one
|
|
83
|
+
material and no textures, which is the wrong shape for a frame-time claim and the right one for
|
|
84
|
+
isolating a count. `caldera` and [`../vgeo_scene/`](../vgeo_scene/README.md) are where the numbers
|
|
85
|
+
about real content live.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<title>meep — mesh row ceiling</title>
|
|
6
|
+
<style>
|
|
7
|
+
:root { color-scheme: dark; }
|
|
8
|
+
|
|
9
|
+
* { box-sizing: border-box; }
|
|
10
|
+
|
|
11
|
+
html, body { margin: 0; height: 100%; background: #0b0d10; color: #d6dae0;
|
|
12
|
+
font: 13px/1.5 system-ui, -apple-system, Segoe UI, sans-serif; overflow: hidden; }
|
|
13
|
+
|
|
14
|
+
#view { display: block; width: 100vw; height: 100vh; }
|
|
15
|
+
|
|
16
|
+
#panel {
|
|
17
|
+
position: fixed; top: 12px; left: 12px; padding: 10px 12px;
|
|
18
|
+
background: rgba(20, 23, 28, 0.86); border: 1px solid #2b3038; border-radius: 8px;
|
|
19
|
+
font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 12px;
|
|
20
|
+
white-space: pre; pointer-events: none;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.bad { color: #ff6b6b; }
|
|
24
|
+
</style>
|
|
25
|
+
</head>
|
|
26
|
+
<body tabindex="0">
|
|
27
|
+
<canvas id="view"></canvas>
|
|
28
|
+
<div id="panel">booting…</div>
|
|
29
|
+
<script type="module" src="./main.js"></script>
|
|
30
|
+
</body>
|
|
31
|
+
</html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/mesh_row_ceiling/main.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import Vector3 from "../../../core/geom/Vector3.js";
|
|
2
|
+
import { EntityComponentDataset } from "../../../engine/ecs/EntityComponentDataset.js";
|
|
3
|
+
import { Transform64 } from "../../../engine/ecs/transform/Transform64.js";
|
|
4
|
+
import { OrbitalCameraController } from "../../renderer/camera/OrbitalCameraController.js";
|
|
5
|
+
import { PerspectiveCamera } from "../../renderer/camera/PerspectiveCamera.js";
|
|
6
|
+
import { BoxGeometry, PlaneGeometry } from "../../renderer/geometry/BoxGeometry.js";
|
|
7
|
+
import { make_sunlight } from "../../renderer/light/make_sunlight.js";
|
|
8
|
+
import { place_light } from "../../renderer/light/place_light.js";
|
|
9
|
+
import { StandardShadeMaterial } from "../../renderer/material/StandardShadeMaterial.js";
|
|
10
|
+
import { RasterizationCollectionType } from "../../renderer/rasterize/expand/RasterizationCollectionType.js";
|
|
11
|
+
import { Renderer } from "../../renderer/Renderer.js";
|
|
12
|
+
import { place_primitive } from "../../renderer/scene/rows/place_primitive.js";
|
|
13
|
+
import { Scene } from "../../renderer/scene/Scene.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The cheapest scene big enough to find a dispatch ceiling.
|
|
17
|
+
*
|
|
18
|
+
* `caldera` found that the picture stops being correct somewhere past a million mesh rows and says
|
|
19
|
+
* nothing about it — see that page's README. Its repro is a 14 GiB asset and a minute of loading a
|
|
20
|
+
* run, and `?placements=` moves three quantities at once: rows, distinct geometries and meshlets
|
|
21
|
+
* all grow together, so it cannot say which of the three the ceiling belongs to. It reported the
|
|
22
|
+
* ceiling as 2²⁰ **rows** because that is where its own scene crossed it.
|
|
23
|
+
*
|
|
24
|
+
* This page separates them, from nothing but `vite`:
|
|
25
|
+
*
|
|
26
|
+
* - **`?rows=N`** places N instances of one geometry on a grid. Every row is the same shape, so
|
|
27
|
+
* the row count is the only thing that moves.
|
|
28
|
+
* - **`?segments=N`** swaps the unit box for an N x N plane, which is `(N/8)²` meshlets. The
|
|
29
|
+
* instances stay where they were and cover the same pixels — only the meshlet count moves.
|
|
30
|
+
*
|
|
31
|
+
* Which answered the question in two runs: **1,100,000 rows of one meshlet each draw** and
|
|
32
|
+
* 150,000 rows of 64 draw nothing, so the ceiling was never on rows. It is
|
|
33
|
+
* `maxComputeWorkgroupsPerDimension` x {@link COMPUTE_SHADER_DEFAULT_GROUP_SIZE} = 8,388,480
|
|
34
|
+
* meshlets in *one dispatch dimension*, past which an indirect dispatch does not run at all — see
|
|
35
|
+
* {@link build_indirect_compute_dispatch_command}, whose fold is the fix, and
|
|
36
|
+
* `mesh_expand_dispatch_ceiling.spec.js`, which pins it.
|
|
37
|
+
*
|
|
38
|
+
* `__state()` is the driving surface, as on the other pages. `coverage` in it is the fraction of
|
|
39
|
+
* the canvas that is not the clear colour, sampled on a grid — which is the one thing every
|
|
40
|
+
* counter in the engine was reporting as healthy while the screen was empty. Holding `?rows=`
|
|
41
|
+
* still and sweeping `?segments=` is the controlled experiment: the picture is identical at every
|
|
42
|
+
* setting, so any change in `coverage` is the pipeline.
|
|
43
|
+
*
|
|
44
|
+
* @author Alex Goldring
|
|
45
|
+
* @copyright Company Named Limited (c) 2026
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
/** How many rows, when the URL does not say. */
|
|
49
|
+
const DEFAULT_ROWS = 1_100_000;
|
|
50
|
+
|
|
51
|
+
/** Side of one box, in world units. Spacing is twice this, so boxes never touch. */
|
|
52
|
+
const BOX_SIZE = 1;
|
|
53
|
+
|
|
54
|
+
const page = {
|
|
55
|
+
/** @type {Renderer} */
|
|
56
|
+
renderer: undefined,
|
|
57
|
+
/** @type {HTMLCanvasElement} */
|
|
58
|
+
canvas: undefined,
|
|
59
|
+
/** @type {PerspectiveCamera} */
|
|
60
|
+
camera: undefined,
|
|
61
|
+
/** @type {Scene} */
|
|
62
|
+
scene: undefined,
|
|
63
|
+
/** @type {GPUSceneContext} */
|
|
64
|
+
scene_context: undefined,
|
|
65
|
+
rows: 0,
|
|
66
|
+
frames: 0,
|
|
67
|
+
frame_ms: 0,
|
|
68
|
+
cpu_ms: 0,
|
|
69
|
+
place_ms: 0,
|
|
70
|
+
/** @type {Error|undefined} */
|
|
71
|
+
fatal: undefined,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Fraction of the canvas that is not the clear colour.
|
|
76
|
+
*
|
|
77
|
+
* Read through a 2D canvas rather than from the device: the question is what a viewer sees, and a
|
|
78
|
+
* `drawImage` of the presented surface is exactly that. Sampled on a stride rather than per pixel
|
|
79
|
+
* so it can run every frame without becoming the frame.
|
|
80
|
+
*
|
|
81
|
+
* @param {HTMLCanvasElement} canvas
|
|
82
|
+
* @param {number} [stride] sample every `stride`-th pixel along each axis
|
|
83
|
+
* @returns {number} 0 when nothing was drawn, 1 when every sample differs from the clear colour
|
|
84
|
+
*/
|
|
85
|
+
function measure_coverage(canvas, stride = 4) {
|
|
86
|
+
const w = canvas.width;
|
|
87
|
+
const h = canvas.height;
|
|
88
|
+
|
|
89
|
+
if (w === 0 || h === 0) {
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const scratch = measure_coverage.scratch ??= document.createElement('canvas');
|
|
94
|
+
|
|
95
|
+
if (scratch.width !== w || scratch.height !== h) {
|
|
96
|
+
scratch.width = w;
|
|
97
|
+
scratch.height = h;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const ctx = scratch.getContext('2d', { willReadFrequently: true });
|
|
101
|
+
|
|
102
|
+
ctx.clearRect(0, 0, w, h);
|
|
103
|
+
ctx.drawImage(canvas, 0, 0);
|
|
104
|
+
|
|
105
|
+
const pixels = ctx.getImageData(0, 0, w, h).data;
|
|
106
|
+
|
|
107
|
+
let sampled = 0;
|
|
108
|
+
let covered = 0;
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
The clear colour is whatever the top-left corner is: the camera looks down at a grid that does
|
|
112
|
+
not reach the corners, so that pixel is background in every scene this page draws. Taking it
|
|
113
|
+
from the frame rather than naming a constant keeps this honest if the clear colour changes.
|
|
114
|
+
*/
|
|
115
|
+
const bg_r = pixels[0];
|
|
116
|
+
const bg_g = pixels[1];
|
|
117
|
+
const bg_b = pixels[2];
|
|
118
|
+
|
|
119
|
+
for (let y = 0; y < h; y += stride) {
|
|
120
|
+
for (let x = 0; x < w; x += stride) {
|
|
121
|
+
const i = (y * w + x) * 4;
|
|
122
|
+
|
|
123
|
+
sampled++;
|
|
124
|
+
|
|
125
|
+
const dr = pixels[i] - bg_r;
|
|
126
|
+
const dg = pixels[i + 1] - bg_g;
|
|
127
|
+
const db = pixels[i + 2] - bg_b;
|
|
128
|
+
|
|
129
|
+
// 3/255 of slack, so film grain and dither do not read as geometry
|
|
130
|
+
if (dr * dr + dg * dg + db * db > 27) {
|
|
131
|
+
covered++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return sampled === 0 ? 0 : covered / sampled;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Lay `count` boxes out on a square grid in the XZ plane, centred on the origin.
|
|
141
|
+
*
|
|
142
|
+
* @param {number} count
|
|
143
|
+
* @returns {number} half the diagonal of the grid, for framing
|
|
144
|
+
*/
|
|
145
|
+
function place_grid(geometry, count, segments) {
|
|
146
|
+
const material = new StandardShadeMaterial();
|
|
147
|
+
|
|
148
|
+
const side = Math.ceil(Math.sqrt(count));
|
|
149
|
+
const spacing = BOX_SIZE * 2;
|
|
150
|
+
const origin = -0.5 * (side - 1) * spacing;
|
|
151
|
+
|
|
152
|
+
const transform = new Transform64();
|
|
153
|
+
|
|
154
|
+
/*
|
|
155
|
+
A plane is authored in XY facing +Z, and this camera looks down the Y axis — so laid out as
|
|
156
|
+
authored every one of them is edge-on and the frame is empty for a reason that has nothing to
|
|
157
|
+
do with the pipeline. A quarter turn about X puts them face up. A box needs no such thing.
|
|
158
|
+
*/
|
|
159
|
+
const quarter_turn = Math.SQRT1_2;
|
|
160
|
+
|
|
161
|
+
for (let i = 0; i < count; i++) {
|
|
162
|
+
const x = origin + (i % side) * spacing;
|
|
163
|
+
const z = origin + Math.floor(i / side) * spacing;
|
|
164
|
+
|
|
165
|
+
transform.setTranslation(x, 0, z);
|
|
166
|
+
|
|
167
|
+
if (segments !== 0) {
|
|
168
|
+
transform.setRotation(-quarter_turn, 0, 0, quarter_turn);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
transform.updateMatrix();
|
|
172
|
+
|
|
173
|
+
place_primitive(page.scene_context, geometry, material, transform);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return 0.5 * Math.hypot(side * spacing, BOX_SIZE, side * spacing);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* What every row draws.
|
|
181
|
+
*
|
|
182
|
+
* A box is one meshlet, so `?rows=` alone moves rows and meshlets together at 1:1 and cannot
|
|
183
|
+
* separate them. A segmented plane is the second axis: `?segments=N` is an N x N grid of quads,
|
|
184
|
+
* which comes out at a meshlet per 64-odd triangles, so a modest row count can be pushed to any
|
|
185
|
+
* meshlet count the pipeline might have a ceiling on.
|
|
186
|
+
*
|
|
187
|
+
* @param {number} segments
|
|
188
|
+
* @returns {MeshletGeometry}
|
|
189
|
+
*/
|
|
190
|
+
function make_geometry(segments) {
|
|
191
|
+
return segments === 0
|
|
192
|
+
? new BoxGeometry(BOX_SIZE, BOX_SIZE, BOX_SIZE)
|
|
193
|
+
: new PlaneGeometry(BOX_SIZE, BOX_SIZE, segments, segments);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function paint() {
|
|
197
|
+
const panel = document.getElementById('panel');
|
|
198
|
+
|
|
199
|
+
const limits = page.renderer.graphics.collection_limits;
|
|
200
|
+
|
|
201
|
+
const lines = [
|
|
202
|
+
`rows ${page.rows.toLocaleString()}`,
|
|
203
|
+
`meshlets / row ${page.meshlets_per_row}`,
|
|
204
|
+
`meshlets ${(page.rows * page.meshlets_per_row).toLocaleString()}`,
|
|
205
|
+
`placed in ${(page.place_ms / 1000).toFixed(1)} s`,
|
|
206
|
+
`frames ${page.frames}`,
|
|
207
|
+
`frame / cpu ${page.frame_ms.toFixed(1)} / ${page.cpu_ms.toFixed(1)} ms`,
|
|
208
|
+
`coverage ${(page.coverage * 100).toFixed(2)} %`,
|
|
209
|
+
`mesh limit ${limits.get_limit(RasterizationCollectionType.Meshes).toLocaleString()}`,
|
|
210
|
+
`meshlet limit ${limits.get_limit(RasterizationCollectionType.Meshlets).toLocaleString()}`,
|
|
211
|
+
];
|
|
212
|
+
|
|
213
|
+
if (page.fatal !== undefined) {
|
|
214
|
+
lines.push(`<span class="bad">${page.fatal.message ?? String(page.fatal)}</span>`);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
panel.innerHTML = lines.join('\n');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async function boot() {
|
|
221
|
+
const parameters = new URLSearchParams(globalThis.location.search);
|
|
222
|
+
|
|
223
|
+
const rows = Math.max(1, Math.floor(Number(parameters.get('rows') ?? DEFAULT_ROWS)));
|
|
224
|
+
const segments = Math.max(0, Math.floor(Number(parameters.get('segments') ?? 0)));
|
|
225
|
+
|
|
226
|
+
page.rows = rows;
|
|
227
|
+
page.segments = segments;
|
|
228
|
+
|
|
229
|
+
const canvas = document.getElementById('view');
|
|
230
|
+
|
|
231
|
+
page.canvas = canvas;
|
|
232
|
+
|
|
233
|
+
const renderer = new Renderer();
|
|
234
|
+
|
|
235
|
+
page.renderer = renderer;
|
|
236
|
+
|
|
237
|
+
await renderer.initialize({
|
|
238
|
+
context: canvas.getContext('webgpu'),
|
|
239
|
+
pixelRatio: 1,
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
// geometry, not picture — every one of these is frame time spent on a question this page is not asking
|
|
243
|
+
renderer.feature_taa_enabled = false;
|
|
244
|
+
renderer.feature_ssao_enabled = false;
|
|
245
|
+
renderer.feature_bloom_enabled = false;
|
|
246
|
+
|
|
247
|
+
const scene = new Scene();
|
|
248
|
+
|
|
249
|
+
scene.dataset = new EntityComponentDataset();
|
|
250
|
+
|
|
251
|
+
page.scene = scene;
|
|
252
|
+
|
|
253
|
+
place_light(scene, make_sunlight({ direction: new Vector3(0.4, -0.82, 0.41) }));
|
|
254
|
+
|
|
255
|
+
const camera = new PerspectiveCamera();
|
|
256
|
+
|
|
257
|
+
camera.fov_degrees = 60;
|
|
258
|
+
|
|
259
|
+
page.camera = camera;
|
|
260
|
+
page.controller = new OrbitalCameraController(camera, document.body);
|
|
261
|
+
|
|
262
|
+
fit();
|
|
263
|
+
|
|
264
|
+
globalThis.addEventListener('resize', fit);
|
|
265
|
+
|
|
266
|
+
// one frame, so the renderer builds the scene context the rows go into
|
|
267
|
+
renderer.render(camera, scene, 1 / 60);
|
|
268
|
+
|
|
269
|
+
page.scene_context = renderer.scenes.obtain(scene);
|
|
270
|
+
|
|
271
|
+
/*
|
|
272
|
+
Primed rather than grown: the collections start at 1e4 meshes, and a scene that arrives all at
|
|
273
|
+
once would spend its first frames reporting the difference as dropped instances. This page is
|
|
274
|
+
about what the pipeline does with the rows, not about how fast the limits catch up.
|
|
275
|
+
*/
|
|
276
|
+
const limits = renderer.graphics.collection_limits;
|
|
277
|
+
|
|
278
|
+
const geometry = make_geometry(segments);
|
|
279
|
+
|
|
280
|
+
page.meshlets_per_row = geometry.meshlets.count;
|
|
281
|
+
|
|
282
|
+
limits.prime(RasterizationCollectionType.Meshes, rows);
|
|
283
|
+
limits.prime(RasterizationCollectionType.Meshlets, rows * page.meshlets_per_row);
|
|
284
|
+
|
|
285
|
+
const place_started = performance.now();
|
|
286
|
+
|
|
287
|
+
const radius = place_grid(geometry, rows, segments);
|
|
288
|
+
|
|
289
|
+
page.place_ms = performance.now() - place_started;
|
|
290
|
+
|
|
291
|
+
look_at_grid(radius);
|
|
292
|
+
|
|
293
|
+
let last_time;
|
|
294
|
+
|
|
295
|
+
const tick = time => {
|
|
296
|
+
const dt = last_time === undefined ? 1 / 60 : Math.min((time - last_time) / 1000, 0.05);
|
|
297
|
+
|
|
298
|
+
if (last_time !== undefined) {
|
|
299
|
+
page.frame_ms += ((time - last_time) - page.frame_ms) * 0.1;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
last_time = time;
|
|
303
|
+
|
|
304
|
+
const cpu_started = performance.now();
|
|
305
|
+
|
|
306
|
+
try {
|
|
307
|
+
page.controller.update(dt);
|
|
308
|
+
renderer.render(camera, scene, dt);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
page.fatal = error;
|
|
311
|
+
console.error(error);
|
|
312
|
+
paint();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
page.cpu_ms += ((performance.now() - cpu_started) - page.cpu_ms) * 0.1;
|
|
317
|
+
page.frames++;
|
|
318
|
+
|
|
319
|
+
page.coverage = measure_coverage(canvas);
|
|
320
|
+
|
|
321
|
+
paint();
|
|
322
|
+
|
|
323
|
+
requestAnimationFrame(tick);
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
requestAnimationFrame(tick);
|
|
327
|
+
|
|
328
|
+
globalThis.__ready = true;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Size the canvas to the document — see `caldera`'s `fit()` for why the document and not the canvas.
|
|
333
|
+
*/
|
|
334
|
+
function fit() {
|
|
335
|
+
const renderer = page.renderer;
|
|
336
|
+
const viewport = document.documentElement;
|
|
337
|
+
|
|
338
|
+
renderer.pixel_ratio = 1;
|
|
339
|
+
|
|
340
|
+
renderer.resize(
|
|
341
|
+
Math.max(1, Math.floor(viewport.clientWidth)),
|
|
342
|
+
Math.max(1, Math.floor(viewport.clientHeight))
|
|
343
|
+
);
|
|
344
|
+
|
|
345
|
+
page.camera.aspect = renderer.aspect_ratio;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* @param {number} radius half the grid's diagonal
|
|
350
|
+
*/
|
|
351
|
+
function look_at_grid(radius) {
|
|
352
|
+
const distance = radius * 1.6;
|
|
353
|
+
|
|
354
|
+
page.camera.near = Math.max(0.05, distance * 0.002);
|
|
355
|
+
page.camera.far = distance * 8;
|
|
356
|
+
|
|
357
|
+
page.controller.look(
|
|
358
|
+
new Vector3(distance * 0.6, distance * 0.7, distance * 0.6),
|
|
359
|
+
new Vector3(0, 0, 0)
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* The page's own objects, for a session that wants to look past `__state()` — the renderer, its
|
|
365
|
+
* device and the scene context are all reachable from here.
|
|
366
|
+
*/
|
|
367
|
+
globalThis.__page = page;
|
|
368
|
+
|
|
369
|
+
globalThis.__state = () => ({
|
|
370
|
+
rows: page.rows,
|
|
371
|
+
segments: page.segments,
|
|
372
|
+
meshlets_per_row: page.meshlets_per_row,
|
|
373
|
+
meshlets: page.rows * page.meshlets_per_row,
|
|
374
|
+
frames: page.frames,
|
|
375
|
+
coverage: page.coverage,
|
|
376
|
+
frame_ms: page.frame_ms,
|
|
377
|
+
cpu_ms: page.cpu_ms,
|
|
378
|
+
place_ms: page.place_ms,
|
|
379
|
+
mesh_limit: page.renderer?.graphics.collection_limits.get_limit(RasterizationCollectionType.Meshes),
|
|
380
|
+
meshlet_limit: page.renderer?.graphics.collection_limits.get_limit(RasterizationCollectionType.Meshlets),
|
|
381
|
+
fatal: page.fatal === undefined ? null : (page.fatal.message ?? String(page.fatal)),
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
boot().catch(error => {
|
|
385
|
+
page.fatal = error;
|
|
386
|
+
console.error(error);
|
|
387
|
+
paint();
|
|
388
|
+
globalThis.__ready = true;
|
|
389
|
+
});
|
|
@@ -6,19 +6,26 @@ This page draws nothing itself: every triangle on screen is there because the co
|
|
|
6
6
|
the HZB meshlet filter, the material bucket, the indirect draw and the G-buffer took it from there
|
|
7
7
|
without knowing that virtual geometry exists.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
9
|
+
This page proves the engine seam and nothing about the DAG, because the DAG has its own tests and
|
|
10
|
+
its own oracle: `renderer/geometry/virtual/runtime/cut/__fixtures__/vgeo_select_cut.js`, a **CPU**
|
|
11
|
+
traversal of the same rule that every cut spec is held to. A `vgeo_viewer` page used to draw that
|
|
12
|
+
traversal on screen through Shade's direct geometry path, carrying its own renderer, its own camera
|
|
13
|
+
and its own streaming loop; it was retired rather than kept as a second runtime, and everything it
|
|
14
|
+
showed is shown here or on the scene page below.
|
|
15
|
+
|
|
16
|
+
It is also not [`../vgeo_scene/`](../vgeo_scene/README.md), which opens a whole converted set —
|
|
17
|
+
thousands of containers, tens of thousands of instances, one cut — and is where the claim about a
|
|
18
|
+
*scene* is measured. This page is one container framed on its own bounding sphere, which is what
|
|
19
|
+
makes it a viewer and what makes its readings about the seam rather than about breadth.
|
|
20
|
+
|
|
21
|
+
And it proves one thing no spec can, which is what the surface **looks like**. The retired viewer
|
|
22
|
+
drew with `cullMode: 'none'` and coloured its cut per cluster; this page draws through a
|
|
23
|
+
`Front`-sided standard material with a light on it. That is the difference that caught the sample
|
|
24
|
+
torus being wound inside-out — the near surface culled away, the far inner wall showing through the
|
|
25
|
+
hole where it should have been, and normals pointing into the tube so what survived was lit from
|
|
26
|
+
inside. Eighteen thousand specs and a second playground had drawn that container without a single
|
|
27
|
+
one of them being able to notice, which is the argument for this page and part of the argument
|
|
28
|
+
against the other one.
|
|
22
29
|
|
|
23
30
|
## How it is lit, and why that is not decoration
|
|
24
31
|
|
|
@@ -138,6 +145,13 @@ The panel's `RAM evicted`, `fetching` and `worker fetches` rows are new with it,
|
|
|
138
145
|
the reading to keep watching: it climbs only while the tier is full of pages the cut still draws
|
|
139
146
|
from, which is a budget saying no and not a tier scanning.
|
|
140
147
|
|
|
148
|
+
**`quarantined`** came here from the retired viewer, and it is the row that tells two coarse
|
|
149
|
+
surfaces apart. A page that fails its retries is quarantined with its reason and is never asked for
|
|
150
|
+
again; the clamped cut then keeps that region correct with a coarser ancestor, indefinitely. On
|
|
151
|
+
screen that is indistinguishable from a container that is merely still arriving, and `clamped`
|
|
152
|
+
alone cannot separate them — a count that will not fall while this is non-zero is a page that is
|
|
153
|
+
never coming.
|
|
154
|
+
|
|
141
155
|
Two things the tour still shows. The four long tasks left are `GPUMeshletManager` compactions —
|
|
142
156
|
a refused allocation with free space behind it rebuilds every batch, which is the one O(resident)
|
|
143
157
|
event the rebuild deferred. And under a vite dev server the first seconds after a container opens
|
|
@@ -230,9 +244,11 @@ chrome --headless=new --enable-unsafe-webgpu --remote-debugging-port=9333 \
|
|
|
230
244
|
- **A drop is dispatchable.** `new DataTransfer()`, `items.add(new File([bytes], name))`, then
|
|
231
245
|
`window.dispatchEvent(new DragEvent('drop', { dataTransfer }))` goes through the page's own
|
|
232
246
|
handler — no pointer, and no separate code path to keep honest. `?file=` needs a server that
|
|
233
|
-
answers `Range` with a `206
|
|
234
|
-
|
|
235
|
-
|
|
247
|
+
answers `Range` with a `206`, and **the dev server is one**: `tools/dev/vite_test_assets.js`
|
|
248
|
+
serves `/test_assets/` by range out of an asset root outside the checkout as well as the one
|
|
249
|
+
inside it, so `?file=/test_assets/<whatever>.vgeo` is a container off the tree with nothing else
|
|
250
|
+
running. `tools/geometry/virtual/vgeo_serve.js` is still what a directory under neither root
|
|
251
|
+
wants, and the CORS headers are the whole difference.
|
|
236
252
|
|
|
237
253
|
Open the page as Chrome's startup URL rather than with `Page.navigate` — the `load` event is not a
|
|
238
254
|
reliable signal here, so poll for `__state` itself. Then set `__page.runtime.tau` and read
|
|
@@ -28,15 +28,15 @@ import { place_primitive } from "../../renderer/scene/rows/place_primitive.js";
|
|
|
28
28
|
import { Scene } from "../../renderer/scene/Scene.js";
|
|
29
29
|
import { load_default_environment } from "../load_default_environment.js";
|
|
30
30
|
import { install_profile_hotkey } from "../profile_hotkey.js";
|
|
31
|
-
import { vgeo_sample_source } from "
|
|
31
|
+
import { vgeo_sample_source } from "./sample_asset.js";
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* A `.vgeo` container drawn **through the meshlet pipeline**, by a cut selected on the GPU.
|
|
35
35
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* nothing itself. It puts an ordinary mesh row in an ordinary `Scene` with an ordinary material,
|
|
36
|
+
* What proves the DAG, the format and the clamp is not a page:
|
|
37
|
+
* `renderer/geometry/virtual/runtime/cut/__fixtures__/vgeo_select_cut.js` is a CPU traversal of the
|
|
38
|
+
* same rule, and every cut spec is held to it. This page proves the other half — the engine seam —
|
|
39
|
+
* and it draws nothing itself. It puts an ordinary mesh row in an ordinary `Scene` with an ordinary material,
|
|
40
40
|
* and every triangle on screen arrives because the compute cut appended `MESHLET_DEFINITION_STRUCT`
|
|
41
41
|
* records into the same collection a static mesh's meshlets go into — through the HZB meshlet
|
|
42
42
|
* filter, the material bucket, the indirect draw and the G-buffer, none of which know that virtual
|
|
@@ -596,6 +596,7 @@ class VGeoPlayground {
|
|
|
596
596
|
clusters_tested: stats[VGEO_CUT_STAT.CLUSTERS_TESTED],
|
|
597
597
|
culled_frustum: stats[VGEO_CUT_STAT.CULLED_FRUSTUM],
|
|
598
598
|
culled_cluster: stats[VGEO_CUT_STAT.CULLED_CLUSTER],
|
|
599
|
+
culled_cluster_box: stats[VGEO_CUT_STAT.CULLED_CLUSTER_BOX],
|
|
599
600
|
culled_lod: stats[VGEO_CUT_STAT.CULLED_LOD],
|
|
600
601
|
meshlets_dropped: stats[VGEO_CUT_STAT.MESHLETS_DROPPED],
|
|
601
602
|
wants_dropped: stats[VGEO_CUT_STAT.WANTS_DROPPED],
|
|
@@ -617,6 +618,7 @@ class VGeoPlayground {
|
|
|
617
618
|
bytes: this.residency.ram_resident_bytes,
|
|
618
619
|
evicted: this.residency.evicted_ram_count,
|
|
619
620
|
refused: this.residency.refused_fetch_count,
|
|
621
|
+
quarantined: this.residency.quarantined_page_count,
|
|
620
622
|
total_pages: reader?.header.total_pages ?? 0,
|
|
621
623
|
},
|
|
622
624
|
fetches_in_flight: this.residency.fetches_in_flight,
|
|
@@ -858,7 +860,7 @@ async function start() {
|
|
|
858
860
|
// yielded so the status paints before the builder takes the thread for half a second
|
|
859
861
|
await new Promise(resolve => setTimeout(resolve, 0));
|
|
860
862
|
|
|
861
|
-
const { source, build_ms } = vgeo_sample_source(128, 48, PAGE_SIZE);
|
|
863
|
+
const { source, build_ms } = await vgeo_sample_source(128, 48, PAGE_SIZE);
|
|
862
864
|
|
|
863
865
|
await page.load(source);
|
|
864
866
|
|
|
@@ -890,7 +892,7 @@ async function start() {
|
|
|
890
892
|
['pages visited', state.cut.pages],
|
|
891
893
|
['clusters tested', state.cut.clusters_tested],
|
|
892
894
|
['subtrees culled', state.cut.culled_frustum + state.cut.culled_lod],
|
|
893
|
-
['clusters culled', state.cut.culled_cluster],
|
|
895
|
+
['clusters culled', `${state.cut.culled_cluster} (box ${state.cut.culled_cluster_box})`],
|
|
894
896
|
['wants', state.wants],
|
|
895
897
|
].map(([name, value]) => `<div class="row"><span>${name}</span><span>${value}</span></div>`)
|
|
896
898
|
.join('');
|
|
@@ -917,6 +919,18 @@ async function start() {
|
|
|
917
919
|
`<span class="${state.vram.refused > 0 ? 'bad' : 'good'}">`
|
|
918
920
|
+ `${state.vram.refused.toLocaleString()}</span>`,
|
|
919
921
|
],
|
|
922
|
+
/*
|
|
923
|
+
A page that failed its retries is quarantined with its reason and is never asked for
|
|
924
|
+
again, and the clamped cut keeps its surface correct with a coarser ancestor
|
|
925
|
+
indefinitely. That is the difference between a container that is coarse because the
|
|
926
|
+
camera just moved and one that is coarse because a page will never arrive — which look
|
|
927
|
+
identical on screen, and which `clamped` alone cannot tell apart.
|
|
928
|
+
*/
|
|
929
|
+
[
|
|
930
|
+
'quarantined',
|
|
931
|
+
`<span class="${state.ram.quarantined > 0 ? 'bad' : 'good'}">`
|
|
932
|
+
+ `${state.ram.quarantined}</span>`,
|
|
933
|
+
],
|
|
920
934
|
['dropped', `<span class="${dropped > 0 ? 'bad' : 'good'}">${dropped}</span>`],
|
|
921
935
|
].map(([name, value]) => `<div class="row"><span>${name}</span><span>${value}</span></div>`)
|
|
922
936
|
.join('');
|