@woosh/meep-engine 3.22.0 → 3.23.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 (267) hide show
  1. package/package.json +1 -1
  2. package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts +118 -0
  3. package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts.map +1 -0
  4. package/src/core/geom/3d/hash-grid/PointHashGrid3.js +283 -0
  5. package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -1
  6. package/src/core/geom/3d/shape/BoxShape3D.js +6 -17
  7. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
  8. package/src/core/geom/3d/shape/CapsuleShape3D.js +3 -14
  9. package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
  10. package/src/core/geom/3d/shape/CylinderShape3D.js +3 -21
  11. package/src/core/geom/3d/shape/PlaneShape3D.d.ts +105 -0
  12. package/src/core/geom/3d/shape/PlaneShape3D.d.ts.map +1 -0
  13. package/src/core/geom/3d/shape/PlaneShape3D.js +251 -0
  14. package/src/core/geom/3d/shape/SphereShape3D.js +3 -3
  15. package/src/core/geom/3d/shape/json/shape_to_type.d.ts.map +1 -1
  16. package/src/core/geom/3d/shape/json/shape_to_type.js +3 -0
  17. package/src/core/geom/3d/shape/json/type_adapters.d.ts +14 -0
  18. package/src/core/geom/3d/shape/json/type_adapters.d.ts.map +1 -1
  19. package/src/core/geom/3d/shape/json/type_adapters.js +15 -0
  20. package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts +51 -0
  21. package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts.map +1 -0
  22. package/src/core/geom/3d/shape/sdf/sdf3_box.js +113 -0
  23. package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts +46 -0
  24. package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts.map +1 -0
  25. package/src/core/geom/3d/shape/sdf/sdf3_capsule.js +82 -0
  26. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts +60 -0
  27. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts.map +1 -0
  28. package/src/core/geom/3d/shape/sdf/sdf3_cylinder.js +126 -0
  29. package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.d.ts +50 -0
  30. package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.d.ts.map +1 -0
  31. package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.js +53 -0
  32. package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts +52 -0
  33. package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts.map +1 -0
  34. package/src/core/geom/3d/shape/sdf/sdf3_plane.js +61 -0
  35. package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts +41 -0
  36. package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts.map +1 -0
  37. package/src/core/geom/3d/shape/sdf/sdf3_sphere.js +71 -0
  38. package/src/core/process/ConcurrencyGate.d.ts +103 -0
  39. package/src/core/process/ConcurrencyGate.d.ts.map +1 -0
  40. package/src/core/process/ConcurrencyGate.js +207 -0
  41. package/src/engine/asset/AssetManager.d.ts +10 -0
  42. package/src/engine/asset/AssetManager.d.ts.map +1 -1
  43. package/src/engine/asset/AssetManager.js +10 -0
  44. package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +30 -13
  45. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +26 -0
  46. package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -0
  47. package/src/engine/graphics3/pose/collect_entity_playbacks.js +40 -0
  48. package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
  49. package/src/engine/graphics3/pose/query_entity_node_world_pose.js +74 -101
  50. package/src/engine/physics/cloth/MEASUREMENTS.md +1287 -4
  51. package/src/engine/physics/cloth/PLAN.md +1967 -1581
  52. package/src/engine/physics/cloth/build/ClothProxy.d.ts +147 -0
  53. package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -0
  54. package/src/engine/physics/cloth/build/ClothProxy.js +207 -0
  55. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +70 -0
  56. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -0
  57. package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +256 -0
  58. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +176 -0
  59. package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -0
  60. package/src/engine/physics/cloth/collider/ClothColliderIndex.js +435 -0
  61. package/src/engine/physics/cloth/collider/ClothColliderKind.d.ts +12 -0
  62. package/src/engine/physics/cloth/collider/ClothColliderKind.d.ts.map +1 -0
  63. package/src/engine/physics/cloth/collider/ClothColliderKind.js +38 -0
  64. package/src/engine/physics/cloth/collider/ClothColliderRecord.d.ts +120 -0
  65. package/src/engine/physics/cloth/collider/ClothColliderRecord.d.ts.map +1 -0
  66. package/src/engine/physics/cloth/collider/ClothColliderRecord.js +137 -0
  67. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts +25 -0
  68. package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -0
  69. package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +190 -0
  70. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +44 -0
  71. package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -0
  72. package/src/engine/physics/cloth/collider/cloth_collider_pack.js +173 -0
  73. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +94 -0
  74. package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -0
  75. package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +275 -0
  76. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts +126 -0
  77. package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -0
  78. package/src/engine/physics/cloth/ecs/ClothCollider.js +199 -0
  79. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +9 -0
  80. package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts.map +1 -0
  81. package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +32 -0
  82. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +114 -0
  83. package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -0
  84. package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +243 -0
  85. package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +66 -57
  86. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +109 -1
  87. package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
  88. package/src/engine/physics/cloth/ecs/ClothInstance.js +479 -363
  89. package/src/engine/physics/cloth/ecs/ClothRig.d.ts +95 -0
  90. package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -0
  91. package/src/engine/physics/cloth/ecs/ClothRig.js +140 -0
  92. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +30 -1
  93. package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
  94. package/src/engine/physics/cloth/ecs/ClothSystem.js +1021 -773
  95. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +90 -0
  96. package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -0
  97. package/src/engine/physics/cloth/ecs/cloth_build_rows.js +374 -0
  98. package/src/engine/physics/cloth/ecs/cloth_dynamics_library.d.ts +32 -3
  99. package/src/engine/physics/cloth/ecs/cloth_dynamics_library.d.ts.map +1 -1
  100. package/src/engine/physics/cloth/ecs/cloth_dynamics_library.js +283 -254
  101. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +59 -0
  102. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -0
  103. package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +328 -0
  104. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +13 -0
  105. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -0
  106. package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +288 -0
  107. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +58 -0
  108. package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -0
  109. package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +199 -0
  110. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +8 -63
  111. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
  112. package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +317 -645
  113. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +61 -0
  114. package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
  115. package/src/engine/physics/cloth/ecs/cloth_write_back.js +212 -449
  116. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +49 -0
  117. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -0
  118. package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +115 -0
  119. package/src/engine/physics/cloth/playground/README.md +155 -1
  120. package/src/engine/physics/cloth/playground/collide.html +178 -0
  121. package/src/engine/physics/cloth/playground/collide_build.d.ts +95 -0
  122. package/src/engine/physics/cloth/playground/collide_build.d.ts.map +1 -0
  123. package/src/engine/physics/cloth/playground/collide_build.js +315 -0
  124. package/src/engine/physics/cloth/playground/collide_main.d.ts +2 -0
  125. package/src/engine/physics/cloth/playground/collide_main.d.ts.map +1 -0
  126. package/src/engine/physics/cloth/playground/collide_main.js +720 -0
  127. package/src/engine/physics/cloth/playground/garment.html +182 -0
  128. package/src/engine/physics/cloth/playground/garment_build.d.ts +78 -0
  129. package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -0
  130. package/src/engine/physics/cloth/playground/garment_build.js +359 -0
  131. package/src/engine/physics/cloth/playground/garment_main.d.ts +2 -0
  132. package/src/engine/physics/cloth/playground/garment_main.d.ts.map +1 -0
  133. package/src/engine/physics/cloth/playground/garment_main.js +633 -0
  134. package/src/engine/physics/cloth/solver/ClothState.d.ts +208 -5
  135. package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
  136. package/src/engine/physics/cloth/solver/ClothState.js +302 -8
  137. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +87 -0
  138. package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -0
  139. package/src/engine/physics/cloth/solver/cloth_contact_find.js +343 -0
  140. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +112 -0
  141. package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -0
  142. package/src/engine/physics/cloth/solver/cloth_self_find.js +448 -0
  143. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts +4 -1
  144. package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
  145. package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +16 -1
  146. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +112 -5
  147. package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
  148. package/src/engine/physics/cloth/solver/cloth_solver_constants.js +117 -6
  149. package/src/engine/physics/cloth/solver/cloth_step.d.ts +40 -9
  150. package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
  151. package/src/engine/physics/cloth/solver/cloth_step.js +122 -10
  152. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts +95 -0
  153. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts.map +1 -0
  154. package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.js +285 -0
  155. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts +129 -0
  156. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -0
  157. package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +501 -0
  158. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +75 -0
  159. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -0
  160. package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +202 -0
  161. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  162. package/src/shade/playground/vgeo_viewer/README.md +18 -0
  163. package/src/shade/playground/vgeo_viewer/main.js +87 -50
  164. package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
  165. package/src/shade/renderer/buffer/table/GPUDatabase.js +191 -62
  166. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +94 -2
  167. package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
  168. package/src/shade/renderer/buffer/table/GPUTypedTable.js +414 -2
  169. package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.d.ts +14 -0
  170. package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.d.ts.map +1 -0
  171. package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.js +13 -0
  172. package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.d.ts +17 -0
  173. package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.d.ts.map +1 -0
  174. package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.js +116 -0
  175. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +9 -4
  176. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
  177. package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +843 -734
  178. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +12 -0
  179. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
  180. package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +13 -0
  181. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +17 -0
  182. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
  183. package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +185 -30
  184. package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +17 -0
  185. package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +141 -24
  186. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +204 -64
  187. package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +110 -10
  188. package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +19 -0
  189. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +19 -6
  190. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
  191. package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +26 -7
  192. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +173 -14
  193. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
  194. package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +458 -51
  195. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +49 -13
  196. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
  197. package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +52 -14
  198. package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.d.ts +20 -0
  199. package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.d.ts.map +1 -0
  200. package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.js +19 -0
  201. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.d.ts +27 -0
  202. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.d.ts.map +1 -0
  203. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.js +48 -0
  204. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.d.ts +29 -0
  205. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.d.ts.map +1 -0
  206. package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.js +60 -0
  207. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +8 -1
  208. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
  209. package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +32 -2
  210. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +258 -0
  211. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +1 -0
  212. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +723 -0
  213. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +49 -0
  214. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +1 -0
  215. package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +50 -0
  216. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  217. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  218. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts +3 -0
  219. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts.map +1 -1
  220. package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +121 -21
  221. package/src/shade/renderer/texture/virtual/README.md +6 -4
  222. package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
  223. package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +7 -0
  224. package/src/shade/renderer/texture/virtual/source/VTSourceTiled.d.ts +3 -3
  225. package/src/shade/renderer/texture/virtual/source/VTSourceTiled.js +3 -3
  226. package/src/engine/ecs/system/SystemExecutionPhase.d.ts +0 -9
  227. package/src/engine/ecs/system/SystemExecutionPhase.d.ts.map +0 -1
  228. package/src/engine/graphics/texture/virtual/NOTES.md +0 -128
  229. package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.d.ts +0 -6
  230. package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.d.ts.map +0 -1
  231. package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.js +0 -5
  232. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.d.ts +0 -49
  233. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.d.ts.map +0 -1
  234. package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.js +0 -264
  235. package/src/engine/graphics/texture/virtual/VirtualTextureUsage.d.ts +0 -44
  236. package/src/engine/graphics/texture/virtual/VirtualTextureUsage.d.ts.map +0 -1
  237. package/src/engine/graphics/texture/virtual/VirtualTextureUsage.js +0 -228
  238. package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.d.ts +0 -3
  239. package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.d.ts.map +0 -1
  240. package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.js +0 -73
  241. package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.d.ts +0 -14
  242. package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.d.ts.map +0 -1
  243. package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.js +0 -85
  244. package/src/engine/graphics/texture/virtual/debug/UsageDebugView.d.ts +0 -12
  245. package/src/engine/graphics/texture/virtual/debug/UsageDebugView.d.ts.map +0 -1
  246. package/src/engine/graphics/texture/virtual/debug/UsageDebugView.js +0 -63
  247. package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.d.ts +0 -12
  248. package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.d.ts.map +0 -1
  249. package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.js +0 -243
  250. package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.d.ts +0 -30
  251. package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.d.ts.map +0 -1
  252. package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.js +0 -39
  253. package/src/engine/graphics/texture/virtual/tile/compose_finger_print.d.ts +0 -9
  254. package/src/engine/graphics/texture/virtual/tile/compose_finger_print.d.ts.map +0 -1
  255. package/src/engine/graphics/texture/virtual/tile/compose_finger_print.js +0 -24
  256. package/src/engine/graphics/texture/virtual/tile/compose_tile_address.d.ts +0 -9
  257. package/src/engine/graphics/texture/virtual/tile/compose_tile_address.d.ts.map +0 -1
  258. package/src/engine/graphics/texture/virtual/tile/compose_tile_address.js +0 -26
  259. package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.d.ts +0 -11
  260. package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.d.ts.map +0 -1
  261. package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.js +0 -12
  262. package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.d.ts +0 -7
  263. package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.d.ts.map +0 -1
  264. package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.js +0 -16
  265. package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.d.ts +0 -7
  266. package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.d.ts.map +0 -1
  267. package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.js +0 -35
