@woosh/meep-engine 3.26.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 +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/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
|
+
}
|