@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,236 @@
|
|
|
1
|
+
import { assert } from "../../../../../../core/assert.js";
|
|
2
|
+
import { BinaryBuffer } from "../../../../../../core/binary/BinaryBuffer.js";
|
|
3
|
+
import { vgeo_compute_frame_checksum } from "../checksum/vgeo_compute_frame_checksum.js";
|
|
4
|
+
import { VGEO_FRAME_OFFSET } from "../frame/VGEO_FRAME_OFFSET.js";
|
|
5
|
+
import { vgeo_read_frame_extent } from "../frame/vgeo_read_frame_extent.js";
|
|
6
|
+
import { vgeo_read_page } from "./vgeo_read_page.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {import("./VGeoPage.js").VGeoPage} VGeoPage
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const LE = true;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* How a fetch ends when it does not end in a page.
|
|
16
|
+
*
|
|
17
|
+
* `quarantine` is the verdict the reader acts on: `true` means the page will not arrive from this
|
|
18
|
+
* source — every attempt failed the same way — and asking again is a storm; `false` means the
|
|
19
|
+
* fetch was cancelled, nothing is wrong with the page, and the next cut may ask again.
|
|
20
|
+
*/
|
|
21
|
+
export class VGeoFetchError extends Error {
|
|
22
|
+
/**
|
|
23
|
+
* @type {boolean}
|
|
24
|
+
*/
|
|
25
|
+
quarantine;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The last attempt's failure, in the source's own words.
|
|
29
|
+
* @type {string}
|
|
30
|
+
*/
|
|
31
|
+
reason;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @param {string} message
|
|
35
|
+
* @param {boolean} quarantine
|
|
36
|
+
* @param {string} reason
|
|
37
|
+
*/
|
|
38
|
+
constructor(message, quarantine, reason) {
|
|
39
|
+
super(message);
|
|
40
|
+
|
|
41
|
+
this.name = 'VGeoFetchError';
|
|
42
|
+
this.quarantine = quarantine;
|
|
43
|
+
this.reason = reason;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* One page from bytes: read the range, retry with backoff, verify the frame against the asset's
|
|
49
|
+
* identity, decode.
|
|
50
|
+
*
|
|
51
|
+
* Pure logic over a `read` function, so that it runs anywhere — on the main thread inside
|
|
52
|
+
* `VGeoContainerReader`, whose `install` has always done exactly this, or in a worker, which is
|
|
53
|
+
* where a runtime wants it. Measured on the Zorah bdf6f961 container, the checksum is 1.0 ms a
|
|
54
|
+
* page and the decode 0.08 ms; at thirty-two pages a reading that is a frame of main-thread time
|
|
55
|
+
* for what is, on a worker, the residency cost of thirty-two arrivals
|
|
56
|
+
* (RUNTIME_PLAN_2026_09_14 §0, §4.6).
|
|
57
|
+
*
|
|
58
|
+
* @author Alex Goldring
|
|
59
|
+
* @copyright Company Named Limited (c) 2026
|
|
60
|
+
*/
|
|
61
|
+
export class VGeoPageFetcherCore {
|
|
62
|
+
/**
|
|
63
|
+
* @type {function(number, number, AbortSignal=): Promise<Uint8Array>}
|
|
64
|
+
*/
|
|
65
|
+
#read;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @type {bigint|function(): bigint}
|
|
69
|
+
*/
|
|
70
|
+
#asset_id_low64;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* @type {boolean}
|
|
74
|
+
*/
|
|
75
|
+
#verify_frames;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @type {number}
|
|
79
|
+
*/
|
|
80
|
+
#fetch_retries;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @type {number}
|
|
84
|
+
*/
|
|
85
|
+
#fetch_retry_backoff_ms;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @param {Object} options
|
|
89
|
+
* @param {function(number, number, AbortSignal=): Promise<Uint8Array>} options.read bytes of a
|
|
90
|
+
* range of the container
|
|
91
|
+
* @param {bigint|function(): bigint} options.asset_id_low64 what frames are checksummed against;
|
|
92
|
+
* a function when the header is read after construction
|
|
93
|
+
* @param {boolean} [options.verify_frames]
|
|
94
|
+
* @param {number} [options.fetch_retries] attempts after the first
|
|
95
|
+
* @param {number} [options.fetch_retry_backoff_ms] doubled per attempt
|
|
96
|
+
*/
|
|
97
|
+
constructor({
|
|
98
|
+
read,
|
|
99
|
+
asset_id_low64,
|
|
100
|
+
verify_frames = false,
|
|
101
|
+
fetch_retries = 2,
|
|
102
|
+
fetch_retry_backoff_ms = 50,
|
|
103
|
+
}) {
|
|
104
|
+
assert.isFunction(read, 'read');
|
|
105
|
+
assert.isNonNegativeInteger(fetch_retries, 'fetch_retries');
|
|
106
|
+
assert.isNonNegativeInteger(fetch_retry_backoff_ms, 'fetch_retry_backoff_ms');
|
|
107
|
+
|
|
108
|
+
this.#read = read;
|
|
109
|
+
this.#asset_id_low64 = asset_id_low64;
|
|
110
|
+
this.#verify_frames = verify_frames;
|
|
111
|
+
this.#fetch_retries = fetch_retries;
|
|
112
|
+
this.#fetch_retry_backoff_ms = fetch_retry_backoff_ms;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* @param {number} page_index
|
|
117
|
+
* @param {number} frame_offset absolute, in the container
|
|
118
|
+
* @param {number} fetch_size
|
|
119
|
+
* @param {AbortSignal} [signal]
|
|
120
|
+
* @returns {Promise<VGeoPage>}
|
|
121
|
+
* @throws {VGeoFetchError}
|
|
122
|
+
*/
|
|
123
|
+
async fetch(page_index, frame_offset, fetch_size, signal = undefined) {
|
|
124
|
+
for (let attempt = 0; ; attempt++) {
|
|
125
|
+
try {
|
|
126
|
+
return await this.#once(page_index, frame_offset, fetch_size, signal);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
if (signal !== undefined && signal.aborted) {
|
|
129
|
+
// cancelled rather than failed: nothing is wrong with this page
|
|
130
|
+
throw new VGeoFetchError(
|
|
131
|
+
`page ${page_index}: the fetch was cancelled`, false, String(e?.message ?? e)
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const reason = String(e?.message ?? e);
|
|
136
|
+
|
|
137
|
+
if (attempt >= this.#fetch_retries) {
|
|
138
|
+
throw new VGeoFetchError(
|
|
139
|
+
`page ${page_index} is quarantined after ${attempt + 1} attempt(s): ${reason}`,
|
|
140
|
+
true,
|
|
141
|
+
reason
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
await delay(this.#fetch_retry_backoff_ms * (1 << attempt), signal);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @param {number} page_index
|
|
152
|
+
* @param {number} frame_offset
|
|
153
|
+
* @param {number} fetch_size
|
|
154
|
+
* @param {AbortSignal|undefined} signal
|
|
155
|
+
* @returns {Promise<VGeoPage>}
|
|
156
|
+
*/
|
|
157
|
+
async #once(page_index, frame_offset, fetch_size, signal) {
|
|
158
|
+
const bytes = await this.#read(frame_offset, fetch_size, signal);
|
|
159
|
+
|
|
160
|
+
if (this.#verify_frames) {
|
|
161
|
+
this.#verify_frame(bytes, page_index);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const page = vgeo_read_page(bytes, page_index);
|
|
165
|
+
|
|
166
|
+
page.frame_offset = frame_offset;
|
|
167
|
+
|
|
168
|
+
return page;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* The identity-seeded frame checksum, against what the frame stores.
|
|
173
|
+
*
|
|
174
|
+
* @param {Uint8Array} bytes
|
|
175
|
+
* @param {number} page_index
|
|
176
|
+
*/
|
|
177
|
+
#verify_frame(bytes, page_index) {
|
|
178
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
179
|
+
|
|
180
|
+
const frame = vgeo_read_frame_extent(view, 0, page_index);
|
|
181
|
+
|
|
182
|
+
const stored = view.getBigUint64(VGEO_FRAME_OFFSET.CHECKSUM, LE);
|
|
183
|
+
|
|
184
|
+
const copy = bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength
|
|
185
|
+
? bytes.buffer
|
|
186
|
+
: bytes.slice().buffer;
|
|
187
|
+
|
|
188
|
+
const asset_id = typeof this.#asset_id_low64 === 'function'
|
|
189
|
+
? this.#asset_id_low64()
|
|
190
|
+
: this.#asset_id_low64;
|
|
191
|
+
|
|
192
|
+
const computed = vgeo_compute_frame_checksum(
|
|
193
|
+
BinaryBuffer.fromArrayBuffer(copy), frame, asset_id
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
if (computed !== stored) {
|
|
197
|
+
throw new Error(
|
|
198
|
+
`page ${page_index}: its frame checksums to 0x${computed.toString(16)}`
|
|
199
|
+
+ ` and stores 0x${stored.toString(16)}`
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @param {number} ms
|
|
207
|
+
* @param {AbortSignal|undefined} signal
|
|
208
|
+
* @returns {Promise<void>}
|
|
209
|
+
*/
|
|
210
|
+
function delay(ms, signal) {
|
|
211
|
+
if (ms <= 0) {
|
|
212
|
+
return Promise.resolve();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Checked rather than relied on: `addEventListener` on a signal that has already aborted never
|
|
216
|
+
// fires, so a wait started on one would run to term with nobody left who wanted it.
|
|
217
|
+
if (signal !== undefined && signal.aborted) {
|
|
218
|
+
return Promise.reject(signal.reason ?? new Error('the wait was cancelled'));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return new Promise((resolve, reject) => {
|
|
222
|
+
const on_abort = () => {
|
|
223
|
+
clearTimeout(timer);
|
|
224
|
+
|
|
225
|
+
reject(signal.reason ?? new Error('the wait was cancelled'));
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const timer = setTimeout(() => {
|
|
229
|
+
signal?.removeEventListener('abort', on_abort);
|
|
230
|
+
|
|
231
|
+
resolve();
|
|
232
|
+
}, ms);
|
|
233
|
+
|
|
234
|
+
signal?.addEventListener('abort', on_abort, { once: true });
|
|
235
|
+
});
|
|
236
|
+
}
|
|
@@ -100,5 +100,19 @@ export class VGeoReadOptions {
|
|
|
100
100
|
* @type {number}
|
|
101
101
|
*/
|
|
102
102
|
fetch_retry_backoff_ms: number;
|
|
103
|
+
/**
|
|
104
|
+
* Whether the reader keeps its own selectability — the RAM tier's answer to design §6's
|
|
105
|
+
* activation rule, a live-reference counter per resident group with a pending index for pages
|
|
106
|
+
* not yet here — as pages are installed and evicted.
|
|
107
|
+
*
|
|
108
|
+
* On for a tool or a viewer that cuts on the CPU, which is what `is_selectable` serves. Off for
|
|
109
|
+
* a reader a `VGeoResidency` owns: the runtime answers activation in the VRAM arena and never
|
|
110
|
+
* asks the reader, and at fifty thousand resident pages the counters and the pending index are
|
|
111
|
+
* tens of megabytes of nested maps nobody reads (RUNTIME_PLAN_2026_09_14 §4.6). With it off,
|
|
112
|
+
* `is_selectable` answers false for every group.
|
|
113
|
+
*
|
|
114
|
+
* @type {boolean}
|
|
115
|
+
*/
|
|
116
|
+
track_selectability: boolean;
|
|
103
117
|
}
|
|
104
118
|
//# sourceMappingURL=VGeoReadOptions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VGeoReadOptions.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH;IACI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,mBAFU,MAAM,CAEc;IAE9B;;;;;;;;;;;;;;OAcG;IACH,UAFU,OAAO,CAEA;IAEjB;;;;;;;;;;;;;;;OAeG;IACH,eAFU,OAAO,CAEK;IAEtB;;;;;;;;;;;;OAYG;IACH,wBAFU,MAAM,CAEW;IAE3B;;;;;;;;;OASG;IACH,eAFU,MAAM,CAEE;IAElB;;;;OAIG;IACH,wBAFU,MAAM,CAEY;
|
|
1
|
+
{"version":3,"file":"VGeoReadOptions.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH;IACI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,mBAFU,MAAM,CAEc;IAE9B;;;;;;;;;;;;;;OAcG;IACH,UAFU,OAAO,CAEA;IAEjB;;;;;;;;;;;;;;;OAeG;IACH,eAFU,OAAO,CAEK;IAEtB;;;;;;;;;;;;OAYG;IACH,wBAFU,MAAM,CAEW;IAE3B;;;;;;;;;OASG;IACH,eAFU,MAAM,CAEE;IAElB;;;;OAIG;IACH,wBAFU,MAAM,CAEY;IAE5B;;;;;;;;;;;;OAYG;IACH,qBAFU,OAAO,CAEU;CAC9B"}
|
|
@@ -107,4 +107,19 @@ export class VGeoReadOptions {
|
|
|
107
107
|
* @type {number}
|
|
108
108
|
*/
|
|
109
109
|
fetch_retry_backoff_ms = 50;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Whether the reader keeps its own selectability — the RAM tier's answer to design §6's
|
|
113
|
+
* activation rule, a live-reference counter per resident group with a pending index for pages
|
|
114
|
+
* not yet here — as pages are installed and evicted.
|
|
115
|
+
*
|
|
116
|
+
* On for a tool or a viewer that cuts on the CPU, which is what `is_selectable` serves. Off for
|
|
117
|
+
* a reader a `VGeoResidency` owns: the runtime answers activation in the VRAM arena and never
|
|
118
|
+
* asks the reader, and at fifty thousand resident pages the counters and the pending index are
|
|
119
|
+
* tens of megabytes of nested maps nobody reads (RUNTIME_PLAN_2026_09_14 §4.6). With it off,
|
|
120
|
+
* `is_selectable` answers false for every group.
|
|
121
|
+
*
|
|
122
|
+
* @type {boolean}
|
|
123
|
+
*/
|
|
124
|
+
track_selectability = true;
|
|
110
125
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A byte source rebuilt from what another thread said about it.
|
|
3
|
+
*
|
|
4
|
+
* A `VGeoByteSource` is a closure and cannot cross a worker boundary; its `descriptor` can. The
|
|
5
|
+
* three forms the engine makes carry one: a URL with the length already probed, so a worker opens
|
|
6
|
+
* it with no `HEAD`; a `Blob`, which structured clone carries by reference; and bytes in memory,
|
|
7
|
+
* which are copied once per worker. A source built by hand has no descriptor and stays on the
|
|
8
|
+
* thread that built it.
|
|
9
|
+
*
|
|
10
|
+
* @param {{kind: 'url', url: string, byte_length: number, init?: object}
|
|
11
|
+
* | {kind: 'blob', blob: Blob}
|
|
12
|
+
* | {kind: 'memory', bytes: Uint8Array}} descriptor
|
|
13
|
+
* @returns {VGeoByteSource}
|
|
14
|
+
*
|
|
15
|
+
* @author Alex Goldring
|
|
16
|
+
* @copyright Company Named Limited (c) 2026
|
|
17
|
+
*/
|
|
18
|
+
export function vgeo_byte_source_from_descriptor(descriptor: {
|
|
19
|
+
kind: 'url';
|
|
20
|
+
url: string;
|
|
21
|
+
byte_length: number;
|
|
22
|
+
init?: object;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'blob';
|
|
25
|
+
blob: Blob;
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'memory';
|
|
28
|
+
bytes: Uint8Array;
|
|
29
|
+
}): VGeoByteSource;
|
|
30
|
+
import { VGeoByteSource } from "./VGeoByteSource.js";
|
|
31
|
+
//# sourceMappingURL=vgeo_byte_source_from_descriptor.d.ts.map
|
package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_byte_source_from_descriptor.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,6DARW;IAAC,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,GAChE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAC,GAC1B;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAC,GAC/B,cAAc,CAgB1B;+BA/B8B,qBAAqB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { VGeoByteSource } from "./VGeoByteSource.js";
|
|
2
|
+
import { vgeo_byte_source_over_url } from "./vgeo_fetch_byte_source.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A byte source rebuilt from what another thread said about it.
|
|
6
|
+
*
|
|
7
|
+
* A `VGeoByteSource` is a closure and cannot cross a worker boundary; its `descriptor` can. The
|
|
8
|
+
* three forms the engine makes carry one: a URL with the length already probed, so a worker opens
|
|
9
|
+
* it with no `HEAD`; a `Blob`, which structured clone carries by reference; and bytes in memory,
|
|
10
|
+
* which are copied once per worker. A source built by hand has no descriptor and stays on the
|
|
11
|
+
* thread that built it.
|
|
12
|
+
*
|
|
13
|
+
* @param {{kind: 'url', url: string, byte_length: number, init?: object}
|
|
14
|
+
* | {kind: 'blob', blob: Blob}
|
|
15
|
+
* | {kind: 'memory', bytes: Uint8Array}} descriptor
|
|
16
|
+
* @returns {VGeoByteSource}
|
|
17
|
+
*
|
|
18
|
+
* @author Alex Goldring
|
|
19
|
+
* @copyright Company Named Limited (c) 2026
|
|
20
|
+
*/
|
|
21
|
+
export function vgeo_byte_source_from_descriptor(descriptor) {
|
|
22
|
+
switch (descriptor?.kind) {
|
|
23
|
+
case 'url':
|
|
24
|
+
return vgeo_byte_source_over_url(descriptor.url, descriptor.byte_length, descriptor.init ?? {});
|
|
25
|
+
case 'blob':
|
|
26
|
+
return VGeoByteSource.from_blob(descriptor.blob);
|
|
27
|
+
case 'memory':
|
|
28
|
+
return VGeoByteSource.of(descriptor.bytes);
|
|
29
|
+
default:
|
|
30
|
+
throw new Error(`not a byte source descriptor: ${JSON.stringify(descriptor?.kind)}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -31,5 +31,15 @@
|
|
|
31
31
|
* @copyright Company Named Limited (c) 2026
|
|
32
32
|
*/
|
|
33
33
|
export function vgeo_fetch_byte_source(url: string, init?: RequestInit): Promise<VGeoByteSource>;
|
|
34
|
+
/**
|
|
35
|
+
* The source over a URL whose length is already known — what a worker rebuilds from a
|
|
36
|
+
* descriptor without a second `HEAD`.
|
|
37
|
+
*
|
|
38
|
+
* @param {string} url
|
|
39
|
+
* @param {number} byte_length
|
|
40
|
+
* @param {RequestInit} [init]
|
|
41
|
+
* @returns {VGeoByteSource}
|
|
42
|
+
*/
|
|
43
|
+
export function vgeo_byte_source_over_url(url: string, byte_length: number, init?: RequestInit): VGeoByteSource;
|
|
34
44
|
import { VGeoByteSource } from "./VGeoByteSource.js";
|
|
35
45
|
//# sourceMappingURL=vgeo_fetch_byte_source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_fetch_byte_source.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,4CATW,MAAM,SACN,WAAW,GAET,QAAQ,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"vgeo_fetch_byte_source.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,4CATW,MAAM,SACN,WAAW,GAET,QAAQ,cAAc,CAAC,CAUnC;AAED;;;;;;;;GAQG;AACH,+CALW,MAAM,eACN,MAAM,SACN,WAAW,GACT,cAAc,CA+C1B;+BA9F8B,qBAAqB"}
|
|
@@ -35,7 +35,20 @@ import { VGeoByteSource } from "./VGeoByteSource.js";
|
|
|
35
35
|
export async function vgeo_fetch_byte_source(url, init = {}) {
|
|
36
36
|
const byte_length = await probe_length(url, init);
|
|
37
37
|
|
|
38
|
-
return
|
|
38
|
+
return vgeo_byte_source_over_url(url, byte_length, init);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The source over a URL whose length is already known — what a worker rebuilds from a
|
|
43
|
+
* descriptor without a second `HEAD`.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} url
|
|
46
|
+
* @param {number} byte_length
|
|
47
|
+
* @param {RequestInit} [init]
|
|
48
|
+
* @returns {VGeoByteSource}
|
|
49
|
+
*/
|
|
50
|
+
export function vgeo_byte_source_over_url(url, byte_length, init = {}) {
|
|
51
|
+
const source = new VGeoByteSource(
|
|
39
52
|
byte_length,
|
|
40
53
|
async (offset, length, signal) => {
|
|
41
54
|
if (length === 0) {
|
|
@@ -72,6 +85,13 @@ export async function vgeo_fetch_byte_source(url, init = {}) {
|
|
|
72
85
|
},
|
|
73
86
|
url
|
|
74
87
|
);
|
|
88
|
+
|
|
89
|
+
// a signal cannot cross a worker boundary and belongs to this thread's fetches anyway
|
|
90
|
+
const { signal, ...cloneable } = init;
|
|
91
|
+
|
|
92
|
+
source.descriptor = { kind: 'url', url, byte_length, init: cloneable };
|
|
93
|
+
|
|
94
|
+
return source;
|
|
75
95
|
}
|
|
76
96
|
|
|
77
97
|
/**
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {VGeoPage} page
|
|
3
|
+
* @returns {{record: object, buffers: ArrayBuffer[]}} the record to post, and the buffers to transfer
|
|
4
|
+
*/
|
|
5
|
+
export function vgeo_page_transferable(page: VGeoPage): {
|
|
6
|
+
record: object;
|
|
7
|
+
buffers: ArrayBuffer[];
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* @param {object} record as {@link vgeo_page_transferable} made it
|
|
11
|
+
* @returns {VGeoPage}
|
|
12
|
+
*/
|
|
13
|
+
export function vgeo_page_from_transfer(record: object): VGeoPage;
|
|
14
|
+
import { VGeoPage } from "./VGeoPage.js";
|
|
15
|
+
//# sourceMappingURL=vgeo_page_transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_page_transfer.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,6CAHW,QAAQ,GACN;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAC,CA4BpD;AAED;;;GAGG;AACH,gDAHW,MAAM,GACJ,QAAQ,CAsBpB;yBAnFwB,eAAe"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { VGeoPage } from "./VGeoPage.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A decoded page across a worker boundary, in both directions.
|
|
5
|
+
*
|
|
6
|
+
* `vgeo_read_page` decodes into a `VGeoPage` of some thirty typed arrays, each over its own buffer.
|
|
7
|
+
* Structured clone would copy every one and drop the class; this records each view's kind, offset
|
|
8
|
+
* and length beside its buffer, hands every distinct buffer to the transfer list, and rebuilds the
|
|
9
|
+
* class on the other side — so a page costs a few dozen small allocations to cross and no copy of
|
|
10
|
+
* its bytes.
|
|
11
|
+
*
|
|
12
|
+
* @author Alex Goldring
|
|
13
|
+
* @copyright Company Named Limited (c) 2026
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const VIEW_CONSTRUCTORS = {
|
|
17
|
+
Uint8Array,
|
|
18
|
+
Uint16Array,
|
|
19
|
+
Uint32Array,
|
|
20
|
+
Int8Array,
|
|
21
|
+
Int16Array,
|
|
22
|
+
Int32Array,
|
|
23
|
+
Float32Array,
|
|
24
|
+
Float64Array,
|
|
25
|
+
DataView,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {VGeoPage} page
|
|
30
|
+
* @returns {{record: object, buffers: ArrayBuffer[]}} the record to post, and the buffers to transfer
|
|
31
|
+
*/
|
|
32
|
+
export function vgeo_page_transferable(page) {
|
|
33
|
+
const record = {};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @type {Set<ArrayBuffer>}
|
|
37
|
+
*/
|
|
38
|
+
const buffers = new Set();
|
|
39
|
+
|
|
40
|
+
for (const key of Object.keys(page)) {
|
|
41
|
+
const value = page[key];
|
|
42
|
+
|
|
43
|
+
if (ArrayBuffer.isView(value)) {
|
|
44
|
+
record[key] = {
|
|
45
|
+
view: value.constructor.name,
|
|
46
|
+
buffer: value.buffer,
|
|
47
|
+
offset: value.byteOffset,
|
|
48
|
+
length: value instanceof DataView ? value.byteLength : value.length,
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
buffers.add(value.buffer);
|
|
52
|
+
} else {
|
|
53
|
+
record[key] = value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return { record, buffers: Array.from(buffers) };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* @param {object} record as {@link vgeo_page_transferable} made it
|
|
62
|
+
* @returns {VGeoPage}
|
|
63
|
+
*/
|
|
64
|
+
export function vgeo_page_from_transfer(record) {
|
|
65
|
+
const page = new VGeoPage();
|
|
66
|
+
|
|
67
|
+
for (const key of Object.keys(record)) {
|
|
68
|
+
const value = record[key];
|
|
69
|
+
|
|
70
|
+
if (value !== null && typeof value === 'object' && typeof value.view === 'string') {
|
|
71
|
+
const constructor = VIEW_CONSTRUCTORS[value.view];
|
|
72
|
+
|
|
73
|
+
if (constructor === undefined) {
|
|
74
|
+
throw new Error(`a page came back with a ${value.view} in ${key}`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
page[key] = new constructor(value.buffer, value.offset, value.length);
|
|
78
|
+
} else {
|
|
79
|
+
page[key] = value;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return page;
|
|
84
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The worker side of {@link VGeoPageFetcher}'s protocol, over any port shaped like a worker's
|
|
3
|
+
* global — `onmessage` in, `postMessage(message, transfer)` out — so a spec can serve it over a
|
|
4
|
+
* loopback in-process and the worker entry serves it over `self`.
|
|
5
|
+
*
|
|
6
|
+
* Requests: `{id, source_id, descriptor?, asset_id_low64, verify_frames, fetch_retries,
|
|
7
|
+
* fetch_retry_backoff_ms, page_index, frame_offset, fetch_size}` — the descriptor comes with the
|
|
8
|
+
* first request naming a source and is remembered after; `{cancel: id}` aborts one in flight.
|
|
9
|
+
* Replies: `{id, page}` with the page's buffers transferred, or `{id, error: {message, quarantine,
|
|
10
|
+
* reason}}`.
|
|
11
|
+
*
|
|
12
|
+
* @param {{onmessage: function|null, postMessage: function(object, ArrayBuffer[]=): void}} port
|
|
13
|
+
* @returns {void}
|
|
14
|
+
*
|
|
15
|
+
* @author Alex Goldring
|
|
16
|
+
* @copyright Company Named Limited (c) 2026
|
|
17
|
+
*/
|
|
18
|
+
export function vgeo_page_worker_serve(port: {
|
|
19
|
+
onmessage: Function | null;
|
|
20
|
+
postMessage: (arg0: object, arg1: ArrayBuffer[] | undefined) => void;
|
|
21
|
+
}): void;
|
|
22
|
+
//# sourceMappingURL=vgeo_page_worker_serve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vgeo_page_worker_serve.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;GAgBG;AACH,6CANW;IAAC,SAAS,EAAE,WAAS,IAAI,CAAC;IAAC,WAAW,SAAW,MAAM,QAAE,WAAW,EAAE,iBAAI,IAAI,CAAA;CAAC,GAC7E,IAAI,CA+EhB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { VGeoPageFetcherCore } from "./VGeoPageFetcherCore.js";
|
|
2
|
+
import { vgeo_byte_source_from_descriptor } from "./vgeo_byte_source_from_descriptor.js";
|
|
3
|
+
import { vgeo_page_transferable } from "./vgeo_page_transfer.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The worker side of {@link VGeoPageFetcher}'s protocol, over any port shaped like a worker's
|
|
7
|
+
* global — `onmessage` in, `postMessage(message, transfer)` out — so a spec can serve it over a
|
|
8
|
+
* loopback in-process and the worker entry serves it over `self`.
|
|
9
|
+
*
|
|
10
|
+
* Requests: `{id, source_id, descriptor?, asset_id_low64, verify_frames, fetch_retries,
|
|
11
|
+
* fetch_retry_backoff_ms, page_index, frame_offset, fetch_size}` — the descriptor comes with the
|
|
12
|
+
* first request naming a source and is remembered after; `{cancel: id}` aborts one in flight.
|
|
13
|
+
* Replies: `{id, page}` with the page's buffers transferred, or `{id, error: {message, quarantine,
|
|
14
|
+
* reason}}`.
|
|
15
|
+
*
|
|
16
|
+
* @param {{onmessage: function|null, postMessage: function(object, ArrayBuffer[]=): void}} port
|
|
17
|
+
* @returns {void}
|
|
18
|
+
*
|
|
19
|
+
* @author Alex Goldring
|
|
20
|
+
* @copyright Company Named Limited (c) 2026
|
|
21
|
+
*/
|
|
22
|
+
export function vgeo_page_worker_serve(port) {
|
|
23
|
+
/**
|
|
24
|
+
* @type {Map<number, VGeoPageFetcherCore>}
|
|
25
|
+
*/
|
|
26
|
+
const cores = new Map();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @type {Map<number, AbortController>}
|
|
30
|
+
*/
|
|
31
|
+
const controllers = new Map();
|
|
32
|
+
|
|
33
|
+
port.onmessage = async event => {
|
|
34
|
+
const data = event.data;
|
|
35
|
+
|
|
36
|
+
if (data.cancel !== undefined) {
|
|
37
|
+
controllers.get(data.cancel)?.abort(new Error('cancelled'));
|
|
38
|
+
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const { id, source_id, page_index, frame_offset, fetch_size } = data;
|
|
43
|
+
|
|
44
|
+
let core = cores.get(source_id);
|
|
45
|
+
|
|
46
|
+
if (core === undefined) {
|
|
47
|
+
if (data.descriptor === undefined) {
|
|
48
|
+
port.postMessage({
|
|
49
|
+
id,
|
|
50
|
+
error: {
|
|
51
|
+
message: `page ${page_index}: the worker does not know source ${source_id}`,
|
|
52
|
+
quarantine: false,
|
|
53
|
+
reason: 'no descriptor',
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const source = vgeo_byte_source_from_descriptor(data.descriptor);
|
|
61
|
+
|
|
62
|
+
core = new VGeoPageFetcherCore({
|
|
63
|
+
read: (offset, length, signal) => source.read(offset, length, signal),
|
|
64
|
+
asset_id_low64: data.asset_id_low64,
|
|
65
|
+
verify_frames: data.verify_frames,
|
|
66
|
+
fetch_retries: data.fetch_retries,
|
|
67
|
+
fetch_retry_backoff_ms: data.fetch_retry_backoff_ms,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
cores.set(source_id, core);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
|
|
75
|
+
controllers.set(id, controller);
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
const page = await core.fetch(page_index, frame_offset, fetch_size, controller.signal);
|
|
79
|
+
|
|
80
|
+
const { record, buffers } = vgeo_page_transferable(page);
|
|
81
|
+
|
|
82
|
+
port.postMessage({ id, page: record }, buffers);
|
|
83
|
+
} catch (e) {
|
|
84
|
+
port.postMessage({
|
|
85
|
+
id,
|
|
86
|
+
error: {
|
|
87
|
+
message: String(e?.message ?? e),
|
|
88
|
+
quarantine: e?.quarantine === true,
|
|
89
|
+
reason: e?.reason ?? String(e?.message ?? e),
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
} finally {
|
|
93
|
+
controllers.delete(id);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgeo_read_page.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vgeo_read_page.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js"],"names":[],"mappings":"AAqCA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4CAVW,UAAU,cACV,MAAM,GAEJ,QAAQ,CAiFpB;yBAhHwB,eAAe"}
|