@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.
Files changed (236) hide show
  1. package/package.json +1 -1
  2. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +542 -0
  3. package/src/core/binary/lz4/LZ4_LEVEL.d.ts +33 -0
  4. package/src/core/binary/lz4/LZ4_LEVEL.d.ts.map +1 -0
  5. package/src/core/binary/lz4/LZ4_LEVEL.js +32 -0
  6. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts +33 -0
  7. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts.map +1 -0
  8. package/src/core/binary/lz4/lz4_compress_block_at_level.js +47 -0
  9. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts +40 -0
  10. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts.map +1 -0
  11. package/src/core/binary/lz4/lz4_compress_block_hc.js +1382 -0
  12. package/src/core/binary/lz4/lz4_decompress_block.d.ts +2 -1
  13. package/src/core/binary/lz4/lz4_decompress_block.d.ts.map +1 -1
  14. package/src/core/binary/lz4/lz4_decompress_block.js +31 -6
  15. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +14 -7
  16. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  17. package/src/core/geom/3d/shape/HeightMapShape3D.js +87 -78
  18. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  19. package/src/shade/playground/vgeo_runtime/README.md +167 -22
  20. package/src/shade/playground/vgeo_runtime/index.html +112 -62
  21. package/src/shade/playground/vgeo_runtime/main.js +660 -83
  22. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
  23. package/src/shade/playground/vgeo_viewer/sample_asset.js +19 -2
  24. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +11 -0
  25. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  26. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +16 -8
  27. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  28. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +16 -11
  29. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +73 -5
  30. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +26 -15
  31. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +5 -3
  32. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +18 -0
  33. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  34. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +20 -0
  35. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
  36. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +56 -9
  37. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  38. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +1 -0
  39. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +22 -0
  40. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  41. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +24 -0
  42. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +12 -0
  43. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  44. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +13 -0
  45. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +8 -1
  46. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  47. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +11 -3
  48. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +9 -0
  49. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  50. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +10 -1
  51. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts +18 -0
  52. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map +1 -0
  53. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js +17 -0
  54. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts +8 -0
  55. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts.map +1 -0
  56. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js +7 -0
  57. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +3 -0
  58. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -0
  59. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts +14 -0
  60. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts.map +1 -0
  61. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js +13 -0
  62. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts +11 -0
  63. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map +1 -0
  64. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js +10 -0
  65. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +20 -0
  66. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
  67. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +20 -2
  68. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +4 -0
  69. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
  70. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +4 -0
  71. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +29 -3
  72. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  73. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +81 -122
  74. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +40 -0
  75. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  76. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +44 -0
  77. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +69 -0
  78. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -0
  79. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +236 -0
  80. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +14 -0
  81. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
  82. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +15 -0
  83. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts +31 -0
  84. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map +1 -0
  85. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js +32 -0
  86. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +10 -0
  87. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
  88. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +21 -1
  89. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts +15 -0
  90. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts.map +1 -0
  91. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js +84 -0
  92. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts +22 -0
  93. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -0
  94. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +96 -0
  95. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  96. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +55 -0
  97. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  98. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +202 -13
  99. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  100. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +147 -10
  101. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +637 -0
  102. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +33 -36
  103. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -1
  104. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +109 -193
  105. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +58 -28
  106. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  107. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +77 -105
  108. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
  109. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +105 -22
  110. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +548 -0
  111. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +29 -50
  112. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  113. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +47 -489
  114. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts +84 -0
  115. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -0
  116. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +393 -0
  117. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts +234 -0
  118. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -0
  119. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +1363 -0
  120. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts +81 -0
  121. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts.map +1 -0
  122. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.js +89 -0
  123. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +53 -34
  124. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  125. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +407 -124
  126. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +100 -0
  127. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -0
  128. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +219 -0
  129. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts +17 -0
  130. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts.map +1 -0
  131. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js +47 -0
  132. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts +20 -0
  133. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts.map +1 -0
  134. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js +19 -0
  135. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -1
  136. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +30 -12
  137. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  138. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +15 -0
  139. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  140. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +18 -1
  141. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -1
  142. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +5 -15
  143. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts +3 -0
  144. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts.map +1 -0
  145. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.js +77 -0
  146. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts +3 -0
  147. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -0
  148. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +186 -0
  149. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
  150. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +20 -8
  151. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  152. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +580 -188
  153. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +15 -18
  154. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -1
  155. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +19 -28
  156. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  157. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +45 -25
  158. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  159. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +11 -0
  160. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  161. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +0 -1
  162. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +12 -10
  163. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +1 -0
  164. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +8 -0
  165. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +7 -2
  166. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -1
  167. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +8 -3
  168. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +2 -0
  169. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +19 -0
  170. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -1
  171. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +1 -1
  172. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts +5 -0
  173. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts.map +1 -0
  174. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js +22 -0
  175. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts +14 -0
  176. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts.map +1 -0
  177. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js +13 -0
  178. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts +17 -0
  179. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map +1 -0
  180. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js +16 -0
  181. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts +15 -0
  182. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts.map +1 -0
  183. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js +16 -0
  184. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts +23 -0
  185. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts.map +1 -0
  186. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js +28 -0
  187. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts +2 -0
  188. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts.map +1 -0
  189. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js +13 -0
  190. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +10 -5
  191. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -1
  192. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +15 -6
  193. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +6 -1
  194. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  195. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +38 -1
  196. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  197. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +4 -3
  198. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  199. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  200. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +6 -3
  201. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  202. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +6 -3
  203. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  204. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  205. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -4
  206. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +2 -0
  207. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  208. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  209. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  210. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +3 -5
  211. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  212. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +3 -4
  213. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  214. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -4
  215. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  216. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +7 -7
  217. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  218. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +83 -78
  219. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  220. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +7 -1
  221. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  222. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +7 -1
  223. package/src/shade/renderer/scene/GPUSceneContext.d.ts +22 -2
  224. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  225. package/src/shade/renderer/scene/GPUSceneContext.js +59 -4
  226. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  227. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +92 -16
  228. package/src/shade/renderer/view/GPUViewContext.d.ts +5 -0
  229. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  230. package/src/shade/renderer/view/GPUViewContext.js +21 -0
  231. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  232. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +74 -3
  233. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +0 -723
  234. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
  235. package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
  236. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