@@ -0,0 +1,202 @@
1
+ import {
2
+ CVA_F_X,
3
+ CVA_F_Y,
4
+ CVA_F_Z,
5
+ CVA_H_XX,
6
+ CVA_H_XY,
7
+ CVA_H_XZ,
8
+ CVA_H_YY,
9
+ CVA_H_YZ,
10
+ CVA_H_ZZ
11
+ } from "../cloth_vertex_accumulator.js";
12
+
13
+ /**
14
+ * # Self-collision — the row that keeps cloth off itself
15
+ *
16
+ * C(x) = ‖x_i − x_j‖ − (r_i + r_j)
17
+ * ∂C/∂x_i = (x_i − x_j)/‖x_i − x_j‖ = n
18
+ * ∂C/∂x_j = −n
19
+ * clamp (−∞, 0]
20
+ *
21
+ * **That clamp is right and it is the one place in §6's table where the negative
22
+ * half is the live one.** The rule is that `[0, +∞)` admits only forces that
23
+ * *reduce* `C` and `(−∞, 0]` only forces that *increase* it; this row is violated
24
+ * when the two particles are closer than their radii, which is `C < 0`, so what
25
+ * it needs is `C` increased. Under the solver's `f -= fc·g`, a negative `fc`
26
+ * pushes `i` along `+n` and `j` along `−n` — apart. Every distance row above it
27
+ * in the table bounds a distance from *above* and therefore takes the other
28
+ * half; this one bounds from below.
29
+ *
30
+ * ## It is applied Jacobi-style, and this is where §5.4 was right
31
+ *
32
+ * A collider contact is unary and needs none of §5.4's machinery (`MEASUREMENTS.md`
33
+ * §18). A self-collision row is a **pair**, and pairs are exactly what the
34
+ * colouring cannot pre-partition: two particles of the same colour can be
35
+ * neighbours in space and would then both move against each other inside one
36
+ * sweep, in an order that depends on how the sweep was split. So the pairs are
37
+ * accumulated once per iteration into a per-particle `(f, H)` scratch, from the
38
+ * positions at the start of that iteration, and every vertex update adds its own
39
+ * entry. The result is a step that is the same whatever order the colours were
40
+ * swept in, which is what §12's bit-parity gate is going to be held to.
41
+ *
42
+ * ## The row is soft, which the collision row could not be
43
+ *
44
+ * `MEASUREMENTS.md` §18 measured that a collider contact cannot be a soft
45
+ * penalty: the force it has to produce is an *arrested impact*, 376 N for a
46
+ * sheet arriving at 8 m/s, against the 4.6 N a soft row inside M0's dissipative
47
+ * band can deliver at one thickness of penetration.
48
+ *
49
+ * A self-collision row carries nothing of the kind. What it holds apart is cloth
50
+ * against cloth — grams, moving at the speed cloth moves relative to itself — and
51
+ * a penalty at the top of the band produces newtons per millimetre against a
52
+ * load of fractions of a newton. So it is a plain penalty with no multiplier, no
53
+ * warm start and no identity across steps, which is also what makes a pair list
54
+ * that is rebuilt from scratch every step affordable: there is nothing on a pair
55
+ * worth carrying. `MEASUREMENTS.md` §33.
56
+ *
57
+ * @author Alex Goldring
58
+ * @copyright Company Named Limited (c) 2026
59
+ */
60
+
61
+ /**
62
+ * Below this a separation is treated as zero and the row is skipped: `‖·‖` is
63
+ * not differentiable there, and two particles at exactly the same place have no
64
+ * direction to be pushed apart along.
65
+ * @type {number}
66
+ */
67
+ export const CLOTH_SELF_EPSILON = 1e-9;
68
+
69
+ /**
70
+ * Rebuild the per-particle Jacobi scratch from the pair list.
71
+ *
72
+ * Called once per iteration, before the colour sweep, from the positions the
73
+ * previous iteration left. Every pair contributes to both of its particles.
74
+ *
75
+ * @param {ClothState} state
76
+ * @param {number} stiffness penalty, N/m — the same for every pair, because
77
+ * every pair has the same two free ends and therefore the same inertial scale
78
+ * @returns {number} how many pairs were in contact
79
+ */
80
+ export function cloth_self_accumulate_scratch(state, stiffness) {
81
+ const force = state.self_force;
82
+ const hessian = state.self_hessian;
83
+
84
+ force.fill(0);
85
+ hessian.fill(0);
86
+
87
+ const count = state.self_count;
88
+
89
+ if (count === 0) {
90
+ return 0;
91
+ }
92
+
93
+ const pair = state.self_pair;
94
+ const position = state.position;
95
+
96
+ const radius = state.self_radius * 2;
97
+
98
+ let active = 0;
99
+
100
+ for (let p = 0; p < count; p++) {
101
+ const i = pair[p * 2];
102
+ const j = pair[p * 2 + 1];
103
+
104
+ const a = i * 3;
105
+ const b = j * 3;
106
+
107
+ const dx = position[a] - position[b];
108
+ const dy = position[a + 1] - position[b + 1];
109
+ const dz = position[a + 2] - position[b + 2];
110
+
111
+ const length_squared = dx * dx + dy * dy + dz * dz;
112
+
113
+ if (length_squared >= radius * radius || length_squared < CLOTH_SELF_EPSILON * CLOTH_SELF_EPSILON) {
114
+ continue;
115
+ }
116
+
117
+ active++;
118
+
119
+ const length = Math.sqrt(length_squared);
120
+
121
+ const inverse = 1 / length;
122
+
123
+ const nx = dx * inverse;
124
+ const ny = dy * inverse;
125
+ const nz = dz * inverse;
126
+
127
+ // `C < 0` and the clamp admits only negative force, so `fc = k·C` needs
128
+ // no clamping at all — it is already on the admitted side, which is what
129
+ // a one-sided row with no multiplier reduces to.
130
+ const magnitude = stiffness * (radius - length);
131
+
132
+ force[a] += magnitude * nx;
133
+ force[a + 1] += magnitude * ny;
134
+ force[a + 2] += magnitude * nz;
135
+
136
+ force[b] -= magnitude * nx;
137
+ force[b + 1] -= magnitude * ny;
138
+ force[b + 2] -= magnitude * nz;
139
+
140
+ // `k·n nᵀ`, the penalty curvature, into both particles' blocks. The
141
+ // geometric term `(fc/L)·(I − n nᵀ)` is dropped: `fc` is negative here —
142
+ // the row is in *compression*, pushing apart — so that term is negative
143
+ // semidefinite, and §5.3 keeps only the positive half.
144
+ const hxx = stiffness * nx * nx;
145
+ const hyy = stiffness * ny * ny;
146
+ const hzz = stiffness * nz * nz;
147
+ const hxy = stiffness * nx * ny;
148
+ const hxz = stiffness * nx * nz;
149
+ const hyz = stiffness * ny * nz;
150
+
151
+ const ha = i * 6;
152
+ const hb = j * 6;
153
+
154
+ hessian[ha] += hxx;
155
+ hessian[ha + 1] += hyy;
156
+ hessian[ha + 2] += hzz;
157
+ hessian[ha + 3] += hxy;
158
+ hessian[ha + 4] += hxz;
159
+ hessian[ha + 5] += hyz;
160
+
161
+ hessian[hb] += hxx;
162
+ hessian[hb + 1] += hyy;
163
+ hessian[hb + 2] += hzz;
164
+ hessian[hb + 3] += hxy;
165
+ hessian[hb + 4] += hxz;
166
+ hessian[hb + 5] += hyz;
167
+ }
168
+
169
+ return active;
170
+ }
171
+
172
+ /**
173
+ * Add one particle's share of the Jacobi scratch into its vertex accumulator.
174
+ *
175
+ * @param {Float64Array} accumulator
176
+ * @param {ClothState} state
177
+ * @param {number} particle
178
+ */
179
+ export function cloth_self_accumulate(accumulator, state, particle) {
180
+ const hessian = state.self_hessian;
181
+
182
+ const h = particle * 6;
183
+
184
+ if (hessian[h] === 0 && hessian[h + 1] === 0 && hessian[h + 2] === 0) {
185
+ return;
186
+ }
187
+
188
+ const force = state.self_force;
189
+
190
+ const f = particle * 3;
191
+
192
+ accumulator[CVA_F_X] += force[f];
193
+ accumulator[CVA_F_Y] += force[f + 1];
194
+ accumulator[CVA_F_Z] += force[f + 2];
195
+
196
+ accumulator[CVA_H_XX] += hessian[h];
197
+ accumulator[CVA_H_YY] += hessian[h + 1];
198
+ accumulator[CVA_H_ZZ] += hessian[h + 2];
199
+ accumulator[CVA_H_XY] += hessian[h + 3];
200
+ accumulator[CVA_H_XZ] += hessian[h + 4];
201
+ accumulator[CVA_H_YZ] += hessian[h + 5];
202
+ }
@@ -64,11 +64,11 @@ export class FluidObstacleSystem extends System<any> {
64
64
  /**
65
65
  * @param {FluidComponent} fluid
66
66
  */
67
- static "__#386@#refresh_masks"(fluid: FluidComponent): void;
67
+ static "__#383@#refresh_masks"(fluid: FluidComponent): void;
68
68
  /**
69
69
  * @param {FluidComponent} fluid
70
70
  */
71
- static "__#386@#clear_field"(fluid: FluidComponent): void;
71
+ static "__#383@#clear_field"(fluid: FluidComponent): void;
72
72
  /**
73
73
  * Mark every cell of `fluid` whose centre lies within `inflation` of the
74
74
  * posed shape as solid. Iteration is clipped to the shape's world AABB
@@ -80,7 +80,7 @@ export class FluidObstacleSystem extends System<any> {
80
80
  * @param {number} inflation world-units SDF threshold
81
81
  * @param {Float64Array} point length-3 scratch
82
82
  */
83
- static "__#386@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
83
+ static "__#383@#voxelize"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array): void;
84
84
  /**
85
85
  * Write the obstacle's translation velocity onto every face of every cell
86
86
  * it voxelized — the moving-wall boundary condition. Runs AFTER the mask
@@ -100,7 +100,7 @@ export class FluidObstacleSystem extends System<any> {
100
100
  * @param {number} wvy
101
101
  * @param {number} wvz
102
102
  */
