@zephyr3d/scene 0.9.26 → 0.10.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/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import { Vector3, DRef, DEBUG_VIEWS } from '@zephyr3d/base';
|
|
2
|
+
import { getDevice } from '../app/api.js';
|
|
3
|
+
import { ShaderHelper } from '../material/shader/helper.js';
|
|
4
|
+
|
|
5
|
+
const tmpViewPos = new Vector3();
|
|
6
|
+
/** Threads of one workgroup, culling the instances of one batch */ const WORKGROUP_SIZE = 64;
|
|
7
|
+
/** vec4s in the instance data uniform buffer */ const INSTANCE_DATA_VEC4S = 65536 >> 4;
|
|
8
|
+
/**
|
|
9
|
+
* Fewest vec4s an instance takes in the instance data, its world and previous world matrices and
|
|
10
|
+
* framestamp. Instances start at least this far apart, so their vec4 offset divided by it numbers
|
|
11
|
+
* them, which indexes their bounds.
|
|
12
|
+
*/ const MIN_INSTANCE_VEC4S = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET;
|
|
13
|
+
const MAX_BOUNDS_SLOTS = Math.ceil(INSTANCE_DATA_VEC4S / MIN_INSTANCE_VEC4S);
|
|
14
|
+
/** Most instances one batch can hold */ const MAX_BATCH_INSTANCES = MAX_BOUNDS_SLOTS;
|
|
15
|
+
/**
|
|
16
|
+
* Most batches one instance bind group holds, each instance taking at least MIN_INSTANCE_VEC4S.
|
|
17
|
+
* Batch descriptors are read from a uniform buffer, since loop bounds around workgroup barriers
|
|
18
|
+
* must be uniform, which values read from storage buffers are not.
|
|
19
|
+
*/ const MAX_BATCHES = 512;
|
|
20
|
+
/** uint32 in the indirect arguments of one draw: indexCount, instanceCount, firstIndex, baseVertex, firstInstance */ const ARGS_U32 = 5;
|
|
21
|
+
/** vec4s describing one batch, see CullGroup.batches */ const BATCH_VEC4S = 4;
|
|
22
|
+
/** Most levels of detail a batch selects among, MAX_MESH_LODS */ const MAX_LODS = 8;
|
|
23
|
+
/** Sets of arguments: the solid ones, and with debug views those of the wireframe edges */ const EDGE_ARGS_SETS = DEBUG_VIEWS ? 2 : 1;
|
|
24
|
+
/**
|
|
25
|
+
* Frustum culling of the instances of batched draws on the GPU, for render queues whose batches
|
|
26
|
+
* are recorded once and replayed (BatchGroup).
|
|
27
|
+
*
|
|
28
|
+
* @remarks
|
|
29
|
+
* Such a queue serves every view it is pushed to (main camera, every shadow cascade and cube
|
|
30
|
+
* face) and replays render bundles recorded once, so what a view sees cannot be baked into the
|
|
31
|
+
* draws. Instead each batch draws indirectly from arguments and instance data that a compute pass
|
|
32
|
+
* fills for the view right before its draws: every instance's local bounds, transformed by the
|
|
33
|
+
* world matrix in its instance data, are tested against the planes of the view's cull camera the
|
|
34
|
+
* same way {@link CullVisitor} tests bounding boxes on the CPU, and the instances left are packed,
|
|
35
|
+
* in order, into a copy of the instance data. Vertex shaders and materials read it as usual.
|
|
36
|
+
*
|
|
37
|
+
* WebGPU only.
|
|
38
|
+
*
|
|
39
|
+
* @internal
|
|
40
|
+
*/ class InstanceCuller {
|
|
41
|
+
static _program = null;
|
|
42
|
+
static _planes = new Float32Array(24);
|
|
43
|
+
static _params = new Float32Array(4);
|
|
44
|
+
static _lodView = new Float32Array(4);
|
|
45
|
+
static _lodParams = new Float32Array(4);
|
|
46
|
+
_groups;
|
|
47
|
+
_args;
|
|
48
|
+
_argsCapacity;
|
|
49
|
+
/** Bounds slot of each instance, by drawable */ _slots;
|
|
50
|
+
_lastParent;
|
|
51
|
+
_lastFrame;
|
|
52
|
+
constructor(){
|
|
53
|
+
this._groups = new Map();
|
|
54
|
+
this._args = new DRef();
|
|
55
|
+
this._argsCapacity = 0;
|
|
56
|
+
this._slots = new Map();
|
|
57
|
+
this._lastParent = null;
|
|
58
|
+
this._lastFrame = -1;
|
|
59
|
+
}
|
|
60
|
+
/** Whether the device can cull instances on the GPU */ static isSupported() {
|
|
61
|
+
const device = getDevice();
|
|
62
|
+
return device.type === 'webgpu' && !!device.getDeviceCaps().miscCaps.supportDrawIndirect;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Whether culling also selects the level of detail of each instance of a drawable, which then
|
|
66
|
+
* joins one batch with all its levels rather than one batch per level. Needs indirect draws to
|
|
67
|
+
* start at a level's first instance, and levels, which are index ranges.
|
|
68
|
+
*/ static selectsLod(drawable) {
|
|
69
|
+
const primitive = drawable.getPrimitive();
|
|
70
|
+
return !!primitive && primitive.lodCount > 1 && !!primitive.getIndexBuffer() && !!getDevice().getDeviceCaps().miscCaps.supportIndirectFirstInstance;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Set the batches up for culling after the queue built them.
|
|
74
|
+
*
|
|
75
|
+
* @param items - Instanced batches of the queue
|
|
76
|
+
* @param instanceInfo - Instance data block of each batched drawable
|
|
77
|
+
*/ rebuild(items, instanceInfo) {
|
|
78
|
+
const device = getDevice();
|
|
79
|
+
this._slots.clear();
|
|
80
|
+
this._lastParent = null;
|
|
81
|
+
const used = new Set();
|
|
82
|
+
const batchData = new Map();
|
|
83
|
+
const lodCounts = items.map((item)=>InstanceCuller.selectsLod(item.drawable) ? item.drawable.getPrimitive().lodCount : 1);
|
|
84
|
+
const argsCount = lodCounts.reduce((sum, n)=>sum + n, 0);
|
|
85
|
+
// Also allocated with no batches, the arguments of a group whose meshes are not batched yet
|
|
86
|
+
if (!this._args.get() || argsCount > this._argsCapacity) {
|
|
87
|
+
this._argsCapacity = Math.max(argsCount, this._argsCapacity * 2, 16);
|
|
88
|
+
// Solid arguments, then with debug views the edge arguments of wireframe draws at the same
|
|
89
|
+
// index plus capacity
|
|
90
|
+
this._args.set(device.createBuffer(this._argsCapacity * EDGE_ARGS_SETS * ARGS_U32 * 4, {
|
|
91
|
+
usage: 'indirect',
|
|
92
|
+
storage: true
|
|
93
|
+
}));
|
|
94
|
+
// Groups bind the arguments buffer, so they are rebound below
|
|
95
|
+
for (const group of this._groups.values()){
|
|
96
|
+
group.computeBindGroup.dispose();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const args = new Uint32Array(this._argsCapacity * EDGE_ARGS_SETS * ARGS_U32);
|
|
100
|
+
let argsBase = 0;
|
|
101
|
+
items.forEach((item, index)=>{
|
|
102
|
+
const data = item.instanceData;
|
|
103
|
+
const primitive = item.drawable.getPrimitive();
|
|
104
|
+
const lodCount = lodCounts[index];
|
|
105
|
+
const base = argsBase;
|
|
106
|
+
argsBase += lodCount;
|
|
107
|
+
if (!primitive) {
|
|
108
|
+
data.culled = null;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const group = this.getGroup(data.bindGroup);
|
|
112
|
+
used.add(group);
|
|
113
|
+
// The one level chosen on the CPU, or every level of the primitive for culling to choose from
|
|
114
|
+
for(let level = 0; level < lodCount; level++){
|
|
115
|
+
const [first, count] = primitive.getLodRange(lodCount > 1 ? level : item.lod ?? 0);
|
|
116
|
+
args[(base + level) * ARGS_U32] = count;
|
|
117
|
+
args[(base + level) * ARGS_U32 + 2] = first;
|
|
118
|
+
}
|
|
119
|
+
let batches = batchData.get(group);
|
|
120
|
+
if (!batches) {
|
|
121
|
+
batches = [];
|
|
122
|
+
batchData.set(group, batches);
|
|
123
|
+
}
|
|
124
|
+
const sizes = new Array(MAX_LODS).fill(0);
|
|
125
|
+
if (lodCount > 1) {
|
|
126
|
+
primitive.lods.forEach((lod, i)=>sizes[i] = lod.screenSize);
|
|
127
|
+
}
|
|
128
|
+
batches.push(data.offset >> 2, data.numInstances, data.stride >> 2, base, lodCount, 0, 0, 0, ...sizes);
|
|
129
|
+
data.culled = {
|
|
130
|
+
bindGroup: group.outputBindGroup.get(),
|
|
131
|
+
argsBuffer: this._args.get(),
|
|
132
|
+
argsOffset: base * ARGS_U32 * 4,
|
|
133
|
+
lodCount,
|
|
134
|
+
primitive,
|
|
135
|
+
edgeArgsOffset: DEBUG_VIEWS ? (this._argsCapacity + base) * ARGS_U32 * 4 : -1
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
this._args.get().bufferSubData(0, args);
|
|
139
|
+
for (const [group, batches] of batchData){
|
|
140
|
+
group.batchCount = batches.length / (BATCH_VEC4S * 4);
|
|
141
|
+
if (!group.batches.get()) {
|
|
142
|
+
group.batches.set(device.createBuffer(MAX_BATCHES * BATCH_VEC4S * 16, {
|
|
143
|
+
usage: 'uniform'
|
|
144
|
+
}));
|
|
145
|
+
group.computeBindGroup.dispose();
|
|
146
|
+
}
|
|
147
|
+
group.batches.get().bufferSubData(0, new Float32Array(batches));
|
|
148
|
+
}
|
|
149
|
+
for (const [key, group] of this._groups){
|
|
150
|
+
if (!used.has(group)) {
|
|
151
|
+
this.releaseGroup(group);
|
|
152
|
+
this._groups.delete(key);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const [drawable, info] of instanceInfo){
|
|
156
|
+
const group = this._groups.get(info.bindGroup);
|
|
157
|
+
if (group) {
|
|
158
|
+
const entry = {
|
|
159
|
+
group,
|
|
160
|
+
slot: Math.floor(info.offset / 4 / MIN_INSTANCE_VEC4S)
|
|
161
|
+
};
|
|
162
|
+
this._slots.set(drawable, entry);
|
|
163
|
+
this.writeBounds(drawable, entry);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** Have the local bounds of a batched drawable uploaded again before the next culling */ markBoundsDirty(drawable) {
|
|
168
|
+
const entry = this._slots.get(drawable);
|
|
169
|
+
if (entry) {
|
|
170
|
+
this.writeBounds(drawable, entry);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Cull the batches for the view a queue was culled for, unless they were last culled for it.
|
|
175
|
+
* Levels of detail are selected for the queue's level of detail camera, the main camera in a
|
|
176
|
+
* shadow view.
|
|
177
|
+
*
|
|
178
|
+
* @param parent - Queue of the view, which this queue was pushed to
|
|
179
|
+
*/ cull(parent) {
|
|
180
|
+
const camera = parent.cullCamera;
|
|
181
|
+
if (!camera || this._groups.size === 0) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
const frame = getDevice().frameInfo.frameCounter;
|
|
185
|
+
if (this._lastParent === parent && this._lastFrame === frame) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
this._lastParent = parent;
|
|
189
|
+
this._lastFrame = frame;
|
|
190
|
+
this.setPlanes(camera);
|
|
191
|
+
this.setLodView(parent.lodCamera ?? camera);
|
|
192
|
+
const device = getDevice();
|
|
193
|
+
const program = InstanceCuller.getProgram();
|
|
194
|
+
for (const group of this._groups.values()){
|
|
195
|
+
if (group.batchCount === 0) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (group.boundsDirty) {
|
|
199
|
+
group.bounds.get().bufferSubData(0, group.boundsData);
|
|
200
|
+
group.boundsDirty = false;
|
|
201
|
+
}
|
|
202
|
+
let bindGroup = group.computeBindGroup.get();
|
|
203
|
+
if (!bindGroup) {
|
|
204
|
+
bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);
|
|
205
|
+
bindGroup.setBuffer('src', group.source.bindGroup.getBuffer(ShaderHelper.getInstanceDataUniformName()));
|
|
206
|
+
bindGroup.setBuffer('dst', group.output.get());
|
|
207
|
+
bindGroup.setBuffer('bounds', group.bounds.get());
|
|
208
|
+
bindGroup.setBuffer('batches', group.batches.get());
|
|
209
|
+
bindGroup.setBuffer('args', this._args.get());
|
|
210
|
+
group.computeBindGroup.set(bindGroup);
|
|
211
|
+
}
|
|
212
|
+
InstanceCuller._params[0] = group.batchCount;
|
|
213
|
+
InstanceCuller._params[1] = this._argsCapacity;
|
|
214
|
+
bindGroup.setValue('params', InstanceCuller._params);
|
|
215
|
+
bindGroup.setValue('planes', InstanceCuller._planes);
|
|
216
|
+
bindGroup.setValue('lodView', InstanceCuller._lodView);
|
|
217
|
+
bindGroup.setValue('lodParams', InstanceCuller._lodParams);
|
|
218
|
+
device.setProgram(program);
|
|
219
|
+
device.setBindGroup(0, bindGroup);
|
|
220
|
+
device.compute(group.batchCount, 1, 1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** Release all GPU resources */ dispose() {
|
|
224
|
+
for (const group of this._groups.values()){
|
|
225
|
+
this.releaseGroup(group);
|
|
226
|
+
}
|
|
227
|
+
this._groups.clear();
|
|
228
|
+
this._slots.clear();
|
|
229
|
+
this._args.dispose();
|
|
230
|
+
this._argsCapacity = 0;
|
|
231
|
+
}
|
|
232
|
+
/** Planes of the cull camera, those masked out by it made ones everything is inside of */ setPlanes(camera) {
|
|
233
|
+
const planes = InstanceCuller._planes;
|
|
234
|
+
const frustumPlanes = camera.frustum.planes;
|
|
235
|
+
const mask = camera.clipMask || 0x3f;
|
|
236
|
+
for(let i = 0; i < 6; i++){
|
|
237
|
+
const p = frustumPlanes[i];
|
|
238
|
+
const enabled = !!(mask & 1 << i);
|
|
239
|
+
planes[i * 4] = enabled ? p.a : 0;
|
|
240
|
+
planes[i * 4 + 1] = enabled ? p.b : 0;
|
|
241
|
+
planes[i * 4 + 2] = enabled ? p.c : 0;
|
|
242
|
+
planes[i * 4 + 3] = enabled ? p.d : 1e30;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/** View position and projection scale the levels of detail are measured with, as computeBoundsScreenRadiusSquared */ setLodView(camera) {
|
|
246
|
+
const pos = camera.getWorldPosition(tmpViewPos);
|
|
247
|
+
const proj = camera.getProjectionMatrix();
|
|
248
|
+
const view = InstanceCuller._lodView;
|
|
249
|
+
view[0] = pos.x;
|
|
250
|
+
view[1] = pos.y;
|
|
251
|
+
view[2] = pos.z;
|
|
252
|
+
view[3] = camera.isPerspective() ? 1 : 0;
|
|
253
|
+
const params = InstanceCuller._lodParams;
|
|
254
|
+
params[0] = Math.max(0.5 * Math.abs(proj.m00), 0.5 * Math.abs(proj.m11));
|
|
255
|
+
params[1] = camera.lodDistanceScale;
|
|
256
|
+
}
|
|
257
|
+
writeBounds(drawable, entry) {
|
|
258
|
+
const node = drawable.getNode();
|
|
259
|
+
const bv = node.clipTestEnabled ? node.getBoundingVolume()?.toAABB() ?? null : null;
|
|
260
|
+
const data = entry.group.boundsData;
|
|
261
|
+
const o = entry.slot * 8;
|
|
262
|
+
if (bv) {
|
|
263
|
+
const min = bv.minPoint;
|
|
264
|
+
const max = bv.maxPoint;
|
|
265
|
+
data[o] = (min.x + max.x) * 0.5;
|
|
266
|
+
data[o + 1] = (min.y + max.y) * 0.5;
|
|
267
|
+
data[o + 2] = (min.z + max.z) * 0.5;
|
|
268
|
+
data[o + 3] = 0;
|
|
269
|
+
data[o + 4] = (max.x - min.x) * 0.5;
|
|
270
|
+
data[o + 5] = (max.y - min.y) * 0.5;
|
|
271
|
+
data[o + 6] = (max.z - min.z) * 0.5;
|
|
272
|
+
} else {
|
|
273
|
+
// No bounds, or clip testing turned off for the node: always drawn
|
|
274
|
+
data[o + 3] = 1;
|
|
275
|
+
}
|
|
276
|
+
const mesh = node.isMesh() ? node : null;
|
|
277
|
+
const forcedLod = mesh?.forcedLod ?? -1;
|
|
278
|
+
data[o + 7] = forcedLod >= 0 ? -(forcedLod + 1) : mesh?.minLod ?? 0;
|
|
279
|
+
entry.group.boundsDirty = true;
|
|
280
|
+
}
|
|
281
|
+
getGroup(source) {
|
|
282
|
+
let group = this._groups.get(source);
|
|
283
|
+
if (!group) {
|
|
284
|
+
const device = getDevice();
|
|
285
|
+
const output = device.createBuffer(INSTANCE_DATA_VEC4S * 16, {
|
|
286
|
+
usage: 'uniform',
|
|
287
|
+
storage: true
|
|
288
|
+
});
|
|
289
|
+
const outputBindGroup = device.createBindGroup(source.bindGroup.getLayout());
|
|
290
|
+
outputBindGroup.setBuffer(ShaderHelper.getInstanceDataUniformName(), output);
|
|
291
|
+
const boundsData = new Float32Array(MAX_BOUNDS_SLOTS * 8);
|
|
292
|
+
group = {
|
|
293
|
+
source,
|
|
294
|
+
output: new DRef(output),
|
|
295
|
+
outputBindGroup: new DRef(outputBindGroup),
|
|
296
|
+
bounds: new DRef(device.createBuffer(boundsData.byteLength, {
|
|
297
|
+
usage: 'uniform',
|
|
298
|
+
storage: true
|
|
299
|
+
})),
|
|
300
|
+
boundsData,
|
|
301
|
+
boundsDirty: true,
|
|
302
|
+
batches: new DRef(),
|
|
303
|
+
batchCount: 0,
|
|
304
|
+
computeBindGroup: new DRef()
|
|
305
|
+
};
|
|
306
|
+
this._groups.set(source, group);
|
|
307
|
+
}
|
|
308
|
+
return group;
|
|
309
|
+
}
|
|
310
|
+
releaseGroup(group) {
|
|
311
|
+
group.output.dispose();
|
|
312
|
+
group.outputBindGroup.dispose();
|
|
313
|
+
group.bounds.dispose();
|
|
314
|
+
group.batches.dispose();
|
|
315
|
+
group.computeBindGroup.dispose();
|
|
316
|
+
}
|
|
317
|
+
static getProgram() {
|
|
318
|
+
if (!this._program) {
|
|
319
|
+
this._program = getDevice().buildComputeProgram({
|
|
320
|
+
label: 'InstanceCulling',
|
|
321
|
+
workgroupSize: [
|
|
322
|
+
WORKGROUP_SIZE,
|
|
323
|
+
1,
|
|
324
|
+
1
|
|
325
|
+
],
|
|
326
|
+
compute (pb) {
|
|
327
|
+
// (batch count, index of the edge arguments of the first draw, unused, unused)
|
|
328
|
+
this.params = pb.vec4().uniform(0);
|
|
329
|
+
this.planes = pb.vec4[6]().uniform(0);
|
|
330
|
+
// Level of detail view: (position, 1 if perspective), (screen multiple, distance scale, 0, 0)
|
|
331
|
+
this.lodView = pb.vec4().uniform(0);
|
|
332
|
+
this.lodParams = pb.vec4().uniform(0);
|
|
333
|
+
this.src = pb.vec4[INSTANCE_DATA_VEC4S]().uniformBuffer(0);
|
|
334
|
+
this.dst = pb.vec4[0]().storageBuffer(0);
|
|
335
|
+
this.bounds = pb.vec4[0]().storageBufferReadonly(0);
|
|
336
|
+
this.batches = pb.vec4[MAX_BATCHES * BATCH_VEC4S]().uniformBuffer(0);
|
|
337
|
+
this.args = pb.uint[0]().storageBuffer(0);
|
|
338
|
+
this.visibility = pb.uint[MAX_BATCH_INSTANCES]().workgroup();
|
|
339
|
+
this.position = pb.uint[MAX_BATCH_INSTANCES]().workgroup();
|
|
340
|
+
// Visible instances per level, then where the next instance of each level goes
|
|
341
|
+
this.levelCount = pb.uint[MAX_LODS]().workgroup();
|
|
342
|
+
this.levelNext = pb.uint[MAX_LODS]().workgroup();
|
|
343
|
+
pb.func('classify', [
|
|
344
|
+
pb.uint('base'),
|
|
345
|
+
pb.uint('batchIndex')
|
|
346
|
+
], function() {
|
|
347
|
+
this.$l.slot = pb.div(this.base, MIN_INSTANCE_VEC4S);
|
|
348
|
+
this.$l.center = this.bounds.at(pb.mul(this.slot, 2));
|
|
349
|
+
this.$l.visible = true;
|
|
350
|
+
this.$l.extent4 = this.bounds.at(pb.add(pb.mul(this.slot, 2), 1));
|
|
351
|
+
this.$l.extent = this.extent4.xyz;
|
|
352
|
+
// World matrix by columns, the first four vec4s of the instance
|
|
353
|
+
this.$l.c0 = this.src.at(this.base).xyz;
|
|
354
|
+
this.$l.c1 = this.src.at(pb.add(this.base, 1)).xyz;
|
|
355
|
+
this.$l.c2 = this.src.at(pb.add(this.base, 2)).xyz;
|
|
356
|
+
this.$l.c3 = this.src.at(pb.add(this.base, 3)).xyz;
|
|
357
|
+
this.$l.wc = pb.add(pb.mul(this.c0, this.center.x), pb.mul(this.c1, this.center.y), pb.mul(this.c2, this.center.z), this.c3);
|
|
358
|
+
this.$l.we = pb.add(pb.mul(pb.abs(this.c0), this.extent.x), pb.mul(pb.abs(this.c1), this.extent.y), pb.mul(pb.abs(this.c2), this.extent.z));
|
|
359
|
+
this.$for(pb.int('i'), 0, 6, function() {
|
|
360
|
+
this.$l.p = this.planes.at(this.i);
|
|
361
|
+
this.$if(pb.lessThan(pb.add(pb.dot(this.p.xyz, this.wc), pb.dot(pb.abs(this.p.xyz), this.we), this.p.w), 0), function() {
|
|
362
|
+
this.visible = false;
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
// Always drawn without bounds
|
|
366
|
+
this.visible = pb.or(this.visible, pb.greaterThan(this.center.w, 0));
|
|
367
|
+
this.$l.lodCount = pb.int(this.batches.at(pb.add(this.batchIndex, 1)).x);
|
|
368
|
+
this.$l.limit = pb.int(this.extent4.w);
|
|
369
|
+
this.$l.level = pb.int(0);
|
|
370
|
+
this.$if(pb.lessThan(this.limit, 0), function() {
|
|
371
|
+
// Forced level
|
|
372
|
+
this.level = pb.min(pb.sub(pb.neg(this.limit), 1), pb.sub(this.lodCount, 1));
|
|
373
|
+
}).$else(function() {
|
|
374
|
+
this.$l.toView = pb.sub(this.wc, this.lodView.xyz);
|
|
375
|
+
this.$l.distSq = pb.select(pb.float(1), pb.max(pb.dot(this.toView, this.toView), 1e-4), pb.greaterThan(this.lodView.w, 0));
|
|
376
|
+
this.$l.screenRadius = pb.mul(this.lodParams.x, pb.length(this.we));
|
|
377
|
+
this.$l.r2 = pb.div(pb.mul(this.screenRadius, this.screenRadius), this.distSq);
|
|
378
|
+
this.$l.sizes0 = this.batches.at(pb.add(this.batchIndex, 2));
|
|
379
|
+
this.$l.sizes1 = this.batches.at(pb.add(this.batchIndex, 3));
|
|
380
|
+
// Sizes shrink level by level, so the last level still larger than the projected
|
|
381
|
+
// size is the coarsest one, the first ComputeStaticMeshLOD finds from the end
|
|
382
|
+
this.$l.size1 = pb.mul(this.sizes0.x, this.lodParams.y);
|
|
383
|
+
this.$if(pb.and(pb.lessThan(1, this.lodCount), pb.greaterThan(pb.mul(pb.mul(this.size1, this.size1), 0.25), this.r2)), function() {
|
|
384
|
+
this.level = 1;
|
|
385
|
+
});
|
|
386
|
+
this.$l.size2 = pb.mul(this.sizes0.y, this.lodParams.y);
|
|
387
|
+
this.$if(pb.and(pb.lessThan(2, this.lodCount), pb.greaterThan(pb.mul(pb.mul(this.size2, this.size2), 0.25), this.r2)), function() {
|
|
388
|
+
this.level = 2;
|
|
389
|
+
});
|
|
390
|
+
this.$l.size3 = pb.mul(this.sizes0.z, this.lodParams.y);
|
|
391
|
+
this.$if(pb.and(pb.lessThan(3, this.lodCount), pb.greaterThan(pb.mul(pb.mul(this.size3, this.size3), 0.25), this.r2)), function() {
|
|
392
|
+
this.level = 3;
|
|
393
|
+
});
|
|
394
|
+
this.$l.size4 = pb.mul(this.sizes0.w, this.lodParams.y);
|
|
395
|
+
this.$if(pb.and(pb.lessThan(4, this.lodCount), pb.greaterThan(pb.mul(pb.mul(this.size4, this.size4), 0.25), this.r2)), function() {
|
|
396
|
+
this.level = 4;
|
|
397
|
+
});
|
|
398
|
+
this.$l.size5 = pb.mul(this.sizes1.x, this.lodParams.y);
|
|
399
|
+
this.$if(pb.and(pb.lessThan(5, this.lodCount), pb.greaterThan(pb.mul(pb.mul(this.size5, this.size5), 0.25), this.r2)), function() {
|
|
400
|
+
this.level = 5;
|
|
401
|
+
});
|
|
402
|
+
this.$l.size6 = pb.mul(this.sizes1.y, this.lodParams.y);
|
|
403
|
+
this.$if(pb.and(pb.lessThan(6, this.lodCount), pb.greaterThan(pb.mul(pb.mul(this.size6, this.size6), 0.25), this.r2)), function() {
|
|
404
|
+
this.level = 6;
|
|
405
|
+
});
|
|
406
|
+
this.$l.size7 = pb.mul(this.sizes1.z, this.lodParams.y);
|
|
407
|
+
this.$if(pb.and(pb.lessThan(7, this.lodCount), pb.greaterThan(pb.mul(pb.mul(this.size7, this.size7), 0.25), this.r2)), function() {
|
|
408
|
+
this.level = 7;
|
|
409
|
+
});
|
|
410
|
+
// Without bounds there is no projected size: the finest level allowed
|
|
411
|
+
this.$if(pb.greaterThan(this.center.w, 0), function() {
|
|
412
|
+
this.level = 0;
|
|
413
|
+
});
|
|
414
|
+
this.level = pb.max(this.level, pb.min(this.limit, pb.sub(this.lodCount, 1)));
|
|
415
|
+
});
|
|
416
|
+
this.$return(pb.select(pb.uint(0), pb.add(pb.uint(this.level), 1), this.visible));
|
|
417
|
+
});
|
|
418
|
+
pb.main(function() {
|
|
419
|
+
this.$l.lid = this.$builtins.localInvocationId.x;
|
|
420
|
+
this.$l.batchIndex = pb.mul(this.$builtins.workGroupId.x, BATCH_VEC4S);
|
|
421
|
+
this.$l.batch = this.batches.at(this.batchIndex);
|
|
422
|
+
this.$l.first = pb.uint(this.batch.x);
|
|
423
|
+
this.$l.count = pb.uint(this.batch.y);
|
|
424
|
+
this.$l.stride = pb.uint(this.batch.z);
|
|
425
|
+
this.$l.argsBase = pb.uint(this.batch.w);
|
|
426
|
+
this.$l.lodCount = pb.uint(this.batches.at(pb.add(this.batchIndex, 1)).x);
|
|
427
|
+
this.$l.chunks = pb.div(pb.add(this.count, WORKGROUP_SIZE - 1), WORKGROUP_SIZE);
|
|
428
|
+
// Barriers stay at the top level of the entry point, where control flow is
|
|
429
|
+
// uniform: the loops around them read bounds from buffers WGSL takes for non-uniform
|
|
430
|
+
this.$for(pb.uint('c'), 0, this.chunks, function() {
|
|
431
|
+
this.$l.k = pb.add(pb.mul(this.c, WORKGROUP_SIZE), this.lid);
|
|
432
|
+
this.$if(pb.lessThan(this.k, this.count), function() {
|
|
433
|
+
this.visibility.setAt(this.k, this.classify(pb.add(this.first, pb.mul(this.k, this.stride)), this.batchIndex));
|
|
434
|
+
});
|
|
435
|
+
});
|
|
436
|
+
pb.workgroupBarrier();
|
|
437
|
+
// Order preserving positions of the visible instances, a few hundred at most, grouped
|
|
438
|
+
// by level: the instances of a level follow those of the finer levels, and each level
|
|
439
|
+
// draws from its own arguments, starting at its first instance
|
|
440
|
+
this.$if(pb.equal(this.lid, 0), function() {
|
|
441
|
+
this.$for(pb.uint('l'), 0, MAX_LODS, function() {
|
|
442
|
+
this.levelCount.setAt(this.l, 0);
|
|
443
|
+
});
|
|
444
|
+
this.$for(pb.uint('i'), 0, this.count, function() {
|
|
445
|
+
this.$l.v = this.visibility.at(this.i);
|
|
446
|
+
this.$if(pb.notEqual(this.v, 0), function() {
|
|
447
|
+
this.$l.lv = pb.sub(this.v, 1);
|
|
448
|
+
this.levelCount.setAt(this.lv, pb.add(this.levelCount.at(this.lv), 1));
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
this.$l.start = pb.uint(0);
|
|
452
|
+
this.$for(pb.uint('l'), 0, this.lodCount, function() {
|
|
453
|
+
this.$l.a = pb.mul(pb.add(this.argsBase, this.l), ARGS_U32);
|
|
454
|
+
this.args.setAt(pb.add(this.a, 1), this.levelCount.at(this.l));
|
|
455
|
+
this.args.setAt(pb.add(this.a, 4), this.start);
|
|
456
|
+
if (DEBUG_VIEWS) {
|
|
457
|
+
// The same instances for the wireframe edges, whose index buffer holds 6 edge
|
|
458
|
+
// indices per triangle, twice the triangle indices
|
|
459
|
+
this.$l.e = pb.add(this.a, pb.mul(pb.uint(this.params.y), ARGS_U32));
|
|
460
|
+
this.args.setAt(this.e, pb.mul(this.args.at(this.a), 2));
|
|
461
|
+
this.args.setAt(pb.add(this.e, 1), this.levelCount.at(this.l));
|
|
462
|
+
this.args.setAt(pb.add(this.e, 2), pb.mul(this.args.at(pb.add(this.a, 2)), 2));
|
|
463
|
+
this.args.setAt(pb.add(this.e, 4), this.start);
|
|
464
|
+
}
|
|
465
|
+
this.levelNext.setAt(this.l, this.start);
|
|
466
|
+
this.start = pb.add(this.start, this.levelCount.at(this.l));
|
|
467
|
+
});
|
|
468
|
+
this.$for(pb.uint('i'), 0, this.count, function() {
|
|
469
|
+
this.$l.v = this.visibility.at(this.i);
|
|
470
|
+
this.$if(pb.notEqual(this.v, 0), function() {
|
|
471
|
+
this.$l.lv = pb.sub(this.v, 1);
|
|
472
|
+
this.position.setAt(this.i, this.levelNext.at(this.lv));
|
|
473
|
+
this.levelNext.setAt(this.lv, pb.add(this.levelNext.at(this.lv), 1));
|
|
474
|
+
});
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
pb.workgroupBarrier();
|
|
478
|
+
this.$for(pb.uint('c'), 0, this.chunks, function() {
|
|
479
|
+
this.$l.k = pb.add(pb.mul(this.c, WORKGROUP_SIZE), this.lid);
|
|
480
|
+
this.$if(pb.lessThan(this.k, this.count), function() {
|
|
481
|
+
this.$if(pb.notEqual(this.visibility.at(this.k), 0), function() {
|
|
482
|
+
this.$l.src0 = pb.add(this.first, pb.mul(this.k, this.stride));
|
|
483
|
+
this.$l.dst0 = pb.add(this.first, pb.mul(this.position.at(this.k), this.stride));
|
|
484
|
+
this.$for(pb.uint('j'), 0, this.stride, function() {
|
|
485
|
+
this.dst.setAt(pb.add(this.dst0, this.j), this.src.at(pb.add(this.src0, this.j)));
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
return this._program;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
export { InstanceCuller };
|
|
499
|
+
//# sourceMappingURL=instance_culling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance_culling.js","sources":["../../src/render/instance_culling.ts"],"sourcesContent":["import { DEBUG_VIEWS, DRef } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { BindGroup, GPUDataBuffer, GPUProgram } from '@zephyr3d/device';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport { getDevice } from '../app/api';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Drawable } from './drawable';\r\nimport type { Primitive } from './primitive';\r\nimport type { CachedBindGroup, RenderQueue, RenderQueueItem } from './render_queue';\r\n\r\nconst tmpViewPos = new Vector3();\r\n\r\n/** Threads of one workgroup, culling the instances of one batch */\r\nconst WORKGROUP_SIZE = 64;\r\n/** vec4s in the instance data uniform buffer */\r\nconst INSTANCE_DATA_VEC4S = 65536 >> 4;\r\n/**\r\n * Fewest vec4s an instance takes in the instance data, its world and previous world matrices and\r\n * framestamp. Instances start at least this far apart, so their vec4 offset divided by it numbers\r\n * them, which indexes their bounds.\r\n */\r\nconst MIN_INSTANCE_VEC4S = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET;\r\nconst MAX_BOUNDS_SLOTS = Math.ceil(INSTANCE_DATA_VEC4S / MIN_INSTANCE_VEC4S);\r\n/** Most instances one batch can hold */\r\nconst MAX_BATCH_INSTANCES = MAX_BOUNDS_SLOTS;\r\n/**\r\n * Most batches one instance bind group holds, each instance taking at least MIN_INSTANCE_VEC4S.\r\n * Batch descriptors are read from a uniform buffer, since loop bounds around workgroup barriers\r\n * must be uniform, which values read from storage buffers are not.\r\n */\r\nconst MAX_BATCHES = 512;\r\n/** uint32 in the indirect arguments of one draw: indexCount, instanceCount, firstIndex, baseVertex, firstInstance */\r\nconst ARGS_U32 = 5;\r\n/** vec4s describing one batch, see CullGroup.batches */\r\nconst BATCH_VEC4S = 4;\r\n/** Most levels of detail a batch selects among, MAX_MESH_LODS */\r\nconst MAX_LODS = 8;\r\n/** Sets of arguments: the solid ones, and with debug views those of the wireframe edges */\r\nconst EDGE_ARGS_SETS = DEBUG_VIEWS ? 2 : 1;\r\n\r\n/**\r\n * Draw arguments of a batch whose instances are culled on the GPU.\r\n *\r\n * @public\r\n */\r\nexport interface InstanceCullingDraw {\r\n /** Group 3 bind group holding the instances left after culling, laid out as the source */\r\n bindGroup: BindGroup;\r\n /** Indirect draw arguments, the instance count written by culling */\r\n argsBuffer: GPUDataBuffer;\r\n /** Byte offset of the arguments of the first level */\r\n argsOffset: number;\r\n /**\r\n * Levels of detail the instances are spread over by culling, each drawn from its own arguments\r\n * following the first, 20 bytes apart; 1 when the level was chosen on the CPU\r\n */\r\n lodCount: number;\r\n /** Primitive the arguments draw */\r\n primitive: Primitive;\r\n /**\r\n * Byte offset of the arguments of the first level for the edges of the primitive in a wireframe\r\n * view, laid out as the solid ones: culling writes them with twice the index count and first\r\n * index, see Primitive.drawIndirect. -1 without debug views.\r\n */\r\n edgeArgsOffset: number;\r\n}\r\n\r\n/** Culling resources for the batches whose instance data lives in one instance bind group */\r\ninterface CullGroup {\r\n source: CachedBindGroup;\r\n /** Instance data left after culling, bound as the instance data uniform buffer when drawing */\r\n output: DRef<GPUDataBuffer>;\r\n outputBindGroup: DRef<BindGroup>;\r\n /**\r\n * Local bounds of the instances by slot: (center, always visible), (half extent, level of\r\n * detail limit: the finest level allowed, or -(level + 1) for a forced level)\r\n */\r\n bounds: DRef<GPUDataBuffer>;\r\n boundsData: Float32Array<ArrayBuffer>;\r\n boundsDirty: boolean;\r\n /**\r\n * Per batch, BATCH_VEC4S vec4s: (first vec4 of the instances, instance count, vec4s per\r\n * instance, index of the arguments of the first level), (level count, 0, 0, 0), then the screen\r\n * sizes of levels 1 to 7, the last component unused\r\n */\r\n batches: DRef<GPUDataBuffer>;\r\n batchCount: number;\r\n computeBindGroup: DRef<BindGroup>;\r\n}\r\n\r\n/**\r\n * Frustum culling of the instances of batched draws on the GPU, for render queues whose batches\r\n * are recorded once and replayed (BatchGroup).\r\n *\r\n * @remarks\r\n * Such a queue serves every view it is pushed to (main camera, every shadow cascade and cube\r\n * face) and replays render bundles recorded once, so what a view sees cannot be baked into the\r\n * draws. Instead each batch draws indirectly from arguments and instance data that a compute pass\r\n * fills for the view right before its draws: every instance's local bounds, transformed by the\r\n * world matrix in its instance data, are tested against the planes of the view's cull camera the\r\n * same way {@link CullVisitor} tests bounding boxes on the CPU, and the instances left are packed,\r\n * in order, into a copy of the instance data. Vertex shaders and materials read it as usual.\r\n *\r\n * WebGPU only.\r\n *\r\n * @internal\r\n */\r\nexport class InstanceCuller {\r\n private static _program: Nullable<GPUProgram> = null;\r\n private static readonly _planes = new Float32Array(24);\r\n private static readonly _params = new Float32Array(4);\r\n private static readonly _lodView = new Float32Array(4);\r\n private static readonly _lodParams = new Float32Array(4);\r\n private readonly _groups: Map<CachedBindGroup, CullGroup>;\r\n private readonly _args: DRef<GPUDataBuffer>;\r\n private _argsCapacity: number;\r\n /** Bounds slot of each instance, by drawable */\r\n private readonly _slots: Map<Drawable, { group: CullGroup; slot: number }>;\r\n private _lastParent: Nullable<RenderQueue>;\r\n private _lastFrame: number;\r\n constructor() {\r\n this._groups = new Map();\r\n this._args = new DRef();\r\n this._argsCapacity = 0;\r\n this._slots = new Map();\r\n this._lastParent = null;\r\n this._lastFrame = -1;\r\n }\r\n /** Whether the device can cull instances on the GPU */\r\n static isSupported() {\r\n const device = getDevice();\r\n return device.type === 'webgpu' && !!device.getDeviceCaps().miscCaps.supportDrawIndirect;\r\n }\r\n /**\r\n * Whether culling also selects the level of detail of each instance of a drawable, which then\r\n * joins one batch with all its levels rather than one batch per level. Needs indirect draws to\r\n * start at a level's first instance, and levels, which are index ranges.\r\n */\r\n static selectsLod(drawable: Drawable) {\r\n const primitive = drawable.getPrimitive();\r\n return (\r\n !!primitive &&\r\n primitive.lodCount > 1 &&\r\n !!primitive.getIndexBuffer() &&\r\n !!getDevice().getDeviceCaps().miscCaps.supportIndirectFirstInstance\r\n );\r\n }\r\n /**\r\n * Set the batches up for culling after the queue built them.\r\n *\r\n * @param items - Instanced batches of the queue\r\n * @param instanceInfo - Instance data block of each batched drawable\r\n */\r\n rebuild(\r\n items: RenderQueueItem[],\r\n instanceInfo: Map<Drawable, { bindGroup: CachedBindGroup; offset: number }>\r\n ) {\r\n const device = getDevice();\r\n this._slots.clear();\r\n this._lastParent = null;\r\n const used = new Set<CullGroup>();\r\n const batchData = new Map<CullGroup, number[]>();\r\n const lodCounts = items.map((item) =>\r\n InstanceCuller.selectsLod(item.drawable) ? item.drawable.getPrimitive()!.lodCount : 1\r\n );\r\n const argsCount = lodCounts.reduce((sum, n) => sum + n, 0);\r\n // Also allocated with no batches, the arguments of a group whose meshes are not batched yet\r\n if (!this._args.get() || argsCount > this._argsCapacity) {\r\n this._argsCapacity = Math.max(argsCount, this._argsCapacity * 2, 16);\r\n // Solid arguments, then with debug views the edge arguments of wireframe draws at the same\r\n // index plus capacity\r\n this._args.set(\r\n device.createBuffer(this._argsCapacity * EDGE_ARGS_SETS * ARGS_U32 * 4, {\r\n usage: 'indirect',\r\n storage: true\r\n })\r\n );\r\n // Groups bind the arguments buffer, so they are rebound below\r\n for (const group of this._groups.values()) {\r\n group.computeBindGroup.dispose();\r\n }\r\n }\r\n const args = new Uint32Array(this._argsCapacity * EDGE_ARGS_SETS * ARGS_U32);\r\n let argsBase = 0;\r\n items.forEach((item, index) => {\r\n const data = item.instanceData!;\r\n const primitive = item.drawable.getPrimitive();\r\n const lodCount = lodCounts[index];\r\n const base = argsBase;\r\n argsBase += lodCount;\r\n if (!primitive) {\r\n data.culled = null;\r\n return;\r\n }\r\n const group = this.getGroup(data.bindGroup);\r\n used.add(group);\r\n // The one level chosen on the CPU, or every level of the primitive for culling to choose from\r\n for (let level = 0; level < lodCount; level++) {\r\n const [first, count] = primitive.getLodRange(lodCount > 1 ? level : (item.lod ?? 0));\r\n args[(base + level) * ARGS_U32] = count;\r\n args[(base + level) * ARGS_U32 + 2] = first;\r\n }\r\n let batches = batchData.get(group);\r\n if (!batches) {\r\n batches = [];\r\n batchData.set(group, batches);\r\n }\r\n const sizes = new Array<number>(MAX_LODS).fill(0);\r\n if (lodCount > 1) {\r\n primitive.lods.forEach((lod, i) => (sizes[i] = lod.screenSize));\r\n }\r\n batches.push(data.offset >> 2, data.numInstances, data.stride >> 2, base, lodCount, 0, 0, 0, ...sizes);\r\n data.culled = {\r\n bindGroup: group.outputBindGroup.get()!,\r\n argsBuffer: this._args.get()!,\r\n argsOffset: base * ARGS_U32 * 4,\r\n lodCount,\r\n primitive,\r\n edgeArgsOffset: DEBUG_VIEWS ? (this._argsCapacity + base) * ARGS_U32 * 4 : -1\r\n };\r\n });\r\n this._args.get()!.bufferSubData(0, args);\r\n for (const [group, batches] of batchData) {\r\n group.batchCount = batches.length / (BATCH_VEC4S * 4);\r\n if (!group.batches.get()) {\r\n group.batches.set(device.createBuffer(MAX_BATCHES * BATCH_VEC4S * 16, { usage: 'uniform' }));\r\n group.computeBindGroup.dispose();\r\n }\r\n group.batches.get()!.bufferSubData(0, new Float32Array(batches));\r\n }\r\n for (const [key, group] of this._groups) {\r\n if (!used.has(group)) {\r\n this.releaseGroup(group);\r\n this._groups.delete(key);\r\n }\r\n }\r\n for (const [drawable, info] of instanceInfo) {\r\n const group = this._groups.get(info.bindGroup);\r\n if (group) {\r\n const entry = { group, slot: Math.floor(info.offset / 4 / MIN_INSTANCE_VEC4S) };\r\n this._slots.set(drawable, entry);\r\n this.writeBounds(drawable, entry);\r\n }\r\n }\r\n }\r\n /** Have the local bounds of a batched drawable uploaded again before the next culling */\r\n markBoundsDirty(drawable: Drawable) {\r\n const entry = this._slots.get(drawable);\r\n if (entry) {\r\n this.writeBounds(drawable, entry);\r\n }\r\n }\r\n /**\r\n * Cull the batches for the view a queue was culled for, unless they were last culled for it.\r\n * Levels of detail are selected for the queue's level of detail camera, the main camera in a\r\n * shadow view.\r\n *\r\n * @param parent - Queue of the view, which this queue was pushed to\r\n */\r\n cull(parent: RenderQueue) {\r\n const camera = parent.cullCamera;\r\n if (!camera || this._groups.size === 0) {\r\n return;\r\n }\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (this._lastParent === parent && this._lastFrame === frame) {\r\n return;\r\n }\r\n this._lastParent = parent;\r\n this._lastFrame = frame;\r\n this.setPlanes(camera);\r\n this.setLodView(parent.lodCamera ?? camera);\r\n const device = getDevice();\r\n const program = InstanceCuller.getProgram();\r\n for (const group of this._groups.values()) {\r\n if (group.batchCount === 0) {\r\n continue;\r\n }\r\n if (group.boundsDirty) {\r\n group.bounds.get()!.bufferSubData(0, group.boundsData);\r\n group.boundsDirty = false;\r\n }\r\n let bindGroup = group.computeBindGroup.get();\r\n if (!bindGroup) {\r\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n bindGroup.setBuffer(\r\n 'src',\r\n group.source.bindGroup.getBuffer(ShaderHelper.getInstanceDataUniformName())!\r\n );\r\n bindGroup.setBuffer('dst', group.output.get()!);\r\n bindGroup.setBuffer('bounds', group.bounds.get()!);\r\n bindGroup.setBuffer('batches', group.batches.get()!);\r\n bindGroup.setBuffer('args', this._args.get()!);\r\n group.computeBindGroup.set(bindGroup);\r\n }\r\n InstanceCuller._params[0] = group.batchCount;\r\n InstanceCuller._params[1] = this._argsCapacity;\r\n bindGroup.setValue('params', InstanceCuller._params);\r\n bindGroup.setValue('planes', InstanceCuller._planes);\r\n bindGroup.setValue('lodView', InstanceCuller._lodView);\r\n bindGroup.setValue('lodParams', InstanceCuller._lodParams);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n device.compute(group.batchCount, 1, 1);\r\n }\r\n }\r\n /** Release all GPU resources */\r\n dispose() {\r\n for (const group of this._groups.values()) {\r\n this.releaseGroup(group);\r\n }\r\n this._groups.clear();\r\n this._slots.clear();\r\n this._args.dispose();\r\n this._argsCapacity = 0;\r\n }\r\n /** Planes of the cull camera, those masked out by it made ones everything is inside of */\r\n private setPlanes(camera: Camera) {\r\n const planes = InstanceCuller._planes;\r\n const frustumPlanes = camera.frustum.planes;\r\n const mask = camera.clipMask || 0x3f;\r\n for (let i = 0; i < 6; i++) {\r\n const p = frustumPlanes[i];\r\n const enabled = !!(mask & (1 << i));\r\n planes[i * 4] = enabled ? p.a : 0;\r\n planes[i * 4 + 1] = enabled ? p.b : 0;\r\n planes[i * 4 + 2] = enabled ? p.c : 0;\r\n planes[i * 4 + 3] = enabled ? p.d : 1e30;\r\n }\r\n }\r\n /** View position and projection scale the levels of detail are measured with, as computeBoundsScreenRadiusSquared */\r\n private setLodView(camera: Camera) {\r\n const pos = camera.getWorldPosition(tmpViewPos);\r\n const proj = camera.getProjectionMatrix();\r\n const view = InstanceCuller._lodView;\r\n view[0] = pos.x;\r\n view[1] = pos.y;\r\n view[2] = pos.z;\r\n view[3] = camera.isPerspective() ? 1 : 0;\r\n const params = InstanceCuller._lodParams;\r\n params[0] = Math.max(0.5 * Math.abs(proj.m00), 0.5 * Math.abs(proj.m11));\r\n params[1] = camera.lodDistanceScale;\r\n }\r\n private writeBounds(drawable: Drawable, entry: { group: CullGroup; slot: number }) {\r\n const node = drawable.getNode();\r\n const bv = node.clipTestEnabled ? (node.getBoundingVolume()?.toAABB() ?? null) : null;\r\n const data = entry.group.boundsData;\r\n const o = entry.slot * 8;\r\n if (bv) {\r\n const min = bv.minPoint;\r\n const max = bv.maxPoint;\r\n data[o] = (min.x + max.x) * 0.5;\r\n data[o + 1] = (min.y + max.y) * 0.5;\r\n data[o + 2] = (min.z + max.z) * 0.5;\r\n data[o + 3] = 0;\r\n data[o + 4] = (max.x - min.x) * 0.5;\r\n data[o + 5] = (max.y - min.y) * 0.5;\r\n data[o + 6] = (max.z - min.z) * 0.5;\r\n } else {\r\n // No bounds, or clip testing turned off for the node: always drawn\r\n data[o + 3] = 1;\r\n }\r\n const mesh = (node.isMesh() ? node : null) as Nullable<Mesh>;\r\n const forcedLod = mesh?.forcedLod ?? -1;\r\n data[o + 7] = forcedLod >= 0 ? -(forcedLod + 1) : (mesh?.minLod ?? 0);\r\n entry.group.boundsDirty = true;\r\n }\r\n private getGroup(source: CachedBindGroup) {\r\n let group = this._groups.get(source);\r\n if (!group) {\r\n const device = getDevice();\r\n const output = device.createBuffer(INSTANCE_DATA_VEC4S * 16, { usage: 'uniform', storage: true });\r\n const outputBindGroup = device.createBindGroup(source.bindGroup.getLayout());\r\n outputBindGroup.setBuffer(ShaderHelper.getInstanceDataUniformName(), output);\r\n const boundsData = new Float32Array(MAX_BOUNDS_SLOTS * 8);\r\n group = {\r\n source,\r\n output: new DRef(output),\r\n outputBindGroup: new DRef(outputBindGroup),\r\n bounds: new DRef(device.createBuffer(boundsData.byteLength, { usage: 'uniform', storage: true })),\r\n boundsData,\r\n boundsDirty: true,\r\n batches: new DRef(),\r\n batchCount: 0,\r\n computeBindGroup: new DRef()\r\n };\r\n this._groups.set(source, group);\r\n }\r\n return group;\r\n }\r\n private releaseGroup(group: CullGroup) {\r\n group.output.dispose();\r\n group.outputBindGroup.dispose();\r\n group.bounds.dispose();\r\n group.batches.dispose();\r\n group.computeBindGroup.dispose();\r\n }\r\n private static getProgram() {\r\n if (!this._program) {\r\n this._program = getDevice().buildComputeProgram({\r\n label: 'InstanceCulling',\r\n workgroupSize: [WORKGROUP_SIZE, 1, 1],\r\n compute(pb) {\r\n // (batch count, index of the edge arguments of the first draw, unused, unused)\r\n this.params = pb.vec4().uniform(0);\r\n this.planes = pb.vec4[6]().uniform(0);\r\n // Level of detail view: (position, 1 if perspective), (screen multiple, distance scale, 0, 0)\r\n this.lodView = pb.vec4().uniform(0);\r\n this.lodParams = pb.vec4().uniform(0);\r\n this.src = pb.vec4[INSTANCE_DATA_VEC4S]().uniformBuffer(0);\r\n this.dst = pb.vec4[0]().storageBuffer(0);\r\n this.bounds = pb.vec4[0]().storageBufferReadonly(0);\r\n this.batches = pb.vec4[MAX_BATCHES * BATCH_VEC4S]().uniformBuffer(0);\r\n this.args = pb.uint[0]().storageBuffer(0);\r\n this.visibility = pb.uint[MAX_BATCH_INSTANCES]().workgroup();\r\n this.position = pb.uint[MAX_BATCH_INSTANCES]().workgroup();\r\n // Visible instances per level, then where the next instance of each level goes\r\n this.levelCount = pb.uint[MAX_LODS]().workgroup();\r\n this.levelNext = pb.uint[MAX_LODS]().workgroup();\r\n pb.func('classify', [pb.uint('base'), pb.uint('batchIndex')], function () {\r\n this.$l.slot = pb.div(this.base, MIN_INSTANCE_VEC4S);\r\n this.$l.center = this.bounds.at(pb.mul(this.slot, 2));\r\n this.$l.visible = true;\r\n this.$l.extent4 = this.bounds.at(pb.add(pb.mul(this.slot, 2), 1));\r\n this.$l.extent = this.extent4.xyz;\r\n // World matrix by columns, the first four vec4s of the instance\r\n this.$l.c0 = this.src.at(this.base).xyz;\r\n this.$l.c1 = this.src.at(pb.add(this.base, 1)).xyz;\r\n this.$l.c2 = this.src.at(pb.add(this.base, 2)).xyz;\r\n this.$l.c3 = this.src.at(pb.add(this.base, 3)).xyz;\r\n this.$l.wc = pb.add(\r\n pb.mul(this.c0, this.center.x),\r\n pb.mul(this.c1, this.center.y),\r\n pb.mul(this.c2, this.center.z),\r\n this.c3\r\n );\r\n this.$l.we = pb.add(\r\n pb.mul(pb.abs(this.c0), this.extent.x),\r\n pb.mul(pb.abs(this.c1), this.extent.y),\r\n pb.mul(pb.abs(this.c2), this.extent.z)\r\n );\r\n this.$for(pb.int('i'), 0, 6, function () {\r\n this.$l.p = this.planes.at(this.i);\r\n this.$if(\r\n pb.lessThan(\r\n pb.add(pb.dot(this.p.xyz, this.wc), pb.dot(pb.abs(this.p.xyz), this.we), this.p.w),\r\n 0\r\n ),\r\n function () {\r\n this.visible = false;\r\n }\r\n );\r\n });\r\n // Always drawn without bounds\r\n this.visible = pb.or(this.visible, pb.greaterThan(this.center.w, 0));\r\n this.$l.lodCount = pb.int(this.batches.at(pb.add(this.batchIndex, 1)).x);\r\n this.$l.limit = pb.int(this.extent4.w);\r\n this.$l.level = pb.int(0);\r\n this.$if(pb.lessThan(this.limit, 0), function () {\r\n // Forced level\r\n this.level = pb.min(pb.sub(pb.neg(this.limit), 1), pb.sub(this.lodCount, 1));\r\n }).$else(function () {\r\n this.$l.toView = pb.sub(this.wc, this.lodView.xyz);\r\n this.$l.distSq = pb.select(\r\n pb.float(1),\r\n pb.max(pb.dot(this.toView, this.toView), 1e-4),\r\n pb.greaterThan(this.lodView.w, 0)\r\n );\r\n this.$l.screenRadius = pb.mul(this.lodParams.x, pb.length(this.we));\r\n this.$l.r2 = pb.div(pb.mul(this.screenRadius, this.screenRadius), this.distSq);\r\n this.$l.sizes0 = this.batches.at(pb.add(this.batchIndex, 2));\r\n this.$l.sizes1 = this.batches.at(pb.add(this.batchIndex, 3));\r\n // Sizes shrink level by level, so the last level still larger than the projected\r\n // size is the coarsest one, the first ComputeStaticMeshLOD finds from the end\r\n this.$l.size1 = pb.mul(this.sizes0.x, this.lodParams.y);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(1, this.lodCount),\r\n pb.greaterThan(pb.mul(pb.mul(this.size1, this.size1), 0.25), this.r2)\r\n ),\r\n function () {\r\n this.level = 1;\r\n }\r\n );\r\n this.$l.size2 = pb.mul(this.sizes0.y, this.lodParams.y);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(2, this.lodCount),\r\n pb.greaterThan(pb.mul(pb.mul(this.size2, this.size2), 0.25), this.r2)\r\n ),\r\n function () {\r\n this.level = 2;\r\n }\r\n );\r\n this.$l.size3 = pb.mul(this.sizes0.z, this.lodParams.y);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(3, this.lodCount),\r\n pb.greaterThan(pb.mul(pb.mul(this.size3, this.size3), 0.25), this.r2)\r\n ),\r\n function () {\r\n this.level = 3;\r\n }\r\n );\r\n this.$l.size4 = pb.mul(this.sizes0.w, this.lodParams.y);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(4, this.lodCount),\r\n pb.greaterThan(pb.mul(pb.mul(this.size4, this.size4), 0.25), this.r2)\r\n ),\r\n function () {\r\n this.level = 4;\r\n }\r\n );\r\n this.$l.size5 = pb.mul(this.sizes1.x, this.lodParams.y);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(5, this.lodCount),\r\n pb.greaterThan(pb.mul(pb.mul(this.size5, this.size5), 0.25), this.r2)\r\n ),\r\n function () {\r\n this.level = 5;\r\n }\r\n );\r\n this.$l.size6 = pb.mul(this.sizes1.y, this.lodParams.y);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(6, this.lodCount),\r\n pb.greaterThan(pb.mul(pb.mul(this.size6, this.size6), 0.25), this.r2)\r\n ),\r\n function () {\r\n this.level = 6;\r\n }\r\n );\r\n this.$l.size7 = pb.mul(this.sizes1.z, this.lodParams.y);\r\n this.$if(\r\n pb.and(\r\n pb.lessThan(7, this.lodCount),\r\n pb.greaterThan(pb.mul(pb.mul(this.size7, this.size7), 0.25), this.r2)\r\n ),\r\n function () {\r\n this.level = 7;\r\n }\r\n );\r\n // Without bounds there is no projected size: the finest level allowed\r\n this.$if(pb.greaterThan(this.center.w, 0), function () {\r\n this.level = 0;\r\n });\r\n this.level = pb.max(this.level, pb.min(this.limit, pb.sub(this.lodCount, 1)));\r\n });\r\n this.$return(pb.select(pb.uint(0), pb.add(pb.uint(this.level), 1), this.visible));\r\n });\r\n pb.main(function () {\r\n this.$l.lid = this.$builtins.localInvocationId.x;\r\n this.$l.batchIndex = pb.mul(this.$builtins.workGroupId.x, BATCH_VEC4S);\r\n this.$l.batch = this.batches.at(this.batchIndex);\r\n this.$l.first = pb.uint(this.batch.x);\r\n this.$l.count = pb.uint(this.batch.y);\r\n this.$l.stride = pb.uint(this.batch.z);\r\n this.$l.argsBase = pb.uint(this.batch.w);\r\n this.$l.lodCount = pb.uint(this.batches.at(pb.add(this.batchIndex, 1)).x);\r\n this.$l.chunks = pb.div(pb.add(this.count, WORKGROUP_SIZE - 1), WORKGROUP_SIZE);\r\n // Barriers stay at the top level of the entry point, where control flow is\r\n // uniform: the loops around them read bounds from buffers WGSL takes for non-uniform\r\n this.$for(pb.uint('c'), 0, this.chunks, function () {\r\n this.$l.k = pb.add(pb.mul(this.c, WORKGROUP_SIZE), this.lid);\r\n this.$if(pb.lessThan(this.k, this.count), function () {\r\n this.visibility.setAt(\r\n this.k,\r\n this.classify(pb.add(this.first, pb.mul(this.k, this.stride)), this.batchIndex)\r\n );\r\n });\r\n });\r\n pb.workgroupBarrier();\r\n // Order preserving positions of the visible instances, a few hundred at most, grouped\r\n // by level: the instances of a level follow those of the finer levels, and each level\r\n // draws from its own arguments, starting at its first instance\r\n this.$if(pb.equal(this.lid, 0), function () {\r\n this.$for(pb.uint('l'), 0, MAX_LODS, function () {\r\n this.levelCount.setAt(this.l, 0);\r\n });\r\n this.$for(pb.uint('i'), 0, this.count, function () {\r\n this.$l.v = this.visibility.at(this.i);\r\n this.$if(pb.notEqual(this.v, 0), function () {\r\n this.$l.lv = pb.sub(this.v, 1);\r\n this.levelCount.setAt(this.lv, pb.add(this.levelCount.at(this.lv), 1));\r\n });\r\n });\r\n this.$l.start = pb.uint(0);\r\n this.$for(pb.uint('l'), 0, this.lodCount, function () {\r\n this.$l.a = pb.mul(pb.add(this.argsBase, this.l), ARGS_U32);\r\n this.args.setAt(pb.add(this.a, 1), this.levelCount.at(this.l));\r\n this.args.setAt(pb.add(this.a, 4), this.start);\r\n if (DEBUG_VIEWS) {\r\n // The same instances for the wireframe edges, whose index buffer holds 6 edge\r\n // indices per triangle, twice the triangle indices\r\n this.$l.e = pb.add(this.a, pb.mul(pb.uint(this.params.y), ARGS_U32));\r\n this.args.setAt(this.e, pb.mul(this.args.at(this.a), 2));\r\n this.args.setAt(pb.add(this.e, 1), this.levelCount.at(this.l));\r\n this.args.setAt(pb.add(this.e, 2), pb.mul(this.args.at(pb.add(this.a, 2)), 2));\r\n this.args.setAt(pb.add(this.e, 4), this.start);\r\n }\r\n this.levelNext.setAt(this.l, this.start);\r\n this.start = pb.add(this.start, this.levelCount.at(this.l));\r\n });\r\n this.$for(pb.uint('i'), 0, this.count, function () {\r\n this.$l.v = this.visibility.at(this.i);\r\n this.$if(pb.notEqual(this.v, 0), function () {\r\n this.$l.lv = pb.sub(this.v, 1);\r\n this.position.setAt(this.i, this.levelNext.at(this.lv));\r\n this.levelNext.setAt(this.lv, pb.add(this.levelNext.at(this.lv), 1));\r\n });\r\n });\r\n });\r\n pb.workgroupBarrier();\r\n this.$for(pb.uint('c'), 0, this.chunks, function () {\r\n this.$l.k = pb.add(pb.mul(this.c, WORKGROUP_SIZE), this.lid);\r\n this.$if(pb.lessThan(this.k, this.count), function () {\r\n this.$if(pb.notEqual(this.visibility.at(this.k), 0), function () {\r\n this.$l.src0 = pb.add(this.first, pb.mul(this.k, this.stride));\r\n this.$l.dst0 = pb.add(this.first, pb.mul(this.position.at(this.k), this.stride));\r\n this.$for(pb.uint('j'), 0, this.stride, function () {\r\n this.dst.setAt(pb.add(this.dst0, this.j), this.src.at(pb.add(this.src0, this.j)));\r\n });\r\n });\r\n });\r\n });\r\n });\r\n }\r\n })!;\r\n }\r\n return this._program;\r\n }\r\n}\r\n"],"names":["tmpViewPos","Vector3","WORKGROUP_SIZE","INSTANCE_DATA_VEC4S","MIN_INSTANCE_VEC4S","ShaderHelper","MATERIAL_INSTANCE_DATA_OFFSET","MAX_BOUNDS_SLOTS","Math","ceil","MAX_BATCH_INSTANCES","MAX_BATCHES","ARGS_U32","BATCH_VEC4S","MAX_LODS","EDGE_ARGS_SETS","DEBUG_VIEWS","InstanceCuller","_program","_planes","Float32Array","_params","_lodView","_lodParams","_groups","_args","_argsCapacity","_lastParent","_lastFrame","Map","DRef","_slots","isSupported","device","getDevice","type","getDeviceCaps","miscCaps","supportDrawIndirect","selectsLod","drawable","primitive","getPrimitive","lodCount","getIndexBuffer","supportIndirectFirstInstance","rebuild","items","instanceInfo","clear","used","Set","batchData","lodCounts","map","item","argsCount","reduce","sum","n","get","max","set","createBuffer","usage","storage","group","values","computeBindGroup","dispose","args","Uint32Array","argsBase","forEach","index","data","instanceData","base","culled","getGroup","bindGroup","add","level","first","count","getLodRange","lod","batches","sizes","Array","fill","lods","i","screenSize","push","offset","numInstances","stride","outputBindGroup","argsBuffer","argsOffset","edgeArgsOffset","bufferSubData","batchCount","length","key","has","releaseGroup","delete","info","entry","slot","floor","writeBounds","markBoundsDirty","cull","parent","camera","cullCamera","size","frame","frameInfo","frameCounter","setPlanes","setLodView","lodCamera","program","getProgram","boundsDirty","bounds","boundsData","createBindGroup","bindGroupLayouts","setBuffer","source","getBuffer","getInstanceDataUniformName","output","setValue","setProgram","setBindGroup","compute","planes","frustumPlanes","frustum","mask","clipMask","p","enabled","a","b","c","d","pos","getWorldPosition","proj","getProjectionMatrix","view","x","y","z","isPerspective","params","abs","m00","m11","lodDistanceScale","node","getNode","bv","clipTestEnabled","getBoundingVolume","toAABB","o","min","minPoint","maxPoint","mesh","isMesh","forcedLod","minLod","getLayout","byteLength","buildComputeProgram","label","workgroupSize","pb","vec4","uniform","lodView","lodParams","src","uniformBuffer","dst","storageBuffer","storageBufferReadonly","uint","visibility","workgroup","position","levelCount","levelNext","func","$l","div","center","at","mul","visible","extent4","extent","xyz","c0","c1","c2","c3","wc","we","$for","int","$if","lessThan","dot","w","or","greaterThan","batchIndex","limit","sub","neg","$else","toView","distSq","select","float","screenRadius","r2","sizes0","sizes1","size1","and","size2","size3","size4","size5","size6","size7","$return","main","lid","$builtins","localInvocationId","workGroupId","batch","chunks","k","setAt","classify","workgroupBarrier","equal","l","v","notEqual","lv","start","e","src0","dst0","j"],"mappings":";;;;AAYA,MAAMA,aAAa,IAAIC,OAAAA,EAAAA;AAEvB,oEACA,MAAMC,cAAiB,GAAA,EAAA;AACvB,iDACA,MAAMC,mBAAAA,GAAsB,KAAS,IAAA,CAAA;AACrC;;;;IAKA,MAAMC,kBAAqBC,GAAAA,YAAAA,CAAaC,6BAA6B;AACrE,MAAMC,gBAAmBC,GAAAA,IAAAA,CAAKC,IAAI,CAACN,mBAAsBC,GAAAA,kBAAAA,CAAAA;AACzD,yCACA,MAAMM,mBAAsBH,GAAAA,gBAAAA;AAC5B;;;;AAIC,IACD,MAAMI,WAAc,GAAA,GAAA;AACpB,sHACA,MAAMC,QAAW,GAAA,CAAA;AACjB,yDACA,MAAMC,WAAc,GAAA,CAAA;AACpB,kEACA,MAAMC,QAAW,GAAA,CAAA;AACjB,4FACA,MAAMC,cAAiBC,GAAAA,WAAAA,GAAc,CAAI,GAAA,CAAA;AAoDzC;;;;;;;;;;;;;;;;AAgBC,IACM,MAAMC,cAAAA,CAAAA;AACX,IAAA,OAAeC,WAAiC,IAAK;IACrD,OAAwBC,OAAAA,GAAU,IAAIC,YAAAA,CAAa,EAAI,CAAA;IACvD,OAAwBC,OAAAA,GAAU,IAAID,YAAAA,CAAa,CAAG,CAAA;IACtD,OAAwBE,QAAAA,GAAW,IAAIF,YAAAA,CAAa,CAAG,CAAA;IACvD,OAAwBG,UAAAA,GAAa,IAAIH,YAAAA,CAAa,CAAG,CAAA;IACxCI,OAAyC;IACzCC,KAA2B;IACpCC,aAAsB;qDAE9B,MAA2E;IACnEC,WAAmC;IACnCC,UAAmB;IAC3B,WAAc,EAAA;QACZ,IAAI,CAACJ,OAAO,GAAG,IAAIK,GAAAA,EAAAA;QACnB,IAAI,CAACJ,KAAK,GAAG,IAAIK,IAAAA,EAAAA;QACjB,IAAI,CAACJ,aAAa,GAAG,CAAA;QACrB,IAAI,CAACK,MAAM,GAAG,IAAIF,GAAAA,EAAAA;QAClB,IAAI,CAACF,WAAW,GAAG,IAAA;QACnB,IAAI,CAACC,UAAU,GAAG,EAAC;AACrB;4DAEA,OAAOI,WAAc,GAAA;AACnB,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;QACf,OAAOD,MAAAA,CAAOE,IAAI,KAAK,QAAY,IAAA,CAAC,CAACF,MAAAA,CAAOG,aAAa,EAAA,CAAGC,QAAQ,CAACC,mBAAmB;AAC1F;AACA;;;;MAKA,OAAOC,UAAWC,CAAAA,QAAkB,EAAE;QACpC,MAAMC,SAAAA,GAAYD,SAASE,YAAY,EAAA;AACvC,QAAA,OACE,CAAC,CAACD,SAAAA,IACFA,UAAUE,QAAQ,GAAG,KACrB,CAAC,CAACF,UAAUG,cAAc,EAAA,IAC1B,CAAC,CAACV,SAAAA,EAAAA,CAAYE,aAAa,EAAGC,CAAAA,QAAQ,CAACQ,4BAA4B;AAEvE;AACA;;;;;AAKC,MACDC,OACEC,CAAAA,KAAwB,EACxBC,YAA2E,EAC3E;AACA,QAAA,MAAMf,MAASC,GAAAA,SAAAA,EAAAA;QACf,IAAI,CAACH,MAAM,CAACkB,KAAK,EAAA;QACjB,IAAI,CAACtB,WAAW,GAAG,IAAA;AACnB,QAAA,MAAMuB,OAAO,IAAIC,GAAAA,EAAAA;AACjB,QAAA,MAAMC,YAAY,IAAIvB,GAAAA,EAAAA;AACtB,QAAA,MAAMwB,YAAYN,KAAMO,CAAAA,GAAG,CAAC,CAACC,IAAAA,GAC3BtC,eAAesB,UAAU,CAACgB,IAAKf,CAAAA,QAAQ,IAAIe,IAAKf,CAAAA,QAAQ,CAACE,YAAY,EAAA,CAAIC,QAAQ,GAAG,CAAA,CAAA;QAEtF,MAAMa,SAAAA,GAAYH,UAAUI,MAAM,CAAC,CAACC,GAAKC,EAAAA,CAAAA,GAAMD,MAAMC,CAAG,EAAA,CAAA,CAAA;;QAExD,IAAI,CAAC,IAAI,CAAClC,KAAK,CAACmC,GAAG,EAAA,IAAMJ,SAAY,GAAA,IAAI,CAAC9B,aAAa,EAAE;YACvD,IAAI,CAACA,aAAa,GAAGlB,IAAKqD,CAAAA,GAAG,CAACL,SAAAA,EAAW,IAAI,CAAC9B,aAAa,GAAG,CAAG,EAAA,EAAA,CAAA;;;AAGjE,YAAA,IAAI,CAACD,KAAK,CAACqC,GAAG,CACZ7B,MAAO8B,CAAAA,YAAY,CAAC,IAAI,CAACrC,aAAa,GAAGX,cAAAA,GAAiBH,WAAW,CAAG,EAAA;gBACtEoD,KAAO,EAAA,UAAA;gBACPC,OAAS,EAAA;AACX,aAAA,CAAA,CAAA;;AAGF,YAAA,KAAK,MAAMC,KAAS,IAAA,IAAI,CAAC1C,OAAO,CAAC2C,MAAM,EAAI,CAAA;gBACzCD,KAAME,CAAAA,gBAAgB,CAACC,OAAO,EAAA;AAChC;AACF;AACA,QAAA,MAAMC,OAAO,IAAIC,WAAAA,CAAY,IAAI,CAAC7C,aAAa,GAAGX,cAAiBH,GAAAA,QAAAA,CAAAA;AACnE,QAAA,IAAI4D,QAAW,GAAA,CAAA;QACfzB,KAAM0B,CAAAA,OAAO,CAAC,CAAClB,IAAMmB,EAAAA,KAAAA,GAAAA;YACnB,MAAMC,IAAAA,GAAOpB,KAAKqB,YAAY;AAC9B,YAAA,MAAMnC,SAAYc,GAAAA,IAAAA,CAAKf,QAAQ,CAACE,YAAY,EAAA;YAC5C,MAAMC,QAAAA,GAAWU,SAAS,CAACqB,KAAM,CAAA;AACjC,YAAA,MAAMG,IAAOL,GAAAA,QAAAA;YACbA,QAAY7B,IAAAA,QAAAA;AACZ,YAAA,IAAI,CAACF,SAAW,EAAA;AACdkC,gBAAAA,IAAAA,CAAKG,MAAM,GAAG,IAAA;AACd,gBAAA;AACF;AACA,YAAA,MAAMZ,QAAQ,IAAI,CAACa,QAAQ,CAACJ,KAAKK,SAAS,CAAA;AAC1C9B,YAAAA,IAAAA,CAAK+B,GAAG,CAACf,KAAAA,CAAAA;;AAET,YAAA,IAAK,IAAIgB,KAAAA,GAAQ,CAAGA,EAAAA,KAAAA,GAAQvC,UAAUuC,KAAS,EAAA,CAAA;AAC7C,gBAAA,MAAM,CAACC,KAAAA,EAAOC,KAAM,CAAA,GAAG3C,SAAU4C,CAAAA,WAAW,CAAC1C,QAAAA,GAAW,CAAIuC,GAAAA,KAAAA,GAAS3B,IAAK+B,CAAAA,GAAG,IAAI,CAAA,CAAA;AACjFhB,gBAAAA,IAAI,CAAC,CAACO,OAAOK,KAAI,IAAKtE,SAAS,GAAGwE,KAAAA;gBAClCd,IAAI,CAAC,CAACO,IAAAA,GAAOK,KAAI,IAAKtE,QAAAA,GAAW,EAAE,GAAGuE,KAAAA;AACxC;YACA,IAAII,OAAAA,GAAUnC,SAAUQ,CAAAA,GAAG,CAACM,KAAAA,CAAAA;AAC5B,YAAA,IAAI,CAACqB,OAAS,EAAA;AACZA,gBAAAA,OAAAA,GAAU,EAAE;gBACZnC,SAAUU,CAAAA,GAAG,CAACI,KAAOqB,EAAAA,OAAAA,CAAAA;AACvB;AACA,YAAA,MAAMC,KAAQ,GAAA,IAAIC,KAAc3E,CAAAA,QAAAA,CAAAA,CAAU4E,IAAI,CAAC,CAAA,CAAA;AAC/C,YAAA,IAAI/C,WAAW,CAAG,EAAA;AAChBF,gBAAAA,SAAAA,CAAUkD,IAAI,CAAClB,OAAO,CAAC,CAACa,GAAAA,EAAKM,CAAOJ,GAAAA,KAAK,CAACI,CAAAA,CAAE,GAAGN,GAAAA,CAAIO,UAAU,CAAA;AAC/D;AACAN,YAAAA,OAAAA,CAAQO,IAAI,CAACnB,IAAAA,CAAKoB,MAAM,IAAI,GAAGpB,IAAKqB,CAAAA,YAAY,EAAErB,IAAAA,CAAKsB,MAAM,IAAI,CAAA,EAAGpB,MAAMlC,QAAU,EAAA,CAAA,EAAG,GAAG,CAAM6C,EAAAA,GAAAA,KAAAA,CAAAA;AAChGb,YAAAA,IAAAA,CAAKG,MAAM,GAAG;gBACZE,SAAWd,EAAAA,KAAAA,CAAMgC,eAAe,CAACtC,GAAG,EAAA;AACpCuC,gBAAAA,UAAAA,EAAY,IAAI,CAAC1E,KAAK,CAACmC,GAAG,EAAA;AAC1BwC,gBAAAA,UAAAA,EAAYvB,OAAOjE,QAAW,GAAA,CAAA;AAC9B+B,gBAAAA,QAAAA;AACAF,gBAAAA,SAAAA;gBACA4D,cAAgBrF,EAAAA,WAAAA,GAAc,CAAC,IAAI,CAACU,aAAa,GAAGmD,IAAG,IAAKjE,QAAW,GAAA,CAAA,GAAI;AAC7E,aAAA;AACF,SAAA,CAAA;AACA,QAAA,IAAI,CAACa,KAAK,CAACmC,GAAG,EAAI0C,CAAAA,aAAa,CAAC,CAAGhC,EAAAA,IAAAA,CAAAA;AACnC,QAAA,KAAK,MAAM,CAACJ,KAAOqB,EAAAA,OAAAA,CAAQ,IAAInC,SAAW,CAAA;AACxCc,YAAAA,KAAAA,CAAMqC,UAAU,GAAGhB,OAAAA,CAAQiB,MAAM,IAAI3F,cAAc,CAAA,CAAA;AACnD,YAAA,IAAI,CAACqD,KAAAA,CAAMqB,OAAO,CAAC3B,GAAG,EAAI,EAAA;gBACxBM,KAAMqB,CAAAA,OAAO,CAACzB,GAAG,CAAC7B,OAAO8B,YAAY,CAACpD,WAAcE,GAAAA,WAAAA,GAAc,EAAI,EAAA;oBAAEmD,KAAO,EAAA;AAAU,iBAAA,CAAA,CAAA;gBACzFE,KAAME,CAAAA,gBAAgB,CAACC,OAAO,EAAA;AAChC;YACAH,KAAMqB,CAAAA,OAAO,CAAC3B,GAAG,EAAA,CAAI0C,aAAa,CAAC,CAAA,EAAG,IAAIlF,YAAamE,CAAAA,OAAAA,CAAAA,CAAAA;AACzD;QACA,KAAK,MAAM,CAACkB,GAAKvC,EAAAA,KAAAA,CAAM,IAAI,IAAI,CAAC1C,OAAO,CAAE;AACvC,YAAA,IAAI,CAAC0B,IAAAA,CAAKwD,GAAG,CAACxC,KAAQ,CAAA,EAAA;gBACpB,IAAI,CAACyC,YAAY,CAACzC,KAAAA,CAAAA;AAClB,gBAAA,IAAI,CAAC1C,OAAO,CAACoF,MAAM,CAACH,GAAAA,CAAAA;AACtB;AACF;AACA,QAAA,KAAK,MAAM,CAACjE,QAAUqE,EAAAA,IAAAA,CAAK,IAAI7D,YAAc,CAAA;YAC3C,MAAMkB,KAAAA,GAAQ,IAAI,CAAC1C,OAAO,CAACoC,GAAG,CAACiD,KAAK7B,SAAS,CAAA;AAC7C,YAAA,IAAId,KAAO,EAAA;AACT,gBAAA,MAAM4C,KAAQ,GAAA;AAAE5C,oBAAAA,KAAAA;AAAO6C,oBAAAA,IAAAA,EAAMvG,KAAKwG,KAAK,CAACH,IAAKd,CAAAA,MAAM,GAAG,CAAI3F,GAAAA,kBAAAA;AAAoB,iBAAA;AAC9E,gBAAA,IAAI,CAAC2B,MAAM,CAAC+B,GAAG,CAACtB,QAAUsE,EAAAA,KAAAA,CAAAA;gBAC1B,IAAI,CAACG,WAAW,CAACzE,QAAUsE,EAAAA,KAAAA,CAAAA;AAC7B;AACF;AACF;8FAEAI,eAAgB1E,CAAAA,QAAkB,EAAE;AAClC,QAAA,MAAMsE,QAAQ,IAAI,CAAC/E,MAAM,CAAC6B,GAAG,CAACpB,QAAAA,CAAAA;AAC9B,QAAA,IAAIsE,KAAO,EAAA;YACT,IAAI,CAACG,WAAW,CAACzE,QAAUsE,EAAAA,KAAAA,CAAAA;AAC7B;AACF;AACA;;;;;;MAOAK,IAAAA,CAAKC,MAAmB,EAAE;QACxB,MAAMC,MAAAA,GAASD,OAAOE,UAAU;QAChC,IAAI,CAACD,UAAU,IAAI,CAAC7F,OAAO,CAAC+F,IAAI,KAAK,CAAG,EAAA;AACtC,YAAA;AACF;AACA,QAAA,MAAMC,KAAQtF,GAAAA,SAAAA,EAAAA,CAAYuF,SAAS,CAACC,YAAY;QAChD,IAAI,IAAI,CAAC/F,WAAW,KAAKyF,UAAU,IAAI,CAACxF,UAAU,KAAK4F,KAAO,EAAA;AAC5D,YAAA;AACF;QACA,IAAI,CAAC7F,WAAW,GAAGyF,MAAAA;QACnB,IAAI,CAACxF,UAAU,GAAG4F,KAAAA;QAClB,IAAI,CAACG,SAAS,CAACN,MAAAA,CAAAA;AACf,QAAA,IAAI,CAACO,UAAU,CAACR,MAAAA,CAAOS,SAAS,IAAIR,MAAAA,CAAAA;AACpC,QAAA,MAAMpF,MAASC,GAAAA,SAAAA,EAAAA;QACf,MAAM4F,OAAAA,GAAU7G,eAAe8G,UAAU,EAAA;AACzC,QAAA,KAAK,MAAM7D,KAAS,IAAA,IAAI,CAAC1C,OAAO,CAAC2C,MAAM,EAAI,CAAA;YACzC,IAAID,KAAAA,CAAMqC,UAAU,KAAK,CAAG,EAAA;AAC1B,gBAAA;AACF;YACA,IAAIrC,KAAAA,CAAM8D,WAAW,EAAE;gBACrB9D,KAAM+D,CAAAA,MAAM,CAACrE,GAAG,EAAA,CAAI0C,aAAa,CAAC,CAAA,EAAGpC,MAAMgE,UAAU,CAAA;AACrDhE,gBAAAA,KAAAA,CAAM8D,WAAW,GAAG,KAAA;AACtB;AACA,YAAA,IAAIhD,SAAYd,GAAAA,KAAAA,CAAME,gBAAgB,CAACR,GAAG,EAAA;AAC1C,YAAA,IAAI,CAACoB,SAAW,EAAA;AACdA,gBAAAA,SAAAA,GAAY/C,OAAOkG,eAAe,CAACL,OAAQM,CAAAA,gBAAgB,CAAC,CAAE,CAAA,CAAA;gBAC9DpD,SAAUqD,CAAAA,SAAS,CACjB,KAAA,EACAnE,KAAMoE,CAAAA,MAAM,CAACtD,SAAS,CAACuD,SAAS,CAAClI,YAAAA,CAAamI,0BAA0B,EAAA,CAAA,CAAA;AAE1ExD,gBAAAA,SAAAA,CAAUqD,SAAS,CAAC,KAAA,EAAOnE,KAAMuE,CAAAA,MAAM,CAAC7E,GAAG,EAAA,CAAA;AAC3CoB,gBAAAA,SAAAA,CAAUqD,SAAS,CAAC,QAAA,EAAUnE,KAAM+D,CAAAA,MAAM,CAACrE,GAAG,EAAA,CAAA;AAC9CoB,gBAAAA,SAAAA,CAAUqD,SAAS,CAAC,SAAA,EAAWnE,KAAMqB,CAAAA,OAAO,CAAC3B,GAAG,EAAA,CAAA;AAChDoB,gBAAAA,SAAAA,CAAUqD,SAAS,CAAC,MAAA,EAAQ,IAAI,CAAC5G,KAAK,CAACmC,GAAG,EAAA,CAAA;gBAC1CM,KAAME,CAAAA,gBAAgB,CAACN,GAAG,CAACkB,SAAAA,CAAAA;AAC7B;AACA/D,YAAAA,cAAAA,CAAeI,OAAO,CAAC,CAAE,CAAA,GAAG6C,MAAMqC,UAAU;AAC5CtF,YAAAA,cAAAA,CAAeI,OAAO,CAAC,CAAA,CAAE,GAAG,IAAI,CAACK,aAAa;AAC9CsD,YAAAA,SAAAA,CAAU0D,QAAQ,CAAC,QAAUzH,EAAAA,cAAAA,CAAeI,OAAO,CAAA;AACnD2D,YAAAA,SAAAA,CAAU0D,QAAQ,CAAC,QAAUzH,EAAAA,cAAAA,CAAeE,OAAO,CAAA;AACnD6D,YAAAA,SAAAA,CAAU0D,QAAQ,CAAC,SAAWzH,EAAAA,cAAAA,CAAeK,QAAQ,CAAA;AACrD0D,YAAAA,SAAAA,CAAU0D,QAAQ,CAAC,WAAazH,EAAAA,cAAAA,CAAeM,UAAU,CAAA;AACzDU,YAAAA,MAAAA,CAAO0G,UAAU,CAACb,OAAAA,CAAAA;YAClB7F,MAAO2G,CAAAA,YAAY,CAAC,CAAG5D,EAAAA,SAAAA,CAAAA;AACvB/C,YAAAA,MAAAA,CAAO4G,OAAO,CAAC3E,KAAMqC,CAAAA,UAAU,EAAE,CAAG,EAAA,CAAA,CAAA;AACtC;AACF;AACA,qCACAlC,OAAU,GAAA;AACR,QAAA,KAAK,MAAMH,KAAS,IAAA,IAAI,CAAC1C,OAAO,CAAC2C,MAAM,EAAI,CAAA;YACzC,IAAI,CAACwC,YAAY,CAACzC,KAAAA,CAAAA;AACpB;QACA,IAAI,CAAC1C,OAAO,CAACyB,KAAK,EAAA;QAClB,IAAI,CAAClB,MAAM,CAACkB,KAAK,EAAA;QACjB,IAAI,CAACxB,KAAK,CAAC4C,OAAO,EAAA;QAClB,IAAI,CAAC3C,aAAa,GAAG,CAAA;AACvB;AACA,+FACQiG,SAAUN,CAAAA,MAAc,EAAE;QAChC,MAAMyB,MAAAA,GAAS7H,eAAeE,OAAO;AACrC,QAAA,MAAM4H,aAAgB1B,GAAAA,MAAAA,CAAO2B,OAAO,CAACF,MAAM;QAC3C,MAAMG,IAAAA,GAAO5B,MAAO6B,CAAAA,QAAQ,IAAI,IAAA;AAChC,QAAA,IAAK,IAAItD,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;YAC1B,MAAMuD,CAAAA,GAAIJ,aAAa,CAACnD,CAAE,CAAA;AAC1B,YAAA,MAAMwD,UAAU,CAAC,EAAEH,IAAAA,GAAQ,KAAKrD,CAAC,CAAA;AACjCkD,YAAAA,MAAM,CAAClD,CAAI,GAAA,CAAA,CAAE,GAAGwD,OAAUD,GAAAA,CAAAA,CAAEE,CAAC,GAAG,CAAA;YAChCP,MAAM,CAAClD,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGwD,OAAUD,GAAAA,CAAAA,CAAEG,CAAC,GAAG,CAAA;YACpCR,MAAM,CAAClD,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGwD,OAAUD,GAAAA,CAAAA,CAAEI,CAAC,GAAG,CAAA;YACpCT,MAAM,CAAClD,IAAI,CAAI,GAAA,CAAA,CAAE,GAAGwD,OAAUD,GAAAA,CAAAA,CAAEK,CAAC,GAAG,IAAA;AACtC;AACF;AACA,0HACQ5B,UAAWP,CAAAA,MAAc,EAAE;QACjC,MAAMoC,GAAAA,GAAMpC,MAAOqC,CAAAA,gBAAgB,CAAC1J,UAAAA,CAAAA;QACpC,MAAM2J,IAAAA,GAAOtC,OAAOuC,mBAAmB,EAAA;QACvC,MAAMC,IAAAA,GAAO5I,eAAeK,QAAQ;AACpCuI,QAAAA,IAAI,CAAC,CAAA,CAAE,GAAGJ,GAAAA,CAAIK,CAAC;AACfD,QAAAA,IAAI,CAAC,CAAA,CAAE,GAAGJ,GAAAA,CAAIM,CAAC;AACfF,QAAAA,IAAI,CAAC,CAAA,CAAE,GAAGJ,GAAAA,CAAIO,CAAC;AACfH,QAAAA,IAAI,CAAC,CAAE,CAAA,GAAGxC,MAAO4C,CAAAA,aAAa,KAAK,CAAI,GAAA,CAAA;QACvC,MAAMC,MAAAA,GAASjJ,eAAeM,UAAU;AACxC2I,QAAAA,MAAM,CAAC,CAAE,CAAA,GAAG1J,KAAKqD,GAAG,CAAC,MAAMrD,IAAK2J,CAAAA,GAAG,CAACR,IAAAA,CAAKS,GAAG,CAAG,EAAA,GAAA,GAAM5J,KAAK2J,GAAG,CAACR,KAAKU,GAAG,CAAA,CAAA;AACtEH,QAAAA,MAAM,CAAC,CAAA,CAAE,GAAG7C,MAAAA,CAAOiD,gBAAgB;AACrC;IACQrD,WAAYzE,CAAAA,QAAkB,EAAEsE,KAAyC,EAAE;QACjF,MAAMyD,IAAAA,GAAO/H,SAASgI,OAAO,EAAA;QAC7B,MAAMC,EAAAA,GAAKF,KAAKG,eAAe,GAAIH,KAAKI,iBAAiB,EAAA,EAAIC,YAAY,IAAQ,GAAA,IAAA;AACjF,QAAA,MAAMjG,IAAOmC,GAAAA,KAAAA,CAAM5C,KAAK,CAACgE,UAAU;QACnC,MAAM2C,CAAAA,GAAI/D,KAAMC,CAAAA,IAAI,GAAG,CAAA;AACvB,QAAA,IAAI0D,EAAI,EAAA;YACN,MAAMK,GAAAA,GAAML,GAAGM,QAAQ;YACvB,MAAMlH,GAAAA,GAAM4G,GAAGO,QAAQ;YACvBrG,IAAI,CAACkG,CAAE,CAAA,GAAG,CAACC,GAAIhB,CAAAA,CAAC,GAAGjG,GAAAA,CAAIiG,CAAAA,IAAK,GAAA;AAC5BnF,YAAAA,IAAI,CAACkG,CAAAA,GAAI,CAAE,CAAA,GAAG,CAACC,GAAIf,CAAAA,CAAC,GAAGlG,GAAAA,CAAIkG,CAAAA,IAAK,GAAA;AAChCpF,YAAAA,IAAI,CAACkG,CAAAA,GAAI,CAAE,CAAA,GAAG,CAACC,GAAId,CAAAA,CAAC,GAAGnG,GAAAA,CAAImG,CAAAA,IAAK,GAAA;YAChCrF,IAAI,CAACkG,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AACdlG,YAAAA,IAAI,CAACkG,CAAAA,GAAI,CAAE,CAAA,GAAG,CAAChH,GAAIiG,CAAAA,CAAC,GAAGgB,GAAAA,CAAIhB,CAAAA,IAAK,GAAA;AAChCnF,YAAAA,IAAI,CAACkG,CAAAA,GAAI,CAAE,CAAA,GAAG,CAAChH,GAAIkG,CAAAA,CAAC,GAAGe,GAAAA,CAAIf,CAAAA,IAAK,GAAA;AAChCpF,YAAAA,IAAI,CAACkG,CAAAA,GAAI,CAAE,CAAA,GAAG,CAAChH,GAAImG,CAAAA,CAAC,GAAGc,GAAAA,CAAId,CAAAA,IAAK,GAAA;SAC3B,MAAA;;YAELrF,IAAI,CAACkG,CAAI,GAAA,CAAA,CAAE,GAAG,CAAA;AAChB;AACA,QAAA,MAAMI,IAAQV,GAAAA,IAAAA,CAAKW,MAAM,EAAA,GAAKX,IAAO,GAAA,IAAA;QACrC,MAAMY,SAAAA,GAAYF,IAAME,EAAAA,SAAAA,IAAa,EAAC;AACtCxG,QAAAA,IAAI,CAACkG,CAAAA,GAAI,CAAE,CAAA,GAAGM,SAAa,IAAA,CAAA,GAAI,EAAEA,SAAY,GAAA,CAAA,CAAMF,GAAAA,IAAAA,EAAMG,MAAU,IAAA,CAAA;QACnEtE,KAAM5C,CAAAA,KAAK,CAAC8D,WAAW,GAAG,IAAA;AAC5B;AACQjD,IAAAA,QAAAA,CAASuD,MAAuB,EAAE;AACxC,QAAA,IAAIpE,QAAQ,IAAI,CAAC1C,OAAO,CAACoC,GAAG,CAAC0E,MAAAA,CAAAA;AAC7B,QAAA,IAAI,CAACpE,KAAO,EAAA;AACV,YAAA,MAAMjC,MAASC,GAAAA,SAAAA,EAAAA;AACf,YAAA,MAAMuG,MAASxG,GAAAA,MAAAA,CAAO8B,YAAY,CAAC5D,sBAAsB,EAAI,EAAA;gBAAE6D,KAAO,EAAA,SAAA;gBAAWC,OAAS,EAAA;AAAK,aAAA,CAAA;AAC/F,YAAA,MAAMiC,kBAAkBjE,MAAOkG,CAAAA,eAAe,CAACG,MAAOtD,CAAAA,SAAS,CAACqG,SAAS,EAAA,CAAA;AACzEnF,YAAAA,eAAAA,CAAgBmC,SAAS,CAAChI,YAAamI,CAAAA,0BAA0B,EAAIC,EAAAA,MAAAA,CAAAA;YACrE,MAAMP,UAAAA,GAAa,IAAI9G,YAAAA,CAAab,gBAAmB,GAAA,CAAA,CAAA;YACvD2D,KAAQ,GAAA;AACNoE,gBAAAA,MAAAA;AACAG,gBAAAA,MAAAA,EAAQ,IAAI3G,IAAK2G,CAAAA,MAAAA,CAAAA;AACjBvC,gBAAAA,eAAAA,EAAiB,IAAIpE,IAAKoE,CAAAA,eAAAA,CAAAA;AAC1B+B,gBAAAA,MAAAA,EAAQ,IAAInG,IAAKG,CAAAA,MAAAA,CAAO8B,YAAY,CAACmE,UAAAA,CAAWoD,UAAU,EAAE;oBAAEtH,KAAO,EAAA,SAAA;oBAAWC,OAAS,EAAA;AAAK,iBAAA,CAAA,CAAA;AAC9FiE,gBAAAA,UAAAA;gBACAF,WAAa,EAAA,IAAA;AACbzC,gBAAAA,OAAAA,EAAS,IAAIzD,IAAAA,EAAAA;gBACbyE,UAAY,EAAA,CAAA;AACZnC,gBAAAA,gBAAAA,EAAkB,IAAItC,IAAAA;AACxB,aAAA;AACA,YAAA,IAAI,CAACN,OAAO,CAACsC,GAAG,CAACwE,MAAQpE,EAAAA,KAAAA,CAAAA;AAC3B;QACA,OAAOA,KAAAA;AACT;AACQyC,IAAAA,YAAAA,CAAazC,KAAgB,EAAE;QACrCA,KAAMuE,CAAAA,MAAM,CAACpE,OAAO,EAAA;QACpBH,KAAMgC,CAAAA,eAAe,CAAC7B,OAAO,EAAA;QAC7BH,KAAM+D,CAAAA,MAAM,CAAC5D,OAAO,EAAA;QACpBH,KAAMqB,CAAAA,OAAO,CAAClB,OAAO,EAAA;QACrBH,KAAME,CAAAA,gBAAgB,CAACC,OAAO,EAAA;AAChC;AACA,IAAA,OAAe0D,UAAa,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC7G,QAAQ,EAAE;AAClB,YAAA,IAAI,CAACA,QAAQ,GAAGgB,SAAAA,EAAAA,CAAYqJ,mBAAmB,CAAC;gBAC9CC,KAAO,EAAA,iBAAA;gBACPC,aAAe,EAAA;AAACvL,oBAAAA,cAAAA;AAAgB,oBAAA,CAAA;AAAG,oBAAA;AAAE,iBAAA;AACrC2I,gBAAAA,OAAAA,CAAAA,CAAQ6C,EAAE,EAAA;;AAER,oBAAA,IAAI,CAACxB,MAAM,GAAGwB,GAAGC,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;oBAChC,IAAI,CAAC9C,MAAM,GAAG4C,EAAAA,CAAGC,IAAI,CAAC,CAAA,CAAE,EAAGC,CAAAA,OAAO,CAAC,CAAA,CAAA;;AAEnC,oBAAA,IAAI,CAACC,OAAO,GAAGH,GAAGC,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACjC,oBAAA,IAAI,CAACE,SAAS,GAAGJ,GAAGC,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;oBACnC,IAAI,CAACG,GAAG,GAAGL,EAAAA,CAAGC,IAAI,CAACxL,mBAAAA,CAAoB,EAAG6L,CAAAA,aAAa,CAAC,CAAA,CAAA;oBACxD,IAAI,CAACC,GAAG,GAAGP,EAAAA,CAAGC,IAAI,CAAC,CAAA,CAAE,EAAGO,CAAAA,aAAa,CAAC,CAAA,CAAA;oBACtC,IAAI,CAACjE,MAAM,GAAGyD,EAAAA,CAAGC,IAAI,CAAC,CAAA,CAAE,EAAGQ,CAAAA,qBAAqB,CAAC,CAAA,CAAA;oBACjD,IAAI,CAAC5G,OAAO,GAAGmG,EAAGC,CAAAA,IAAI,CAAChL,WAAcE,GAAAA,WAAAA,CAAY,EAAGmL,CAAAA,aAAa,CAAC,CAAA,CAAA;oBAClE,IAAI,CAAC1H,IAAI,GAAGoH,EAAAA,CAAGU,IAAI,CAAC,CAAA,CAAE,EAAGF,CAAAA,aAAa,CAAC,CAAA,CAAA;oBACvC,IAAI,CAACG,UAAU,GAAGX,EAAAA,CAAGU,IAAI,CAAC1L,mBAAAA,CAAoB,GAAG4L,SAAS,EAAA;oBAC1D,IAAI,CAACC,QAAQ,GAAGb,EAAAA,CAAGU,IAAI,CAAC1L,mBAAAA,CAAoB,GAAG4L,SAAS,EAAA;;oBAExD,IAAI,CAACE,UAAU,GAAGd,EAAAA,CAAGU,IAAI,CAACtL,QAAAA,CAAS,GAAGwL,SAAS,EAAA;oBAC/C,IAAI,CAACG,SAAS,GAAGf,EAAAA,CAAGU,IAAI,CAACtL,QAAAA,CAAS,GAAGwL,SAAS,EAAA;oBAC9CZ,EAAGgB,CAAAA,IAAI,CAAC,UAAY,EAAA;AAAChB,wBAAAA,EAAAA,CAAGU,IAAI,CAAC,MAAA,CAAA;AAASV,wBAAAA,EAAAA,CAAGU,IAAI,CAAC,YAAA;qBAAc,EAAE,WAAA;wBAC5D,IAAI,CAACO,EAAE,CAAC5F,IAAI,GAAG2E,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAAC/H,IAAI,EAAEzE,kBAAAA,CAAAA;AACjC,wBAAA,IAAI,CAACuM,EAAE,CAACE,MAAM,GAAG,IAAI,CAAC5E,MAAM,CAAC6E,EAAE,CAACpB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAAChG,IAAI,EAAE,CAAA,CAAA,CAAA;AAClD,wBAAA,IAAI,CAAC4F,EAAE,CAACK,OAAO,GAAG,IAAA;wBAClB,IAAI,CAACL,EAAE,CAACM,OAAO,GAAG,IAAI,CAAChF,MAAM,CAAC6E,EAAE,CAACpB,EAAGzG,CAAAA,GAAG,CAACyG,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAAChG,IAAI,EAAE,CAAI,CAAA,EAAA,CAAA,CAAA,CAAA;wBAC9D,IAAI,CAAC4F,EAAE,CAACO,MAAM,GAAG,IAAI,CAACD,OAAO,CAACE,GAAG;;AAEjC,wBAAA,IAAI,CAACR,EAAE,CAACS,EAAE,GAAG,IAAI,CAACrB,GAAG,CAACe,EAAE,CAAC,IAAI,CAACjI,IAAI,EAAEsI,GAAG;AACvC,wBAAA,IAAI,CAACR,EAAE,CAACU,EAAE,GAAG,IAAI,CAACtB,GAAG,CAACe,EAAE,CAACpB,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAACJ,IAAI,EAAE,IAAIsI,GAAG;AAClD,wBAAA,IAAI,CAACR,EAAE,CAACW,EAAE,GAAG,IAAI,CAACvB,GAAG,CAACe,EAAE,CAACpB,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAACJ,IAAI,EAAE,IAAIsI,GAAG;AAClD,wBAAA,IAAI,CAACR,EAAE,CAACY,EAAE,GAAG,IAAI,CAACxB,GAAG,CAACe,EAAE,CAACpB,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAACJ,IAAI,EAAE,IAAIsI,GAAG;wBAClD,IAAI,CAACR,EAAE,CAACa,EAAE,GAAG9B,EAAGzG,CAAAA,GAAG,CACjByG,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACK,EAAE,EAAE,IAAI,CAACP,MAAM,CAAC/C,CAAC,CAC7B4B,EAAAA,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACM,EAAE,EAAE,IAAI,CAACR,MAAM,CAAC9C,CAAC,CAC7B2B,EAAAA,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACO,EAAE,EAAE,IAAI,CAACT,MAAM,CAAC7C,CAAC,CAAA,EAC7B,IAAI,CAACuD,EAAE,CAAA;wBAET,IAAI,CAACZ,EAAE,CAACc,EAAE,GAAG/B,GAAGzG,GAAG,CACjByG,EAAGqB,CAAAA,GAAG,CAACrB,EAAAA,CAAGvB,GAAG,CAAC,IAAI,CAACiD,EAAE,CAAG,EAAA,IAAI,CAACF,MAAM,CAACpD,CAAC,CACrC4B,EAAAA,EAAAA,CAAGqB,GAAG,CAACrB,GAAGvB,GAAG,CAAC,IAAI,CAACkD,EAAE,CAAA,EAAG,IAAI,CAACH,MAAM,CAACnD,CAAC,CACrC2B,EAAAA,EAAAA,CAAGqB,GAAG,CAACrB,EAAAA,CAAGvB,GAAG,CAAC,IAAI,CAACmD,EAAE,CAAA,EAAG,IAAI,CAACJ,MAAM,CAAClD,CAAC,CAAA,CAAA;wBAEvC,IAAI,CAAC0D,IAAI,CAAChC,EAAAA,CAAGiC,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,CAAG,EAAA,WAAA;AAC3B,4BAAA,IAAI,CAAChB,EAAE,CAACxD,CAAC,GAAG,IAAI,CAACL,MAAM,CAACgE,EAAE,CAAC,IAAI,CAAClH,CAAC,CAAA;4BACjC,IAAI,CAACgI,GAAG,CACNlC,EAAAA,CAAGmC,QAAQ,CACTnC,EAAAA,CAAGzG,GAAG,CAACyG,EAAAA,CAAGoC,GAAG,CAAC,IAAI,CAAC3E,CAAC,CAACgE,GAAG,EAAE,IAAI,CAACK,EAAE,CAAA,EAAG9B,GAAGoC,GAAG,CAACpC,GAAGvB,GAAG,CAAC,IAAI,CAAChB,CAAC,CAACgE,GAAG,CAAA,EAAG,IAAI,CAACM,EAAE,GAAG,IAAI,CAACtE,CAAC,CAAC4E,CAAC,GACjF,CAEF,CAAA,EAAA,WAAA;gCACE,IAAI,CAACf,OAAO,GAAG,KAAA;AACjB,6BAAA,CAAA;AAEJ,yBAAA,CAAA;;AAEA,wBAAA,IAAI,CAACA,OAAO,GAAGtB,GAAGsC,EAAE,CAAC,IAAI,CAAChB,OAAO,EAAEtB,EAAAA,CAAGuC,WAAW,CAAC,IAAI,CAACpB,MAAM,CAACkB,CAAC,EAAE,CAAA,CAAA,CAAA;wBACjE,IAAI,CAACpB,EAAE,CAAChK,QAAQ,GAAG+I,EAAGiC,CAAAA,GAAG,CAAC,IAAI,CAACpI,OAAO,CAACuH,EAAE,CAACpB,GAAGzG,GAAG,CAAC,IAAI,CAACiJ,UAAU,EAAE,CAAA,CAAA,CAAA,CAAIpE,CAAC,CAAA;AACvE,wBAAA,IAAI,CAAC6C,EAAE,CAACwB,KAAK,GAAGzC,EAAAA,CAAGiC,GAAG,CAAC,IAAI,CAACV,OAAO,CAACc,CAAC,CAAA;AACrC,wBAAA,IAAI,CAACpB,EAAE,CAACzH,KAAK,GAAGwG,EAAAA,CAAGiC,GAAG,CAAC,CAAA,CAAA;wBACvB,IAAI,CAACC,GAAG,CAAClC,EAAGmC,CAAAA,QAAQ,CAAC,IAAI,CAACM,KAAK,EAAE,CAAI,CAAA,EAAA,WAAA;;4BAEnC,IAAI,CAACjJ,KAAK,GAAGwG,EAAAA,CAAGZ,GAAG,CAACY,EAAAA,CAAG0C,GAAG,CAAC1C,EAAG2C,CAAAA,GAAG,CAAC,IAAI,CAACF,KAAK,CAAA,EAAG,CAAIzC,CAAAA,EAAAA,EAAAA,CAAG0C,GAAG,CAAC,IAAI,CAACzL,QAAQ,EAAE,CAAA,CAAA,CAAA;AAC3E,yBAAA,CAAA,CAAG2L,KAAK,CAAC,WAAA;AACP,4BAAA,IAAI,CAAC3B,EAAE,CAAC4B,MAAM,GAAG7C,GAAG0C,GAAG,CAAC,IAAI,CAACZ,EAAE,EAAE,IAAI,CAAC3B,OAAO,CAACsB,GAAG,CAAA;AACjD,4BAAA,IAAI,CAACR,EAAE,CAAC6B,MAAM,GAAG9C,EAAG+C,CAAAA,MAAM,CACxB/C,EAAAA,CAAGgD,KAAK,CAAC,CAAA,CAAA,EACThD,EAAG7H,CAAAA,GAAG,CAAC6H,EAAGoC,CAAAA,GAAG,CAAC,IAAI,CAACS,MAAM,EAAE,IAAI,CAACA,MAAM,CAAG,EAAA,IAAA,CAAA,EACzC7C,EAAGuC,CAAAA,WAAW,CAAC,IAAI,CAACpC,OAAO,CAACkC,CAAC,EAAE,CAAA,CAAA,CAAA;AAEjC,4BAAA,IAAI,CAACpB,EAAE,CAACgC,YAAY,GAAGjD,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACjB,SAAS,CAAChC,CAAC,EAAE4B,EAAAA,CAAGlF,MAAM,CAAC,IAAI,CAACiH,EAAE,CAAA,CAAA;4BACjE,IAAI,CAACd,EAAE,CAACiC,EAAE,GAAGlD,EAAGkB,CAAAA,GAAG,CAAClB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAAC4B,YAAY,EAAE,IAAI,CAACA,YAAY,CAAA,EAAG,IAAI,CAACH,MAAM,CAAA;AAC7E,4BAAA,IAAI,CAAC7B,EAAE,CAACkC,MAAM,GAAG,IAAI,CAACtJ,OAAO,CAACuH,EAAE,CAACpB,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACiJ,UAAU,EAAE,CAAA,CAAA,CAAA;AACzD,4BAAA,IAAI,CAACvB,EAAE,CAACmC,MAAM,GAAG,IAAI,CAACvJ,OAAO,CAACuH,EAAE,CAACpB,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACiJ,UAAU,EAAE,CAAA,CAAA,CAAA;;;AAGzD,4BAAA,IAAI,CAACvB,EAAE,CAACoC,KAAK,GAAGrD,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAAC8B,MAAM,CAAC/E,CAAC,EAAE,IAAI,CAACgC,SAAS,CAAC/B,CAAC,CAAA;AACtD,4BAAA,IAAI,CAAC6D,GAAG,CACNlC,EAAAA,CAAGsD,GAAG,CACJtD,EAAAA,CAAGmC,QAAQ,CAAC,GAAG,IAAI,CAAClL,QAAQ,CAAA,EAC5B+I,GAAGuC,WAAW,CAACvC,EAAGqB,CAAAA,GAAG,CAACrB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACgC,KAAK,EAAE,IAAI,CAACA,KAAK,CAAG,EAAA,IAAA,CAAA,EAAO,IAAI,CAACH,EAAE,CAEtE,CAAA,EAAA,WAAA;gCACE,IAAI,CAAC1J,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;AAEF,4BAAA,IAAI,CAACyH,EAAE,CAACsC,KAAK,GAAGvD,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAAC8B,MAAM,CAAC9E,CAAC,EAAE,IAAI,CAAC+B,SAAS,CAAC/B,CAAC,CAAA;AACtD,4BAAA,IAAI,CAAC6D,GAAG,CACNlC,EAAAA,CAAGsD,GAAG,CACJtD,EAAAA,CAAGmC,QAAQ,CAAC,GAAG,IAAI,CAAClL,QAAQ,CAAA,EAC5B+I,GAAGuC,WAAW,CAACvC,EAAGqB,CAAAA,GAAG,CAACrB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACkC,KAAK,EAAE,IAAI,CAACA,KAAK,CAAG,EAAA,IAAA,CAAA,EAAO,IAAI,CAACL,EAAE,CAEtE,CAAA,EAAA,WAAA;gCACE,IAAI,CAAC1J,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;AAEF,4BAAA,IAAI,CAACyH,EAAE,CAACuC,KAAK,GAAGxD,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAAC8B,MAAM,CAAC7E,CAAC,EAAE,IAAI,CAAC8B,SAAS,CAAC/B,CAAC,CAAA;AACtD,4BAAA,IAAI,CAAC6D,GAAG,CACNlC,EAAAA,CAAGsD,GAAG,CACJtD,EAAAA,CAAGmC,QAAQ,CAAC,GAAG,IAAI,CAAClL,QAAQ,CAAA,EAC5B+I,GAAGuC,WAAW,CAACvC,EAAGqB,CAAAA,GAAG,CAACrB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACmC,KAAK,EAAE,IAAI,CAACA,KAAK,CAAG,EAAA,IAAA,CAAA,EAAO,IAAI,CAACN,EAAE,CAEtE,CAAA,EAAA,WAAA;gCACE,IAAI,CAAC1J,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;AAEF,4BAAA,IAAI,CAACyH,EAAE,CAACwC,KAAK,GAAGzD,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAAC8B,MAAM,CAACd,CAAC,EAAE,IAAI,CAACjC,SAAS,CAAC/B,CAAC,CAAA;AACtD,4BAAA,IAAI,CAAC6D,GAAG,CACNlC,EAAAA,CAAGsD,GAAG,CACJtD,EAAAA,CAAGmC,QAAQ,CAAC,GAAG,IAAI,CAAClL,QAAQ,CAAA,EAC5B+I,GAAGuC,WAAW,CAACvC,EAAGqB,CAAAA,GAAG,CAACrB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACoC,KAAK,EAAE,IAAI,CAACA,KAAK,CAAG,EAAA,IAAA,CAAA,EAAO,IAAI,CAACP,EAAE,CAEtE,CAAA,EAAA,WAAA;gCACE,IAAI,CAAC1J,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;AAEF,4BAAA,IAAI,CAACyH,EAAE,CAACyC,KAAK,GAAG1D,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAAC+B,MAAM,CAAChF,CAAC,EAAE,IAAI,CAACgC,SAAS,CAAC/B,CAAC,CAAA;AACtD,4BAAA,IAAI,CAAC6D,GAAG,CACNlC,EAAAA,CAAGsD,GAAG,CACJtD,EAAAA,CAAGmC,QAAQ,CAAC,GAAG,IAAI,CAAClL,QAAQ,CAAA,EAC5B+I,GAAGuC,WAAW,CAACvC,EAAGqB,CAAAA,GAAG,CAACrB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACqC,KAAK,EAAE,IAAI,CAACA,KAAK,CAAG,EAAA,IAAA,CAAA,EAAO,IAAI,CAACR,EAAE,CAEtE,CAAA,EAAA,WAAA;gCACE,IAAI,CAAC1J,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;AAEF,4BAAA,IAAI,CAACyH,EAAE,CAAC0C,KAAK,GAAG3D,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAAC+B,MAAM,CAAC/E,CAAC,EAAE,IAAI,CAAC+B,SAAS,CAAC/B,CAAC,CAAA;AACtD,4BAAA,IAAI,CAAC6D,GAAG,CACNlC,EAAAA,CAAGsD,GAAG,CACJtD,EAAAA,CAAGmC,QAAQ,CAAC,GAAG,IAAI,CAAClL,QAAQ,CAAA,EAC5B+I,GAAGuC,WAAW,CAACvC,EAAGqB,CAAAA,GAAG,CAACrB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACsC,KAAK,EAAE,IAAI,CAACA,KAAK,CAAG,EAAA,IAAA,CAAA,EAAO,IAAI,CAACT,EAAE,CAEtE,CAAA,EAAA,WAAA;gCACE,IAAI,CAAC1J,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;AAEF,4BAAA,IAAI,CAACyH,EAAE,CAAC2C,KAAK,GAAG5D,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAAC+B,MAAM,CAAC9E,CAAC,EAAE,IAAI,CAAC8B,SAAS,CAAC/B,CAAC,CAAA;AACtD,4BAAA,IAAI,CAAC6D,GAAG,CACNlC,EAAAA,CAAGsD,GAAG,CACJtD,EAAAA,CAAGmC,QAAQ,CAAC,GAAG,IAAI,CAAClL,QAAQ,CAAA,EAC5B+I,GAAGuC,WAAW,CAACvC,EAAGqB,CAAAA,GAAG,CAACrB,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACuC,KAAK,EAAE,IAAI,CAACA,KAAK,CAAG,EAAA,IAAA,CAAA,EAAO,IAAI,CAACV,EAAE,CAEtE,CAAA,EAAA,WAAA;gCACE,IAAI,CAAC1J,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;;AAGF,4BAAA,IAAI,CAAC0I,GAAG,CAAClC,EAAAA,CAAGuC,WAAW,CAAC,IAAI,CAACpB,MAAM,CAACkB,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;gCACzC,IAAI,CAAC7I,KAAK,GAAG,CAAA;AACf,6BAAA,CAAA;4BACA,IAAI,CAACA,KAAK,GAAGwG,EAAAA,CAAG7H,GAAG,CAAC,IAAI,CAACqB,KAAK,EAAEwG,EAAAA,CAAGZ,GAAG,CAAC,IAAI,CAACqD,KAAK,EAAEzC,EAAAA,CAAG0C,GAAG,CAAC,IAAI,CAACzL,QAAQ,EAAE,CAAA,CAAA,CAAA,CAAA;AAC3E,yBAAA,CAAA;wBACA,IAAI,CAAC4M,OAAO,CAAC7D,EAAAA,CAAG+C,MAAM,CAAC/C,EAAAA,CAAGU,IAAI,CAAC,CAAIV,CAAAA,EAAAA,EAAAA,CAAGzG,GAAG,CAACyG,EAAAA,CAAGU,IAAI,CAAC,IAAI,CAAClH,KAAK,CAAG,EAAA,CAAA,CAAA,EAAI,IAAI,CAAC8H,OAAO,CAAA,CAAA;AACjF,qBAAA,CAAA;AACAtB,oBAAAA,EAAAA,CAAG8D,IAAI,CAAC,WAAA;wBACN,IAAI,CAAC7C,EAAE,CAAC8C,GAAG,GAAG,IAAI,CAACC,SAAS,CAACC,iBAAiB,CAAC7F,CAAC;AAChD,wBAAA,IAAI,CAAC6C,EAAE,CAACuB,UAAU,GAAGxC,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAAC2C,SAAS,CAACE,WAAW,CAAC9F,CAAC,EAAEjJ,WAAAA,CAAAA;AAC1D,wBAAA,IAAI,CAAC8L,EAAE,CAACkD,KAAK,GAAG,IAAI,CAACtK,OAAO,CAACuH,EAAE,CAAC,IAAI,CAACoB,UAAU,CAAA;AAC/C,wBAAA,IAAI,CAACvB,EAAE,CAACxH,KAAK,GAAGuG,EAAAA,CAAGU,IAAI,CAAC,IAAI,CAACyD,KAAK,CAAC/F,CAAC,CAAA;AACpC,wBAAA,IAAI,CAAC6C,EAAE,CAACvH,KAAK,GAAGsG,EAAAA,CAAGU,IAAI,CAAC,IAAI,CAACyD,KAAK,CAAC9F,CAAC,CAAA;AACpC,wBAAA,IAAI,CAAC4C,EAAE,CAAC1G,MAAM,GAAGyF,EAAAA,CAAGU,IAAI,CAAC,IAAI,CAACyD,KAAK,CAAC7F,CAAC,CAAA;AACrC,wBAAA,IAAI,CAAC2C,EAAE,CAACnI,QAAQ,GAAGkH,EAAAA,CAAGU,IAAI,CAAC,IAAI,CAACyD,KAAK,CAAC9B,CAAC,CAAA;wBACvC,IAAI,CAACpB,EAAE,CAAChK,QAAQ,GAAG+I,EAAGU,CAAAA,IAAI,CAAC,IAAI,CAAC7G,OAAO,CAACuH,EAAE,CAACpB,GAAGzG,GAAG,CAAC,IAAI,CAACiJ,UAAU,EAAE,CAAA,CAAA,CAAA,CAAIpE,CAAC,CAAA;AACxE,wBAAA,IAAI,CAAC6C,EAAE,CAACmD,MAAM,GAAGpE,GAAGkB,GAAG,CAAClB,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACG,KAAK,EAAElF,iBAAiB,CAAIA,CAAAA,EAAAA,cAAAA,CAAAA;;;wBAGhE,IAAI,CAACwN,IAAI,CAAChC,EAAGU,CAAAA,IAAI,CAAC,GAAA,CAAA,EAAM,CAAG,EAAA,IAAI,CAAC0D,MAAM,EAAE,WAAA;AACtC,4BAAA,IAAI,CAACnD,EAAE,CAACoD,CAAC,GAAGrE,EAAAA,CAAGzG,GAAG,CAACyG,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACxD,CAAC,EAAErJ,cAAiB,CAAA,EAAA,IAAI,CAACuP,GAAG,CAAA;AAC3D,4BAAA,IAAI,CAAC7B,GAAG,CAAClC,EAAAA,CAAGmC,QAAQ,CAAC,IAAI,CAACkC,CAAC,EAAE,IAAI,CAAC3K,KAAK,CAAG,EAAA,WAAA;AACxC,gCAAA,IAAI,CAACiH,UAAU,CAAC2D,KAAK,CACnB,IAAI,CAACD,CAAC,EACN,IAAI,CAACE,QAAQ,CAACvE,GAAGzG,GAAG,CAAC,IAAI,CAACE,KAAK,EAAEuG,EAAGqB,CAAAA,GAAG,CAAC,IAAI,CAACgD,CAAC,EAAE,IAAI,CAAC9J,MAAM,CAAI,CAAA,EAAA,IAAI,CAACiI,UAAU,CAAA,CAAA;AAElF,6BAAA,CAAA;AACF,yBAAA,CAAA;AACAxC,wBAAAA,EAAAA,CAAGwE,gBAAgB,EAAA;;;;wBAInB,IAAI,CAACtC,GAAG,CAAClC,EAAGyE,CAAAA,KAAK,CAAC,IAAI,CAACV,GAAG,EAAE,CAAI,CAAA,EAAA,WAAA;4BAC9B,IAAI,CAAC/B,IAAI,CAAChC,EAAAA,CAAGU,IAAI,CAAC,GAAA,CAAA,EAAM,GAAGtL,QAAU,EAAA,WAAA;gCACnC,IAAI,CAAC0L,UAAU,CAACwD,KAAK,CAAC,IAAI,CAACI,CAAC,EAAE,CAAA,CAAA;AAChC,6BAAA,CAAA;4BACA,IAAI,CAAC1C,IAAI,CAAChC,EAAGU,CAAAA,IAAI,CAAC,GAAA,CAAA,EAAM,CAAG,EAAA,IAAI,CAAChH,KAAK,EAAE,WAAA;AACrC,gCAAA,IAAI,CAACuH,EAAE,CAAC0D,CAAC,GAAG,IAAI,CAAChE,UAAU,CAACS,EAAE,CAAC,IAAI,CAAClH,CAAC,CAAA;gCACrC,IAAI,CAACgI,GAAG,CAAClC,EAAG4E,CAAAA,QAAQ,CAAC,IAAI,CAACD,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;oCAC/B,IAAI,CAAC1D,EAAE,CAAC4D,EAAE,GAAG7E,EAAG0C,CAAAA,GAAG,CAAC,IAAI,CAACiC,CAAC,EAAE,CAAA,CAAA;oCAC5B,IAAI,CAAC7D,UAAU,CAACwD,KAAK,CAAC,IAAI,CAACO,EAAE,EAAE7E,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAACuH,UAAU,CAACM,EAAE,CAAC,IAAI,CAACyD,EAAE,CAAG,EAAA,CAAA,CAAA,CAAA;AACrE,iCAAA,CAAA;AACF,6BAAA,CAAA;AACA,4BAAA,IAAI,CAAC5D,EAAE,CAAC6D,KAAK,GAAG9E,EAAAA,CAAGU,IAAI,CAAC,CAAA,CAAA;4BACxB,IAAI,CAACsB,IAAI,CAAChC,EAAGU,CAAAA,IAAI,CAAC,GAAA,CAAA,EAAM,CAAG,EAAA,IAAI,CAACzJ,QAAQ,EAAE,WAAA;AACxC,gCAAA,IAAI,CAACgK,EAAE,CAACtD,CAAC,GAAGqC,EAAAA,CAAGqB,GAAG,CAACrB,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAACT,QAAQ,EAAE,IAAI,CAAC4L,CAAC,CAAGxP,EAAAA,QAAAA,CAAAA;gCAClD,IAAI,CAAC0D,IAAI,CAAC0L,KAAK,CAACtE,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACoE,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAACmD,UAAU,CAACM,EAAE,CAAC,IAAI,CAACsD,CAAC,CAAA,CAAA;AAC5D,gCAAA,IAAI,CAAC9L,IAAI,CAAC0L,KAAK,CAACtE,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACoE,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAACmH,KAAK,CAAA;AAC7C,gCAAA,IAAIxP,WAAa,EAAA;;;oCAGf,IAAI,CAAC2L,EAAE,CAAC8D,CAAC,GAAG/E,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACoE,CAAC,EAAEqC,EAAGqB,CAAAA,GAAG,CAACrB,EAAAA,CAAGU,IAAI,CAAC,IAAI,CAAClC,MAAM,CAACH,CAAC,CAAGnJ,EAAAA,QAAAA,CAAAA,CAAAA;oCAC1D,IAAI,CAAC0D,IAAI,CAAC0L,KAAK,CAAC,IAAI,CAACS,CAAC,EAAE/E,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACzI,IAAI,CAACwI,EAAE,CAAC,IAAI,CAACzD,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA;oCACrD,IAAI,CAAC/E,IAAI,CAAC0L,KAAK,CAACtE,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACwL,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAACjE,UAAU,CAACM,EAAE,CAAC,IAAI,CAACsD,CAAC,CAAA,CAAA;AAC5D,oCAAA,IAAI,CAAC9L,IAAI,CAAC0L,KAAK,CAACtE,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAACwL,CAAC,EAAE,CAAI/E,CAAAA,EAAAA,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACzI,IAAI,CAACwI,EAAE,CAACpB,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACoE,CAAC,EAAE,CAAK,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA;AAC3E,oCAAA,IAAI,CAAC/E,IAAI,CAAC0L,KAAK,CAACtE,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACwL,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAACD,KAAK,CAAA;AAC/C;gCACA,IAAI,CAAC/D,SAAS,CAACuD,KAAK,CAAC,IAAI,CAACI,CAAC,EAAE,IAAI,CAACI,KAAK,CAAA;AACvC,gCAAA,IAAI,CAACA,KAAK,GAAG9E,GAAGzG,GAAG,CAAC,IAAI,CAACuL,KAAK,EAAE,IAAI,CAAChE,UAAU,CAACM,EAAE,CAAC,IAAI,CAACsD,CAAC,CAAA,CAAA;AAC3D,6BAAA,CAAA;4BACA,IAAI,CAAC1C,IAAI,CAAChC,EAAGU,CAAAA,IAAI,CAAC,GAAA,CAAA,EAAM,CAAG,EAAA,IAAI,CAAChH,KAAK,EAAE,WAAA;AACrC,gCAAA,IAAI,CAACuH,EAAE,CAAC0D,CAAC,GAAG,IAAI,CAAChE,UAAU,CAACS,EAAE,CAAC,IAAI,CAAClH,CAAC,CAAA;gCACrC,IAAI,CAACgI,GAAG,CAAClC,EAAG4E,CAAAA,QAAQ,CAAC,IAAI,CAACD,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;oCAC/B,IAAI,CAAC1D,EAAE,CAAC4D,EAAE,GAAG7E,EAAG0C,CAAAA,GAAG,CAAC,IAAI,CAACiC,CAAC,EAAE,CAAA,CAAA;AAC5B,oCAAA,IAAI,CAAC9D,QAAQ,CAACyD,KAAK,CAAC,IAAI,CAACpK,CAAC,EAAE,IAAI,CAAC6G,SAAS,CAACK,EAAE,CAAC,IAAI,CAACyD,EAAE,CAAA,CAAA;oCACrD,IAAI,CAAC9D,SAAS,CAACuD,KAAK,CAAC,IAAI,CAACO,EAAE,EAAE7E,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAACwH,SAAS,CAACK,EAAE,CAAC,IAAI,CAACyD,EAAE,CAAG,EAAA,CAAA,CAAA,CAAA;AACnE,iCAAA,CAAA;AACF,6BAAA,CAAA;AACF,yBAAA,CAAA;AACA7E,wBAAAA,EAAAA,CAAGwE,gBAAgB,EAAA;wBACnB,IAAI,CAACxC,IAAI,CAAChC,EAAGU,CAAAA,IAAI,CAAC,GAAA,CAAA,EAAM,CAAG,EAAA,IAAI,CAAC0D,MAAM,EAAE,WAAA;AACtC,4BAAA,IAAI,CAACnD,EAAE,CAACoD,CAAC,GAAGrE,EAAAA,CAAGzG,GAAG,CAACyG,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACxD,CAAC,EAAErJ,cAAiB,CAAA,EAAA,IAAI,CAACuP,GAAG,CAAA;AAC3D,4BAAA,IAAI,CAAC7B,GAAG,CAAClC,EAAAA,CAAGmC,QAAQ,CAAC,IAAI,CAACkC,CAAC,EAAE,IAAI,CAAC3K,KAAK,CAAG,EAAA,WAAA;AACxC,gCAAA,IAAI,CAACwI,GAAG,CAAClC,EAAG4E,CAAAA,QAAQ,CAAC,IAAI,CAACjE,UAAU,CAACS,EAAE,CAAC,IAAI,CAACiD,CAAC,GAAG,CAAI,CAAA,EAAA,WAAA;oCACnD,IAAI,CAACpD,EAAE,CAAC+D,IAAI,GAAGhF,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACE,KAAK,EAAEuG,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACgD,CAAC,EAAE,IAAI,CAAC9J,MAAM,CAAA,CAAA;oCAC5D,IAAI,CAAC0G,EAAE,CAACgE,IAAI,GAAGjF,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACE,KAAK,EAAEuG,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACR,QAAQ,CAACO,EAAE,CAAC,IAAI,CAACiD,CAAC,CAAA,EAAG,IAAI,CAAC9J,MAAM,CAAA,CAAA;oCAC9E,IAAI,CAACyH,IAAI,CAAChC,EAAGU,CAAAA,IAAI,CAAC,GAAA,CAAA,EAAM,CAAG,EAAA,IAAI,CAACnG,MAAM,EAAE,WAAA;AACtC,wCAAA,IAAI,CAACgG,GAAG,CAAC+D,KAAK,CAACtE,EAAAA,CAAGzG,GAAG,CAAC,IAAI,CAAC0L,IAAI,EAAE,IAAI,CAACC,CAAC,CAAG,EAAA,IAAI,CAAC7E,GAAG,CAACe,EAAE,CAACpB,EAAGzG,CAAAA,GAAG,CAAC,IAAI,CAACyL,IAAI,EAAE,IAAI,CAACE,CAAC,CAAA,CAAA,CAAA;AAChF,qCAAA,CAAA;AACF,iCAAA,CAAA;AACF,6BAAA,CAAA;AACF,yBAAA,CAAA;AACF,qBAAA,CAAA;AACF;AACF,aAAA,CAAA;AACF;QACA,OAAO,IAAI,CAAC1P,QAAQ;AACtB;AACF;;;;"}
|