@@ -1,15 +1,22 @@
1
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
2
  import { VGEO_NO_CHILD } from "../cluster/VGEO_NO_CHILD.js";
5
3
  import { VGEO_SAME_PAGE } from "../cluster/VGEO_SAME_PAGE.js";
6
- import { VGEO_FRAME_OFFSET } from "../frame/VGEO_FRAME_OFFSET.js";
7
4
  import { vgeo_read_frame_extent } from "../frame/vgeo_read_frame_extent.js";
5
+ import { VGeoPageFetcherCore } from "./VGeoPageFetcherCore.js";
8
6
  import { VGeoReadOptions } from "./VGeoReadOptions.js";
9
7
  import { vgeo_read_directory } from "./vgeo_read_directory.js";
10
8
  import { vgeo_read_header, vgeo_resident_head_size, VGEO_MIN_HEAD_BYTES } from "./vgeo_read_header.js";
11
9
  import { vgeo_read_page } from "./vgeo_read_page.js";
12
10
 
11
+ /**
12
+ * @typedef {import("./VGeoByteSource.js").VGeoByteSource} VGeoByteSource
13
+ * @typedef {import("./VGeoContainerHeader.js").VGeoContainerHeader} VGeoContainerHeader
14
+ * @typedef {import("../VGeoDefect.js").VGeoDefect} VGeoDefect
15
+ * @typedef {import("./VGeoDirectory.js").VGeoDirectory} VGeoDirectory
16
+ * @typedef {import("./VGeoPage.js").VGeoPage} VGeoPage
17
+ * @typedef {import("./VGeoPageWant.js").VGeoPageWant} VGeoPageWant
18
+ */
19
+
13
20
  /**
14
21
  * Everything in the container is little-endian (`VGEO_FORMAT.md` §2).
15
22
  * @type {boolean}
@@ -121,6 +128,12 @@ export class VGeoContainerReader {
121
128
  */
122
129
  #quarantined = new Map();
123
130
 
