@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
|
@@ -11,6 +11,7 @@ import { CodeChunk } from "../compiler/CodeChunk.js";
|
|
|
11
11
|
import { parse_wgsl_type } from "../type/parse_wgsl_type.js";
|
|
12
12
|
import { type_has_arrays } from "../type/type_has_arrays.js";
|
|
13
13
|
import { type_has_atomics } from "../type/type_has_atomics.js";
|
|
14
|
+
import { WebGPUStruct } from "../type/WebGPUStruct.js";
|
|
14
15
|
import { write_wgsl_type_value } from "../type/serde/write_gpu_typed_buffer.js";
|
|
15
16
|
import { IMMEDIATE_ADDRESS_SPACE_EXTENSION, IMMEDIATE_SIZE_FLOOR } from "./IMMEDIATE_DATA.js";
|
|
16
17
|
import { ResourceType } from "./ResourceType.js";
|
|
@@ -226,7 +227,14 @@ export class ShaderResourceSetDescriptor {
|
|
|
226
227
|
);
|
|
227
228
|
}
|
|
228
229
|
|
|
229
|
-
|
|
230
|
+
// The top-level member names, kept so that `writeImmediate` can tell a value of this type
|
|
231
|
+
// from something that merely happens to be an object. `undefined` for a scalar, vector or
|
|
232
|
+
// matrix immediate, which has no members to name.
|
|
233
|
+
const field_names = type instanceof WebGPUStruct
|
|
234
|
+
? type.fields.map(field => field.name)
|
|
235
|
+
: undefined;
|
|
236
|
+
|
|
237
|
+
this.#immediate = { name, type, field_names };
|
|
230
238
|
|
|
231
239
|
return this;
|
|
232
240
|
}
|
|
@@ -561,27 +569,73 @@ export class ShaderResourceSetDescriptor {
|
|
|
561
569
|
);
|
|
562
570
|
}
|
|
563
571
|
|
|
572
|
+
// Refuse a value of the wrong shape rather than serialise what it does not contain.
|
|
573
|
+
//
|
|
574
|
+
// The whole declared range travels every dispatch, and the zeroes this method clears it to are
|
|
575
|
+
// indistinguishable from deliberate ones: every slot ends up *set*, so WebGPU's immediate
|
|
576
|
+
// validation — and the software device's copy of it — has nothing to report. A wrong-shaped
|
|
577
|
+
// value therefore reaches the shader as zeroes, silently, and the only symptom is wrong
|
|
578
|
+
// output. That is what a call site left behind by the uniform -> immediate migration does: it
|
|
579
|
+
// keeps handing over the transient GPUBuffer the uniform needed, `generateBindings` ignores
|
|
580
|
+
// the extra key so the buffer is never bound, and nothing on a GPUBuffer matches the type.
|
|
581
|
+
//
|
|
582
|
+
// A value that names *some* of the members is left alone. Structs carry explicit padding
|
|
583
|
+
// members the CPU side has no value for, and skipping absent fields is load-bearing anyway
|
|
584
|
+
// (GPUTypedTable#set_range writes one member of a record through the same serialiser). Only a
|
|
585
|
+
// value that could not have populated the type at all is an unambiguous mistake.
|
|
586
|
+
const field_names = immediate.field_names;
|
|
587
|
+
|
|
588
|
+
if (field_names === undefined) {
|
|
589
|
+
// Scalar, vector or matrix: the serialiser reads the value as a number or indexes it.
|
|
590
|
+
const usable = typeof value === "number"
|
|
591
|
+
|| typeof value === "boolean"
|
|
592
|
+
|| typeof value[0] === "number";
|
|
593
|
+
|
|
594
|
+
if (!usable) {
|
|
595
|
+
throw new Error(
|
|
596
|
+
`Immediate data '${immediate.name}' of type '${immediate.type}' was given a value the`
|
|
597
|
+
+ ` serialiser cannot read as a number: '${value}'. An immediate takes the plain value,`
|
|
598
|
+
+ ` not something bindable — a GPUBuffer is what a *uniform* binding wants, and one`
|
|
599
|
+
+ ` passed here is ignored by generateBindings and would serialise as zeroes.`
|
|
600
|
+
);
|
|
601
|
+
}
|
|
602
|
+
} else if (!value_names_a_member(value, field_names)) {
|
|
603
|
+
// Note: no `${immediate.type}` in the message. Interpolating a struct type runs its whole
|
|
604
|
+
// WGSL declaration through the code generator, and the member list is the actionable half
|
|
605
|
+
// of that anyway.
|
|
606
|
+
throw new Error(
|
|
607
|
+
`Immediate data '${immediate.name}' was given a value naming none of its members`
|
|
608
|
+
+ ` (${field_names.join(', ')}), so the dispatch would have read zeroes. An immediate`
|
|
609
|
+
+ ` takes the plain value — '{ ${field_names[0]}: ... }' — not`
|
|
610
|
+
+ ` something bindable: a GPUBuffer is what a *uniform* binding wants, and one passed`
|
|
611
|
+
+ ` here is ignored by generateBindings and serialises to nothing.`
|
|
612
|
+
);
|
|
613
|
+
}
|
|
614
|
+
|
|
564
615
|
const start = buffer.position;
|
|
565
616
|
const size = this.immediateSize;
|
|
566
617
|
|
|
567
618
|
buffer.ensureCapacity(start + size);
|
|
568
619
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
// Zero-fill out to the declared size rather than stopping where the last member ended.
|
|
620
|
+
// Clear the whole declared range up front, rather than filling in from wherever the
|
|
621
|
+
// serialiser's cursor stopped.
|
|
572
622
|
//
|
|
573
|
-
//
|
|
574
|
-
// `{vec4f, u32}`, 20 bytes written of a
|
|
575
|
-
//
|
|
576
|
-
//
|
|
577
|
-
// the pipeline layout declares,
|
|
578
|
-
// nobody changes how either number is derived.
|
|
579
|
-
//
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
623
|
+
// Two reasons, and the second is the one that bites. The first: the serialiser stops after the
|
|
624
|
+
// final member, so a struct with trailing padding — say `{vec4f, u32}`, 20 bytes written of a
|
|
625
|
+
// 32-byte type — leaves a tail. That tail is padding, WebGPU's AccessibleSlots excludes
|
|
626
|
+
// padding, and a short write would in fact validate; it would also make the bytes handed to
|
|
627
|
+
// `setImmediates` shorter than the `immediateSize` the pipeline layout declares, true-but-subtle
|
|
628
|
+
// in a way that only holds as long as nobody changes how either number is derived.
|
|
629
|
+
//
|
|
630
|
+
// The second: this buffer is one scratch region reused by every dispatch of a context, and it
|
|
631
|
+
// is only ever written over, never cleared. A member the value did not name is skipped, and a
|
|
632
|
+
// skipped member before the final one is not in the tail — filling from the cursor left it
|
|
633
|
+
// holding the bytes the *previous* dispatch put at that offset. A partial value is legal (see
|
|
634
|
+
// above), so that made one dispatch's immediate data a function of the one before it. Clearing
|
|
635
|
+
// first closes the holes and the tail together, and costs at most 64 bytes of memset.
|
|
636
|
+
buffer.raw_bytes.fill(0, start, start + size);
|
|
637
|
+
|
|
638
|
+
write_wgsl_type_value(value, buffer, immediate.type);
|
|
585
639
|
|
|
586
640
|
buffer.position = start + size;
|
|
587
641
|
|
|
@@ -589,6 +643,28 @@ export class ShaderResourceSetDescriptor {
|
|
|
589
643
|
}
|
|
590
644
|
}
|
|
591
645
|
|
|
646
|
+
/**
|
|
647
|
+
* Whether `value` carries at least one of `field_names`.
|
|
648
|
+
*
|
|
649
|
+
* A plain loop, and a free function rather than a closure over `value`, because
|
|
650
|
+
* {@link ShaderResourceSetDescriptor#writeImmediate} runs once per dispatch and allocates nothing.
|
|
651
|
+
*
|
|
652
|
+
* @param {Object} value
|
|
653
|
+
* @param {string[]} field_names
|
|
654
|
+
* @returns {boolean}
|
|
655
|
+
*/
|
|
656
|
+
function value_names_a_member(value, field_names) {
|
|
657
|
+
const count = field_names.length;
|
|
658
|
+
|
|
659
|
+
for (let i = 0; i < count; i++) {
|
|
660
|
+
if (value[field_names[i]] !== undefined) {
|
|
661
|
+
return true;
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
return false;
|
|
666
|
+
}
|
|
667
|
+
|
|
592
668
|
/**
|
|
593
669
|
* Special immutable empty set
|
|
594
670
|
* @readonly
|
|
@@ -90,6 +90,10 @@ export class GPUViewContext {
|
|
|
90
90
|
* @returns {GPUCameraContext}
|
|
91
91
|
*/
|
|
92
92
|
get gpu_previous_camera_state(): GPUCameraContext;
|
|
93
|
+
/**
|
|
94
|
+
* @return {VGeoViewCut}
|
|
95
|
+
*/
|
|
96
|
+
get virtual_geometry_cut(): VGeoViewCut;
|
|
93
97
|
/**
|
|
94
98
|
*
|
|
95
99
|
* @return {GPUCameraContext}
|
|
@@ -136,4 +140,5 @@ import { HierarchicalZBuffer } from "../hiz/HierarchicalZBuffer.js";
|
|
|
136
140
|
import { GPUTypedBuffer } from "../buffer/GPUTypedBuffer.js";
|
|
137
141
|
import { GPUViewVolumetrics } from "../volumetrics/GPUViewVolumetrics.js";
|
|
138
142
|
import { GPUCameraContext } from "../camera/GPUCameraContext.js";
|
|
143
|
+
import { VGeoViewCut } from "../geometry/virtual/runtime/VGeoViewCut.js";
|
|
139
144
|
//# sourceMappingURL=GPUViewContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUViewContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewContext.js"],"names":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"GPUViewContext.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/view/GPUViewContext.js"],"names":[],"mappings":";;;;;;;;AAgCA;;GAEG;AACH;IAiPI;;;;;OAKG;IACH,sBAJW,eAAe,SACf,eAAe,UACf,gBAAgB,EAyB1B;IA5QD;;;OAGG;IACH,aAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,OAFU,MAAM,CAEL;IAuBX;;;;OAIG;IACH,mBAHW,MAAM,KACN,MAAM,QAiBhB;IAED;;;;OAIG;IACH,aAHW,MAAM,KACN,MAAM,QAQhB;IAED;;;;OAIG;IACH,kBAHW,MAAM,KACN,MAAM,QAOhB;IAED,wEAAwE;IACxE,2BAAqC;IAErC,6BAA6B;IAC7B,8BAEC;IAQD;;;OAGG;IACH,0BAEC;IAED;;;;OAIG;IACH,mBAHW,MAAM,KACN,MAAM,QAUhB;IAgBD;;;OAGG;IACH,kDAEC;IAdD;;;OAGG;IACH,iDAEC;IAgBD;;;OAGG;IACH,qCAEC;IAQD;;;OAGG;IACH,sCAEC;IA4BD;;;OAGG;IACH,mDAEC;IAdD;;;OAGG;IACH,kDAEC;IAyBD;;OAEG;IACH,wCAEC;IAED;;;OAGG;IACH,+BAEC;IAED;;;OAGG;IACH,mEAEC;IAiCD;;;;OAIG;IACH,cAHW,cAAc,GACZ,OAAO,CAWnB;IAED;;;OAGG;IACH,QAFY,MAAM,CAIjB;IAED,wBA6BC;IAGD;;;OAGG;IACH,YAFW,eAAe,QAWzB;IAED;;OAEG;IACH,0BAFW,sBAAsB,QAShC;IAED,gBAkBC;IAGL;;;OAGG;IACH,2BAFU,OAAO,CAEwB;;CANxC;qCA1YY,OAAO,wCAAwC,EAAE,sBAAsB;8BACvE,OAAO,uBAAuB,EAAE,eAAe;8BAC/C,OAAO,6BAA6B,EAAE,eAAe;oCAP9B,+BAA+B;+BAHpC,6BAA6B;mCAIzB,sCAAsC;iCAHxC,+BAA+B;4BACpC,4CAA4C"}
|
|
@@ -7,6 +7,7 @@ import Vector3 from "../../../core/geom/Vector3.js";
|
|
|
7
7
|
import { queue_typed_buffer_update } from "../shader/type/queue_typed_buffer_update.js";
|
|
8
8
|
import { GPUTypedBuffer } from "../buffer/GPUTypedBuffer.js";
|
|
9
9
|
import { GPUCameraContext } from "../camera/GPUCameraContext.js";
|
|
10
|
+
import { VGeoViewCut } from "../geometry/virtual/runtime/VGeoViewCut.js";
|
|
10
11
|
import { HierarchicalZBuffer } from "../hiz/HierarchicalZBuffer.js";
|
|
11
12
|
import { GPUViewVolumetrics } from "../volumetrics/GPUViewVolumetrics.js";
|
|
12
13
|
import { VIEW_UNIFORM_STRUCT } from "./VIEW_UNIFORM_STRUCT.js";
|
|
@@ -241,6 +242,22 @@ export class GPUViewContext {
|
|
|
241
242
|
#device;
|
|
242
243
|
|
|
243
244
|
|
|
245
|
+
/**
|
|
246
|
+
* What cutting virtual geometry is per view: this view's params, and the state a cut
|
|
247
|
+
* kept between frames would live in. Held here for the same reason the HZB is —
|
|
248
|
+
* two views must not share it.
|
|
249
|
+
*
|
|
250
|
+
* @type {VGeoViewCut}
|
|
251
|
+
*/
|
|
252
|
+
#virtual_geometry_cut;
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* @return {VGeoViewCut}
|
|
256
|
+
*/
|
|
257
|
+
get virtual_geometry_cut() {
|
|
258
|
+
return this.#virtual_geometry_cut;
|
|
259
|
+
}
|
|
260
|
+
|
|
244
261
|
/**
|
|
245
262
|
*
|
|
246
263
|
* @return {GPUCameraContext}
|
|
@@ -284,6 +301,8 @@ export class GPUViewContext {
|
|
|
284
301
|
|
|
285
302
|
this.#volumetrics = new GPUViewVolumetrics(this, device);
|
|
286
303
|
|
|
304
|
+
this.#virtual_geometry_cut = new VGeoViewCut({ device, label: this.label });
|
|
305
|
+
|
|
287
306
|
}
|
|
288
307
|
|
|
289
308
|
/**
|
|
@@ -385,6 +404,8 @@ export class GPUViewContext {
|
|
|
385
404
|
this.#hierarchical_z_buffer.destroy();
|
|
386
405
|
|
|
387
406
|
this.#volumetrics.destroy();
|
|
407
|
+
|
|
408
|
+
this.#virtual_geometry_cut.destroy();
|
|
388
409
|
}
|
|
389
410
|
}
|
|
390
411
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":"AA0PA;;;;;;;;;;;;GAYG;AACH,+BAFU,MAAM,
|
|
1
|
+
{"version":3,"file":"WGSLLanguageCore.d.ts","sourceRoot":"","sources":["../../../../../src/shade/wgsl/emulator/WGSLLanguageCore.js"],"names":[],"mappings":"AA0PA;;;;;;;;;;;;GAYG;AACH,+BAFU,MAAM,CAykCd"}
|
|
@@ -1166,6 +1166,28 @@ export const WGSLLanguageCore = {
|
|
|
1166
1166
|
return { old_value: old, exchanged: false };
|
|
1167
1167
|
},
|
|
1168
1168
|
|
|
1169
|
+
// ---------------------------------------------------------------------
|
|
1170
|
+
// Runtime-sized arrays
|
|
1171
|
+
// ---------------------------------------------------------------------
|
|
1172
|
+
|
|
1173
|
+
/**
|
|
1174
|
+
* WGSL's `arrayLength(&a)` — how many elements of a runtime-sized array the *binding* covers.
|
|
1175
|
+
*
|
|
1176
|
+
* The compiler has already reduced `&a` to `a` itself, so what arrives is the bound value: a
|
|
1177
|
+
* typed array, or a plain array for a binding of structs. Its length is the answer, and the
|
|
1178
|
+
* binding a spec supplies is therefore what decides it — which is the point. Every collection
|
|
1179
|
+
* in this engine is a `count` in front of a runtime-sized `elements`, and the count is produced
|
|
1180
|
+
* by an unconditional `atomicAdd` whose element write alone is bounded, so the count can run
|
|
1181
|
+
* past what the collection holds. `min(count, arrayLength(&elements))` is how a consumer reads
|
|
1182
|
+
* such a collection, and without this a kernel that does so could not be emulated at all.
|
|
1183
|
+
*
|
|
1184
|
+
* @param {ArrayLike<*>} a
|
|
1185
|
+
* @returns {number}
|
|
1186
|
+
*/
|
|
1187
|
+
arrayLength(a) {
|
|
1188
|
+
return a.length;
|
|
1189
|
+
},
|
|
1190
|
+
|
|
1169
1191
|
// ---------------------------------------------------------------------
|
|
1170
1192
|
// Barriers — no-ops when running pointwise (one thread).
|
|
1171
1193
|
// ---------------------------------------------------------------------
|
|
@@ -1187,12 +1209,61 @@ export const WGSLLanguageCore = {
|
|
|
1187
1209
|
// pointwise there is exactly one, so the answer is the caller's own value — which is also the
|
|
1188
1210
|
// only value a shader can soundly rely on it for: one that broadcasts something its lanes
|
|
1189
1211
|
// disagree on has made its result depend on which lane the hardware counts as first, and no
|
|
1190
|
-
// CPU model reproduces that.
|
|
1191
|
-
//
|
|
1192
|
-
//
|
|
1212
|
+
// CPU model reproduces that.
|
|
1213
|
+
//
|
|
1214
|
+
// The reductions and the shuffle below are the same identity, and they were left out on the
|
|
1215
|
+
// argument that "a reduction over one lane would pass tests a real wave fails". That argument
|
|
1216
|
+
// is right about what they cover and wrong about the alternative, because there is no
|
|
1217
|
+
// alternative: a subgroup kernel has to be correct at **every** width, WGSL promising nothing
|
|
1218
|
+
// about which one a device hands it, and one is a width a device may hand it. Refusing to model
|
|
1219
|
+
// it does not test the wide case — it leaves the kernel with no CPU-tier coverage at all,
|
|
1220
|
+
// including of the part that has nothing to do with width.
|
|
1221
|
+
//
|
|
1222
|
+
// So: width one is a configuration, not a stand-in for a wave. What these cover is a kernel's
|
|
1223
|
+
// *semantics* at that width. What they cannot cover is the redistribution itself — whether
|
|
1224
|
+
// lanes pack their neighbours' work correctly — and that needs a real device and a test that
|
|
1225
|
+
// varies the counts across lanes. Anything relying on more than one lane being live must say so
|
|
1226
|
+
// and be tested there.
|
|
1227
|
+
//
|
|
1228
|
+
// A shader that would diverge between width one and width thirty-two is a shader that has read
|
|
1229
|
+
// something other than its own lane's value out of these, and that is exactly what the wide
|
|
1230
|
+
// test is for.
|
|
1193
1231
|
|
|
1194
1232
|
subgroupBroadcastFirst(value) { return value; },
|
|
1195
1233
|
|
|
1234
|
+
// The reduction over a subgroup of one is that one's value.
|
|
1235
|
+
subgroupAdd(value) { return value; },
|
|
1236
|
+
subgroupMul(value) { return value; },
|
|
1237
|
+
subgroupMin(value) { return value; },
|
|
1238
|
+
subgroupMax(value) { return value; },
|
|
1239
|
+
subgroupAnd(value) { return value; },
|
|
1240
|
+
subgroupOr(value) { return value; },
|
|
1241
|
+
subgroupXor(value) { return value; },
|
|
1242
|
+
|
|
1243
|
+
// Scans: exclusive of the only lane is the identity, inclusive of it is its value.
|
|
1244
|
+
subgroupExclusiveAdd() { return 0; },
|
|
1245
|
+
subgroupExclusiveMul() { return 1; },
|
|
1246
|
+
subgroupInclusiveAdd(value) { return value; },
|
|
1247
|
+
subgroupInclusiveMul(value) { return value; },
|
|
1248
|
+
|
|
1249
|
+
// Lane 0 is the only lane, so it is elected and it is the only one a shuffle can name. An `id`
|
|
1250
|
+
// of anything else is reading a lane that does not exist, which on a device is an undefined
|
|
1251
|
+
// value rather than an error — here it is an error, because a CPU model that invents one is how
|
|
1252
|
+
// a kernel indexing lanes by arithmetic passes.
|
|
1253
|
+
subgroupElect() { return true; },
|
|
1254
|
+
|
|
1255
|
+
subgroupShuffle(value, id) {
|
|
1256
|
+
if (id !== 0) {
|
|
1257
|
+
throw new Error(
|
|
1258
|
+
`subgroupShuffle(e, ${id}): the emulated subgroup is one lane wide, so 0 is the only`
|
|
1259
|
+
+ ` lane there is to read. A kernel that needs a wider one has to be tested on a`
|
|
1260
|
+
+ ` device.`
|
|
1261
|
+
);
|
|
1262
|
+
}
|
|
1263
|
+
|
|
1264
|
+
return value;
|
|
1265
|
+
},
|
|
1266
|
+
|
|
1196
1267
|
// ---------------------------------------------------------------------
|
|
1197
1268
|
// Fragment-stage derivatives — unsupported because we run a single pixel.
|
|
1198
1269
|
// ---------------------------------------------------------------------
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
# `.vgeo` viewer
|
|
2
|
-
|
|
3
|
-
An interactive viewer for the virtual-geometry container. Run the dev server and open it:
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npm run dev --workspace @woosh/meep-engine
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
<http://localhost:5173/src/shade/playground/vgeo_viewer/index.html>
|
|
10
|
-
|
|
11
|
-
Nothing loads by itself. **Drop a `.vgeo` anywhere on the page**, pass `?file=/data/models/….vgeo`
|
|
12
|
-
to open one by URL — which is what makes a particular view of a particular asset a bookmark — or
|
|
13
|
-
press **build a sample asset**, which runs the builder in the page over a torus and opens the
|
|
14
|
-
container it produces. `?sample` does the last one on load.
|
|
15
|
-
|
|
16
|
-
## What is on screen
|
|
17
|
-
|
|
18
|
-
Not the asset — the **cut**: the clusters the container's own metric selects for where the camera is
|
|
19
|
-
standing, coloured so the seams between them are visible, with the cluster count on screen.
|
|
20
|
-
|
|
21
|
-
**The cut is frozen until you ask for a new one.** *Adapt to view* re-runs the traversal at wherever
|
|
22
|
-
the camera is now; everything after that is you flying around a decision taken from somewhere else,
|
|
23
|
-
which is the only way to see what a cut actually selected. *Follow the camera* makes it chase
|
|
24
|
-
instead. *tau* is the one quality dial — pixels of permitted error.
|
|
25
|
-
|
|
26
|
-
Drawing goes through Shade's direct geometry path (a `DynamicMesh` from raw attributes, no meshlet
|
|
27
|
-
encode) because a cut is rebuilt from scratch on every adapt, and it is drawn opaque so the depth
|
|
28
|
-
buffer orders its own triangles.
|
|
29
|
-
|
|
30
|
-
## What makes it a streaming viewer
|
|
31
|
-
|
|
32
|
-
The reader under it never holds the whole file. Opening a container reads the header, the level
|
|
33
|
-
table and the root frame — `VGEO_FORMAT.md` §10's always-resident set, two range requests — and
|
|
34
|
-
after that a page arrives only because a traversal asked for it, from exactly the byte range the
|
|
35
|
-
page pointing at it wrote down.
|
|
36
|
-
|
|
37
|
-
So a cut can be taken before the file has finished arriving, and this is the interesting part: it is
|
|
38
|
-
**clamped, not wrong**. Where the page holding a refinement is missing, the coarser cluster is drawn
|
|
39
|
-
and a *want* is recorded, and the surface is watertight either way.
|
|
40
|
-
|
|
41
|
-
"Missing" there means §10's *selectable*, not merely resident: a group is refined into only once
|
|
42
|
-
every page holding one of its parents is here. A group's parents are made by one simplification step
|
|
43
|
-
but grouped for the next one separately, so an asset of more than a page per band puts some of them
|
|
44
|
-
in different pages — and refining into a group because its own page arrived, while a coarse cluster
|
|
45
|
-
still stands in for a parent that has not, draws both over the same surface. Those clamps carry no
|
|
46
|
-
want, because there is nothing to fetch from a cluster that already has the bytes it points at; the
|
|
47
|
-
panel counts them under *of those, on a parent*.
|
|
48
|
-
|
|
49
|
-
Three controls turn that into something you can watch:
|
|
50
|
-
|
|
51
|
-
| control | what it shows |
|
|
52
|
-
|---|---|
|
|
53
|
-
| **colour by clamp** | amber where the surface is standing in for a page that has not arrived, slate where the cut is the one the file selects |
|
|
54
|
-
| **stream *n* wanted page(s)** | installs eight of them, retakes the cut, repeats — refinement happening in steps rather than in one jump |
|
|
55
|
-
| **evict everything but the root** | back to cold, so it arrives again |
|
|
56
|
-
|
|
57
|
-
The **streaming** panel is the measurement: `read so far` against the file's own size, the request
|
|
58
|
-
count, what the cold start cost, and how many pages are resident. On anything larger than a toy the
|
|
59
|
-
first of those is a small fraction, and that is the whole claim.
|
|
60
|
-
|
|
61
|
-
**head prefix** re-opens the current file from cold under a different one. §10 offers a reader two
|
|
62
|
-
cold starts — the 256-byte header and then one exact range per wanted page, or one speculative
|
|
63
|
-
prefix that brings the head and whatever else it happens to cover — and this is the dial between
|
|
64
|
-
them. Coarse-first layout is what makes the second worth doing: a prefix that overshoots the root
|
|
65
|
-
frame has overshot into the pages the traversal is about to want. Watch `read so far` and `requests`
|
|
66
|
-
move against each other. `?head=<bytes>` sets it on load.
|
|
67
|
-
|
|
68
|
-
**head prefix** on the streaming panel is what is still *held*, and it says `released` for most of a
|
|
69
|
-
session: the reader drops the prefix the first time a read falls outside it, because after the pages
|
|
70
|
-
inside it have installed it is bytes nothing will read — and at a thousand open assets a retained
|
|
71
|
-
256 KiB apiece was a quarter of a gigabyte that neither `resident` nor eviction could see. The
|
|
72
|
-
always-resident set is about 2.4 KB, so the prefix is speculation about the next band and 64 KiB is
|
|
73
|
-
enough of it; the dial is there to watch the trade rather than to tune it.
|
|
74
|
-
|
|
75
|
-
**quarantined** is the other new row, and it is the difference between an asset that is coarse
|
|
76
|
-
because the camera just moved and one that is coarse because a page will never arrive — which look
|
|
77
|
-
identical on screen. A page that fails its retries is quarantined with its reason and is not asked
|
|
78
|
-
for again; the clamped cut keeps its surface correct with a coarser ancestor, indefinitely.
|
|
79
|
-
|
|
80
|
-
`read so far` is cumulative and is allowed past 100%: evicting and re-streaming really does fetch
|
|
81
|
-
those pages again, and the audit really does read every byte.
|
|
82
|
-
|
|
83
|
-
## Validation is optional and off
|
|
84
|
-
|
|
85
|
-
**Validation is off by default and is not a precondition for anything.** It reads the whole file —
|
|
86
|
-
every frame, every checksum, the directory against a full frame scan — which is exactly what an
|
|
87
|
-
incremental reader exists to avoid, and it answers a question about whoever *wrote* the file rather
|
|
88
|
-
than about the view being put on screen. Press **validate the whole file** when that is the
|
|
89
|
-
question, or pass `?validate`.
|
|
90
|
-
|
|
91
|
-
It is not a method on the reader, either. `vgeo_audit_container` and `vgeo_install_all_pages` live in
|
|
92
|
-
`format/read/tool/`, and this viewer calls them as the tool it is — a renderer holding a thousand
|
|
93
|
-
containers must not have either within reach of one of them. The audit takes the file as a single
|
|
94
|
-
`ArrayBuffer`, because every build invariant is a cross-check between two places in it, so it refuses
|
|
95
|
-
above 1 GiB naming the size rather than failing in the allocator.
|
|
96
|
-
|
|
97
|
-
What is *not* optional, because it is the difference between refusing a file and misreading one:
|
|
98
|
-
magic, minimum reader version, payload encoding, hash algorithm, unknown required feature bits,
|
|
99
|
-
unknown codecs, a `decoded_size` outside what the stored bytes could physically produce, and a root
|
|
100
|
-
frame that disagrees with the header about its own size. Those are §4 and §10 reject rules and they
|
|
101
|
-
always run.
|
|
102
|
-
|
|
103
|
-
**verify each frame's checksum** sits between the two. A frame's identity-seeded checksum covers
|
|
104
|
-
only that frame, so it is verified from bytes just fetched, with no extra request and no whole-file
|
|
105
|
-
pass — §10 requires it of a runtime, where a quarantined page is the difference between a coarse
|
|
106
|
-
stand-in and a wrong surface. Off here for the same reason the audit is: hashing every installed
|
|
107
|
-
byte costs something, and a tool looking at a file it just built is not defending against a network.
|
|
108
|
-
It is read per fetch, so ticking it applies to the next page rather than to a reopen. `?verify` sets
|
|
109
|
-
it on load.
|
|
110
|
-
|
|
111
|
-
## What lives where
|
|
112
|
-
|
|
113
|
-
The reader is **not** part of this page. It is `renderer/geometry/virtual/format/read/`, it is the
|
|
114
|
-
shape a runtime would use, and it knows nothing about drawing:
|
|
115
|
-
|
|
116
|
-
| | |
|
|
117
|
-
|---|---|
|
|
118
|
-
| `VGeoByteSource` | a range at a time, over an `ArrayBuffer` or a dropped `Blob` |
|
|
119
|
-
| `vgeo_fetch_byte_source` | the same over HTTP, refusing a `200` where it asked for a range |
|
|
120
|
-
| `vgeo_read_header` | header and level table, with §4's reject rules |
|
|
121
|
-
| `vgeo_read_page` | one fetched frame → one `VGeoPage`; needs nothing else |
|
|
122
|
-
| `VGeoPage` | a page's own bytes and its own cluster/group/child tables |
|
|
123
|
-
| `VGeoContainerReader` | residency: open, install, evict, and the optional audit |
|
|
124
|
-
| `VGeoDirectory` | the auxiliary page directory, for reaching pages no traversal leads to |
|
|
125
|
-
|
|
126
|
-
What belongs to the page is everything above the bytes:
|
|
127
|
-
|
|
128
|
-
| | |
|
|
129
|
-
|---|---|
|
|
130
|
-
| `select_cut.js` | the traversal, the residency clamp, and the wants it records |
|
|
131
|
-
| `cut_geometry.js` | decoding selected clusters into one drawable geometry, and the colour modes |
|
|
132
|
-
| `sample_asset.js` | a container built in the page, so there is something to open |
|
|
133
|
-
| `main.js` | renderer, camera, panel, and the streaming loop |
|
|
134
|
-
|
|
135
|
-
## Driving it from a script
|
|
136
|
-
|
|
137
|
-
Everything is reachable from the console, which is what makes the page verifiable in a headless
|
|
138
|
-
browser rather than by a person watching it:
|
|
139
|
-
|
|
140
|
-
```js
|
|
141
|
-
await __open_sample(); // or __open_url('/data/….vgeo')
|
|
142
|
-
__vgeo.set_auto_stream(false);
|
|
143
|
-
__vgeo.reset_residency(); // back to the root page alone
|
|
144
|
-
__state(); // { resident_pages, bytes_read, clusters, clamped, wants, … }
|
|
145
|
-
await __stream(); // one round of eight pages, then a fresh cut
|
|
146
|
-
await __validate(); // the whole-file audit, as an array of defect strings
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
`__state()` is the one to assert on: `clamped` reaching zero is the cut having converged on what the
|
|
150
|
-
container selects, and it converges to the same numbers whatever order the pages arrived in.
|