@woosh/meep-engine 3.26.0 → 3.28.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 (449) hide show
  1. package/build/bundle-worker-terrain.js +1 -1
  2. package/package.json +1 -1
  3. package/src/core/binary/lz4/LZ4_HIGH_COMPRESSION_PLAN_2026_09_14.md +542 -0
  4. package/src/core/binary/lz4/LZ4_LEVEL.d.ts +33 -0
  5. package/src/core/binary/lz4/LZ4_LEVEL.d.ts.map +1 -0
  6. package/src/core/binary/lz4/LZ4_LEVEL.js +32 -0
  7. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts +33 -0
  8. package/src/core/binary/lz4/lz4_compress_block_at_level.d.ts.map +1 -0
  9. package/src/core/binary/lz4/lz4_compress_block_at_level.js +47 -0
  10. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts +40 -0
  11. package/src/core/binary/lz4/lz4_compress_block_hc.d.ts.map +1 -0
  12. package/src/core/binary/lz4/lz4_compress_block_hc.js +1382 -0
  13. package/src/core/binary/lz4/lz4_decompress_block.d.ts +2 -1
  14. package/src/core/binary/lz4/lz4_decompress_block.d.ts.map +1 -1
  15. package/src/core/binary/lz4/lz4_decompress_block.js +31 -6
  16. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts +15 -0
  17. package/src/core/geom/3d/mat4/m4_linear_determinant.d.ts.map +1 -0
  18. package/src/core/geom/3d/mat4/m4_linear_determinant.js +24 -0
  19. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts +4 -2
  20. package/src/core/geom/3d/mat4/m4_normal_matrix3.d.ts.map +1 -1
  21. package/src/core/geom/3d/mat4/m4_normal_matrix3.js +21 -11
  22. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts +14 -7
  23. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  24. package/src/core/geom/3d/shape/HeightMapShape3D.js +87 -78
  25. package/src/engine/Engine.d.ts.map +1 -1
  26. package/src/engine/Engine.js +38 -1
  27. package/src/engine/graphics3/GraphicsEngine.d.ts +5 -1
  28. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  29. package/src/engine/graphics3/GraphicsEngine.js +834 -830
  30. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  31. package/src/shade/RENDERER_CONTRACT.md +19 -10
  32. package/src/shade/device/timing/GPU_PROFILER_PROPOSAL_2026_08_28.md +1 -1
  33. package/src/shade/playground/vgeo_runtime/README.md +186 -27
  34. package/src/shade/playground/vgeo_runtime/index.html +112 -62
  35. package/src/shade/playground/vgeo_runtime/main.js +678 -88
  36. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts +18 -0
  37. package/src/shade/playground/vgeo_runtime/sample_asset.d.ts.map +1 -0
  38. package/src/shade/playground/{vgeo_viewer → vgeo_runtime}/sample_asset.js +23 -5
  39. package/src/shade/playground/vgeo_scene/README.md +408 -0
  40. package/src/shade/playground/vgeo_scene/index.html +144 -0
  41. package/src/shade/playground/vgeo_scene/main.d.ts +2 -0
  42. package/src/shade/playground/vgeo_scene/main.d.ts.map +1 -0
  43. package/src/shade/playground/vgeo_scene/main.js +1716 -0
  44. package/src/shade/playground/vgeo_viewer/sample_asset.d.ts.map +1 -1
  45. package/src/shade/renderer/Renderer.d.ts +4 -1
  46. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  47. package/src/shade/renderer/Renderer.js +5 -2
  48. package/src/shade/renderer/extension/RENDER_EXTENSION_DESIGN.md +1 -2
  49. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +11 -0
  50. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  51. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +16 -8
  52. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  53. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +16 -11
  54. package/src/shade/renderer/geometry/meshlet/MeshletBatch.d.ts.map +1 -1
  55. package/src/shade/renderer/geometry/meshlet/MeshletBatch.js +3 -29
  56. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts +22 -0
  57. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.d.ts.map +1 -0
  58. package/src/shade/renderer/geometry/meshlet/encoding/ENCODED_ATTRIBUTE_DEFAULT_VALUES.js +49 -0
  59. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +77 -7
  60. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +36 -23
  61. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +17 -14
  62. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +19 -1
  63. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
  64. package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +21 -1
  65. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.d.ts.map +1 -1
  66. package/src/shade/renderer/geometry/virtual/build/gltf/gltf_open_document.js +5 -9
  67. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts +32 -0
  68. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevel.d.ts.map +1 -0
  69. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts +59 -0
  70. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelOptions.d.ts.map +1 -0
  71. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts +44 -0
  72. package/src/shade/renderer/geometry/virtual/build/level/VGeoLevelSummary.d.ts.map +1 -0
  73. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts +36 -0
  74. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_levels.d.ts.map +1 -0
  75. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_levels.js → level/vgeo_build_levels.js} +61 -95
  76. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts +19 -0
  77. package/src/shade/renderer/geometry/virtual/build/level/vgeo_build_root_group.d.ts.map +1 -0
  78. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_root_group.js → level/vgeo_build_root_group.js} +1 -1
  79. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts +73 -0
  80. package/src/shade/renderer/geometry/virtual/build/mesh/VirtualGeometryMesh.d.ts.map +1 -0
  81. package/src/shade/renderer/geometry/virtual/build/{VirtualGeometryMesh.js → mesh/VirtualGeometryMesh.js} +7 -7
  82. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts +29 -0
  83. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_normals.d.ts.map +1 -0
  84. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_normals.js → mesh/vgeo_compute_vertex_normals.js} +3 -3
  85. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts +31 -0
  86. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_compute_vertex_tangents.d.ts.map +1 -0
  87. package/src/shade/renderer/geometry/virtual/build/{vgeo_compute_vertex_tangents.js → mesh/vgeo_compute_vertex_tangents.js} +5 -5
  88. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts +46 -0
  89. package/src/shade/renderer/geometry/virtual/build/mesh/vgeo_normalize_source.d.ts.map +1 -0
  90. package/src/shade/renderer/geometry/virtual/build/{vgeo_normalize_source.js → mesh/vgeo_normalize_source.js} +9 -9
  91. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts +13 -0
  92. package/src/shade/renderer/geometry/virtual/build/page/vgeo_assemble_pages.d.ts.map +1 -0
  93. package/src/shade/renderer/geometry/virtual/build/{vgeo_assemble_pages.js → page/vgeo_assemble_pages.js} +63 -16
  94. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts +13 -0
  95. package/src/shade/renderer/geometry/virtual/build/page/vgeo_build_page_nodes.d.ts.map +1 -0
  96. package/src/shade/renderer/geometry/virtual/build/{vgeo_build_page_nodes.js → page/vgeo_build_page_nodes.js} +4 -4
  97. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts +22 -0
  98. package/src/shade/renderer/geometry/virtual/build/page/vgeo_page_node_count.d.ts.map +1 -0
  99. package/src/shade/renderer/geometry/virtual/build/{vgeo_page_node_count.js → page/vgeo_page_node_count.js} +2 -2
  100. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts +52 -0
  101. package/src/shade/renderer/geometry/virtual/build/partition/VGeoFaceGraph.d.ts.map +1 -0
  102. package/src/shade/renderer/geometry/virtual/build/{VGeoFaceGraph.js → partition/VGeoFaceGraph.js} +1 -1
  103. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts +14 -0
  104. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_graph_components.d.ts.map +1 -0
  105. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts +29 -0
  106. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_graph.d.ts.map +1 -0
  107. package/src/shade/renderer/geometry/virtual/build/{vgeo_partition_graph.js → partition/vgeo_partition_graph.js} +2 -2
  108. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts +41 -0
  109. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.d.ts.map +1 -0
  110. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_partition_subgraph.js +92 -0
  111. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts +10 -0
  112. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set.d.ts.map +1 -0
  113. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set.js → partition/vgeo_split_face_set.js} +12 -55
  114. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts +15 -0
  115. package/src/shade/renderer/geometry/virtual/build/partition/vgeo_split_face_set_packed.d.ts.map +1 -0
  116. package/src/shade/renderer/geometry/virtual/build/{vgeo_split_face_set_packed.js → partition/vgeo_split_face_set_packed.js} +3 -3
  117. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts +12 -0
  118. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_bounding_sphere.d.ts.map +1 -0
  119. package/src/shade/renderer/geometry/virtual/build/{vgeo_bounding_sphere.js → sphere/vgeo_bounding_sphere.js} +3 -3
  120. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts +18 -0
  121. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_containing_sphere.d.ts.map +1 -0
  122. package/src/shade/renderer/geometry/virtual/build/{vgeo_containing_sphere.js → sphere/vgeo_containing_sphere.js} +3 -3
  123. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts +9 -0
  124. package/src/shade/renderer/geometry/virtual/build/sphere/vgeo_sphere_inflate_to_contain.d.ts.map +1 -0
  125. package/src/shade/renderer/geometry/virtual/build/{vgeo_sphere_inflate_to_contain.js → sphere/vgeo_sphere_inflate_to_contain.js} +1 -1
  126. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts +24 -0
  127. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoGatheredFaces.d.ts.map +1 -0
  128. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts +20 -0
  129. package/src/shade/renderer/geometry/virtual/build/submesh/VGeoSubmesh.d.ts.map +1 -0
  130. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts +14 -0
  131. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_extract_submesh.d.ts.map +1 -0
  132. package/src/shade/renderer/geometry/virtual/build/{vgeo_extract_submesh.js → submesh/vgeo_extract_submesh.js} +5 -5
  133. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts +12 -0
  134. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_gather_faces.d.ts.map +1 -0
  135. package/src/shade/renderer/geometry/virtual/build/{vgeo_gather_faces.js → submesh/vgeo_gather_faces.js} +2 -2
  136. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts +11 -0
  137. package/src/shade/renderer/geometry/virtual/build/submesh/vgeo_narrow_indices.d.ts.map +1 -0
  138. package/src/shade/renderer/geometry/virtual/build/{vgeo_narrow_indices.js → submesh/vgeo_narrow_indices.js} +3 -3
  139. package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
  140. package/src/shade/renderer/geometry/virtual/build/vgeo_build.d.ts.map +1 -1
  141. package/src/shade/renderer/geometry/virtual/build/vgeo_build.js +10 -11
  142. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +22 -0
  143. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
  144. package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +24 -0
  145. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts +8 -2
  146. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.d.ts.map +1 -1
  147. package/src/shade/renderer/geometry/virtual/format/attribute/vgeo_attributes_read.js +8 -2
  148. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts +12 -0
  149. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.d.ts.map +1 -1
  150. package/src/shade/renderer/geometry/virtual/format/dag/VirtualGeometryCluster.js +13 -0
  151. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts +8 -1
  152. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.d.ts.map +1 -1
  153. package/src/shade/renderer/geometry/virtual/format/frame/vgeo_encode_frame_blob.js +11 -3
  154. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts +9 -0
  155. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.d.ts.map +1 -1
  156. package/src/shade/renderer/geometry/virtual/format/header/VGEO_FORMAT_VERSION.js +10 -1
  157. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts +15 -0
  158. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.d.ts.map +1 -0
  159. package/src/shade/renderer/geometry/virtual/format/page/VGEO_GROUP_OFFSET.js +15 -0
  160. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts +18 -0
  161. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.d.ts.map +1 -0
  162. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_ENTRY_COUNT.js +17 -0
  163. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts +8 -0
  164. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.d.ts.map +1 -0
  165. package/src/shade/renderer/geometry/virtual/format/page/VGEO_MAX_PARENT_REF.js +7 -0
  166. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.d.ts +3 -0
  167. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PAGE_OFFSET.js +16 -0
  168. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts +14 -0
  169. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.d.ts.map +1 -0
  170. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_ENTRY_SIZE.js +13 -0
  171. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts +11 -0
  172. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.d.ts.map +1 -0
  173. package/src/shade/renderer/geometry/virtual/format/page/VGEO_PARENT_PAGE_ENTRY_SIZE.js +10 -0
  174. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts +28 -0
  175. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.d.ts.map +1 -1
  176. package/src/shade/renderer/geometry/virtual/format/payload/vgeo_encode_cluster_payload.js +7 -3
  177. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +20 -0
  178. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
  179. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +20 -2
  180. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +4 -0
  181. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
  182. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +4 -0
  183. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +29 -3
  184. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  185. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +81 -122
  186. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +40 -0
  187. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
  188. package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +44 -0
  189. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts +69 -0
  190. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.d.ts.map +1 -0
  191. package/src/shade/renderer/geometry/virtual/format/read/VGeoPageFetcherCore.js +236 -0
  192. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +14 -0
  193. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
  194. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +15 -0
  195. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts +31 -0
  196. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.d.ts.map +1 -0
  197. package/src/shade/renderer/geometry/virtual/format/read/vgeo_byte_source_from_descriptor.js +32 -0
  198. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +10 -0
  199. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
  200. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +21 -1
  201. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts +15 -0
  202. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.d.ts.map +1 -0
  203. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_transfer.js +84 -0
  204. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts +22 -0
  205. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.d.ts.map +1 -0
  206. package/src/shade/renderer/geometry/virtual/format/read/vgeo_page_worker_serve.js +96 -0
  207. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
  208. package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +63 -3
  209. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
  210. package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +219 -17
  211. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
  212. package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +156 -11
  213. package/src/shade/renderer/geometry/virtual/runtime/CUT_PLAN_2026_09_14.md +656 -0
  214. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +33 -36
  215. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -1
  216. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +109 -193
  217. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +109 -29
  218. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -1
  219. package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +173 -105
  220. package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +37 -0
  221. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +109 -26
  222. package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN_2026_09_14.md +548 -0
  223. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +29 -50
  224. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -1
  225. package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +55 -487
  226. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts +84 -0
  227. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.d.ts.map +1 -0
  228. package/src/shade/renderer/geometry/virtual/runtime/VGeoPageFetcher.js +393 -0
  229. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts +234 -0
  230. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.d.ts.map +1 -0
  231. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidency.js +1388 -0
  232. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts +81 -0
  233. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.d.ts.map +1 -0
  234. package/src/shade/renderer/geometry/virtual/runtime/VGeoResidencyOptions.js +89 -0
  235. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +53 -34
  236. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -1
  237. package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +407 -124
  238. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts +100 -0
  239. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.d.ts.map +1 -0
  240. package/src/shade/renderer/geometry/virtual/runtime/VGeoViewCut.js +219 -0
  241. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts +17 -0
  242. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.d.ts.map +1 -0
  243. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_EXPAND.js +47 -0
  244. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts +20 -0
  245. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.d.ts.map +1 -0
  246. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_COARSEN.js +19 -0
  247. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -1
  248. package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +30 -12
  249. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +8 -8
  250. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -1
  251. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +11 -73
  252. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts +19 -0
  253. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.d.ts.map +1 -0
  254. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_arena.js +98 -0
  255. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts +31 -0
  256. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.d.ts.map +1 -0
  257. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_claim.js +99 -0
  258. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts +17 -0
  259. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.d.ts.map +1 -0
  260. package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_queue.js +39 -0
  261. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -1
  262. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +18 -1
  263. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -1
  264. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +5 -15
  265. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts +3 -0
  266. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.d.ts.map +1 -0
  267. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_remainder.js +77 -0
  268. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts +3 -0
  269. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.d.ts.map +1 -0
  270. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_reseed.js +130 -0
  271. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -1
  272. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +32 -37
  273. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -1
  274. package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +576 -230
  275. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +15 -18
  276. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -1
  277. package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +19 -28
  278. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -1
  279. package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +45 -25
  280. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +1 -0
  281. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +11 -0
  282. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +1 -1
  283. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +0 -1
  284. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +12 -10
  285. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +1 -0
  286. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +8 -0
  287. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +7 -2
  288. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -1
  289. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +8 -3
  290. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +2 -0
  291. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +19 -0
  292. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -1
  293. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +1 -1
  294. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts +5 -0
  295. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.d.ts.map +1 -0
  296. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_OFFSET.js +22 -0
  297. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts +14 -0
  298. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.d.ts.map +1 -0
  299. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PARENT_ROW_WORDS.js +13 -0
  300. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts +17 -0
  301. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.d.ts.map +1 -0
  302. package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_PARENT_BIT.js +16 -0
  303. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts +15 -0
  304. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.d.ts.map +1 -0
  305. package/src/shade/renderer/geometry/virtual/runtime/make_vgeo_page_worker.js +16 -0
  306. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts +23 -0
  307. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.d.ts.map +1 -0
  308. package/src/shade/renderer/geometry/virtual/runtime/vgeo_frontier_words.js +28 -0
  309. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts +2 -0
  310. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.d.ts.map +1 -0
  311. package/src/shade/renderer/geometry/virtual/runtime/vgeo_page.worker.js +13 -0
  312. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +10 -5
  313. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -1
  314. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +15 -6
  315. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +6 -1
  316. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -1
  317. package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +38 -1
  318. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.d.ts.map +1 -1
  319. package/src/shade/renderer/global_illumination/sharc/shader/shader_sharc_evict.js +4 -3
  320. package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
  321. package/src/shade/renderer/loader/gltf/load_gltf.js +0 -19
  322. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  323. package/src/shade/renderer/material/chunk_material_draw_side.d.ts +14 -0
  324. package/src/shade/renderer/material/chunk_material_draw_side.d.ts.map +1 -0
  325. package/src/shade/renderer/material/chunk_material_draw_side.js +34 -0
  326. package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
  327. package/src/shade/renderer/material/standard/fragment_gbuffer.js +8 -1
  328. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  329. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +6 -3
  330. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  331. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +6 -3
  332. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.d.ts.map +1 -1
  333. package/src/shade/renderer/path_tracer/shader/chunk_sample_material_data.js +13 -1
  334. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  335. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts +19 -5
  336. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.d.ts.map +1 -1
  337. package/src/shade/renderer/rasterize/bucket/construct_primitive_state.js +23 -5
  338. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.d.ts.map +1 -1
  339. package/src/shade/renderer/rasterize/bucket/filter_materials_by_bucket.js +12 -5
  340. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  341. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -4
  342. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts +22 -0
  343. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.d.ts.map +1 -0
  344. package/src/shade/renderer/rasterize/bucket/rasterization_opaque_buckets.js +36 -0
  345. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts +2 -0
  346. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.d.ts.map +1 -1
  347. package/src/shade/renderer/rasterize/bucket/shader_read_out_bucket.js +58 -57
  348. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts +15 -0
  349. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.d.ts.map +1 -0
  350. package/src/shade/renderer/rasterize/chunk_triangle_winding_is_reversed.js +35 -0
  351. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.d.ts.map +1 -1
  352. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_mesh_filter_2way.js +3 -5
  353. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.d.ts.map +1 -1
  354. package/src/shade/renderer/rasterize/cull/hzb/shader_hzb_meshlet_filter_1way_full.js +3 -4
  355. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts +10 -1
  356. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.d.ts.map +1 -1
  357. package/src/shade/renderer/rasterize/expand/bucket/RASTERIZATION_BUCKET_LIMIT.js +38 -29
  358. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts +5 -0
  359. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.d.ts.map +1 -1
  360. package/src/shade/renderer/rasterize/expand/bucket/chunk_rasterization_material_bucket.js +63 -55
  361. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.d.ts.map +1 -1
  362. package/src/shade/renderer/rasterize/expand/bucket/meshlet/shader_meshlets_extract_bucket.js +3 -4
  363. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.d.ts.map +1 -1
  364. package/src/shade/renderer/rasterize/expand/graph_meshlets_rasterize.js +1 -0
  365. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.d.ts.map +1 -1
  366. package/src/shade/renderer/rasterize/expand/pass0/pass_mesh_cull.js +7 -7
  367. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.d.ts.map +1 -1
  368. package/src/shade/renderer/rasterize/fast/graph_extract_meshes_from_bucket.js +83 -78
  369. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
  370. package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +44 -53
  371. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -1
  372. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.js +6 -2
  373. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -1
  374. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.js +6 -2
  375. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -1
  376. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.js +19 -2
  377. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +7 -4
  378. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
  379. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +3 -2
  380. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.d.ts.map +1 -1
  381. package/src/shade/renderer/rasterize/native/chunk_rasterize_triangle.js +15 -4
  382. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  383. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_alpha_tested_pass_descriptor.js +16 -5
  384. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.d.ts.map +1 -1
  385. package/src/shade/renderer/rasterize/native/depth/shadow_rasterization_pass_descriptor.js +16 -5
  386. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  387. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +2 -1
  388. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.d.ts.map +1 -1
  389. package/src/shade/renderer/rasterize/native/rasterization_shader_resources.js +4 -0
  390. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
  391. package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +16 -7
  392. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
  393. package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +85 -89
  394. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
  395. package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +28 -32
  396. package/src/shade/renderer/scene/GPUSceneContext.d.ts +22 -2
  397. package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
  398. package/src/shade/renderer/scene/GPUSceneContext.js +61 -4
  399. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +19 -0
  400. package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts.map +1 -1
  401. package/src/shade/renderer/scene/NODE3D_STRUCT.js +34 -0
  402. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts +9 -0
  403. package/src/shade/renderer/scene/chunk_node3d_flags.d.ts.map +1 -0
  404. package/src/shade/renderer/scene/chunk_node3d_flags.js +23 -0
  405. package/src/shade/renderer/scene/chunk_scene_database_access.d.ts.map +1 -1
  406. package/src/shade/renderer/scene/chunk_scene_database_access.js +15 -1
  407. package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -1
  408. package/src/shade/renderer/scene/rows/GPUSceneRows.js +9 -1
  409. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts +7 -0
  410. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.d.ts.map +1 -1
  411. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_compute_normal_matrix_from_m4.js +16 -4
  412. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts +12 -0
  413. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.d.ts.map +1 -0
  414. package/src/shade/renderer/shader/chunk/geometry/mat4/chunk_mat4_linear_determinant.js +18 -0
  415. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts +24 -0
  416. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.d.ts.map +1 -0
  417. package/src/shade/renderer/shader/chunk/geometry/triangle/chunk_triangle_list_reverse_winding.js +33 -0
  418. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.d.ts.map +1 -1
  419. package/src/shade/renderer/shader/resource/ShaderResourceSetDescriptor.js +92 -16
  420. package/src/shade/renderer/view/GPUViewContext.d.ts +5 -0
  421. package/src/shade/renderer/view/GPUViewContext.d.ts.map +1 -1
  422. package/src/shade/renderer/view/GPUViewContext.js +21 -0
  423. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  424. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +74 -3
  425. package/src/shade/playground/vgeo_viewer/README.md +0 -150
  426. package/src/shade/playground/vgeo_viewer/cut_geometry.js +0 -460
  427. package/src/shade/playground/vgeo_viewer/index.html +0 -77
  428. package/src/shade/playground/vgeo_viewer/main.js +0 -1343
  429. package/src/shade/playground/vgeo_viewer/select_cut.js +0 -481
  430. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +0 -258
  431. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +0 -1
  432. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +0 -723
  433. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +0 -49
  434. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +0 -1
  435. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +0 -50
  436. package/src/shade/renderer/loader/gltf/fix_up_material_sides.js +0 -109
  437. package/src/shade/renderer/rasterize/expand/graph_triangles_filter_by_material_side.js +0 -78
  438. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +0 -100
  439. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.js +0 -26
  440. package/src/shade/renderer/shader/chunk/jobs/NOTES.md +0 -47
  441. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts +0 -3
  442. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.d.ts.map +0 -1
  443. package/src/shade/renderer/shader/chunk/jobs/chunk_job_system.js +0 -102
  444. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevel.js → level/VGeoLevel.js} +0 -0
  445. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelOptions.js → level/VGeoLevelOptions.js} +0 -0
  446. /package/src/shade/renderer/geometry/virtual/build/{VGeoLevelSummary.js → level/VGeoLevelSummary.js} +0 -0
  447. /package/src/shade/renderer/geometry/virtual/build/{vgeo_graph_components.js → partition/vgeo_graph_components.js} +0 -0
  448. /package/src/shade/renderer/geometry/virtual/build/{VGeoGatheredFaces.js → submesh/VGeoGatheredFaces.js} +0 -0
  449. /package/src/shade/renderer/geometry/virtual/build/{VGeoSubmesh.js → submesh/VGeoSubmesh.js} +0 -0
@@ -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;CAC/B"}
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
@@ -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,CA8CnC;+BA1E8B,qBAAqB"}
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 new VGeoByteSource(
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":"AAmCA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4CAVW,UAAU,cACV,MAAM,GAEJ,QAAQ,CAgFpB;yBA/GwB,eAAe"}
1
+ {"version":3,"file":"vgeo_read_page.d.ts","sourceRoot":"","sources":["../../../../../../../../src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js"],"names":[],"mappings":"AAsCA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4CAVW,UAAU,cACV,MAAM,GAEJ,QAAQ,CAiFpB;yBAhHwB,eAAe"}