131
+ /**
132
+ * Built on first fetch; see {@link #fetcher_core}.
133
+ * @type {VGeoPageFetcherCore|undefined}
134
+ */
135
+ #core;
136
+
124
137
  /**
125
138
  * The speculative head prefix, while it is still paying for itself.
126
139
  *
@@ -861,6 +874,26 @@ export class VGeoContainerReader {
861
874
  return cancelled;
862
875
  }
863
876
 
877
+ /**
878
+ * The fetch, verify and decode logic, over this reader's head-aware read — the same object a
879
+ * worker runs over a byte source of its own.
880
+ *
881
+ * @returns {VGeoPageFetcherCore}
882
+ */
883
+ #fetcher_core() {
884
+ if (this.#core === undefined) {
885
+ this.#core = new VGeoPageFetcherCore({
886
+ read: (offset, length, signal) => this.#read(offset, length, signal),
887
+ asset_id_low64: () => this.header.asset_id_low64,
888
+ verify_frames: this.#options.verify_frames,
889
+ fetch_retries: this.#options.fetch_retries,
890
+ fetch_retry_backoff_ms: this.#options.fetch_retry_backoff_ms,
891
+ });
892
+ }
893
+
894
+ return this.#core;
895
+ }
896
+
864
897
  /**
865
898
  * One page, retried a bounded number of times and then quarantined — §10.
866
899
  *
@@ -871,68 +904,63 @@ export class VGeoContainerReader {
871
904
  * @returns {Promise<VGeoPage>}
872
905
  */
873
906
  async #fetch_page(page_index, frame_offset, fetch_size, signal) {