103
- static "__#386@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
103
+ static "__#383@#stamp_wall_velocity"(fluid: FluidComponent, posed: PosedShape3D, aabb: Float64Array, inflation: number, point: Float64Array, wvx: number, wvy: number, wvz: number): void;
104
104
  constructor();
105
105
  dependencies: (typeof FluidObstacle)[];
106
106
  components_used: (ResourceAccessSpecification<typeof Transform64> | ResourceAccessSpecification<typeof RigidBody> | ResourceAccessSpecification<typeof Collider> | ResourceAccessSpecification<typeof FluidComponent> | ResourceAccessSpecification<typeof FluidObstacle>)[];
@@ -65,6 +65,18 @@ them. Coarse-first layout is what makes the second worth doing: a prefix that ov
65
65
  frame has overshot into the pages the traversal is about to want. Watch `read so far` and `requests`
66
66
  move against each other. `?head=<bytes>` sets it on load.
67
67
 
68
+ **head prefix** on the streaming panel is what is still *held*, and it says `released` for most of a
69
+ session: the reader drops the prefix the first time a read falls outside it, because after the pages
70
+ inside it have installed it is bytes nothing will read — and at a thousand open assets a retained
71
+ 256 KiB apiece was a quarter of a gigabyte that neither `resident` nor eviction could see. The
72
+ always-resident set is about 2.4 KB, so the prefix is speculation about the next band and 64 KiB is
73
+ enough of it; the dial is there to watch the trade rather than to tune it.
74
+
75
+ **quarantined** is the other new row, and it is the difference between an asset that is coarse
76
+ because the camera just moved and one that is coarse because a page will never arrive — which look
77
+ identical on screen. A page that fails its retries is quarantined with its reason and is not asked
78
+ for again; the clamped cut keeps its surface correct with a coarser ancestor, indefinitely.
79
+
68
80
  `read so far` is cumulative and is allowed past 100%: evicting and re-streaming really does fetch
