@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
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { GPUVirtualGeometryPool } from "../geometry/virtual/runtime/GPUVirtualGeometryPool.js";
|
|
2
|
+
import { GPUVirtualGeometryRuntime } from "../geometry/virtual/runtime/GPUVirtualGeometryRuntime.js";
|
|
1
3
|
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import { typed_array_copy } from "../../../core/collection/array/typed/typed_array_copy.js";
|
|
3
4
|
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
4
5
|
import { GPUAnimationManager } from "../animation/GPUAnimationManager.js";
|
|
5
6
|
import { GPUDatabase } from "../buffer/table/GPUDatabase.js";
|
|
@@ -10,63 +11,64 @@ import { GPUSceneVolumetrics } from "../volumetrics/GPUSceneVolumetrics.js";
|
|
|
10
11
|
import { Scene } from "./Scene.js";
|
|
11
12
|
import { GPUInstancesAccelerationStructure } from "./GPUInstancesAccelerationStructure.js";
|
|
12
13
|
import { GPUMeshSkinningContext } from "../animation/skinning/GPUMeshSkinningContext.js";
|
|
13
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
shader_refresh_all_mesh_bounds,
|
|
16
|
+
WORKGROUP_SIZE as REFRESH_ALL_MESH_BOUNDS_WORKGROUP_SIZE
|
|
17
|
+
} from "../object_property/shader_refresh_all_mesh_bounds.js";
|
|
18
|
+
import { GPUEntityBoundsReadback } from "./rows/GPUEntityBoundsReadback.js";
|
|
19
|
+
import { GPUSceneRows } from "./rows/GPUSceneRows.js";
|
|
20
|
+
import { generate_record_writer } from "../buffer/table/serde/generate_record_writer.js";
|
|
21
|
+
import { NODE3D_SCENE_ID, NODE3D_STRUCT } from "./NODE3D_STRUCT.js";
|
|
14
22
|
import { SCENE_DATABASE_SPEC } from "./SCENE_DATABASE_SPEC.js";
|
|
15
|
-
import { SceneNodeBinding } from "./SceneNodeBinding.js";
|
|
16
|
-
import { TransformAuthority } from "./TransformAuthority.js";
|
|
17
23
|
|
|
18
24
|
/**
|
|
19
25
|
* @typedef {import("../GraphicsContext.js").GraphicsContext} GraphicsContext
|
|
20
26
|
* @typedef {import("../geometry/GPUGeometryManager.js").GPUGeometryManager} GPUGeometryManager
|
|
21
27
|
* @typedef {import("../material/GPUMaterialManager.js").GPUMaterialManager} GPUMaterialManager
|
|
22
|
-
* @typedef {import("
|
|
28
|
+
* @typedef {import("../material/ShadeMaterial.js").ShadeMaterial} ShadeMaterial
|
|
29
|
+
* @typedef {import("../buffer/table/serde/generate_record_writer.js").GPURecordWriter} GPURecordWriter
|
|
23
30
|
*/
|
|
24
31
|
|
|
25
32
|
|
|
26
33
|
let id_counter = 0;
|
|
27
34
|
|
|
28
35
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
36
|
+
* Row 0 of the `transforms` table: the scene root. Identity, and its own parent — which is what the
|
|
37
|
+
* hierarchy pass takes as "no further ancestor" — so an entity whose attachment names no entity
|
|
38
|
+
* with a row is posed under it in world space, and the composition is exact. Written once, at the
|
|
39
|
+
* first {@link GPUSceneContext.build}, so it goes up with the first rows rather than being left to
|
|
40
|
+
* whatever the buffer held.
|
|
31
41
|
*/
|
|
32
|
-
const
|
|
33
|
-
local_translation: new Float32Array(
|
|
34
|
-
local_rotation: new Float32Array(
|
|
35
|
-
local_scale: new Float32Array(
|
|
36
|
-
global: new Float32Array(
|
|
37
|
-
prev_global: new Float32Array(
|
|
42
|
+
const ROOT_RECORD = {
|
|
43
|
+
local_translation: new Float32Array([0, 0, 0]),
|
|
44
|
+
local_rotation: new Float32Array([0, 0, 0, 1]),
|
|
45
|
+
local_scale: new Float32Array([1, 1, 1]),
|
|
46
|
+
global: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
|
|
47
|
+
prev_global: new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
|
|
38
48
|
parent: NODE3D_SCENE_ID,
|
|
39
49
|
};
|
|
40
50
|
|
|
41
51
|
/**
|
|
42
|
-
*
|
|
43
|
-
* the row, and the record has to name it. Overwritten in the same breath, and the table's upload
|
|
44
|
-
* de-duplication collapses the pair into a single record.
|
|
52
|
+
* @type {GPURecordWriter}
|
|
45
53
|
*/
|
|
46
|
-
const
|
|
47
|
-
local_translation: new Float32Array(3),
|
|
48
|
-
local_rotation: new Float32Array(4),
|
|
49
|
-
local_scale: new Float32Array(3),
|
|
50
|
-
global: new Float32Array(16),
|
|
51
|
-
prev_global: new Float32Array(16),
|
|
52
|
-
parent: NODE3D_SCENE_ID,
|
|
53
|
-
};
|
|
54
|
+
const ROOT_RECORD_WRITER = generate_record_writer(NODE3D_STRUCT);
|
|
54
55
|
|
|
55
56
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
57
|
+
* What a scene with no rows draws with.
|
|
58
|
+
*
|
|
59
|
+
* @type {ShadeMaterial[]}
|
|
59
60
|
*/
|
|
60
|
-
const
|
|
61
|
-
geometry: 0,
|
|
62
|
-
material: 0,
|
|
63
|
-
node: NODE3D_SCENE_ID,
|
|
64
|
-
bounding_box: undefined,
|
|
65
|
-
bounding_sphere: undefined,
|
|
66
|
-
};
|
|
61
|
+
const NO_MATERIALS = Object.freeze([]);
|
|
67
62
|
|
|
68
63
|
/**
|
|
69
|
-
*
|
|
64
|
+
* The GPU side of one {@link Scene}: its database — the `transforms` and `meshes` tables, one row
|
|
65
|
+
* per entity that is drawn or posed, at `entity + 1` — and what is built over that database each
|
|
66
|
+
* frame: the lights' records, the probe volume, the volumetrics, the animation, the TLAS.
|
|
67
|
+
*
|
|
68
|
+
* Nothing here holds a hierarchy of its own. An entity's row names its parent's row and the GPU
|
|
69
|
+
* composes the chain each frame, derives every mesh row's bounds under the composed matrix and
|
|
70
|
+
* builds the tree over them — see {@link tick}. What the CPU writes is what it owns: an entity's
|
|
71
|
+
* local TRS and the row of its parent, through {@link rows}.
|
|
70
72
|
*/
|
|
71
73
|
export class GPUSceneContext {
|
|
72
74
|
|
|
@@ -158,37 +160,29 @@ export class GPUSceneContext {
|
|
|
158
160
|
|
|
159
161
|
/**
|
|
160
162
|
* GPU-resident scene database — mesh metadata in the `meshes` table,
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* `
|
|
163
|
+
* transforms in the `transforms` table, one row per entity in each.
|
|
164
|
+
* Consumers bind `scene_database.buffer` as `array<u32>` and read
|
|
165
|
+
* records via `scene_read_mesh` / `scene_read_node` (see
|
|
166
|
+
* `chunk_scene_database_access`).
|
|
165
167
|
*
|
|
166
168
|
* @type {GPUDatabase}
|
|
167
169
|
*/
|
|
168
170
|
#scene_database;
|
|
169
171
|
|
|
170
172
|
/**
|
|
173
|
+
* Entities as rows of {@link scene_database} — see {@link rows}. Built the first time it is
|
|
174
|
+
* asked for, which needs the scene to name its dataset by then.
|
|
171
175
|
*
|
|
172
|
-
* @type {
|
|
176
|
+
* @type {GPUSceneRows|null}
|
|
173
177
|
*/
|
|
174
|
-
#
|
|
178
|
+
#rows = null;
|
|
175
179
|
|
|
176
180
|
/**
|
|
177
|
-
*
|
|
178
|
-
* Lookup from a node's stable JS-side {@link Node3D.id} to its row
|
|
179
|
-
* in the scene database's `transforms` table. Built during
|
|
180
|
-
* {@link build} as each node is allocated via
|
|
181
|
-
* {@link GPUTypedTable.add}; the table itself owns the row
|
|
182
|
-
* allocation, this map just bridges between Node3D handles and the
|
|
183
|
-
* GPU rows they live at.
|
|
184
|
-
*
|
|
185
|
-
* Public so external code can do partial updates: looking up a
|
|
186
|
-
* single node's row lets a system patch one `transforms_table`
|
|
187
|
-
* entry instead of re-uploading the whole scene.
|
|
181
|
+
* Whether {@link ROOT_RECORD} has been written to row 0 — once, at the first build.
|
|
188
182
|
*
|
|
189
|
-
* @type {
|
|
183
|
+
* @type {boolean}
|
|
190
184
|
*/
|
|
191
|
-
|
|
185
|
+
#root_written = false;
|
|
192
186
|
|
|
193
187
|
/**
|
|
194
188
|
* Per-scene skinning state — clone-index cache today, plus
|
|
@@ -252,6 +246,57 @@ export class GPUSceneContext {
|
|
|
252
246
|
this.#animation_manager = new GPUAnimationManager(device, `GPUSceneContext[${this.id}]/Animation`, this);
|
|
253
247
|
}
|
|
254
248
|
|
|
249
|
+
/**
|
|
250
|
+
* The virtual-geometry runtime, once something has asked for one.
|
|
251
|
+
*
|
|
252
|
+
* `undefined` until {@link enable_virtual_geometry}, and every rasterization path treats that
|
|
253
|
+
* as "there is no virtual geometry in this scene" and skips the cut entirely. Opt-in rather
|
|
254
|
+
* than always-on because the pool owns real buffers — a page arena, a page table, a per-asset
|
|
255
|
+
* lookup — and a scene of ordinary meshes should not pay for them.
|
|
256
|
+
*
|
|
257
|
+
* @type {GPUVirtualGeometryRuntime|undefined}
|
|
258
|
+
*/
|
|
259
|
+
#virtual_geometry;
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* @returns {GPUVirtualGeometryRuntime|undefined}
|
|
263
|
+
*/
|
|
264
|
+
get virtual_geometry() {
|
|
265
|
+
return this.#virtual_geometry;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Give this scene a virtual-geometry runtime, sharing the meshlet pool with everything else it
|
|
270
|
+
* draws.
|
|
271
|
+
*
|
|
272
|
+
* Sharing the pool is the whole seam on this side: a cut emits `MESHLET_DEFINITION_STRUCT`
|
|
273
|
+
* records naming rows of the same metadata buffer a static mesh's meshlets live in, so nothing
|
|
274
|
+
* downstream of the expansion has to know which kind of geometry it is looking at.
|
|
275
|
+
*
|
|
276
|
+
* @param {Object} [options] passed to {@link GPUVirtualGeometryPool} and
|
|
277
|
+
* {@link GPUVirtualGeometryRuntime}
|
|
278
|
+
* @returns {GPUVirtualGeometryRuntime}
|
|
279
|
+
*/
|
|
280
|
+
enable_virtual_geometry(options = {}) {
|
|
281
|
+
if (this.#virtual_geometry !== undefined) {
|
|
282
|
+
return this.#virtual_geometry;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const pool = new GPUVirtualGeometryPool({
|
|
286
|
+
device: this.#device,
|
|
287
|
+
meshlets: this.geometries.meshlets,
|
|
288
|
+
...options,
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
this.#virtual_geometry = new GPUVirtualGeometryRuntime({
|
|
292
|
+
pool,
|
|
293
|
+
device: this.#device,
|
|
294
|
+
...options,
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
return this.#virtual_geometry;
|
|
298
|
+
}
|
|
299
|
+
|
|
255
300
|
/**
|
|
256
301
|
* @returns {GPUAnimationManager}
|
|
257
302
|
*/
|
|
@@ -259,9 +304,6 @@ export class GPUSceneContext {
|
|
|
259
304
|
return this.#animation_manager;
|
|
260
305
|
}
|
|
261
306
|
|
|
262
|
-
#instances_version = -1;
|
|
263
|
-
|
|
264
|
-
|
|
265
307
|
/**
|
|
266
308
|
* @type {GPUDevice}
|
|
267
309
|
*/
|
|
@@ -291,10 +333,9 @@ export class GPUSceneContext {
|
|
|
291
333
|
}
|
|
292
334
|
|
|
293
335
|
/**
|
|
294
|
-
* Per-scene skinning subsystem. Routes
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
* onto it.
|
|
336
|
+
* Per-scene skinning subsystem. Routes skinned rows through
|
|
337
|
+
* per-instance geometry clones; later phases grow Skin-binding
|
|
338
|
+
* management and the per-frame skinning compute onto it.
|
|
298
339
|
*
|
|
299
340
|
* Lazy because it depends on {@link geometries}, which is assigned
|
|
300
341
|
* externally after this object's constructor returns
|
|
@@ -328,495 +369,106 @@ export class GPUSceneContext {
|
|
|
328
369
|
}
|
|
329
370
|
|
|
330
371
|
/**
|
|
331
|
-
*
|
|
332
|
-
* table that has held N rows can hand any of them out again.
|
|
372
|
+
* Entities as rows of the scene database, at `entity + 1` in both tables.
|
|
333
373
|
*
|
|
334
|
-
*
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
if (this.#instance_metadata.length >= required) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
const previous = this.#instance_metadata;
|
|
344
|
-
|
|
345
|
-
this.#instance_metadata = new Uint32Array(required);
|
|
346
|
-
|
|
347
|
-
typed_array_copy(previous, this.#instance_metadata);
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
/**
|
|
351
|
-
* World matrix last published for each `transforms` row, 16 floats at `row * 16`.
|
|
352
|
-
*
|
|
353
|
-
* The GPU hierarchy pass takes whatever is in a row's `global` at the start of the frame and
|
|
354
|
-
* moves it to `prev_global` before composing the new one, so what the CPU puts in `global` is
|
|
355
|
-
* only ever read as *last* frame's world matrix. Handing it the current one collapses the
|
|
356
|
-
* per-object velocity that motion vectors are derived from, which is why this cache exists
|
|
357
|
-
* rather than reading `node.transform_global` twice.
|
|
358
|
-
*
|
|
359
|
-
* @type {Float32Array}
|
|
360
|
-
*/
|
|
361
|
-
#published_globals = new Float32Array();
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* Rows this context owns, by node. Also the answer to "is this node already in the database".
|
|
365
|
-
*
|
|
366
|
-
* @type {Map<Node3D, SceneNodeBinding>}
|
|
367
|
-
*/
|
|
368
|
-
#bindings = new Map();
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* @type {number}
|
|
372
|
-
*/
|
|
373
|
-
#epoch = 0;
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* @param {number} row
|
|
377
|
-
*/
|
|
378
|
-
#reserve_published_global(row) {
|
|
379
|
-
const required = (row + 1) * 16;
|
|
380
|
-
|
|
381
|
-
if (this.#published_globals.length >= required) {
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
const grown = new Float32Array(Math.max(required, this.#published_globals.length * 2));
|
|
386
|
-
|
|
387
|
-
typed_array_copy(this.#published_globals, grown);
|
|
388
|
-
|
|
389
|
-
this.#published_globals = grown;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
/**
|
|
393
|
-
* Fill the shared record with `node`'s local TRS, the parent row, and the world matrix last
|
|
394
|
-
* published for `row` — see {@link #published_globals} for why that is the previous one and not
|
|
395
|
-
* the current one. Leaves `#published_globals` holding the node's current world matrix.
|
|
374
|
+
* A system that places an entity acquires its row here and marks it on the dataset's change
|
|
375
|
+
* events; a scene with no systems places through `prefab_place` and `place_primitive`, which
|
|
376
|
+
* do the same by hand; and {@link build} flushes what was marked. The scene has to name its
|
|
377
|
+
* dataset ({@link Scene.dataset}) before this is first asked for, because the rows are written
|
|
378
|
+
* from that dataset's components.
|
|
396
379
|
*
|
|
397
|
-
* @
|
|
398
|
-
* @param {number} row
|
|
399
|
-
* @param {number} parent_row
|
|
400
|
-
* @returns {object} the module-static record, valid until the next call
|
|
380
|
+
* @returns {GPUSceneRows}
|
|
401
381
|
*/
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
// live views, freshly allocated on every access, and this runs once per changed row per frame
|
|
405
|
-
const tl = node.transform_local;
|
|
406
|
-
|
|
407
|
-
TRANSFORM_RECORD.local_translation[0] = tl.translation_x;
|
|
408
|
-
TRANSFORM_RECORD.local_translation[1] = tl.translation_y;
|
|
409
|
-
TRANSFORM_RECORD.local_translation[2] = tl.translation_z;
|
|
410
|
-
|
|
411
|
-
TRANSFORM_RECORD.local_rotation[0] = tl.rotation_x;
|
|
412
|
-
TRANSFORM_RECORD.local_rotation[1] = tl.rotation_y;
|
|
413
|
-
TRANSFORM_RECORD.local_rotation[2] = tl.rotation_z;
|
|
414
|
-
TRANSFORM_RECORD.local_rotation[3] = tl.rotation_w;
|
|
415
|
-
|
|
416
|
-
TRANSFORM_RECORD.local_scale[0] = tl.scale_x;
|
|
417
|
-
TRANSFORM_RECORD.local_scale[1] = tl.scale_y;
|
|
418
|
-
TRANSFORM_RECORD.local_scale[2] = tl.scale_z;
|
|
419
|
-
|
|
420
|
-
this.#reserve_published_global(row);
|
|
421
|
-
|
|
422
|
-
const published = this.#published_globals;
|
|
423
|
-
const base = row * 16;
|
|
424
|
-
|
|
425
|
-
for (let i = 0; i < 16; i++) {
|
|
426
|
-
const previous = published[base + i];
|
|
427
|
-
|
|
428
|
-
TRANSFORM_RECORD.global[i] = previous;
|
|
429
|
-
TRANSFORM_RECORD.prev_global[i] = previous;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
const current = node.transform_global;
|
|
433
|
-
|
|
434
|
-
for (let i = 0; i < 16; i++) {
|
|
435
|
-
published[base + i] = current[i];
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
TRANSFORM_RECORD.parent = parent_row;
|
|
439
|
-
|
|
440
|
-
return TRANSFORM_RECORD;
|
|
382
|
+
get rows() {
|
|
383
|
+
return this.#obtain_rows();
|
|
441
384
|
}
|
|
442
385
|
|
|
443
386
|
/**
|
|
444
|
-
*
|
|
445
|
-
*
|
|
387
|
+
* An entity's world bounds as the GPU holds them, read back — what a consumer that wants the
|
|
388
|
+
* box that is drawn asks, a frame or two behind the device. Built on demand, over the rows.
|
|
446
389
|
*
|
|
447
|
-
* @
|
|
448
|
-
* @param {number} row
|
|
390
|
+
* @returns {GPUEntityBoundsReadback}
|
|
449
391
|
*/
|
|
450
|
-
|
|
451
|
-
this.#
|
|
452
|
-
|
|
453
|
-
const current = node.transform_global;
|
|
454
|
-
const base = row * 16;
|
|
455
|
-
|
|
456
|
-
for (let i = 0; i < 16; i++) {
|
|
457
|
-
this.#published_globals[base + i] = current[i];
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
/**
|
|
462
|
-
* @param {Mesh} mesh
|
|
463
|
-
* @param {number} transform_row
|
|
464
|
-
* @returns {object} the module-static record, valid until the next call
|
|
465
|
-
*/
|
|
466
|
-
#write_mesh_record(mesh, transform_row) {
|
|
467
|
-
// A skinned mesh's world bounds are a property of its *skeleton*, and the skeleton is not
|
|
468
|
-
// in the mesh's own subtree — Michelle's joint root is the mesh node's next sibling, which
|
|
469
|
-
// is the shape every glTF character has. `Node3D.updateMatrices` walks pre-order, so when
|
|
470
|
-
// the mesh's own bounds pass ran the joints it reads had not been visited yet and it
|
|
471
|
-
// described where the character stood before the move; a second walk would catch up, and
|
|
472
|
-
// nothing calls one. Re-deriving here costs a matrix per joint on a mesh that just moved,
|
|
473
|
-
// and here every walk is over — which is the only point at which the answer is knowable.
|
|
474
|
-
if (mesh.isSkinnedMesh === true) {
|
|
475
|
-
mesh.updateBoundsBasic();
|
|
392
|
+
get bounds() {
|
|
393
|
+
if (this.#bounds === null) {
|
|
394
|
+
this.#bounds = new GPUEntityBoundsReadback(this.#scene_database.readback, this.rows);
|
|
476
395
|
}
|
|
477
396
|
|
|
478
|
-
|
|
479
|
-
// context); regular meshes get the source's id. obtain_geometry_index handles both,
|
|
480
|
-
// idempotent.
|
|
481
|
-
MESH_RECORD.geometry = this.skinning.obtain_geometry_index(mesh);
|
|
482
|
-
MESH_RECORD.material = mesh.material.id;
|
|
483
|
-
MESH_RECORD.node = transform_row;
|
|
484
|
-
MESH_RECORD.bounding_box = mesh.bounding_box;
|
|
485
|
-
MESH_RECORD.bounding_sphere = mesh.bounding_sphere;
|
|
486
|
-
|
|
487
|
-
return MESH_RECORD;
|
|
397
|
+
return this.#bounds;
|
|
488
398
|
}
|
|
489
399
|
|
|
490
400
|
/**
|
|
491
|
-
*
|
|
492
|
-
* for every pixel that node covers**, which is what makes it worth reading from outside.
|
|
493
|
-
*
|
|
494
|
-
* `id_mapping` is not this. That map goes from a node's id to its row in the `transforms`
|
|
495
|
-
* table, which is a different table with different rows; a caller that used it to index the
|
|
496
|
-
* visibility buffer would be reading somebody else's mesh.
|
|
497
|
-
*
|
|
498
|
-
* @param {Node3D} node
|
|
499
|
-
* @returns {number} the row, or `-1` for a node that is not in this scene or carries no geometry
|
|
500
|
-
*/
|
|
501
|
-
mesh_row_of(node) {
|
|
502
|
-
const binding = this.#bindings.get(node);
|
|
503
|
-
|
|
504
|
-
return binding === undefined ? -1 : binding.mesh_row;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
/**
|
|
508
|
-
* Bumped every time the `meshes` table gains or loses a row. **Rows are reused** — the table
|
|
509
|
-
* hands out the lowest free one — so a row read through {@link mesh_row_of} and kept is only
|
|
510
|
-
* valid while this number is unchanged. Anything holding one compares against its own copy and
|
|
511
|
-
* re-reads when they differ.
|
|
512
|
-
*
|
|
513
|
-
* @returns {number}
|
|
514
|
-
*/
|
|
515
|
-
get mesh_rows_version() {
|
|
516
|
-
return this.#mesh_rows_version;
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
/**
|
|
520
|
-
* @see mesh_rows_version
|
|
521
|
-
* @type {number}
|
|
401
|
+
* @type {GPUEntityBoundsReadback|null}
|
|
522
402
|
*/
|
|
523
|
-
#
|
|
403
|
+
#bounds = null;
|
|
524
404
|
|
|
525
405
|
/**
|
|
526
|
-
*
|
|
527
|
-
*
|
|
528
|
-
*
|
|
529
|
-
*
|
|
406
|
+
* Every material something in the scene draws with, each once — the rows' own list, kept
|
|
407
|
+
* current as meshes attach and detach. What the rasterizers iterate to decide which buckets
|
|
408
|
+
* and pipelines a frame needs. The array is reused until the set changes; a scene with no
|
|
409
|
+
* rows draws with nothing.
|
|
530
410
|
*
|
|
531
|
-
* @
|
|
532
|
-
* @returns {number}
|
|
411
|
+
* @returns {ShadeMaterial[]}
|
|
533
412
|
*/
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
if (parent === null) {
|
|
538
|
-
return NODE3D_SCENE_ID;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
const row = this.id_mapping.get(parent.id);
|
|
542
|
-
|
|
543
|
-
return row !== undefined ? row : NODE3D_SCENE_ID;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
/**
|
|
547
|
-
* Give a node rows in the database — one in `transforms`, plus one in `meshes` when it carries
|
|
548
|
-
* geometry.
|
|
549
|
-
*
|
|
550
|
-
* @param {Node3D} node
|
|
551
|
-
* @param {GPUTypedTable} transforms_table
|
|
552
|
-
* @param {GPUTypedTable} meshes_table
|
|
553
|
-
* @returns {SceneNodeBinding}
|
|
554
|
-
*/
|
|
555
|
-
#add_node(node, transforms_table, meshes_table) {
|
|
556
|
-
const binding = new SceneNodeBinding();
|
|
557
|
-
|
|
558
|
-
const transform_row = this.#add_transform_row(node, this.#resolve_parent_row(node), transforms_table);
|
|
559
|
-
|
|
560
|
-
binding.transform_row = transform_row;
|
|
561
|
-
binding.version = node.version;
|
|
562
|
-
// Seeding a row is the CPU's job whoever owns it afterwards — the row has to exist and hold
|
|
563
|
-
// a starting pose before the GPU has written anything into it.
|
|
564
|
-
binding.authority = node.transform_authority;
|
|
565
|
-
|
|
566
|
-
this.id_mapping.set(node.id, transform_row);
|
|
567
|
-
|
|
568
|
-
if (node.isMesh === true) {
|
|
569
|
-
this.materials.obtain(node.material);
|
|
570
|
-
|
|
571
|
-
const mesh_row = meshes_table.add(this.#write_mesh_record(node, transform_row));
|
|
572
|
-
|
|
573
|
-
binding.mesh_row = mesh_row;
|
|
574
|
-
|
|
575
|
-
this.#mesh_rows_version++;
|
|
576
|
-
|
|
577
|
-
this.#allocate_instances(meshes_table.element_capacity);
|
|
578
|
-
|
|
579
|
-
this.#instance_metadata[mesh_row * 2] = node.id;
|
|
580
|
-
this.#instance_metadata[mesh_row * 2 + 1] = node.version;
|
|
581
|
-
|
|
582
|
-
this.#tlas.instance_add(mesh_row, node);
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
this.#bindings.set(node, binding);
|
|
586
|
-
|
|
587
|
-
return binding;
|
|
413
|
+
get drawn_materials() {
|
|
414
|
+
return this.#rows === null ? NO_MATERIALS : this.#rows.materials;
|
|
588
415
|
}
|
|
589
416
|
|
|
590
417
|
/**
|
|
591
|
-
*
|
|
592
|
-
* and the record has to carry that row's published world matrix — so the row is claimed first
|
|
593
|
-
* with a placeholder and written properly immediately after.
|
|
594
|
-
*
|
|
595
|
-
* @param {Node3D} node
|
|
596
|
-
* @param {number} parent_row
|
|
597
|
-
* @param {GPUTypedTable} transforms_table
|
|
598
|
-
* @returns {number}
|
|
418
|
+
* @returns {GPUSceneRows}
|
|
599
419
|
*/
|
|
600
|
-
#
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
this.#seed_published_global(node, row);
|
|
420
|
+
#obtain_rows() {
|
|
421
|
+
if (this.#rows === null) {
|
|
422
|
+
const dataset = this.#scene.dataset;
|
|
604
423
|
|
|
605
|
-
|
|
424
|
+
assert.notNull(dataset, 'the scene names no dataset — set Scene.dataset before asking for its rows');
|
|
425
|
+
assert.defined(dataset, 'the scene names no dataset — set Scene.dataset before asking for its rows');
|
|
606
426
|
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
* @param {GPUTypedTable} meshes_table
|
|
617
|
-
*/
|
|
618
|
-
#remove_node(node, binding, transforms_table, meshes_table) {
|
|
619
|
-
if (node.isMesh === true) {
|
|
620
|
-
const mesh_row = binding.mesh_row;
|
|
621
|
-
|
|
622
|
-
meshes_table.remove(mesh_row);
|
|
623
|
-
this.#tlas.instance_remove(mesh_row);
|
|
624
|
-
|
|
625
|
-
this.#mesh_rows_version++;
|
|
626
|
-
|
|
627
|
-
this.#instance_metadata[mesh_row * 2] = 0;
|
|
628
|
-
this.#instance_metadata[mesh_row * 2 + 1] = 0;
|
|
629
|
-
|
|
630
|
-
// A skinned mesh renders a per-instance copy of its geometry, and the row just
|
|
631
|
-
// given back was the only thing naming it. This is where that copy — its vertex
|
|
632
|
-
// region, its BLAS and its prev-position slice — goes back too; nothing else in
|
|
633
|
-
// the engine sees a mesh leave, and unbinding deliberately does not free it.
|
|
634
|
-
if (node.isSkinnedMesh === true) {
|
|
635
|
-
this.skinning.release_clone(node);
|
|
636
|
-
}
|
|
427
|
+
this.#rows = new GPUSceneRows({
|
|
428
|
+
dataset,
|
|
429
|
+
transforms: this.#scene_database.get('transforms'),
|
|
430
|
+
meshes: this.#scene_database.get('meshes'),
|
|
431
|
+
geometries: this.geometries,
|
|
432
|
+
materials: this.materials,
|
|
433
|
+
tlas: this.#tlas,
|
|
434
|
+
skinning: () => this.skinning,
|
|
435
|
+
});
|
|
637
436
|
}
|
|
638
437
|
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
this.id_mapping.delete(node.id);
|
|
642
|
-
this.#bindings.delete(node);
|
|
438
|
+
return this.#rows;
|
|
643
439
|
}
|
|
644
440
|
|
|
645
441
|
/**
|
|
646
|
-
* Bring the database
|
|
647
|
-
*
|
|
648
|
-
*
|
|
649
|
-
*
|
|
650
|
-
* @param {GPUTypedTable} transforms_table
|
|
651
|
-
* @param {GPUTypedTable} meshes_table
|
|
652
|
-
* @returns {number} rows written
|
|
442
|
+
* Bring the GPU scene database in line with the scene, writing only the rows that changed:
|
|
443
|
+
* the scene root's, once; a light's, as it arrives; and every entity's row that a system
|
|
444
|
+
* marked since the last build. Nothing is walked — the rows keep what was marked.
|
|
653
445
|
*/
|
|
654
|
-
|
|
655
|
-
const epoch = ++this.#epoch;
|
|
656
|
-
|
|
446
|
+
build() {
|
|
657
447
|
let written = 0;
|
|
658
448
|
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
// The scene root must land at row 0 — it is both the hierarchy walk's terminator and the
|
|
662
|
-
// natural value of any zero-initialised buffer.
|
|
663
|
-
let scene_binding = this.#bindings.get(scene);
|
|
664
|
-
|
|
665
|
-
if (scene_binding === undefined) {
|
|
666
|
-
scene_binding = this.#add_node(scene, transforms_table, meshes_table);
|
|
667
|
-
|
|
668
|
-
assert.equal(scene_binding.transform_row, NODE3D_SCENE_ID, 'scene must land at transforms table row 0');
|
|
449
|
+
if (!this.#root_written) {
|
|
450
|
+
this.#scene_database.get('transforms').set_record(NODE3D_SCENE_ID, ROOT_RECORD, ROOT_RECORD_WRITER);
|
|
669
451
|
|
|
452
|
+
this.#root_written = true;
|
|
670
453
|
written++;
|
|
671
454
|
}
|
|
672
455
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
// Nodes whose parent had not been placed when they were. `Scene.add` walks parents before
|
|
679
|
-
// children, so this is empty unless a caller added a child to the scene ahead of its
|
|
680
|
-
// parent.
|
|
681
|
-
const orphaned = [];
|
|
682
|
-
|
|
683
|
-
for (let i = 0; i < node_count; i++) {
|
|
684
|
-
const node = nodes[i];
|
|
685
|
-
|
|
686
|
-
let binding = this.#bindings.get(node);
|
|
687
|
-
|
|
688
|
-
if (binding === undefined) {
|
|
689
|
-
binding = this.#add_node(node, transforms_table, meshes_table);
|
|
690
|
-
|
|
691
|
-
written++;
|
|
692
|
-
|
|
693
|
-
if (node.parent !== null && this.id_mapping.get(node.parent.id) === undefined) {
|
|
694
|
-
orphaned.push(node);
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
binding.epoch = epoch;
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
for (let i = 0; i < orphaned.length; i++) {
|
|
702
|
-
const node = orphaned[i];
|
|
703
|
-
const parent_row = this.id_mapping.get(node.parent.id);
|
|
704
|
-
|
|
705
|
-
if (parent_row === undefined) {
|
|
706
|
-
// the parent really is not in this scene — the scene root stands
|
|
707
|
-
continue;
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
const binding = this.#bindings.get(node);
|
|
711
|
-
|
|
712
|
-
transforms_table.set(
|
|
713
|
-
binding.transform_row,
|
|
714
|
-
this.#write_transform_record(node, binding.transform_row, parent_row)
|
|
715
|
-
);
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
for (const [node, binding] of this.#bindings) {
|
|
719
|
-
if (binding.epoch !== epoch) {
|
|
720
|
-
this.#remove_node(node, binding, transforms_table, meshes_table);
|
|
721
|
-
|
|
722
|
-
written++;
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
return written;
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
/**
|
|
730
|
-
* Push every node that has moved since its row was last written, and nothing else.
|
|
731
|
-
*
|
|
732
|
-
* Rows the GPU owns are left alone entirely — see {@link TransformAuthority}. Their nodes still
|
|
733
|
-
* report movement (a CPU-driven parent recursing through `updateMatrices` is enough to mark
|
|
734
|
-
* every joint under it), and acting on that report is exactly the collision authority exists to
|
|
735
|
-
* prevent.
|
|
736
|
-
*
|
|
737
|
-
* @param {GPUTypedTable} transforms_table
|
|
738
|
-
* @param {GPUTypedTable} meshes_table
|
|
739
|
-
* @returns {number} rows written
|
|
740
|
-
*/
|
|
741
|
-
#sync_transforms(transforms_table, meshes_table) {
|
|
742
|
-
let written = 0;
|
|
743
|
-
|
|
744
|
-
for (const [node, binding] of this.#bindings) {
|
|
745
|
-
const authority = node.transform_authority;
|
|
746
|
-
const handed_back = authority !== binding.authority && authority === TransformAuthority.CPU;
|
|
747
|
-
|
|
748
|
-
binding.authority = authority;
|
|
749
|
-
|
|
750
|
-
if (authority === TransformAuthority.GPU) {
|
|
751
|
-
continue;
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
const version = node.version;
|
|
755
|
-
|
|
756
|
-
// A row just handed back has to be written whatever the version says: nothing moved it
|
|
757
|
-
// while the GPU held it, so there is no change to notice, and the row it is taking over
|
|
758
|
-
// holds a pose the CPU never wrote.
|
|
759
|
-
if (version === binding.version && !handed_back) {
|
|
760
|
-
continue;
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
if (handed_back) {
|
|
764
|
-
// Taking over from an unknown pose — seed the published matrix the way a fresh row
|
|
765
|
-
// is seeded, so the first frame back reports no velocity rather than a jump.
|
|
766
|
-
this.#seed_published_global(node, binding.transform_row);
|
|
767
|
-
}
|
|
768
|
-
|
|
769
|
-
binding.version = version;
|
|
770
|
-
written++;
|
|
771
|
-
|
|
772
|
-
const transform_row = binding.transform_row;
|
|
773
|
-
|
|
774
|
-
transforms_table.set(
|
|
775
|
-
transform_row,
|
|
776
|
-
this.#write_transform_record(node, transform_row, this.#resolve_parent_row(node))
|
|
777
|
-
);
|
|
778
|
-
|
|
779
|
-
if (node.isMesh !== true) {
|
|
780
|
-
continue;
|
|
781
|
-
}
|
|
782
|
-
|
|
783
|
-
// World-space bounds moved with the node, and culling reads them off the mesh row.
|
|
784
|
-
const mesh_row = binding.mesh_row;
|
|
785
|
-
|
|
786
|
-
meshes_table.set(mesh_row, this.#write_mesh_record(node, transform_row));
|
|
787
|
-
|
|
788
|
-
this.#instance_metadata[mesh_row * 2 + 1] = version;
|
|
789
|
-
|
|
790
|
-
this.#tlas.instance_update(mesh_row, node);
|
|
456
|
+
// Entities are rows — marked by the systems that place them, written here. Built on demand
|
|
457
|
+
// because the scene may name its dataset after this context was made.
|
|
458
|
+
if (this.#rows === null && this.#scene.dataset !== null && this.#scene.dataset !== undefined) {
|
|
459
|
+
this.rows;
|
|
791
460
|
}
|
|
792
461
|
|
|
793
|
-
|
|
794
|
-
|
|
462
|
+
if (this.#rows !== null) {
|
|
463
|
+
// A light is an entity's row, held here on the light collection's behalf — before the
|
|
464
|
+
// flush, so a light that arrived this frame is written this frame.
|
|
465
|
+
this.#lights.sync_rows(this.#rows);
|
|
795
466
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
* Membership is reconciled when the batch says it moved; transforms are checked every frame,
|
|
800
|
-
* because a node moving does not touch the batch. Both walk the scene once and write nothing
|
|
801
|
-
* for a node that has not changed.
|
|
802
|
-
*/
|
|
803
|
-
build() {
|
|
804
|
-
|
|
805
|
-
const batch = this.#scene.instances;
|
|
806
|
-
|
|
807
|
-
const meshes_table = this.#scene_database.get('meshes');
|
|
808
|
-
const transforms_table = this.#scene_database.get('transforms');
|
|
809
|
-
|
|
810
|
-
let written = 0;
|
|
811
|
-
|
|
812
|
-
if (this.#instances_version !== batch.version) {
|
|
813
|
-
written += this.#sync_membership(transforms_table, meshes_table);
|
|
814
|
-
|
|
815
|
-
this.#instances_version = batch.version;
|
|
467
|
+
written += this.#rows.flush();
|
|
468
|
+
} else {
|
|
469
|
+
assert.equal(this.#scene.lights.elements.length, 0, 'the scene has lights and names no dataset; a light is an entity of one');
|
|
816
470
|
}
|
|
817
471
|
|
|
818
|
-
written += this.#sync_transforms(transforms_table, meshes_table);
|
|
819
|
-
|
|
820
472
|
if (written === 0) {
|
|
821
473
|
return;
|
|
822
474
|
}
|
|
@@ -825,9 +477,9 @@ export class GPUSceneContext {
|
|
|
825
477
|
const cmd = ShadeGPUCommandContext.create(this.#graphics, 'GPUSceneContext/database-build');
|
|
826
478
|
|
|
827
479
|
// Also flush the global geometry manager. The first time a scene
|
|
828
|
-
// sees a new mesh,
|
|
829
|
-
//
|
|
830
|
-
//
|
|
480
|
+
// sees a new mesh, the rows' flush calls `geometries.add(...)`,
|
|
481
|
+
// which registers the source MeshletGeometry and flips
|
|
482
|
+
// `geometries.__needs_update = true`. The next per-frame
|
|
831
483
|
// `graphics.update()` would normally rebuild
|
|
832
484
|
// `geometries.buffer_metadata` to reflect those new entries — but
|
|
833
485
|
// `graphics.update()` runs at the *head* of `Renderer.#begin_frame`,
|
|
@@ -871,6 +523,11 @@ export class GPUSceneContext {
|
|
|
871
523
|
|
|
872
524
|
// TODO add a fast update check, so that calling this multiple times per frame can be fast.
|
|
873
525
|
|
|
526
|
+
// The apply point of the scene database's readback: whatever the device has answered since
|
|
527
|
+
// — an entity's drawn bounds, asked for through {@link bounds} — is delivered before
|
|
528
|
+
// anything this frame reads it, and never mid-update.
|
|
529
|
+
this.#scene_database.readback.apply();
|
|
530
|
+
|
|
874
531
|
this.#light_probe_volume.update();
|
|
875
532
|
this.#lights.update(ctx);
|
|
876
533
|
this.#volumetrics.update(ctx, 0);
|
|
@@ -885,31 +542,93 @@ export class GPUSceneContext {
|
|
|
885
542
|
// TODO update SDF
|
|
886
543
|
|
|
887
544
|
this.build();
|
|
888
|
-
|
|
889
|
-
// After the build, which is what feeds the TLAS this frame's arrivals, departures and moves —
|
|
890
|
-
// and, for the GPU build, writes the world AABBs it reads out of the `meshes` table.
|
|
891
|
-
this.#tlas.update(this.scene_database_buffer);
|
|
892
545
|
}
|
|
893
546
|
|
|
894
547
|
/**
|
|
895
|
-
* Per-frame
|
|
896
|
-
*
|
|
897
|
-
*
|
|
898
|
-
*
|
|
899
|
-
*
|
|
900
|
-
*
|
|
548
|
+
* Per-frame GPU-side scene update, once per scene per frame, after every view's {@link update}
|
|
549
|
+
* has flushed what the CPU changed:
|
|
550
|
+
*
|
|
551
|
+
* 1. the animation tick — pending registrations drained, `clip.time` advanced, apply → resolve
|
|
552
|
+
* → hierarchy propagate → skin-matrix prep → skinning, through {@link GPUAnimationManager#tick};
|
|
553
|
+
* 2. render bounds — every mesh row's world box and sphere, derived from its geometry under
|
|
554
|
+
* the `global` the hierarchy pass just composed, because the CPU does not hold that matrix
|
|
555
|
+
* for a subtree the GPU drives;
|
|
556
|
+
* 3. light poses — every light record's position and direction, from its entity's row, for
|
|
557
|
+
* the same reason;
|
|
558
|
+
* 4. the TLAS — rebuilt from those bounds when anything moved, on either side.
|
|
901
559
|
*
|
|
902
|
-
* `
|
|
903
|
-
*
|
|
560
|
+
* All four into `cmd_ctx`, in that order, so the tree the frame's ray passes traverse is built
|
|
561
|
+
* over this frame's bounds rather than last frame's, and what lights the frame is where it is
|
|
562
|
+
* this frame.
|
|
563
|
+
*
|
|
564
|
+
* `dt_seconds` is wall-clock seconds since the last call (the renderer's `time_delta_seconds`
|
|
565
|
+
* argument to `render()`).
|
|
904
566
|
*
|
|
905
567
|
* @param {ShadeGPUCommandContext} cmd_ctx
|
|
906
568
|
* @param {number} dt_seconds wall-clock seconds since last call
|
|
907
569
|
*/
|
|
908
570
|
tick(cmd_ctx, dt_seconds) {
|
|
909
|
-
this.#animation_manager.tick(cmd_ctx, dt_seconds);
|
|
571
|
+
const animated = this.#animation_manager.tick(cmd_ctx, dt_seconds);
|
|
572
|
+
|
|
573
|
+
this.#refresh_mesh_bounds(cmd_ctx);
|
|
574
|
+
|
|
575
|
+
this.#lights.refresh_poses(cmd_ctx, this.scene_database_buffer);
|
|
576
|
+
|
|
577
|
+
if (animated) {
|
|
578
|
+
// Rows moved on the GPU, where no version was bumped: a clip resolved into a TRS, a
|
|
579
|
+
// skinning pass moved a clone's vertices. The bounds pass just re-derived their boxes,
|
|
580
|
+
// and the tree is built over boxes.
|
|
581
|
+
this.#tlas.invalidate();
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
this.#tlas.update(this.scene_database_buffer, cmd_ctx);
|
|
585
|
+
|
|
586
|
+
// What was asked of the scene database this frame is copied out at the tail of the
|
|
587
|
+
// database's own update when rows were written this frame, and here — after the bounds
|
|
588
|
+
// pass — when none were; either way what lands, at the head of a later frame's update, is
|
|
589
|
+
// the box the GPU held when the copy ran.
|
|
590
|
+
this.#scene_database.readback.encode(cmd_ctx);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Recompute every mesh row's world bounds from its geometry under its composed `global`.
|
|
595
|
+
* Skipped when there is no mesh row; otherwise one thread per slot of the `meshes` table's
|
|
596
|
+
* pages, occupancy-masked.
|
|
597
|
+
*
|
|
598
|
+
* @param {ShadeGPUCommandContext} cmd_ctx
|
|
599
|
+
*/
|
|
600
|
+
#refresh_mesh_bounds(cmd_ctx) {
|
|
601
|
+
const meshes_table = this.#scene_database.get('meshes');
|
|
602
|
+
|
|
603
|
+
const group_count = meshes_table.dispatch_group_count(REFRESH_ALL_MESH_BOUNDS_WORKGROUP_SIZE);
|
|
604
|
+
|
|
605
|
+
if (group_count === 0) {
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
const geometries = this.geometries.buffer_metadata;
|
|
610
|
+
|
|
611
|
+
if (geometries === null) {
|
|
612
|
+
// a mesh row names a geometry, and a geometry is registered before its row is written
|
|
613
|
+
// — so this is a scene whose first frame has not flushed the geometry manager yet
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
shader_refresh_all_mesh_bounds.dispatch({
|
|
618
|
+
encoder: cmd_ctx,
|
|
619
|
+
group_count_x: group_count,
|
|
620
|
+
bindings: {
|
|
621
|
+
scene_database: this.scene_database_buffer,
|
|
622
|
+
geometries,
|
|
623
|
+
},
|
|
624
|
+
});
|
|
910
625
|
}
|
|
911
626
|
|
|
912
627
|
destroy() {
|
|
628
|
+
if (this.#rows !== null) {
|
|
629
|
+
this.#rows.destroy();
|
|
630
|
+
}
|
|
631
|
+
|
|
913
632
|
this.#scene_database.destroy();
|
|
914
633
|
this.#lights.destroy();
|
|
915
634
|
this.#light_probe_volume.destroy();
|