874
- const retries = this.#options.fetch_retries;
875
-
876
- for (let attempt = 0; ; attempt++) {
877
- try {
878
- return await this.#read_page(page_index, frame_offset, fetch_size, signal);
879
- } catch (e) {
880
- if (signal.aborted) {
881
- // cancelled rather than failed: nothing is wrong with this page
882
- throw signal.reason ?? e;
883
- }
884
-
885
- const reason = String(e?.message ?? e);
886
-
887
- if (attempt >= retries) {
888
- this.#quarantined.set(page_index, reason);
889
-
890
- throw new Error(
891
- `page ${page_index} is quarantined after ${attempt + 1} attempt(s): ${reason}`
892
- );
893
- }
907
+ try {
908
+ const page = await this.#fetcher_core().fetch(page_index, frame_offset, fetch_size, signal);
894
909
 
895
- await delay(this.#options.fetch_retry_backoff_ms * (1 << attempt), signal);
910
+ return this.adopt(page);
911
+ } catch (e) {
912
+ if (e?.quarantine === true) {
913
+ this.#quarantined.set(page_index, e.reason);
896
914
  }
915
+
916
+ throw e;
897
917
  }
898
918
  }
899
919
 
900
920
  /**
901
- * One attempt: the bytes, the checks, the decode, and the residency it becomes.
921
+ * Take a page decoded elsewhere — on a worker, by `VGeoPageFetcher` — as resident.
902
922
  *
903
- * @param {number} page_index
904
- * @param {number} frame_offset
905
- * @param {number} fetch_size
906
- * @param {AbortSignal} signal
907
- * @returns {Promise<VGeoPage>}
923
+ * The one door into the page map for a page this reader did not fetch itself, and the same
924
+ * door its own fetches use. Idempotent: a page already here is returned rather than replaced,
925
+ * because residency is the accounting and two arrivals must cost one page.
926
+ *
927
+ * @param {VGeoPage} page
928
+ * @returns {VGeoPage} the resident page, which is the one given unless one was already here
908
929
  */
909
- async #read_page(page_index, frame_offset, fetch_size, signal) {
910
- const bytes = await this.#read(frame_offset, fetch_size, signal);
911
-
912
- if (this.#options.verify_frames) {
913
- this.#verify_frame(bytes, page_index);
914
- }
930
+ adopt(page) {
931
+ assert.defined(page, 'page');
915
932
 
916
- const page = vgeo_read_page(bytes, page_index);
933
+ const existing = this.#pages.get(page.index);
917
934
 
918
- page.frame_offset = frame_offset;
919
-
920
- // Two callers can reach here for one page only if the second started before the first
921
- // resolved, which `#pending` already prevents — but residency is the accounting, so it is
922
- // read here rather than assumed.
923
- if (!this.#pages.has(page_index)) {
924
- this.#pages.set(page_index, page);
935
+ if (existing !== undefined) {
936
+ return existing;
937
+ }
925
938
 
926
- this.#resident_bytes += page.decoded_size;
939
+ this.#pages.set(page.index, page);
940
+ this.#resident_bytes += page.decoded_size;
927
941
 
928
- // after the page is resident, because the cascade reads residency to decide whether a
929
- // reference lands on a counter or waits in the pending index — including this page's own
942
+ // after the page is resident, because the cascade reads residency to decide whether a
943
+ // reference lands on a counter or waits in the pending index — including this page's own
944
+ if (this.#options.track_selectability) {
930
945
  this.#activate_page(page);
931
946
  }
932
947
 
933
- return this.#pages.get(page_index);
948
+ return page;
934
949
  }
935
950
 
951
+ /**
952
+ * Record that a page will not arrive from this source, so that it is not asked for again
953
+ * until {@link clear_quarantine}. What a fetch that ran elsewhere reports back.
954
+ *
955
+ * @param {number} page_index
956
+ * @param {string} reason
957
+ * @returns {void}
958
+ */
959
+ quarantine_page(page_index, reason) {
960
+ assert.isNonNegativeInteger(page_index, 'page_index');
961
+
962
+ this.#quarantined.set(page_index, String(reason));
963
+ }
936
964
  /**
937
965
  * Install the page a want names.
938
966
  *
@@ -1058,8 +1086,10 @@ export class VGeoContainerReader {
1058
1086
  */
1059
1087
  const selectable = this.#selectable.get(page_index);
1060
1088
 
1061
- for (let group = 0; group < selectable.length; group++) {
1062
- this.#cascade_deactivate(page_index, group);
1089
+ if (selectable !== undefined) {
1090
+ for (let group = 0; group < selectable.length; group++) {
1091
+ this.#cascade_deactivate(page_index, group);
1092
+ }
1063
1093
  }
1064
1094
 
1065
1095
  /*
@@ -1067,7 +1097,7 @@ export class VGeoContainerReader {
1067
1097
  that are still here and still selectable — so they move back to the pending index, and a
1068
1098
  re-install starts its counters where they left off rather than at zero.
1069
1099
  */
1070
- const live = this.#live_refs.get(page_index);
1100
+ const live = this.#live_refs.get(page_index) ?? new Uint16Array(0);
1071
1101
 
1072
1102
  const held = new Map();
1073
1103
 
@@ -1250,75 +1280,4 @@ export class VGeoContainerReader {
1250
1280
 
1251
1281
  this.#head = grown;
1252
1282
  }
1253
-
1254
- /**
1255
- * Check a frame against its identity-seeded checksum before anything decodes it.
1256
- *
1257
- * The seed is `asset_id_low64 XOR page_index`, so this catches a well-formed frame of the wrong
1258
- * page or the wrong asset as well as corruption — which is the case a traversal can actually
1259
- * produce, by following a child-table entry whose offset is wrong.
1260
- *
1261
- * @param {Uint8Array} bytes the fetched frame
1262
- * @param {number} page_index
1263
- */
1264
- #verify_frame(bytes, page_index) {
1265
- const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
1266
-
1267
- const frame = vgeo_read_frame_extent(view, 0, page_index);
1268
-
1269
- const stored = view.getBigUint64(VGEO_FRAME_OFFSET.CHECKSUM, LE);
1270
-
1271
- const copy = bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength
1272
- ? bytes.buffer
1273
- : bytes.slice().buffer;
1274
-
1275
- const computed = vgeo_compute_frame_checksum(
1276
- BinaryBuffer.fromArrayBuffer(copy), frame, this.header.asset_id_low64
1277
- );
1278
-
1279
- if (computed !== stored) {
1280
- throw new Error(
1281
- `page ${page_index}: its frame checksums to 0x${computed.toString(16)}`
1282
- + ` and stores 0x${stored.toString(16)}`
1283
- );
1284
- }
1285
- }
1286
- }
1287
-
1288
- /**
1289
- * Wait, unless the caller stops wanting to.
1290
- *
1291
- * The timer is cleared on abort rather than left to fire, because a backoff between retries of a
1292
- * page nobody wants any more is exactly the wait a cancelled fetch should not sit through.
1293
- *
1294
- * @param {number} ms
1295
- * @param {AbortSignal} signal
1296
- * @returns {Promise<void>}
1297
- */
1298
- function delay(ms, signal) {
1299
- if (ms <= 0) {
1300
- return Promise.resolve();
1301
- }
1302
-
1303
- // Checked rather than relied on: `addEventListener` on a signal that has already aborted never
1304
- // fires, so a wait started on one would run to term with nobody left who wanted it.
1305
- if (signal.aborted) {
1306
- return Promise.reject(signal.reason ?? new Error('the wait was cancelled'));
1307
- }
1308
-
1309
- return new Promise((resolve, reject) => {
1310
- const on_abort = () => {
1311
- clearTimeout(timer);
1312
-
1313
- reject(signal.reason ?? new Error('the wait was cancelled'));
1314
- };
1315
-
1316
- const timer = setTimeout(() => {
1317
- signal.removeEventListener('abort', on_abort);
1318
-
1319
- resolve();
1320
- }, ms);
1321
-
1322
- signal.addEventListener('abort', on_abort, { once: true });
1323
- });
1324
1283
  }
@@ -141,6 +141,46 @@ export class VGeoPage {
141
141
  * @type {Uint16Array}
142
142
  */
143
143
  group_parent_count: Uint16Array;
144
+ /**
145
+ * Per group: where its run in {@link parent_ref}/{@link parent_cluster} starts. The run is
146
+ * {@link group_parent_count} long, and the groups tile the table in order.
147
+ *
148
+ * Empty on a container written before `format_version` 4, which carries no upward edge at all.
149
+ * The absence is the header's `parent_table_offset` reading zero rather than a version test,
150
+ * so a reader that wants to walk up asks whether these arrays are populated.
151
+ *
152
+ * @type {Uint32Array}
153
+ */
154
+ group_parent_first: Uint32Array;
155
+ /**
156
+ * Index into {@link parent_page_index}, or `VGEO_SAME_PAGE`, for each entry of the
157
+ * group-parent table.
158
+ *
159
+ * The table is the format's only upward edge (§6.3). A cluster names one child group, so every
160
+ * entry here mirrors exactly one `child_ref`/`child_group` pair somewhere, and format §11.16
161
+ * holds the two to each other — which is what lets a cut that has descended to a group find the
162
+ * clusters that would stand in for it if the camera pulled back, without re-descending from the
163
+ * root to discover them.
164
+ *
165
+ * @type {Uint16Array}
166
+ */
167
+ parent_ref: Uint16Array;
168
+ /**
169
+ * Cluster index within the page {@link parent_ref} names.
170
+ * @type {Uint16Array}
171
+ */
172
+ parent_cluster: Uint16Array;
173
+ /**
174
+ * `parent_ref -> page index`, deduplicated and ascending.
175
+ *
176
+ * No fetch range, unlike {@link child_page_index}, and the asymmetry is the point: a child may
177
+ * be absent and the decision to fetch it is made before it arrives, while a parent of a group in
178
+ * the cut is resident already — `VGEO_GROUP_FLAG_SELECTABLE` is exactly "every parent reference
179
+ * is live". So a parent reference has nothing to decide and says only where.
180
+ *
181
+ * @type {Uint32Array}
182
+ */
183
+ parent_page_index: Uint32Array;
144
184
  /**
145
185
  * @type {number}
146
186
  */
@@ -1 +1 @@
1
- {"version":3,"file":"VGeoPage.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoPage.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,cAFU,MAAM,CAEC;IAEjB;;OAEG;IACH,YAFU,MAAM,CAED;IAEf;;;;;OAKG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,cAFU,MAAM,CAEC;IAEjB;;;OAGG;IACH,OAFU,UAAU,CAEM;IAE1B;;;;;OAKG;IACH,MAFU,QAAQ,CAEsB;IAExC;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,gBAFU,MAAM,CAEG;IAEnB;;OAEG;IACH,cAFU,MAAM,CAEC;IAEjB;;OAEG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;;;OAKG;IACH,oBAFU,YAAY,CAEmB;IAEzC;;OAEG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;OAGG;IACH,oBAFU,WAAW,CAEmB;IAExC;;;;;;;;;;;;OAYG;IACH,qBAFU,YAAY,CAEoB;IAE1C;;OAEG;IACH,6BAFU,YAAY,CAE4B;IAElD;;OAEG;IACH,+BAFU,YAAY,CAE8B;IAEpD;;;OAGG;IACH,qBAFU,WAAW,CAEoB;IAEzC;;OAEG;IACH,qBAFU,WAAW,CAEoB;IAEzC;;;;OAIG;IACH,oBAFU,WAAW,CAEmB;IAExC;;OAEG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,aAFU,YAAY,CAEY;IAElC;;OAEG;IACH,YAFU,YAAY,CAEW;IAEjC;;OAEG;IACH,cAFU,YAAY,CAEa;IAEnC;;;;;;;;;OASG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;;;;;;OAQG;IACH,MAFU,YAAY,CAEK;IAE3B;;;OAGG;IACH,WAFU,WAAW,CAEU;IAE/B;;;OAGG;IACH,aAFU,WAAW,CAEY;IAEjC;;OAEG;IACH,gBAFU,WAAW,CAEe;IAEpC;;;OAGG;IACH,wBAFU,WAAW,CAEuB;IAE5C;;;;OAIG;IACH,sBAFU,WAAW,CAEqB;IAE1C;;OAEG;IACH,cAFU,UAAU,CAEa;IAEjC;;OAEG;IACH,gBAFU,UAAU,CAEe;IAEnC;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;;;;;;;;OAUG;IACH,aAFU,YAAY,CAEY;IAElC;;;OAGG;IACH,qBAFU,YAAY,CAEoB;IAE1C;;;;;;;;OAQG;IACH,uBAFU,YAAY,CAEsB;IAE5C;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;OAGG;IACH,YAFU,WAAW,CAEW;IAEhC;;;;;;;OAOG;IACH,QAFU,YAAY,CAEO;IAE7B;;;;;;;;;;;;OAYG;IACH,iCAFU,MAAM,CAEoB;IAEpC;;;;;OAKG;IACH,oBAHW,MAAM,GACJ,MAAM,CAIlB;CACJ"}
1
+ {"version":3,"file":"VGeoPage.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoPage.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH;IACI;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,cAFU,MAAM,CAEC;IAEjB;;OAEG;IACH,YAFU,MAAM,CAED;IAEf;;;;;OAKG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,cAFU,MAAM,CAEC;IAEjB;;;OAGG;IACH,OAFU,UAAU,CAEM;IAE1B;;;;;OAKG;IACH,MAFU,QAAQ,CAEsB;IAExC;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;OAEG;IACH,WAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,gBAFU,MAAM,CAEG;IAEnB;;OAEG;IACH,cAFU,MAAM,CAEC;IAEjB;;OAEG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;;;OAKG;IACH,oBAFU,YAAY,CAEmB;IAEzC;;OAEG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;OAGG;IACH,oBAFU,WAAW,CAEmB;IAExC;;;;;;;;;;;;OAYG;IACH,qBAFU,YAAY,CAEoB;IAE1C;;OAEG;IACH,6BAFU,YAAY,CAE4B;IAElD;;OAEG;IACH,+BAFU,YAAY,CAE8B;IAEpD;;;OAGG;IACH,qBAFU,WAAW,CAEoB;IAEzC;;OAEG;IACH,qBAFU,WAAW,CAEoB;IAEzC;;;;OAIG;IACH,oBAFU,WAAW,CAEmB;IAExC;;;;;;;;;OASG;IACH,oBAFU,WAAW,CAEmB;IAExC;;;;;;;;;;;OAWG;IACH,YAFU,WAAW,CAEW;IAEhC;;;OAGG;IACH,gBAFU,WAAW,CAEe;IAEpC;;;;;;;;;OASG;IACH,mBAFU,WAAW,CAEkB;IAEvC;;OAEG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,aAFU,YAAY,CAEY;IAElC;;OAEG;IACH,YAFU,YAAY,CAEW;IAEjC;;OAEG;IACH,cAFU,YAAY,CAEa;IAEnC;;;;;;;;;OASG;IACH,eAFU,YAAY,CAEc;IAEpC;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;;;;;;;OAQG;IACH,MAFU,YAAY,CAEK;IAE3B;;;OAGG;IACH,WAFU,WAAW,CAEU;IAE/B;;;OAGG;IACH,aAFU,WAAW,CAEY;IAEjC;;OAEG;IACH,gBAFU,WAAW,CAEe;IAEpC;;;OAGG;IACH,wBAFU,WAAW,CAEuB;IAE5C;;;;OAIG;IACH,sBAFU,WAAW,CAEqB;IAE1C;;OAEG;IACH,cAFU,UAAU,CAEa;IAEjC;;OAEG;IACH,gBAFU,UAAU,CAEe;IAEnC;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;;;;;;;;OAUG;IACH,aAFU,YAAY,CAEY;IAElC;;;OAGG;IACH,qBAFU,YAAY,CAEoB;IAE1C;;;;;;;;OAQG;IACH,uBAFU,YAAY,CAEsB;IAE5C;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;OAGG;IACH,kBAFU,WAAW,CAEiB;IAEtC;;;OAGG;IACH,YAFU,WAAW,CAEW;IAEhC;;;;;;;OAOG;IACH,QAFU,YAAY,CAEO;IAE7B;;;;;;;;;;;;OAYG;IACH,iCAFU,MAAM,CAEoB;IAEpC;;;;;OAKG;IACH,oBAHW,MAAM,GACJ,MAAM,CAIlB;CACJ"}
@@ -164,6 +164,50 @@ export class VGeoPage {
164
164
  */
165
165
  group_parent_count = new Uint16Array(0);
166
166
 
167
+ /**
168
+ * Per group: where its run in {@link parent_ref}/{@link parent_cluster} starts. The run is
169
+ * {@link group_parent_count} long, and the groups tile the table in order.
170
+ *
171
+ * Empty on a container written before `format_version` 4, which carries no upward edge at all.
172
+ * The absence is the header's `parent_table_offset` reading zero rather than a version test,
173
+ * so a reader that wants to walk up asks whether these arrays are populated.
174
+ *
175
+ * @type {Uint32Array}
176
+ */
177
+ group_parent_first = new Uint32Array(0);
178
+
179
+ /**
180
+ * Index into {@link parent_page_index}, or `VGEO_SAME_PAGE`, for each entry of the
181
+ * group-parent table.
182
+ *
183
+ * The table is the format's only upward edge (§6.3). A cluster names one child group, so every
184
+ * entry here mirrors exactly one `child_ref`/`child_group` pair somewhere, and format §11.16
185
+ * holds the two to each other — which is what lets a cut that has descended to a group find the
186
+ * clusters that would stand in for it if the camera pulled back, without re-descending from the
187
+ * root to discover them.
188
+ *
189
+ * @type {Uint16Array}
190
+ */
191
+ parent_ref = new Uint16Array(0);
192
+
193
+ /**
194
+ * Cluster index within the page {@link parent_ref} names.
195
+ * @type {Uint16Array}
196
+ */
197
+ parent_cluster = new Uint16Array(0);
198
+
199
+ /**
200
+ * `parent_ref -> page index`, deduplicated and ascending.
201
+ *
202
+ * No fetch range, unlike {@link child_page_index}, and the asymmetry is the point: a child may
203
+ * be absent and the decision to fetch it is made before it arrives, while a parent of a group in
204
+ * the cut is resident already — `VGEO_GROUP_FLAG_SELECTABLE` is exactly "every parent reference
205
+ * is live". So a parent reference has nothing to decide and says only where.
206
+ *
207
+ * @type {Uint32Array}
208
+ */
209
+ parent_page_index = new Uint32Array(0);
210
+
167
211
  /**
168
212
  * @type {number}
169
213
  */
@@ -0,0 +1,69 @@
1
+ /**
2
+ * How a fetch ends when it does not end in a page.
3
+ *
4
+ * `quarantine` is the verdict the reader acts on: `true` means the page will not arrive from this
5
+ * source — every attempt failed the same way — and asking again is a storm; `false` means the
6
+ * fetch was cancelled, nothing is wrong with the page, and the next cut may ask again.
7
+ */
8
+ export class VGeoFetchError extends Error {
9
+ /**
10
+ * @param {string} message
11
+ * @param {boolean} quarantine
12
+ * @param {string} reason
13
+ */
14
+ constructor(message: string, quarantine: boolean, reason: string);
15
+ /**
16
+ * @type {boolean}
17
+ */
18
+ quarantine: boolean;
19
+ /**
20
+ * The last attempt's failure, in the source's own words.
21
+ * @type {string}
22
+ */
23
+ reason: string;
24
+ }
25
+ /**
26
+ * One page from bytes: read the range, retry with backoff, verify the frame against the asset's
27
+ * identity, decode.
28
+ *
29
+ * Pure logic over a `read` function, so that it runs anywhere — on the main thread inside
30
+ * `VGeoContainerReader`, whose `install` has always done exactly this, or in a worker, which is
31
+ * where a runtime wants it. Measured on the Zorah bdf6f961 container, the checksum is 1.0 ms a
32
+ * page and the decode 0.08 ms; at thirty-two pages a reading that is a frame of main-thread time
33
+ * for what is, on a worker, the residency cost of thirty-two arrivals
34
+ * (RUNTIME_PLAN_2026_09_14 §0, §4.6).
35
+ *
36
+ * @author Alex Goldring
37
+ * @copyright Company Named Limited (c) 2026
38
+ */
39
+ export class VGeoPageFetcherCore {
40
+ /**
41
+ * @param {Object} options
42
+ * @param {function(number, number, AbortSignal=): Promise<Uint8Array>} options.read bytes of a
43
+ * range of the container
44
+ * @param {bigint|function(): bigint} options.asset_id_low64 what frames are checksummed against;
45
+ * a function when the header is read after construction
46
+ * @param {boolean} [options.verify_frames]
47
+ * @param {number} [options.fetch_retries] attempts after the first
48
+ * @param {number} [options.fetch_retry_backoff_ms] doubled per attempt
49
+ */
50
+ constructor({ read, asset_id_low64, verify_frames, fetch_retries, fetch_retry_backoff_ms, }: {
51
+ read: (arg0: number, arg1: number, arg2: AbortSignal | undefined) => Promise<Uint8Array>;
52
+ asset_id_low64: bigint | (() => bigint);
53
+ verify_frames?: boolean;
54
+ fetch_retries?: number;
55
+ fetch_retry_backoff_ms?: number;
56
+ });
57
+ /**
58
+ * @param {number} page_index
59
+ * @param {number} frame_offset absolute, in the container
60
+ * @param {number} fetch_size
61
+ * @param {AbortSignal} [signal]
62
+ * @returns {Promise<VGeoPage>}
63
+ * @throws {VGeoFetchError}
64
+ */
65
+ fetch(page_index: number, frame_offset: number, fetch_size: number, signal?: AbortSignal): Promise<VGeoPage>;
66
+ #private;
67
+ }
68
+ export type VGeoPage = import("./VGeoPage.js").VGeoPage;
69
+ //# sourceMappingURL=VGeoPageFetcherCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VGeoPageFetcherCore.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH;IAYI;;;;OAIG;IACH,qBAJW,MAAM,cACN,OAAO,UACP,MAAM,EAQhB;IAtBD;;OAEG;IACH,YAFU,OAAO,CAEN;IAEX;;;OAGG;IACH,QAFU,MAAM,CAET;CAcV;AAED;;;;;;;;;;;;;GAaG;AACH;IA0BI;;;;;;;;;OASG;IACH;QARgF,IAAI,SAAhE,MAAM,QAAE,MAAM,QAAE,WAAW,iBAAI,QAAQ,UAAU,CAAC;QAExB,cAAc,EAAjD,MAAM,UAAa,MAAM,CAAA;QAEP,aAAa,GAA/B,OAAO;QACU,aAAa,GAA9B,MAAM;QACW,sBAAsB,GAAvC,MAAM;OAkBhB;IAED;;;;;;;OAOG;IACH,kBAPW,MAAM,gBACN,MAAM,cACN,MAAM,WACN,WAAW,GACT,QAAQ,QAAQ,CAAC,CA4B7B;;CAuDJ;uBAlMY,OAAO,eAAe,EAAE,QAAQ"}