@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
|
@@ -33,7 +33,7 @@ accepted-and-waiting one.
|
|
|
33
33
|
- **Cluster-count simplification target** `[M §2.2]`, and a minimum cluster fill through the
|
|
34
34
|
generalized leaf repack `[V §3.3]`.
|
|
35
35
|
- **Compactness-weighted cluster adjacency** `[M §2.3]` — `compactness()` in
|
|
36
|
-
`build/vgeo_build_levels.js`.
|
|
36
|
+
`build/level/vgeo_build_levels.js`.
|
|
37
37
|
- **Speculative groups, rejected individually** `[M §2.4]`.
|
|
38
38
|
- **Per-level summary table in the file head** `[V §4.1, §6.1]` — VGEO_FORMAT §4.1.
|
|
39
39
|
- **A traversal metric on the page DAG, and a group tree inside each page** `[V §2.1, §6.3]` —
|
|
@@ -72,12 +72,13 @@ accepted-and-waiting one.
|
|
|
72
72
|
362 non-root groups have split parents: 355 of 576 camera positions double-drew, up to 10.7%
|
|
73
73
|
of drawn triangles, before. Zero after. It reads as corrupt geometry rather than as a missing
|
|
74
74
|
page, which is why the tool that found it could not name it.
|
|
75
|
-
- **A CPU cut against a partially resident container** —
|
|
76
|
-
`
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
- **A CPU cut against a partially resident container** —
|
|
76
|
+
`runtime/cut/__fixtures__/vgeo_select_cut.js`. It is the runtime's rule rather than a debug
|
|
77
|
+
approximation of it, and `vgeo_select_cut.spec.js` holds it to the format's guarantees. A
|
|
78
|
+
`vgeo_viewer` playground used to draw it on screen through Shade's direct geometry path, which is
|
|
79
|
+
what made clamping, streaming and eviction watchable; once `playground/vgeo_runtime/` could show
|
|
80
|
+
all of that through the meshlet pipeline, the page was a second renderer and a second streaming
|
|
81
|
+
loop for no gain, and it was retired. The traversal stayed, because it is the oracle.
|
|
81
82
|
|
|
82
83
|
- **The GPU runtime** — `runtime/`, and [runtime/RUNTIME_PLAN.md](./runtime/RUNTIME_PLAN.md) for the
|
|
83
84
|
design and the adversarial review that reshaped it. The cut is a wavefront BFS over the page DAG
|
|
@@ -95,7 +96,7 @@ accepted-and-waiting one.
|
|
|
95
96
|
evaluator does not. §6 states the fact without stating it as a term of the rule, because §4 was
|
|
96
97
|
written for a traversal.
|
|
97
98
|
- **Page size decides whether that state is even reachable.** At the 8 KB pages
|
|
98
|
-
`
|
|
99
|
+
`vgeo_select_cut.spec.js` uses, a torus puts exactly one group in every page — so a blocked group is
|
|
99
100
|
a blocked page, no page is ever mixed, and no page is ever entered twice. Measured: 40 pages
|
|
100
101
|
withheld one at a time and 60 random residency subsets produced *no* mixed page. At 64 KB the
|
|
101
102
|
median page holds eight groups and it is ordinary. A spec for anything about mixed selectability
|
|
@@ -120,7 +121,7 @@ prefetch.
|
|
|
120
121
|
### 2.1 A partitioning fallback for when METIS fails `[M §3.3]`, `[V §3.2]` — LANDED
|
|
121
122
|
|
|
122
123
|
`core/graph/graph_partition_spectral.js` — recursive spectral bisection over CSR, matrix-free,
|
|
123
|
-
signature-compatible with `metis_partition_kway`. `build/vgeo_partition_graph.js` tries METIS
|
|
124
|
+
signature-compatible with `metis_partition_kway`. `build/partition/vgeo_partition_graph.js` tries METIS
|
|
124
125
|
and falls back to it; both of the builder's partitioning sites go through that wrapper.
|
|
125
126
|
|
|
126
127
|
Notes worth keeping:
|
|
@@ -212,7 +213,7 @@ installed page can be re-tested without walking back to its parent.
|
|
|
212
213
|
width at the top. This one has *no* paging question by construction: it is inside a page, it
|
|
213
214
|
ships and evicts with it, and it cannot dangle.
|
|
214
215
|
|
|
215
|
-
Both landed together; VGEO_FORMAT §6.1–6.2 specifies them, `build/vgeo_build_page_nodes.js`
|
|
216
|
+
Both landed together; VGEO_FORMAT §6.1–6.2 specifies them, `build/page/vgeo_build_page_nodes.js`
|
|
216
217
|
builds them. Notes worth keeping:
|
|
217
218
|
|
|
218
219
|
- The tree needs no partitioner. A page's groups arrive in Morton order of their centroid, so
|
|
@@ -243,7 +244,7 @@ for the first few bands, which are also the cheapest to walk.
|
|
|
243
244
|
LOD-metric sphere and error range (VGEO_FORMAT §5, §6.2), and every page carries a fanout-4 tree
|
|
244
245
|
over its own groups (§6.1). The writer emits them, `vgeo_validate_container` checks them
|
|
245
246
|
(§11.10–11.11) with corruption tests behind both checks, and **nothing reads either**.
|
|
246
|
-
`VGeoPage` records `node_count` and stops; `
|
|
247
|
+
`VGeoPage` records `node_count` and stops; `vgeo_select_cut` descends group by group.
|
|
247
248
|
|
|
248
249
|
This is not a defect to fix on its own account. Building a consumer for its own sake would fix
|
|
249
250
|
the interface before the pass that has to live with it, and the CPU traversal does not need the
|
|
@@ -339,9 +340,11 @@ several cuts per frame for exactly this reason.
|
|
|
339
340
|
|
|
340
341
|
So the plan is **a cut per view**, with the setup shared rather than the result: the traversal
|
|
341
342
|
kernel, the residency state, and the page working set are all view-independent, and only the
|
|
342
|
-
projection and threshold differ.
|
|
343
|
-
|
|
344
|
-
|
|
343
|
+
projection and threshold differ. That half is built — a cut runs per expansion site per view, and
|
|
344
|
+
what it costs is measured in CUT_PLAN_2026_09_14 §0, which also plans to keep each view's cut
|
|
345
|
+
between frames rather than re-walking it from the root. And where a view does not justify a cut
|
|
346
|
+
at all — a distant cascade, a low-resolution reflection — it should be able to take a proxy
|
|
347
|
+
(§3.2) instead. That choice belongs to the view, not to the geometry.
|
|
345
348
|
|
|
346
349
|
### 3.4 GPU-driven allocation `[V §4.3]`
|
|
347
350
|
|
|
@@ -17,6 +17,24 @@ export class VGeoBuildOptions {
|
|
|
17
17
|
* @type {number}
|
|
18
18
|
*/
|
|
19
19
|
codec: number;
|
|
20
|
+
/**
|
|
21
|
+
* How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
|
|
22
|
+
* top of the reference's hash-chain levels.
|
|
23
|
+
*
|
|
24
|
+
* **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
|
|
25
|
+
* container built at any of them reads in every build of the reader that exists; the level is
|
|
26
|
+
* how long the *encoder* spent, and that is all.
|
|
27
|
+
*
|
|
28
|
+
* Nine rather than twelve because the ladder above it is not worth its time on this payload:
|
|
29
|
+
* measured over 2,718 real pages, the whole run from 3 to 12 is 0.077 percentage points of
|
|
30
|
+
* ratio, and 10 to 12 cost 15-40% more time for the last thousandth of it. Nine rather than
|
|
31
|
+
* three for the same reason in the other direction — it is 0.077 points smaller for about 5%
|
|
32
|
+
* more time. Nine rather than one because the fast encoder gives up 2.5% of every page to save
|
|
33
|
+
* compression time that is a couple of percent of a build.
|
|
34
|
+
*
|
|
35
|
+
* @type {number}
|
|
36
|
+
*/
|
|
37
|
+
codec_level: number;
|
|
20
38
|
/**
|
|
21
39
|
* How close two source vertices have to be to count as one point, as a fraction of the
|
|
22
40
|
* geometry's own bounding-box diagonal. **Leave it alone.** It is the one knob here that can
|
|
@@ -68,5 +86,5 @@ export class VGeoBuildOptions {
|
|
|
68
86
|
*/
|
|
69
87
|
level_options: VGeoLevelOptions;
|
|
70
88
|
}
|
|
71
|
-
import { VGeoLevelOptions } from "./VGeoLevelOptions.js";
|
|
89
|
+
import { VGeoLevelOptions } from "./level/VGeoLevelOptions.js";
|
|
72
90
|
//# sourceMappingURL=VGeoBuildOptions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VGeoBuildOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"VGeoBuildOptions.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH;IACI;;;;;;;;;;OAUG;IACH,OAFU,MAAM,CAEO;IAEvB;;;;;;;;;;;;;;;;OAgBG;IACH,aAFU,MAAM,CAEmB;IAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,YAFU,MAAM,CAEE;IAElB;;;;;;;;;;;;;;OAcG;IACH,mBAFU,MAAM,CAE2B;IAE3C;;OAEG;IACH,eAFU,gBAAgB,CAEa;CAC1C;iCA7FgC,6BAA6B"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { LZ4_LEVEL } from "../../../../../core/binary/lz4/LZ4_LEVEL.js";
|
|
1
2
|
import { VGEO_CODEC_LZ4 } from "../format/frame/VGEO_CODEC_LZ4.js";
|
|
2
3
|
import { VGEO_DEFAULT_PAGE_SIZE } from "../format/page/VGEO_DEFAULT_PAGE_SIZE.js";
|
|
3
|
-
import { VGeoLevelOptions } from "./VGeoLevelOptions.js";
|
|
4
|
+
import { VGeoLevelOptions } from "./level/VGeoLevelOptions.js";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Knobs the builder pipeline exposes.
|
|
@@ -22,6 +23,25 @@ export class VGeoBuildOptions {
|
|
|
22
23
|
*/
|
|
23
24
|
codec = VGEO_CODEC_LZ4;
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* How hard the codec looks for matches, from {@link LZ4_LEVEL}. Nine by default, which is the
|
|
28
|
+
* top of the reference's hash-chain levels.
|
|
29
|
+
*
|
|
30
|
+
* **It changes nothing about the file.** Every level writes the same LZ4 block format, so a
|
|
31
|
+
* container built at any of them reads in every build of the reader that exists; the level is
|
|
32
|
+
* how long the *encoder* spent, and that is all.
|
|
33
|
+
*
|
|
34
|
+
* Nine rather than twelve because the ladder above it is not worth its time on this payload:
|
|
35
|
+
* measured over 2,718 real pages, the whole run from 3 to 12 is 0.077 percentage points of
|
|
36
|
+
* ratio, and 10 to 12 cost 15-40% more time for the last thousandth of it. Nine rather than
|
|
37
|
+
* three for the same reason in the other direction — it is 0.077 points smaller for about 5%
|
|
38
|
+
* more time. Nine rather than one because the fast encoder gives up 2.5% of every page to save
|
|
39
|
+
* compression time that is a couple of percent of a build.
|
|
40
|
+
*
|
|
41
|
+
* @type {number}
|
|
42
|
+
*/
|
|
43
|
+
codec_level = LZ4_LEVEL.HC_DEFAULT;
|
|
44
|
+
|
|
25
45
|
/**
|
|
26
46
|
* How close two source vertices have to be to count as one point, as a fraction of the
|
|
27
47
|
* geometry's own bounding-box diagonal. **Leave it alone.** It is the one knob here that can
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gltf_open_document.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gltf_open_document.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js"],"names":[],"mappings":"AAyEA;;;;;;;;;;GAUG;AACH,8CARW,cAAc,yBACL,MAAM,KAAG,cAAc,4CAK9B,YAAY,CA+ExB;+BArJ8B,qBAAqB;6BACvB,mBAAmB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
+
import { Base64 } from "../../../../../../core/binary/base64/Base64.js";
|
|
2
3
|
import {
|
|
3
4
|
GLTF_BUFFER_VIEW_EXTENSIONS
|
|
4
5
|
} from "../../../../../../format/scene/gltf/ext/gltf_buffer_view_extensions.js";
|
|
@@ -26,6 +27,9 @@ import { GltfDocument } from "./GltfDocument.js";
|
|
|
26
27
|
/**
|
|
27
28
|
* Decode a `data:` URI's payload.
|
|
28
29
|
*
|
|
30
|
+
* Through {@link Base64} rather than `atob`: the decode is the engine's own, so the builder runs
|
|
31
|
+
* the same one everywhere and does not need a `atob` to exist on whatever it is running under.
|
|
32
|
+
*
|
|
29
33
|
* @param {string} uri
|
|
30
34
|
* @returns {Uint8Array}
|
|
31
35
|
* @throws {Error} for an encoding other than base64, which is the only one glTF defines
|
|
@@ -39,15 +43,7 @@ function read_data_uri(uri) {
|
|
|
39
43
|
throw new Error(`unsupported data URI encoding in '${header}'`);
|
|
40
44
|
}
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const result = new Uint8Array(binary.length);
|
|
45
|
-
|
|
46
|
-
for (let i = 0; i < binary.length; i++) {
|
|
47
|
-
result[i] = binary.charCodeAt(i);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return result;
|
|
46
|
+
return new Uint8Array(Base64.decode(uri.slice(comma + 1)));
|
|
51
47
|
}
|
|
52
48
|
|
|
53
49
|
/**
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One band of the DAG.
|
|
3
|
+
*
|
|
4
|
+
* A level is an ordinal, not a generation: `clusters` are the clusters the round of that index
|
|
5
|
+
* created, while `groups` are the groups the round *above* consumed — and those groups may hold
|
|
6
|
+
* clusters from any level at or below their own, because a cluster no round could use waits in the
|
|
7
|
+
* frontier until one can. What the ordinal guarantees is the only thing the format needs from it:
|
|
8
|
+
* every group sits strictly below the group holding its parents, so laying pages out by descending
|
|
9
|
+
* level makes every child reference point forward in the file.
|
|
10
|
+
*
|
|
11
|
+
* @author Alex Goldring
|
|
12
|
+
* @copyright Company Named Limited (c) 2026
|
|
13
|
+
*/
|
|
14
|
+
export class VGeoLevel {
|
|
15
|
+
/**
|
|
16
|
+
* `0` = leaves.
|
|
17
|
+
* @type {number}
|
|
18
|
+
*/
|
|
19
|
+
index: number;
|
|
20
|
+
/**
|
|
21
|
+
* The clusters this level's round created.
|
|
22
|
+
* @type {VirtualGeometryCluster[]}
|
|
23
|
+
*/
|
|
24
|
+
clusters: VirtualGeometryCluster[];
|
|
25
|
+
/**
|
|
26
|
+
* The groups that sit in this level's band — the ones the round above consumed. Empty for the
|
|
27
|
+
* top level until the caller assigns its root group.
|
|
28
|
+
* @type {VirtualGeometryGroup[]}
|
|
29
|
+
*/
|
|
30
|
+
groups: VirtualGeometryGroup[];
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=VGeoLevel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGeoLevel.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/VGeoLevel.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,UAFU,wBAAwB,CAEpB;IAEd;;;;OAIG;IACH,QAFU,sBAAsB,CAEpB;CACf"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the round loop of {@link vgeo_build_levels} is allowed to behave.
|
|
3
|
+
*
|
|
4
|
+
* @author Alex Goldring
|
|
5
|
+
* @copyright Company Named Limited (c) 2026
|
|
6
|
+
*/
|
|
7
|
+
export class VGeoLevelOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Clusters a group starts out holding. Grows when a round fails to make progress — small groups
|
|
10
|
+
* starve the simplifier (the locked perimeter dominates), large ones lock a big spatial
|
|
11
|
+
* footprint into LOD lockstep.
|
|
12
|
+
* @type {number}
|
|
13
|
+
*/
|
|
14
|
+
group_size: number;
|
|
15
|
+
/**
|
|
16
|
+
* Fraction of a group's *clusters* the step above it should come to. The design's halving,
|
|
17
|
+
* stated as the thing the DAG is actually for.
|
|
18
|
+
*
|
|
19
|
+
* A triangle ratio is a means and this is the end, and asking directly is what keeps parents
|
|
20
|
+
* full: the simplifier is given the triangle count that many clusters hold, rather than half of
|
|
21
|
+
* whatever the children happened to contain. Where the children are already full the two are the
|
|
22
|
+
* same number. Where they are not, this asks for less destruction, because the reduction is
|
|
23
|
+
* available from packing the geometry better instead.
|
|
24
|
+
* @type {number}
|
|
25
|
+
*/
|
|
26
|
+
simplification_ratio: number;
|
|
27
|
+
/**
|
|
28
|
+
* How much error a single round is allowed to span, as a multiple of the band's floor. `1` would
|
|
29
|
+
* admit only the exact minimum and turn every distinct error value into its own round; a large
|
|
30
|
+
* value admits the whole frontier every time and is the level sweep this replaced.
|
|
31
|
+
*
|
|
32
|
+
* Four, measured. On a 98k-triangle sphere against a full sweep: 31% fewer clusters merged into
|
|
33
|
+
* groups more than twice as coarse as themselves, and 8% fewer at four times, for one extra
|
|
34
|
+
* level. Two is tighter on the first count — 41% fewer — but costs fourteen levels, and every
|
|
35
|
+
* level is a page band and a dependent fetch on the way down.
|
|
36
|
+
* @type {number}
|
|
37
|
+
*/
|
|
38
|
+
error_band_growth: number;
|
|
39
|
+
/**
|
|
40
|
+
* Least share of the frontier a round is allowed to work on, whatever the octave says.
|
|
41
|
+
*
|
|
42
|
+
* The octave alone offers no guarantee of progress: geometry whose error is spread thinly and
|
|
43
|
+
* continuously — a UV sphere, whose poles carry triangles a fraction of the size of its
|
|
44
|
+
* equator's — puts only a handful of clusters in any one octave, and the build inches forward a
|
|
45
|
+
* few merges per round. That is not merely slow, it is unbounded: `level_count` is a u8, and a
|
|
46
|
+
* round loop whose count scales with the cluster count rather than its logarithm will run out of
|
|
47
|
+
* levels on a real asset. Widening the band until it holds a fixed share of the frontier bounds
|
|
48
|
+
* the depth logarithmically, and costs error uniformity only where the octave had nothing.
|
|
49
|
+
* @type {number}
|
|
50
|
+
*/
|
|
51
|
+
error_band_min_fraction: number;
|
|
52
|
+
/**
|
|
53
|
+
* Refuse to build past this many levels. `level_count` is a u8 in the container, and a build
|
|
54
|
+
* that has not converged by then has something else wrong with it.
|
|
55
|
+
* @type {number}
|
|
56
|
+
*/
|
|
57
|
+
max_levels: number;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=VGeoLevelOptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGeoLevelOptions.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH;IACI;;;;;OAKG;IACH,YAFU,MAAM,CAED;IAEf;;;;;;;;;;OAUG;IACH,sBAFU,MAAM,CAEW;IAE3B;;;;;;;;;;OAUG;IACH,mBAFU,MAAM,CAEM;IAEtB;;;;;;;;;;;OAWG;IACH,yBAFU,MAAM,CAEe;IAE/B;;;;OAIG;IACH,YAFU,MAAM,CAEC;CACpB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What one band of the DAG came to.
|
|
3
|
+
*
|
|
4
|
+
* The counts are not a frontier size and do not have to fall monotonically: `cluster_count` is what
|
|
5
|
+
* the round of this index *created*, and a round merges a band of comparable error rather than the
|
|
6
|
+
* whole frontier, so a later round can produce fewer clusters than an earlier one — or more, when it
|
|
7
|
+
* finally reaches geometry that had been waiting.
|
|
8
|
+
*
|
|
9
|
+
* @author Alex Goldring
|
|
10
|
+
* @copyright Company Named Limited (c) 2026
|
|
11
|
+
*/
|
|
12
|
+
export class VGeoLevelSummary {
|
|
13
|
+
level: number;
|
|
14
|
+
/**
|
|
15
|
+
* Clusters the round of this index created.
|
|
16
|
+
* @type {number}
|
|
17
|
+
*/
|
|
18
|
+
cluster_count: number;
|
|
19
|
+
/**
|
|
20
|
+
* Groups sitting in this band — the ones the round above consumed.
|
|
21
|
+
* @type {number}
|
|
22
|
+
*/
|
|
23
|
+
group_count: number;
|
|
24
|
+
triangle_count: number;
|
|
25
|
+
vertex_count: number;
|
|
26
|
+
/**
|
|
27
|
+
* Smallest object-space `r_e` any cluster of this level carries.
|
|
28
|
+
* @type {number}
|
|
29
|
+
*/
|
|
30
|
+
min_error: number;
|
|
31
|
+
/**
|
|
32
|
+
* Largest object-space `r_e` any cluster of this level carries. The root's is the ceiling for
|
|
33
|
+
* the whole asset; between two levels there is no ordering, for the same reason the counts have
|
|
34
|
+
* none.
|
|
35
|
+
* @type {number}
|
|
36
|
+
*/
|
|
37
|
+
max_error: number;
|
|
38
|
+
/**
|
|
39
|
+
* Largest LOD-metric sphere radius at this level.
|
|
40
|
+
* @type {number}
|
|
41
|
+
*/
|
|
42
|
+
max_sphere_radius: number;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=VGeoLevelSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGeoLevelSummary.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.js"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH;IACI,cAAU;IAEV;;;OAGG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB,uBAAmB;IACnB,qBAAiB;IAEjB;;;OAGG;IACH,WAFU,MAAM,CAEF;IAEd;;;;;OAKG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,mBAFU,MAAM,CAEM;CACzB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the whole DAG, from a source mesh to a single root.
|
|
3
|
+
*
|
|
4
|
+
* @param {VirtualGeometryMesh} mesh the normalized source; consumed, not copied
|
|
5
|
+
* @param {VGeoLevelOptions} options
|
|
6
|
+
* @returns {VGeoLevel[]} leaves first; the last level holds exactly one cluster, the root
|
|
7
|
+
*/
|
|
8
|
+
export function vgeo_build_levels(mesh: VirtualGeometryMesh, options: VGeoLevelOptions): VGeoLevel[];
|
|
9
|
+
/**
|
|
10
|
+
* One cluster's geometry expressed against the frontier it came out of, which is what lets the next
|
|
11
|
+
* frontier be stitched from a mixture of freshly simplified clusters and untouched ones.
|
|
12
|
+
*/
|
|
13
|
+
export type VGeoContribution = {
|
|
14
|
+
positions: Float32Array;
|
|
15
|
+
/**
|
|
16
|
+
* local to {@link positions }
|
|
17
|
+
*/
|
|
18
|
+
indices: Uint32Array;
|
|
19
|
+
/**
|
|
20
|
+
* ids in the mesh {@link topology } belongs to
|
|
21
|
+
*/
|
|
22
|
+
local_vertex_ids: Uint32Array;
|
|
23
|
+
/**
|
|
24
|
+
* the same vertices, named in the frontier's mesh
|
|
25
|
+
*/
|
|
26
|
+
source_vertex_ids: Uint32Array;
|
|
27
|
+
/**
|
|
28
|
+
* the mesh {@link local_vertex_ids } name vertices of, whose
|
|
29
|
+
* vertex data block holds their attributes
|
|
30
|
+
*/
|
|
31
|
+
topology: BinaryTopology;
|
|
32
|
+
};
|
|
33
|
+
import { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
|
|
34
|
+
import { VGeoLevel } from "./VGeoLevel.js";
|
|
35
|
+
import { BinaryTopology } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
|
|
36
|
+
//# sourceMappingURL=vgeo_build_levels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_build_levels.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.js"],"names":[],"mappings":"AAqiDA;;;;;;GAMG;AACH,wCAJW,mBAAmB,8BAEjB,SAAS,EAAE,CA6KvB;;;;;;eAtgDa,YAAY;;;;aACZ,WAAW;;;;sBACX,WAAW;;;;uBACX,WAAW;;;;;cACX,cAAc;;oCA5KQ,gCAAgC;0BAD1C,gBAAgB;+BAjCI,yEAAyE"}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import { assert } from "
|
|
2
|
-
import { aabb3_from_v3_array } from "
|
|
3
|
-
import { v3_morton_encode_bounded } from "
|
|
4
|
-
import { Quadric3 } from "
|
|
1
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
+
import { aabb3_from_v3_array } from "../../../../../../core/geom/3d/aabb/aabb3_from_v3_array.js";
|
|
3
|
+
import { v3_morton_encode_bounded } from "../../../../../../core/geom/3d/morton/v3_morton_encode_bounded.js";
|
|
4
|
+
import { Quadric3 } from "../../../../../../core/geom/3d/quadric/Quadric3.js";
|
|
5
5
|
import {
|
|
6
6
|
sphere_compute_bounding_of_2_spheres
|
|
7
|
-
} from "
|
|
8
|
-
import { BinaryTopology, NULL_POINTER, } from "
|
|
7
|
+
} from "../../../../../../core/geom/3d/sphere/sphere_compute_bounding_of_2_spheres.js";
|
|
8
|
+
import { BinaryTopology, NULL_POINTER, } from "../../../../../../core/geom/3d/topology/struct/binary/BinaryTopology.js";
|
|
9
9
|
import {
|
|
10
10
|
bt_mesh_compute_vertex_quadrics
|
|
11
|
-
} from "
|
|
11
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js";
|
|
12
12
|
import {
|
|
13
13
|
bt_mesh_from_indexed_geometry
|
|
14
|
-
} from "
|
|
14
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js";
|
|
15
15
|
import {
|
|
16
16
|
bt_mesh_simplify_with_quadrics
|
|
17
|
-
} from "
|
|
18
|
-
import { bt_edge_get } from "
|
|
19
|
-
import { bt_mesh_validate } from "
|
|
20
|
-
import { bt_mesh_build_face_graph } from "
|
|
21
|
-
import { vgeo_encode_cluster_payload } from "
|
|
22
|
-
import { vgeo_layers_copy_vertex } from "
|
|
23
|
-
import { vgeo_layers_like } from "
|
|
24
|
-
import { VGEO_MAX_CLUSTER_TRIANGLE_COUNT } from "
|
|
25
|
-
import { VGEO_MAX_CLUSTER_VERTEX_COUNT } from "
|
|
26
|
-
import { VGEO_MAX_GROUP_CLUSTER_COUNT } from "
|
|
27
|
-
import { VirtualGeometryCluster } from "
|
|
28
|
-
import { VirtualGeometryGroup } from "
|
|
29
|
-
import { vgeo_bounding_sphere } from "
|
|
30
|
-
import { vgeo_compute_vertex_normals } from "
|
|
31
|
-
import { vgeo_compute_vertex_tangents } from "
|
|
32
|
-
import { vgeo_containing_sphere } from "
|
|
33
|
-
import { vgeo_extract_submesh } from "
|
|
34
|
-
import { vgeo_gather_faces } from "
|
|
35
|
-
import { vgeo_graph_components } from "
|
|
36
|
-
import { vgeo_narrow_indices } from "
|
|
37
|
-
import {
|
|
38
|
-
import { vgeo_split_face_set } from "
|
|
39
|
-
import { vgeo_split_face_set_packed } from "
|
|
40
|
-
import { VGeoFaceGraph } from "
|
|
17
|
+
} from "../../../../../../core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js";
|
|
18
|
+
import { bt_edge_get } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_edge_get.js";
|
|
19
|
+
import { bt_mesh_validate } from "../../../../../../core/geom/3d/topology/struct/binary/query/bt_mesh_validate.js";
|
|
20
|
+
import { bt_mesh_build_face_graph } from "../../../../../../core/graph/metis/bt_mesh_build_face_graph.js";
|
|
21
|
+
import { vgeo_encode_cluster_payload } from "../../format/payload/vgeo_encode_cluster_payload.js";
|
|
22
|
+
import { vgeo_layers_copy_vertex } from "../../format/attribute/vgeo_layers_copy_vertex.js";
|
|
23
|
+
import { vgeo_layers_like } from "../../format/attribute/vgeo_layers_like.js";
|
|
24
|
+
import { VGEO_MAX_CLUSTER_TRIANGLE_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_TRIANGLE_COUNT.js";
|
|
25
|
+
import { VGEO_MAX_CLUSTER_VERTEX_COUNT } from "../../format/cluster/VGEO_MAX_CLUSTER_VERTEX_COUNT.js";
|
|
26
|
+
import { VGEO_MAX_GROUP_CLUSTER_COUNT } from "../../format/page/VGEO_MAX_GROUP_CLUSTER_COUNT.js";
|
|
27
|
+
import { VirtualGeometryCluster } from "../../format/dag/VirtualGeometryCluster.js";
|
|
28
|
+
import { VirtualGeometryGroup } from "../../format/dag/VirtualGeometryGroup.js";
|
|
29
|
+
import { vgeo_bounding_sphere } from "../sphere/vgeo_bounding_sphere.js";
|
|
30
|
+
import { vgeo_compute_vertex_normals } from "../mesh/vgeo_compute_vertex_normals.js";
|
|
31
|
+
import { vgeo_compute_vertex_tangents } from "../mesh/vgeo_compute_vertex_tangents.js";
|
|
32
|
+
import { vgeo_containing_sphere } from "../sphere/vgeo_containing_sphere.js";
|
|
33
|
+
import { vgeo_extract_submesh } from "../submesh/vgeo_extract_submesh.js";
|
|
34
|
+
import { vgeo_gather_faces } from "../submesh/vgeo_gather_faces.js";
|
|
35
|
+
import { vgeo_graph_components } from "../partition/vgeo_graph_components.js";
|
|
36
|
+
import { vgeo_narrow_indices } from "../submesh/vgeo_narrow_indices.js";
|
|
37
|
+
import { vgeo_partition_subgraph } from "../partition/vgeo_partition_subgraph.js";
|
|
38
|
+
import { vgeo_split_face_set } from "../partition/vgeo_split_face_set.js";
|
|
39
|
+
import { vgeo_split_face_set_packed } from "../partition/vgeo_split_face_set_packed.js";
|
|
40
|
+
import { VGeoFaceGraph } from "../partition/VGeoFaceGraph.js";
|
|
41
41
|
import { VGeoLevel } from "./VGeoLevel.js";
|
|
42
|
-
import { VirtualGeometryMesh } from "
|
|
42
|
+
import { VirtualGeometryMesh } from "../mesh/VirtualGeometryMesh.js";
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Build the cluster DAG: leaves out of the source mesh, then merge steps until one cluster is left.
|
|
@@ -434,30 +434,32 @@ function bundle_loose_clusters(frontier, loose, group_size) {
|
|
|
434
434
|
return [];
|
|
435
435
|
}
|
|
436
436
|
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
]);
|
|
437
|
+
// Gathered rather than read through the cluster list twice: the bounds and the codes are the
|
|
438
|
+
// same points, and this is the shape `vgeo_split_face_set_packed` already packs in.
|
|
439
|
+
const centres = new Float32Array(loose.length * 3);
|
|
441
440
|
|
|
442
|
-
|
|
443
|
-
const
|
|
441
|
+
loose.forEach((cluster, index) => {
|
|
442
|
+
const sphere = frontier.clusters[cluster].bounds_sphere;
|
|
444
443
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
444
|
+
centres[index * 3] = sphere[0];
|
|
445
|
+
centres[index * 3 + 1] = sphere[1];
|
|
446
|
+
centres[index * 3 + 2] = sphere[2];
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
const bounds = new Float32Array(6);
|
|
450
|
+
|
|
451
|
+
aabb3_from_v3_array(bounds, centres, centres.length);
|
|
450
452
|
|
|
451
453
|
/**
|
|
452
454
|
* @type {Map<number, number>}
|
|
453
455
|
*/
|
|
454
456
|
const codes = new Map();
|
|
455
457
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
}
|
|
458
|
+
loose.forEach((cluster, index) => {
|
|
459
|
+
codes.set(cluster, v3_morton_encode_bounded(
|
|
460
|
+
centres[index * 3], centres[index * 3 + 1], centres[index * 3 + 2], bounds
|
|
461
|
+
));
|
|
462
|
+
});
|
|
461
463
|
|
|
462
464
|
const order = loose.slice();
|
|
463
465
|
|
|
@@ -621,6 +623,14 @@ function absorb_singleton_pieces(pieces, cluster_graph) {
|
|
|
621
623
|
function partition_into_groups(frontier, band, cluster_graph, group_size) {
|
|
622
624
|
const membership = new Int32Array(frontier.clusters.length).fill(-1);
|
|
623
625
|
|
|
626
|
+
/**
|
|
627
|
+
* Dense rather than a `Map`, and hoisted out of the component loop so it is one allocation per
|
|
628
|
+
* level. See {@link vgeo_partition_subgraph} for why the density is load-bearing rather than a
|
|
629
|
+
* micro-optimisation.
|
|
630
|
+
* @type {Uint32Array}
|
|
631
|
+
*/
|
|
632
|
+
const local_index = new Uint32Array(frontier.clusters.length);
|
|
633
|
+
|
|
624
634
|
for (const cluster of band) {
|
|
625
635
|
membership[cluster] = 0;
|
|
626
636
|
}
|
|
@@ -692,55 +702,11 @@ function partition_into_groups(frontier, band, cluster_graph, group_size) {
|
|
|
692
702
|
membership[cluster] = token;
|
|
693
703
|
}
|
|
694
704
|
|
|
695
|
-
const
|
|
696
|
-
|
|
697
|
-
component.forEach((cluster, index) => local_index.set(cluster, index));
|
|
698
|
-
|
|
699
|
-
const local_addresses = new Uint32Array(component.length + 1);
|
|
700
|
-
const local_adjacency = [];
|
|
701
|
-
const local_weights = [];
|
|
702
|
-
|
|
703
|
-
component.forEach((cluster, index) => {
|
|
704
|
-
local_addresses[index] = local_adjacency.length;
|
|
705
|
-
|
|
706
|
-
for (let i = cluster_graph.edge_addresses[cluster]; i < cluster_graph.edge_addresses[cluster + 1]; i++) {
|
|
707
|
-
const other = cluster_graph.adjacency[i];
|
|
708
|
-
|
|
709
|
-
if (membership[other] !== token) {
|
|
710
|
-
continue;
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
local_adjacency.push(local_index.get(other));
|
|
714
|
-
local_weights.push(cluster_graph.edge_weights[i]);
|
|
715
|
-
}
|
|
716
|
-
});
|
|
717
|
-
|
|
718
|
-
local_addresses[component.length] = local_adjacency.length;
|
|
719
|
-
|
|
720
|
-
const assignment = vgeo_partition_graph(
|
|
721
|
-
component.length,
|
|
722
|
-
part_count,
|
|
723
|
-
local_addresses,
|
|
724
|
-
Uint32Array.from(local_adjacency),
|
|
725
|
-
Float32Array.from(local_weights),
|
|
726
|
-
GROUP_SEED
|
|
705
|
+
const parts = vgeo_partition_subgraph(
|
|
706
|
+
cluster_graph, component, membership, token, part_count, GROUP_SEED, local_index
|
|
727
707
|
);
|
|
728
708
|
|
|
729
|
-
const parts = [];
|
|
730
|
-
|
|
731
|
-
for (let i = 0; i < part_count; i++) {
|
|
732
|
-
parts.push([]);
|
|
733
|
-
}
|
|
734
|
-
|
|
735
|
-
component.forEach((cluster, index) => {
|
|
736
|
-
parts[assignment[index]].push(cluster);
|
|
737
|
-
});
|
|
738
|
-
|
|
739
709
|
for (const part of parts) {
|
|
740
|
-
if (part.length === 0) {
|
|
741
|
-
continue;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
710
|
token++;
|
|
745
711
|
|
|
746
712
|
for (const cluster of part) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The root cluster has no simplification step above it, so nothing grouped it, and the format still
|
|
3
|
+
* wants every cluster in exactly one group. It gets a group of its own: the always-selectable entry
|
|
4
|
+
* point the runtime starts its cut from.
|
|
5
|
+
*
|
|
6
|
+
* There is exactly one of these because the DAG has exactly one root — a build that ends with
|
|
7
|
+
* several parentless clusters has not finished, and bundling them into a synthetic group would only
|
|
8
|
+
* hide that (see `vgeo_build_levels`).
|
|
9
|
+
*
|
|
10
|
+
* @param {VirtualGeometryCluster} cluster the root
|
|
11
|
+
* @param {number} level
|
|
12
|
+
* @returns {VirtualGeometryGroup}
|
|
13
|
+
*
|
|
14
|
+
* @author Alex Goldring
|
|
15
|
+
* @copyright Company Named Limited (c) 2026
|
|
16
|
+
*/
|
|
17
|
+
export function vgeo_build_root_group(cluster: VirtualGeometryCluster, level: number): VirtualGeometryGroup;
|
|
18
|
+
import { VirtualGeometryGroup } from "../../format/dag/VirtualGeometryGroup.js";
|
|
19
|
+
//# sourceMappingURL=vgeo_build_root_group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_build_root_group.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,8EANW,MAAM,GACJ,oBAAoB,CAYhC;qCAzBoC,0CAA0C"}
|