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