@woosh/meep-engine 3.23.0 → 3.25.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/editor/entity_world_bounds.d.ts +9 -3
- package/editor/entity_world_bounds.d.ts.map +1 -1
- package/editor/entity_world_bounds.js +61 -4
- package/package.json +1 -1
- package/src/core/binary/allocator/OffsetAllocator.d.ts +40 -2
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +124 -29
- package/src/core/collection/map/u32_index.d.ts +83 -0
- package/src/core/collection/map/u32_index.d.ts.map +1 -0
- package/src/core/collection/map/u32_index.js +247 -0
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.d.ts +2 -2
- package/src/engine/asset/loaders/GLTFSceneBundleAssetLoader.js +2 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts +1 -2
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.d.ts.map +1 -1
- package/src/engine/asset/loaders/USDSceneBundleAssetLoader.js +4 -12
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts +55 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthority.js +72 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts +40 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.d.ts.map +1 -0
- package/src/engine/ecs/gpu/GPUStateAuthorityFlags.js +79 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_assert_cpu.js +27 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts +23 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_declare.js +39 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts +15 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_grant.js +38 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts +18 -0
- package/src/engine/ecs/gpu/gpu_authority_has.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_has.js +28 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts +24 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.d.ts.map +1 -0
- package/src/engine/ecs/gpu/gpu_authority_revoke.js +49 -0
- package/src/engine/ecs/ik/IKProblem.d.ts +14 -0
- package/src/engine/ecs/ik/IKProblem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKProblem.js +16 -0
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +19 -0
- package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +2 -2
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +2 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +11 -2
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +47 -2
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +6 -0
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +6 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts +50 -0
- package/src/engine/ecs/transform/T64WorldCache.d.ts.map +1 -0
- package/src/engine/ecs/transform/T64WorldCache.js +139 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts +31 -0
- package/src/engine/ecs/transform/t64_evaluate_world.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_evaluate_world.js +126 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +8 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +59 -30
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +4 -11
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/SHADED_GEOMETRY_EVENT_CHANGE.js +13 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts +2 -14
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometry.js +11 -21
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.d.ts +1 -0
- package/src/engine/graphics/ecs/mesh-v2/ShadedGeometryFlags.js +7 -0
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts +5 -6
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/mesh-v2/aggregate/SGMeshHighlightSystem.js +13 -11
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts +14 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.d.ts.map +1 -0
- package/src/engine/graphics/ecs/mesh-v2/shaded_geometry_announce_change.js +21 -0
- package/src/engine/graphics/ecs/particles/ParticleEffect.d.ts +1 -1
- package/src/engine/graphics/ecs/particles/ParticleEffect.js +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.d.ts +1 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +3 -3
- package/src/engine/graphics3/AnimationSystem.js +2 -2
- package/src/engine/graphics3/DebugDrawSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DebugDrawSystem.js +2 -4
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +34 -27
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +185 -85
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts +4 -3
- package/src/engine/graphics3/HighlightOutlineSystem.d.ts.map +1 -1
- package/src/engine/graphics3/HighlightOutlineSystem.js +7 -9
- package/src/engine/graphics3/LightSystem.d.ts +7 -5
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +36 -22
- package/src/engine/graphics3/MeshSystem.d.ts +43 -39
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +324 -331
- package/src/engine/graphics3/PathDisplaySystem.d.ts.map +1 -1
- package/src/engine/graphics3/PathDisplaySystem.js +2 -4
- package/src/engine/graphics3/PickingQuery.d.ts +15 -21
- package/src/engine/graphics3/PickingQuery.d.ts.map +1 -1
- package/src/engine/graphics3/PickingQuery.js +21 -25
- package/src/engine/graphics3/PickingSystem.d.ts +60 -31
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem.js +413 -273
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +22 -12
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +309 -174
- package/src/engine/graphics3/TerrainSystem.d.ts +19 -11
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem.js +102 -53
- package/src/engine/graphics3/TooltipComponentSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TooltipComponentSystem.js +2 -14
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +2 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts +4 -4
- package/src/engine/graphics3/animation/ClipListPlayer.d.ts.map +1 -1
- package/src/engine/graphics3/animation/ClipListPlayer.js +2 -2
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts +9 -11
- package/src/engine/graphics3/highlight/pack_highlight_table.d.ts.map +1 -1
- package/src/engine/graphics3/highlight/pack_highlight_table.js +11 -18
- package/src/engine/graphics3/pose/query_entity_node_world_pose.d.ts +4 -3
- 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 +75 -74
- package/src/engine/graphics3/prefab/Prefab.d.ts +130 -0
- package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/Prefab.js +162 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts +72 -0
- package/src/engine/graphics3/prefab/PrefabInstance.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/PrefabInstance.js +80 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts +23 -0
- package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_compile.js +334 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts +46 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_instantiate.js +230 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts +70 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_normalize_skin_frames.js +210 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_place.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_place.js +130 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts +60 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_clip_scale_conflicts.js +128 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts +40 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.d.ts.map +1 -0
- package/src/engine/graphics3/prefab/prefab_skin_frame.js +116 -0
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts +16 -14
- package/src/engine/graphics3/preview/make_model_preview_scene.d.ts.map +1 -1
- package/src/engine/graphics3/preview/make_model_preview_scene.js +126 -154
- package/src/engine/graphics3/preview/make_model_thumbnail.js +1 -1
- package/src/engine/graphics3/register_instance_animation.d.ts +6 -6
- package/src/engine/graphics3/register_instance_animation.d.ts.map +1 -1
- package/src/engine/graphics3/register_instance_animation.js +4 -4
- package/src/engine/graphics3/shade_bundle_bounds.d.ts +2 -6
- package/src/engine/graphics3/shade_bundle_bounds.d.ts.map +1 -1
- package/src/engine/graphics3/shade_bundle_bounds.js +47 -55
- package/src/engine/graphics3/shader_picking_gather.d.ts +40 -0
- package/src/engine/graphics3/shader_picking_gather.d.ts.map +1 -0
- package/src/engine/graphics3/shader_picking_gather.js +120 -0
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts +11 -18
- package/src/engine/graphics3/terrain/pack_terrain_row_table.d.ts.map +1 -1
- package/src/engine/graphics3/terrain/pack_terrain_row_table.js +48 -53
- package/src/engine/physics/cloth/MEASUREMENTS.md +1050 -0
- package/src/engine/physics/cloth/PLAN.md +411 -49
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts +17 -2
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.d.ts.map +1 -1
- package/src/engine/physics/cloth/build/cloth_proxy_from_joints.js +284 -256
- package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.d.ts +52 -0
- package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothColliderSerializationAdapter.js +70 -0
- package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts +12 -3
- package/src/engine/physics/cloth/ecs/ClothDynamics.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothDynamics.js +340 -331
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts +49 -37
- package/src/engine/physics/cloth/ecs/ClothInstance.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothInstance.js +50 -37
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts +7 -8
- package/src/engine/physics/cloth/ecs/ClothRig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothRig.js +7 -8
- package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.d.ts +84 -0
- package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothSerializationAdapter.js +141 -0
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts +51 -81
- package/src/engine/physics/cloth/ecs/ClothSystem.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/ClothSystem.js +81 -870
- package/src/engine/physics/cloth/ecs/ClothWorkerCore.d.ts +48 -0
- package/src/engine/physics/cloth/ecs/ClothWorkerCore.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothWorkerCore.js +107 -0
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts +286 -0
- package/src/engine/physics/cloth/ecs/ClothWorld.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/ClothWorld.js +1104 -0
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts +182 -0
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/WorkerClothSystem.js +562 -0
- package/src/engine/physics/cloth/ecs/cloth.worker.d.ts +2 -0
- package/src/engine/physics/cloth/ecs/cloth.worker.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth.worker.js +12 -0
- package/src/engine/physics/cloth/ecs/cloth_build_rows.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_build_rows.js +2 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts +58 -0
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_dynamics_map.js +341 -271
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts +20 -2
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_gather_colliders.js +39 -15
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts +19 -23
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_rig.js +201 -199
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_seed_subtree.js +8 -0
- package/src/engine/physics/cloth/ecs/cloth_worker_protocol.d.ts +29 -0
- package/src/engine/physics/cloth/ecs/cloth_worker_protocol.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/cloth_worker_protocol.js +78 -0
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts +18 -34
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.d.ts.map +1 -1
- package/src/engine/physics/cloth/ecs/cloth_write_back_rig.js +58 -115
- package/src/engine/physics/cloth/ecs/makeClothWorker.d.ts +17 -0
- package/src/engine/physics/cloth/ecs/makeClothWorker.d.ts.map +1 -0
- package/src/engine/physics/cloth/ecs/makeClothWorker.js +18 -0
- package/src/engine/physics/cloth/playground/README.md +84 -13
- package/src/engine/physics/cloth/playground/garment_build.d.ts +0 -1
- package/src/engine/physics/cloth/playground/garment_build.d.ts.map +1 -1
- package/src/engine/physics/cloth/playground/garment_build.js +64 -58
- package/src/engine/physics/cloth/playground/garment_main.js +59 -33
- package/src/engine/physics/cloth/playground/wind.html +166 -0
- package/src/engine/physics/cloth/playground/wind_build.d.ts +81 -0
- package/src/engine/physics/cloth/playground/wind_build.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/wind_build.js +141 -0
- package/src/engine/physics/cloth/playground/wind_main.d.ts +2 -0
- package/src/engine/physics/cloth/playground/wind_main.d.ts.map +1 -0
- package/src/engine/physics/cloth/playground/wind_main.js +681 -0
- package/src/engine/physics/cloth/solver/ClothState.d.ts +134 -79
- package/src/engine/physics/cloth/solver/ClothState.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/ClothState.js +273 -12
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts +33 -0
- package/src/engine/physics/cloth/solver/cloth_solver_constants.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_solver_constants.js +34 -0
- package/src/engine/physics/cloth/solver/cloth_step.d.ts +21 -2
- package/src/engine/physics/cloth/solver/cloth_step.d.ts.map +1 -1
- package/src/engine/physics/cloth/solver/cloth_step.js +173 -4
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts +40 -0
- package/src/engine/physics/cloth/solver/cloth_step_instance.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_step_instance.js +284 -0
- package/src/engine/physics/cloth/solver/cloth_wind_accelerate.d.ts +107 -0
- package/src/engine/physics/cloth/solver/cloth_wind_accelerate.d.ts.map +1 -0
- package/src/engine/physics/cloth/solver/cloth_wind_accelerate.js +263 -0
- package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts +88 -0
- package/src/engine/physics/cloth/wind/AbstractClothWind.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/AbstractClothWind.js +100 -0
- package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts +85 -0
- package/src/engine/physics/cloth/wind/ClothAmbientWind.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/ClothAmbientWind.js +182 -0
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts +79 -0
- package/src/engine/physics/cloth/wind/ClothFluidWind.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/ClothFluidWind.js +210 -0
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts +101 -0
- package/src/engine/physics/cloth/wind/cloth_sample_air.d.ts.map +1 -0
- package/src/engine/physics/cloth/wind/cloth_sample_air.js +290 -0
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/shade/RENDERER_CONTRACT.md +85 -53
- package/src/shade/device/ShadeGPUCommandContext.d.ts +23 -0
- package/src/shade/device/ShadeGPUCommandContext.d.ts.map +1 -1
- package/src/shade/device/ShadeGPUCommandContext.js +36 -0
- package/src/shade/device/mock/texture_copy.d.ts.map +1 -1
- package/src/shade/device/mock/texture_copy.js +28 -0
- package/src/shade/playground/add_random_meshes.d.ts +4 -4
- package/src/shade/playground/add_random_meshes.d.ts.map +1 -1
- package/src/shade/playground/add_random_meshes.js +20 -16
- package/src/shade/playground/avboit/main.d.ts +1 -0
- package/src/shade/playground/avboit/main.d.ts.map +1 -1
- package/src/shade/playground/avboit/main.js +916 -875
- package/src/shade/playground/basis_textures/main.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/main.js +22 -8
- package/src/shade/playground/basis_textures/texture_inventory.d.ts +2 -2
- package/src/shade/playground/basis_textures/texture_inventory.d.ts.map +1 -1
- package/src/shade/playground/basis_textures/texture_inventory.js +6 -7
- package/src/shade/playground/ground_seam/main.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/main.js +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts +13 -4
- package/src/shade/playground/ground_seam/make_ground.d.ts.map +1 -1
- package/src/shade/playground/ground_seam/make_ground.js +21 -16
- package/src/shade/playground/particle_ecs/bonfire_editor.js +3 -3
- package/src/shade/playground/particle_system/main.js +11 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts +15 -10
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +56 -15
- package/src/shade/playground/particle_system/particle_scene.d.ts +68 -28
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +149 -53
- package/src/shade/playground/readback_crossover/index.html +41 -0
- package/src/shade/playground/readback_crossover/main.d.ts +2 -0
- package/src/shade/playground/readback_crossover/main.d.ts.map +1 -0
- package/src/shade/playground/readback_crossover/main.js +372 -0
- package/src/shade/playground/skinned_blas_refit/README.md +11 -7
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts +13 -44
- package/src/shade/playground/skinned_blas_refit/add_floor.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/add_floor.js +19 -59
- package/src/shade/playground/skinned_blas_refit/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/main.js +67 -58
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts +40 -54
- package/src/shade/playground/skinned_blas_refit/place_character.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/place_character.js +47 -74
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/sweep_views.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +4 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_clone_leaves.js +11 -4
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +38 -9
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +9 -6
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts +3 -3
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_traversal_reachability.js +3 -3
- package/src/shade/playground/skinned_mesh_soup/README.md +6 -6
- package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/main.js +44 -102
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +5 -5
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
- package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +42 -33
- package/src/shade/playground/sponza_path_trace/main.d.ts +1 -0
- package/src/shade/playground/sponza_path_trace/main.d.ts.map +1 -1
- package/src/shade/playground/sponza_path_trace/main.js +393 -363
- package/src/shade/playground/ssr_reprojection/main.js +11 -9
- package/src/shade/playground/ssr_reprojection/scene.d.ts +15 -4
- package/src/shade/playground/ssr_reprojection/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_reprojection/scene.js +32 -11
- package/src/shade/playground/ssr_variance/main.js +1 -1
- package/src/shade/playground/ssr_variance/scene.d.ts +10 -4
- package/src/shade/playground/ssr_variance/scene.d.ts.map +1 -1
- package/src/shade/playground/ssr_variance/scene.js +39 -15
- package/src/shade/playground/vgeo_runtime/README.md +94 -0
- package/src/shade/playground/vgeo_runtime/index.html +62 -0
- package/src/shade/playground/vgeo_runtime/main.d.ts +2 -0
- package/src/shade/playground/vgeo_runtime/main.d.ts.map +1 -0
- package/src/shade/playground/vgeo_runtime/main.js +399 -0
- package/src/shade/playground/vgeo_viewer/main.js +6 -2
- package/src/shade/playground/vgeo_viewer/sample_asset.js +1 -1
- package/src/shade/playground/volumetrics_froxel/main.d.ts.map +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +936 -922
- package/src/shade/renderer/GraphicsContext.d.ts +7 -0
- package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
- package/src/shade/renderer/GraphicsContext.js +11 -0
- package/src/shade/renderer/Renderer.d.ts +3 -2
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +3 -2
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +39 -47
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +319 -256
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts +26 -22
- package/src/shade/renderer/animation/ShadeAnimationChannel.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationChannel.js +28 -23
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +14 -6
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationClip.js +20 -8
- package/src/shade/renderer/animation/Skin.d.ts +19 -19
- package/src/shade/renderer/animation/Skin.d.ts.map +1 -1
- package/src/shade/renderer/animation/Skin.js +15 -13
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts +6 -5
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +9 -9
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +5 -59
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -1
- package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +8 -132
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts +65 -62
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +148 -194
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/animation/skinning/SKINNING_BINDING_STRUCT.js +4 -7
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +2 -2
- package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +2 -2
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts +74 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.d.ts.map +1 -0
- package/src/shade/renderer/buffer/GPUBufferReadbackAllocator.js +240 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts +14 -0
- package/src/shade/renderer/buffer/table/GPUDatabase.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUDatabase.js +64 -6
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts +190 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUDatabaseReadback.js +1323 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts +10 -0
- package/src/shade/renderer/buffer/table/GPUPageMetadata.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUPageMetadata.js +12 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts +15 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPUReadbackStatus.js +34 -0
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts +75 -7
- package/src/shade/renderer/buffer/table/GPUTypedTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +518 -135
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts +19 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/GPU_TABLE_GATHER_DESCRIPTOR_WORDS.js +18 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts +39 -0
- package/src/shade/renderer/buffer/table/WordViews.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/WordViews.js +62 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts +27 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_table_gather_shader.js +117 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts +121 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/serde/generate_record_writer.js +395 -0
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/single/GPUSingleTypeTable.js +70 -20
- package/src/shade/renderer/camera/Camera.d.ts +14 -0
- package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
- package/src/shade/renderer/camera/Camera.js +7 -1
- package/src/shade/renderer/dynamic/GPUDynamicMeshResidency.js +1 -1
- package/src/shade/renderer/geometry/GEOMETRY_METADATA_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GEOMETRY_METADATA_STRUCT.js +16 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryManager.js +29 -9
- package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts +10 -0
- package/src/shade/renderer/geometry/GPUGeometryMetadata.d.ts.map +1 -1
- package/src/shade/renderer/geometry/GPUGeometryMetadata.js +13 -0
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/bvh/GPUGeometryBVHManager.js +6 -5
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts +3 -3
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.d.ts.map +1 -1
- package/src/shade/renderer/geometry/meshlet/GPUMeshletManager.js +15 -11
- package/src/shade/renderer/geometry/virtual/VGEO_FORMAT.md +46 -18
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_DESIGN.md +70 -22
- package/src/shade/renderer/geometry/virtual/VIRTUAL_GEOMETRY_PLAN.md +97 -19
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts +12 -2
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/VGeoBuildOptions.js +14 -3
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts +2 -2
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/build/vgeo_assemble_pages.js +124 -6
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts +22 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/build/vgeo_page_node_count.js +53 -0
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts +8 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/VGeoWriteOptions.js +8 -1
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.js +15 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.d.ts +54 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/format/page/VGEO_DEFAULT_PAGE_SIZE.js +53 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts +13 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoContainerHeader.js +14 -2
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts +100 -0
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/VGeoPage.js +113 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_header.js +5 -0
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/read/vgeo_read_page.js +108 -0
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_validate_container.js +23 -0
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.d.ts.map +1 -1
- package/src/shade/renderer/geometry/virtual/format/vgeo_write_container.js +40 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts +228 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryPool.js +932 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts +176 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/GPUVirtualGeometryRuntime.js +425 -0
- package/src/shade/renderer/geometry/virtual/runtime/REVIEW_LEDGER.md +241 -0
- package/src/shade/renderer/geometry/virtual/runtime/RUNTIME_PLAN.md +574 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts +120 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoFeedbackLoop.js +674 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts +287 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VGeoRuntimeTables.js +976 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts +42 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/VirtualGeometry.js +96 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.d.ts +16 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_FLAG_CULL.js +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_PARAMS_STRUCT.js +83 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/VGEO_CUT_WORKGROUP_SIZE.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/chunk_vgeo_cut_access.js +160 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_collect.js +255 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_queue_prepare.js +80 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_seed.js +144 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts +3 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/shader_vgeo_cut_traverse.js +530 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts +39 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/cut/vgeo_cut_feedback_layout.js +54 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.d.ts +41 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_if_enabled.js +56 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts +49 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/graph_vgeo_expand_instances_to_meshlets.js +328 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_OFFSET.js +51 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CLUSTER_ROW_WORDS.js +12 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts +17 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT.js +99 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_CUT_STAT_COUNT.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_FEEDBACK_OFFSET.js +27 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_NONE.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_OFFSET.js +35 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GEOMETRY_ROW_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.d.ts +15 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_FLAG_SELECTABLE.js +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_OFFSET.js +36 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_GROUP_ROW_WORDS.js +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_OFFSET.js +54 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_INSTANCE_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_LEAF_BIT.js +10 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.d.ts +7 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_OFFSET.js +30 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NODE_ROW_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.d.ts +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_NO_CHILD_PAGE.js +12 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.d.ts +14 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_NONE.js +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts +11 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_OFFSET.js +61 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_PAGE_ROW_WORDS.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.d.ts +13 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_ITEM_WORDS.js +12 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.d.ts +9 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_QUEUE_TARGET_GROUP_BIT.js +8 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.d.ts +20 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/layout/VGEO_WANT_WORDS.js +19 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts +23 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_meshlet_batch.js +70 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts +18 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_block_words.js +25 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts +35 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_page_slot_words.js +41 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts +32 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.d.ts.map +1 -0
- package/src/shade/renderer/geometry/virtual/runtime/vgeo_runtime_write_page_block.js +138 -0
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.d.ts +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_bake_for_scene.js +4 -4
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts +1 -3
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/brick4/cpu/brick4_generate_tree_from_scene.js +5 -4
- package/src/shade/renderer/global_illumination/brick4/gpu/bake/brick4_bake_basic.js +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/bake/GPULightProbeVolumeRenderer.js +1 -4
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts +8 -3
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +19 -14
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/graph_generate_probe_locations.js +9 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts +3 -3
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/placement/software/lpv_generate_probe_locations2.js +12 -5
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +1 -1
- package/src/shade/renderer/light/GPULightCollection.d.ts +29 -0
- package/src/shade/renderer/light/GPULightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/GPULightCollection.js +444 -329
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/light/LIGHT_DATABASE_SPEC.js +7 -1
- package/src/shade/renderer/light/LightCollection.d.ts +29 -1
- package/src/shade/renderer/light/LightCollection.d.ts.map +1 -1
- package/src/shade/renderer/light/LightCollection.js +50 -1
- package/src/shade/renderer/light/make_sunlight.js +2 -2
- package/src/shade/renderer/light/model/Light.d.ts +29 -2
- package/src/shade/renderer/light/model/Light.d.ts.map +1 -1
- package/src/shade/renderer/light/model/Light.js +30 -2
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_directional.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_directional.js +8 -5
- package/src/shade/renderer/light/model/io/light_record_point.d.ts +3 -1
- package/src/shade/renderer/light/model/io/light_record_point.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_point.js +5 -2
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts +4 -1
- package/src/shade/renderer/light/model/io/light_record_spot.d.ts.map +1 -1
- package/src/shade/renderer/light/model/io/light_record_spot.js +10 -6
- package/src/shade/renderer/light/place_light.d.ts +16 -0
- package/src/shade/renderer/light/place_light.d.ts.map +1 -0
- package/src/shade/renderer/light/place_light.js +36 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts +44 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.d.ts.map +1 -0
- package/src/shade/renderer/light/shader_refresh_light_poses.js +154 -0
- package/src/shade/renderer/lightmap/GPULightMap.js +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.d.ts.map +1 -1
- package/src/shade/renderer/lightmap/bake/raster/graph_draw_lightmap_viz_buffer.js +12 -14
- package/src/shade/renderer/loader/SceneBundle.d.ts +53 -28
- package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
- package/src/shade/renderer/loader/SceneBundle.js +111 -56
- package/src/shade/renderer/loader/SceneNode.d.ts +81 -0
- package/src/shade/renderer/loader/SceneNode.d.ts.map +1 -0
- package/src/shade/renderer/loader/SceneNode.js +114 -0
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts +3 -2
- package/src/shade/renderer/loader/gltf/load_gltf.d.ts.map +1 -1
- package/src/shade/renderer/loader/gltf/load_gltf.js +110 -142
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts +4 -4
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/UsdExtensionRegistry.js +2 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts +3 -2
- package/src/shade/renderer/loader/usd/load_usd.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/load_usd.js +4 -5
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts +3 -3
- package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
- package/src/shade/renderer/loader/usd/usd_build_scene.js +47 -55
- package/src/shade/renderer/material/GPUMaterialManager.js +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts +5 -4
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.d.ts.map +1 -1
- package/src/shade/renderer/material/resident/GPUResidentMaterialContext.js +8 -15
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts +15 -13
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.d.ts.map +1 -1
- package/src/shade/renderer/object_property/shader_refresh_all_mesh_bounds.js +40 -21
- package/src/shade/renderer/particles/DESIGN.md +53 -50
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +31 -17
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +54 -91
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +12 -11
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +12 -11
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +13 -19
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +19 -25
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +34 -24
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +53 -40
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +1 -1
- package/src/shade/renderer/path_tracer/graph_path_trace_scene.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +9 -0
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_meshes_classify_buckets.js +2 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/expand/bucket/mesh/graph_scene_meshes_cull_and_classify_buckets.js +5 -2
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/fast/graph_rasterize_scene_fast.js +13 -2
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +1 -1
- package/src/shade/renderer/rasterize/native/graph_rasterize_meshes_alpha_tested.js +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_partial_opaque.js +12 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_remaining_opaque.js +10 -0
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +1 -1
- package/src/shade/renderer/scene/DynamicMesh.d.ts +13 -4
- package/src/shade/renderer/scene/DynamicMesh.d.ts.map +1 -1
- package/src/shade/renderer/scene/DynamicMesh.js +14 -4
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts +38 -18
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUInstancesAccelerationStructure.js +112 -60
- package/src/shade/renderer/scene/GPUSceneContext.d.ts +69 -44
- package/src/shade/renderer/scene/GPUSceneContext.d.ts.map +1 -1
- package/src/shade/renderer/scene/GPUSceneContext.js +244 -525
- package/src/shade/renderer/scene/NODE3D_STRUCT.d.ts +5 -5
- package/src/shade/renderer/scene/NODE3D_STRUCT.js +5 -5
- package/src/shade/renderer/scene/Scene.d.ts +18 -60
- package/src/shade/renderer/scene/Scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/Scene.js +53 -146
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts +24 -3
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.d.ts.map +1 -1
- package/src/shade/renderer/scene/bvh/StaticSceneBVH.js +53 -13
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts +5 -6
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.d.ts.map +1 -1
- package/src/shade/renderer/scene/hierarchy/graph_scene_update_transform_hierarchy.js +5 -6
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts +10 -2
- package/src/shade/renderer/scene/optimization/scene_optimize.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/scene_optimize.js +266 -230
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts +53 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUEntityBoundsReadback.js +144 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts +227 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/GPUSceneRows.js +1158 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts +48 -0
- package/src/shade/renderer/scene/rows/place_primitive.d.ts.map +1 -0
- package/src/shade/renderer/scene/rows/place_primitive.js +98 -0
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts +10 -8
- package/src/shade/renderer/scene/serialization/deserialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/deserialize_scene.js +24 -27
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts +9 -2
- package/src/shade/renderer/scene/serialization/serialize_scene.d.ts.map +1 -1
- package/src/shade/renderer/scene/serialization/serialize_scene.js +25 -4
- package/src/shade/renderer/scene/verify_gpu_tlas_build.js +2 -2
- package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts +35 -0
- package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/geometry/mat3/chunk_mat3_singular_values.js +91 -0
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/DIRECTIONAL_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/POINT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/light/SPOT_LIGHT_STRUCT.js +5 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts +39 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +112 -64
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts +7 -0
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1541 -1352
- package/src/shade/renderer/shadow/map/PointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +1 -1
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts +29 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/CSM_CASTER_RANGE_STRUCT.js +43 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts +13 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/SHADOWMAP_CSM_CASTER_RANGE_MARGIN_FRACTION.js +12 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts +49 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.d.ts.map +1 -0
- package/src/shade/renderer/shadow/map/csm/shader/shader_csm_caster_range.js +194 -0
- package/src/shade/renderer/shadow/map/csm_debug_draw_preview.js +1 -1
- package/src/shade/renderer/shadow/map/shadowmap_update_score.js +1 -1
- package/src/shade/renderer/shadow/ray/RTXShadows.js +1 -1
- package/src/shade/renderer/shadow/ray/staged/trace/graph_trace_rays.js +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.d.ts.map +1 -1
- package/src/shade/renderer/shadow/sdf/cascade/CascadedSceneSDF.js +3 -1
- package/src/shade/renderer/texture/bindless/GPUBindlessTextureManager.js +8 -8
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +4 -3
- package/src/engine/graphics3/instantiate_scene_bundle.d.ts +0 -54
- package/src/engine/graphics3/instantiate_scene_bundle.d.ts.map +0 -1
- package/src/engine/graphics3/instantiate_scene_bundle.js +0 -164
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts +0 -39
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts.map +0 -1
- package/src/engine/graphics3/shade_node_to_entity_composition.js +0 -88
- package/src/shade/renderer/animation/compute_skin_world_bounds.d.ts +0 -35
- package/src/shade/renderer/animation/compute_skin_world_bounds.d.ts.map +0 -1
- package/src/shade/renderer/animation/compute_skin_world_bounds.js +0 -146
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.d.ts +0 -96
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.d.ts.map +0 -1
- package/src/shade/renderer/animation/compute_skinned_mesh_clip_bounding_sphere.js +0 -531
- package/src/shade/renderer/animation/pose/pose_evaluate_world.d.ts +0 -20
- package/src/shade/renderer/animation/pose/pose_evaluate_world.d.ts.map +0 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_world.js +0 -76
- package/src/shade/renderer/animation/skin_bind_transform.d.ts +0 -25
- package/src/shade/renderer/animation/skin_bind_transform.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_bind_transform.js +0 -33
- package/src/shade/renderer/animation/skin_frame_defect.d.ts +0 -34
- package/src/shade/renderer/animation/skin_frame_defect.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_frame_defect.js +0 -132
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts +0 -24
- package/src/shade/renderer/animation/skin_joint_matrix.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_joint_matrix.js +0 -46
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts +0 -70
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts.map +0 -1
- package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +0 -216
- package/src/shade/renderer/scene/InstanceBatch.d.ts +0 -92
- package/src/shade/renderer/scene/InstanceBatch.d.ts.map +0 -1
- package/src/shade/renderer/scene/InstanceBatch.js +0 -235
- package/src/shade/renderer/scene/Mesh.d.ts +0 -55
- package/src/shade/renderer/scene/Mesh.d.ts.map +0 -1
- package/src/shade/renderer/scene/Mesh.js +0 -168
- package/src/shade/renderer/scene/Node3D.d.ts +0 -140
- package/src/shade/renderer/scene/Node3D.d.ts.map +0 -1
- package/src/shade/renderer/scene/Node3D.js +0 -263
- package/src/shade/renderer/scene/SceneNodeBinding.d.ts +0 -52
- package/src/shade/renderer/scene/SceneNodeBinding.d.ts.map +0 -1
- package/src/shade/renderer/scene/SceneNodeBinding.js +0 -56
- package/src/shade/renderer/scene/SkinnedMesh.d.ts +0 -110
- package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +0 -1
- package/src/shade/renderer/scene/SkinnedMesh.js +0 -170
- package/src/shade/renderer/scene/TransformAuthority.d.ts +0 -19
- package/src/shade/renderer/scene/TransformAuthority.d.ts.map +0 -1
- package/src/shade/renderer/scene/TransformAuthority.js +0 -33
|
@@ -0,0 +1,932 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES } from "../format/header/VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES.js";
|
|
3
|
+
import { VGEO_DEFAULT_PAGE_SIZE } from "../format/page/VGEO_DEFAULT_PAGE_SIZE.js";
|
|
4
|
+
import { VGEO_GEOMETRY_ROW_OFFSET } from "./layout/VGEO_GEOMETRY_ROW_OFFSET.js";
|
|
5
|
+
import { VGEO_GEOMETRY_ROW_WORDS } from "./layout/VGEO_GEOMETRY_ROW_WORDS.js";
|
|
6
|
+
import { VGEO_PAGE_ROW_OFFSET } from "./layout/VGEO_PAGE_ROW_OFFSET.js";
|
|
7
|
+
import { VGEO_PAGE_ROW_WORDS } from "./layout/VGEO_PAGE_ROW_WORDS.js";
|
|
8
|
+
import { VGeoRuntimeTables } from "./VGeoRuntimeTables.js";
|
|
9
|
+
import { vgeo_runtime_meshlet_batch } from "./vgeo_runtime_meshlet_batch.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* One resident geometry's bookkeeping above the tables.
|
|
13
|
+
*/
|
|
14
|
+
class VGeoPoolGeometry {
|
|
15
|
+
/**
|
|
16
|
+
* @type {VGeoContainerReader}
|
|
17
|
+
*/
|
|
18
|
+
reader;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @type {number}
|
|
22
|
+
*/
|
|
23
|
+
row = 0;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Container page index to the meshlet-pool allocation holding that page's clusters.
|
|
27
|
+
* @type {Map<number, object>}
|
|
28
|
+
*/
|
|
29
|
+
batches = new Map();
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Container page index to page-table row.
|
|
33
|
+
* @type {Map<number, number>}
|
|
34
|
+
*/
|
|
35
|
+
rows = new Map();
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param {VGeoContainerReader} reader
|
|
39
|
+
* @param {number} row
|
|
40
|
+
*/
|
|
41
|
+
constructor(reader, row) {
|
|
42
|
+
this.reader = reader;
|
|
43
|
+
this.row = row;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The VRAM tier: which pages are on the device, what they cost, and what goes when the budget says
|
|
49
|
+
* so.
|
|
50
|
+
*
|
|
51
|
+
* `VGeoRuntimeTables` is the layout and `VGeoResidencyManager` is the RAM tier's budget; this is
|
|
52
|
+
* the one in between, and it is the only object in the runtime that holds a `GPUDevice`. The split
|
|
53
|
+
* is the same one the format made between `format/read/` and `residency/`: a page's *shape* is a
|
|
54
|
+
* fact about the container, and what may be resident is a question about a scene.
|
|
55
|
+
*
|
|
56
|
+
* **Two tiers, two budgets, and the inner one is a subset.** A page is in VRAM only if it is in
|
|
57
|
+
* RAM, and every question this tier asks about its own residency it answers out of its own tables —
|
|
58
|
+
* eviction's child rule, the bytes an eviction refunds, and above all *selectability*, which was
|
|
59
|
+
* being taken from the RAM tier and is what REVIEW_LEDGER C1 is. The reader is consulted for
|
|
60
|
+
* exactly one thing: the decoded bytes of a page being installed.
|
|
61
|
+
*
|
|
62
|
+
* Eviction is design §6's rule: LRU on **last-touched**, under a protect window no shorter than
|
|
63
|
+
* feedback latency. Not last-*wanted* — that freezes a stamp at fetch time and evicts exactly what
|
|
64
|
+
* is on screen, which is the fallback-chain bug `VTPhysicalCache` already keys on touch to avoid.
|
|
65
|
+
*
|
|
66
|
+
* **Two budgets, and both of them bind.** Slots are fixed and finite, so a full table is as real a
|
|
67
|
+
* reason to evict as a full byte budget; `#make_room` loops on whichever of the two is short.
|
|
68
|
+
*
|
|
69
|
+
* @author Alex Goldring
|
|
70
|
+
* @copyright Company Named Limited (c) 2026
|
|
71
|
+
*/
|
|
72
|
+
export class GPUVirtualGeometryPool {
|
|
73
|
+
/**
|
|
74
|
+
* @type {GPUDevice}
|
|
75
|
+
*/
|
|
76
|
+
#device;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @type {GPUMeshletManager}
|
|
80
|
+
*/
|
|
81
|
+
#meshlets;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* @type {VGeoRuntimeTables}
|
|
85
|
+
*/
|
|
86
|
+
#tables;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @type {Map<VGeoContainerReader, VGeoPoolGeometry>}
|
|
90
|
+
*/
|
|
91
|
+
#geometries = new Map();
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Page row to the geometry that owns it, so an eviction chosen by budget can find its reader.
|
|
95
|
+
* @type {Map<number, VGeoPoolGeometry>}
|
|
96
|
+
*/
|
|
97
|
+
#owner = new Map();
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Page row to the frame it was last selected from.
|
|
101
|
+
* @type {Map<number, number>}
|
|
102
|
+
*/
|
|
103
|
+
#touched = new Map();
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Page rows that may never go: the root page of every registered geometry, which is where every
|
|
107
|
+
* traversal starts and without which a geometry draws nothing at all.
|
|
108
|
+
* @type {Set<number>}
|
|
109
|
+
*/
|
|
110
|
+
#pinned = new Set();
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Per page row, the unsubscribe for that page's meshlet batch relocation signal.
|
|
114
|
+
* @type {Map<number, function>}
|
|
115
|
+
*/
|
|
116
|
+
#batch_listeners = new Map();
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* @type {number}
|
|
120
|
+
*/
|
|
121
|
+
#frame = 0;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @type {number}
|
|
125
|
+
*/
|
|
126
|
+
#resident_bytes = 0;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @type {number}
|
|
130
|
+
*/
|
|
131
|
+
#budget_bytes;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* @type {number}
|
|
135
|
+
*/
|
|
136
|
+
#protect_window;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @type {number}
|
|
140
|
+
*/
|
|
141
|
+
#page_size;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Word ranges of each shadow that have changed since the last flush, as `[start, end)` pairs.
|
|
145
|
+
* @type {{lookup: number[], arena: number[], geometries: number[]}}
|
|
146
|
+
*/
|
|
147
|
+
#dirty = { lookup: [], arena: [], geometries: [] };
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @type {{lookup: GPUBuffer, arena: GPUBuffer, geometries: GPUBuffer}}
|
|
151
|
+
*/
|
|
152
|
+
#buffers;
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* @type {number}
|
|
156
|
+
*/
|
|
157
|
+
#evicted_page_count = 0;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @type {number}
|
|
161
|
+
*/
|
|
162
|
+
#refused_install_count = 0;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* @param {Object} options
|
|
166
|
+
* @param {GPUDevice} options.device
|
|
167
|
+
* @param {GPUMeshletManager} options.meshlets the pool VG shares with static geometry, so a VG
|
|
168
|
+
* draw record is read downstream by the same shader that reads a static one
|
|
169
|
+
* @param {number} [options.budget_bytes] decoded page bytes this tier may hold; defaults to
|
|
170
|
+
* what its slots hold at the page size it was built for, so the two agree by construction
|
|
171
|
+
* @param {number} [options.protect_window] frames a touched page is safe for; no shorter than
|
|
172
|
+
* feedback latency, which is at least one frame of `mapAsync` and in practice several
|
|
173
|
+
* @param {Object} [options.table_options] passed to {@link VGeoRuntimeTables}
|
|
174
|
+
* @param {number} [options.page_size] the page size every container registered here must have
|
|
175
|
+
* been built at, and the one this tier's slots are sized from
|
|
176
|
+
*/
|
|
177
|
+
constructor({
|
|
178
|
+
device,
|
|
179
|
+
meshlets,
|
|
180
|
+
budget_bytes = undefined,
|
|
181
|
+
protect_window = 4,
|
|
182
|
+
table_options = undefined,
|
|
183
|
+
page_size = VGEO_DEFAULT_PAGE_SIZE,
|
|
184
|
+
}) {
|
|
185
|
+
assert.defined(device, 'device');
|
|
186
|
+
assert.defined(meshlets, 'meshlets');
|
|
187
|
+
assert.isNonNegativeInteger(protect_window, 'protect_window');
|
|
188
|
+
assert.isPositiveInteger(page_size, 'page_size');
|
|
189
|
+
|
|
190
|
+
this.#device = device;
|
|
191
|
+
this.#meshlets = meshlets;
|
|
192
|
+
this.#protect_window = protect_window;
|
|
193
|
+
this.#page_size = page_size;
|
|
194
|
+
|
|
195
|
+
this.#tables = new VGeoRuntimeTables({ page_size, ...table_options });
|
|
196
|
+
|
|
197
|
+
this.#budget_bytes = budget_bytes ?? this.#tables.page_capacity * page_size;
|
|
198
|
+
|
|
199
|
+
assert.isNonNegativeInteger(this.#budget_bytes, 'budget_bytes');
|
|
200
|
+
|
|
201
|
+
this.#buffers = {
|
|
202
|
+
lookup: this.#create('lookup', this.#tables.lookup_words.byteLength),
|
|
203
|
+
arena: this.#create('arena', this.#tables.arena_words.byteLength),
|
|
204
|
+
geometries: this.#create('geometries', this.#tables.geometry_words.byteLength),
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
// everything starts absent, and "absent" is a sentinel rather than a zero — the lookup has
|
|
208
|
+
// to reach the device before any cut reads it
|
|
209
|
+
this.#dirty.lookup = [0, this.#tables.lookup_words.length];
|
|
210
|
+
this.#dirty.arena = [0, this.#tables.arena_words.length];
|
|
211
|
+
this.#dirty.geometries = [0, this.#tables.geometry_words.length];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* @param {string} name
|
|
216
|
+
* @param {number} size bytes
|
|
217
|
+
* @returns {GPUBuffer}
|
|
218
|
+
*/
|
|
219
|
+
#create(name, size) {
|
|
220
|
+
/*
|
|
221
|
+
The ceiling is `maxStorageBufferBindingSize`, not `maxBufferSize`. Design §6 names this and
|
|
222
|
+
names `GPUMeshletManager` clamping against the wrong one: the spec defaults are 256 MiB and
|
|
223
|
+
128 MiB, so a buffer between them is creatable and not bindable — and `createBuffer`
|
|
224
|
+
answers an over-limit size with an *invalid buffer* rather than an exception, which makes
|
|
225
|
+
the failure silent where it happens and loud several frames later.
|
|
226
|
+
|
|
227
|
+
Checked once, at construction, because nothing here is ever recreated: the arena is
|
|
228
|
+
`page_capacity` slots from the first frame to the last.
|
|
229
|
+
*/
|
|
230
|
+
const limit = this.#device.limits?.maxStorageBufferBindingSize ?? size;
|
|
231
|
+
|
|
232
|
+
if (size > limit) {
|
|
233
|
+
throw new Error(
|
|
234
|
+
`virtual geometry ${name} wants ${size} bytes,`
|
|
235
|
+
+ ` past this adapter's ${limit}-byte storage binding limit`
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return this.#device.createBuffer({
|
|
240
|
+
label: `GPUVirtualGeometryPool/${name}`,
|
|
241
|
+
size: Math.max(4, size),
|
|
242
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* @returns {GPUBuffer}
|
|
248
|
+
*/
|
|
249
|
+
get buffer_lookup() {
|
|
250
|
+
return this.#buffers.lookup;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* The arena, which is also the page table: a page's header is the first words of its slot.
|
|
255
|
+
* @returns {GPUBuffer}
|
|
256
|
+
*/
|
|
257
|
+
get buffer_arena() {
|
|
258
|
+
return this.#buffers.arena;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* @returns {GPUBuffer}
|
|
263
|
+
*/
|
|
264
|
+
get buffer_geometries() {
|
|
265
|
+
return this.#buffers.geometries;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* @returns {VGeoRuntimeTables}
|
|
270
|
+
*/
|
|
271
|
+
get tables() {
|
|
272
|
+
return this.#tables;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* @returns {number}
|
|
277
|
+
*/
|
|
278
|
+
get resident_bytes() {
|
|
279
|
+
return this.#resident_bytes;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @returns {number}
|
|
284
|
+
*/
|
|
285
|
+
get budget_bytes() {
|
|
286
|
+
return this.#budget_bytes;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* The page size every container registered here is required to have been built at.
|
|
291
|
+
* @returns {number}
|
|
292
|
+
*/
|
|
293
|
+
get page_size() {
|
|
294
|
+
return this.#page_size;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* @returns {number}
|
|
299
|
+
*/
|
|
300
|
+
get page_slot_words() {
|
|
301
|
+
return this.#tables.slot_words;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* @returns {number}
|
|
306
|
+
*/
|
|
307
|
+
get resident_page_count() {
|
|
308
|
+
return this.#tables.resident_page_count;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* @returns {number}
|
|
313
|
+
*/
|
|
314
|
+
get evicted_page_count() {
|
|
315
|
+
return this.#evicted_page_count;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Installs that could not be made — no slot could be freed, or the page did not fit one.
|
|
320
|
+
* @returns {number}
|
|
321
|
+
*/
|
|
322
|
+
get refused_install_count() {
|
|
323
|
+
return this.#refused_install_count;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* @returns {number}
|
|
328
|
+
*/
|
|
329
|
+
get frame() {
|
|
330
|
+
return this.#frame;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* One past the highest page row handed out — what sizes the feedback buffer's touch stamps.
|
|
335
|
+
* @returns {number}
|
|
336
|
+
*/
|
|
337
|
+
get page_row_capacity() {
|
|
338
|
+
return Math.max(1, this.#tables.page_row_high_water);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* @returns {number}
|
|
343
|
+
*/
|
|
344
|
+
get lookup_word_count() {
|
|
345
|
+
return this.#tables.lookup_words.length;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Give a container a geometry row, and make its root page resident and pinned.
|
|
350
|
+
*
|
|
351
|
+
* The root is not an optimization: every traversal is seeded with it, invariant §11.7 puts
|
|
352
|
+
* exactly one root cluster in the file, and a measured root page is one cluster of under two
|
|
353
|
+
* kilobytes. A geometry whose root is not here draws nothing.
|
|
354
|
+
*
|
|
355
|
+
* This is also the door the page-size guarantee is checked at, because it is the last moment a
|
|
356
|
+
* refusal is still cheap: past it, this container's pages are laid into the tier's storage on
|
|
357
|
+
* the strength of the size it was built at. The two ways that can be wrong are refused rather
|
|
358
|
+
* than reconciled — deliberately, and naming both numbers, because reconciling them means a
|
|
359
|
+
* table of slot-size classes and that is a later change than this one.
|
|
360
|
+
*
|
|
361
|
+
* @param {VGeoContainerReader} reader with its root page installed
|
|
362
|
+
* @returns {number} geometry row
|
|
363
|
+
* @throws {Error} when the container does not guarantee its page size, guarantees a different
|
|
364
|
+
* one than this pool holds, or cannot get its root page onto the device
|
|
365
|
+
*/
|
|
366
|
+
register(reader) {
|
|
367
|
+
assert.defined(reader, 'reader');
|
|
368
|
+
assert.defined(reader.root, 'reader.root — the container must be open');
|
|
369
|
+
|
|
370
|
+
this.#require_page_size(reader);
|
|
371
|
+
|
|
372
|
+
if (this.#geometries.has(reader)) {
|
|
373
|
+
return this.#geometries.get(reader).row;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const row = this.#tables.register_geometry(reader.header.total_pages);
|
|
377
|
+
|
|
378
|
+
const geometry = new VGeoPoolGeometry(reader, row);
|
|
379
|
+
|
|
380
|
+
this.#geometries.set(reader, geometry);
|
|
381
|
+
|
|
382
|
+
this.#mark('geometries', row * VGEO_GEOMETRY_ROW_WORDS, VGEO_GEOMETRY_ROW_WORDS);
|
|
383
|
+
|
|
384
|
+
const page_row = this.install(reader, 0);
|
|
385
|
+
|
|
386
|
+
if (page_row === -1) {
|
|
387
|
+
/*
|
|
388
|
+
A thrown error rather than a stripped assert. `assert.*` is removed from the shipped
|
|
389
|
+
build by the consumer, so the check that used to stand here was a development-only
|
|
390
|
+
one — and what it was guarding is the seed kernel reading VGEO_PAGE_ROW_NONE out of the
|
|
391
|
+
geometry row as a u32 index and multiplying it into a live stat word (REVIEW_LEDGER
|
|
392
|
+
C7). The geometry is rolled back rather than left half-registered.
|
|
393
|
+
*/
|
|
394
|
+
this.#geometries.delete(reader);
|
|
395
|
+
|
|
396
|
+
this.#tables.unregister_geometry(row);
|
|
397
|
+
|
|
398
|
+
this.#mark('geometries', row * VGEO_GEOMETRY_ROW_WORDS, VGEO_GEOMETRY_ROW_WORDS);
|
|
399
|
+
|
|
400
|
+
throw new Error(
|
|
401
|
+
`virtual geometry: the root page of this container could not be made resident, so`
|
|
402
|
+
+ ` it would draw nothing and every cut seeded from it would read an absent row.`
|
|
403
|
+
+ ` The tier holds ${this.#tables.page_capacity} slots and`
|
|
404
|
+
+ ` ${this.#tables.resident_page_count} are taken, of a ${this.#budget_bytes}-byte`
|
|
405
|
+
+ ` budget with ${this.#resident_bytes} spent.`
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
this.#pinned.add(page_row);
|
|
410
|
+
|
|
411
|
+
return row;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Drop a container: its pages, its meshlet batches, its lookup and its row.
|
|
416
|
+
*
|
|
417
|
+
* A registered geometry pins a root page, holds a meshlet batch per resident page and a block
|
|
418
|
+
* of the page lookup, and none of it used to have a way out (REVIEW_LEDGER M15). A scene that
|
|
419
|
+
* swaps assets leaks every one of those.
|
|
420
|
+
*
|
|
421
|
+
* @param {VGeoContainerReader} reader
|
|
422
|
+
* @returns {boolean} whether it was registered
|
|
423
|
+
*/
|
|
424
|
+
unregister(reader) {
|
|
425
|
+
const geometry = this.#geometries.get(reader);
|
|
426
|
+
|
|
427
|
+
if (geometry === undefined) {
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
for (const page_row of geometry.rows.values()) {
|
|
432
|
+
this.#pinned.delete(page_row);
|
|
433
|
+
this.#unwatch_batch(page_row);
|
|
434
|
+
|
|
435
|
+
// before the eviction, which zeroes the slot header this number lives in
|
|
436
|
+
this.#resident_bytes -= this.#decoded_bytes_of(page_row);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
for (const batch of geometry.batches.values()) {
|
|
440
|
+
this.#meshlets.remove_batch(batch);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
geometry.batches.clear();
|
|
444
|
+
geometry.rows.clear();
|
|
445
|
+
|
|
446
|
+
for (const page_row of this.#tables.unregister_geometry(geometry.row)) {
|
|
447
|
+
this.#owner.delete(page_row);
|
|
448
|
+
this.#touched.delete(page_row);
|
|
449
|
+
|
|
450
|
+
this.#mark('arena', page_row * this.#tables.slot_words, VGEO_PAGE_ROW_WORDS);
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
this.#geometries.delete(reader);
|
|
454
|
+
|
|
455
|
+
this.#mark('lookup', 0, this.#tables.lookup_words.length);
|
|
456
|
+
this.#mark(
|
|
457
|
+
'geometries', geometry.row * VGEO_GEOMETRY_ROW_WORDS, VGEO_GEOMETRY_ROW_WORDS
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
return true;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Refuse a container this tier cannot hold at one page size.
|
|
465
|
+
*
|
|
466
|
+
* The bit is checked as well as the number, and it is the more important of the two. A container
|
|
467
|
+
* built before FORMAT §11.14 carries a `nominal_page_size` that reads exactly like a promise and
|
|
468
|
+
* is not one — the builder ran past it whenever a group did not fit a page, by up to 146% of it
|
|
469
|
+
* on a measured build — so taking the number on its own would size this tier against a figure
|
|
470
|
+
* some of its own pages exceed.
|
|
471
|
+
*
|
|
472
|
+
* @param {VGeoContainerReader} reader
|
|
473
|
+
*/
|
|
474
|
+
#require_page_size(reader) {
|
|
475
|
+
const header = reader.header;
|
|
476
|
+
|
|
477
|
+
if ((header.feature_flags_ignorable & VGEO_FEATURE_IGNORABLE_BOUNDED_PAGES) === 0) {
|
|
478
|
+
throw new Error(
|
|
479
|
+
`virtual geometry: this pool holds pages of ${this.#page_size} bytes, and this`
|
|
480
|
+
+ ` container makes no promise about its own. Its header names`
|
|
481
|
+
+ ` ${header.nominal_page_size} but the bounded-pages bit is clear, which means it`
|
|
482
|
+
+ ` was built before that size was a bound and its pages may be over it`
|
|
483
|
+
+ ` (VGEO_FORMAT §11.14). Rebuild the asset.`
|
|
484
|
+
);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
if (header.nominal_page_size !== this.#page_size) {
|
|
488
|
+
throw new Error(
|
|
489
|
+
`virtual geometry: this container's pages are bounded at`
|
|
490
|
+
+ ` ${header.nominal_page_size} bytes and this pool holds pages of`
|
|
491
|
+
+ ` ${this.#page_size}. There is no slot-size class table yet, so the two have to`
|
|
492
|
+
+ ` agree — build the asset at ${this.#page_size}, or give the pool a page_size of`
|
|
493
|
+
+ ` ${header.nominal_page_size}.`
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* @param {VGeoContainerReader} reader
|
|
500
|
+
* @returns {number} geometry row, or -1
|
|
501
|
+
*/
|
|
502
|
+
geometry_row_of(reader) {
|
|
503
|
+
return this.#geometries.get(reader)?.row ?? -1;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/**
|
|
507
|
+
* @param {VGeoContainerReader} reader
|
|
508
|
+
* @param {number} page_index
|
|
509
|
+
* @returns {boolean}
|
|
510
|
+
*/
|
|
511
|
+
is_resident(reader, page_index) {
|
|
512
|
+
return this.#geometries.get(reader)?.rows.has(page_index) ?? false;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Where this page's clusters actually are in the shared metadata pool, asked of the pool rather
|
|
517
|
+
* than of the page row — so a caller can check that the row agrees.
|
|
518
|
+
*
|
|
519
|
+
* @param {VGeoContainerReader} reader
|
|
520
|
+
* @param {number} page_index
|
|
521
|
+
* @returns {number} metadata row, or -1
|
|
522
|
+
*/
|
|
523
|
+
meshlet_base_of(reader, page_index) {
|
|
524
|
+
return this.#geometries.get(reader)?.batches.get(page_index)?.metadata.offset ?? -1;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Make a RAM-resident page VRAM-resident.
|
|
529
|
+
*
|
|
530
|
+
* @param {VGeoContainerReader} reader
|
|
531
|
+
* @param {number} page_index
|
|
532
|
+
* @returns {number} page row, or -1 when the tier could not make room
|
|
533
|
+
*/
|
|
534
|
+
install(reader, page_index) {
|
|
535
|
+
const geometry = this.#geometries.get(reader);
|
|
536
|
+
|
|
537
|
+
assert.defined(geometry, 'the reader must be registered first');
|
|
538
|
+
|
|
539
|
+
const existing = geometry.rows.get(page_index);
|
|
540
|
+
|
|
541
|
+
if (existing !== undefined) {
|
|
542
|
+
return existing;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const page = reader.page(page_index);
|
|
546
|
+
|
|
547
|
+
if (page === undefined) {
|
|
548
|
+
// not in RAM; a want that outran its fetch, which is ordinary and not an error
|
|
549
|
+
return -1;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
if (this.#tables.slot_words_for(page) > this.#tables.slot_words) {
|
|
553
|
+
// nothing to evict for: no slot in this tier is ever bigger than another
|
|
554
|
+
this.#refused_install_count++;
|
|
555
|
+
|
|
556
|
+
return -1;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
if (!this.#make_room(page.decoded_size)) {
|
|
560
|
+
this.#refused_install_count++;
|
|
561
|
+
|
|
562
|
+
return -1;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
const batch = this.#meshlets.add_batch(vgeo_runtime_meshlet_batch(page));
|
|
566
|
+
|
|
567
|
+
let page_row;
|
|
568
|
+
|
|
569
|
+
try {
|
|
570
|
+
page_row = this.#tables.install(geometry.row, page, batch.metadata.offset);
|
|
571
|
+
} catch (error) {
|
|
572
|
+
this.#meshlets.remove_batch(batch);
|
|
573
|
+
|
|
574
|
+
this.#refused_install_count++;
|
|
575
|
+
|
|
576
|
+
return -1;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
geometry.batches.set(page_index, batch);
|
|
580
|
+
geometry.rows.set(page_index, page_row);
|
|
581
|
+
|
|
582
|
+
this.#owner.set(page_row, geometry);
|
|
583
|
+
this.#touched.set(page_row, this.#frame);
|
|
584
|
+
this.#watch_batch(page_row, batch);
|
|
585
|
+
|
|
586
|
+
this.#resident_bytes += page.decoded_size;
|
|
587
|
+
|
|
588
|
+
this.#mark_slot(page_row);
|
|
589
|
+
this.#mark('lookup', this.#tables.geometry_field(
|
|
590
|
+
geometry.row, VGEO_GEOMETRY_ROW_OFFSET.LOOKUP_WORD_OFFSET
|
|
591
|
+
) + page_index, 1);
|
|
592
|
+
this.#mark('geometries', geometry.row * VGEO_GEOMETRY_ROW_WORDS, VGEO_GEOMETRY_ROW_WORDS);
|
|
593
|
+
|
|
594
|
+
/*
|
|
595
|
+
Activation reaches further than the page that arrived: a group becomes selectable when the
|
|
596
|
+
last of its parents' pages installs, and those parents can be anywhere already resident. So
|
|
597
|
+
the whole geometry's answer is recomputed rather than just this page's.
|
|
598
|
+
*/
|
|
599
|
+
this.#refresh_selectable(geometry);
|
|
600
|
+
|
|
601
|
+
return page_row;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* @param {number} page_row
|
|
606
|
+
* @returns {boolean}
|
|
607
|
+
*/
|
|
608
|
+
evict(page_row) {
|
|
609
|
+
if (this.#pinned.has(page_row)) {
|
|
610
|
+
return false;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
const geometry = this.#owner.get(page_row);
|
|
614
|
+
|
|
615
|
+
if (geometry === undefined) {
|
|
616
|
+
return false;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
const page_index = this.#tables.page_field(page_row, VGEO_PAGE_ROW_OFFSET.PAGE_INDEX);
|
|
620
|
+
|
|
621
|
+
const lookup_word = this.#tables.geometry_field(
|
|
622
|
+
geometry.row, VGEO_GEOMETRY_ROW_OFFSET.LOOKUP_WORD_OFFSET
|
|
623
|
+
) + page_index;
|
|
624
|
+
|
|
625
|
+
/*
|
|
626
|
+
The tier's own number, out of the slot. Re-deriving it from the RAM reader gave zero for
|
|
627
|
+
every page the RAM tier had already dropped, so `resident_bytes` only ever went up and the
|
|
628
|
+
budget eventually refused every install (REVIEW_LEDGER C4).
|
|
629
|
+
*/
|
|
630
|
+
this.#resident_bytes -= this.#decoded_bytes_of(page_row);
|
|
631
|
+
|
|
632
|
+
this.#unwatch_batch(page_row);
|
|
633
|
+
|
|
634
|
+
this.#tables.evict(page_row);
|
|
635
|
+
|
|
636
|
+
this.#meshlets.remove_batch(geometry.batches.get(page_index));
|
|
637
|
+
|
|
638
|
+
geometry.batches.delete(page_index);
|
|
639
|
+
geometry.rows.delete(page_index);
|
|
640
|
+
|
|
641
|
+
this.#owner.delete(page_row);
|
|
642
|
+
this.#touched.delete(page_row);
|
|
643
|
+
|
|
644
|
+
this.#evicted_page_count++;
|
|
645
|
+
|
|
646
|
+
this.#mark_slot(page_row);
|
|
647
|
+
this.#mark('lookup', lookup_word, 1);
|
|
648
|
+
|
|
649
|
+
this.#refresh_selectable(geometry);
|
|
650
|
+
|
|
651
|
+
return true;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/**
|
|
655
|
+
* Which geometry owns a page row, and therefore which reader answers questions about it.
|
|
656
|
+
*
|
|
657
|
+
* A page row is the only handle the feedback loop gets back from the device — a touch is a row
|
|
658
|
+
* and a want names the row it was discovered through — so this is how a readback lands back on
|
|
659
|
+
* a container. It returns `undefined` for a row that has been evicted since the cut ran, which
|
|
660
|
+
* is ordinary rather than exceptional: feedback is at least a frame behind by construction.
|
|
661
|
+
*
|
|
662
|
+
* A row that has been evicted *and re-used* is the harder case, and it is not this method's:
|
|
663
|
+
* the caller compares {@link VGeoRuntimeTables.generation_of} against the generation it
|
|
664
|
+
* snapshotted when it built the graph.
|
|
665
|
+
*
|
|
666
|
+
* @param {number} page_row
|
|
667
|
+
* @returns {{reader: VGeoContainerReader, row: number}|undefined}
|
|
668
|
+
*/
|
|
669
|
+
entry_of(page_row) {
|
|
670
|
+
return this.#owner.get(page_row);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
/**
|
|
674
|
+
* A page the cut reported drawing from, this frame.
|
|
675
|
+
*
|
|
676
|
+
* @param {number} page_row
|
|
677
|
+
* @returns {void}
|
|
678
|
+
*/
|
|
679
|
+
touch(page_row) {
|
|
680
|
+
if (this.#owner.has(page_row)) {
|
|
681
|
+
this.#touched.set(page_row, this.#frame);
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
* @returns {void}
|
|
687
|
+
*/
|
|
688
|
+
advance_frame() {
|
|
689
|
+
this.#frame++;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/**
|
|
693
|
+
* Whether a page may go: not pinned, not touched inside the protect window, and with no VRAM
|
|
694
|
+
* child.
|
|
695
|
+
*
|
|
696
|
+
* The child rule is this tier's own, out of this tier's tables. Dropping a parent while its
|
|
697
|
+
* children stay leaves those children unreachable — nothing refines into them any more — so
|
|
698
|
+
* they would sit in VRAM, selectable, and never drawn.
|
|
699
|
+
*
|
|
700
|
+
* @param {number} page_row
|
|
701
|
+
* @returns {boolean}
|
|
702
|
+
*/
|
|
703
|
+
evictable(page_row) {
|
|
704
|
+
if (this.#pinned.has(page_row)) {
|
|
705
|
+
return false;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
if (!this.#owner.has(page_row)) {
|
|
709
|
+
return false;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
if (this.#frame - (this.#touched.get(page_row) ?? 0) < this.#protect_window) {
|
|
713
|
+
return false;
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
return !this.#tables.has_resident_child(page_row);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/**
|
|
720
|
+
* Drop coldest-first until a slot is free and `bytes` fit.
|
|
721
|
+
*
|
|
722
|
+
* Both budgets bind. Slots are fixed and finite now, so a full table is a reason to evict in its
|
|
723
|
+
* own right — where it used to be a permanent cliff independent of the byte budget
|
|
724
|
+
* (REVIEW_LEDGER M17).
|
|
725
|
+
*
|
|
726
|
+
* @param {number} bytes
|
|
727
|
+
* @returns {boolean}
|
|
728
|
+
*/
|
|
729
|
+
#make_room(bytes) {
|
|
730
|
+
let guard = this.#tables.resident_page_count + 1;
|
|
731
|
+
|
|
732
|
+
while (guard-- > 0) {
|
|
733
|
+
const short = this.#resident_bytes + bytes > this.#budget_bytes
|
|
734
|
+
|| !this.#tables.has_free_page_row;
|
|
735
|
+
|
|
736
|
+
if (!short) {
|
|
737
|
+
return true;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
const coldest = this.#coldest();
|
|
741
|
+
|
|
742
|
+
if (coldest === -1) {
|
|
743
|
+
// nothing may go — every page is pinned, hot, or a parent. Refusing the install is
|
|
744
|
+
// the right answer: the cut clamps and draws coarser, which is what it is for.
|
|
745
|
+
return false;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
this.evict(coldest);
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
return this.#resident_bytes + bytes <= this.#budget_bytes
|
|
752
|
+
&& this.#tables.has_free_page_row;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
/**
|
|
756
|
+
* @returns {number} page row, or -1
|
|
757
|
+
*/
|
|
758
|
+
#coldest() {
|
|
759
|
+
let best = -1;
|
|
760
|
+
let best_stamp = Number.POSITIVE_INFINITY;
|
|
761
|
+
|
|
762
|
+
for (const [page_row, stamp] of this.#touched) {
|
|
763
|
+
if (stamp >= best_stamp || !this.evictable(page_row)) {
|
|
764
|
+
continue;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
best = page_row;
|
|
768
|
+
best_stamp = stamp;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
return best;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
/**
|
|
775
|
+
* @param {number} page_row
|
|
776
|
+
* @returns {number}
|
|
777
|
+
*/
|
|
778
|
+
#decoded_bytes_of(page_row) {
|
|
779
|
+
return this.#tables.page_field(page_row, VGEO_PAGE_ROW_OFFSET.DECODED_SIZE);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Follow a page's meshlet batch when the shared pool moves it.
|
|
784
|
+
*
|
|
785
|
+
* `MESHLET_BASE` is the metadata row a draw record is offset from, and `GPUMeshletManager`
|
|
786
|
+
* relocates every batch when it compacts — after which a page row that cached its base points
|
|
787
|
+
* at another page's clusters, silently (REVIEW_LEDGER C2). The manager announces the move and
|
|
788
|
+
* nothing here was listening.
|
|
789
|
+
*
|
|
790
|
+
* @param {number} page_row
|
|
791
|
+
* @param {object} batch
|
|
792
|
+
*/
|
|
793
|
+
#watch_batch(page_row, batch) {
|
|
794
|
+
const listener = () => {
|
|
795
|
+
if (this.#tables.set_meshlet_base(page_row, batch.metadata.offset)) {
|
|
796
|
+
this.#mark(
|
|
797
|
+
'arena',
|
|
798
|
+
page_row * this.#tables.slot_words + VGEO_PAGE_ROW_OFFSET.MESHLET_BASE,
|
|
799
|
+
1
|
|
800
|
+
);
|
|
801
|
+
}
|
|
802
|
+
};
|
|
803
|
+
|
|
804
|
+
batch.changed.add(listener);
|
|
805
|
+
|
|
806
|
+
this.#batch_listeners.set(page_row, () => batch.changed.remove(listener));
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
/**
|
|
810
|
+
* @param {number} page_row
|
|
811
|
+
*/
|
|
812
|
+
#unwatch_batch(page_row) {
|
|
813
|
+
this.#batch_listeners.get(page_row)?.();
|
|
814
|
+
|
|
815
|
+
this.#batch_listeners.delete(page_row);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
/**
|
|
819
|
+
* @param {VGeoPoolGeometry} geometry
|
|
820
|
+
*/
|
|
821
|
+
#refresh_selectable(geometry) {
|
|
822
|
+
for (const page_row of this.#tables.refresh_selectable(geometry.row)) {
|
|
823
|
+
const [start, count] = this.#tables.group_range(page_row);
|
|
824
|
+
|
|
825
|
+
this.#mark('arena', start, count);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
/**
|
|
830
|
+
* @param {number} page_row
|
|
831
|
+
*/
|
|
832
|
+
#mark_slot(page_row) {
|
|
833
|
+
const [start, count] = this.#tables.slot_range(page_row);
|
|
834
|
+
|
|
835
|
+
this.#mark('arena', start, Math.max(count, VGEO_PAGE_ROW_OFFSET.DECODED_SIZE + 1));
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
/**
|
|
839
|
+
* @param {'lookup'|'arena'|'geometries'} which
|
|
840
|
+
* @param {number} start word
|
|
841
|
+
* @param {number} count words
|
|
842
|
+
*/
|
|
843
|
+
#mark(which, start, count) {
|
|
844
|
+
this.#dirty[which].push(start, start + count);
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
* Push everything that changed since the last call to the device.
|
|
849
|
+
*
|
|
850
|
+
* Ranges rather than whole buffers, because the arena is the size of the resident set and a
|
|
851
|
+
* frame changes a page or two of it. Coalesced by sorting rather than by an interval tree: a
|
|
852
|
+
* frame's worth of installs is tens of ranges, and a structure that beat a sort at that size
|
|
853
|
+
* would be a structure to maintain.
|
|
854
|
+
*
|
|
855
|
+
* @returns {void}
|
|
856
|
+
*/
|
|
857
|
+
flush() {
|
|
858
|
+
this.#write('lookup', this.#tables.lookup_words, this.#buffers.lookup);
|
|
859
|
+
this.#write('arena', this.#tables.arena_words, this.#buffers.arena);
|
|
860
|
+
this.#write('geometries', this.#tables.geometry_words, this.#buffers.geometries);
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
/**
|
|
864
|
+
* @param {'lookup'|'arena'|'geometries'} which
|
|
865
|
+
* @param {Uint32Array} shadow
|
|
866
|
+
* @param {GPUBuffer} buffer
|
|
867
|
+
*/
|
|
868
|
+
#write(which, shadow, buffer) {
|
|
869
|
+
const ranges = this.#dirty[which];
|
|
870
|
+
|
|
871
|
+
if (ranges.length === 0) {
|
|
872
|
+
return;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
/**
|
|
876
|
+
* @type {number[][]}
|
|
877
|
+
*/
|
|
878
|
+
const pairs = [];
|
|
879
|
+
|
|
880
|
+
for (let i = 0; i < ranges.length; i += 2) {
|
|
881
|
+
pairs.push([ranges[i], ranges[i + 1]]);
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
pairs.sort((a, b) => a[0] - b[0]);
|
|
885
|
+
|
|
886
|
+
let start = pairs[0][0];
|
|
887
|
+
let end = pairs[0][1];
|
|
888
|
+
|
|
889
|
+
for (let i = 1; i <= pairs.length; i++) {
|
|
890
|
+
if (i < pairs.length && pairs[i][0] <= end) {
|
|
891
|
+
end = Math.max(end, pairs[i][1]);
|
|
892
|
+
|
|
893
|
+
continue;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
const clamped = Math.min(end, shadow.length);
|
|
897
|
+
|
|
898
|
+
if (clamped > start) {
|
|
899
|
+
this.#device.queue.writeBuffer(
|
|
900
|
+
buffer,
|
|
901
|
+
start * 4,
|
|
902
|
+
shadow.buffer,
|
|
903
|
+
shadow.byteOffset + start * 4,
|
|
904
|
+
(clamped - start) * 4
|
|
905
|
+
);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
if (i < pairs.length) {
|
|
909
|
+
start = pairs[i][0];
|
|
910
|
+
end = pairs[i][1];
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
ranges.length = 0;
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
destroy() {
|
|
918
|
+
for (const unwatch of this.#batch_listeners.values()) {
|
|
919
|
+
unwatch();
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
this.#batch_listeners.clear();
|
|
923
|
+
|
|
924
|
+
for (const reader of Array.from(this.#geometries.keys())) {
|
|
925
|
+
this.unregister(reader);
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
for (const buffer of Object.values(this.#buffers)) {
|
|
929
|
+
buffer.destroy();
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
}
|