@woosh/meep-engine 3.26.0 → 3.28.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/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +542 -0
- package/src/core/binary/lz4/LZ4_LEVEL.d.ts +33 -0
- package/src/core/binary/lz4/LZ4_LEVEL.d.ts.map +1 -0
- package/src/core/binary/lz4/LZ4_LEVEL.js +32 -0
- package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts +33 -0
- package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts.map +1 -0
- package/src/core/binary/lz4/lz4_compress_block_at_level.js +47 -0
- package/src/core/binary/lz4/lz4_compress_block_hc.d.ts +40 -0
- package/src/core/binary/lz4/lz4_compress_block_hc.d.ts.map +1 -0
- package/src/core/binary/lz4/lz4_compress_block_hc.js +1382 -0
- package/src/core/binary/lz4/lz4_decompress_block.d.ts +2 -1
- package/src/core/binary/lz4/lz4_decompress_block.d.ts.map +1 -1
- package/src/core/binary/lz4/lz4_decompress_block.js +31 -6
- 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/shape/HeightMapShape3D.d.ts +14 -7
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/HeightMapShape3D.js +87 -78
- package/src/engine/Engine.d.ts.map +1 -1
- package/src/engine/Engine.js +38 -1
- 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/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +19 -10
- package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
- package/src/shade/playground/vgeo_runtime/README.md +186 -27
- package/src/shade/playground/vgeo_runtime/index.html +112 -62
- package/src/shade/playground/vgeo_runtime/main.js +678 -88
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +18 -0
- package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
- package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +23 -5
- package/src/shade/playground/vgeo_scene/README.md +408 -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 +1716 -0
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.d.ts +4 -1
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +5 -2
- package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +1 -2
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +11 -0
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +16 -8
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +16 -11
- 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/VGEO_FORMAT.md +77 -7
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +36 -23
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +17 -14
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +19 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +21 -1
- 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/VGeoLevel.d.ts +32 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +59 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts +44 -0
- package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +36 -0
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_build_levels.js → level/vgeo_build_levels.js} +61 -95
- package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts +19 -0
- 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/mesh/VirtualGeometryMesh.d.ts +73 -0
- 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} +7 -7
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +29 -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/{vgeo_compute_vertex_normals.js → mesh/vgeo_compute_vertex_normals.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.js → mesh/vgeo_compute_vertex_tangents.js} +5 -5
- package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +46 -0
- 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} +9 -9
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts +13 -0
- 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} +63 -16
- package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts +13 -0
- 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 +22 -0
- 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/partition/VGeoFaceGraph.d.ts +52 -0
- 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} +1 -1
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts +14 -0
- 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 +29 -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 +10 -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} +12 -55
- package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts +15 -0
- 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/{vgeo_split_face_set_packed.js → partition/vgeo_split_face_set_packed.js} +3 -3
- package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts +12 -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 +18 -0
- 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 +9 -0
- 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 +24 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_extract_submesh.js → submesh/vgeo_extract_submesh.js} +5 -5
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +12 -0
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/{vgeo_gather_faces.js → submesh/vgeo_gather_faces.js} +2 -2
- package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts +11 -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_assemble_pages.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +10 -11
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +22 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +24 -0
- 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/dag/VirtualGeometryCluster.d.ts +12 -0
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +13 -0
- package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +8 -1
- 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 +11 -3
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +9 -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 +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_MAX_PARENT_ENTRY_COUNT.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js +17 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts +8 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js +7 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js +13 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js +10 -0
- package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +28 -0
- 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 +7 -3
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +20 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +4 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +4 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +29 -3
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +81 -122
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +40 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +44 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +69 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +236 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +15 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts +31 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js +32 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +10 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +21 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js +84 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts +22 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +96 -0
- 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 +63 -3
- 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 +219 -17
- 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 +156 -11
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +656 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +33 -36
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +109 -193
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +109 -29
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +173 -105
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +109 -26
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +548 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +29 -50
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +55 -487
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts +84 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +393 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts +234 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +1388 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts +81 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.js +89 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +53 -34
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +407 -124
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +100 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +219 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js +47 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +30 -12
- 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 +11 -73
- 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 +98 -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_collect.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +18 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +5 -15
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.js +77 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +130 -0
- 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 +32 -37
- 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 +576 -230
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +15 -18
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +19 -28
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +45 -25
- 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 +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +0 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +12 -10
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +7 -2
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +8 -3
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +2 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts +5 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js +22 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts +23 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js +28 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts +2 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +10 -5
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +15 -6
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +6 -1
- 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 +38 -1
- 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 +4 -3
- 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/loader/gltf/tiny-gltf.d.ts +1 -1
- 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 +6 -3
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +6 -3
- 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/postprocess/nss/NSS.d.ts +1 -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 +12 -4
- 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 +2 -0
- 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 +58 -57
- 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 +3 -5
- 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 +3 -4
- 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/shader_meshlets_extract_bucket.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -4
- 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/pass0/pass_mesh_cull.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +7 -7
- 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 +83 -78
- 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 +85 -89
- 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 +28 -32
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +22 -2
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +61 -4
- 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/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +92 -16
- package/src/shade/renderer/view/GPUViewContext.d.ts +5 -0
- package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
- package/src/shade/renderer/view/GPUViewContext.js +21 -0
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +74 -3
- package/src/shade/playground/vgeo_viewer/README.md +0 -150
- 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.js +0 -1343
- package/src/shade/playground/vgeo_viewer/select_cut.js +0 -481
- 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/VGeoResidencyManager.js +0 -723
- 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/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
- 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.js +0 -78
- 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.js +0 -26
- package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
- 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/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +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/{VGeoGatheredFaces.js → submesh/VGeoGatheredFaces.js} +0 -0
- /package/src/shade/renderer/geometry/virtual/build/{VGeoSubmesh.js → submesh/VGeoSubmesh.js} +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("./GPUVirtualGeometryRuntime.js").GPUVirtualGeometryRuntime} GPUVirtualGeometryRuntime
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* What cutting is per **view** rather than per frame.
|
|
6
|
+
*
|
|
7
|
+
* A view owns this the way it owns its HZB and its previous camera, and for the same reason: these
|
|
8
|
+
* are the things two views must not share. The runtime above it owns what a *scene* has — the page
|
|
9
|
+
* tables, the arena, the pool — and a frame owns the feedback buffer every view writes into.
|
|
10
|
+
*
|
|
11
|
+
* ## Why the params are here and not on the runtime
|
|
12
|
+
*
|
|
13
|
+
* `projection_k` is `screen_height / (2·tan(fov_y/2))`: a property of a render target and a camera,
|
|
14
|
+
* which is to say of a view. One buffer on the runtime meant one value for the frame, written from
|
|
15
|
+
* whichever view opened it — so a shadow cascade cut against the main view's projection and
|
|
16
|
+
* selected a level for a screen it is not drawn to. That is a live defect independent of anything
|
|
17
|
+
* a kept cut needs, and the fix is that each view writes its own.
|
|
18
|
+
*
|
|
19
|
+
* **One buffer per view, not one buffer with an offset per view.** Views are few — a main view and
|
|
20
|
+
* a handful of cascades — and a uniform is tens of bytes, so the saving from packing them would be
|
|
21
|
+
* nothing against giving every per-view value a second index to be wrong in.
|
|
22
|
+
*
|
|
23
|
+
* @author Alex Goldring
|
|
24
|
+
* @copyright Company Named Limited (c) 2026
|
|
25
|
+
*/
|
|
26
|
+
export class VGeoViewCut {
|
|
27
|
+
/**
|
|
28
|
+
* @param {Object} options
|
|
29
|
+
* @param {GPUDevice} options.device
|
|
30
|
+
* @param {string} [options.label] names the buffer in a capture
|
|
31
|
+
*/
|
|
32
|
+
constructor({ device, label }: {
|
|
33
|
+
device: GPUDevice;
|
|
34
|
+
label?: string;
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* The uniform every pass of this view's cut reads.
|
|
38
|
+
*
|
|
39
|
+
* @returns {GPUBuffer}
|
|
40
|
+
*/
|
|
41
|
+
get params_buffer(): GPUBuffer;
|
|
42
|
+
/**
|
|
43
|
+
* @returns {number}
|
|
44
|
+
*/
|
|
45
|
+
get projection_k(): number;
|
|
46
|
+
/**
|
|
47
|
+
* Where this view's last cut stood, as one bit per page row.
|
|
48
|
+
*
|
|
49
|
+
* @returns {GPUBuffer|undefined}
|
|
50
|
+
*/
|
|
51
|
+
get frontier_buffer(): any;
|
|
52
|
+
/**
|
|
53
|
+
* @returns {number}
|
|
54
|
+
*/
|
|
55
|
+
get frontier_word_count(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Size the frontier to the tier it will name rows of.
|
|
58
|
+
*
|
|
59
|
+
* Lazily, and re-made rather than grown when the tier's capacity changes: what it holds
|
|
60
|
+
* is row indices of that tier, so a bigger tier does not extend the old answer, it
|
|
61
|
+
* invalidates it. Dropping it costs one frame of root descent, which is the fallback
|
|
62
|
+
* every other invalidation takes too.
|
|
63
|
+
*
|
|
64
|
+
* @param {number} page_row_capacity
|
|
65
|
+
* @returns {void}
|
|
66
|
+
*/
|
|
67
|
+
resize_frontier(page_row_capacity: number): void;
|
|
68
|
+
/**
|
|
69
|
+
* Take this view's projection from the target it draws to and the camera it draws with.
|
|
70
|
+
*
|
|
71
|
+
* @param {Object} options
|
|
72
|
+
* @param {number} options.screen_height pixels of the render target
|
|
73
|
+
* @param {number} options.fov_y radians
|
|
74
|
+
* @returns {void}
|
|
75
|
+
*/
|
|
76
|
+
set_projection({ screen_height, fov_y }: {
|
|
77
|
+
screen_height: number;
|
|
78
|
+
fov_y: number;
|
|
79
|
+
}): void;
|
|
80
|
+
/**
|
|
81
|
+
* Publish the frame's shared settings and this view's own, as one uniform.
|
|
82
|
+
*
|
|
83
|
+
* Everything but `projection_k` and `flags` is a property of the runtime or the frame, so it is
|
|
84
|
+
* read from the runtime at write time rather than mirrored here — a second copy of `tau` is a
|
|
85
|
+
* second thing to forget to update.
|
|
86
|
+
*
|
|
87
|
+
* @param {Object} options
|
|
88
|
+
* @param {GPUVirtualGeometryRuntime} options.runtime inside an open frame
|
|
89
|
+
* @param {boolean} [options.coarsen] whether this view's cut may walk up
|
|
90
|
+
* @returns {void}
|
|
91
|
+
*/
|
|
92
|
+
write_params({ runtime, coarsen }: {
|
|
93
|
+
runtime: GPUVirtualGeometryRuntime;
|
|
94
|
+
coarsen?: boolean;
|
|
95
|
+
}): void;
|
|
96
|
+
destroy(): void;
|
|
97
|
+
#private;
|
|
98
|
+
}
|
|
99
|
+
export type GPUVirtualGeometryRuntime = import("./GPUVirtualGeometryRuntime.js").GPUVirtualGeometryRuntime;
|
|
100
|
+
//# sourceMappingURL=VGeoViewCut.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGeoViewCut.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js"],"names":[],"mappings":"AAOA;;GAEG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IAwCI;;;;OAIG;IACH;QAH8B,MAAM;QACR,KAAK,GAAtB,MAAM;OAehB;IAED;;;;OAIG;IACH,+BAEC;IAED;;OAEG;IACH,2BAEC;IAED;;;;OAIG;IACH,2BAEC;IAED;;OAEG;IACH,kCAEC;IAED;;;;;;;;;;OAUG;IACH,mCAHW,MAAM,GACJ,IAAI,CAkBhB;IAED;;;;;;;OAOG;IACH;QAJ2B,aAAa,EAA7B,MAAM;QACU,KAAK,EAArB,MAAM;QACJ,IAAI,CAShB;IAED;;;;;;;;;;;OAWG;IACH;QAJ8C,OAAO,EAA1C,yBAAyB;QACP,OAAO,GAAzB,OAAO;QACL,IAAI,CA8BhB;IAED,gBAIC;;CACJ;wCAlNY,OAAO,gCAAgC,EAAE,yBAAyB"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { VGEO_CUT_FLAG_COARSEN } from "./cut/VGEO_CUT_FLAG_COARSEN.js";
|
|
3
|
+
import { VGEO_CUT_FLAG_CULL } from "./cut/VGEO_CUT_FLAG_CULL.js";
|
|
4
|
+
import { VGEO_CUT_PARAMS_STRUCT } from "./cut/VGEO_CUT_PARAMS_STRUCT.js";
|
|
5
|
+
import { vgeo_frontier_words } from "./vgeo_frontier_words.js";
|
|
6
|
+
import { write_gpu_typed_buffer } from "../../../shader/type/serde/write_gpu_typed_buffer.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {import("./GPUVirtualGeometryRuntime.js").GPUVirtualGeometryRuntime} GPUVirtualGeometryRuntime
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* What cutting is per **view** rather than per frame.
|
|
14
|
+
*
|
|
15
|
+
* A view owns this the way it owns its HZB and its previous camera, and for the same reason: these
|
|
16
|
+
* are the things two views must not share. The runtime above it owns what a *scene* has — the page
|
|
17
|
+
* tables, the arena, the pool — and a frame owns the feedback buffer every view writes into.
|
|
18
|
+
*
|
|
19
|
+
* ## Why the params are here and not on the runtime
|
|
20
|
+
*
|
|
21
|
+
* `projection_k` is `screen_height / (2·tan(fov_y/2))`: a property of a render target and a camera,
|
|
22
|
+
* which is to say of a view. One buffer on the runtime meant one value for the frame, written from
|
|
23
|
+
* whichever view opened it — so a shadow cascade cut against the main view's projection and
|
|
24
|
+
* selected a level for a screen it is not drawn to. That is a live defect independent of anything
|
|
25
|
+
* a kept cut needs, and the fix is that each view writes its own.
|
|
26
|
+
*
|
|
27
|
+
* **One buffer per view, not one buffer with an offset per view.** Views are few — a main view and
|
|
28
|
+
* a handful of cascades — and a uniform is tens of bytes, so the saving from packing them would be
|
|
29
|
+
* nothing against giving every per-view value a second index to be wrong in.
|
|
30
|
+
*
|
|
31
|
+
* @author Alex Goldring
|
|
32
|
+
* @copyright Company Named Limited (c) 2026
|
|
33
|
+
*/
|
|
34
|
+
export class VGeoViewCut {
|
|
35
|
+
/**
|
|
36
|
+
* @type {GPUDevice}
|
|
37
|
+
*/
|
|
38
|
+
#device;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @type {string}
|
|
42
|
+
*/
|
|
43
|
+
#label;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @type {GPUBuffer}
|
|
47
|
+
*/
|
|
48
|
+
#params;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Scratch for one params write, so a per-frame write allocates nothing.
|
|
52
|
+
* @type {ArrayBuffer}
|
|
53
|
+
*/
|
|
54
|
+
#scratch;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* `screen_height / (2 · tan(fov_y / 2))`, this view's.
|
|
58
|
+
* @type {number}
|
|
59
|
+
*/
|
|
60
|
+
#projection_k = 1;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* One bit per page row: the pages this view's cut drew from, kept between frames.
|
|
64
|
+
* Undefined until the first frame that knows how big the tier is.
|
|
65
|
+
* @type {GPUBuffer|undefined}
|
|
66
|
+
*/
|
|
67
|
+
#frontier;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @type {number}
|
|
71
|
+
*/
|
|
72
|
+
#frontier_word_count = 0;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @param {Object} options
|
|
76
|
+
* @param {GPUDevice} options.device
|
|
77
|
+
* @param {string} [options.label] names the buffer in a capture
|
|
78
|
+
*/
|
|
79
|
+
constructor({ device, label = 'a view' }) {
|
|
80
|
+
assert.defined(device, 'device');
|
|
81
|
+
|
|
82
|
+
this.#device = device;
|
|
83
|
+
this.#label = label;
|
|
84
|
+
|
|
85
|
+
this.#params = device.createBuffer({
|
|
86
|
+
label: `VGeoViewCut/params (${label})`,
|
|
87
|
+
size: VGEO_CUT_PARAMS_STRUCT.aligned_size,
|
|
88
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
this.#scratch = new ArrayBuffer(VGEO_CUT_PARAMS_STRUCT.aligned_size);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The uniform every pass of this view's cut reads.
|
|
96
|
+
*
|
|
97
|
+
* @returns {GPUBuffer}
|
|
98
|
+
*/
|
|
99
|
+
get params_buffer() {
|
|
100
|
+
return this.#params;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @returns {number}
|
|
105
|
+
*/
|
|
106
|
+
get projection_k() {
|
|
107
|
+
return this.#projection_k;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Where this view's last cut stood, as one bit per page row.
|
|
112
|
+
*
|
|
113
|
+
* @returns {GPUBuffer|undefined}
|
|
114
|
+
*/
|
|
115
|
+
get frontier_buffer() {
|
|
116
|
+
return this.#frontier;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @returns {number}
|
|
121
|
+
*/
|
|
122
|
+
get frontier_word_count() {
|
|
123
|
+
return this.#frontier_word_count;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Size the frontier to the tier it will name rows of.
|
|
128
|
+
*
|
|
129
|
+
* Lazily, and re-made rather than grown when the tier's capacity changes: what it holds
|
|
130
|
+
* is row indices of that tier, so a bigger tier does not extend the old answer, it
|
|
131
|
+
* invalidates it. Dropping it costs one frame of root descent, which is the fallback
|
|
132
|
+
* every other invalidation takes too.
|
|
133
|
+
*
|
|
134
|
+
* @param {number} page_row_capacity
|
|
135
|
+
* @returns {void}
|
|
136
|
+
*/
|
|
137
|
+
resize_frontier(page_row_capacity) {
|
|
138
|
+
const words = vgeo_frontier_words(page_row_capacity);
|
|
139
|
+
|
|
140
|
+
if (this.#frontier !== undefined && words === this.#frontier_word_count) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
this.#frontier?.destroy();
|
|
145
|
+
|
|
146
|
+
this.#frontier_word_count = words;
|
|
147
|
+
|
|
148
|
+
this.#frontier = this.#device.createBuffer({
|
|
149
|
+
label: `VGeoViewCut/frontier (${this.#label})`,
|
|
150
|
+
size: Math.max(4, words * 4),
|
|
151
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Take this view's projection from the target it draws to and the camera it draws with.
|
|
157
|
+
*
|
|
158
|
+
* @param {Object} options
|
|
159
|
+
* @param {number} options.screen_height pixels of the render target
|
|
160
|
+
* @param {number} options.fov_y radians
|
|
161
|
+
* @returns {void}
|
|
162
|
+
*/
|
|
163
|
+
set_projection({ screen_height, fov_y }) {
|
|
164
|
+
assert.isNumber(screen_height, 'screen_height');
|
|
165
|
+
assert.greaterThan(screen_height, 0, 'screen_height');
|
|
166
|
+
assert.isNumber(fov_y, 'fov_y');
|
|
167
|
+
assert.greaterThan(fov_y, 0, 'fov_y');
|
|
168
|
+
|
|
169
|
+
this.#projection_k = screen_height / (2 * Math.tan(fov_y * 0.5));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Publish the frame's shared settings and this view's own, as one uniform.
|
|
174
|
+
*
|
|
175
|
+
* Everything but `projection_k` and `flags` is a property of the runtime or the frame, so it is
|
|
176
|
+
* read from the runtime at write time rather than mirrored here — a second copy of `tau` is a
|
|
177
|
+
* second thing to forget to update.
|
|
178
|
+
*
|
|
179
|
+
* @param {Object} options
|
|
180
|
+
* @param {GPUVirtualGeometryRuntime} options.runtime inside an open frame
|
|
181
|
+
* @param {boolean} [options.coarsen] whether this view's cut may walk up
|
|
182
|
+
* @returns {void}
|
|
183
|
+
*/
|
|
184
|
+
write_params({ runtime, coarsen = false }) {
|
|
185
|
+
assert.defined(runtime, 'runtime');
|
|
186
|
+
|
|
187
|
+
const layout = runtime.feedback_layout;
|
|
188
|
+
|
|
189
|
+
assert.defined(layout, 'runtime.feedback_layout — begin_frame must have run');
|
|
190
|
+
|
|
191
|
+
write_gpu_typed_buffer({
|
|
192
|
+
tau: runtime.tau,
|
|
193
|
+
projection_k: this.#projection_k,
|
|
194
|
+
queue_capacity: runtime.queue_capacity,
|
|
195
|
+
claim_word_count: runtime.claim_word_capacity,
|
|
196
|
+
descent_steps: runtime.descent_steps,
|
|
197
|
+
page_slot_words: runtime.pool.page_slot_words,
|
|
198
|
+
touch_bits_base: layout.touch_bits_base,
|
|
199
|
+
want_base: layout.want_base,
|
|
200
|
+
want_capacity: runtime.want_capacity,
|
|
201
|
+
frontier_word_count: this.#frontier_word_count,
|
|
202
|
+
frame_tag: runtime.pool.frame,
|
|
203
|
+
instance_capacity: runtime.instance_capacity,
|
|
204
|
+
meshlet_capacity: runtime.meshlet_capacity,
|
|
205
|
+
flags: (runtime.cull_enabled ? VGEO_CUT_FLAG_CULL : 0)
|
|
206
|
+
| (coarsen ? VGEO_CUT_FLAG_COARSEN : 0),
|
|
207
|
+
}, VGEO_CUT_PARAMS_STRUCT, this.#scratch, 0);
|
|
208
|
+
|
|
209
|
+
this.#device.queue.writeBuffer(
|
|
210
|
+
this.#params, 0, this.#scratch, 0, VGEO_CUT_PARAMS_STRUCT.aligned_size
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
destroy() {
|
|
215
|
+
this.#params.destroy();
|
|
216
|
+
|
|
217
|
+
this.#frontier?.destroy();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an executed cut item expands into — the three shapes a child can have.
|
|
3
|
+
*
|
|
4
|
+
* The traversal states its production as a *kind*, a count and a base rather than as children
|
|
5
|
+
* written anywhere, because any lane of the subgroup has to be able to build child `k` of any other
|
|
6
|
+
* lane's item out of a handful of shuffled words. A kind is what makes those words mean something
|
|
7
|
+
* without a second read of the row that produced them.
|
|
8
|
+
*/
|
|
9
|
+
export type VGEO_CUT_EXPAND = number;
|
|
10
|
+
export namespace VGEO_CUT_EXPAND {
|
|
11
|
+
let NONE: number;
|
|
12
|
+
let NODES: number;
|
|
13
|
+
let CLUSTERS: number;
|
|
14
|
+
let PAGE: number;
|
|
15
|
+
let PARENTS: number;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=VGEO_CUT_EXPAND.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGEO_CUT_EXPAND.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js"],"names":[],"mappings":";;;;;;;;8BAYU,MAAM"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an executed cut item expands into — the three shapes a child can have.
|
|
3
|
+
*
|
|
4
|
+
* The traversal states its production as a *kind*, a count and a base rather than as children
|
|
5
|
+
* written anywhere, because any lane of the subgroup has to be able to build child `k` of any other
|
|
6
|
+
* lane's item out of a handful of shuffled words. A kind is what makes those words mean something
|
|
7
|
+
* without a second read of the row that produced them.
|
|
8
|
+
*
|
|
9
|
+
* @see shader_vgeo_cut_traverse
|
|
10
|
+
*
|
|
11
|
+
* @author Alex Goldring
|
|
12
|
+
* @copyright Company Named Limited (c) 2026
|
|
13
|
+
* @enum {number}
|
|
14
|
+
*/
|
|
15
|
+
export const VGEO_CUT_EXPAND = {
|
|
16
|
+
/**
|
|
17
|
+
* Nothing. Culled, below the cut, drawn, or clamped — every terminal case of the rule.
|
|
18
|
+
*/
|
|
19
|
+
NONE: 0,
|
|
20
|
+
/**
|
|
21
|
+
* `count` child nodes of the same page, starting at node index `first`.
|
|
22
|
+
*/
|
|
23
|
+
NODES: 1,
|
|
24
|
+
/**
|
|
25
|
+
* `count` clusters, spread over the `span` groups starting at group index `first`.
|
|
26
|
+
*
|
|
27
|
+
* The count is every cluster the leaf covers rather than a number of chunks: a lane no longer
|
|
28
|
+
* walks a run of them, so there is nothing to chunk. `span` is carried instead of assumed
|
|
29
|
+
* because the walk that maps child `k` back to a group has to terminate on a row the builder
|
|
30
|
+
* wrote, not on a bound this file believes about the format.
|
|
31
|
+
*/
|
|
32
|
+
CLUSTERS: 2,
|
|
33
|
+
/**
|
|
34
|
+
* One node 0, in the page at `page_row` — a descent crossing a page boundary, already claimed
|
|
35
|
+
* by the lane that produced it.
|
|
36
|
+
*/
|
|
37
|
+
PAGE: 3,
|
|
38
|
+
/**
|
|
39
|
+
* `count` entries of the parent rows of the page at `page_row`, starting at entry `first` —
|
|
40
|
+
* a group's whole parent list, which is one step of a walk up.
|
|
41
|
+
*
|
|
42
|
+
* Unlike {@link PAGE} these are **not** claimed by the producer; each child claims the page
|
|
43
|
+
* it resolves to when it is executed. See `VGEO_QUEUE_TARGET_PARENT_BIT` for why the claim
|
|
44
|
+
* cannot be hoisted into the producer the way the descent's can.
|
|
45
|
+
*/
|
|
46
|
+
PARENTS: 4,
|
|
47
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `VGEO_CUT_PARAMS_STRUCT.flags`: a cluster below the cut walks **up** instead of stopping.
|
|
3
|
+
*
|
|
4
|
+
* Every edge the descent follows points down, so a traversal that finds itself below the cut — its
|
|
5
|
+
* consuming step already projecting to no more than tau — can only stop, and a runtime that wanted
|
|
6
|
+
* to keep a cut between frames would have to answer every coarsening camera by re-descending from
|
|
7
|
+
* the root. With this set, such a cluster expands into the pages holding its group\x27s parents
|
|
8
|
+
* instead (format §6.3), and the walk continues until it reaches clusters the rule draws.
|
|
9
|
+
*
|
|
10
|
+
* Off by default, and the descent with it off is byte for byte the descent that shipped: the root
|
|
11
|
+
* seed reaches every group through a parent that projected above tau, so the branch this opens is
|
|
12
|
+
* one the descent does not take. It is a flag rather than a behaviour because the cut it belongs to
|
|
13
|
+
* is a *kept* one, which is per view, and CUT_PLAN_2026_09_14 §7.6 is where a view gets to say so.
|
|
14
|
+
*
|
|
15
|
+
* @author Alex Goldring
|
|
16
|
+
* @copyright Company Named Limited (c) 2026
|
|
17
|
+
* @type {number}
|
|
18
|
+
*/
|
|
19
|
+
export const VGEO_CUT_FLAG_COARSEN: number;
|
|
20
|
+
//# sourceMappingURL=VGEO_CUT_FLAG_COARSEN.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGEO_CUT_FLAG_COARSEN.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,oCAFU,MAAM,CAEuB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `VGEO_CUT_PARAMS_STRUCT.flags`: a cluster below the cut walks **up** instead of stopping.
|
|
3
|
+
*
|
|
4
|
+
* Every edge the descent follows points down, so a traversal that finds itself below the cut — its
|
|
5
|
+
* consuming step already projecting to no more than tau — can only stop, and a runtime that wanted
|
|
6
|
+
* to keep a cut between frames would have to answer every coarsening camera by re-descending from
|
|
7
|
+
* the root. With this set, such a cluster expands into the pages holding its group\x27s parents
|
|
8
|
+
* instead (format §6.3), and the walk continues until it reaches clusters the rule draws.
|
|
9
|
+
*
|
|
10
|
+
* Off by default, and the descent with it off is byte for byte the descent that shipped: the root
|
|
11
|
+
* seed reaches every group through a parent that projected above tau, so the branch this opens is
|
|
12
|
+
* one the descent does not take. It is a flag rather than a behaviour because the cut it belongs to
|
|
13
|
+
* is a *kept* one, which is per view, and CUT_PLAN_2026_09_14 §7.6 is where a view gets to say so.
|
|
14
|
+
*
|
|
15
|
+
* @author Alex Goldring
|
|
16
|
+
* @copyright Company Named Limited (c) 2026
|
|
17
|
+
* @type {number}
|
|
18
|
+
*/
|
|
19
|
+
export const VGEO_CUT_FLAG_COARSEN = 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VGEO_CUT_PARAMS_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,
|
|
1
|
+
{"version":3,"file":"VGEO_CUT_PARAMS_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,kDAiF2B;6BAnGE,yCAAyC"}
|
|
@@ -41,9 +41,25 @@ export const VGEO_CUT_PARAMS_STRUCT = WebGPUStruct.from({
|
|
|
41
41
|
*/
|
|
42
42
|
claim_word_count: u32,
|
|
43
43
|
/**
|
|
44
|
-
*
|
|
44
|
+
* Words of this view's frontier bitmask — one bit per page row, and the bound a write
|
|
45
|
+
* into it is clamped against.
|
|
46
|
+
*
|
|
47
|
+
* Zero says this view keeps no frontier, which is what every cut did before one existed
|
|
48
|
+
* and what a cut still does when the flag is off: the bound rejects every write rather
|
|
49
|
+
* than a branch having to ask.
|
|
50
|
+
*/
|
|
51
|
+
frontier_word_count: u32,
|
|
52
|
+
/**
|
|
53
|
+
* Steps of the descent one dispatch of the traversal runs before handing what it still holds
|
|
54
|
+
* back to the queue.
|
|
55
|
+
*
|
|
56
|
+
* WGSL will not let a loop around a subgroup operation have a non-uniform trip count, and
|
|
57
|
+
* nothing launders one — so the descent cannot stop when the wave runs dry. It runs this many
|
|
58
|
+
* times and masks, at about ten instructions a step for a wave with nothing left. That makes
|
|
59
|
+
* this a tuning knob between idle steps and dispatches, and not a safety bound:
|
|
60
|
+
* `VGEO_CUT_STAT.QUEUE_REMAINING` is what says it was set too low.
|
|
45
61
|
*/
|
|
46
|
-
|
|
62
|
+
descent_steps: u32,
|
|
47
63
|
/**
|
|
48
64
|
* Arena words one page slot holds — the stride a page row is multiplied by.
|
|
49
65
|
*
|
|
@@ -53,19 +69,21 @@ export const VGEO_CUT_PARAMS_STRUCT = WebGPUStruct.from({
|
|
|
53
69
|
*/
|
|
54
70
|
page_slot_words: u32,
|
|
55
71
|
/**
|
|
56
|
-
* Word offset in the feedback buffer of the per
|
|
72
|
+
* Word offset in the feedback buffer of the touch bits — one per page row, set with an
|
|
73
|
+
* `atomicOr` when a page's claim is won. The bit is the dedup and the record at once, so there
|
|
74
|
+
* is no list to overflow and nothing per row to clear beyond the transient itself.
|
|
57
75
|
*/
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Word offset in the feedback buffer of the per-lookup-word want stamps. A want's stamp index
|
|
61
|
-
* is this plus the geometry's lookup offset plus the child page index, which is why the page
|
|
62
|
-
* lookup has its own buffer and its own allocator: it makes that a compact, dense index.
|
|
63
|
-
*/
|
|
64
|
-
want_stamp_base: u32,
|
|
76
|
+
touch_bits_base: u32,
|
|
65
77
|
want_base: u32,
|
|
66
78
|
want_capacity: u32,
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
/**
|
|
80
|
+
* What this frame writes into the want-stamp buffer to claim a want, and what it compares
|
|
81
|
+
* against to dedup one. The stamps are persistent and one per lookup word — one per page of
|
|
82
|
+
* every registered geometry — so they are not cleared per frame; a stamp holding this frame's
|
|
83
|
+
* tag was written this frame, and any other value was not. Never zero, which is what a fresh
|
|
84
|
+
* buffer holds.
|
|
85
|
+
*/
|
|
86
|
+
frame_tag: u32,
|
|
69
87
|
/**
|
|
70
88
|
* Records the VG instance buffer holds, for the one append in the cut that had no bound.
|
|
71
89
|
*/
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* an error.
|
|
2
|
+
* The arithmetic the cut rule is written in: where the camera is in an instance's own space, what
|
|
3
|
+
* an object-space error projects to in pixels, and whether a sphere is worth descending into at all.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* are reading the same numbers rather than two copies of them.
|
|
5
|
+
* Addressing moved to {@link chunk_vgeo_cut_arena}, which this pulls in — a pass that only wants to
|
|
6
|
+
* find a row should not have to take the frustum test with it, and the passes that did not want to
|
|
7
|
+
* wrote their own accessor instead.
|
|
9
8
|
*
|
|
10
|
-
* Every buffer named here has to be declared by the importing shader
|
|
11
|
-
* addressing across passes, and it is the same
|
|
9
|
+
* Every buffer named here has to be declared by the importing shader — `instances`, plus whatever
|
|
10
|
+
* the arena chunk needs. That is the price of sharing addressing across passes, and it is the same
|
|
11
|
+
* bargain `chunk_scene_database_access` makes.
|
|
12
12
|
*
|
|
13
13
|
* @author Alex Goldring
|
|
14
14
|
* @copyright Company Named Limited (c) 2026
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_vgeo_cut_access.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_vgeo_cut_access.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,oCAFU,SAAS,CA+EQ;0BAjGD,0CAA0C"}
|
|
@@ -1,26 +1,18 @@
|
|
|
1
1
|
import { CodeChunk } from "../../../../shader/compiler/CodeChunk.js";
|
|
2
|
-
import { VGEO_CLUSTER_ROW_WORDS } from "../layout/VGEO_CLUSTER_ROW_WORDS.js";
|
|
3
|
-
import { VGEO_GEOMETRY_ROW_WORDS } from "../layout/VGEO_GEOMETRY_ROW_WORDS.js";
|
|
4
|
-
import { VGEO_GROUP_ROW_WORDS } from "../layout/VGEO_GROUP_ROW_WORDS.js";
|
|
5
2
|
import { VGEO_INSTANCE_OFFSET } from "../layout/VGEO_INSTANCE_OFFSET.js";
|
|
6
|
-
import {
|
|
7
|
-
import { VGEO_NODE_ROW_LEAF_BIT } from "../layout/VGEO_NODE_ROW_LEAF_BIT.js";
|
|
8
|
-
import { VGEO_NODE_ROW_OFFSET } from "../layout/VGEO_NODE_ROW_OFFSET.js";
|
|
9
|
-
import { VGEO_NODE_ROW_WORDS } from "../layout/VGEO_NODE_ROW_WORDS.js";
|
|
10
|
-
import { VGEO_PAGE_ROW_OFFSET } from "../layout/VGEO_PAGE_ROW_OFFSET.js";
|
|
11
|
-
import { VGEO_PAGE_ROW_WORDS } from "../layout/VGEO_PAGE_ROW_WORDS.js";
|
|
3
|
+
import { chunk_vgeo_cut_arena } from "./chunk_vgeo_cut_arena.js";
|
|
12
4
|
|
|
13
5
|
/**
|
|
14
|
-
*
|
|
15
|
-
* an error.
|
|
6
|
+
* The arithmetic the cut rule is written in: where the camera is in an instance's own space, what
|
|
7
|
+
* an object-space error projects to in pixels, and whether a sphere is worth descending into at all.
|
|
16
8
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* are reading the same numbers rather than two copies of them.
|
|
9
|
+
* Addressing moved to {@link chunk_vgeo_cut_arena}, which this pulls in — a pass that only wants to
|
|
10
|
+
* find a row should not have to take the frustum test with it, and the passes that did not want to
|
|
11
|
+
* wrote their own accessor instead.
|
|
21
12
|
*
|
|
22
|
-
* Every buffer named here has to be declared by the importing shader
|
|
23
|
-
* addressing across passes, and it is the same
|
|
13
|
+
* Every buffer named here has to be declared by the importing shader — `instances`, plus whatever
|
|
14
|
+
* the arena chunk needs. That is the price of sharing addressing across passes, and it is the same
|
|
15
|
+
* bargain `chunk_scene_database_access` makes.
|
|
24
16
|
*
|
|
25
17
|
* @author Alex Goldring
|
|
26
18
|
* @copyright Company Named Limited (c) 2026
|
|
@@ -29,16 +21,6 @@ import { VGEO_PAGE_ROW_WORDS } from "../layout/VGEO_PAGE_ROW_WORDS.js";
|
|
|
29
21
|
export const chunk_vgeo_cut_access = CodeChunk.from(
|
|
30
22
|
//language=WGSL
|
|
31
23
|
`
|
|
32
|
-
const VG_PAGE_ROW_WORDS = ${VGEO_PAGE_ROW_WORDS}u;
|
|
33
|
-
const VG_NODE_ROW_WORDS = ${VGEO_NODE_ROW_WORDS}u;
|
|
34
|
-
const VG_GROUP_ROW_WORDS = ${VGEO_GROUP_ROW_WORDS}u;
|
|
35
|
-
const VG_CLUSTER_ROW_WORDS = ${VGEO_CLUSTER_ROW_WORDS}u;
|
|
36
|
-
const VG_INSTANCE_WORDS = ${VGEO_INSTANCE_WORDS}u;
|
|
37
|
-
const VG_GEOMETRY_ROW_WORDS = ${VGEO_GEOMETRY_ROW_WORDS}u;
|
|
38
|
-
|
|
39
|
-
const VG_NODE_LEAF_BIT = ${VGEO_NODE_ROW_LEAF_BIT}u;
|
|
40
|
-
const VG_NODE_CHILD_COUNT_MASK = 0xffu;
|
|
41
|
-
|
|
42
24
|
/**
|
|
43
25
|
* Any error at or above this is the root's +infinity, however the file spelled it.
|
|
44
26
|
*
|
|
@@ -49,50 +31,6 @@ const VG_NODE_CHILD_COUNT_MASK = 0xffu;
|
|
|
49
31
|
const VG_ERROR_INFINITE = 3.0e38;
|
|
50
32
|
const VG_PROJECTION_MAX = 3.4e38;
|
|
51
33
|
|
|
52
|
-
/**
|
|
53
|
-
* A page's slot: its header, then its node, group and cluster rows.
|
|
54
|
-
*
|
|
55
|
-
* The stride is a uniform rather than a constant because the tier derives it from the page size its
|
|
56
|
-
* containers are bounded at, and it is a **multiply** rather than a table read because format
|
|
57
|
-
* §11.14 made that legal — design §6 asked for fixed-size page slots from the start and the bound
|
|
58
|
-
* is what it was waiting for. There is no page table, no allocator, and no second storage binding
|
|
59
|
-
* to keep coherent with this one.
|
|
60
|
-
*/
|
|
61
|
-
fn vg_slot_base(page_row: u32) -> u32 {
|
|
62
|
-
return page_row * params.page_slot_words;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
fn vg_page_field(page_row: u32, field: u32) -> u32 {
|
|
66
|
-
return vg_arena[vg_slot_base(page_row) + field];
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
fn vg_node_base(page_row: u32) -> u32 {
|
|
70
|
-
return vg_slot_base(page_row) + VG_PAGE_ROW_WORDS;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
fn vg_group_base(page_row: u32) -> u32 {
|
|
74
|
-
return vg_node_base(page_row)
|
|
75
|
-
+ vg_page_field(page_row, ${VGEO_PAGE_ROW_OFFSET.NODE_COUNT}u) * VG_NODE_ROW_WORDS;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
fn vg_cluster_base(page_row: u32) -> u32 {
|
|
79
|
-
return vg_group_base(page_row)
|
|
80
|
-
+ vg_page_field(page_row, ${VGEO_PAGE_ROW_OFFSET.GROUP_COUNT}u) * VG_GROUP_ROW_WORDS;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
fn vg_arena_f32(word: u32) -> f32 {
|
|
84
|
-
return bitcast<f32>(vg_arena[word]);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
fn vg_sphere_at(word: u32) -> vec4<f32> {
|
|
88
|
-
return vec4<f32>(
|
|
89
|
-
bitcast<f32>(vg_arena[word]),
|
|
90
|
-
bitcast<f32>(vg_arena[word + 1u]),
|
|
91
|
-
bitcast<f32>(vg_arena[word + 2u]),
|
|
92
|
-
bitcast<f32>(vg_arena[word + 3u])
|
|
93
|
-
);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
34
|
fn vg_instance_f32(instance_base: u32, field: u32) -> f32 {
|
|
97
35
|
return bitcast<f32>(instances[instance_base + field]);
|
|
98
36
|
}
|
|
@@ -108,7 +46,7 @@ fn vg_instance_eye(instance_base: u32) -> vec3<f32> {
|
|
|
108
46
|
/**
|
|
109
47
|
* \`err_px = r_e * screen_height / (2 * tan(fov_y / 2) * d)\`, with \`d\` the distance to the
|
|
110
48
|
* **closest point** of the sphere — design §4, and written in that order so that it agrees with
|
|
111
|
-
* \`
|
|
49
|
+
* \`vgeo_select_cut\` term for term rather than merely in the limit.
|
|
112
50
|
*
|
|
113
51
|
* Two conventions carry real weight. A zero error projects to zero **unconditionally**, so a leaf
|
|
114
52
|
* — whose error is exactly zero — does not become undrawable the moment the camera enters its
|
|
@@ -157,4 +95,4 @@ fn vg_sphere_outside_frustum(instance_base: u32, sphere: vec4<f32>) -> bool {
|
|
|
157
95
|
|
|
158
96
|
return false;
|
|
159
97
|
}
|
|
160
|
-
`, []);
|
|
98
|
+
`, [chunk_vgeo_cut_arena]);
|