@woosh/meep-engine 3.28.0 → 3.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bundle-worker-terrain.js +1 -1
- package/package.json +1 -1
- package/src/core/binary/BitSet.d.ts +16 -0
- package/src/core/binary/BitSet.d.ts.map +1 -1
- package/src/core/binary/BitSet.js +159 -49
- package/src/core/binary/allocator/OffsetAllocator.d.ts +48 -0
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +208 -9
- package/src/core/binary/compression/compress_bytes.d.ts +20 -0
- package/src/core/binary/compression/compress_bytes.d.ts.map +1 -0
- package/src/core/binary/compression/compress_bytes.js +35 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts +30 -0
- package/src/core/binary/compression/decompress_bytes_into.d.ts.map +1 -0
- package/src/core/binary/compression/decompress_bytes_into.js +87 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts +27 -0
- package/src/core/binary/compression/deflate_decompress_bound.d.ts.map +1 -0
- package/src/core/binary/compression/deflate_decompress_bound.js +32 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_add.js +31 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts +46 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_reduce.js +104 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts +62 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_set_from_triangle.js +158 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts +21 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_size.js +24 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts +34 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_solve.js +55 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts +28 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.d.ts.map +1 -0
- package/src/core/geom/3d/quadric/quadric_attribute_sub.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts +15 -0
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/BinaryDataBlock.js +35 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts +93 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/BtWedgeSet.js +128 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts +38 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_wedge_attribute_quadrics.js +113 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts +47 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +677 -8
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts +22 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_live_count.js +46 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts +19 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.d.ts.map +1 -0
- package/src/core/geom/3d/topology/struct/binary/io/bt_wedges_per_vertex.js +49 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts +63 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.d.ts.map +1 -0
- package/src/core/graph/layout/layered/BoxLayoutOptions.js +80 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.d.ts +35 -0
- package/src/core/graph/layout/layered/LayoutBoxGraph.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/LayoutBoxGraph.js +53 -1
- package/src/core/graph/layout/layered/layout_assign_coordinates.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.js +72 -68
- package/src/core/graph/layout/layered/layout_assign_layers.d.ts.map +1 -0
- package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.js +4 -2
- package/src/core/graph/layout/layered/layout_break_cycles.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_insert_lanes.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_order_layers.d.ts.map +1 -0
- package/src/core/graph/layout/layered/layout_orient_links.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +7 -51
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +8 -69
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +1 -1
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +6 -6
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +1 -1
- package/src/engine/graphics3/DebugDrawSystem.d.ts +7 -5
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +206 -203
- package/src/engine/graphics3/DecalSystem.d.ts +4 -5
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +5 -5
- package/src/engine/graphics3/FogOfWarSystem.d.ts +7 -12
- package/src/engine/graphics3/FogOfWarSystem.d.ts.map +1 -1
- package/src/engine/graphics3/FogOfWarSystem.js +8 -12
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -230
- package/src/shade/RENDERER_CONTRACT.md +12 -7
- package/src/shade/playground/caldera/README.md +529 -0
- package/src/shade/playground/caldera/caldera_format.d.ts +151 -0
- package/src/shade/playground/caldera/caldera_format.d.ts.map +1 -0
- package/src/shade/playground/caldera/caldera_format.js +241 -0
- package/src/shade/playground/caldera/index.html +126 -0
- package/src/shade/playground/caldera/main.d.ts.map +1 -0
- package/src/shade/playground/caldera/main.js +1565 -0
- package/src/shade/playground/mesh_row_ceiling/README.md +85 -0
- package/src/shade/playground/mesh_row_ceiling/index.html +31 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts +2 -0
- package/src/shade/playground/mesh_row_ceiling/main.d.ts.map +1 -0
- package/src/shade/playground/mesh_row_ceiling/main.js +389 -0
- package/src/shade/playground/vgeo_runtime/README.md +5 -3
- package/src/shade/playground/vgeo_runtime/main.js +3 -2
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +3 -3
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -1
- package/src/shade/playground/vgeo_runtime/sample_asset.js +3 -3
- package/src/shade/playground/vgeo_scene/README.md +103 -24
- package/src/shade/playground/vgeo_scene/main.js +525 -24
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +6 -0
- package/src/shade/renderer/Renderer.d.ts +2 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +23 -0
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +100 -8
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +69 -33
- package/src/shade/renderer/extension/RenderExtension.d.ts +15 -18
- package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtension.js +15 -19
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +5 -5
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +29 -166
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +73 -16
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +18 -3
- package/src/shade/renderer/geometry/meshlet/COMPACTION_PLAN_2026_09_16.md +663 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +100 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +688 -81
- package/src/shade/renderer/geometry/virtual/ATTRIBUTE_PLAN_2026_09_18.md +540 -0
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +155 -64
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +30 -13
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +3 -3
- package/src/shade/renderer/geometry/virtual/WEDGE_PLAN_2026_09_18.md +358 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +57 -7
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +63 -9
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts +40 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoContribution.js +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoFrontier.js +91 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupRepack.js +25 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts +77 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoGroupStep.js +84 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +19 -6
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js +20 -7
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster.js +58 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_cluster_graph.js +116 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_group_step.js +545 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_leaf_frontier.js +110 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +2 -27
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js +120 -1564
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_compute_group_boundary.js +123 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts +26 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_error_bands.js +78 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts +24 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_partition_into_groups.js +337 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_run_round.js +147 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts +37 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_stitch_frontier.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_try_repack.js +117 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts +46 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_CREASE_ANGLE.js +45 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts +64 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VGEO_DEFAULT_ATTRIBUTE_WEIGHT_RATIOS.js +68 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +12 -7
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.js +33 -11
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts +58 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_layout.js +79 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_read.js +68 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts +53 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_attribute_vector_write.js +243 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +24 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.js +250 -25
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +12 -8
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.js +58 -50
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +8 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.js +18 -3
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts +38 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_resolve_attribute_weights.js +81 -0
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +23 -5
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.js +28 -21
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.js +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.js +224 -60
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.js +17 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.js +19 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +10 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.js +103 -9
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +14 -2
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.js +38 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +28 -5
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts +32 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_subtree_bounds.js +93 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +20 -6
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +22 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_corner.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/{vgeo_layers_copy_vertex.js → vgeo_layers_copy_corner.js} +8 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts +18 -7
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_declare.js +19 -8
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.d.ts +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_like.js +3 -3
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts +27 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_mesh_wedges.js +97 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts +7 -3
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET.js +21 -11
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/cluster/VGEO_CLUSTER_OFFSET_V4.js +41 -0
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +19 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +20 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts +25 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_DEFLATE.js +24 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/VGEO_CODEC_LZ4.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_codec_name.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts +10 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_decode_frame_blob.js +37 -3
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +21 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +37 -13
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts +8 -2
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_frame_decode_bound.js +14 -2
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +19 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_HEADER_OFFSET.js +6 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts +21 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MAX_LEVEL_COUNT.js +20 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_MIN_READER_VERSION.js +10 -1
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +1 -2
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +10 -3
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET_V5.js +43 -0
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +4 -2
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +8 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +2 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoDirectory.js +6 -4
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +5 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +14 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts +4 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_directory.js +53 -11
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +7 -3
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts +12 -2
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +111 -33
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts +6 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +112 -42
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +51 -21
- package/src/shade/renderer/geometry/virtual/runtime/CULL_PLAN_2026_09_16.md +385 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +34 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +18 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +47 -19
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +22 -4
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +7 -2
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +8 -3
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +13 -11
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +4 -0
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +3 -4
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts +6 -2
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.d.ts.map +1 -1
- package/src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js +90 -12
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts +22 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map +1 -0
- package/src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js +21 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +13 -8
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +3 -6
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +4 -12
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +0 -2
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +4 -5
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +5 -3
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way.js +11 -4
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +4 -3
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/graph_sort_meshlets_by_bucket_id.js +3 -0
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_count_by_rasterization_bucket.js +94 -90
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +13 -5
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_rasterization_bucket_sort.js +96 -89
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_one_way.js +3 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/graph_meshlets_filter_two_way.js +4 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_mesh_expand_to_meshlets_prefix.js +100 -89
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/mesh/shader_prefix_sum_to_command.js +31 -7
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +1 -7
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass1/filter_meshlets.2-way.compute.js +161 -153
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +2 -7
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +4 -8
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +5 -8
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts +25 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/DEFAULT_SHADOWMAP_UPDATE_BUDGET.js +24 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +10 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +30 -21
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts +0 -61
- package/src/shade/playground/vgeo_viewer/cut_geometry.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/main.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts +0 -18
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +0 -1
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts +0 -173
- package/src/shade/playground/vgeo_viewer/select_cut.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts +0 -52
- package/src/shade/renderer/geometry/virtual/build/VGeoFaceGraph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts +0 -24
- package/src/shade/renderer/geometry/virtual/build/VGeoGatheredFaces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts +0 -32
- package/src/shade/renderer/geometry/virtual/build/VGeoLevel.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts +0 -59
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelOptions.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts +0 -44
- package/src/shade/renderer/geometry/virtual/build/VGeoLevelSummary.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts +0 -20
- package/src/shade/renderer/geometry/virtual/build/VGeoSubmesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts +0 -73
- package/src/shade/renderer/geometry/virtual/build/VirtualGeometryMesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +0 -13
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/build/vgeo_bounding_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts +0 -36
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_levels.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts +0 -13
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_page_nodes.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts +0 -19
- package/src/shade/renderer/geometry/virtual/build/vgeo_build_root_group.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts +0 -29
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_normals.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts +0 -31
- package/src/shade/renderer/geometry/virtual/build/vgeo_compute_vertex_tangents.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts +0 -18
- package/src/shade/renderer/geometry/virtual/build/vgeo_containing_sphere.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts +0 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_extract_submesh.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts +0 -12
- package/src/shade/renderer/geometry/virtual/build/vgeo_gather_faces.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts +0 -14
- package/src/shade/renderer/geometry/virtual/build/vgeo_graph_components.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts +0 -11
- package/src/shade/renderer/geometry/virtual/build/vgeo_narrow_indices.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts +0 -46
- package/src/shade/renderer/geometry/virtual/build/vgeo_normalize_source.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +0 -22
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts +0 -29
- package/src/shade/renderer/geometry/virtual/build/vgeo_partition_graph.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts +0 -9
- package/src/shade/renderer/geometry/virtual/build/vgeo_sphere_inflate_to_contain.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts +0 -10
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts +0 -15
- package/src/shade/renderer/geometry/virtual/build/vgeo_split_face_set_packed.d.ts.map +0 -1
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts +0 -16
- package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_layers_copy_vertex.d.ts.map +0 -1
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts +0 -10
- package/src/shade/renderer/loader/gltf/fix_up_material_sides.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts +0 -17
- package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts +0 -3
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts +0 -8
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +0 -1
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_coordinates.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_assign_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_break_cycles.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_insert_lanes.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_order_layers.js +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.d.ts +0 -0
- /package/src/core/{model/node-graph/visual/layout → graph/layout/layered}/layout_orient_links.js +0 -0
- /package/src/shade/playground/{vgeo_viewer → caldera}/main.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VGEO_CLUSTER_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"VGEO_CLUSTER_ROW_WORDS.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,qCAFU,MAAM,CAEyB"}
|
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
* Words in one selection-buffer cluster row.
|
|
3
3
|
*
|
|
4
4
|
* Not rounded up to a power of two. At the million resident clusters
|
|
5
|
-
* `VIRTUAL_GEOMETRY_DESIGN.md` §4 targets,
|
|
6
|
-
* addressing is a multiply either way, so the padding would buy nothing and cost
|
|
5
|
+
* `VIRTUAL_GEOMETRY_DESIGN.md` §4 targets, nineteen words is 76 MB and thirty-two is 128 — and the
|
|
6
|
+
* addressing is a multiply either way, so the padding would buy nothing and cost fifty megabytes.
|
|
7
|
+
*
|
|
8
|
+
* Nineteen since the frustum test moved onto the subtree box: thirteen were the cut rule's operands
|
|
9
|
+
* and the edge, and the last six are {@link VGEO_CLUSTER_ROW_OFFSET.CULL_BOX}. On a 64 KB page the
|
|
10
|
+
* widest page of a converted Zorah container goes from 851 words of its 2,048-word slot to 1,163,
|
|
11
|
+
* so the stride {@link vgeo_runtime_page_slot_words} picks still holds it with room over.
|
|
7
12
|
*
|
|
8
13
|
* @author Alex Goldring
|
|
9
14
|
* @copyright Company Named Limited (c) 2026
|
|
10
15
|
* @type {number}
|
|
11
16
|
*/
|
|
12
|
-
export const VGEO_CLUSTER_ROW_WORDS =
|
|
17
|
+
export const VGEO_CLUSTER_ROW_WORDS = 19;
|
|
@@ -107,4 +107,14 @@ export const VGEO_CUT_STAT = {
|
|
|
107
107
|
* (RUNTIME_PLAN_2026_09_14 §0, §2.1).
|
|
108
108
|
*/
|
|
109
109
|
CULLED_CLUSTER: 14,
|
|
110
|
+
/**
|
|
111
|
+
* Of the clusters the frustum discarded, the ones the LOD sphere let through and the subtree box
|
|
112
|
+
* caught — what the tighter bound of `CULL_PLAN_2026_09_16` is worth, per frame and per view.
|
|
113
|
+
*
|
|
114
|
+
* A container written before `format_version` 5 carries no such box and the reader stands the
|
|
115
|
+
* sphere's own cube in for it, which rejects nothing the sphere did not: **this counter reading
|
|
116
|
+
* zero is how an older container announces itself**, and it is the measurement behind that
|
|
117
|
+
* promise rather than an argument for it.
|
|
118
|
+
*/
|
|
119
|
+
CULLED_CLUSTER_BOX: 15,
|
|
110
120
|
};
|
|
@@ -5,21 +5,23 @@
|
|
|
5
5
|
* are a factor of fifteen apart, so the number here is a **choice** rather than a derivation and it
|
|
6
6
|
* is worth writing down which.
|
|
7
7
|
*
|
|
8
|
-
* **The provable bound is
|
|
8
|
+
* **The provable bound is close to the page size.** A page's decoded bytes are
|
|
9
9
|
* `56 + 32·nodes + 8·groups + 112·clusters + payload`, and its runtime rows are
|
|
10
|
-
* `32·nodes + 16·groups +
|
|
10
|
+
* `32·nodes + 16·groups + 76·clusters`. Every group holds at least one cluster (format §11.1) and
|
|
11
11
|
* the node tree over `g` groups has at most `(g+2)/2` nodes, so the runtime side is at most
|
|
12
|
-
* `
|
|
13
|
-
* 0.
|
|
14
|
-
* container the format admits and wastes an order of magnitude on every container anyone
|
|
12
|
+
* `108·clusters + 32` against a decoded side of at least `56 + 112·clusters` — a ratio just under
|
|
13
|
+
* one, or about 0.7 once a cluster's minimum payload is counted. A stride sized that way is correct
|
|
14
|
+
* for every container the format admits and wastes an order of magnitude on every container anyone
|
|
15
|
+
* builds.
|
|
15
16
|
*
|
|
16
|
-
* **The measured maximum is
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* vertices and indices.
|
|
17
|
+
* **The measured maximum is about 7%.** The widest page of a converted Zorah container — 52
|
|
18
|
+
* clusters, 5 nodes, 15 groups, 25 parent entries — comes to 1,163 words against a 64 KB page,
|
|
19
|
+
* which is 7.1% of it, because a page is overwhelmingly payload: 52 clusters is 4.5 KB of records
|
|
20
|
+
* against 59 KB of vertices and indices. It was 3.9% before the cluster row carried a cull box
|
|
21
|
+
* (`CULL_PLAN_2026_09_16` §2.4), and the eighth below still holds it at 1.76× rather than 3.2×.
|
|
20
22
|
*
|
|
21
|
-
* So this takes **an eighth of the page**, which is
|
|
22
|
-
*
|
|
23
|
+
* So this takes **an eighth of the page**, which is 1.76× the widest measured page, and an install
|
|
24
|
+
* that does not fit is **refused and counted** rather than overrunning
|
|
23
25
|
* its slot — the same direction `register` takes for a container built at the wrong page size, and
|
|
24
26
|
* for the same reason: a tier that silently reconciles a size it was not built for is a tier whose
|
|
25
27
|
* pages point into each other. A caller holding an asset this refuses raises `page_slot_words`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_runtime_page_slot_words.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"vgeo_runtime_page_slot_words.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wDANW,MAAM,GACJ,MAAM,CAUlB"}
|
|
@@ -7,21 +7,23 @@ import { assert } from "../../../../../core/assert.js";
|
|
|
7
7
|
* are a factor of fifteen apart, so the number here is a **choice** rather than a derivation and it
|
|
8
8
|
* is worth writing down which.
|
|
9
9
|
*
|
|
10
|
-
* **The provable bound is
|
|
10
|
+
* **The provable bound is close to the page size.** A page's decoded bytes are
|
|
11
11
|
* `56 + 32·nodes + 8·groups + 112·clusters + payload`, and its runtime rows are
|
|
12
|
-
* `32·nodes + 16·groups +
|
|
12
|
+
* `32·nodes + 16·groups + 76·clusters`. Every group holds at least one cluster (format §11.1) and
|
|
13
13
|
* the node tree over `g` groups has at most `(g+2)/2` nodes, so the runtime side is at most
|
|
14
|
-
* `
|
|
15
|
-
* 0.
|
|
16
|
-
* container the format admits and wastes an order of magnitude on every container anyone
|
|
14
|
+
* `108·clusters + 32` against a decoded side of at least `56 + 112·clusters` — a ratio just under
|
|
15
|
+
* one, or about 0.7 once a cluster's minimum payload is counted. A stride sized that way is correct
|
|
16
|
+
* for every container the format admits and wastes an order of magnitude on every container anyone
|
|
17
|
+
* builds.
|
|
17
18
|
*
|
|
18
|
-
* **The measured maximum is
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* vertices and indices.
|
|
19
|
+
* **The measured maximum is about 7%.** The widest page of a converted Zorah container — 52
|
|
20
|
+
* clusters, 5 nodes, 15 groups, 25 parent entries — comes to 1,163 words against a 64 KB page,
|
|
21
|
+
* which is 7.1% of it, because a page is overwhelmingly payload: 52 clusters is 4.5 KB of records
|
|
22
|
+
* against 59 KB of vertices and indices. It was 3.9% before the cluster row carried a cull box
|
|
23
|
+
* (`CULL_PLAN_2026_09_16` §2.4), and the eighth below still holds it at 1.76× rather than 3.2×.
|
|
22
24
|
*
|
|
23
|
-
* So this takes **an eighth of the page**, which is
|
|
24
|
-
*
|
|
25
|
+
* So this takes **an eighth of the page**, which is 1.76× the widest measured page, and an install
|
|
26
|
+
* that does not fit is **refused and counted** rather than overrunning
|
|
25
27
|
* its slot — the same direction `register` takes for a container built at the wrong page size, and
|
|
26
28
|
* for the same reason: a tier that silently reconciles a size it was not built for is a tier whose
|
|
27
29
|
* pages point into each other. A caller holding an asset this refuses raises `page_slot_words`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_runtime_write_page_block.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qDAXW,WAAW,UACX,YAAY,QAEZ,MAAM,mBAEJ,MAAM,
|
|
1
|
+
{"version":3,"file":"vgeo_runtime_write_page_block.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qDAXW,WAAW,UACX,YAAY,QAEZ,MAAM,mBAEJ,MAAM,CAsIlB"}
|
|
@@ -109,6 +109,10 @@ export function vgeo_runtime_write_page_block(words, floats, base, page) {
|
|
|
109
109
|
page.parent_sphere[cluster * 4 + c];
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
+
for (let c = 0; c < 6; c++) {
|
|
113
|
+
floats[row + VGEO_CLUSTER_ROW_OFFSET.CULL_BOX + c] = page.subtree_aabb[cluster * 6 + c];
|
|
114
|
+
}
|
|
115
|
+
|
|
112
116
|
floats[row + VGEO_CLUSTER_ROW_OFFSET.SELF_ERROR] = page.self_error[cluster];
|
|
113
117
|
floats[row + VGEO_CLUSTER_ROW_OFFSET.PARENT_ERROR] = page.parent_error[cluster];
|
|
114
118
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_sharc_evict.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_sharc_evict.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js"],"names":[],"mappings":"AAkGA,+CAIG;8BAlG2B,kCAAkC"}
|
|
@@ -26,11 +26,10 @@ const PUSH_CONSTANTS = WebGPUStruct.from({
|
|
|
26
26
|
capacity: u32,
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
// per-dispatch, eight bytes, read-only: immediate data rather than a uniform buffer
|
|
30
|
+
resources.setImmediate("settings", PUSH_CONSTANTS);
|
|
31
|
+
|
|
32
32
|
resources.createGroup()
|
|
33
|
-
.addUniform("settings", PUSH_CONSTANTS)
|
|
34
33
|
.addStorageBuffer('hashMapData', HASH_MAP_DATA_STRUCT, true)
|
|
35
34
|
.addStorageBuffer("voxelData", WebGPUArray.from(vec4u))
|
|
36
35
|
.addStorageBuffer('evictionRequests', EVICTION_STRUCT);
|
|
@@ -6,16 +6,20 @@
|
|
|
6
6
|
* @param {number} buffer_input_offset where to start reading from, in bytes
|
|
7
7
|
* @param {GPUBuffer} buffer_command
|
|
8
8
|
* @param {number} buffer_command_offset where to start writing at, in bytes
|
|
9
|
+
* @param {boolean} [fold] spread a count past one dimension's limit over `y` and `z` instead of
|
|
10
|
+
* clamping it away. Only for a shader that reads its index through
|
|
11
|
+
* {@link chunk_grid3d_to_index} — see {@link create_pipeline}.
|
|
9
12
|
*/
|
|
10
|
-
export function build_indirect_compute_dispatch_command(elements_per_workgroup: number, encoder: ShadeGPUCommandContext, buffer_input: GPUBuffer, buffer_input_offset: number, buffer_command: GPUBuffer, buffer_command_offset: number): void;
|
|
13
|
+
export function build_indirect_compute_dispatch_command(elements_per_workgroup: number, encoder: ShadeGPUCommandContext, buffer_input: GPUBuffer, buffer_input_offset: number, buffer_command: GPUBuffer, buffer_command_offset: number, fold?: boolean): void;
|
|
11
14
|
/**
|
|
12
15
|
*
|
|
13
16
|
* @param {FrameGraph} graph
|
|
14
17
|
* @param {number} input input buffer ID
|
|
15
18
|
* @param {number} [workgroup_size]
|
|
19
|
+
* @param {boolean} [fold] see {@link build_indirect_compute_dispatch_command}
|
|
16
20
|
* @returns {number}
|
|
17
21
|
*/
|
|
18
|
-
export function graph_build_indirect_dispatch_command(graph: FrameGraph, input: number, workgroup_size?: number): number;
|
|
22
|
+
export function graph_build_indirect_dispatch_command(graph: FrameGraph, input: number, workgroup_size?: number, fold?: boolean): number;
|
|
19
23
|
export const INDIRECT_COMPUTE_COMMAND_DESCRIPTOR: BufferResourceDescriptor;
|
|
20
24
|
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
21
25
|
//# sourceMappingURL=IndirectComputeCommandBuildPass.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndirectComputeCommandBuildPass.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IndirectComputeCommandBuildPass.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js"],"names":[],"mappings":"AAoLA;;;;;;;;;;;GAWG;AACH,gFAVW,MAAM,iFAGN,MAAM,oDAEN,MAAM,SACN,OAAO,QAuFjB;AAED;;;;;;;GAOG;AACH,gFALW,MAAM,mBACN,MAAM,SACN,OAAO,GACL,MAAM,CAkClB;AA9ID,2EAIE;yCA7KuC,mDAAmD"}
|
|
@@ -8,6 +8,46 @@ import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDe
|
|
|
8
8
|
import { STRUCT_DISPATCH_COMPUTE_COMMAND } from "./STRUCT_DISPATCH_COMPUTE_COMMAND.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
+
* How a workgroup count that does not fit one dimension is spread over three.
|
|
12
|
+
*
|
|
13
|
+
* `maxComputeWorkgroupsPerDimension` is 65,535 on Chrome/Dawn and {@link Renderer#initialize} does
|
|
14
|
+
* not raise it — an adapter will not hand up more. At the engine's group size of 128 that is
|
|
15
|
+
* 8,388,480 elements in one dimension, which a real scene passes: a map of a million ordinary mesh
|
|
16
|
+
* rows expands to twelve million meshlets.
|
|
17
|
+
*
|
|
18
|
+
* Neither of the things that happen there is acceptable. A command **over** the limit makes
|
|
19
|
+
* `dispatchWorkgroupsIndirect` do nothing at all — measured against Dawn on nvidia/lovelace, where
|
|
20
|
+
* 65,535 workgroups run and 65,536 write not one element, with no validation error and nothing
|
|
21
|
+
* logged. Clamping it back into range, which is what this pass used to do, is the milder version of
|
|
22
|
+
* the same thing: a pass that silently covers its first 8,388,480 elements and no more. Neither
|
|
23
|
+
* moves a counter, because the collection's own `count` is written by a different pass.
|
|
24
|
+
*
|
|
25
|
+
* So the count is folded instead: `x` fills to the limit, then `y`, then `z`. Nothing is dropped
|
|
26
|
+
* and the reachable size becomes 65,535³ groups, which is not a limit anyone will meet.
|
|
27
|
+
*
|
|
28
|
+
* **A folded command's shader has to read its index accordingly.** `global_invocation_id.x` only
|
|
29
|
+
* carries the x dimension, so a shader that keeps using it would run its first 8,388,480 elements
|
|
30
|
+
* once per `y`, which is worse than dropping the rest. Fold and index are one decision:
|
|
31
|
+
*
|
|
32
|
+
* ```wgsl
|
|
33
|
+
* fn main(
|
|
34
|
+
* @builtin(workgroup_id) workgroup_id : vec3<u32>,
|
|
35
|
+
* @builtin(num_workgroups) group_count : vec3<u32>,
|
|
36
|
+
* @builtin(local_invocation_index) local_index : u32,
|
|
37
|
+
* ){
|
|
38
|
+
* let index = grid3d_to_index(workgroup_id, group_count.xy) * GROUP_SIZEu + local_index;
|
|
39
|
+
*
|
|
40
|
+
* if(index >= count){ return; }
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* {@link chunk_grid3d_to_index} is the same flattening the light and decal clusters use, and a
|
|
44
|
+
* folded grid is exactly a 3D grid whose extents happen to be a dispatch's. When the count fits,
|
|
45
|
+
* `y` and `z` are 1 and the expression is `global_invocation_id.x` term for term, so a pass under
|
|
46
|
+
* the ceiling pays nothing for this.
|
|
47
|
+
*
|
|
48
|
+
* Folding is opt-in because it is only safe once the shader indexes this way, and most passes
|
|
49
|
+
* driven by this builder cannot reach the ceiling to begin with — a scene is capped at 3,047,424
|
|
50
|
+
* mesh rows by the `transforms` table, which is 23,808 groups.
|
|
11
51
|
*
|
|
12
52
|
* @param {PipelineCacheKey} key
|
|
13
53
|
* @returns {ComputePipelineDescriptor}
|
|
@@ -17,6 +57,28 @@ function create_pipeline(key) {
|
|
|
17
57
|
const device = key.device;
|
|
18
58
|
const max_workgroup_count = device.limits.maxComputeWorkgroupsPerDimension;
|
|
19
59
|
|
|
60
|
+
//language=WGSL
|
|
61
|
+
const clamped_dispatch = `
|
|
62
|
+
// clamp, it's generally better to be wrong than to fail
|
|
63
|
+
command = ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref}(
|
|
64
|
+
min( ${max_workgroup_count}u, desired_groups ),
|
|
65
|
+
1u,
|
|
66
|
+
1u
|
|
67
|
+
);`;
|
|
68
|
+
|
|
69
|
+
//language=WGSL
|
|
70
|
+
const folded_dispatch = `
|
|
71
|
+
const LIMIT = ${max_workgroup_count}u;
|
|
72
|
+
|
|
73
|
+
// x to the limit, what is left of it in rows of x, what is left of those in slices of x*y
|
|
74
|
+
let rows = divide_round_up(desired_groups, LIMIT);
|
|
75
|
+
let slices = divide_round_up(rows, LIMIT);
|
|
76
|
+
|
|
77
|
+
command = ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref}(
|
|
78
|
+
min( desired_groups, LIMIT ),
|
|
79
|
+
min( max( rows, 1u ), LIMIT ),
|
|
80
|
+
max( slices, 1u )
|
|
81
|
+
);`;
|
|
20
82
|
|
|
21
83
|
//language=WGSL
|
|
22
84
|
const shader_code = `
|
|
@@ -25,22 +87,22 @@ function create_pipeline(key) {
|
|
|
25
87
|
@group(0) @binding(0) var<storage, read> input : u32;
|
|
26
88
|
@group(0) @binding(1) var<storage, read_write> command : ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref};
|
|
27
89
|
|
|
90
|
+
fn divide_round_up(value: u32, divisor: u32) -> u32 {
|
|
91
|
+
return (value + divisor - 1u) / divisor;
|
|
92
|
+
}
|
|
93
|
+
|
|
28
94
|
@compute @workgroup_size(1, 1, 1)
|
|
29
95
|
fn main(){
|
|
30
96
|
|
|
31
97
|
let elements_per_group = ${key.elements_per_workgroup}u;
|
|
32
|
-
let
|
|
33
|
-
|
|
34
|
-
// clamp, it's generally better to be wrong than to fail
|
|
35
|
-
let dispatch_x = min( ${max_workgroup_count}, desired_dispatch_x );
|
|
36
|
-
|
|
37
|
-
command = ${STRUCT_DISPATCH_COMPUTE_COMMAND.wgsl_ref}(dispatch_x, 1u, 1u);
|
|
98
|
+
let desired_groups = divide_round_up(input, elements_per_group);
|
|
99
|
+
${key.fold ? folded_dispatch : clamped_dispatch}
|
|
38
100
|
|
|
39
101
|
}
|
|
40
102
|
`;
|
|
41
103
|
|
|
42
104
|
return ComputePipelineDescriptor.simplified({
|
|
43
|
-
label: "IndirectComputeCommandBuildPass",
|
|
105
|
+
label: key.fold ? "IndirectComputeCommandBuildPass/folded" : "IndirectComputeCommandBuildPass",
|
|
44
106
|
code:
|
|
45
107
|
shader_code,
|
|
46
108
|
bindings: [[
|
|
@@ -64,14 +126,23 @@ class PipelineCacheKey {
|
|
|
64
126
|
*/
|
|
65
127
|
elements_per_workgroup = 256
|
|
66
128
|
|
|
67
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Whether a count past one dimension's limit is spread over `y` and `z` rather than clamped
|
|
131
|
+
* away. See {@link create_pipeline} — the shader it drives has to index for it.
|
|
132
|
+
* @type {boolean}
|
|
133
|
+
*/
|
|
134
|
+
fold = false;
|
|
135
|
+
|
|
136
|
+
static from(device, elements_per_workgroup = 256, fold = false) {
|
|
68
137
|
assert.defined(device, 'device');
|
|
69
138
|
assert.isNonNegativeInteger(elements_per_workgroup, 'workgroup_size');
|
|
139
|
+
assert.isBoolean(fold, 'fold');
|
|
70
140
|
|
|
71
141
|
const r = new PipelineCacheKey();
|
|
72
142
|
|
|
73
143
|
r.device = device;
|
|
74
144
|
r.elements_per_workgroup = elements_per_workgroup;
|
|
145
|
+
r.fold = fold;
|
|
75
146
|
|
|
76
147
|
return r;
|
|
77
148
|
}
|
|
@@ -79,11 +150,12 @@ class PipelineCacheKey {
|
|
|
79
150
|
equals(other) {
|
|
80
151
|
return this.device === other.device
|
|
81
152
|
&& this.elements_per_workgroup === other.elements_per_workgroup
|
|
153
|
+
&& this.fold === other.fold
|
|
82
154
|
;
|
|
83
155
|
}
|
|
84
156
|
|
|
85
157
|
hash() {
|
|
86
|
-
return this.elements_per_workgroup;
|
|
158
|
+
return this.elements_per_workgroup * 2 + (this.fold ? 1 : 0);
|
|
87
159
|
}
|
|
88
160
|
}
|
|
89
161
|
|
|
@@ -114,6 +186,9 @@ export const INDIRECT_COMPUTE_COMMAND_DESCRIPTOR = BufferResourceDescriptor.from
|
|
|
114
186
|
* @param {number} buffer_input_offset where to start reading from, in bytes
|
|
115
187
|
* @param {GPUBuffer} buffer_command
|
|
116
188
|
* @param {number} buffer_command_offset where to start writing at, in bytes
|
|
189
|
+
* @param {boolean} [fold] spread a count past one dimension's limit over `y` and `z` instead of
|
|
190
|
+
* clamping it away. Only for a shader that reads its index through
|
|
191
|
+
* {@link chunk_grid3d_to_index} — see {@link create_pipeline}.
|
|
117
192
|
*/
|
|
118
193
|
export function build_indirect_compute_dispatch_command(
|
|
119
194
|
elements_per_workgroup,
|
|
@@ -122,6 +197,7 @@ export function build_indirect_compute_dispatch_command(
|
|
|
122
197
|
buffer_input_offset,
|
|
123
198
|
buffer_command,
|
|
124
199
|
buffer_command_offset,
|
|
200
|
+
fold = false,
|
|
125
201
|
) {
|
|
126
202
|
assert.defined(encoder, 'encoder');
|
|
127
203
|
assert.notNull(encoder, 'encoder');
|
|
@@ -172,7 +248,7 @@ export function build_indirect_compute_dispatch_command(
|
|
|
172
248
|
|
|
173
249
|
}
|
|
174
250
|
|
|
175
|
-
const key = PipelineCacheKey.from(device, elements_per_workgroup);
|
|
251
|
+
const key = PipelineCacheKey.from(device, elements_per_workgroup, fold);
|
|
176
252
|
|
|
177
253
|
const pipeline = pipeline_cache.getOrCompute(key, create_pipeline);
|
|
178
254
|
|
|
@@ -204,9 +280,10 @@ export function build_indirect_compute_dispatch_command(
|
|
|
204
280
|
* @param {FrameGraph} graph
|
|
205
281
|
* @param {number} input input buffer ID
|
|
206
282
|
* @param {number} [workgroup_size]
|
|
283
|
+
* @param {boolean} [fold] see {@link build_indirect_compute_dispatch_command}
|
|
207
284
|
* @returns {number}
|
|
208
285
|
*/
|
|
209
|
-
export function graph_build_indirect_dispatch_command(graph, input, workgroup_size = 256) {
|
|
286
|
+
export function graph_build_indirect_dispatch_command(graph, input, workgroup_size = 256, fold = false) {
|
|
210
287
|
const data = new IndirectComputeDispatchPassData();
|
|
211
288
|
|
|
212
289
|
/**
|
|
@@ -226,7 +303,8 @@ export function graph_build_indirect_dispatch_command(graph, input, workgroup_si
|
|
|
226
303
|
buffer_input,
|
|
227
304
|
0,
|
|
228
305
|
buffer_command,
|
|
229
|
-
0
|
|
306
|
+
0,
|
|
307
|
+
fold,
|
|
230
308
|
);
|
|
231
309
|
};
|
|
232
310
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workgroups per dimension that **every** WebGPU device allows.
|
|
3
|
+
*
|
|
4
|
+
* `maxComputeWorkgroupsPerDimension` has this as its default, and a device may only report more,
|
|
5
|
+
* never less — so a shader that writes an indirect dispatch command can fold against this literal
|
|
6
|
+
* and be certain the command is in range wherever it runs, without the device's own figure having
|
|
7
|
+
* to reach it through a binding.
|
|
8
|
+
*
|
|
9
|
+
* Folding sooner than a particular device would have needed costs nothing: the extents are only
|
|
10
|
+
* how the workgroups are arranged, and the shaders on the other side flatten them back with
|
|
11
|
+
* {@link chunk_grid3d_to_index} whatever they are. It is the other direction that is
|
|
12
|
+
* unrecoverable — a command over the device's limit does not run at all, and nothing reports it.
|
|
13
|
+
*
|
|
14
|
+
* {@link build_indirect_compute_dispatch_command} does not use this: it builds its pipeline per
|
|
15
|
+
* device and inlines the real figure. This is for {@link shader_prefix_sum_to_command}, which is a
|
|
16
|
+
* shared {@link ComputeShader} compiled once and cannot.
|
|
17
|
+
*
|
|
18
|
+
* @see https://www.w3.org/TR/webgpu/#limits
|
|
19
|
+
* @type {number}
|
|
20
|
+
*/
|
|
21
|
+
export const WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION: number;
|
|
22
|
+
//# sourceMappingURL=WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/gpu_primitive/indirect/WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qEAFU,MAAM,CAE4D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workgroups per dimension that **every** WebGPU device allows.
|
|
3
|
+
*
|
|
4
|
+
* `maxComputeWorkgroupsPerDimension` has this as its default, and a device may only report more,
|
|
5
|
+
* never less — so a shader that writes an indirect dispatch command can fold against this literal
|
|
6
|
+
* and be certain the command is in range wherever it runs, without the device's own figure having
|
|
7
|
+
* to reach it through a binding.
|
|
8
|
+
*
|
|
9
|
+
* Folding sooner than a particular device would have needed costs nothing: the extents are only
|
|
10
|
+
* how the workgroups are arranged, and the shaders on the other side flatten them back with
|
|
11
|
+
* {@link chunk_grid3d_to_index} whatever they are. It is the other direction that is
|
|
12
|
+
* unrecoverable — a command over the device's limit does not run at all, and nothing reports it.
|
|
13
|
+
*
|
|
14
|
+
* {@link build_indirect_compute_dispatch_command} does not use this: it builds its pipeline per
|
|
15
|
+
* device and inlines the real figure. This is for {@link shader_prefix_sum_to_command}, which is a
|
|
16
|
+
* shared {@link ComputeShader} compiled once and cannot.
|
|
17
|
+
*
|
|
18
|
+
* @see https://www.w3.org/TR/webgpu/#limits
|
|
19
|
+
* @type {number}
|
|
20
|
+
*/
|
|
21
|
+
export const WEBGPU_GUARANTEED_MAX_COMPUTE_WORKGROUPS_PER_DIMENSION = 65535;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_particle_emit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_emit.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_particle_emit.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_emit.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;GAGG;AACH,kDAA8E;AAE9E;;;;;;;;GAQG;AACH,4BAFU,YAAY,CAOK;AA2D3B,iDAIG;6BAhH0B,mCAAmC;8BAIlC,+BAA+B"}
|
|
@@ -3,6 +3,7 @@ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
|
3
3
|
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
4
4
|
import { COLLECTION_U32_STRUCT_READ } from "../../gpu_primitive/COLLECTION_U32_STRUCT_READ.js";
|
|
5
5
|
import { COMPUTE_SHADER_DEFAULT_GROUP_SIZE } from "../../shader/COMPUTE_SHADER_DEFAULT_GROUP_SIZE.js";
|
|
6
|
+
import { chunk_grid3d_to_index } from "../../shader/chunk/grid/chunk_grid3d_to_index.js";
|
|
6
7
|
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
7
8
|
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
8
9
|
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
@@ -52,9 +53,8 @@ export const EMIT_SETTINGS = WebGPUStruct.from({
|
|
|
52
53
|
|
|
53
54
|
const resources = new ShaderResourceSetDescriptor();
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// value into a transient uniform, so no call site changes.
|
|
56
|
+
resources.setImmediate('settings', EMIT_SETTINGS);
|
|
57
|
+
|
|
58
58
|
resources.createGroup()
|
|
59
59
|
.addStorageBuffer("scene_database", WebGPUArray.u32, false)
|
|
60
60
|
.addStorageBuffer("emitter_database", WebGPUArray.u32, false)
|
|
@@ -63,9 +63,7 @@ resources.createGroup()
|
|
|
63
63
|
.addStorageBuffer("pool", WebGPUArray.u32, true)
|
|
64
64
|
.addStorageBuffer("alive_out", WebGPUArray.u32, true)
|
|
65
65
|
.addStorageBuffer("dead", WebGPUArray.u32, true)
|
|
66
|
-
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true)
|
|
67
|
-
// last in the group, so the storage bindings keep the indices the specs read by
|
|
68
|
-
.addUniform('settings', EMIT_SETTINGS);
|
|
66
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
69
67
|
|
|
70
68
|
const body = CodeChunk.from(
|
|
71
69
|
/* language=wgsl */
|
|
@@ -74,8 +72,14 @@ const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
|
|
|
74
72
|
const COUNTER_DEAD : u32 = ${PARTICLE_COUNTER.DEAD}u;
|
|
75
73
|
|
|
76
74
|
@compute @workgroup_size(${PARTICLE_EMIT_WORKGROUP_SIZE}, 1, 1)
|
|
77
|
-
fn main(
|
|
78
|
-
|
|
75
|
+
fn main(
|
|
76
|
+
@builtin(workgroup_id) workgroup_id : vec3<u32>,
|
|
77
|
+
@builtin(num_workgroups) group_count : vec3<u32>,
|
|
78
|
+
@builtin(local_invocation_index) local_index : u32,
|
|
79
|
+
) {
|
|
80
|
+
// shader_prefix_sum_to_command folds its count over three dimensions, so the newborn this lane
|
|
81
|
+
// belongs to is the flattened workgroup, not gid.x. Identical while y and z are 1.
|
|
82
|
+
let i = grid3d_to_index(workgroup_id, group_count.xy) * ${PARTICLE_EMIT_WORKGROUP_SIZE}u + local_index;
|
|
79
83
|
|
|
80
84
|
let assignment = particle_emit_assignment(&spawn_prefix.elements, spawn_prefix.count, i);
|
|
81
85
|
if (!assignment.valid) { return; }
|
|
@@ -99,6 +103,7 @@ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
|
99
103
|
alive_out[a] = slot;
|
|
100
104
|
}
|
|
101
105
|
`, [
|
|
106
|
+
chunk_grid3d_to_index,
|
|
102
107
|
chunk_particle_emit_step,
|
|
103
108
|
chunk_particle_vm_registers_fast,
|
|
104
109
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":";AAuDA;;;;;GAKG;AACH,gCAFU,YAAY,CAMS;
|
|
1
|
+
{"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":";AAuDA;;;;;GAKG;AACH,gCAFU,YAAY,CAMS;AAsD/B,qDAIG;iDApH8C,yBAAyB;6BAJ7C,mCAAmC;8BAClC,+BAA+B"}
|
|
@@ -67,9 +67,8 @@ export const SIMULATE_SETTINGS = WebGPUStruct.from({
|
|
|
67
67
|
|
|
68
68
|
const resources = new ShaderResourceSetDescriptor();
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// value into a transient uniform, so no call site changes.
|
|
70
|
+
resources.setImmediate('settings', SIMULATE_SETTINGS);
|
|
71
|
+
|
|
73
72
|
resources.createGroup()
|
|
74
73
|
.addStorageBuffer("scene_database", WebGPUArray.u32, false)
|
|
75
74
|
.addStorageBuffer("emitter_database", WebGPUArray.u32, false)
|
|
@@ -78,9 +77,7 @@ resources.createGroup()
|
|
|
78
77
|
.addStorageBuffer("sim_list", WebGPUArray.u32, false)
|
|
79
78
|
.addStorageBuffer("alive_out", WebGPUArray.u32, true)
|
|
80
79
|
.addStorageBuffer("dead", WebGPUArray.u32, true)
|
|
81
|
-
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true)
|
|
82
|
-
// last in the group, so the storage bindings keep the indices the specs read by
|
|
83
|
-
.addUniform('settings', SIMULATE_SETTINGS);
|
|
80
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
|
|
84
81
|
|
|
85
82
|
|
|
86
83
|
const body = CodeChunk.from(/* language=wgsl */ `
|
package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare_meshlet_draw_commands_by_material.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;GAeG;AACH,uKAJa;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAA;CAAC,
|
|
1
|
+
{"version":3,"file":"prepare_meshlet_draw_commands_by_material.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;GAeG;AACH,uKAJa;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,wBAAwB,EAAE,MAAM,CAAA;CAAC,CAgUnH"}
|
|
@@ -2,7 +2,7 @@ import { assert } from "../../../../core/assert.js";
|
|
|
2
2
|
import { ceilPowerOfTwo } from "../../../../core/binary/operations/ceilPowerOfTwo.js";
|
|
3
3
|
import { round_up } from "../../../../core/math/round_up.js";
|
|
4
4
|
import { BufferResourceDescriptor } from "../../../device/graph/BufferResourceDescriptor.js";
|
|
5
|
-
import { u32
|
|
5
|
+
import { u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
6
6
|
import { STRUCT_UNINDEXED_DRAW_COMMAND } from "../../gpu_primitive/indirect/STRUCT_UNINDEXED_DRAW_COMMAND.js";
|
|
7
7
|
import { cpu_build_hash_table } from "../../gpu_primitive/hash_table/cpu_build_hash_table.js";
|
|
8
8
|
import { graph_prefix_scan_csdldf } from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
|
|
@@ -22,7 +22,7 @@ import { shader_count_meshlets_by_material } from "./shader_count_meshlets_by_ma
|
|
|
22
22
|
import {
|
|
23
23
|
shader_make_meshlet_indirect_draw_commands_by_material
|
|
24
24
|
} from "./shader_make_meshlet_indirect_draw_commands_by_material.js";
|
|
25
|
-
import {
|
|
25
|
+
import { shader_read_out_bucket } from "./shader_read_out_bucket.js";
|
|
26
26
|
import { shader_sort_meshlets_by_material } from "./shader_sort_meshlets_by_material.js";
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -83,16 +83,11 @@ export function graph_prepare_meshlet_draw_commands_by_material({
|
|
|
83
83
|
0
|
|
84
84
|
);
|
|
85
85
|
|
|
86
|
-
// TODO(chrome-153): transient uniform, not an immediate value — see the shader.
|
|
87
|
-
const u_settings = encoder.allocateTransientValueBuffer(PUSH_CONSTANTS, {
|
|
88
|
-
bucket_id,
|
|
89
|
-
});
|
|
90
|
-
|
|
91
86
|
shader_read_out_bucket.dispatchIndirect({
|
|
92
87
|
encoder,
|
|
93
88
|
command,
|
|
94
89
|
bindings: {
|
|
95
|
-
settings:
|
|
90
|
+
settings: { bucket_id },
|
|
96
91
|
input: buckets_buffer,
|
|
97
92
|
output,
|
|
98
93
|
}
|
|
@@ -165,15 +160,12 @@ export function graph_prepare_meshlet_draw_commands_by_material({
|
|
|
165
160
|
const hzb = resources.get(data.texture_hzb);
|
|
166
161
|
const command = resources.get(data.command);
|
|
167
162
|
|
|
168
|
-
// TODO(chrome-153): transient uniform, not an immediate value — see the shader.
|
|
169
|
-
const u_resolution = encoder.allocateTransientValueBuffer(vec2u, resolution);
|
|
170
|
-
|
|
171
163
|
shader_hzb_meshlet_filter_1way_full.dispatchIndirect({
|
|
172
164
|
encoder,
|
|
173
165
|
command,
|
|
174
166
|
bindings: {
|
|
175
167
|
camera: camera_state,
|
|
176
|
-
resolution
|
|
168
|
+
resolution,
|
|
177
169
|
scene_database: scene.scene_database_buffer,
|
|
178
170
|
meshlet_metadata: scene.geometries.meshlets.buffer_metadata,
|
|
179
171
|
texture_hzb: hzb.obtainView(),
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export const PUSH_CONSTANTS: WebGPUStruct;
|
|
2
1
|
export const shader_read_out_bucket: ComputeShader;
|
|
3
|
-
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
4
2
|
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
5
3
|
//# sourceMappingURL=shader_read_out_bucket.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader_read_out_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shader_read_out_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js"],"names":[],"mappings":"AAqDA,mDAIE;8BApD4B,+BAA+B"}
|
|
@@ -12,14 +12,13 @@ import {
|
|
|
12
12
|
|
|
13
13
|
const resources = new ShaderResourceSetDescriptor();
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const PUSH_CONSTANTS = WebGPUStruct.from({
|
|
16
16
|
bucket_id: u32,
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
resources.
|
|
22
|
-
.addUniform("settings", PUSH_CONSTANTS);
|
|
19
|
+
// per-dispatch, four bytes, read-only: immediate data rather than a pooled buffer, a staging copy
|
|
20
|
+
// and a bind group of its own
|
|
21
|
+
resources.setImmediate("settings", PUSH_CONSTANTS);
|
|
23
22
|
|
|
24
23
|
resources.createGroup()
|
|
25
24
|
.addStorageBuffer("input", RASTERIZATION_BUCKET_SORT_OUTPUT_STRUCT_READ)
|