@woosh/meep-engine 3.25.0 → 3.27.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/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/shape/HeightMapShape3D.d.ts +66 -0
- package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/HeightMapShape3D.js +314 -20
- package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.js +57 -0
- package/src/core/geom/3d/shape/TransformedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/TransformedShape3D.js +102 -0
- package/src/core/geom/3d/shape/UnionShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/UnionShape3D.js +64 -0
- package/src/engine/physics/cloth/MEASUREMENTS.md +582 -0
- package/src/engine/physics/cloth/PLAN.md +330 -49
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +84 -17
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -1
- package/src/engine/physics/cloth/collider/ClothColliderIndex.js +451 -42
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +65 -7
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +72 -8
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +25 -4
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +75 -8
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +41 -4
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothWorld.js +207 -63
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +10 -0
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +17 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +27 -3
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +28 -3
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +75 -10
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +131 -12
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +249 -201
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +21 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +62 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +18 -10
- package/src/engine/physics/cloth/playground/collide_main.js +1 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +29 -8
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_contact_find.js +37 -9
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +12 -2
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +12 -2
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts +9 -2
- package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.js +9 -2
- package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +23 -9
- package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/AbstractClothWind.js +23 -9
- package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts +7 -5
- package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/ClothAmbientWind.js +12 -9
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/ClothFluidWind.js +5 -2
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +7 -2
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -1
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +12 -5
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/playground/vgeo_runtime/README.md +167 -22
- package/src/shade/playground/vgeo_runtime/index.html +112 -62
- package/src/shade/playground/vgeo_runtime/main.js +660 -83
- package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
- package/src/shade/playground/vgeo_viewer/sample_asset.js +19 -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/virtual/VGEO_FORMAT.md +73 -5
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +26 -15
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +5 -3
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +20 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +56 -9
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -0
- 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/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_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/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 +55 -0
- 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 +202 -13
- 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 +147 -10
- package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +637 -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 +58 -28
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +77 -105
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +105 -22
- 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 +47 -489
- 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 +1363 -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.map +1 -1
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +15 -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 +186 -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 +20 -8
- 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 +580 -188
- 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/tiny-gltf.d.ts +1 -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/postprocess/nss/NSS.d.ts +1 -1
- 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/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/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/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/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/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +7 -1
- 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 +7 -1
- 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 +59 -4
- 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/renderer/geometry/virtual/residency/VGeoResidencyManager.js +0 -723
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
- package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
- package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("../format/read/VGeoContainerReader.js").VGeoContainerReader} VGeoContainerReader
|
|
3
|
+
* @typedef {import("../format/read/VGeoPage.js").VGeoPage} VGeoPage
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Pages fetched, verified and decoded off the main thread, for every container a residency holds.
|
|
7
|
+
*
|
|
8
|
+
* A pool of module workers, each serving `vgeo_page_worker_serve`, and an in-process fall-back that
|
|
9
|
+
* is the same core on this thread. A container goes to the workers when its byte source carries a
|
|
10
|
+
* `descriptor` — a URL, a `Blob`, bytes in memory — and stays here when it does not, which is what
|
|
11
|
+
* a source built by hand in a spec is. Requests round-robin; a container's descriptor is sent to a
|
|
12
|
+
* worker once, with the first request that names it there.
|
|
13
|
+
*
|
|
14
|
+
* What comes back is a `VGeoPage` with its buffers transferred, not copied, and what the residency
|
|
15
|
+
* does with it is `reader.adopt(page)` — the reader's page map is still the RAM tier's store, and
|
|
16
|
+
* the reader still owns quarantine; the fetch just no longer runs inside it
|
|
17
|
+
* (RUNTIME_PLAN_2026_09_14 §4.6).
|
|
18
|
+
*
|
|
19
|
+
* @author Alex Goldring
|
|
20
|
+
* @copyright Company Named Limited (c) 2026
|
|
21
|
+
*/
|
|
22
|
+
export class VGeoPageFetcher {
|
|
23
|
+
/**
|
|
24
|
+
* @param {Object} [options]
|
|
25
|
+
* @param {number} [options.worker_count] zero runs everything in-process
|
|
26
|
+
* @param {function(): Worker} [options.make_worker] how a worker is spawned —
|
|
27
|
+
* `make_vgeo_page_worker` in a browser, a loopback in a spec, nothing under a runner with no
|
|
28
|
+
* `Worker`, in which case everything runs in-process
|
|
29
|
+
*/
|
|
30
|
+
constructor({ worker_count, make_worker }?: {
|
|
31
|
+
worker_count?: number;
|
|
32
|
+
make_worker?: () => Worker;
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* @returns {number}
|
|
36
|
+
*/
|
|
37
|
+
get worker_count(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Fetches answered by a worker.
|
|
40
|
+
* @returns {number}
|
|
41
|
+
*/
|
|
42
|
+
get worker_fetch_count(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Fetches answered on this thread.
|
|
45
|
+
* @returns {number}
|
|
46
|
+
*/
|
|
47
|
+
get in_process_fetch_count(): number;
|
|
48
|
+
/**
|
|
49
|
+
* @returns {number}
|
|
50
|
+
*/
|
|
51
|
+
get pending_count(): number;
|
|
52
|
+
/**
|
|
53
|
+
* Bytes fetched by the workers — a source's own `bytes_read` counts only this thread's reads.
|
|
54
|
+
* @returns {number}
|
|
55
|
+
*/
|
|
56
|
+
get worker_bytes_read(): number;
|
|
57
|
+
/**
|
|
58
|
+
* @param {VGeoContainerReader} reader open, so its header and options are known
|
|
59
|
+
* @param {number} page_index
|
|
60
|
+
* @param {number} frame_offset
|
|
61
|
+
* @param {number} fetch_size
|
|
62
|
+
* @param {AbortSignal} [signal]
|
|
63
|
+
* @returns {Promise<VGeoPage>} rejects with a {@link VGeoFetchError}
|
|
64
|
+
*/
|
|
65
|
+
fetch(reader: VGeoContainerReader, page_index: number, frame_offset: number, fetch_size: number, signal?: AbortSignal): Promise<VGeoPage>;
|
|
66
|
+
/**
|
|
67
|
+
* Give up on every fetch of one container: what is on the wire in a worker is cancelled, and
|
|
68
|
+
* every promise for it rejects as cancelled rather than quarantined.
|
|
69
|
+
*
|
|
70
|
+
* @param {VGeoContainerReader} reader
|
|
71
|
+
* @returns {number} fetches cancelled
|
|
72
|
+
*/
|
|
73
|
+
cancel(reader: VGeoContainerReader): number;
|
|
74
|
+
/**
|
|
75
|
+
* Terminate the workers and reject what they were doing.
|
|
76
|
+
*
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*/
|
|
79
|
+
destroy(): void;
|
|
80
|
+
#private;
|
|
81
|
+
}
|
|
82
|
+
export type VGeoContainerReader = import("../format/read/VGeoContainerReader.js").VGeoContainerReader;
|
|
83
|
+
export type VGeoPage = import("../format/read/VGeoPage.js").VGeoPage;
|
|
84
|
+
//# sourceMappingURL=VGeoPageFetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VGeoPageFetcher.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH;IA0EI;;;;;;OAMG;IACH;QAL4B,YAAY,GAA7B,MAAM;QACuB,WAAW,SAA5B,MAAM;OAS5B;IAED;;OAEG;IACH,2BAEC;IAED;;;OAGG;IACH,iCAEC;IAED;;;OAGG;IACH,qCAEC;IAED;;OAEG;IACH,4BAEC;IAED;;;OAGG;IACH,gCAEC;IAED;;;;;;;OAOG;IACH,cAPW,mBAAmB,cACnB,MAAM,gBACN,MAAM,cACN,MAAM,WACN,WAAW,GACT,QAAQ,QAAQ,CAAC,CAc7B;IAED;;;;;;OAMG;IACH,eAHW,mBAAmB,GACjB,MAAM,CAuBlB;IAED;;;;OAIG;IACH,WAFa,IAAI,CAiBhB;;CAwKJ;kCAnYY,OAAO,uCAAuC,EAAE,mBAAmB;uBACnE,OAAO,4BAA4B,EAAE,QAAQ"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { VGeoFetchError, VGeoPageFetcherCore } from "../format/read/VGeoPageFetcherCore.js";
|
|
3
|
+
import { vgeo_page_from_transfer } from "../format/read/vgeo_page_transfer.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {import("../format/read/VGeoContainerReader.js").VGeoContainerReader} VGeoContainerReader
|
|
7
|
+
* @typedef {import("../format/read/VGeoPage.js").VGeoPage} VGeoPage
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Pages fetched, verified and decoded off the main thread, for every container a residency holds.
|
|
12
|
+
*
|
|
13
|
+
* A pool of module workers, each serving `vgeo_page_worker_serve`, and an in-process fall-back that
|
|
14
|
+
* is the same core on this thread. A container goes to the workers when its byte source carries a
|
|
15
|
+
* `descriptor` — a URL, a `Blob`, bytes in memory — and stays here when it does not, which is what
|
|
16
|
+
* a source built by hand in a spec is. Requests round-robin; a container's descriptor is sent to a
|
|
17
|
+
* worker once, with the first request that names it there.
|
|
18
|
+
*
|
|
19
|
+
* What comes back is a `VGeoPage` with its buffers transferred, not copied, and what the residency
|
|
20
|
+
* does with it is `reader.adopt(page)` — the reader's page map is still the RAM tier's store, and
|
|
21
|
+
* the reader still owns quarantine; the fetch just no longer runs inside it
|
|
22
|
+
* (RUNTIME_PLAN_2026_09_14 §4.6).
|
|
23
|
+
*
|
|
24
|
+
* @author Alex Goldring
|
|
25
|
+
* @copyright Company Named Limited (c) 2026
|
|
26
|
+
*/
|
|
27
|
+
export class VGeoPageFetcher {
|
|
28
|
+
/**
|
|
29
|
+
* @type {number}
|
|
30
|
+
*/
|
|
31
|
+
#worker_count;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @type {function(): Worker}
|
|
35
|
+
*/
|
|
36
|
+
#make_worker;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @type {(Worker|MessagePort|object)[]}
|
|
40
|
+
*/
|
|
41
|
+
#workers = [];
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Per worker, the source ids it has been given a descriptor for.
|
|
45
|
+
* @type {Set<number>[]}
|
|
46
|
+
*/
|
|
47
|
+
#known = [];
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @type {number}
|
|
51
|
+
*/
|
|
52
|
+
#next_worker = 0;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Whether spawning failed, after which everything runs in-process for good.
|
|
56
|
+
* @type {boolean}
|
|
57
|
+
*/
|
|
58
|
+
#no_workers = false;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @type {number}
|
|
62
|
+
*/
|
|
63
|
+
#next_id = 1;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @type {Map<number, {resolve: function, reject: function, reader: VGeoContainerReader, worker: number}>}
|
|
67
|
+
*/
|
|
68
|
+
#pending = new Map();
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @type {Map<VGeoContainerReader, number>}
|
|
72
|
+
*/
|
|
73
|
+
#source_ids = new Map();
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @type {number}
|
|
77
|
+
*/
|
|
78
|
+
#next_source_id = 1;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @type {Map<VGeoContainerReader, VGeoPageFetcherCore>}
|
|
82
|
+
*/
|
|
83
|
+
#cores = new Map();
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @type {number}
|
|
87
|
+
*/
|
|
88
|
+
#worker_fetch_count = 0;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* @type {number}
|
|
92
|
+
*/
|
|
93
|
+
#in_process_fetch_count = 0;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Bytes the workers read, which this thread's byte sources never see.
|
|
97
|
+
* @type {number}
|
|
98
|
+
*/
|
|
99
|
+
#worker_bytes_read = 0;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @param {Object} [options]
|
|
103
|
+
* @param {number} [options.worker_count] zero runs everything in-process
|
|
104
|
+
* @param {function(): Worker} [options.make_worker] how a worker is spawned —
|
|
105
|
+
* `make_vgeo_page_worker` in a browser, a loopback in a spec, nothing under a runner with no
|
|
106
|
+
* `Worker`, in which case everything runs in-process
|
|
107
|
+
*/
|
|
108
|
+
constructor({ worker_count = 0, make_worker = undefined } = {}) {
|
|
109
|
+
assert.isNonNegativeInteger(worker_count, 'worker_count');
|
|
110
|
+
|
|
111
|
+
this.#worker_count = worker_count;
|
|
112
|
+
this.#make_worker = make_worker;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @returns {number}
|
|
117
|
+
*/
|
|
118
|
+
get worker_count() {
|
|
119
|
+
return this.#worker_count;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Fetches answered by a worker.
|
|
124
|
+
* @returns {number}
|
|
125
|
+
*/
|
|
126
|
+
get worker_fetch_count() {
|
|
127
|
+
return this.#worker_fetch_count;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Fetches answered on this thread.
|
|
132
|
+
* @returns {number}
|
|
133
|
+
*/
|
|
134
|
+
get in_process_fetch_count() {
|
|
135
|
+
return this.#in_process_fetch_count;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @returns {number}
|
|
140
|
+
*/
|
|
141
|
+
get pending_count() {
|
|
142
|
+
return this.#pending.size;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Bytes fetched by the workers — a source's own `bytes_read` counts only this thread's reads.
|
|
147
|
+
* @returns {number}
|
|
148
|
+
*/
|
|
149
|
+
get worker_bytes_read() {
|
|
150
|
+
return this.#worker_bytes_read;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @param {VGeoContainerReader} reader open, so its header and options are known
|
|
155
|
+
* @param {number} page_index
|
|
156
|
+
* @param {number} frame_offset
|
|
157
|
+
* @param {number} fetch_size
|
|
158
|
+
* @param {AbortSignal} [signal]
|
|
159
|
+
* @returns {Promise<VGeoPage>} rejects with a {@link VGeoFetchError}
|
|
160
|
+
*/
|
|
161
|
+
fetch(reader, page_index, frame_offset, fetch_size, signal = undefined) {
|
|
162
|
+
assert.defined(reader, 'reader');
|
|
163
|
+
|
|
164
|
+
if (this.#worker_count > 0 && !this.#no_workers && reader.source.descriptor !== undefined) {
|
|
165
|
+
const worker = this.#worker_for();
|
|
166
|
+
|
|
167
|
+
if (worker !== -1) {
|
|
168
|
+
return this.#fetch_in_worker(worker, reader, page_index, frame_offset, fetch_size, signal);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return this.#fetch_in_process(reader, page_index, frame_offset, fetch_size, signal);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Give up on every fetch of one container: what is on the wire in a worker is cancelled, and
|
|
177
|
+
* every promise for it rejects as cancelled rather than quarantined.
|
|
178
|
+
*
|
|
179
|
+
* @param {VGeoContainerReader} reader
|
|
180
|
+
* @returns {number} fetches cancelled
|
|
181
|
+
*/
|
|
182
|
+
cancel(reader) {
|
|
183
|
+
let cancelled = 0;
|
|
184
|
+
|
|
185
|
+
for (const [id, entry] of Array.from(this.#pending)) {
|
|
186
|
+
if (entry.reader !== reader) {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
this.#pending.delete(id);
|
|
191
|
+
|
|
192
|
+
this.#workers[entry.worker].postMessage({ cancel: id });
|
|
193
|
+
|
|
194
|
+
entry.reject(new VGeoFetchError('the fetch was cancelled', false, 'cancelled'));
|
|
195
|
+
|
|
196
|
+
cancelled++;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
this.#source_ids.delete(reader);
|
|
200
|
+
this.#cores.delete(reader);
|
|
201
|
+
|
|
202
|
+
return cancelled;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Terminate the workers and reject what they were doing.
|
|
207
|
+
*
|
|
208
|
+
* @returns {void}
|
|
209
|
+
*/
|
|
210
|
+
destroy() {
|
|
211
|
+
for (const entry of this.#pending.values()) {
|
|
212
|
+
entry.reject(new VGeoFetchError('the fetcher was destroyed', false, 'destroyed'));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
this.#pending.clear();
|
|
216
|
+
|
|
217
|
+
for (const worker of this.#workers) {
|
|
218
|
+
worker.terminate?.();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
this.#workers.length = 0;
|
|
222
|
+
this.#known.length = 0;
|
|
223
|
+
this.#cores.clear();
|
|
224
|
+
this.#source_ids.clear();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* The next worker in the round, spawning the pool on first use.
|
|
229
|
+
*
|
|
230
|
+
* @returns {number} index, or -1 when no worker can be had
|
|
231
|
+
*/
|
|
232
|
+
#worker_for() {
|
|
233
|
+
if (this.#workers.length === 0) {
|
|
234
|
+
const make = this.#make_worker;
|
|
235
|
+
|
|
236
|
+
if (make === undefined) {
|
|
237
|
+
// nobody said how to spawn one: a runner with no Worker, or a host that did not
|
|
238
|
+
// wire `make_vgeo_page_worker`
|
|
239
|
+
this.#no_workers = true;
|
|
240
|
+
|
|
241
|
+
return -1;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
for (let i = 0; i < this.#worker_count; i++) {
|
|
246
|
+
const worker = make();
|
|
247
|
+
|
|
248
|
+
worker.onmessage = event => this.#on_message(event.data);
|
|
249
|
+
|
|
250
|
+
this.#workers.push(worker);
|
|
251
|
+
this.#known.push(new Set());
|
|
252
|
+
}
|
|
253
|
+
} catch (e) {
|
|
254
|
+
// no Worker here — a test runner, a host without one — so everything stays on this
|
|
255
|
+
// thread, and it is said once rather than once per page
|
|
256
|
+
console.warn('vgeo: page fetches will run in-process', e);
|
|
257
|
+
|
|
258
|
+
this.#no_workers = true;
|
|
259
|
+
|
|
260
|
+
for (const worker of this.#workers) {
|
|
261
|
+
worker.terminate?.();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
this.#workers.length = 0;
|
|
265
|
+
this.#known.length = 0;
|
|
266
|
+
|
|
267
|
+
return -1;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const worker = this.#next_worker;
|
|
272
|
+
|
|
273
|
+
this.#next_worker = (worker + 1) % this.#workers.length;
|
|
274
|
+
|
|
275
|
+
return worker;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* @param {number} worker
|
|
280
|
+
* @param {VGeoContainerReader} reader
|
|
281
|
+
* @param {number} page_index
|
|
282
|
+
* @param {number} frame_offset
|
|
283
|
+
* @param {number} fetch_size
|
|
284
|
+
* @param {AbortSignal|undefined} signal
|
|
285
|
+
* @returns {Promise<VGeoPage>}
|
|
286
|
+
*/
|
|
287
|
+
#fetch_in_worker(worker, reader, page_index, frame_offset, fetch_size, signal) {
|
|
288
|
+
let source_id = this.#source_ids.get(reader);
|
|
289
|
+
|
|
290
|
+
if (source_id === undefined) {
|
|
291
|
+
source_id = this.#next_source_id++;
|
|
292
|
+
|
|
293
|
+
this.#source_ids.set(reader, source_id);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const id = this.#next_id++;
|
|
297
|
+
|
|
298
|
+
const options = reader.options;
|
|
299
|
+
|
|
300
|
+
const request = {
|
|
301
|
+
id,
|
|
302
|
+
source_id,
|
|
303
|
+
asset_id_low64: reader.header.asset_id_low64,
|
|
304
|
+
verify_frames: options.verify_frames,
|
|
305
|
+
fetch_retries: options.fetch_retries,
|
|
306
|
+
fetch_retry_backoff_ms: options.fetch_retry_backoff_ms,
|
|
307
|
+
page_index,
|
|
308
|
+
frame_offset,
|
|
309
|
+
fetch_size,
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
const known = this.#known[worker];
|
|
313
|
+
|
|
314
|
+
if (!known.has(source_id)) {
|
|
315
|
+
request.descriptor = reader.source.descriptor;
|
|
316
|
+
|
|
317
|
+
known.add(source_id);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
this.#worker_fetch_count++;
|
|
321
|
+
|
|
322
|
+
return new Promise((resolve, reject) => {
|
|
323
|
+
this.#pending.set(id, { resolve, reject, reader, worker, fetch_size });
|
|
324
|
+
|
|
325
|
+
if (signal !== undefined) {
|
|
326
|
+
signal.addEventListener('abort', () => {
|
|
327
|
+
if (this.#pending.delete(id)) {
|
|
328
|
+
this.#workers[worker].postMessage({ cancel: id });
|
|
329
|
+
|
|
330
|
+
reject(new VGeoFetchError(`page ${page_index}: the fetch was cancelled`, false, 'cancelled'));
|
|
331
|
+
}
|
|
332
|
+
}, { once: true });
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
this.#workers[worker].postMessage(request);
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* @param {object} data
|
|
341
|
+
*/
|
|
342
|
+
#on_message(data) {
|
|
343
|
+
const entry = this.#pending.get(data.id);
|
|
344
|
+
|
|
345
|
+
if (entry === undefined) {
|
|
346
|
+
// cancelled, or the container left while this was on the wire
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
this.#pending.delete(data.id);
|
|
351
|
+
|
|
352
|
+
if (data.error !== undefined) {
|
|
353
|
+
entry.reject(new VGeoFetchError(data.error.message, data.error.quarantine, data.error.reason));
|
|
354
|
+
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
this.#worker_bytes_read += entry.fetch_size;
|
|
359
|
+
|
|
360
|
+
entry.resolve(vgeo_page_from_transfer(data.page));
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* @param {VGeoContainerReader} reader
|
|
365
|
+
* @param {number} page_index
|
|
366
|
+
* @param {number} frame_offset
|
|
367
|
+
* @param {number} fetch_size
|
|
368
|
+
* @param {AbortSignal|undefined} signal
|
|
369
|
+
* @returns {Promise<VGeoPage>}
|
|
370
|
+
*/
|
|
371
|
+
#fetch_in_process(reader, page_index, frame_offset, fetch_size, signal) {
|
|
372
|
+
let core = this.#cores.get(reader);
|
|
373
|
+
|
|
374
|
+
if (core === undefined) {
|
|
375
|
+
const source = reader.source;
|
|
376
|
+
const options = reader.options;
|
|
377
|
+
|
|
378
|
+
core = new VGeoPageFetcherCore({
|
|
379
|
+
read: (offset, length, abort) => source.read(offset, length, abort),
|
|
380
|
+
asset_id_low64: () => reader.header.asset_id_low64,
|
|
381
|
+
verify_frames: options.verify_frames,
|
|
382
|
+
fetch_retries: options.fetch_retries,
|
|
383
|
+
fetch_retry_backoff_ms: options.fetch_retry_backoff_ms,
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
this.#cores.set(reader, core);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
this.#in_process_fetch_count++;
|
|
390
|
+
|
|
391
|
+
return core.fetch(page_index, frame_offset, fetch_size, signal);
|
|
392
|
+
}
|
|
393
|
+
}
|