69
81
  those pages again, and the audit really does read every byte.
70
82
 
@@ -76,6 +88,12 @@ incremental reader exists to avoid, and it answers a question about whoever *wro
76
88
  than about the view being put on screen. Press **validate the whole file** when that is the
77
89
  question, or pass `?validate`.
78
90
 
91
+ It is not a method on the reader, either. `vgeo_audit_container` and `vgeo_install_all_pages` live in
92
+ `format/read/tool/`, and this viewer calls them as the tool it is — a renderer holding a thousand
93
+ containers must not have either within reach of one of them. The audit takes the file as a single
94
+ `ArrayBuffer`, because every build invariant is a cross-check between two places in it, so it refuses
95
+ above 1 GiB naming the size rather than failing in the allocator.
96
+
79
97
  What is *not* optional, because it is the difference between refusing a file and misreading one:
80
98
  magic, minimum reader version, payload encoding, hash algorithm, unknown required feature bits,
81
99
  unknown codecs, a `decoded_size` outside what the stored bytes could physically produce, and a root
@@ -25,6 +25,12 @@ import {
25
25
  import {
26
26
  VGeoReadOptions
27
27
  } from "../../renderer/geometry/virtual/format/read/VGeoReadOptions.js";
28
+ import {
29
+ vgeo_audit_container
30
+ } from "../../renderer/geometry/virtual/format/read/tool/vgeo_audit_container.js";
31
+ import {
32
+ vgeo_install_all_pages
33
+ } from "../../renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.js";
28
34
  import { make_sunlight } from "../../renderer/light/make_sunlight.js";
29
35
  import { Renderer } from "../../renderer/Renderer.js";
30
36
  import { DynamicMesh } from "../../renderer/scene/DynamicMesh.js";
@@ -93,8 +99,8 @@ const STREAM_BATCH = 8;
93
99
  const HEAD_PREFIXES = [
94
100
  ['256 B — header only', 256],
95
101
  ['16 KB', 16 * 1024],
96
- ['64 KB', 64 * 1024],
97
- ['256 KB — the default', 256 * 1024],
102
+ ['64 KB — the default', 64 * 1024],
103
+ ['256 KB', 256 * 1024],
98
104
  ['1 MB', 1024 * 1024],
99
105
  ];
100
106
 
@@ -145,35 +151,76 @@ function escape_html(text) {
145
151
  }
146
152
 
147
153
  /**
148
- * What the resident pages cost stored against what they cost decoded, and under which codec.
154
+ * What a reader's quarantine amounts to, for the panel.
149
155
  *
150
- * Stored is the number that gets fetched and the number that sits on disk; decoded is the number a
151
- * resident page costs in RAM. The codec is per frame, so a file can genuinely be a mixture — the
152
- * encoder stores a page raw whenever compressing it would not have shrunk it — and naming all of
153
- * them is more honest than naming whichever one happened to come first.
156
+ * A page that has failed its retries is not an error the viewer can act on — the clamped cut keeps
157
+ * that surface correct with a coarser ancestor — but it is the difference between an asset that is
158
+ * coarse because the camera just moved and one that is coarse because a page will never arrive, and
159
+ * those look identical on screen. So the count goes on the panel, with the first reason.
154
160
  *
155
- * @param {VGeoPage[]} pages
161
+ * @param {VGeoContainerReader} reader
156
162
  * @returns {string}
157
163
  */
158
- function page_storage(pages) {
159
- if (pages.length === 0) {
160
- return '—';
164
+ function quarantine_summary(reader) {
165
+ const count = reader.quarantined_page_count;
166
+
167
+ if (count === 0) {
168
+ return 'none';
161
169
  }
162
170
 
171
+ const [page, reason] = reader.quarantine().next().value;
172
+
173
+ return `${thousands(count)} page(s) · page ${page}: ${escape_html(reason)}`;
174
+ }
175
+
176
+ /**
177
+ * Everything the panel says about the resident set, in one pass over it.
178
+ *
179
+ * One pass, and over `resident_pages()` rather than `pages`, because the panel refreshes on every
180
+ * streaming round and `VGeoContainerReader.pages` is a snapshot that allocates an array and sorts
181
+ * it — 0.29 ms at 20,000 resident pages, and this used to ask for two of them.
182
+ *
183
+ * Storage: stored is what gets fetched and what sits on disk, decoded is what a resident page costs
184
+ * in RAM. The codec is per frame, so a file can genuinely be a mixture — the encoder stores a page
185
+ * raw whenever compressing it would not have shrunk it — and naming all of them is more honest than
186
+ * naming whichever one came first.
187
+ *
188
+ * Normals: worth saying outright because the alternative reads as a broken viewer. A source that
189
+ * carried no normals encodes the engine default everywhere, every cluster compresses to one constant
190
+ * word, and `colour by stored normal` comes out one flat colour across the whole model.
191
+ *
192
+ * @param {VGeoContainerReader} reader
193
+ * @returns {{storage: string, normals: string}}
194
+ */
195
+ function page_summary(reader) {
163
196
  let stored = 0;
164
197
  let decoded = 0;
198
+ let per_vertex = 0;
199
+ let clusters = 0;
200
+ let pages = 0;
201
+
202
+ const codecs = new Set();
165
203
 
166
- for (const page of pages) {
204
+ for (const page of reader.resident_pages()) {
167
205
  stored += page.stored_size;
168
206
  decoded += page.decoded_size;
207
+ per_vertex += page.per_vertex_normal_cluster_count;
208
+ clusters += page.cluster_count;
209
+
210
+ codecs.add(page.codec);
211
+
212
+ pages++;
169
213
  }
170
214
 
171
- const codec = Array.from(new Set(pages.map((page) => page.codec)))
172
- .map(vgeo_codec_name)
173
- .join(' + ');
215
+ const codec = Array.from(codecs).map(vgeo_codec_name).join(' + ');
174
216
 
175
- return `${human_bytes(stored)} stored · ${human_bytes(decoded)} decoded`
176
- + ` · ${codec} ${(decoded / Math.max(stored, 1)).toFixed(2)}x`;
217
+ return {
218
+ storage: pages === 0
219
+ ? '—'
220
+ : `${human_bytes(stored)} stored · ${human_bytes(decoded)} decoded`
221
+ + ` · ${codec} ${(decoded / Math.max(stored, 1)).toFixed(2)}x`,
222
+ normals: `${thousands(per_vertex)} / ${thousands(clusters)} clusters`,
223
+ };
177
224
  }
178
225
 
179
226
  /**
@@ -802,10 +849,10 @@ class VGeoViewer {
802
849
  const sample = vgeo_sample_source();
803
850
 
804
851
  /*
805
- The default prefix is one nominal page plus the head, and a *default* build has 256 KB
806
- pages. The sample's are 8 KB, so the same prefix would swallow most of it and there would be
807
- nothing left to stream — a demonstration of the head prefix rather than of the reader. Sized
808
- to the sample's own pages instead, unless the address bar has already made the choice.
852
+ The default prefix is 64 KB, sized against a *default* build's pages of hundreds of KB. The
853
+ sample's are 8 KB, so even that prefix would swallow much of it and there would be little
854
+ left to stream — a demonstration of the head prefix rather than of the reader. Sized to the
855
+ sample's own pages instead, unless the address bar has already made the choice.
809
856
  */
810
857
  if (!this.#head_pinned) {
811
858
  this.#read_options.head_prefix_bytes = 16 * 1024;
@@ -867,7 +914,7 @@ class VGeoViewer {
867
914
  const started = performance.now();
868
915
 
869
916
  try {
870
- this.#defects = await this.#reader.validate();
917
+ this.#defects = await vgeo_audit_container(this.#reader);
871
918
  } catch (e) {
872
919
  this.#defects = undefined;
873
920
  this.#validation_status = String(e.message ?? e);
@@ -896,11 +943,18 @@ class VGeoViewer {
896
943
  this.#status = 'installing every page';
897
944
  this.#refresh_panel();
898
945
 
899
- await this.#reader.install_all_pages((done, total) => {
900
- this.#status = `installing every page — ${done} / ${total}`;
901
- });
946
+ try {
947
+ await vgeo_install_all_pages(this.#reader, (done, total) => {
948
+ this.#status = `installing every page — ${done} / ${total}`;
949
+ });
902
950
 
903
- this.#status = '';
951
+ this.#status = '';
952
+ } catch (e) {
953
+ // A page that could not be read is quarantined rather than fatal now, and the tool
954
+ // reports at the end rather than stopping at the first one — so every page that *could*
955
+ // be installed is here, and the message says how many could not.
956
+ this.#status = String(e.message ?? e);
957
+ }
904
958
 
905
959
  this.adapt();
906
960
  this.#refresh_panel();
@@ -1023,7 +1077,7 @@ class VGeoViewer {
1023
1077
  const header = reader.header;
1024
1078
  const source = reader.source;
1025
1079
 
1026
- const pages = reader.pages;
1080
+ const summary = page_summary(reader);
1027
1081
 
1028
1082
  /*
1029
1083
  Cumulative for the session, and deliberately allowed past the file's own size: evicting and
@@ -1050,32 +1104,13 @@ class VGeoViewer {
1050
1104
  ['requests', thousands(source.request_count)],
1051
1105
  ['cold start', `${human_bytes(this.#open_bytes)} · ${this.#open_ms.toFixed(1)} ms`],
1052
1106
  ['resident', `${thousands(reader.resident_page_count)} / ${thousands(header.total_pages)} pages · ${human_bytes(reader.resident_bytes)}`],
1053
- ['page storage', page_storage(pages)],
1054
- ['per-vertex normals', this.#normal_share(pages)],
1107
+ ['page storage', summary.storage],
1108
+ ['per-vertex normals', summary.normals],
1109
+ ['head prefix', reader.head_bytes === 0 ? 'released' : human_bytes(reader.head_bytes)],
1110
+ ['quarantined', quarantine_summary(reader)],
1055
1111
  ]);
1056
1112
  }
1057
1113
 
1058
- /**
1059
- * How many resident clusters store a normal per vertex, against how many are resident at all.
1060
- *
1061
- * Worth saying outright because the alternative reads as a broken viewer: a source that carried
1062
- * no normals encodes the engine default everywhere, every cluster compresses to one constant
1063
- * word, and `colour by stored normal` comes out one flat colour across the whole model.
1064
- *
1065
- * @param {VGeoPage[]} pages
1066
- * @returns {string}
1067
- */
1068
- #normal_share(pages) {
1069
- let per_vertex = 0;
1070
- let total = 0;
1071
-
1072
- for (const page of pages) {
1073
- per_vertex += page.per_vertex_normal_cluster_count;
1074
- total += page.cluster_count;
1075
- }
1076
-
1077
- return `${thousands(per_vertex)} / ${thousands(total)} clusters`;
1078
- }
1079
1114
 
1080
1115
  /**
1081
1116
  * @returns {string}
@@ -1282,6 +1317,8 @@ function __state() {
1282
1317
  total_clusters: reader?.header.total_clusters,
1283
1318
  resident_pages: reader?.resident_page_count ?? 0,
1284
1319
  resident_bytes: reader?.resident_bytes ?? 0,
1320
+ head_bytes: reader?.head_bytes ?? 0,
1321
+ quarantined_pages: reader?.quarantined_page_count ?? 0,
1285
1322
  file_bytes: reader?.source.byte_length ?? 0,
1286
1323
  bytes_read: reader?.source.bytes_read ?? 0,
1287
1324
  requests: reader?.source.request_count ?? 0,
@@ -1 +1 @@
1
- {"version":3,"file":"GPUDatabase.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUDatabase.js"],"names":[],"mappings":"AAwCA;;;;;;;;;GASG;AACH;IA0EI;;;;;;OAMG;IACH;QAL0C,UAAU,EAAzC,qBAAqB;QACF,MAAM;QACR,KAAK,GAAtB,MAAM;QACW,uBAAuB,GAAxC,MAAM;OAuEhB;IApJD;;;OAGG;IACH,YAFU,qBAAqB,CAEpB;IAEX;;;;OAIG;IACH,QAFU,oBAAe,CAElB;IASP;;;OAGG;IACH,kBAAO;IAyCP;;OAEG;IACH,8BAEC;IAgFD;;;;;OAKG;IACH,UAHW,MAAM,GACJ,qBAAc,SAAS,CAUnC;IAGD;;;;;OAKG;IACH,gCAEC;IAoPD;;;OAGG;IACH,gBAFW,sBAAsB,QAoIhC;IA2DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,2BAJW,MAAM,GACJ,QAAQ,KAAG,CAAC,CA6HxB;IAED;;;;;;;OAOG;IACH,+BAJW,MAAM,iBACN,MAAM,GACJ,YAAU,CAkCtB;IAED;;;OAGG;IACH,+BAQC;IAED;;OAEG;IACH,gBAIC;;CACJ;qCA/1BY,OAAO,2CAA2C,EAAE,sBAAsB;oCAC1E,OAAO,4BAA4B,EAAE,qBAAqB;8BANzC,oBAAoB"}
1
+ {"version":3,"file":"GPUDatabase.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/buffer/table/GPUDatabase.js"],"names":[],"mappings":"AA0CA;;;;;;;;;GASG;AACH;IA0EI;;;;;;OAMG;IACH;QAL0C,UAAU,EAAzC,qBAAqB;QACF,MAAM;QACR,KAAK,GAAtB,MAAM;QACW,uBAAuB,GAAxC,MAAM;OAuEhB;IApJD;;;OAGG;IACH,YAFU,qBAAqB,CAEpB;IAEX;;;;OAIG;IACH,QAFU,oBAAe,CAElB;IASP;;;OAGG;IACH,kBAAO;IAyCP;;OAEG;IACH,8BAEC;IAgFD;;;;;OAKG;IACH,UAHW,MAAM,GACJ,qBAAc,SAAS,CAUnC;IAGD;;;;;OAKG;IACH,gCAEC;IAoPD;;;OAGG;IACH,gBAFW,sBAAsB,QA+EhC;IA+OD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,2BAJW,MAAM,GACJ,QAAQ,KAAG,CAAC,CA6HxB;IAED;;;;;;;OAOG;IACH,+BAJW,MAAM,iBACN,MAAM,GACJ,YAAU,CAkCtB;IAED;;;OAGG;IACH,+BAQC;IAED;;OAEG;IACH,gBAIC;;CACJ;qCA99BY,OAAO,2CAA2C,EAAE,sBAAsB;oCAC1E,OAAO,4BAA4B,EAAE,qBAAqB;8BANzC,oBAAoB"}