@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.
- package/package.json +1 -1
- package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts +118 -0
- package/src/core/geom/3d/hash-grid/PointHashGrid3.d.ts.map +1 -0
- package/src/core/geom/3d/hash-grid/PointHashGrid3.js +283 -0
- package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/BoxShape3D.js +6 -17
- package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/CapsuleShape3D.js +3 -14
- package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/CylinderShape3D.js +3 -21
- package/src/core/geom/3d/shape/PlaneShape3D.d.ts +105 -0
- package/src/core/geom/3d/shape/PlaneShape3D.d.ts.map +1 -0
- package/src/core/geom/3d/shape/PlaneShape3D.js +251 -0
- package/src/core/geom/3d/shape/SphereShape3D.js +3 -3
- package/src/core/geom/3d/shape/json/shape_to_type.d.ts.map +1 -1
- package/src/core/geom/3d/shape/json/shape_to_type.js +3 -0
- package/src/core/geom/3d/shape/json/type_adapters.d.ts +14 -0
- package/src/core/geom/3d/shape/json/type_adapters.d.ts.map +1 -1
- package/src/core/geom/3d/shape/json/type_adapters.js +15 -0
- package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts +51 -0
- package/src/core/geom/3d/shape/sdf/sdf3_box.d.ts.map +1 -0
- package/src/core/geom/3d/shape/sdf/sdf3_box.js +113 -0
- package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts +46 -0
- package/src/core/geom/3d/shape/sdf/sdf3_capsule.d.ts.map +1 -0
- package/src/core/geom/3d/shape/sdf/sdf3_capsule.js +82 -0
- package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts +60 -0
- package/src/core/geom/3d/shape/sdf/sdf3_cylinder.d.ts.map +1 -0
- package/src/core/geom/3d/shape/sdf/sdf3_cylinder.js +126 -0
- package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.d.ts +50 -0
- package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.d.ts.map +1 -0
- package/src/core/geom/3d/shape/sdf/sdf3_degenerate_normal.js +53 -0
- package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts +52 -0
- package/src/core/geom/3d/shape/sdf/sdf3_plane.d.ts.map +1 -0
- package/src/core/geom/3d/shape/sdf/sdf3_plane.js +61 -0
- package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts +41 -0
- package/src/core/geom/3d/shape/sdf/sdf3_sphere.d.ts.map +1 -0
- package/src/core/geom/3d/shape/sdf/sdf3_sphere.js +71 -0
- package/src/core/process/ConcurrencyGate.d.ts +103 -0
- package/src/core/process/ConcurrencyGate.d.ts.map +1 -0
- package/src/core/process/ConcurrencyGate.js +207 -0
- package/src/engine/asset/AssetManager.d.ts +10 -0
- package/src/engine/asset/AssetManager.d.ts.map +1 -1
- package/src/engine/asset/AssetManager.js +10 -0
- package/src/engine/graphics/CONTEXT_LOSS_RECOVERY_PLAN.md +30 -13
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +26 -0
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -0
- package/src/engine/graphics3/pose/collect_entity_playbacks.js +40 -0
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts.map +1 -1
- package/src/engine/graphics3/pose/query_entity_node_world_pose.js +74 -101
- package/src/engine/physics/cloth/MEASUREMENTS.md +1287 -4
- package/src/engine/physics/cloth/PLAN.md +1967 -1581
- package/src/engine/physics/cloth/build/ClothProxy.d.ts +147 -0
- package/src/engine/physics/cloth/build/ClothProxy.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/ClothProxy.js +207 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +70 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -0
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +256 -0
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts +176 -0
- package/src/engine/physics/cloth/collider/ClothColliderIndex.d.ts.map +1 -0
- package/src/engine/physics/cloth/collider/ClothColliderIndex.js +435 -0
- package/src/engine/physics/cloth/collider/ClothColliderKind.d.ts +12 -0
- package/src/engine/physics/cloth/collider/ClothColliderKind.d.ts.map +1 -0
- package/src/engine/physics/cloth/collider/ClothColliderKind.js +38 -0
- package/src/engine/physics/cloth/collider/ClothColliderRecord.d.ts +120 -0
- package/src/engine/physics/cloth/collider/ClothColliderRecord.d.ts.map +1 -0
- package/src/engine/physics/cloth/collider/ClothColliderRecord.js +137 -0
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts +25 -0
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.d.ts.map +1 -0
- package/src/engine/physics/cloth/collider/cloth_collider_bounds.js +190 -0
- package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts +44 -0
- package/src/engine/physics/cloth/collider/cloth_collider_pack.d.ts.map +1 -0
- package/src/engine/physics/cloth/collider/cloth_collider_pack.js +173 -0
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts +94 -0
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.d.ts.map +1 -0
- package/src/engine/physics/cloth/collider/cloth_collider_sdf.js +275 -0
- package/src/engine/physics/cloth/ecs/ClothCollider.d.ts +126 -0
- package/src/engine/physics/cloth/ecs/ClothCollider.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothCollider.js +199 -0
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts +9 -0
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothColliderFlags.js +32 -0
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts +114 -0
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothColliderSystem.js +243 -0
- package/src/engine/physics/cloth/ecs/ClothDynamicsFlags.js +66 -57
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +109 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +479 -363
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +95 -0
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothRig.js +140 -0
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +30 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +1021 -773
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts +90 -0
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +374 -0
- package/src/engine/physics/cloth/ecs/cloth_dynamics_library.d.ts +32 -3
- package/src/engine/physics/cloth/ecs/cloth_dynamics_library.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_library.js +283 -254
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +59 -0
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +328 -0
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts +13 -0
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_reconstruct_pose.js +288 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +58 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +199 -0
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts +8 -63
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +317 -645
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts +61 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back.js +212 -449
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +49 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +115 -0
- package/src/engine/physics/cloth/playground/README.md +155 -1
- package/src/engine/physics/cloth/playground/collide.html +178 -0
- package/src/engine/physics/cloth/playground/collide_build.d.ts +95 -0
- package/src/engine/physics/cloth/playground/collide_build.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/collide_build.js +315 -0
- package/src/engine/physics/cloth/playground/collide_main.d.ts +2 -0
- package/src/engine/physics/cloth/playground/collide_main.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/collide_main.js +720 -0
- package/src/engine/physics/cloth/playground/garment.html +182 -0
- package/src/engine/physics/cloth/playground/garment_build.d.ts +78 -0
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/garment_build.js +359 -0
- package/src/engine/physics/cloth/playground/garment_main.d.ts +2 -0
- package/src/engine/physics/cloth/playground/garment_main.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/garment_main.js +633 -0
- package/src/engine/physics/cloth/solver/ClothState.d.ts +208 -5
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +302 -8
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts +87 -0
- package/src/engine/physics/cloth/solver/cloth_contact_find.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_contact_find.js +343 -0
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts +112 -0
- package/src/engine/physics/cloth/solver/cloth_self_find.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_self_find.js +448 -0
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts +4 -1
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solve_vertex.js +16 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +112 -5
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +117 -6
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +40 -9
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +122 -10
- package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts +95 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_backstop_row.js +285 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts +129 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_contact_row.js +501 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts +75 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/constraint/cloth_self_row.js +202 -0
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/playground/vgeo_viewer/README.md +18 -0
- package/src/shade/playground/vgeo_viewer/main.js +87 -50
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +191 -62
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +94 -2
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +414 -2
- package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.d.ts +14 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_PARTIAL_UPLOAD_DESCRIPTOR_WORDS.js +13 -0
- package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.d.ts +17 -0
- package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_table_partial_upload_shader.js +116 -0
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts +9 -4
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +843 -734
- package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts +12 -0
- package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryMeshletsBVH.js +13 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +17 -0
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +185 -30
- package/src/shade/renderer/geometry/virtual/MICRON_COMPARISON_2026_08_20.md +17 -0
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +141 -24
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +204 -64
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +110 -10
- package/src/shade/renderer/geometry/virtual/VK_LOD_CLUSTERS_COMPARISON_2026_08_20.md +19 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts +19 -6
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoByteSource.js +26 -7
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts +173 -14
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerReader.js +458 -51
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts +49 -13
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoReadOptions.js +52 -14
- package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/VGEO_MAX_AUDIT_BYTES.js +19 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.d.ts +27 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_audit_container.js +48 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.d.ts +29 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/read/tool/vgeo_install_all_pages.js +60 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts +8 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_fetch_byte_source.js +32 -2
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts +258 -0
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyManager.js +723 -0
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts +49 -0
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/residency/VGeoResidencyOptions.js +50 -0
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts +3 -0
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.d.ts.map +1 -1
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +121 -21
- package/src/shade/renderer/texture/virtual/README.md +6 -4
- package/src/shade/renderer/texture/virtual/VirtualTextureManager.d.ts.map +1 -1
- package/src/shade/renderer/texture/virtual/VirtualTextureManager.js +7 -0
- package/src/shade/renderer/texture/virtual/source/VTSourceTiled.d.ts +3 -3
- package/src/shade/renderer/texture/virtual/source/VTSourceTiled.js +3 -3
- package/src/engine/ecs/system/SystemExecutionPhase.d.ts +0 -9
- package/src/engine/ecs/system/SystemExecutionPhase.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/NOTES.md +0 -128
- package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.d.ts +0 -6
- package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/VT_DEFAULT_PAGE_RESOLUTION.js +0 -5
- package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.d.ts +0 -49
- package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/VirtualTextureTileLoader.js +0 -264
- package/src/engine/graphics/texture/virtual/VirtualTextureUsage.d.ts +0 -44
- package/src/engine/graphics/texture/virtual/VirtualTextureUsage.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/VirtualTextureUsage.js +0 -228
- package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.d.ts +0 -3
- package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/VirtualTextureUsageShader.js +0 -73
- package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.d.ts +0 -14
- package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/debug/ResidencyDebugView.js +0 -85
- package/src/engine/graphics/texture/virtual/debug/UsageDebugView.d.ts +0 -12
- package/src/engine/graphics/texture/virtual/debug/UsageDebugView.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/debug/UsageDebugView.js +0 -63
- package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.d.ts +0 -12
- package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/debug/UsagePyramidDebugView.js +0 -243
- package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.d.ts +0 -30
- package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/tile/VirtualTextureTile.js +0 -39
- package/src/engine/graphics/texture/virtual/tile/compose_finger_print.d.ts +0 -9
- package/src/engine/graphics/texture/virtual/tile/compose_finger_print.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/tile/compose_finger_print.js +0 -24
- package/src/engine/graphics/texture/virtual/tile/compose_tile_address.d.ts +0 -9
- package/src/engine/graphics/texture/virtual/tile/compose_tile_address.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/tile/compose_tile_address.js +0 -26
- package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.d.ts +0 -11
- package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/tile/decompose_finger_print.js +0 -12
- package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.d.ts +0 -7
- package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.d.ts.map +0 -1
- package/src/engine/graphics/texture/virtual/tile/finger_print_to_tile_address.js +0 -16
- package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.d.ts +0 -7
- package/src/engine/graphics/texture/virtual/tile/tile_address_to_finger_print.d.ts.map +0 -1
- 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 "__#
|
|
67
|
+
static "__#383@#refresh_masks"(fluid: FluidComponent): void;
|
|
68
68
|
/**
|
|
69
69
|
* @param {FluidComponent} fluid
|
|
70
70
|
*/
|
|
71
|
-
static "__#
|
|
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 "__#
|
|
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 "__#
|
|
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
|
|
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
|
|
154
|
+
* What a reader's quarantine amounts to, for the panel.
|
|
149
155
|
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
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 {
|
|
161
|
+
* @param {VGeoContainerReader} reader
|
|
156
162
|
* @returns {string}
|
|
157
163
|
*/
|
|
158
|
-
function
|
|
159
|
-
|
|
160
|
-
|
|
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
|
|
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(
|
|
172
|
-
.map(vgeo_codec_name)
|
|
173
|
-
.join(' + ');
|
|
215
|
+
const codec = Array.from(codecs).map(vgeo_codec_name).join(' + ');
|
|
174
216
|
|
|
175
|
-
return
|
|
176
|
-
|
|
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
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
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
|
|
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
|
-
|
|
900
|
-
this.#
|
|
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
|
-
|
|
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
|
|
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',
|
|
1054
|
-
['per-vertex normals',
|
|
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":"
|
|
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"}
|