@woosh/meep-engine 3.52.0 → 3.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/engine/ecs/animation/Animation.d.ts +4 -25
- package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
- package/src/engine/ecs/animation/Animation.js +9 -41
- package/src/engine/ecs/ik/IKGoalSystem.d.ts +4 -5
- package/src/engine/ecs/ik/IKGoalSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/IKGoalSystem.js +4 -6
- package/src/engine/graphics/ecs/mesh/assetTypeByPath.js +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.d.ts +9 -22
- package/src/engine/graphics3/AnimationGraphSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationGraphSystem.js +58 -203
- package/src/engine/graphics3/AnimationSystem.d.ts +7 -18
- package/src/engine/graphics3/AnimationSystem.d.ts.map +1 -1
- package/src/engine/graphics3/AnimationSystem.js +62 -243
- package/src/engine/graphics3/FoliageWindSystem.d.ts +67 -0
- package/src/engine/graphics3/FoliageWindSystem.d.ts.map +1 -0
- package/src/engine/graphics3/FoliageWindSystem.js +257 -0
- package/src/engine/graphics3/GPUFluidSystem.d.ts +7 -0
- package/src/engine/graphics3/GPUFluidSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUFluidSystem.js +39 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +0 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/GPUParticleEmitterSystem.js +19 -5
- package/src/engine/graphics3/animation/AnimationClips.d.ts +107 -13
- package/src/engine/graphics3/animation/AnimationClips.d.ts.map +1 -1
- package/src/engine/graphics3/animation/AnimationClips.js +207 -10
- package/src/engine/graphics3/animation/AnimationClipsSink.d.ts +89 -0
- package/src/engine/graphics3/animation/AnimationClipsSink.d.ts.map +1 -0
- package/src/engine/graphics3/animation/AnimationClipsSink.js +205 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.d.ts +43 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.d.ts.map +1 -0
- package/src/engine/graphics3/animation/FoliageWindRigs.js +69 -0
- package/src/engine/graphics3/animation/write_clip_playback.d.ts +17 -11
- package/src/engine/graphics3/animation/write_clip_playback.d.ts.map +1 -1
- package/src/engine/graphics3/animation/write_clip_playback.js +36 -27
- package/src/engine/graphics3/decal/GPUDecalRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/decal/GPUDecalRenderer.js +8 -6
- package/src/engine/graphics3/decal/shader_decal_composite.d.ts.map +1 -1
- package/src/engine/graphics3/decal/shader_decal_composite.js +11 -5
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts +7 -7
- package/src/engine/graphics3/pose/collect_entity_playbacks.d.ts.map +1 -1
- package/src/engine/graphics3/pose/collect_entity_playbacks.js +14 -15
- package/src/engine/graphics3/prefab/Prefab.d.ts +6 -0
- package/src/engine/graphics3/prefab/Prefab.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/Prefab.js +169 -162
- package/src/engine/graphics3/prefab/prefab_compile.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_compile.js +369 -334
- package/src/engine/graphics3/prefab/prefab_instantiate.d.ts.map +1 -1
- package/src/engine/graphics3/prefab/prefab_instantiate.js +43 -2
- package/src/engine/graphics3/terrain/chunk_terrain_material_surface.js +2 -2
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts +2 -3
- package/src/engine/physics/ecs/ContactProbeSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ContactProbeSystem.js +2 -4
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
- package/src/engine/sound/simulation/PROBE_PLACEMENT.md +4 -4
- package/src/engine/sound/simulation/README.md +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeField.d.ts +22 -8
- package/src/engine/sound/simulation/probe/bakeProbeField.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeField.js +60 -15
- package/src/engine/sound/simulation/probe/bakeProbeReflectors.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/bakeProbeReflectors.js +19 -23
- package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +63 -17
- package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
- package/src/engine/sound/simulation/probe/probe_sdf_grid.js +67 -17
- package/src/generation/foliage/FOLIAGE_DESIGN.md +318 -0
- package/src/generation/foliage/FOLIAGE_PLAN.md +198 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts +20 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.d.ts.map +1 -0
- package/src/generation/foliage/animation/build_tree_wind_rig.js +108 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts +86 -0
- package/src/generation/foliage/asset/TreeAsset.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeAsset.js +111 -0
- package/src/generation/foliage/asset/TreeLODAsset.d.ts +115 -0
- package/src/generation/foliage/asset/TreeLODAsset.d.ts.map +1 -0
- package/src/generation/foliage/asset/TreeLODAsset.js +346 -0
- package/src/generation/foliage/asset/generate_tree.d.ts +15 -0
- package/src/generation/foliage/asset/generate_tree.d.ts.map +1 -0
- package/src/generation/foliage/asset/generate_tree.js +93 -0
- package/src/generation/foliage/asset/place_tree.d.ts +82 -0
- package/src/generation/foliage/asset/place_tree.d.ts.map +1 -0
- package/src/generation/foliage/asset/place_tree.js +194 -0
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts +120 -0
- package/src/generation/foliage/config/BarkMaterialConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/BarkMaterialConfig.js +250 -0
- package/src/generation/foliage/config/BranchLevelConfig.d.ts +288 -0
- package/src/generation/foliage/config/BranchLevelConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/BranchLevelConfig.js +536 -0
- package/src/generation/foliage/config/CrownConfig.d.ts +100 -0
- package/src/generation/foliage/config/CrownConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/CrownConfig.js +186 -0
- package/src/generation/foliage/config/CrownEnvelopeType.d.ts +16 -0
- package/src/generation/foliage/config/CrownEnvelopeType.d.ts.map +1 -0
- package/src/generation/foliage/config/CrownEnvelopeType.js +17 -0
- package/src/generation/foliage/config/FoliageCardType.d.ts +12 -0
- package/src/generation/foliage/config/FoliageCardType.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageCardType.js +18 -0
- package/src/generation/foliage/config/FoliageConfig.d.ts +151 -0
- package/src/generation/foliage/config/FoliageConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageConfig.js +283 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts +90 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/FoliageMaterialConfig.js +181 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts +13 -0
- package/src/generation/foliage/config/PhyllotaxisMode.d.ts.map +1 -0
- package/src/generation/foliage/config/PhyllotaxisMode.js +20 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts +87 -0
- package/src/generation/foliage/config/TreeLODConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeLODConfig.js +211 -0
- package/src/generation/foliage/config/TreePreset.d.ts +16 -0
- package/src/generation/foliage/config/TreePreset.d.ts.map +1 -0
- package/src/generation/foliage/config/TreePreset.js +17 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts +109 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeSpeciesConfig.js +400 -0
- package/src/generation/foliage/config/TreeWindConfig.d.ts +84 -0
- package/src/generation/foliage/config/TreeWindConfig.d.ts.map +1 -0
- package/src/generation/foliage/config/TreeWindConfig.js +157 -0
- package/src/generation/foliage/index.d.ts +38 -0
- package/src/generation/foliage/index.d.ts.map +1 -0
- package/src/generation/foliage/index.js +43 -0
- package/src/generation/foliage/material/make_bark_material.d.ts +37 -0
- package/src/generation/foliage/material/make_bark_material.d.ts.map +1 -0
- package/src/generation/foliage/material/make_bark_material.js +802 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts +14 -0
- package/src/generation/foliage/material/make_foliage_material.d.ts.map +1 -0
- package/src/generation/foliage/material/make_foliage_material.js +359 -0
- package/src/generation/foliage/mesh/branch_collar_project.d.ts +42 -0
- package/src/generation/foliage/mesh/branch_collar_project.d.ts.map +1 -0
- package/src/generation/foliage/mesh/branch_collar_project.js +203 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts +35 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.d.ts.map +1 -0
- package/src/generation/foliage/mesh/branch_ring_triangulate.js +72 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts +80 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.d.ts.map +1 -0
- package/src/generation/foliage/mesh/foliage_collect_attachments.js +502 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts +19 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_apply_canopy_ao.js +150 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts +55 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_build_bark.js +1047 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts +21 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.d.ts.map +1 -0
- package/src/generation/foliage/mesh/tree_mesh_build_foliage.js +415 -0
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts +13 -0
- package/src/generation/foliage/presets/make_tree_species_preset.d.ts.map +1 -0
- package/src/generation/foliage/presets/make_tree_species_preset.js +837 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts +443 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/TreeSkeleton.js +1100 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts +27 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/crown_envelope_evaluate.js +121 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts +32 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/spine_frame_double_reflection.js +87 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts +33 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_assign_skin_joints.js +205 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts +14 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_compute_pipe_radii.js +179 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts +18 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.d.ts.map +1 -0
- package/src/generation/foliage/skeleton/tree_skeleton_grow.js +1104 -0
- package/src/shade/playground/additive_blending/index.html +197 -0
- package/src/shade/playground/additive_blending/main.d.ts +2 -0
- package/src/shade/playground/additive_blending/main.d.ts.map +1 -0
- package/src/shade/playground/additive_blending/main.js +529 -0
- package/src/shade/playground/foliage_wind/README.md +18 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts +127 -0
- package/src/shade/playground/foliage_wind/foliage_world.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/foliage_world.js +593 -0
- package/src/shade/playground/foliage_wind/index.html +254 -0
- package/src/shade/playground/foliage_wind/main.d.ts +2 -0
- package/src/shade/playground/foliage_wind/main.d.ts.map +1 -0
- package/src/shade/playground/foliage_wind/main.js +263 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +45 -16
- package/src/shade/renderer/animation/ADDITIVE_BLENDING_PLAN.md +145 -0
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts +9 -1
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.d.ts.map +1 -1
- package/src/shade/renderer/animation/ANIMATION_DATABASE_SPEC.js +53 -1
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts +8 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_JOINT_STRUCT.js +71 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts +11 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/animation/ANIMATION_FOLIAGE_RIG_STRUCT.js +32 -0
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts +30 -3
- package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
- package/src/shade/renderer/animation/GPUAnimationManager.js +532 -79
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts +19 -12
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.d.ts.map +1 -1
- package/src/shade/renderer/animation/POSE_ACCUMULATOR_LAYOUT.js +20 -13
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts +35 -8
- package/src/shade/renderer/animation/ShadeAnimationClip.d.ts.map +1 -1
- package/src/shade/renderer/animation/ShadeAnimationClip.js +433 -2
- package/src/shade/renderer/animation/chunk_pose_accumulator.d.ts.map +1 -1
- package/src/shade/renderer/animation/chunk_pose_accumulator.js +40 -32
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts +97 -0
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/FoliageWindJoint.js +161 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts +65 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/FoliageWindRig.js +89 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts +19 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/chunk_foliage_wind_step.js +143 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts +14 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.d.ts.map +1 -0
- package/src/shade/renderer/animation/foliage/shader_foliage_wind_apply.js +116 -0
- package/src/shade/renderer/animation/pose/pose_evaluate_local.d.ts.map +1 -1
- package/src/shade/renderer/animation/pose/pose_evaluate_local.js +39 -29
- package/src/shade/renderer/animation/shader_animation_pose_resolve.js +37 -37
- package/src/shade/renderer/animation/skinning/GPUMeshSkinningContext.js +2 -2
- package/src/shade/renderer/extension/RenderExtension.d.ts +7 -0
- package/src/shade/renderer/extension/RenderExtension.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtension.js +9 -0
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts +6 -0
- package/src/shade/renderer/extension/RenderExtensionRegistry.d.ts.map +1 -1
- package/src/shade/renderer/extension/RenderExtensionRegistry.js +15 -0
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts +7 -0
- package/src/shade/renderer/fluid/GPUFluidCascade.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascade.js +15 -0
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts +7 -0
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.d.ts.map +1 -1
- package/src/shade/renderer/fluid/GPUFluidCascadeStack.js +11 -0
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.d.ts.map +1 -1
- package/src/shade/renderer/fluid/coupling/chunk_fluid_cascade_parent.js +51 -48
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts +6 -0
- package/src/shade/renderer/fluid/mac/FluidMacPasses.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/FluidMacPasses.js +16 -0
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_fluid_mac_seams.js +15 -3
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.d.ts.map +1 -1
- package/src/shade/renderer/fluid/mac/chunk_v3_mac_lattice_corners.js +102 -96
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_correct.js +12 -12
- package/src/shade/renderer/fluid/mac/shader_fluid_mac_advect_predict.js +12 -12
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts +7 -0
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.d.ts.map +1 -1
- package/src/shade/renderer/fluid/pressure/GPUFluidPressureSolve.js +16 -0
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts +7 -0
- package/src/shade/renderer/fluid/publish/FluidWindPublish.d.ts.map +1 -1
- package/src/shade/renderer/fluid/publish/FluidWindPublish.js +10 -0
- package/src/shade/renderer/geometry/bvh/GPUBLASRefitBatch.js +2 -2
- package/src/shade/renderer/loader/SceneBundle.d.ts +7 -0
- package/src/shade/renderer/loader/SceneBundle.d.ts.map +1 -1
- package/src/shade/renderer/loader/SceneBundle.js +119 -111
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts +4 -0
- package/src/shade/renderer/material/standard/fragment_gbuffer.d.ts.map +1 -1
- package/src/shade/renderer/material/standard/fragment_gbuffer.js +6 -5
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts +8 -7
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.d.ts.map +1 -1
- package/src/shade/renderer/object_property/chunk_write_object_property_node3d.js +9 -8
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +3 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +9 -4
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/ssr/resolve/ssr_resolve_shader.js +9 -7
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment.js +15 -7
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +6 -4
- package/src/shade/renderer/rasterize/native/oit/oit_resolve_fragment_body.js +3 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +8 -5
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/viz/viz_rasterization_alpha_tested_pass_descriptor.js +4 -3
- package/src/shade/renderer/shadow/map/GPUSceneShadowmapContext.js +1 -1
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts +9 -0
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.d.ts.map +1 -0
- package/src/shade/renderer/texture/SAMPLER_ANISOTROPIC_CLAMP.js +17 -0
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts +8 -0
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.d.ts.map +1 -1
- package/src/shade/renderer/texture/SAMPLER_LINEAR_UPSCALE.js +28 -20
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts +8 -0
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.d.ts.map +1 -0
- package/src/shade/renderer/texture/SAMPLER_TRILINEAR_CLAMP.js +15 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.d.ts +21 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.d.ts.map +1 -0
- package/src/shade/renderer/view/chunk_view_mip_bias.js +44 -0
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +105 -26
- package/src/engine/graphics/composit/CompositingStages.d.ts +0 -6
- package/src/engine/graphics/composit/CompositingStages.d.ts.map +0 -1
- package/src/engine/graphics/composit/CompositingStages.js +0 -8
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +0 -24
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts +0 -8
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryBoundingSphereMiniball.js +0 -17
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +0 -8
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +0 -60
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +0 -26
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +0 -7
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +0 -1
- package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +0 -23
- package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts +0 -7
- package/src/engine/graphics/geometry/instancing/geometry_copy.d.ts.map +0 -1
- package/src/engine/graphics/geometry/instancing/geometry_copy.js +0 -15
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts +0 -2
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.d.ts.map +0 -1
- package/src/engine/graphics/geometry/instancing/rewriteMaterial.js +0 -57
- package/src/engine/graphics/geometry/ribbon/Quad.d.ts +0 -96
- package/src/engine/graphics/geometry/ribbon/Quad.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/Quad.js +0 -213
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +0 -9
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +0 -12
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +0 -10
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +0 -17
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +0 -10
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +0 -13
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +0 -11
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +0 -24
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts +0 -6
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/rotateRibbon.js +0 -37
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts +0 -9
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.d.ts.map +0 -1
- package/src/engine/graphics/geometry/ribbon/updateTipPosition.js +0 -52
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts +0 -8
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +0 -1
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +0 -54
- package/src/engine/graphics/render/RenderPassType.d.ts +0 -6
- package/src/engine/graphics/render/RenderPassType.d.ts.map +0 -1
- package/src/engine/graphics/render/RenderPassType.js +0 -8
- package/src/engine/graphics/render/layers/RenderLayer.d.ts +0 -78
- package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayer.js +0 -95
- package/src/engine/graphics/render/layers/RenderLayerManager.d.ts +0 -72
- package/src/engine/graphics/render/layers/RenderLayerManager.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerManager.js +0 -160
- package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts +0 -18
- package/src/engine/graphics/render/layers/RenderLayerManagerState.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerManagerState.js +0 -48
- package/src/engine/graphics/render/layers/RenderLayerState.d.ts +0 -18
- package/src/engine/graphics/render/layers/RenderLayerState.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerState.js +0 -27
- package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts +0 -8
- package/src/engine/graphics/render/layers/RenderLayerUtils.d.ts.map +0 -1
- package/src/engine/graphics/render/layers/RenderLayerUtils.js +0 -103
- package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts +0 -10
- package/src/engine/graphics/render/make_bvh_visibility_builder.d.ts.map +0 -1
- package/src/engine/graphics/render/make_bvh_visibility_builder.js +0 -64
- package/src/engine/graphics/render/view/CameraViewFlags.d.ts +0 -7
- package/src/engine/graphics/render/view/CameraViewFlags.d.ts.map +0 -1
- package/src/engine/graphics/render/view/CameraViewFlags.js +0 -9
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts +0 -143
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/IncrementalDeltaSet.js +0 -328
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +0 -39
- package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/VisibilityComputer.js +0 -80
- package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts +0 -29
- package/src/engine/graphics/render/visibility/VisibilityFilter.d.ts.map +0 -1
- package/src/engine/graphics/render/visibility/VisibilityFilter.js +0 -37
- package/src/engine/graphics3/animation/write_graph_playback.d.ts +0 -24
- package/src/engine/graphics3/animation/write_graph_playback.d.ts.map +0 -1
- package/src/engine/graphics3/animation/write_graph_playback.js +0 -48
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { assert } from "../../core/assert.js";
|
|
2
|
+
import { System } from "../ecs/System.js";
|
|
3
|
+
import { Transform64 } from "../ecs/transform/Transform64.js";
|
|
4
|
+
import { FoliageWindRigs } from "./animation/FoliageWindRigs.js";
|
|
5
|
+
import { RowChains } from "./RowChains.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {import("../../shade/ShadeGraphicsEngine.js").ShadeGraphicsEngine} ShadeGraphicsEngine
|
|
9
|
+
* @typedef {import("../../shade/PublicScene.js").PublicScene} PublicScene
|
|
10
|
+
* @typedef {import("../../shade/renderer/scene/GPUSceneContext.js").GPUSceneContext} GPUSceneContext
|
|
11
|
+
* @typedef {import("../../shade/renderer/animation/foliage/FoliageWindRig.js").FoliageWindRig} FoliageWindRig
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {object} FoliageWindEntry
|
|
16
|
+
* @property {FoliageWindRigs} component
|
|
17
|
+
* @property {FoliageWindRig[]} rigs
|
|
18
|
+
* @property {GPUSceneContext|null} context
|
|
19
|
+
* @property {Int32Array|null} rig_ids
|
|
20
|
+
* @property {number} written_weight
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Registers every entity carrying {@link FoliageWindRigs} with the scene's
|
|
25
|
+
* {@link GPUAnimationManager}, so that procedural foliage skeletons deform in real time under
|
|
26
|
+
* the scene's 3D fluid dynamics cascades and global wind field (`GPUSceneWind`).
|
|
27
|
+
*
|
|
28
|
+
* **Rows.** Each rig's `root` entity and every `joint.target` entity are held in this system's
|
|
29
|
+
* {@link RowChains}, along with the transform chain above them, so every bone has a live
|
|
30
|
+
* `transforms` row on the GPU before {@link GPUAnimationManager#register_foliage_rig} binds it.
|
|
31
|
+
*
|
|
32
|
+
* **Lifecycle & Restart.** Mirrors {@link MeshSkinSystem}: rigs linked while a device is live
|
|
33
|
+
* register immediately; rigs linked before the renderer starts (or across a WebGPU device restart)
|
|
34
|
+
* bind and register on the next {@link update}. Changes to {@link FoliageWindRigs#weight} are
|
|
35
|
+
* propagated to {@link GPUAnimationManager#set_foliage_rig_weight} each frame.
|
|
36
|
+
*/
|
|
37
|
+
export class FoliageWindSystem extends System {
|
|
38
|
+
/**
|
|
39
|
+
* @type {ShadeGraphicsEngine}
|
|
40
|
+
*/
|
|
41
|
+
#graphics;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @type {PublicScene}
|
|
45
|
+
*/
|
|
46
|
+
#scene;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @type {RowChains|null}
|
|
50
|
+
*/
|
|
51
|
+
#chains = null;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* @type {GPUSceneContext|null}
|
|
55
|
+
*/
|
|
56
|
+
#context = null;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @type {Map<number, FoliageWindEntry>}
|
|
60
|
+
*/
|
|
61
|
+
#entries = new Map();
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {ShadeGraphicsEngine} graphics
|
|
65
|
+
* @param {PublicScene} scene
|
|
66
|
+
*/
|
|
67
|
+
constructor(graphics, scene) {
|
|
68
|
+
super();
|
|
69
|
+
|
|
70
|
+
assert.defined(graphics, 'graphics');
|
|
71
|
+
assert.defined(scene, 'scene');
|
|
72
|
+
|
|
73
|
+
this.#graphics = graphics;
|
|
74
|
+
this.#scene = scene;
|
|
75
|
+
|
|
76
|
+
this.dependencies = [FoliageWindRigs, Transform64];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async startup(entityManager) {
|
|
80
|
+
const dataset = entityManager.dataset;
|
|
81
|
+
const scene = this.#scene;
|
|
82
|
+
|
|
83
|
+
assert.ok(
|
|
84
|
+
scene.dataset === null || scene.dataset === undefined || scene.dataset === dataset,
|
|
85
|
+
'the scene is bound to another dataset'
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
scene.dataset = dataset;
|
|
89
|
+
|
|
90
|
+
this.#chains = new RowChains(dataset);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async shutdown() {
|
|
94
|
+
for (const entry of this.#entries.values()) {
|
|
95
|
+
this.#unregister(entry);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
this.#entries.clear();
|
|
99
|
+
|
|
100
|
+
this.#chains.destroy();
|
|
101
|
+
this.#chains = null;
|
|
102
|
+
this.#context = null;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @param {FoliageWindRigs} component
|
|
107
|
+
* @param {Transform64} _transform
|
|
108
|
+
* @param {number} entity
|
|
109
|
+
*/
|
|
110
|
+
link(component, _transform, entity) {
|
|
111
|
+
const rigs = component.rigs;
|
|
112
|
+
const chains = this.#chains;
|
|
113
|
+
|
|
114
|
+
for (let r = 0; r < rigs.length; r++) {
|
|
115
|
+
const rig = rigs[r];
|
|
116
|
+
chains.hold(rig.root);
|
|
117
|
+
|
|
118
|
+
const joints = rig.joints;
|
|
119
|
+
for (let j = 0; j < joints.length; j++) {
|
|
120
|
+
chains.hold(joints[j].target);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** @type {FoliageWindEntry} */
|
|
125
|
+
const entry = {
|
|
126
|
+
component,
|
|
127
|
+
rigs,
|
|
128
|
+
context: null,
|
|
129
|
+
rig_ids: null,
|
|
130
|
+
written_weight: NaN,
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
this.#entries.set(entity, entry);
|
|
134
|
+
|
|
135
|
+
const context = this.#graphics.scene_context(this.#scene);
|
|
136
|
+
|
|
137
|
+
if (context !== null) {
|
|
138
|
+
chains.bind(context.rows);
|
|
139
|
+
this.#context = context;
|
|
140
|
+
this.#register(entry, context);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @param {FoliageWindRigs} _component
|
|
146
|
+
* @param {Transform64} _transform
|
|
147
|
+
* @param {number} entity
|
|
148
|
+
*/
|
|
149
|
+
unlink(_component, _transform, entity) {
|
|
150
|
+
const entry = this.#entries.get(entity);
|
|
151
|
+
|
|
152
|
+
if (entry === undefined) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
this.#entries.delete(entity);
|
|
157
|
+
|
|
158
|
+
this.#unregister(entry);
|
|
159
|
+
|
|
160
|
+
const chains = this.#chains;
|
|
161
|
+
const rigs = entry.rigs;
|
|
162
|
+
|
|
163
|
+
for (let r = 0; r < rigs.length; r++) {
|
|
164
|
+
const rig = rigs[r];
|
|
165
|
+
const joints = rig.joints;
|
|
166
|
+
|
|
167
|
+
for (let j = 0; j < joints.length; j++) {
|
|
168
|
+
chains.release(joints[j].target);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
chains.release(rig.root);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
update() {
|
|
176
|
+
const context = this.#graphics.scene_context(this.#scene);
|
|
177
|
+
|
|
178
|
+
if (context !== this.#context) {
|
|
179
|
+
this.#chains.bind(context === null ? null : context.rows);
|
|
180
|
+
this.#context = context;
|
|
181
|
+
|
|
182
|
+
if (context !== null) {
|
|
183
|
+
for (const entry of this.#entries.values()) {
|
|
184
|
+
if (entry.context !== context) {
|
|
185
|
+
this.#register(entry, context);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (context === null) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const manager = context.animation_manager;
|
|
196
|
+
|
|
197
|
+
for (const entry of this.#entries.values()) {
|
|
198
|
+
if (entry.context !== context) {
|
|
199
|
+
this.#register(entry, context);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const weight = entry.component.weight;
|
|
203
|
+
if (weight !== entry.written_weight && entry.rig_ids !== null) {
|
|
204
|
+
const rig_ids = entry.rig_ids;
|
|
205
|
+
for (let i = 0; i < rig_ids.length; i++) {
|
|
206
|
+
manager.set_foliage_rig_weight(rig_ids[i], weight);
|
|
207
|
+
}
|
|
208
|
+
entry.written_weight = weight;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @param {FoliageWindEntry} entry
|
|
215
|
+
* @param {GPUSceneContext} context
|
|
216
|
+
*/
|
|
217
|
+
#register(entry, context) {
|
|
218
|
+
const manager = context.animation_manager;
|
|
219
|
+
const rigs = entry.rigs;
|
|
220
|
+
const rig_ids = new Int32Array(rigs.length);
|
|
221
|
+
const weight = entry.component.weight;
|
|
222
|
+
|
|
223
|
+
for (let i = 0; i < rigs.length; i++) {
|
|
224
|
+
const rig_id = manager.register_foliage_rig(rigs[i]);
|
|
225
|
+
if (weight !== 1) {
|
|
226
|
+
manager.set_foliage_rig_weight(rig_id, weight);
|
|
227
|
+
}
|
|
228
|
+
rig_ids[i] = rig_id;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
entry.context = context;
|
|
232
|
+
entry.rig_ids = rig_ids;
|
|
233
|
+
entry.written_weight = weight;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* @param {FoliageWindEntry} entry
|
|
238
|
+
*/
|
|
239
|
+
#unregister(entry) {
|
|
240
|
+
if (entry.context === null || entry.rig_ids === null) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (entry.context === this.#graphics.scene_context(this.#scene)) {
|
|
245
|
+
const manager = entry.context.animation_manager;
|
|
246
|
+
const rig_ids = entry.rig_ids;
|
|
247
|
+
|
|
248
|
+
for (let i = 0; i < rig_ids.length; i++) {
|
|
249
|
+
manager.unregister_foliage_rig(rig_ids[i]);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
entry.context = null;
|
|
254
|
+
entry.rig_ids = null;
|
|
255
|
+
entry.written_weight = NaN;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
@@ -114,6 +114,13 @@ export const GPU_FLUID_SYSTEM_TICK_CAP: number;
|
|
|
114
114
|
* releases everything, rows included. At a fixed scene, nothing is created after the first frame.
|
|
115
115
|
*/
|
|
116
116
|
export class GPUFluidSystem extends System<any> {
|
|
117
|
+
/**
|
|
118
|
+
* Offer the compute pipelines the GPU fluid cascades, forcing, and query readback dispatch —
|
|
119
|
+
* see {@link PipelineEnquiry}.
|
|
120
|
+
*
|
|
121
|
+
* @param {import("../../shade/device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
|
|
122
|
+
*/
|
|
123
|
+
static enquirePipelines(enquiry: import("../../shade/device/pipeline/PipelineEnquiry.js").PipelineEnquiry): void;
|
|
117
124
|
/**
|
|
118
125
|
* @param {import("./GraphicsEngine.js").GraphicsEngine} graphics
|
|
119
126
|
* @param {import("../../shade/renderer/scene/Scene.js").Scene} scene the scene whose wind this is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUFluidSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/GPUFluidSystem.js"],"names":[],"mappings":"AAyCA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,wCAFU,MAAM,CAE2B;AAmG3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AACH;
|
|
1
|
+
{"version":3,"file":"GPUFluidSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/GPUFluidSystem.js"],"names":[],"mappings":"AAyCA;;;;;;;GAOG;AAEH;;;;;;GAMG;AACH,wCAFU,MAAM,CAE2B;AAmG3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AACH;IAEI;;;;;OAKG;IACH,iCAFW,OAAO,gDAAgD,EAAE,eAAe,QAMlF;IAyID;;;OAGG;IACH,sBAHW,OAAO,qBAAqB,EAAE,cAAc,SAC5C,OAAO,qCAAqC,EAAE,KAAK,EAU7D;IAnJD,gEAAgD;IAEhD,oOAME;IA6IF;;OAEG;IACH,iEAEC;IAED;;;;;OAKG;IACH,qBAEC;IAED;;;;;OAKG;IACH,kCAEC;IAED;;;;;OAKG;IACH,+BAEC;IAED;;;;;OAKG;IACH,iCAEC;IAED;;;;;;OAMG;IACH,eAFW,YAAY,GAAC,YAAY,GAAC,MAAM,EAAE,QAQ5C;IAED;;;;;;;;;;OAUG;IACH,yBAEC;IAED;;;;;OAKG;IACH,+BAEC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,eAbW,MAAM,SACN,MAAM,SACN,MAAM,SACN,MAAM,SACN,MAAM,SACN,MAAM,WACN,MAAM,WACN,MAAM,WACN,MAAM,UACN,YAAY,iBACZ,MAAM,GACJ,MAAM,CA+ClB;IAmMD,2CAoBC;IAED,4CAaC;IA6CD;;;;OAIG;IACH,gBAJW,iBAAiB,aACjB,WAAW,UACX,MAAM,QAOhB;IAED;;;;OAIG;IACH,kBAJW,iBAAiB,aACjB,WAAW,UACX,MAAM,QAiBhB;IAqiBD;;;;;OAKG;IACH,eAFW,YAAY,QAetB;IAkKL;;;;;;;OAOG;IACH,2BAFU,OAAO,CAEwB;;CAVxC;AAYD;;;GAGG;AACH;IAII;;OAEG;IACH,oBAFW,cAAc,EAMxB;IADG,uBAAoB;CAkB3B;8BAxkDY,OAAO,+CAA+C,EAAE,eAAe;2BACvE,OAAO,gDAAgD,EAAE,YAAY;oCACrE,OAAO,oDAAoD,EAAE,qBAAqB;kCAClF,OAAO,kEAAkE,EAAE,mBAAmB;kCAC9F,OAAO,2DAA2D,EAAE,mBAAmB;8BACvF,OAAO,6CAA6C,EAAE,eAAe;uBAjC3D,kBAAkB;4BACb,iCAAiC;kCAWtD,2CAA2C;wCARV,iDAAiD;4CAf7C,iDAAiD;8BAiB/D,uCAAuC;yBAJ5C,4BAA4B;0BAC3B,6BAA6B;qCARlB,oDAAoD;gCADzD,uDAAuD;gCAE5B,qDAAqD;gCAJhF,mDAAmD"}
|
|
@@ -255,6 +255,18 @@ class ObstacleEntry {
|
|
|
255
255
|
*/
|
|
256
256
|
export class GPUFluidSystem extends System {
|
|
257
257
|
|
|
258
|
+
/**
|
|
259
|
+
* Offer the compute pipelines the GPU fluid cascades, forcing, and query readback dispatch —
|
|
260
|
+
* see {@link PipelineEnquiry}.
|
|
261
|
+
*
|
|
262
|
+
* @param {import("../../shade/device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
|
|
263
|
+
*/
|
|
264
|
+
static enquirePipelines(enquiry) {
|
|
265
|
+
GPUFluidCascadeStack.enquirePipelines(enquiry);
|
|
266
|
+
GPUFluidForcing.enquirePipelines(enquiry);
|
|
267
|
+
GPUFluidQueries.enquirePipelines(enquiry);
|
|
268
|
+
}
|
|
269
|
+
|
|
258
270
|
dependencies = [GPUFluidComponent, Transform64];
|
|
259
271
|
|
|
260
272
|
components_used = [
|
|
@@ -1077,9 +1089,26 @@ export class GPUFluidSystem extends System {
|
|
|
1077
1089
|
assert.isPositiveInteger(cascade_count, 'GPUFluidComponent.cascade_count');
|
|
1078
1090
|
assert.lessThanOrEqual(cascade_count, GPU_FLUID_COMPONENT_CASCADE_LIMIT, 'GPUFluidComponent.cascade_count');
|
|
1079
1091
|
|
|
1080
|
-
const
|
|
1092
|
+
const graphics = this.#graphics.renderer.graphics;
|
|
1093
|
+
const device = graphics.device;
|
|
1081
1094
|
|
|
1082
1095
|
if (this.#forcing === null) {
|
|
1096
|
+
if (graphics.compute_pipelines !== undefined) {
|
|
1097
|
+
const enquiry = /** @type {import("../../shade/device/pipeline/PipelineEnquiry.js").PipelineEnquiry} */ ({
|
|
1098
|
+
device,
|
|
1099
|
+
render: [],
|
|
1100
|
+
compute: [],
|
|
1101
|
+
});
|
|
1102
|
+
|
|
1103
|
+
GPUFluidSystem.enquirePipelines(enquiry);
|
|
1104
|
+
|
|
1105
|
+
const compute = enquiry.compute;
|
|
1106
|
+
|
|
1107
|
+
for (let i = 0; i < compute.length; i++) {
|
|
1108
|
+
graphics.compute_pipelines.prepare(compute[i]);
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1083
1112
|
this.#forcing = new GPUFluidForcing({ device });
|
|
1084
1113
|
}
|
|
1085
1114
|
|
|
@@ -1610,4 +1639,13 @@ export class GPUFluidExtension extends RenderExtension {
|
|
|
1610
1639
|
record(frame) {
|
|
1611
1640
|
this.system.prepare(frame);
|
|
1612
1641
|
}
|
|
1642
|
+
|
|
1643
|
+
/**
|
|
1644
|
+
* @param {import("../../shade/device/pipeline/PipelineEnquiry.js").PipelineEnquiry} enquiry
|
|
1645
|
+
*/
|
|
1646
|
+
enquirePipelines(enquiry) {
|
|
1647
|
+
if (this.system.domain !== -1) {
|
|
1648
|
+
GPUFluidSystem.enquirePipelines(enquiry);
|
|
1649
|
+
}
|
|
1650
|
+
}
|
|
1613
1651
|
}
|
|
@@ -232,5 +232,4 @@ import { ParticleEmitter } from "../../shade/renderer/particles/runtime/Particle
|
|
|
232
232
|
import { ParticleEffect } from "../graphics/ecs/particles/ParticleEffect.js";
|
|
233
233
|
import { System } from "../ecs/System.js";
|
|
234
234
|
import { Transform64 } from "../ecs/transform/Transform64.js";
|
|
235
|
-
import { TextureAtlas } from "../graphics/texture/atlas/TextureAtlas.js";
|
|
236
235
|
//# sourceMappingURL=GPUParticleEmitterSystem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GPUParticleEmitterSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/GPUParticleEmitterSystem.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GPUParticleEmitterSystem.d.ts","sourceRoot":"","sources":["../../../../src/engine/graphics3/GPUParticleEmitterSystem.js"],"names":[],"mappings":"AAo0BA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,+CAJW,eAAe,UACf,cAAc,GACZ,OAAO,CAiFnB;AA94BD;;;;GAIG;AAEH;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH;IAoDI;;;;;OAKG;IACH,sBALW,OAAO,qBAAqB,EAAE,cAAc,SAC5C,OAAO,qCAAqC,EAAE,KAAK,gEAgB7D;IArED,6DAA6C;IAE7C;;;OAGG;IACH,oBAAsD;IAiEtD;;;;;;OAMG;IACH,iEAEC;IAED;;;;;OAKG;IACH,kCAEC;IAED;;;;;;;;;;OAUG;IACH,mBAJW,MAAM,GACJ,eAAe,GAAC,IAAI,CAWhC;IAED;;;;;;;;;;;OAWG;IACH,cAHW,MAAM,SACN,MAAM,QA4BhB;IA6BD,+BAA+B;IAC/B,YADc,QAAQ,IAAI,CAAC,CAyB1B;IAED;;;;OAIG;IACH,aAJW,cAAc,aACd,WAAW,UACX,MAAM,QAqChB;IAED;;;;OAIG;IACH,eAJW,cAAc,aACd,WAAW,UACX,MAAM,QAIhB;IAED;;;;;;;OAOG;IACH,4BAHW,MAAM,GACJ,IAAI,CAgBhB;IAoCD;;;;;;;;;;;;OAYG;IACH,eAHW,OAAO,gDAAgD,EAAE,YAAY,GACnE,IAAI,CAqChB;;CA6WJ;;;;;gBApyBa,MAAM;;;;WACN,OAAO,yCAAyC,EAAE,UAAU,GAAC,IAAI;;;YAKjE,MAAM;;;;YACN,cAAc;;;;eACd,WAAW;;;;aACX,eAAe,GAAC,IAAI;;;;;aACpB,OAAO,+CAA+C,EAAE,eAAe,GAAC,IAAI;gCAGjE,IAAI;;;;SACf,MAAM,GAAC,IAAI;;;;aACX,oBAAoB,GAAC,IAAI;;gCAzCP,2DAA2D;+BAS5D,6CAA6C;uBAPrD,kBAAkB;4BAEb,iCAAiC"}
|
|
@@ -12,7 +12,9 @@ import { row_of_entity } from "../../shade/renderer/scene/rows/GPUSceneRows.js";
|
|
|
12
12
|
import { GameAssetType } from "../asset/GameAssetType.js";
|
|
13
13
|
import { ImageRGBADataLoader } from "../asset/loaders/image/ImageRGBADataLoader.js";
|
|
14
14
|
import { ParticleEffect } from "../graphics/ecs/particles/ParticleEffect.js";
|
|
15
|
-
import {
|
|
15
|
+
import { DecalAtlas } from "./decal/DecalAtlas.js";
|
|
16
|
+
import { DecalAtlasFill } from "./decal/DecalAtlasFill.js";
|
|
17
|
+
import { TextureFilterType } from "../../shade/renderer/texture/TextureFilterType.js";
|
|
16
18
|
import { Sampler2D } from "../graphics/texture/sampler/Sampler2D.js";
|
|
17
19
|
import { sampler2d_ensure_uint8_RGBA } from "../graphics/texture/sampler/sampler2d_ensure_uint8_RGBA.js";
|
|
18
20
|
|
|
@@ -107,7 +109,7 @@ export class GPUParticleEmitterSystem extends System {
|
|
|
107
109
|
* CPU atlas, exposed for inspection. Owned by this system.
|
|
108
110
|
* @type {TextureAtlas}
|
|
109
111
|
*/
|
|
110
|
-
atlas = new
|
|
112
|
+
atlas = new DecalAtlas(DecalAtlasFill.EdgeExtend, 64);
|
|
111
113
|
|
|
112
114
|
/** @type {import("./GraphicsEngine.js").GraphicsEngine} */
|
|
113
115
|
#graphics;
|
|
@@ -459,7 +461,7 @@ export class GPUParticleEmitterSystem extends System {
|
|
|
459
461
|
|
|
460
462
|
this.#register(particles, frame.view.scene);
|
|
461
463
|
|
|
462
|
-
this.#upload(renderer.graphics
|
|
464
|
+
this.#upload(renderer.graphics);
|
|
463
465
|
|
|
464
466
|
particles.atlas = this.#view;
|
|
465
467
|
|
|
@@ -767,7 +769,8 @@ export class GPUParticleEmitterSystem extends System {
|
|
|
767
769
|
* @param {GPUDevice} device
|
|
768
770
|
* @returns {void}
|
|
769
771
|
*/
|
|
770
|
-
#upload(
|
|
772
|
+
#upload(graphics) {
|
|
773
|
+
const device = graphics.device;
|
|
771
774
|
const source = this.atlas.sampler;
|
|
772
775
|
|
|
773
776
|
if (this.#device !== device || this.#texture === null) {
|
|
@@ -780,7 +783,9 @@ export class GPUParticleEmitterSystem extends System {
|
|
|
780
783
|
|
|
781
784
|
descriptor.label = "particles/sprite atlas";
|
|
782
785
|
descriptor.format = "rgba8unorm";
|
|
783
|
-
descriptor.usage = GPUTextureUsage.TEXTURE_BINDING
|
|
786
|
+
descriptor.usage = GPUTextureUsage.TEXTURE_BINDING
|
|
787
|
+
| GPUTextureUsage.COPY_DST
|
|
788
|
+
| GPUTextureUsage.RENDER_ATTACHMENT;
|
|
784
789
|
|
|
785
790
|
this.#uploaded_version = -1;
|
|
786
791
|
}
|
|
@@ -788,6 +793,7 @@ export class GPUParticleEmitterSystem extends System {
|
|
|
788
793
|
const texture = this.#texture;
|
|
789
794
|
|
|
790
795
|
if (texture.width !== source.width || texture.height !== source.height) {
|
|
796
|
+
texture.descriptor.mipLevelCount = 1 + Math.floor(Math.log2(Math.max(source.width, source.height)));
|
|
791
797
|
texture.resize(source.width, source.height);
|
|
792
798
|
|
|
793
799
|
this.#uploaded_version = -1;
|
|
@@ -797,6 +803,14 @@ export class GPUParticleEmitterSystem extends System {
|
|
|
797
803
|
device.queue.writeTexture({ texture: texture.gpu_texture }, source.data,
|
|
798
804
|
{ bytesPerRow: source.width * 4 }, [source.width, source.height]);
|
|
799
805
|
|
|
806
|
+
if (texture.descriptor.mipLevelCount > 1) {
|
|
807
|
+
graphics.textures.mipmaps.generateMipmap(
|
|
808
|
+
texture.gpu_texture,
|
|
809
|
+
texture.descriptor,
|
|
810
|
+
TextureFilterType.Linear
|
|
811
|
+
);
|
|
812
|
+
}
|
|
813
|
+
|
|
800
814
|
texture.incrementVersion();
|
|
801
815
|
|
|
802
816
|
this.#uploaded_version = source.version;
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* The clips this entity can play: each a {@link ShadeAnimationClip} whose channels key entities —
|
|
6
|
-
* the joints of a rig, the nodes of a loaded model.
|
|
2
|
+
* The clips this entity can play — each a {@link ShadeAnimationClip} whose channels key entities
|
|
3
|
+
* (the joints of a rig, the nodes of a loaded model) — and the playback sink where whichever driver
|
|
4
|
+
* plays them writes what each weighs and where it is playing this tick.
|
|
7
5
|
*
|
|
8
6
|
* **It lives on the entity that plays them**, beside its `Animation` or `AnimationGraphController`.
|
|
9
7
|
* A clip is one clock over many targets and describes no single one of them, so it is not a
|
|
10
8
|
* component on a joint. `AnimationSystem` and `AnimationGraphSystem` resolve the names their lists
|
|
11
|
-
* and graphs ask for against this set
|
|
12
|
-
*
|
|
9
|
+
* and graphs ask for against this set and write the resulting blend back onto it; the GPU clip
|
|
10
|
+
* uploader and the CPU pose consumers (IK, ContactProbe, cloth, `query_entity_node_world_pose`)
|
|
11
|
+
* read from here without caring which driver produced the blend.
|
|
13
12
|
*
|
|
14
13
|
* **Not `Animation.clips`.** That list says what to play — a name, a weight, a repeat count each;
|
|
15
|
-
* this says what there is to play
|
|
16
|
-
*
|
|
14
|
+
* this says what there is to play, what each of those does to which entity, and where the active
|
|
15
|
+
* driver has placed each clip this frame.
|
|
17
16
|
*
|
|
18
17
|
* A model loaded by `MeshSystem` carries one on its root, re-addressed to the entities of that
|
|
19
18
|
* placement; code that builds a rig puts one there the same way. A model with no clips carries an
|
|
@@ -23,10 +22,10 @@
|
|
|
23
22
|
* clip, take the component off and put another on, which the drivers see as their entity leaving
|
|
24
23
|
* and coming back.
|
|
25
24
|
*
|
|
26
|
-
* **The entities it keys go no sooner than it does.** While it is
|
|
27
|
-
* every entity a channel keys, as a skin holds its joints'. Removing one of them means
|
|
28
|
-
* off before the next frame — `prefab_instance_destroy` removes the entities and then
|
|
29
|
-
* one step — or the scene is left holding the row of an entity that is gone.
|
|
25
|
+
* **The entities it keys go no sooner than it does.** While it is bound, the driver's sink holds a
|
|
26
|
+
* row for every entity a channel keys, as a skin holds its joints'. Removing one of them means
|
|
27
|
+
* taking this off before the next frame — `prefab_instance_destroy` removes the entities and then
|
|
28
|
+
* the clips, in one step — or the scene is left holding the row of an entity that is gone.
|
|
30
29
|
*
|
|
31
30
|
* **Not saved**, for the reason `MeshSkin` is not: the channels key entities that whatever builds
|
|
32
31
|
* the rig creates, and the curves are asset data. A load rebuilds them the way it rebuilds the rig.
|
|
@@ -47,6 +46,99 @@ export class AnimationClips {
|
|
|
47
46
|
* @type {ShadeAnimationClip[]}
|
|
48
47
|
*/
|
|
49
48
|
clips: ShadeAnimationClip[];
|
|
49
|
+
/**
|
|
50
|
+
* Whether a driver currently has these clips bound. `false` before the driver's first `update`
|
|
51
|
+
* after `link`, and `false` again once the driver unlinks or shuts down.
|
|
52
|
+
*
|
|
53
|
+
* @type {boolean}
|
|
54
|
+
*/
|
|
55
|
+
bound: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Distinct indices into {@link clips} that the active driver plays (and registers on the GPU),
|
|
58
|
+
* in the driver's own order.
|
|
59
|
+
*
|
|
60
|
+
* Maintained here rather than alongside the GPU registration because **the pose evaluator needs
|
|
61
|
+
* it whether or not there is a device**: `collect_entity_playbacks` answers on the CPU from the
|
|
62
|
+
* clips the driver plays, and a game with rendering disabled still asks (I-4).
|
|
63
|
+
*
|
|
64
|
+
* @type {Int32Array}
|
|
65
|
+
*/
|
|
66
|
+
played_slots: Int32Array;
|
|
67
|
+
/**
|
|
68
|
+
* What each of {@link clips} weighs this tick, in {@link clips}' order and at `f32` width — the
|
|
69
|
+
* width the renderer's clip table takes, so the CPU pose evaluator and the GPU agree on every
|
|
70
|
+
* share.
|
|
71
|
+
*
|
|
72
|
+
* @type {Float32Array}
|
|
73
|
+
*/
|
|
74
|
+
weights: Float32Array;
|
|
75
|
+
/**
|
|
76
|
+
* Where each of {@link clips} is playing this tick, in seconds from its start, in {@link clips}'
|
|
77
|
+
* order.
|
|
78
|
+
*
|
|
79
|
+
* @type {Float64Array}
|
|
80
|
+
*/
|
|
81
|
+
times: Float64Array;
|
|
82
|
+
/**
|
|
83
|
+
* One reusable {@link PosePlayback} per entry of {@link clips}, rewritten by
|
|
84
|
+
* {@link write_pose_playbacks} so per-frame CPU pose queries allocate nothing.
|
|
85
|
+
*
|
|
86
|
+
* @type {PosePlayback[]}
|
|
87
|
+
*/
|
|
88
|
+
poses: PosePlayback[];
|
|
89
|
+
/**
|
|
90
|
+
* The active GPU registration for {@link played_slots}, or `null` when no device context has
|
|
91
|
+
* registered them yet.
|
|
92
|
+
*
|
|
93
|
+
* @type {ClipRegistration|null}
|
|
94
|
+
*/
|
|
95
|
+
clip_registration: ClipRegistration | null;
|
|
96
|
+
/**
|
|
97
|
+
* The weight each entry of {@link clips} was last given on the GPU (`-1` where not yet written
|
|
98
|
+
* to the current registration).
|
|
99
|
+
*
|
|
100
|
+
* @type {Float32Array}
|
|
101
|
+
*/
|
|
102
|
+
written: Float32Array;
|
|
103
|
+
/**
|
|
104
|
+
* Prepare the playback buffers when a driver takes up these clips.
|
|
105
|
+
*/
|
|
106
|
+
bind(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Clear the playback state when the driver releases these clips.
|
|
109
|
+
*/
|
|
110
|
+
unbind(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Update which of {@link clips} the driver plays, deduplicated in order of first appearance.
|
|
113
|
+
*
|
|
114
|
+
* Two entries of a clip list or two states of a graph can name one clip, and it is one row on
|
|
115
|
+
* the GPU either way — registered once, and reported to the pose evaluator once.
|
|
116
|
+
*
|
|
117
|
+
* @param {ArrayLike<number>} slots indices into {@link clips}
|
|
118
|
+
* @returns {boolean} whether the distinct set changed
|
|
119
|
+
*/
|
|
120
|
+
set_played_slots(slots: ArrayLike<number>): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* What the entity is playing, in the form the CPU pose evaluator takes: one entry per clip of
|
|
123
|
+
* {@link clips} in {@link played_slots}, at the weight and the time the renderer has been given.
|
|
124
|
+
*
|
|
125
|
+
* **Only the clips the driver names are here, because they are the only ones registered** (D37).
|
|
126
|
+
* The GPU's accumulator marks a joint dirty for every bound clip that writes to it, weight and
|
|
127
|
+
* all — so a bound clip at weight zero resolves the joints only it drives to zero rather than
|
|
128
|
+
* leaving them at rest. The answer is not to hand the surplus to the evaluator so it agrees
|
|
129
|
+
* with a mistake; it is not to bind them, and then a clip nothing names moves nothing.
|
|
130
|
+
*
|
|
131
|
+
* A clip the driver names that is not currently playing **is** here, at weight zero, because it
|
|
132
|
+
* is bound and the accumulator does see it.
|
|
133
|
+
*
|
|
134
|
+
* The entries are this component's own and are rewritten by the next call, which is what keeps
|
|
135
|
+
* a query on a per-frame path from allocating.
|
|
136
|
+
*
|
|
137
|
+
* @param {PosePlayback[]} target appended to
|
|
138
|
+
* @returns {boolean} whether a driver has bound these clips — `false` when no driver is playing
|
|
139
|
+
* them, or when they arrived since the driver's last update
|
|
140
|
+
*/
|
|
141
|
+
write_pose_playbacks(target: PosePlayback[]): boolean;
|
|
50
142
|
/**
|
|
51
143
|
* @readonly
|
|
52
144
|
* @type {boolean}
|
|
@@ -58,4 +150,6 @@ export namespace AnimationClips {
|
|
|
58
150
|
let serializable: boolean;
|
|
59
151
|
}
|
|
60
152
|
export type ShadeAnimationClip = import("../../../shade/renderer/animation/ShadeAnimationClip.js").ShadeAnimationClip;
|
|
153
|
+
export type ClipRegistration = import("../register_clips.js").ClipRegistration;
|
|
154
|
+
import { PosePlayback } from "../../../shade/renderer/animation/pose/PosePlayback.js";
|
|
61
155
|
//# sourceMappingURL=AnimationClips.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnimationClips.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/animation/AnimationClips.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AnimationClips.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics3/animation/AnimationClips.js"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH;IAsEI;;;OAGG;IACH,mBAHW,kBAAkB,EAAE,GAClB,cAAc,CAc1B;IArFD;;;;;OAKG;IACH,OAFU,kBAAkB,EAAE,CAEnB;IAEX;;;;;OAKG;IACH,OAFU,OAAO,CAEH;IAEd;;;;;;;;;OASG;IACH,cAFU,UAAU,CAEO;IAE3B;;;;;;OAMG;IACH,SAFU,YAAY,CAEE;IAExB;;;;;OAKG;IACH,OAFU,YAAY,CAEF;IAEpB;;;;;OAKG;IACH,OAFU,YAAY,EAAE,CAEb;IAEX;;;;;OAKG;IACH,mBAFU,gBAAgB,GAAC,IAAI,CAEN;IAEzB;;;;;OAKG;IACH,SAFU,YAAY,CAEE;IAoBxB;;OAEG;IACH,aAWC;IAED;;OAEG;IACH,eAQC;IAED;;;;;;;;OAQG;IACH,wBAHW,UAAU,MAAM,CAAC,GACf,OAAO,CAsCnB;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,6BAJW,YAAY,EAAE,GACZ,OAAO,CA0BnB;IAGL;;;OAGG;IACH,2BAFU,OAAO,CAEwB;CANxC;;kBAUS,MAAM;sBAMN,OAAO;;iCAlRJ,OAAO,yDAAyD,EAAE,kBAAkB;+BACpF,OAAO,sBAAsB,EAAE,gBAAgB;6BAJ/B,wDAAwD"}
|