@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster_light.js","sources":["../../src/render/cluster_light.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Vector4 } from '@zephyr3d/base';\r\nimport { MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBStructTypeInfo,\r\n RenderStateSet,\r\n StructuredBuffer,\r\n Texture2D,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport class ClusteredLight {\r\n /** Emit the shadow-mask overflow warning only once per session. */\r\n private static _warnedShadowMaskOverflow = false;\r\n private readonly _tileCountX: number;\r\n private readonly _tileCountY: number;\r\n private readonly _tileCountZ: number;\r\n private readonly _lights: Float32Array<ArrayBuffer>;\r\n private _lightIndexTexture: Nullable<Texture2D>;\r\n private _lightIndexFramebuffer: Nullable<FrameBuffer>;\r\n private _lightIndexProgram: Nullable<GPUProgram>;\r\n private _bindGroup: Nullable<BindGroup>;\r\n private _lightIndexVertexLayout: Nullable<VertexLayout>;\r\n private _lightIndexRenderStates: Nullable<RenderStateSet>;\r\n private _lightBuffer: Nullable<StructuredBuffer>;\r\n private readonly _sizeParam: Vector4;\r\n private _countParam: Int32Array<ArrayBuffer>;\r\n private readonly _clusterParam: Vector4;\r\n private _numShadowLights: number;\r\n constructor() {\r\n this._tileCountX = 16;\r\n this._tileCountY = 16;\r\n this._tileCountZ = 32;\r\n this._lights = new Float32Array(16 * (ShaderHelper.getMaxClusterLights() + 1));\r\n this._lightIndexTexture = null;\r\n this._lightIndexFramebuffer = null;\r\n this._lightIndexProgram = null;\r\n this._lightBuffer = null;\r\n this._bindGroup = null;\r\n this._lightIndexVertexLayout = null;\r\n this._lightIndexRenderStates = null;\r\n this._sizeParam = new Vector4();\r\n this._countParam = new Int32Array(4);\r\n this._clusterParam = new Vector4();\r\n this._numShadowLights = 0;\r\n }\r\n get lightBuffer() {\r\n return this._lightBuffer;\r\n }\r\n /**\r\n * Number of shadow-casting lights placed at the head of the clustered light\r\n * buffer (indices `1..N`), each backed by a screen-space shadow mask slot.\r\n * Zero unless the screen-space shadow mask path is active.\r\n */\r\n get numShadowLights() {\r\n return this._numShadowLights;\r\n }\r\n get clusterParam() {\r\n return this._clusterParam;\r\n }\r\n get countParam() {\r\n return this._countParam;\r\n }\r\n get lightIndexTexture() {\r\n return this._lightIndexTexture;\r\n }\r\n private createVertexLayout(device: AbstractDevice, textureWidth: number, textureHeight: number) {\r\n let vb: StructuredBuffer;\r\n if (device.type === 'webgl') {\r\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 3);\r\n for (let i = 0; i < vertices.length; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 3 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 3 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n vertices[i * 3 + 2] = i;\r\n }\r\n vb = device.createVertexBuffer('position_f32x3', vertices)!;\r\n } else {\r\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 2);\r\n for (let i = 0; i < vertices.length; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 2 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 2 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n }\r\n vb = device.createVertexBuffer('position_f32x2', vertices)!;\r\n }\r\n this._lightIndexVertexLayout = device.createVertexLayout({\r\n vertexBuffers: [{ buffer: vb }]\r\n });\r\n }\r\n private createRenderState(device: AbstractDevice) {\r\n this._lightIndexRenderStates = device.createRenderStateSet();\r\n this._lightIndexRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._lightIndexRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n private createProgram(device: AbstractDevice) {\r\n const webgl1 = device.type === 'webgl';\r\n this._lightIndexProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = (webgl1 ? pb.vec3() : pb.vec2()).attrib('position');\r\n this.$outputs.value = webgl1 ? pb.vec4() : pb.uvec4();\r\n this.invProjMatrix = pb.mat4().uniform(0);\r\n this.viewMatrix = pb.mat4().uniform(0);\r\n this.sizeParam = pb.vec4().uniform(0);\r\n this.countParam = pb.ivec4().uniform(0);\r\n this[ShaderHelper.getLightBufferUniformName()] =\r\n pb.vec4[(ShaderHelper.getMaxClusterLights() + 1) * 4]().uniformBuffer(0);\r\n pb.func('lineIntersectionToZPlane', [pb.vec3('a'), pb.vec3('b'), pb.float('zDistance')], function () {\r\n this.$l.normal = pb.vec3(0, 0, 1);\r\n this.$l.ab = pb.sub(this.b, this.a);\r\n this.$l.t = pb.div(\r\n pb.sub(this.zDistance, pb.dot(this.normal, this.a)),\r\n pb.dot(this.normal, this.ab)\r\n );\r\n this.$return(pb.add(this.a, pb.mul(this.t, this.ab)));\r\n });\r\n pb.func('clipToView', [pb.vec4('clip')], function () {\r\n this.$l.view = pb.mul(this.invProjMatrix, this.clip);\r\n this.$return(pb.div(this.view, this.view.w));\r\n });\r\n pb.func('screenToView', [pb.vec4('screen')], function () {\r\n this.$l.texCoord = pb.div(this.screen.xy, this.sizeParam.xy);\r\n this.$l.clip = pb.vec4(\r\n pb.sub(pb.mul(pb.vec2(this.texCoord.x, pb.sub(1, this.texCoord.y)), 2), pb.vec2(1)),\r\n this.screen.z,\r\n this.screen.w\r\n );\r\n this.$return(this.clipToView(this.clip));\r\n });\r\n pb.func(\r\n 'sphereIntersectsAABB',\r\n [pb.vec4('sphere'), pb.vec3('aabbMin'), pb.vec3('aabbMax')],\r\n function () {\r\n this.$l.dmin = pb.float(0);\r\n this.$if(pb.lessThanEqual(this.sphere.w, 0), function () {\r\n this.$return(true);\r\n });\r\n this.$for(pb.int('i'), 0, 3, function () {\r\n this.$if(pb.lessThan(this.sphere.at(this.i), this.aabbMin.at(this.i)), function () {\r\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMin.at(this.i));\r\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\r\n }).$elseif(pb.greaterThan(this.sphere.at(this.i), this.aabbMax.at(this.i)), function () {\r\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMax.at(this.i));\r\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\r\n });\r\n });\r\n this.$if(pb.lessThanEqual(this.dmin, pb.mul(this.sphere.w, this.sphere.w)), function () {\r\n this.$return(true);\r\n });\r\n this.$return(false);\r\n }\r\n );\r\n pb.main(function () {\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$builtins.position = pb.vec4(this.$inputs.pos.xy, 0, 1);\r\n if (pb.getDevice().type === 'webgpu') {\r\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\r\n }\r\n this.$l.tileIndex = webgl1 ? pb.int(this.$inputs.pos.z) : pb.int(this.$builtins.vertexIndex);\r\n this.$l.tileSize = pb.div(this.sizeParam.xy, pb.vec2(this.countParam.xy));\r\n this.$l.zIndex = pb.div(this.tileIndex, pb.mul(this.countParam.x, this.countParam.y));\r\n this.$l.yIndex = pb.div(\r\n pb.sub(this.tileIndex, pb.mul(this.zIndex, this.countParam.x, this.countParam.y)),\r\n this.countParam.x\r\n );\r\n this.$l.xIndex = pb.sub(\r\n this.tileIndex,\r\n pb.add(\r\n pb.mul(this.zIndex, this.countParam.x, this.countParam.y),\r\n pb.mul(this.yIndex, this.countParam.x)\r\n )\r\n );\r\n this.$l.maxPoint_sS = pb.vec4(\r\n pb.mul(\r\n pb.vec2(pb.float(pb.add(this.xIndex, 1)), pb.float(pb.add(this.yIndex, 1))),\r\n this.tileSize\r\n ),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.minPoint_sS = pb.vec4(\r\n pb.mul(pb.vec2(pb.float(this.xIndex), pb.float(this.yIndex)), this.tileSize),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.maxPoint_vS = this.screenToView(this.maxPoint_sS).xyz;\r\n this.$l.minPoint_vS = this.screenToView(this.minPoint_sS).xyz;\r\n this.$l.tileNear = pb.mul(\r\n pb.neg(this.sizeParam.z),\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sizeParam.z),\r\n pb.div(pb.float(this.zIndex), pb.float(this.countParam.z))\r\n )\r\n );\r\n this.$l.tileFar = pb.mul(\r\n pb.neg(this.sizeParam.z),\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sizeParam.z),\r\n pb.div(pb.add(pb.float(this.zIndex), 1), pb.float(this.countParam.z))\r\n )\r\n );\r\n this.$l.eyePos = pb.vec3(0);\r\n this.$l.minPointNear = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileNear);\r\n this.$l.minPointFar = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileFar);\r\n this.$l.maxPointNear = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileNear);\r\n this.$l.maxPointFar = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileFar);\r\n this.$l.aabbMin = pb.min(\r\n pb.min(this.minPointNear, this.minPointFar),\r\n pb.min(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.$l.aabbMax = pb.max(\r\n pb.max(this.minPointNear, this.minPointFar),\r\n pb.max(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.$l.n = pb.int(0);\r\n if (webgl1) {\r\n this.$l.lightIndices = pb.float[8]();\r\n this.$for(pb.int('i'), 0, 8, function () {\r\n this.lightIndices.setAt(this.i, 0);\r\n });\r\n this.$for(pb.int('i'), 1, 256, function () {\r\n this.$if(pb.equal(this.i, this.countParam.w), function () {\r\n this.$break();\r\n });\r\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\r\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\r\n this.$l.lightPos.w = this.light.w;\r\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\r\n this.$for(pb.int('j'), 0, 8, function () {\r\n this.$if(pb.equal(this.j, this.n), function () {\r\n this.lightIndices.setAt(this.j, pb.float(this.i));\r\n this.n = pb.add(this.n, 1);\r\n this.$break();\r\n });\r\n });\r\n this.$if(pb.equal(this.n, 8), function () {\r\n this.$break();\r\n });\r\n });\r\n });\r\n this.$outputs.value.r = pb.add(pb.mul(this.lightIndices[0], 256), this.lightIndices[1]);\r\n this.$outputs.value.g = pb.add(pb.mul(this.lightIndices[2], 256), this.lightIndices[3]);\r\n this.$outputs.value.b = pb.add(pb.mul(this.lightIndices[4], 256), this.lightIndices[5]);\r\n this.$outputs.value.a = pb.add(pb.mul(this.lightIndices[6], 256), this.lightIndices[7]);\r\n } else {\r\n this.$l.lightIndex = [\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0)\r\n ];\r\n this.$for(pb.uint('i'), 1, pb.uint(this.countParam.w), function () {\r\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\r\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\r\n this.$l.lightPos.w = this.light.w;\r\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\r\n this.lightIndex.setAt(this.n, this.i);\r\n this.n = pb.add(this.n, 1);\r\n this.$if(pb.equal(this.n, 16), function () {\r\n this.$break();\r\n });\r\n });\r\n });\r\n this.$l.r = pb.add(\r\n pb.sal(this.lightIndex[0], 24),\r\n pb.sal(this.lightIndex[1], 16),\r\n pb.sal(this.lightIndex[2], 8),\r\n this.lightIndex[3]\r\n );\r\n this.$l.g = pb.add(\r\n pb.sal(this.lightIndex[4], 24),\r\n pb.sal(this.lightIndex[5], 16),\r\n pb.sal(this.lightIndex[6], 8),\r\n this.lightIndex[7]\r\n );\r\n this.$l.b = pb.add(\r\n pb.sal(this.lightIndex[8], 24),\r\n pb.sal(this.lightIndex[9], 16),\r\n pb.sal(this.lightIndex[10], 8),\r\n this.lightIndex[11]\r\n );\r\n this.$l.a = pb.add(\r\n pb.sal(this.lightIndex[12], 24),\r\n pb.sal(this.lightIndex[13], 16),\r\n pb.sal(this.lightIndex[14], 8),\r\n this.lightIndex[15]\r\n );\r\n this.$outputs.value = pb.uvec4(this.r, this.g, this.b, this.a);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = webgl1 ? pb.vec4() : pb.uvec4();\r\n pb.main(function () {\r\n this.$outputs.color = this.$inputs.value;\r\n });\r\n }\r\n })!;\r\n this._lightIndexProgram.name = '@ClusteredLight_Index';\r\n this._bindGroup = device.createBindGroup(this._lightIndexProgram.bindGroupLayouts[0]);\r\n this._lightBuffer?.dispose();\r\n const lightBufferType = this._lightIndexProgram.getBindingInfo(\r\n ShaderHelper.getLightBufferUniformName()!\r\n )!.type;\r\n this._lightBuffer = device.createStructuredBuffer(lightBufferType as PBStructTypeInfo, {\r\n usage: 'uniform'\r\n });\r\n }\r\n private createLightIndexTexture(device: AbstractDevice) {\r\n const exp = Math.log2(this._tileCountX * this._tileCountY * this._tileCountZ);\r\n const a = (exp + 1) >>> 1;\r\n const b = exp - a;\r\n const textureWidth = 2 << (a - 1);\r\n const textureHeight = 2 << (b - 1);\r\n if (textureWidth * textureHeight !== this._tileCountX * this._tileCountY * this._tileCountZ) {\r\n throw new Error('Internal error');\r\n }\r\n this._lightIndexTexture = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rgba32ui',\r\n textureWidth,\r\n textureHeight,\r\n { mipmapping: false }\r\n )!;\r\n this._lightIndexTexture.name = 'ClusterLightIndex';\r\n this._lightIndexFramebuffer?.dispose();\r\n this._lightIndexFramebuffer = device.createFrameBuffer([this._lightIndexTexture], null);\r\n }\r\n calculateLightIndex(\r\n camera: Camera,\r\n renderQueue: RenderQueue,\r\n screenSpaceShadowMask = camera.screenSpaceShadowMask,\r\n preExposure = 1\r\n ) {\r\n const numLights = this.getVisibleLights(renderQueue, this._lights, screenSpaceShadowMask, preExposure);\r\n const device = getDevice();\r\n if (!this._lightIndexTexture) {\r\n this.createLightIndexTexture(device);\r\n }\r\n if (!this._lightIndexProgram) {\r\n this.createProgram(device);\r\n }\r\n if (!this._lightIndexVertexLayout) {\r\n this.createVertexLayout(device, this._lightIndexTexture!.width, this._lightIndexTexture!.height);\r\n }\r\n if (!this._lightIndexRenderStates) {\r\n this.createRenderState(device);\r\n }\r\n const viewport = device.getViewport();\r\n const vw = device.screenXToDevice(viewport.width);\r\n const vh = device.screenYToDevice(viewport.height);\r\n const scale = this._tileCountZ / Math.log2(camera.getFarPlane() / camera.getNearPlane());\r\n const bias = -(\r\n (this._tileCountZ * Math.log2(camera.getNearPlane())) /\r\n Math.log2(camera.getFarPlane() / camera.getNearPlane())\r\n );\r\n this._clusterParam.setXYZW(vw, vh, scale, bias);\r\n this._sizeParam.setXYZW(vw, vh, camera.getNearPlane(), camera.getFarPlane());\r\n this._countParam[0] = this._tileCountX;\r\n this._countParam[1] = this._tileCountY;\r\n this._countParam[2] = this._tileCountZ;\r\n // countParam.w stores light count + 1 because clustered indices start from 1.\r\n // Keep it valid even when there are no unshadowed punctual lights so clustered\r\n // shading math stays well-defined for emissive and environment lighting paths.\r\n this._countParam[3] = numLights + 1;\r\n device.pushDeviceStates();\r\n device.setFramebuffer(this._lightIndexFramebuffer);\r\n if (numLights > 0) {\r\n if (this._lightBuffer!.disposed) {\r\n this._lightBuffer!.reload();\r\n }\r\n this._lightBuffer!.bufferSubData(0, this._lights);\r\n this._bindGroup!.setValue('invProjMatrix', camera.getInvProjectionMatrix());\r\n this._bindGroup!.setValue('viewMatrix', camera.viewMatrix);\r\n this._bindGroup!.setValue('sizeParam', this._sizeParam);\r\n this._bindGroup!.setValue('countParam', this._countParam);\r\n this._bindGroup!.setBuffer(ShaderHelper.getLightBufferUniformName(), this._lightBuffer!);\r\n device.setProgram(this._lightIndexProgram);\r\n device.setVertexLayout(this._lightIndexVertexLayout);\r\n device.setBindGroup(0, this._bindGroup!);\r\n const savedRS = device.getRenderStates();\r\n device.setRenderStates(this._lightIndexRenderStates);\r\n device.draw('point-list', 0, this._tileCountX * this._tileCountY * this._tileCountZ);\r\n device.setRenderStates(savedRS);\r\n } else {\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 0), DEPTH_CLEAR_VALUE, 0);\r\n }\r\n device.popDeviceStates();\r\n }\r\n private getVisibleLights(\r\n renderQueue: RenderQueue,\r\n lights: Float32Array,\r\n useShadowMask: boolean,\r\n preExposure: number\r\n ) {\r\n const writeLight = (light: PunctualLight, slot: number) => {\r\n const offset = slot * 16;\r\n const colorIntensity = light.diffuseAndIntensity;\r\n lights.set(light.positionAndRange, offset);\r\n lights.set(light.directionAndCutoff, offset + 4);\r\n // Only the intensity carries the camera pre-exposure; the color stays as authored. The\r\n // light's own cached vector must not be mutated because it is shared across cameras.\r\n lights[offset + 8] = colorIntensity.x;\r\n lights[offset + 9] = colorIntensity.y;\r\n lights[offset + 10] = colorIntensity.z;\r\n lights[offset + 11] = colorIntensity.w * preExposure;\r\n lights.set(light.extraParams, offset + 12);\r\n };\r\n // When the screen-space shadow mask is active, shadow-casting lights occupy\r\n // the head of the buffer (slots 1..N) in the exact order of\r\n // renderQueue.shadowedLights. The mask pass must assign layers/channels from\r\n // the SAME list in the SAME order so that a light's buffer index maps to its\r\n // mask slot without storing a per-light index. Keep these two in lockstep.\r\n let numShadow = 0;\r\n let slot = 0;\r\n if (useShadowMask) {\r\n numShadow = Math.min(\r\n renderQueue.shadowedLights.length,\r\n MAX_SHADOW_MASK_LIGHTS,\r\n ShaderHelper.getMaxClusterLights()\r\n );\r\n for (let i = 1; i <= numShadow; i++) {\r\n writeLight(renderQueue.shadowedLights[i - 1], i);\r\n }\r\n slot = numShadow;\r\n }\r\n // Unshadowed lights fill the region after the mask-backed shadow lights.\r\n const numUnshadowed = Math.min(\r\n renderQueue.unshadowedLights.length,\r\n ShaderHelper.getMaxClusterLights() - slot\r\n );\r\n for (let j = 0; j < numUnshadowed; j++) {\r\n writeLight(renderQueue.unshadowedLights[j], slot + j + 1);\r\n }\r\n slot += numUnshadowed;\r\n // Shadow-casting lights beyond the mask capacity (MAX_SHADOW_MASK_LIGHTS) have\r\n // no mask slot. Rather than dropping them silently, place them past index N so\r\n // they are still lit — without a mask sample, i.e. degraded to no shadow.\r\n if (useShadowMask && renderQueue.shadowedLights.length > numShadow) {\r\n const overflow = renderQueue.shadowedLights.length - numShadow;\r\n const numOverflow = Math.min(overflow, ShaderHelper.getMaxClusterLights() - slot);\r\n for (let k = 0; k < numOverflow; k++) {\r\n writeLight(renderQueue.shadowedLights[numShadow + k], slot + k + 1);\r\n }\r\n slot += numOverflow;\r\n if (!ClusteredLight._warnedShadowMaskOverflow) {\r\n ClusteredLight._warnedShadowMaskOverflow = true;\r\n console.warn(\r\n `ClusteredLight: ${renderQueue.shadowedLights.length} shadow-casting lights exceed the ` +\r\n `screen-space shadow mask capacity (${MAX_SHADOW_MASK_LIGHTS}); ${overflow} light(s) are ` +\r\n `lit without shadows${numOverflow < overflow ? `, and ${overflow - numOverflow} dropped` : ''}.`\r\n );\r\n }\r\n }\r\n this._numShadowLights = numShadow;\r\n return slot;\r\n }\r\n}\r\n"],"names":["ClusteredLight","_warnedShadowMaskOverflow","_tileCountX","_tileCountY","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_sizeParam","_countParam","_clusterParam","_numShadowLights","Float32Array","ShaderHelper","getMaxClusterLights","Vector4","Int32Array","lightBuffer","numShadowLights","clusterParam","countParam","lightIndexTexture","createVertexLayout","device","textureWidth","textureHeight","vb","type","vertices","i","length","ix","iy","Math","floor","createVertexBuffer","vertexBuffers","buffer","createRenderState","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","createProgram","webgl1","buildRenderProgram","vertex","pb","$inputs","pos","vec3","vec2","attrib","$outputs","value","vec4","uvec4","invProjMatrix","mat4","uniform","viewMatrix","sizeParam","ivec4","getLightBufferUniformName","uniformBuffer","func","float","$l","normal","ab","sub","b","a","t","div","zDistance","dot","$return","add","mul","view","clip","w","texCoord","screen","xy","x","y","z","clipToView","dmin","$if","lessThanEqual","sphere","$for","int","lessThan","at","aabbMin","delta","$elseif","greaterThan","aabbMax","main","getDevice","$builtins","pointSize","position","tileIndex","vertexIndex","tileSize","zIndex","yIndex","xIndex","maxPoint_sS","minPoint_sS","maxPoint_vS","screenToView","xyz","minPoint_vS","tileNear","neg","pow","tileFar","eyePos","minPointNear","lineIntersectionToZPlane","minPointFar","maxPointNear","maxPointFar","min","max","n","lightIndices","setAt","equal","$break","light","lightPos","sphereIntersectsAABB","j","r","g","lightIndex","uint","sal","fragment","color","name","createBindGroup","bindGroupLayouts","dispose","lightBufferType","getBindingInfo","createStructuredBuffer","usage","createLightIndexTexture","exp","log2","Error","createTexture2D","mipmapping","createFrameBuffer","calculateLightIndex","camera","renderQueue","screenSpaceShadowMask","preExposure","numLights","getVisibleLights","width","height","viewport","getViewport","vw","screenXToDevice","vh","screenYToDevice","scale","getFarPlane","getNearPlane","bias","setXYZW","pushDeviceStates","setFramebuffer","disposed","reload","bufferSubData","setValue","getInvProjectionMatrix","setBuffer","setProgram","setVertexLayout","setBindGroup","savedRS","getRenderStates","setRenderStates","draw","clearFrameBuffer","DEPTH_CLEAR_VALUE","popDeviceStates","lights","useShadowMask","writeLight","slot","offset","colorIntensity","diffuseAndIntensity","set","positionAndRange","directionAndCutoff","extraParams","numShadow","shadowedLights","MAX_SHADOW_MASK_LIGHTS","numUnshadowed","unshadowedLights","overflow","numOverflow","k","console","warn"],"mappings":";;;;;AAoBO,MAAMA,cAAAA,CAAAA;wEAEX,OAAeC,yBAAAA,GAA4B,KAAM;IAChCC,WAAoB;IACpBC,WAAoB;IACpBC,WAAoB;IACpBC,OAAmC;IAC5CC,kBAAwC;IACxCC,sBAA8C;IAC9CC,kBAAyC;IACzCC,UAAgC;IAChCC,uBAAgD;IAChDC,uBAAkD;IAClDC,YAAyC;IAChCC,UAAoB;IAC7BC,WAAqC;IAC5BC,aAAuB;IAChCC,gBAAyB;IACjC,WAAc,EAAA;QACZ,IAAI,CAACd,WAAW,GAAG,EAAA;QACnB,IAAI,CAACC,WAAW,GAAG,EAAA;QACnB,IAAI,CAACC,WAAW,GAAG,EAAA;QACnB,IAAI,CAACC,OAAO,GAAG,IAAIY,YAAAA,CAAa,MAAMC,YAAAA,CAAaC,mBAAmB,EAAA,GAAK,CAAA,CAAA,CAAA;QAC3E,IAAI,CAACb,kBAAkB,GAAG,IAAA;QAC1B,IAAI,CAACC,sBAAsB,GAAG,IAAA;QAC9B,IAAI,CAACC,kBAAkB,GAAG,IAAA;QAC1B,IAAI,CAACI,YAAY,GAAG,IAAA;QACpB,IAAI,CAACH,UAAU,GAAG,IAAA;QAClB,IAAI,CAACC,uBAAuB,GAAG,IAAA;QAC/B,IAAI,CAACC,uBAAuB,GAAG,IAAA;QAC/B,IAAI,CAACE,UAAU,GAAG,IAAIO,OAAAA,EAAAA;AACtB,QAAA,IAAI,CAACN,WAAW,GAAG,IAAIO,UAAW,CAAA,CAAA,CAAA;QAClC,IAAI,CAACN,aAAa,GAAG,IAAIK,OAAAA,EAAAA;QACzB,IAAI,CAACJ,gBAAgB,GAAG,CAAA;AAC1B;AACA,IAAA,IAAIM,WAAc,GAAA;QAChB,OAAO,IAAI,CAACV,YAAY;AAC1B;AACA;;;;AAIC,MACD,IAAIW,eAAkB,GAAA;QACpB,OAAO,IAAI,CAACP,gBAAgB;AAC9B;AACA,IAAA,IAAIQ,YAAe,GAAA;QACjB,OAAO,IAAI,CAACT,aAAa;AAC3B;AACA,IAAA,IAAIU,UAAa,GAAA;QACf,OAAO,IAAI,CAACX,WAAW;AACzB;AACA,IAAA,IAAIY,iBAAoB,GAAA;QACtB,OAAO,IAAI,CAACpB,kBAAkB;AAChC;AACQqB,IAAAA,kBAAAA,CAAmBC,MAAsB,EAAEC,YAAoB,EAAEC,aAAqB,EAAE;QAC9F,IAAIC,EAAAA;QACJ,IAAIH,MAAAA,CAAOI,IAAI,KAAK,OAAS,EAAA;AAC3B,YAAA,MAAMC,QAAW,GAAA,IAAIhB,YAAa,CAAA,IAAI,CAACf,WAAW,GAAG,IAAI,CAACC,WAAW,GAAG,IAAI,CAACC,WAAW,GAAG,CAAA,CAAA;AAC3F,YAAA,IAAK,IAAI8B,CAAI,GAAA,CAAA,EAAGA,IAAID,QAASE,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;AACxC,gBAAA,MAAME,KAAKF,CAAIL,GAAAA,YAAAA;AACf,gBAAA,MAAMQ,EAAKC,GAAAA,IAAAA,CAAKC,KAAK,CAACL,CAAIL,GAAAA,YAAAA,CAAAA;gBAC1BI,QAAQ,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,CAAC,IAAKE,EAAAA,GAAK,GAAE,CAAA,GAAMP,YAAe,GAAA,CAAA;gBACxDI,QAAQ,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,CAAC,IAAKG,EAAAA,GAAK,GAAE,CAAA,GAAMP,aAAgB,GAAA,CAAA;AACzDG,gBAAAA,QAAQ,CAACC,CAAAA,GAAI,CAAI,GAAA,CAAA,CAAE,GAAGA,CAAAA;AACxB;YACAH,EAAKH,GAAAA,MAAAA,CAAOY,kBAAkB,CAAC,gBAAkBP,EAAAA,QAAAA,CAAAA;SAC5C,MAAA;AACL,YAAA,MAAMA,QAAW,GAAA,IAAIhB,YAAa,CAAA,IAAI,CAACf,WAAW,GAAG,IAAI,CAACC,WAAW,GAAG,IAAI,CAACC,WAAW,GAAG,CAAA,CAAA;AAC3F,YAAA,IAAK,IAAI8B,CAAI,GAAA,CAAA,EAAGA,IAAID,QAASE,CAAAA,MAAM,EAAED,CAAK,EAAA,CAAA;AACxC,gBAAA,MAAME,KAAKF,CAAIL,GAAAA,YAAAA;AACf,gBAAA,MAAMQ,EAAKC,GAAAA,IAAAA,CAAKC,KAAK,CAACL,CAAIL,GAAAA,YAAAA,CAAAA;gBAC1BI,QAAQ,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,CAAC,IAAKE,EAAAA,GAAK,GAAE,CAAA,GAAMP,YAAe,GAAA,CAAA;gBACxDI,QAAQ,CAACC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,CAAC,IAAKG,EAAAA,GAAK,GAAE,CAAA,GAAMP,aAAgB,GAAA,CAAA;AAC3D;YACAC,EAAKH,GAAAA,MAAAA,CAAOY,kBAAkB,CAAC,gBAAkBP,EAAAA,QAAAA,CAAAA;AACnD;AACA,QAAA,IAAI,CAACvB,uBAAuB,GAAGkB,MAAAA,CAAOD,kBAAkB,CAAC;YACvDc,aAAe,EAAA;AAAC,gBAAA;oBAAEC,MAAQX,EAAAA;AAAG;AAAE;AACjC,SAAA,CAAA;AACF;AACQY,IAAAA,iBAAAA,CAAkBf,MAAsB,EAAE;AAChD,QAAA,IAAI,CAACjB,uBAAuB,GAAGiB,MAAAA,CAAOgB,oBAAoB,EAAA;QAC1D,IAAI,CAACjC,uBAAuB,CAACkC,aAAa,GAAGC,UAAU,CAAC,KAAOC,CAAAA,CAAAA,WAAW,CAAC,KAAA,CAAA;AAC3E,QAAA,IAAI,CAACpC,uBAAuB,CAACqC,kBAAkB,EAAA,CAAGC,WAAW,CAAC,MAAA,CAAA;AAChE;AACQC,IAAAA,aAAAA,CAActB,MAAsB,EAAE;QAC5C,MAAMuB,MAAAA,GAASvB,MAAOI,CAAAA,IAAI,KAAK,OAAA;AAC/B,QAAA,IAAI,CAACxB,kBAAkB,GAAGoB,MAAAA,CAAOwB,kBAAkB,CAAC;AAClDC,YAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;AACP,gBAAA,IAAI,CAACC,OAAO,CAACC,GAAG,GAAG,CAACL,MAAAA,GAASG,EAAGG,CAAAA,IAAI,KAAKH,EAAGI,CAAAA,IAAI,EAAC,EAAGC,MAAM,CAAC,UAAA,CAAA;gBAC3D,IAAI,CAACC,QAAQ,CAACC,KAAK,GAAGV,SAASG,EAAGQ,CAAAA,IAAI,EAAKR,GAAAA,EAAAA,CAAGS,KAAK,EAAA;AACnD,gBAAA,IAAI,CAACC,aAAa,GAAGV,GAAGW,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACvC,gBAAA,IAAI,CAACC,UAAU,GAAGb,GAAGW,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACpC,gBAAA,IAAI,CAACE,SAAS,GAAGd,GAAGQ,IAAI,EAAA,CAAGI,OAAO,CAAC,CAAA,CAAA;AACnC,gBAAA,IAAI,CAACzC,UAAU,GAAG6B,GAAGe,KAAK,EAAA,CAAGH,OAAO,CAAC,CAAA,CAAA;AACrC,gBAAA,IAAI,CAAChD,YAAaoD,CAAAA,yBAAyB,GAAG,GAC5ChB,EAAAA,CAAGQ,IAAI,CAAE5C,CAAAA,YAAAA,CAAaC,mBAAmB,EAAK,GAAA,CAAA,IAAK,CAAE,CAAA,EAAA,CAAGoD,aAAa,CAAC,CAAA,CAAA;gBACxEjB,EAAGkB,CAAAA,IAAI,CAAC,0BAA4B,EAAA;AAAClB,oBAAAA,EAAAA,CAAGG,IAAI,CAAC,GAAA,CAAA;AAAMH,oBAAAA,EAAAA,CAAGG,IAAI,CAAC,GAAA,CAAA;AAAMH,oBAAAA,EAAAA,CAAGmB,KAAK,CAAC,WAAA;iBAAa,EAAE,WAAA;oBACvF,IAAI,CAACC,EAAE,CAACC,MAAM,GAAGrB,EAAGG,CAAAA,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,oBAAA,IAAI,CAACiB,EAAE,CAACE,EAAE,GAAGtB,EAAGuB,CAAAA,GAAG,CAAC,IAAI,CAACC,CAAC,EAAE,IAAI,CAACC,CAAC,CAAA;AAClC,oBAAA,IAAI,CAACL,EAAE,CAACM,CAAC,GAAG1B,EAAG2B,CAAAA,GAAG,CAChB3B,EAAAA,CAAGuB,GAAG,CAAC,IAAI,CAACK,SAAS,EAAE5B,EAAG6B,CAAAA,GAAG,CAAC,IAAI,CAACR,MAAM,EAAE,IAAI,CAACI,CAAC,CACjDzB,CAAAA,EAAAA,EAAAA,CAAG6B,GAAG,CAAC,IAAI,CAACR,MAAM,EAAE,IAAI,CAACC,EAAE,CAAA,CAAA;AAE7B,oBAAA,IAAI,CAACQ,OAAO,CAAC9B,GAAG+B,GAAG,CAAC,IAAI,CAACN,CAAC,EAAEzB,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACN,CAAC,EAAE,IAAI,CAACJ,EAAE,CAAA,CAAA,CAAA;AACpD,iBAAA,CAAA;gBACAtB,EAAGkB,CAAAA,IAAI,CAAC,YAAc,EAAA;AAAClB,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,MAAA;iBAAQ,EAAE,WAAA;AACvC,oBAAA,IAAI,CAACY,EAAE,CAACa,IAAI,GAAGjC,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACtB,aAAa,EAAE,IAAI,CAACwB,IAAI,CAAA;AACnD,oBAAA,IAAI,CAACJ,OAAO,CAAC9B,EAAAA,CAAG2B,GAAG,CAAC,IAAI,CAACM,IAAI,EAAE,IAAI,CAACA,IAAI,CAACE,CAAC,CAAA,CAAA;AAC5C,iBAAA,CAAA;gBACAnC,EAAGkB,CAAAA,IAAI,CAAC,cAAgB,EAAA;AAAClB,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,QAAA;iBAAU,EAAE,WAAA;AAC3C,oBAAA,IAAI,CAACY,EAAE,CAACgB,QAAQ,GAAGpC,EAAAA,CAAG2B,GAAG,CAAC,IAAI,CAACU,MAAM,CAACC,EAAE,EAAE,IAAI,CAACxB,SAAS,CAACwB,EAAE,CAAA;oBAC3D,IAAI,CAAClB,EAAE,CAACc,IAAI,GAAGlC,EAAGQ,CAAAA,IAAI,CACpBR,EAAAA,CAAGuB,GAAG,CAACvB,GAAGgC,GAAG,CAAChC,GAAGI,IAAI,CAAC,IAAI,CAACgC,QAAQ,CAACG,CAAC,EAAEvC,EAAAA,CAAGuB,GAAG,CAAC,CAAA,EAAG,IAAI,CAACa,QAAQ,CAACI,CAAC,CAAA,CAAA,EAAI,CAAIxC,CAAAA,EAAAA,EAAAA,CAAGI,IAAI,CAAC,KAChF,IAAI,CAACiC,MAAM,CAACI,CAAC,EACb,IAAI,CAACJ,MAAM,CAACF,CAAC,CAAA;oBAEf,IAAI,CAACL,OAAO,CAAC,IAAI,CAACY,UAAU,CAAC,IAAI,CAACR,IAAI,CAAA,CAAA;AACxC,iBAAA,CAAA;gBACAlC,EAAGkB,CAAAA,IAAI,CACL,sBACA,EAAA;AAAClB,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,QAAA,CAAA;AAAWR,oBAAAA,EAAAA,CAAGG,IAAI,CAAC,SAAA,CAAA;AAAYH,oBAAAA,EAAAA,CAAGG,IAAI,CAAC,SAAA;iBAAW,EAC3D,WAAA;AACE,oBAAA,IAAI,CAACiB,EAAE,CAACuB,IAAI,GAAG3C,EAAAA,CAAGmB,KAAK,CAAC,CAAA,CAAA;AACxB,oBAAA,IAAI,CAACyB,GAAG,CAAC5C,EAAAA,CAAG6C,aAAa,CAAC,IAAI,CAACC,MAAM,CAACX,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC3C,IAAI,CAACL,OAAO,CAAC,IAAA,CAAA;AACf,qBAAA,CAAA;oBACA,IAAI,CAACiB,IAAI,CAAC/C,EAAAA,CAAGgD,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,CAAG,EAAA,WAAA;wBAC3B,IAAI,CAACJ,GAAG,CAAC5C,EAAGiD,CAAAA,QAAQ,CAAC,IAAI,CAACH,MAAM,CAACI,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAG,EAAA,IAAI,CAACuE,OAAO,CAACD,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAI,CAAA,EAAA,WAAA;4BACrE,IAAI,CAACwC,EAAE,CAACgC,KAAK,GAAGpD,EAAGuB,CAAAA,GAAG,CAAC,IAAI,CAACuB,MAAM,CAACI,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAA,EAAG,IAAI,CAACuE,OAAO,CAACD,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAA,CAAA;AACrE,4BAAA,IAAI,CAAC+D,IAAI,GAAG3C,GAAG+B,GAAG,CAAC,IAAI,CAACY,IAAI,EAAE3C,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACoB,KAAK,EAAE,IAAI,CAACA,KAAK,CAAA,CAAA;yBAC1DC,CAAAA,CAAAA,OAAO,CAACrD,EAAAA,CAAGsD,WAAW,CAAC,IAAI,CAACR,MAAM,CAACI,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAA,EAAG,IAAI,CAAC2E,OAAO,CAACL,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAI,CAAA,EAAA,WAAA;4BAC1E,IAAI,CAACwC,EAAE,CAACgC,KAAK,GAAGpD,EAAGuB,CAAAA,GAAG,CAAC,IAAI,CAACuB,MAAM,CAACI,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAA,EAAG,IAAI,CAAC2E,OAAO,CAACL,EAAE,CAAC,IAAI,CAACtE,CAAC,CAAA,CAAA;AACrE,4BAAA,IAAI,CAAC+D,IAAI,GAAG3C,GAAG+B,GAAG,CAAC,IAAI,CAACY,IAAI,EAAE3C,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACoB,KAAK,EAAE,IAAI,CAACA,KAAK,CAAA,CAAA;AAC7D,yBAAA,CAAA;AACF,qBAAA,CAAA;oBACA,IAAI,CAACR,GAAG,CAAC5C,EAAG6C,CAAAA,aAAa,CAAC,IAAI,CAACF,IAAI,EAAE3C,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACc,MAAM,CAACX,CAAC,EAAE,IAAI,CAACW,MAAM,CAACX,CAAC,CAAI,CAAA,EAAA,WAAA;wBAC1E,IAAI,CAACL,OAAO,CAAC,IAAA,CAAA;AACf,qBAAA,CAAA;oBACA,IAAI,CAACA,OAAO,CAAC,KAAA,CAAA;AACf,iBAAA,CAAA;AAEF9B,gBAAAA,EAAAA,CAAGwD,IAAI,CAAC,WAAA;AACN,oBAAA,IAAIxD,EAAGyD,CAAAA,SAAS,EAAG/E,CAAAA,IAAI,KAAK,QAAU,EAAA;AACpC,wBAAA,IAAI,CAACgF,SAAS,CAACC,SAAS,GAAG,CAAA;AAC7B;AACA,oBAAA,IAAI,CAACD,SAAS,CAACE,QAAQ,GAAG5D,GAAGQ,IAAI,CAAC,IAAI,CAACP,OAAO,CAACC,GAAG,CAACoC,EAAE,EAAE,CAAG,EAAA,CAAA,CAAA;AAC1D,oBAAA,IAAItC,EAAGyD,CAAAA,SAAS,EAAG/E,CAAAA,IAAI,KAAK,QAAU,EAAA;wBACpC,IAAI,CAACgF,SAAS,CAACE,QAAQ,GAAG5D,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAAC0B,SAAS,CAACE,QAAQ,EAAE5D,EAAGQ,CAAAA,IAAI,CAAC,CAAG,EAAA,IAAI,CAAG,EAAA,CAAA,CAAA,CAAA;AAC9E;oBACA,IAAI,CAACY,EAAE,CAACyC,SAAS,GAAGhE,SAASG,EAAGgD,CAAAA,GAAG,CAAC,IAAI,CAAC/C,OAAO,CAACC,GAAG,CAACuC,CAAC,CAAA,GAAIzC,EAAGgD,CAAAA,GAAG,CAAC,IAAI,CAACU,SAAS,CAACI,WAAW,CAAA;oBAC3F,IAAI,CAAC1C,EAAE,CAAC2C,QAAQ,GAAG/D,EAAG2B,CAAAA,GAAG,CAAC,IAAI,CAACb,SAAS,CAACwB,EAAE,EAAEtC,EAAGI,CAAAA,IAAI,CAAC,IAAI,CAACjC,UAAU,CAACmE,EAAE,CAAA,CAAA;oBACvE,IAAI,CAAClB,EAAE,CAAC4C,MAAM,GAAGhE,GAAG2B,GAAG,CAAC,IAAI,CAACkC,SAAS,EAAE7D,GAAGgC,GAAG,CAAC,IAAI,CAAC7D,UAAU,CAACoE,CAAC,EAAE,IAAI,CAACpE,UAAU,CAACqE,CAAC,CAAA,CAAA;AACnF,oBAAA,IAAI,CAACpB,EAAE,CAAC6C,MAAM,GAAGjE,GAAG2B,GAAG,CACrB3B,EAAGuB,CAAAA,GAAG,CAAC,IAAI,CAACsC,SAAS,EAAE7D,EAAAA,CAAGgC,GAAG,CAAC,IAAI,CAACgC,MAAM,EAAE,IAAI,CAAC7F,UAAU,CAACoE,CAAC,EAAE,IAAI,CAACpE,UAAU,CAACqE,CAAC,CAAA,CAAA,EAC/E,IAAI,CAACrE,UAAU,CAACoE,CAAC,CAAA;oBAEnB,IAAI,CAACnB,EAAE,CAAC8C,MAAM,GAAGlE,EAAGuB,CAAAA,GAAG,CACrB,IAAI,CAACsC,SAAS,EACd7D,EAAAA,CAAG+B,GAAG,CACJ/B,EAAAA,CAAGgC,GAAG,CAAC,IAAI,CAACgC,MAAM,EAAE,IAAI,CAAC7F,UAAU,CAACoE,CAAC,EAAE,IAAI,CAACpE,UAAU,CAACqE,CAAC,CAAA,EACxDxC,GAAGgC,GAAG,CAAC,IAAI,CAACiC,MAAM,EAAE,IAAI,CAAC9F,UAAU,CAACoE,CAAC,CAAA,CAAA,CAAA;AAGzC,oBAAA,IAAI,CAACnB,EAAE,CAAC+C,WAAW,GAAGnE,EAAAA,CAAGQ,IAAI,CAC3BR,EAAAA,CAAGgC,GAAG,CACJhC,GAAGI,IAAI,CAACJ,GAAGmB,KAAK,CAACnB,GAAG+B,GAAG,CAAC,IAAI,CAACmC,MAAM,EAAE,CAAA,CAAA,CAAA,EAAKlE,GAAGmB,KAAK,CAACnB,GAAG+B,GAAG,CAAC,IAAI,CAACkC,MAAM,EAAE,CAAA,CAAA,CAAA,CAAA,EACvE,IAAI,CAACF,QAAQ,GAEf,GACA,EAAA,GAAA,CAAA;AAEF,oBAAA,IAAI,CAAC3C,EAAE,CAACgD,WAAW,GAAGpE,EAAGQ,CAAAA,IAAI,CAC3BR,EAAAA,CAAGgC,GAAG,CAAChC,EAAGI,CAAAA,IAAI,CAACJ,EAAGmB,CAAAA,KAAK,CAAC,IAAI,CAAC+C,MAAM,CAAGlE,EAAAA,EAAAA,CAAGmB,KAAK,CAAC,IAAI,CAAC8C,MAAM,CAAI,CAAA,EAAA,IAAI,CAACF,QAAQ,GAC3E,GACA,EAAA,GAAA,CAAA;AAEF,oBAAA,IAAI,CAAC3C,EAAE,CAACiD,WAAW,GAAG,IAAI,CAACC,YAAY,CAAC,IAAI,CAACH,WAAW,EAAEI,GAAG;AAC7D,oBAAA,IAAI,CAACnD,EAAE,CAACoD,WAAW,GAAG,IAAI,CAACF,YAAY,CAAC,IAAI,CAACF,WAAW,EAAEG,GAAG;oBAC7D,IAAI,CAACnD,EAAE,CAACqD,QAAQ,GAAGzE,GAAGgC,GAAG,CACvBhC,EAAG0E,CAAAA,GAAG,CAAC,IAAI,CAAC5D,SAAS,CAAC2B,CAAC,CAAA,EACvBzC,EAAG2E,CAAAA,GAAG,CACJ3E,EAAG2B,CAAAA,GAAG,CAAC,IAAI,CAACb,SAAS,CAACqB,CAAC,EAAE,IAAI,CAACrB,SAAS,CAAC2B,CAAC,CACzCzC,EAAAA,EAAAA,CAAG2B,GAAG,CAAC3B,EAAGmB,CAAAA,KAAK,CAAC,IAAI,CAAC6C,MAAM,CAAA,EAAGhE,EAAGmB,CAAAA,KAAK,CAAC,IAAI,CAAChD,UAAU,CAACsE,CAAC,CAAA,CAAA,CAAA,CAAA;oBAG5D,IAAI,CAACrB,EAAE,CAACwD,OAAO,GAAG5E,EAAGgC,CAAAA,GAAG,CACtBhC,EAAAA,CAAG0E,GAAG,CAAC,IAAI,CAAC5D,SAAS,CAAC2B,CAAC,CACvBzC,EAAAA,EAAAA,CAAG2E,GAAG,CACJ3E,EAAG2B,CAAAA,GAAG,CAAC,IAAI,CAACb,SAAS,CAACqB,CAAC,EAAE,IAAI,CAACrB,SAAS,CAAC2B,CAAC,CAAA,EACzCzC,EAAG2B,CAAAA,GAAG,CAAC3B,EAAAA,CAAG+B,GAAG,CAAC/B,EAAGmB,CAAAA,KAAK,CAAC,IAAI,CAAC6C,MAAM,CAAA,EAAG,CAAIhE,CAAAA,EAAAA,EAAAA,CAAGmB,KAAK,CAAC,IAAI,CAAChD,UAAU,CAACsE,CAAC,CAAA,CAAA,CAAA,CAAA;AAGvE,oBAAA,IAAI,CAACrB,EAAE,CAACyD,MAAM,GAAG7E,EAAAA,CAAGG,IAAI,CAAC,CAAA,CAAA;AACzB,oBAAA,IAAI,CAACiB,EAAE,CAAC0D,YAAY,GAAG,IAAI,CAACC,wBAAwB,CAAC,IAAI,CAACF,MAAM,EAAE,IAAI,CAACL,WAAW,EAAE,IAAI,CAACC,QAAQ,CAAA;AACjG,oBAAA,IAAI,CAACrD,EAAE,CAAC4D,WAAW,GAAG,IAAI,CAACD,wBAAwB,CAAC,IAAI,CAACF,MAAM,EAAE,IAAI,CAACL,WAAW,EAAE,IAAI,CAACI,OAAO,CAAA;AAC/F,oBAAA,IAAI,CAACxD,EAAE,CAAC6D,YAAY,GAAG,IAAI,CAACF,wBAAwB,CAAC,IAAI,CAACF,MAAM,EAAE,IAAI,CAACR,WAAW,EAAE,IAAI,CAACI,QAAQ,CAAA;AACjG,oBAAA,IAAI,CAACrD,EAAE,CAAC8D,WAAW,GAAG,IAAI,CAACH,wBAAwB,CAAC,IAAI,CAACF,MAAM,EAAE,IAAI,CAACR,WAAW,EAAE,IAAI,CAACO,OAAO,CAAA;AAC/F,oBAAA,IAAI,CAACxD,EAAE,CAAC+B,OAAO,GAAGnD,EAAAA,CAAGmF,GAAG,CACtBnF,EAAGmF,CAAAA,GAAG,CAAC,IAAI,CAACL,YAAY,EAAE,IAAI,CAACE,WAAW,CAC1ChF,EAAAA,EAAAA,CAAGmF,GAAG,CAAC,IAAI,CAACF,YAAY,EAAE,IAAI,CAACC,WAAW,CAAA,CAAA;AAE5C,oBAAA,IAAI,CAAC9D,EAAE,CAACmC,OAAO,GAAGvD,EAAAA,CAAGoF,GAAG,CACtBpF,EAAGoF,CAAAA,GAAG,CAAC,IAAI,CAACN,YAAY,EAAE,IAAI,CAACE,WAAW,CAC1ChF,EAAAA,EAAAA,CAAGoF,GAAG,CAAC,IAAI,CAACH,YAAY,EAAE,IAAI,CAACC,WAAW,CAAA,CAAA;AAE5C,oBAAA,IAAI,CAAC9D,EAAE,CAACiE,CAAC,GAAGrF,EAAAA,CAAGgD,GAAG,CAAC,CAAA,CAAA;AACnB,oBAAA,IAAInD,MAAQ,EAAA;wBACV,IAAI,CAACuB,EAAE,CAACkE,YAAY,GAAGtF,EAAGmB,CAAAA,KAAK,CAAC,CAAE,CAAA,EAAA;wBAClC,IAAI,CAAC4B,IAAI,CAAC/C,EAAAA,CAAGgD,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,CAAG,EAAA,WAAA;4BAC3B,IAAI,CAACsC,YAAY,CAACC,KAAK,CAAC,IAAI,CAAC3G,CAAC,EAAE,CAAA,CAAA;AAClC,yBAAA,CAAA;wBACA,IAAI,CAACmE,IAAI,CAAC/C,EAAAA,CAAGgD,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,GAAK,EAAA,WAAA;AAC7B,4BAAA,IAAI,CAACJ,GAAG,CAAC5C,EAAAA,CAAGwF,KAAK,CAAC,IAAI,CAAC5G,CAAC,EAAE,IAAI,CAACT,UAAU,CAACgE,CAAC,CAAG,EAAA,WAAA;AAC5C,gCAAA,IAAI,CAACsD,MAAM,EAAA;AACb,6BAAA,CAAA;AACA,4BAAA,IAAI,CAACrE,EAAE,CAACsE,KAAK,GAAG,IAAI,CAAC9H,YAAaoD,CAAAA,yBAAyB,GAAG,CAACkC,EAAE,CAAClD,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACpD,CAAC,EAAE,CAAA,CAAA,CAAA;4BACjF,IAAI,CAACwC,EAAE,CAACuE,QAAQ,GAAG3F,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACnB,UAAU,EAAEb,EAAAA,CAAGQ,IAAI,CAAC,IAAI,CAACkF,KAAK,CAACnB,GAAG,EAAE,CAAA,CAAA,CAAA;4BACnE,IAAI,CAACnD,EAAE,CAACuE,QAAQ,CAACxD,CAAC,GAAG,IAAI,CAACuD,KAAK,CAACvD,CAAC;AACjC,4BAAA,IAAI,CAACS,GAAG,CAAC,IAAI,CAACgD,oBAAoB,CAAC,IAAI,CAACD,QAAQ,EAAE,IAAI,CAACxC,OAAO,EAAE,IAAI,CAACI,OAAO,CAAG,EAAA,WAAA;gCAC7E,IAAI,CAACR,IAAI,CAAC/C,EAAAA,CAAGgD,GAAG,CAAC,GAAA,CAAA,EAAM,GAAG,CAAG,EAAA,WAAA;AAC3B,oCAAA,IAAI,CAACJ,GAAG,CAAC5C,EAAAA,CAAGwF,KAAK,CAAC,IAAI,CAACK,CAAC,EAAE,IAAI,CAACR,CAAC,CAAG,EAAA,WAAA;AACjC,wCAAA,IAAI,CAACC,YAAY,CAACC,KAAK,CAAC,IAAI,CAACM,CAAC,EAAE7F,EAAGmB,CAAAA,KAAK,CAAC,IAAI,CAACvC,CAAC,CAAA,CAAA;wCAC/C,IAAI,CAACyG,CAAC,GAAGrF,EAAAA,CAAG+B,GAAG,CAAC,IAAI,CAACsD,CAAC,EAAE,CAAA,CAAA;AACxB,wCAAA,IAAI,CAACI,MAAM,EAAA;AACb,qCAAA,CAAA;AACF,iCAAA,CAAA;gCACA,IAAI,CAAC7C,GAAG,CAAC5C,EAAGwF,CAAAA,KAAK,CAAC,IAAI,CAACH,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AAC5B,oCAAA,IAAI,CAACI,MAAM,EAAA;AACb,iCAAA,CAAA;AACF,6BAAA,CAAA;AACF,yBAAA,CAAA;wBACA,IAAI,CAACnF,QAAQ,CAACC,KAAK,CAACuF,CAAC,GAAG9F,EAAAA,CAAG+B,GAAG,CAAC/B,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACsD,YAAY,CAAC,CAAE,CAAA,EAAE,MAAM,IAAI,CAACA,YAAY,CAAC,CAAE,CAAA,CAAA;wBACtF,IAAI,CAAChF,QAAQ,CAACC,KAAK,CAACwF,CAAC,GAAG/F,EAAAA,CAAG+B,GAAG,CAAC/B,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACsD,YAAY,CAAC,CAAE,CAAA,EAAE,MAAM,IAAI,CAACA,YAAY,CAAC,CAAE,CAAA,CAAA;wBACtF,IAAI,CAAChF,QAAQ,CAACC,KAAK,CAACiB,CAAC,GAAGxB,EAAAA,CAAG+B,GAAG,CAAC/B,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACsD,YAAY,CAAC,CAAE,CAAA,EAAE,MAAM,IAAI,CAACA,YAAY,CAAC,CAAE,CAAA,CAAA;wBACtF,IAAI,CAAChF,QAAQ,CAACC,KAAK,CAACkB,CAAC,GAAGzB,EAAAA,CAAG+B,GAAG,CAAC/B,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACsD,YAAY,CAAC,CAAE,CAAA,EAAE,MAAM,IAAI,CAACA,YAAY,CAAC,CAAE,CAAA,CAAA;qBACjF,MAAA;AACL,wBAAA,IAAI,CAAClE,EAAE,CAAC4E,UAAU,GAAG;AACnBhG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA,CAAA;AACRjG,4BAAAA,EAAAA,CAAGiG,IAAI,CAAC,CAAA;AACT,yBAAA;AACD,wBAAA,IAAI,CAAClD,IAAI,CAAC/C,EAAGiG,CAAAA,IAAI,CAAC,GAAM,CAAA,EAAA,CAAA,EAAGjG,EAAGiG,CAAAA,IAAI,CAAC,IAAI,CAAC9H,UAAU,CAACgE,CAAC,CAAG,EAAA,WAAA;AACrD,4BAAA,IAAI,CAACf,EAAE,CAACsE,KAAK,GAAG,IAAI,CAAC9H,YAAaoD,CAAAA,yBAAyB,GAAG,CAACkC,EAAE,CAAClD,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACpD,CAAC,EAAE,CAAA,CAAA,CAAA;4BACjF,IAAI,CAACwC,EAAE,CAACuE,QAAQ,GAAG3F,EAAGgC,CAAAA,GAAG,CAAC,IAAI,CAACnB,UAAU,EAAEb,EAAAA,CAAGQ,IAAI,CAAC,IAAI,CAACkF,KAAK,CAACnB,GAAG,EAAE,CAAA,CAAA,CAAA;4BACnE,IAAI,CAACnD,EAAE,CAACuE,QAAQ,CAACxD,CAAC,GAAG,IAAI,CAACuD,KAAK,CAACvD,CAAC;AACjC,4BAAA,IAAI,CAACS,GAAG,CAAC,IAAI,CAACgD,oBAAoB,CAAC,IAAI,CAACD,QAAQ,EAAE,IAAI,CAACxC,OAAO,EAAE,IAAI,CAACI,OAAO,CAAG,EAAA,WAAA;gCAC7E,IAAI,CAACyC,UAAU,CAACT,KAAK,CAAC,IAAI,CAACF,CAAC,EAAE,IAAI,CAACzG,CAAC,CAAA;gCACpC,IAAI,CAACyG,CAAC,GAAGrF,EAAAA,CAAG+B,GAAG,CAAC,IAAI,CAACsD,CAAC,EAAE,CAAA,CAAA;gCACxB,IAAI,CAACzC,GAAG,CAAC5C,EAAGwF,CAAAA,KAAK,CAAC,IAAI,CAACH,CAAC,EAAE,EAAK,CAAA,EAAA,WAAA;AAC7B,oCAAA,IAAI,CAACI,MAAM,EAAA;AACb,iCAAA,CAAA;AACF,6BAAA,CAAA;AACF,yBAAA,CAAA;AACA,wBAAA,IAAI,CAACrE,EAAE,CAAC0E,CAAC,GAAG9F,EAAAA,CAAG+B,GAAG,CAChB/B,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,EAAE,EAAE,EAAA,CAAA,EAC3BhG,GAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,CAAA,CAAE,EAAE,EAC3BhG,CAAAA,EAAAA,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,EAAE,EAAE,CAAA,CAAA,EAC3B,IAAI,CAACA,UAAU,CAAC,CAAE,CAAA,CAAA;AAEpB,wBAAA,IAAI,CAAC5E,EAAE,CAAC2E,CAAC,GAAG/F,EAAAA,CAAG+B,GAAG,CAChB/B,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,EAAE,EAAE,EAAA,CAAA,EAC3BhG,GAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,CAAA,CAAE,EAAE,EAC3BhG,CAAAA,EAAAA,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,EAAE,EAAE,CAAA,CAAA,EAC3B,IAAI,CAACA,UAAU,CAAC,CAAE,CAAA,CAAA;AAEpB,wBAAA,IAAI,CAAC5E,EAAE,CAACI,CAAC,GAAGxB,EAAAA,CAAG+B,GAAG,CAChB/B,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,EAAE,EAAE,EAAA,CAAA,EAC3BhG,GAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,CAAA,CAAE,EAAE,EAC3BhG,CAAAA,EAAAA,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,GAAG,EAAE,CAAA,CAAA,EAC5B,IAAI,CAACA,UAAU,CAAC,EAAG,CAAA,CAAA;AAErB,wBAAA,IAAI,CAAC5E,EAAE,CAACK,CAAC,GAAGzB,EAAAA,CAAG+B,GAAG,CAChB/B,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,GAAG,EAAE,EAAA,CAAA,EAC5BhG,GAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,EAAA,CAAG,EAAE,EAC5BhG,CAAAA,EAAAA,EAAAA,CAAGkG,GAAG,CAAC,IAAI,CAACF,UAAU,CAAC,GAAG,EAAE,CAAA,CAAA,EAC5B,IAAI,CAACA,UAAU,CAAC,EAAG,CAAA,CAAA;wBAErB,IAAI,CAAC1F,QAAQ,CAACC,KAAK,GAAGP,EAAGS,CAAAA,KAAK,CAAC,IAAI,CAACqF,CAAC,EAAE,IAAI,CAACC,CAAC,EAAE,IAAI,CAACvE,CAAC,EAAE,IAAI,CAACC,CAAC,CAAA;AAC/D;AACF,iBAAA,CAAA;AACF,aAAA;AACA0E,YAAAA,QAAAA,CAAAA,CAASnG,EAAE,EAAA;gBACT,IAAI,CAACM,QAAQ,CAAC8F,KAAK,GAAGvG,SAASG,EAAGQ,CAAAA,IAAI,EAAKR,GAAAA,EAAAA,CAAGS,KAAK,EAAA;AACnDT,gBAAAA,EAAAA,CAAGwD,IAAI,CAAC,WAAA;oBACN,IAAI,CAAClD,QAAQ,CAAC8F,KAAK,GAAG,IAAI,CAACnG,OAAO,CAACM,KAAK;AAC1C,iBAAA,CAAA;AACF;AACF,SAAA,CAAA;AACA,QAAA,IAAI,CAACrD,kBAAkB,CAACmJ,IAAI,GAAG,uBAAA;AAC/B,QAAA,IAAI,CAAClJ,UAAU,GAAGmB,MAAAA,CAAOgI,eAAe,CAAC,IAAI,CAACpJ,kBAAkB,CAACqJ,gBAAgB,CAAC,CAAE,CAAA,CAAA;QACpF,IAAI,CAACjJ,YAAY,EAAEkJ,OAAAA,EAAAA;QACnB,MAAMC,eAAAA,GAAkB,IAAI,CAACvJ,kBAAkB,CAACwJ,cAAc,CAC5D9I,YAAAA,CAAaoD,yBAAyB,EAAA,CAAA,CACrCtC,IAAI;AACP,QAAA,IAAI,CAACpB,YAAY,GAAGgB,MAAOqI,CAAAA,sBAAsB,CAACF,eAAqC,EAAA;YACrFG,KAAO,EAAA;AACT,SAAA,CAAA;AACF;AACQC,IAAAA,uBAAAA,CAAwBvI,MAAsB,EAAE;AACtD,QAAA,MAAMwI,GAAM9H,GAAAA,IAAAA,CAAK+H,IAAI,CAAC,IAAI,CAACnK,WAAW,GAAG,IAAI,CAACC,WAAW,GAAG,IAAI,CAACC,WAAW,CAAA;QAC5E,MAAM2E,CAAAA,GAAI,GAACqF,GAAM,CAAO,KAAA,CAAA;AACxB,QAAA,MAAMtF,IAAIsF,GAAMrF,GAAAA,CAAAA;QAChB,MAAMlD,YAAAA,GAAe,KAAMkD,CAAI,GAAA,CAAA;QAC/B,MAAMjD,aAAAA,GAAgB,KAAMgD,CAAI,GAAA,CAAA;AAChC,QAAA,IAAIjD,YAAeC,GAAAA,aAAAA,KAAkB,IAAI,CAAC5B,WAAW,GAAG,IAAI,CAACC,WAAW,GAAG,IAAI,CAACC,WAAW,EAAE;AAC3F,YAAA,MAAM,IAAIkK,KAAM,CAAA,gBAAA,CAAA;AAClB;AACA,QAAA,IAAI,CAAChK,kBAAkB,GAAGsB,MAAAA,CAAO2I,eAAe,CAC9C3I,MAAOI,CAAAA,IAAI,KAAK,OAAA,GAAU,SAAY,GAAA,UAAA,EACtCH,cACAC,aACA,EAAA;YAAE0I,UAAY,EAAA;AAAM,SAAA,CAAA;AAEtB,QAAA,IAAI,CAAClK,kBAAkB,CAACqJ,IAAI,GAAG,mBAAA;QAC/B,IAAI,CAACpJ,sBAAsB,EAAEuJ,OAAAA,EAAAA;AAC7B,QAAA,IAAI,CAACvJ,sBAAsB,GAAGqB,MAAAA,CAAO6I,iBAAiB,CAAC;AAAC,YAAA,IAAI,CAACnK;SAAmB,EAAE,IAAA,CAAA;AACpF;IACAoK,mBACEC,CAAAA,MAAc,EACdC,WAAwB,EACxBC,qBAAAA,GAAwBF,OAAOE,qBAAqB,EACpDC,WAAc,GAAA,CAAC,EACf;QACA,MAAMC,SAAAA,GAAY,IAAI,CAACC,gBAAgB,CAACJ,aAAa,IAAI,CAACvK,OAAO,EAAEwK,qBAAuBC,EAAAA,WAAAA,CAAAA;AAC1F,QAAA,MAAMlJ,MAASmF,GAAAA,SAAAA,EAAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAACzG,kBAAkB,EAAE;YAC5B,IAAI,CAAC6J,uBAAuB,CAACvI,MAAAA,CAAAA;AAC/B;AACA,QAAA,IAAI,CAAC,IAAI,CAACpB,kBAAkB,EAAE;YAC5B,IAAI,CAAC0C,aAAa,CAACtB,MAAAA,CAAAA;AACrB;AACA,QAAA,IAAI,CAAC,IAAI,CAAClB,uBAAuB,EAAE;AACjC,YAAA,IAAI,CAACiB,kBAAkB,CAACC,MAAAA,EAAQ,IAAI,CAACtB,kBAAkB,CAAE2K,KAAK,EAAE,IAAI,CAAC3K,kBAAkB,CAAE4K,MAAM,CAAA;AACjG;AACA,QAAA,IAAI,CAAC,IAAI,CAACvK,uBAAuB,EAAE;YACjC,IAAI,CAACgC,iBAAiB,CAACf,MAAAA,CAAAA;AACzB;QACA,MAAMuJ,QAAAA,GAAWvJ,OAAOwJ,WAAW,EAAA;AACnC,QAAA,MAAMC,EAAKzJ,GAAAA,MAAAA,CAAO0J,eAAe,CAACH,SAASF,KAAK,CAAA;AAChD,QAAA,MAAMM,EAAK3J,GAAAA,MAAAA,CAAO4J,eAAe,CAACL,SAASD,MAAM,CAAA;AACjD,QAAA,MAAMO,KAAQ,GAAA,IAAI,CAACrL,WAAW,GAAGkC,IAAAA,CAAK+H,IAAI,CAACM,MAAOe,CAAAA,WAAW,EAAKf,GAAAA,MAAAA,CAAOgB,YAAY,EAAA,CAAA;QACrF,MAAMC,IAAAA,GAAO,EACV,IAAI,CAACxL,WAAW,GAAGkC,IAAAA,CAAK+H,IAAI,CAACM,OAAOgB,YAAY,EAAA,CAAA,GACjDrJ,KAAK+H,IAAI,CAACM,OAAOe,WAAW,EAAA,GAAKf,MAAOgB,CAAAA,YAAY,EAAE,CAAA,CAAA;AAExD,QAAA,IAAI,CAAC5K,aAAa,CAAC8K,OAAO,CAACR,EAAAA,EAAIE,IAAIE,KAAOG,EAAAA,IAAAA,CAAAA;QAC1C,IAAI,CAAC/K,UAAU,CAACgL,OAAO,CAACR,EAAIE,EAAAA,EAAAA,EAAIZ,MAAOgB,CAAAA,YAAY,EAAIhB,EAAAA,MAAAA,CAAOe,WAAW,EAAA,CAAA;AACzE,QAAA,IAAI,CAAC5K,WAAW,CAAC,EAAE,GAAG,IAAI,CAACZ,WAAW;AACtC,QAAA,IAAI,CAACY,WAAW,CAAC,EAAE,GAAG,IAAI,CAACX,WAAW;AACtC,QAAA,IAAI,CAACW,WAAW,CAAC,EAAE,GAAG,IAAI,CAACV,WAAW;;;;AAItC,QAAA,IAAI,CAACU,WAAW,CAAC,CAAA,CAAE,GAAGiK,SAAY,GAAA,CAAA;AAClCnJ,QAAAA,MAAAA,CAAOkK,gBAAgB,EAAA;AACvBlK,QAAAA,MAAAA,CAAOmK,cAAc,CAAC,IAAI,CAACxL,sBAAsB,CAAA;AACjD,QAAA,IAAIwK,YAAY,CAAG,EAAA;AACjB,YAAA,IAAI,IAAI,CAACnK,YAAY,CAAEoL,QAAQ,EAAE;gBAC/B,IAAI,CAACpL,YAAY,CAAEqL,MAAM,EAAA;AAC3B;YACA,IAAI,CAACrL,YAAY,CAAEsL,aAAa,CAAC,CAAG,EAAA,IAAI,CAAC7L,OAAO,CAAA;AAChD,YAAA,IAAI,CAACI,UAAU,CAAE0L,QAAQ,CAAC,eAAA,EAAiBxB,OAAOyB,sBAAsB,EAAA,CAAA;AACxE,YAAA,IAAI,CAAC3L,UAAU,CAAE0L,QAAQ,CAAC,YAAA,EAAcxB,OAAOxG,UAAU,CAAA;YACzD,IAAI,CAAC1D,UAAU,CAAE0L,QAAQ,CAAC,WAAa,EAAA,IAAI,CAACtL,UAAU,CAAA;YACtD,IAAI,CAACJ,UAAU,CAAE0L,QAAQ,CAAC,YAAc,EAAA,IAAI,CAACrL,WAAW,CAAA;YACxD,IAAI,CAACL,UAAU,CAAE4L,SAAS,CAACnL,aAAaoD,yBAAyB,EAAA,EAAI,IAAI,CAAC1D,YAAY,CAAA;AACtFgB,YAAAA,MAAAA,CAAO0K,UAAU,CAAC,IAAI,CAAC9L,kBAAkB,CAAA;AACzCoB,YAAAA,MAAAA,CAAO2K,eAAe,CAAC,IAAI,CAAC7L,uBAAuB,CAAA;AACnDkB,YAAAA,MAAAA,CAAO4K,YAAY,CAAC,CAAG,EAAA,IAAI,CAAC/L,UAAU,CAAA;YACtC,MAAMgM,OAAAA,GAAU7K,OAAO8K,eAAe,EAAA;AACtC9K,YAAAA,MAAAA,CAAO+K,eAAe,CAAC,IAAI,CAAChM,uBAAuB,CAAA;AACnDiB,YAAAA,MAAAA,CAAOgL,IAAI,CAAC,YAAc,EAAA,CAAA,EAAG,IAAI,CAAC1M,WAAW,GAAG,IAAI,CAACC,WAAW,GAAG,IAAI,CAACC,WAAW,CAAA;AACnFwB,YAAAA,MAAAA,CAAO+K,eAAe,CAACF,OAAAA,CAAAA;SAClB,MAAA;YACL7K,MAAOiL,CAAAA,gBAAgB,CAAC,IAAIzL,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,EAAG,IAAI0L,iBAAmB,EAAA,CAAA,CAAA;AACtE;AACAlL,QAAAA,MAAAA,CAAOmL,eAAe,EAAA;AACxB;AACQ/B,IAAAA,gBAAAA,CACNJ,WAAwB,EACxBoC,MAAoB,EACpBC,aAAsB,EACtBnC,WAAmB,EACnB;QACA,MAAMoC,UAAAA,GAAa,CAAClE,KAAsBmE,EAAAA,IAAAA,GAAAA;AACxC,YAAA,MAAMC,SAASD,IAAO,GAAA,EAAA;YACtB,MAAME,cAAAA,GAAiBrE,MAAMsE,mBAAmB;AAChDN,YAAAA,MAAAA,CAAOO,GAAG,CAACvE,KAAMwE,CAAAA,gBAAgB,EAAEJ,MAAAA,CAAAA;AACnCJ,YAAAA,MAAAA,CAAOO,GAAG,CAACvE,KAAMyE,CAAAA,kBAAkB,EAAEL,MAAS,GAAA,CAAA,CAAA;;;AAG9CJ,YAAAA,MAAM,CAACI,MAAAA,GAAS,CAAE,CAAA,GAAGC,eAAexH,CAAC;AACrCmH,YAAAA,MAAM,CAACI,MAAAA,GAAS,CAAE,CAAA,GAAGC,eAAevH,CAAC;AACrCkH,YAAAA,MAAM,CAACI,MAAAA,GAAS,EAAG,CAAA,GAAGC,eAAetH,CAAC;AACtCiH,YAAAA,MAAM,CAACI,MAAS,GAAA,EAAA,CAAG,GAAGC,cAAAA,CAAe5H,CAAC,GAAGqF,WAAAA;AACzCkC,YAAAA,MAAAA,CAAOO,GAAG,CAACvE,KAAM0E,CAAAA,WAAW,EAAEN,MAAS,GAAA,EAAA,CAAA;AACzC,SAAA;;;;;;AAMA,QAAA,IAAIO,SAAY,GAAA,CAAA;AAChB,QAAA,IAAIR,IAAO,GAAA,CAAA;AACX,QAAA,IAAIF,aAAe,EAAA;YACjBU,SAAYrL,GAAAA,IAAAA,CAAKmG,GAAG,CAClBmC,WAAYgD,CAAAA,cAAc,CAACzL,MAAM,EACjC0L,sBACA3M,EAAAA,YAAAA,CAAaC,mBAAmB,EAAA,CAAA;AAElC,YAAA,IAAK,IAAIe,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,IAAKyL,WAAWzL,CAAK,EAAA,CAAA;AACnCgL,gBAAAA,UAAAA,CAAWtC,WAAYgD,CAAAA,cAAc,CAAC1L,CAAAA,GAAI,EAAE,EAAEA,CAAAA,CAAAA;AAChD;YACAiL,IAAOQ,GAAAA,SAAAA;AACT;;QAEA,MAAMG,aAAAA,GAAgBxL,IAAKmG,CAAAA,GAAG,CAC5BmC,WAAAA,CAAYmD,gBAAgB,CAAC5L,MAAM,EACnCjB,YAAaC,CAAAA,mBAAmB,EAAKgM,GAAAA,IAAAA,CAAAA;AAEvC,QAAA,IAAK,IAAIhE,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI2E,eAAe3E,CAAK,EAAA,CAAA;AACtC+D,YAAAA,UAAAA,CAAWtC,YAAYmD,gBAAgB,CAAC5E,CAAE,CAAA,EAAEgE,OAAOhE,CAAI,GAAA,CAAA,CAAA;AACzD;QACAgE,IAAQW,IAAAA,aAAAA;;;;AAIR,QAAA,IAAIb,iBAAiBrC,WAAYgD,CAAAA,cAAc,CAACzL,MAAM,GAAGwL,SAAW,EAAA;AAClE,YAAA,MAAMK,QAAWpD,GAAAA,WAAAA,CAAYgD,cAAc,CAACzL,MAAM,GAAGwL,SAAAA;AACrD,YAAA,MAAMM,cAAc3L,IAAKmG,CAAAA,GAAG,CAACuF,QAAU9M,EAAAA,YAAAA,CAAaC,mBAAmB,EAAKgM,GAAAA,IAAAA,CAAAA;AAC5E,YAAA,IAAK,IAAIe,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAID,aAAaC,CAAK,EAAA,CAAA;AACpChB,gBAAAA,UAAAA,CAAWtC,YAAYgD,cAAc,CAACD,YAAYO,CAAE,CAAA,EAAEf,OAAOe,CAAI,GAAA,CAAA,CAAA;AACnE;YACAf,IAAQc,IAAAA,WAAAA;YACR,IAAI,CAACjO,cAAeC,CAAAA,yBAAyB,EAAE;AAC7CD,gBAAAA,cAAAA,CAAeC,yBAAyB,GAAG,IAAA;AAC3CkO,gBAAAA,OAAAA,CAAQC,IAAI,CACV,CAAC,gBAAgB,EAAExD,YAAYgD,cAAc,CAACzL,MAAM,CAAC,kCAAkC,CAAC,GACtF,CAAC,mCAAmC,EAAE0L,uBAAuB,GAAG,EAAEG,QAAS,CAAA,cAAc,CAAC,GAC1F,CAAC,mBAAmB,EAAEC,cAAcD,QAAW,GAAA,CAAC,MAAM,EAAEA,WAAWC,WAAY,CAAA,QAAQ,CAAC,GAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAEtG;AACF;QACA,IAAI,CAACjN,gBAAgB,GAAG2M,SAAAA;QACxB,OAAOR,IAAAA;AACT;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"cluster_light.js","sources":["../../src/render/cluster_light.ts"],"sourcesContent":["import type { Nullable, Vector3 } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, Vector4 } from '@zephyr3d/base';\r\nimport { MAX_GLOBAL_LIGHTS, MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n ProgramBuilder,\r\n RenderStateSet,\r\n StructuredBuffer,\r\n Texture2D,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport { PBArrayTypeInfo, PBPrimitiveType, PBPrimitiveTypeInfo, PBStructTypeInfo } from '@zephyr3d/device';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** Name of the index pass's per-light view-space bounding spheres. */\r\nconst UNIFORM_NAME_LIGHT_SPHERES = 'lightSpheres';\r\n/**\r\n * vec4s per light in the index pass's sphere buffer: the bounding sphere, then the\r\n * light's brightness in x.\r\n */\r\nconst SPHERE_STRIDE = 2;\r\n/** Target size in pixels of a cluster tile on screen. */\r\nconst TILE_SIZE_PX = 64;\r\n/** Bound on the tile count along each screen axis, which caps the index pass cost at high resolution. */\r\nconst MAX_TILES_PER_AXIS = 64;\r\n/** Number of depth slices. */\r\nconst TILE_COUNT_Z = 32;\r\n/**\r\n * View depth in meters where the exponential slices of a perspective camera begin.\r\n * Everything nearer shares slice 0: exponential slicing would otherwise spend a quarter\r\n * of the slices on the first meter in front of a 0.1 m near plane, where little is lit.\r\n */\r\nconst NEAR_SLICE_METERS = 1;\r\n/** Clusters per workgroup of the WebGPU index pass, and lights per shared batch. */\r\nconst INDEX_GROUP_SIZE = 64;\r\n/**\r\n * Average list length per cluster the WebGPU light list starts out sized for, once there\r\n * are more lights than this (with fewer, every cluster fits all of them). It then grows\r\n * to what the clusters asked for, read back from the GPU.\r\n */\r\nconst LIST_LIGHTS_PER_CLUSTER = 64;\r\n/** Bound on the entries of the WebGPU light list: 64 MB. */\r\nconst MAX_LIST_ENTRIES = 1 << 24;\r\n/**\r\n * Buckets of the per-cluster histogram of light scores that picks which lights a\r\n * cluster keeps when its list is cut. Each spans a factor of 4 in score.\r\n */\r\nconst SCORE_BUCKETS = 32;\r\n\r\n/**\r\n * Declares the uniforms and helper functions shared by the index pass programs.\r\n */\r\nfunction declareIndexPassScope(\r\n pb: ProgramBuilder,\r\n scope: PBGlobalScope,\r\n sphereStride: number,\r\n storage: boolean\r\n) {\r\n (function (this: PBGlobalScope) {\r\n this.invProjMatrix = pb.mat4().uniform(0);\r\n this.sizeParam = pb.vec4().uniform(0);\r\n this.countParam = pb.ivec4().uniform(0);\r\n this.orthoProj = pb.int().uniform(0);\r\n this.sliceParam = pb.vec4().uniform(0);\r\n // Already in view space: transformed once per light on the CPU rather than once\r\n // per light in each of the clusters. See writeLight for the layout.\r\n this[UNIFORM_NAME_LIGHT_SPHERES] = storage\r\n ? pb.vec4[0]().storageBufferReadonly(0)\r\n : pb.vec4[(ShaderHelper.getMaxClusterLights() + 1) * sphereStride]().uniformBuffer(0);\r\n pb.func('lineIntersectionToZPlane', [pb.vec3('a'), pb.vec3('b'), pb.float('zDistance')], function () {\r\n this.$l.normal = pb.vec3(0, 0, 1);\r\n this.$l.ab = pb.sub(this.b, this.a);\r\n this.$l.t = pb.div(pb.sub(this.zDistance, pb.dot(this.normal, this.a)), pb.dot(this.normal, this.ab));\r\n this.$return(pb.add(this.a, pb.mul(this.t, this.ab)));\r\n });\r\n // View depth where perspective slice k begins: slices before the first exponential\r\n // one form the near slice, which begins at the near plane.\r\n pb.func('sliceDepth', [pb.float('k')], function () {\r\n this.$if(pb.lessThan(this.k, this.sliceParam.y), function () {\r\n this.$return(this.sizeParam.z);\r\n });\r\n this.$return(\r\n pb.mul(\r\n this.sliceParam.x,\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sliceParam.x),\r\n pb.div(pb.sub(this.k, this.sliceParam.y), this.sliceParam.z)\r\n )\r\n )\r\n );\r\n });\r\n pb.func('clipToView', [pb.vec4('clip')], function () {\r\n this.$l.view = pb.mul(this.invProjMatrix, this.clip);\r\n this.$return(pb.div(this.view, this.view.w));\r\n });\r\n pb.func('screenToView', [pb.vec4('screen')], function () {\r\n this.$l.texCoord = pb.div(this.screen.xy, this.sizeParam.xy);\r\n this.$l.clip = pb.vec4(\r\n pb.sub(pb.mul(pb.vec2(this.texCoord.x, pb.sub(1, this.texCoord.y)), 2), pb.vec2(1)),\r\n this.screen.z,\r\n this.screen.w\r\n );\r\n this.$return(this.clipToView(this.clip));\r\n });\r\n // Squared distance from a point to the box, zero inside it.\r\n pb.func('aabbDistSq', [pb.vec3('p'), pb.vec3('aabbMin'), pb.vec3('aabbMax')], function () {\r\n this.$l.d = pb.max(pb.max(pb.sub(this.aabbMin, this.p), pb.sub(this.p, this.aabbMax)), pb.vec3(0));\r\n this.$return(pb.dot(this.d, this.d));\r\n });\r\n // Radius 0 marks an unbounded light that no global slot took: it reaches every cluster.\r\n pb.func('sphereReachesAABB', [pb.vec4('sphere'), pb.float('distSq')], function () {\r\n this.$return(\r\n pb.or(pb.equal(this.sphere.w, 0), pb.lessThanEqual(this.distSq, pb.mul(this.sphere.w, this.sphere.w)))\r\n );\r\n });\r\n // Whether the sphere lies entirely outside one of the tile frustum's side planes\r\n // (inward unit normals through the eye). The box of a far slice is much wider than\r\n // the frustum it bounds, and this rejects the lights reaching only its corners.\r\n pb.func(\r\n 'sphereOutsideTile',\r\n [pb.vec4('sphere'), pb.vec3('left'), pb.vec3('right'), pb.vec3('bottom'), pb.vec3('top')],\r\n function () {\r\n this.$l.r = pb.neg(this.sphere.w);\r\n this.$return(\r\n pb.and(\r\n pb.greaterThan(this.sphere.w, 0),\r\n pb.or(\r\n pb.or(\r\n pb.lessThan(pb.dot(this.left, this.sphere.xyz), this.r),\r\n pb.lessThan(pb.dot(this.right, this.sphere.xyz), this.r)\r\n ),\r\n pb.or(\r\n pb.lessThan(pb.dot(this.bottom, this.sphere.xyz), this.r),\r\n pb.lessThan(pb.dot(this.top, this.sphere.xyz), this.r)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n );\r\n }).call(scope);\r\n}\r\n\r\n/**\r\n * Emits the view-space bounds of cluster `tileIndex` (an int): locals `aabbMin`/`aabbMax`\r\n * and the inward side-plane normals `planeLeft`/`planeRight`/`planeBottom`/`planeTop`.\r\n */\r\nfunction emitClusterBounds(this: PBInsideFunctionScope, pb: ProgramBuilder, tileIndex: PBShaderExp) {\r\n this.$l.tileIndex = tileIndex;\r\n this.$l.tileSize = pb.div(this.sizeParam.xy, pb.vec2(this.countParam.xy));\r\n this.$l.zIndex = pb.div(this.tileIndex, pb.mul(this.countParam.x, this.countParam.y));\r\n this.$l.yIndex = pb.div(\r\n pb.sub(this.tileIndex, pb.mul(this.zIndex, this.countParam.x, this.countParam.y)),\r\n this.countParam.x\r\n );\r\n this.$l.xIndex = pb.sub(\r\n this.tileIndex,\r\n pb.add(pb.mul(this.zIndex, this.countParam.x, this.countParam.y), pb.mul(this.yIndex, this.countParam.x))\r\n );\r\n this.$l.maxPoint_sS = pb.vec4(\r\n pb.mul(pb.vec2(pb.float(pb.add(this.xIndex, 1)), pb.float(pb.add(this.yIndex, 1))), this.tileSize),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.minPoint_sS = pb.vec4(\r\n pb.mul(pb.vec2(pb.float(this.xIndex), pb.float(this.yIndex)), this.tileSize),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.maxPoint_vS = this.screenToView(this.maxPoint_sS).xyz;\r\n this.$l.minPoint_vS = this.screenToView(this.minPoint_sS).xyz;\r\n this.$l.sliceNear = pb.div(pb.float(this.zIndex), pb.float(this.countParam.z));\r\n this.$l.sliceFar = pb.div(pb.add(pb.float(this.zIndex), 1), pb.float(this.countParam.z));\r\n this.$l.aabbMin = pb.vec3();\r\n this.$l.aabbMax = pb.vec3();\r\n // Zero normals never reject: an orthographic tile is exactly its box.\r\n this.$l.planeLeft = pb.vec3(0);\r\n this.$l.planeRight = pb.vec3(0);\r\n this.$l.planeBottom = pb.vec3(0);\r\n this.$l.planeTop = pb.vec3(0);\r\n this.$if(pb.notEqual(this.orthoProj, 0), function () {\r\n // Orthographic: view rays are parallel, so a tile's view-space x/y extent does not\r\n // depend on depth, and slices are linear because near may be zero or negative.\r\n this.$l.tileNear = pb.neg(pb.mix(this.sizeParam.z, this.sizeParam.w, this.sliceNear));\r\n this.$l.tileFar = pb.neg(pb.mix(this.sizeParam.z, this.sizeParam.w, this.sliceFar));\r\n this.aabbMin = pb.vec3(pb.min(this.minPoint_vS.xy, this.maxPoint_vS.xy), this.tileFar);\r\n this.aabbMax = pb.vec3(pb.max(this.minPoint_vS.xy, this.maxPoint_vS.xy), this.tileNear);\r\n }).$else(function () {\r\n this.$l.tileNear = pb.neg(this.sliceDepth(pb.float(this.zIndex)));\r\n this.$l.tileFar = pb.neg(this.sliceDepth(pb.add(pb.float(this.zIndex), 1)));\r\n this.$l.eyePos = pb.vec3(0);\r\n this.$l.minPointNear = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileNear);\r\n this.$l.minPointFar = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileFar);\r\n this.$l.maxPointNear = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileNear);\r\n this.$l.maxPointFar = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileFar);\r\n this.aabbMin = pb.min(\r\n pb.min(this.minPointNear, this.minPointFar),\r\n pb.min(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.aabbMax = pb.max(\r\n pb.max(this.minPointNear, this.minPointFar),\r\n pb.max(this.maxPointNear, this.maxPointFar)\r\n );\r\n // Side planes through the eye and the tile edges at z = tileNear (< 0), with\r\n // normals facing into the tile.\r\n this.$l.lo = pb.min(this.minPointNear.xy, this.maxPointNear.xy);\r\n this.$l.hi = pb.max(this.minPointNear.xy, this.maxPointNear.xy);\r\n this.planeLeft = pb.normalize(pb.vec3(pb.neg(this.tileNear), 0, this.lo.x));\r\n this.planeRight = pb.normalize(pb.vec3(this.tileNear, 0, pb.neg(this.hi.x)));\r\n this.planeBottom = pb.normalize(pb.vec3(0, pb.neg(this.tileNear), this.lo.y));\r\n this.planeTop = pb.normalize(pb.vec3(0, this.tileNear, pb.neg(this.hi.y)));\r\n });\r\n}\r\n\r\n/**\r\n * Emits the state of a cluster keeping its 16 strongest lights. Needs the bounds from\r\n * emitClusterBounds.\r\n */\r\nfunction emitSelectionInit(this: PBInsideFunctionScope, pb: ProgramBuilder) {\r\n this.$l.n = pb.int(0);\r\n this.$l.lightIndex = [\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0)\r\n ];\r\n this.$l.lightScore = [\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0),\r\n pb.float(0)\r\n ];\r\n // Once all slots are taken, the weakest one is replaced by any light scoring\r\n // higher, so a crowded cluster keeps the lights that matter most to it rather\r\n // than whichever happen to come first in the buffer.\r\n this.$l.minSlot = pb.int(0);\r\n this.$l.minScore = pb.float(0);\r\n emitScoreSetup.call(this, pb);\r\n}\r\n\r\n/** Emits the locals emitLightScore needs. Needs the bounds from emitClusterBounds. */\r\nfunction emitScoreSetup(this: PBInsideFunctionScope, pb: ProgramBuilder) {\r\n // Half the cluster diagonal: the irradiance estimate is taken at the cluster\r\n // center but not closer than this, so a light inside the cluster stays finite.\r\n this.$l.halfDiagSq = pb.mul(\r\n pb.dot(pb.sub(this.aabbMax, this.aabbMin), pb.sub(this.aabbMax, this.aabbMin)),\r\n 0.25\r\n );\r\n this.$l.center = pb.mul(pb.add(this.aabbMin, this.aabbMax), 0.5);\r\n}\r\n\r\n/**\r\n * Emits the local `score` of the light in `lightPos`, which emitLightReaches found to\r\n * reach the cluster: its brightness times the lit shader's range window at the nearest\r\n * point of the cluster, over the squared distance to the cluster center. Unbounded\r\n * lights score highest.\r\n */\r\nfunction emitLightScore(this: PBInsideFunctionScope, pb: ProgramBuilder, brightness: PBShaderExp) {\r\n this.$l.score = pb.float(3.0e38);\r\n this.$if(pb.greaterThan(this.lightPos.w, 0), function () {\r\n this.$l.f = pb.clamp(pb.sub(1, pb.div(this.distSq, pb.mul(this.lightPos.w, this.lightPos.w))), 0, 1);\r\n this.$l.toCenter = pb.sub(this.center, this.lightPos.xyz);\r\n this.score = pb.div(\r\n pb.mul(brightness, this.f, this.f),\r\n pb.max(pb.dot(this.toCenter, this.toCenter), pb.max(this.halfDiagSq, 1e-6))\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Emits the test of the light at buffer index `index` (a uint) with view-space bounding\r\n * sphere `sphere` and brightness `brightness` against the cluster, keeping it when it\r\n * reaches the cluster and is among its 16 strongest. Must be emitted inside a loop over\r\n * the lights: rejecting a light continues it.\r\n */\r\n/**\r\n * Emits whether the light whose view-space bounding sphere is in the local `lightPos`\r\n * reaches the cluster, declaring the local `distSq` (its squared distance to the box).\r\n * Needs the bounds from emitClusterBounds.\r\n */\r\nfunction emitLightReaches(this: PBInsideFunctionScope, pb: ProgramBuilder): PBShaderExp {\r\n this.$l.distSq = this.aabbDistSq(this.lightPos.xyz, this.aabbMin, this.aabbMax);\r\n // Negative radius: shaded through a global slot, never through the clusters.\r\n return pb.and(\r\n pb.greaterThanEqual(this.lightPos.w, 0),\r\n pb.and(\r\n this.sphereReachesAABB(this.lightPos, this.distSq),\r\n pb.not(\r\n this.sphereOutsideTile(\r\n this.lightPos,\r\n this.planeLeft,\r\n this.planeRight,\r\n this.planeBottom,\r\n this.planeTop\r\n )\r\n )\r\n )\r\n );\r\n}\r\n\r\nfunction emitConsiderLight(\r\n this: PBInsideFunctionScope,\r\n pb: ProgramBuilder,\r\n index: PBShaderExp,\r\n sphere: PBShaderExp,\r\n brightness: PBShaderExp\r\n) {\r\n this.$l.lightPos = sphere;\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n emitLightScore.call(this, pb, brightness);\r\n this.$if(pb.lessThan(this.n, 16), function () {\r\n this.lightIndex.setAt(this.n, index);\r\n this.lightScore.setAt(this.n, this.score);\r\n this.n = pb.add(this.n, 1);\r\n })\r\n .$elseif(pb.greaterThan(this.score, this.minScore), function () {\r\n this.lightIndex.setAt(this.minSlot, index);\r\n this.lightScore.setAt(this.minSlot, this.score);\r\n })\r\n .$else(function () {\r\n this.$continue();\r\n });\r\n this.$if(pb.equal(this.n, 16), function () {\r\n this.minSlot = 0;\r\n this.minScore = this.lightScore[0];\r\n this.$for(pb.int('k'), 1, 16, function () {\r\n this.$if(pb.lessThan(this.lightScore.at(this.k), this.minScore), function () {\r\n this.minSlot = this.k;\r\n this.minScore = this.lightScore.at(this.k);\r\n });\r\n });\r\n });\r\n });\r\n}\r\n\r\n/** Emits the packing of the selected light indices, one byte each, front to back. */\r\nfunction emitPackSelection(this: PBInsideFunctionScope, pb: ProgramBuilder): PBShaderExp {\r\n this.$l.r = pb.add(\r\n pb.sal(this.lightIndex[0], 24),\r\n pb.sal(this.lightIndex[1], 16),\r\n pb.sal(this.lightIndex[2], 8),\r\n this.lightIndex[3]\r\n );\r\n this.$l.g = pb.add(\r\n pb.sal(this.lightIndex[4], 24),\r\n pb.sal(this.lightIndex[5], 16),\r\n pb.sal(this.lightIndex[6], 8),\r\n this.lightIndex[7]\r\n );\r\n this.$l.b = pb.add(\r\n pb.sal(this.lightIndex[8], 24),\r\n pb.sal(this.lightIndex[9], 16),\r\n pb.sal(this.lightIndex[10], 8),\r\n this.lightIndex[11]\r\n );\r\n this.$l.a = pb.add(\r\n pb.sal(this.lightIndex[12], 24),\r\n pb.sal(this.lightIndex[13], 16),\r\n pb.sal(this.lightIndex[14], 8),\r\n this.lightIndex[15]\r\n );\r\n return pb.uvec4(this.r, this.g, this.b, this.a);\r\n}\r\n\r\n/**\r\n * The strength a light is ranked by: its peak color channel times its intensity, times\r\n * the area for rect lights, whose intensity is per unit area.\r\n */\r\nfunction lightBrightness(light: PunctualLight) {\r\n const c = light.diffuseAndIntensity;\r\n const brightness = Math.max(c.x, c.y, c.z) * c.w;\r\n return light.isRectLight() ? brightness * light.width * light.height : brightness;\r\n}\r\n\r\n/**\r\n * Writes the world-space sphere bounding the region `light` lights into `out` (center,\r\n * radius). The range sphere, except for spot lights: the smallest sphere around the cone\r\n * sector they light (the cone clipped by the range sphere), which for a half-angle up to\r\n * 45 degrees passes through the apex and the rim, and beyond that is centered on the\r\n * rim's plane. Radius <= 0 for unbounded lights.\r\n */\r\nfunction getLightBounds(light: PunctualLight, out: Float32Array) {\r\n const posRange = light.positionAndRange;\r\n out[0] = posRange.x;\r\n out[1] = posRange.y;\r\n out[2] = posRange.z;\r\n out[3] = posRange.w;\r\n if (posRange.w > 0 && light.isSpotLight()) {\r\n const dirCutoff = light.directionAndCutoff;\r\n const cosAngle = Math.min(dirCutoff.w, 1);\r\n if (cosAngle > 0) {\r\n const len = Math.hypot(dirCutoff.x, dirCutoff.y, dirCutoff.z) || 1;\r\n let dist: number;\r\n if (cosAngle >= Math.SQRT1_2) {\r\n dist = posRange.w / (2 * cosAngle);\r\n out[3] = dist;\r\n } else {\r\n dist = posRange.w * cosAngle;\r\n out[3] = posRange.w * Math.sqrt(1 - cosAngle * cosAngle);\r\n }\r\n out[0] += (dirCutoff.x / len) * dist;\r\n out[1] += (dirCutoff.y / len) * dist;\r\n out[2] += (dirCutoff.z / len) * dist;\r\n }\r\n }\r\n}\r\nconst _bounds = new Float32Array(4);\r\n\r\nexport class ClusteredLight {\r\n /** Emit the shadow-mask overflow warning only once per session. */\r\n private static _warnedShadowMaskOverflow = false;\r\n /** Instances returned by {@link ClusteredLight.release}, reused to keep their GPU resources. */\r\n private static readonly _pool: ClusteredLight[] = [];\r\n /**\r\n * Fetches an instance from the pool, creating one if it is empty.\r\n *\r\n * @param width - Width in device pixels of the target it will be built for.\r\n * @param height - Height in device pixels of that target.\r\n *\r\n * @remarks\r\n * The GPU work reading an instance's buffers may still be pending when the render\r\n * code is done with it, so release it only after the render graph has executed.\r\n */\r\n static acquire(width: number, height: number): ClusteredLight {\r\n // Prefer an instance already sized for this target, so alternating targets do not\r\n // rebuild the index texture every frame.\r\n const x = ClusteredLight.tileCount(width);\r\n const y = ClusteredLight.tileCount(height);\r\n const index = this._pool.findIndex((cl) => cl._tileCountX === x && cl._tileCountY === y);\r\n if (index >= 0) {\r\n return this._pool.splice(index, 1)[0];\r\n }\r\n return this._pool.pop() ?? new ClusteredLight();\r\n }\r\n /** Tile count along a screen axis of `size` pixels. */\r\n private static tileCount(size: number) {\r\n return Math.min(Math.max(Math.ceil(size / TILE_SIZE_PX), 1), MAX_TILES_PER_AXIS);\r\n }\r\n /** Returns an instance obtained from {@link ClusteredLight.acquire} to the pool. */\r\n static release(cl: ClusteredLight) {\r\n this._pool.push(cl);\r\n }\r\n private _tileCountX: number;\r\n private _tileCountY: number;\r\n private readonly _tileCountZ: number;\r\n private _lights: Float32Array<ArrayBuffer>;\r\n /** View-space bounding sphere of each light in `_lights`, for culling. See writeLight. */\r\n private _lightSpheres: Float32Array<ArrayBuffer>;\r\n /** Buffer indices of the lights shaded outside the clusters, zero-terminated. */\r\n private readonly _globalLights: Int32Array<ArrayBuffer>;\r\n private _lightIndexTexture: Nullable<Texture2D>;\r\n private _lightIndexFramebuffer: Nullable<FrameBuffer>;\r\n private _lightIndexProgram: Nullable<GPUProgram>;\r\n private _bindGroup: Nullable<BindGroup>;\r\n /** WebGPU only: the pass counting each cluster's lights ahead of the index pass. */\r\n private _lightCountProgram: Nullable<GPUProgram>;\r\n private _countBindGroup: Nullable<BindGroup>;\r\n /** WebGPU only: list entries the clusters asked for, as last read back from the GPU. */\r\n private _requestedListEntries: number;\r\n private _readbackPending: boolean;\r\n private readonly _readback: Uint8Array<ArrayBuffer>;\r\n private _warnedListOverflow: boolean;\r\n private _lightIndexVertexLayout: Nullable<VertexLayout>;\r\n /** Not released by disposing the layout, so kept to be disposed along with it. */\r\n private _lightIndexVertexBuffer: Nullable<StructuredBuffer>;\r\n private _lightIndexRenderStates: Nullable<RenderStateSet>;\r\n private _lightBuffer: Nullable<GPUDataBuffer>;\r\n private _lightSphereBuffer: Nullable<GPUDataBuffer>;\r\n /** Lights the WebGPU storage buffers above hold, slot 0 included. */\r\n private _storageLightCapacity: number;\r\n /**\r\n * WebGPU only: per cluster, the offset of its list in `_lightListBuffer` and its\r\n * length, two uints each.\r\n */\r\n private _clusterGridBuffer: Nullable<GPUDataBuffer>;\r\n /** WebGPU only: light buffer indices of every cluster's lights, one list after another. */\r\n private _lightListBuffer: Nullable<GPUDataBuffer>;\r\n private _lightListCapacity: number;\r\n /** WebGPU only: the atomic allocating list room, zeroed before each build. */\r\n private _listCounterBuffer: Nullable<GPUDataBuffer>;\r\n /**\r\n * WebGPU only: mappable copy of `_listCounterBuffer` for readBackListRequest, kept\r\n * across reads instead of a staging buffer being made for each one.\r\n */\r\n private _listCounterReadBuffer: Nullable<GPUDataBuffer>;\r\n private readonly _listCounterZero: Uint32Array<ArrayBuffer>;\r\n private readonly _lightIndexTexSize: Int32Array<ArrayBuffer>;\r\n private readonly _sizeParam: Vector4;\r\n private _countParam: Int32Array<ArrayBuffer>;\r\n private readonly _clusterParam: Vector4;\r\n /** Perspective depth slicing: split depth, first exponential slice, exponential slice count. */\r\n private readonly _sliceParam: Vector4;\r\n private _numShadowLights: number;\r\n private _orthographic: boolean;\r\n /** Scratch list of the lights competing for the slots after the mask-backed ones. */\r\n private readonly _rest: PunctualLight[];\r\n /** Scratch for prioritize(). */\r\n private _sortScores: Float64Array<ArrayBuffer>;\r\n private _sortOrder: Uint32Array<ArrayBuffer>;\r\n private readonly _sortScratch: PunctualLight[];\r\n constructor() {\r\n this._tileCountX = 0;\r\n this._tileCountY = 0;\r\n this._tileCountZ = TILE_COUNT_Z;\r\n // Grown to fit the frame's lights, see ensureLightArrayCapacity.\r\n this._lights = new Float32Array(16 * 64);\r\n this._lightSpheres = new Float32Array(4 * SPHERE_STRIDE * 64);\r\n this._globalLights = new Int32Array(MAX_GLOBAL_LIGHTS);\r\n this._lightIndexTexture = null;\r\n this._lightIndexFramebuffer = null;\r\n this._lightIndexProgram = null;\r\n this._lightBuffer = null;\r\n this._lightSphereBuffer = null;\r\n this._storageLightCapacity = 0;\r\n this._clusterGridBuffer = null;\r\n this._lightListBuffer = null;\r\n this._lightListCapacity = 0;\r\n this._listCounterBuffer = null;\r\n this._listCounterReadBuffer = null;\r\n this._listCounterZero = new Uint32Array(4);\r\n this._lightIndexTexSize = new Int32Array(2);\r\n this._bindGroup = null;\r\n this._lightCountProgram = null;\r\n this._countBindGroup = null;\r\n this._requestedListEntries = 0;\r\n this._readbackPending = false;\r\n this._readback = new Uint8Array(16);\r\n this._warnedListOverflow = false;\r\n this._lightIndexVertexLayout = null;\r\n this._lightIndexVertexBuffer = null;\r\n this._lightIndexRenderStates = null;\r\n this._sizeParam = new Vector4();\r\n this._countParam = new Int32Array(4);\r\n this._clusterParam = new Vector4();\r\n this._sliceParam = new Vector4();\r\n this._numShadowLights = 0;\r\n this._orthographic = false;\r\n this._rest = [];\r\n this._sortScores = new Float64Array(64);\r\n this._sortOrder = new Uint32Array(64);\r\n this._sortScratch = [];\r\n }\r\n get lightBuffer() {\r\n return this._lightBuffer;\r\n }\r\n /**\r\n * Number of shadow-casting lights placed at the head of the clustered light\r\n * buffer (indices `1..N`), each backed by a screen-space shadow mask slot.\r\n * Zero unless the screen-space shadow mask path is active.\r\n */\r\n get numShadowLights() {\r\n return this._numShadowLights;\r\n }\r\n /**\r\n * Whether the clusters were built for an orthographic camera, which slices depth linearly\r\n * rather than exponentially. The lit shader reads it to compute the matching slice.\r\n */\r\n get orthographic() {\r\n return this._orthographic;\r\n }\r\n /**\r\n * Buffer indices of the lights every fragment shades regardless of its cluster\r\n * (directional lights, up to {@link MAX_GLOBAL_LIGHTS}), zero-terminated. Kept out of\r\n * the clusters so they do not take one of the few slots in each.\r\n */\r\n get globalLights() {\r\n return this._globalLights;\r\n }\r\n get clusterParam() {\r\n return this._clusterParam;\r\n }\r\n get countParam() {\r\n return this._countParam;\r\n }\r\n /** The per-cluster light slots, except on WebGPU where the clusters hold lists. */\r\n get lightIndexTexture() {\r\n return this._lightIndexTexture;\r\n }\r\n get lightIndexTexSize() {\r\n return this._lightIndexTexSize;\r\n }\r\n /** See {@link ShaderHelper.getClusterGrid}. WebGPU only. */\r\n get clusterGridBuffer() {\r\n return this._clusterGridBuffer;\r\n }\r\n /** See {@link ShaderHelper.getClusterLightList}. WebGPU only. */\r\n get lightListBuffer() {\r\n return this._lightListBuffer;\r\n }\r\n private createVertexLayout(device: AbstractDevice, textureWidth: number, textureHeight: number) {\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n const vertices = new Float32Array(numClusters * 2);\r\n for (let i = 0; i < numClusters; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 2 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 2 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n }\r\n const vb = device.createVertexBuffer('position_f32x2', vertices)!;\r\n this._lightIndexVertexBuffer = vb;\r\n this._lightIndexVertexLayout = device.createVertexLayout({\r\n vertexBuffers: [{ buffer: vb }]\r\n });\r\n }\r\n /** Sizes the grid for a target, dropping the resources built for another grid. */\r\n private resizeGrid(width: number, height: number) {\r\n const x = ClusteredLight.tileCount(width);\r\n const y = ClusteredLight.tileCount(height);\r\n if (x === this._tileCountX && y === this._tileCountY) {\r\n return;\r\n }\r\n this._tileCountX = x;\r\n this._tileCountY = y;\r\n this._lightIndexFramebuffer?.dispose();\r\n this._lightIndexFramebuffer = null;\r\n this._lightIndexTexture?.dispose();\r\n this._lightIndexTexture = null;\r\n this._lightIndexVertexLayout?.dispose();\r\n this._lightIndexVertexLayout = null;\r\n this._lightIndexVertexBuffer?.dispose();\r\n this._lightIndexVertexBuffer = null;\r\n this._clusterGridBuffer?.dispose();\r\n this._clusterGridBuffer = null;\r\n this._lightListBuffer?.dispose();\r\n this._lightListBuffer = null;\r\n this._lightListCapacity = 0;\r\n }\r\n private createRenderState(device: AbstractDevice) {\r\n this._lightIndexRenderStates = device.createRenderStateSet();\r\n this._lightIndexRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._lightIndexRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n private createProgram(device: AbstractDevice) {\r\n const sphereStride = SPHERE_STRIDE;\r\n if (device.type === 'webgpu') {\r\n // Declares what both passes use and returns the batched light loop: runs `body`\r\n // for each light of each batch the workgroup loads, with the light's index in\r\n // `lightId`, its sphere in `lightPos` and its brightness in `brightness`, for the\r\n // threads where `test` holds. Also emits the cluster bounds and the locals below.\r\n const setup = function (this: PBGlobalScope) {\r\n declareIndexPassScope(pb0!, this, sphereStride, true);\r\n this.clusterGrid = pb0!.uint[0]().storageBuffer(0);\r\n this.listCounter = pb0!.atomic_uint[0]().storageBuffer(0);\r\n // One batch of lights, loaded by the whole workgroup and then tested by each of\r\n // its clusters, instead of every cluster reading every light on its own.\r\n this.batchSpheres = pb0!.vec4[INDEX_GROUP_SIZE]().workgroup();\r\n this.batchBrightness = pb0!.float[INDEX_GROUP_SIZE]().workgroup();\r\n };\r\n let pb0: Nullable<ProgramBuilder> = null;\r\n const emitMainSetup = function (this: PBInsideFunctionScope, pb: ProgramBuilder) {\r\n this.$l.numClusters = pb.mul(this.countParam.x, this.countParam.y, this.countParam.z);\r\n this.$l.cluster = pb.int(this.$builtins.globalInvocationId.x);\r\n // Threads past the last cluster still take part in loading the batches.\r\n this.$l.valid = pb.lessThan(this.cluster, this.numClusters);\r\n emitClusterBounds.call(this, pb, pb.min(this.cluster, pb.sub(this.numClusters, 1)));\r\n this.$l.cell = pb.mul(pb.uint(pb.min(this.cluster, pb.sub(this.numClusters, 1))), 2);\r\n this.$l.local = pb.uint(this.$builtins.localInvocationId.x);\r\n this.$l.numLights = pb.uint(pb.sub(this.countParam.w, 1));\r\n this.$l.numBatches = pb.div(pb.add(this.numLights, INDEX_GROUP_SIZE - 1), INDEX_GROUP_SIZE);\r\n };\r\n const forEachBatchedLight = function (\r\n this: PBInsideFunctionScope,\r\n pb: ProgramBuilder,\r\n test: () => PBShaderExp,\r\n body: (this: PBInsideFunctionScope) => void\r\n ) {\r\n this.$for(pb.uint('b'), 0, this.numBatches, function () {\r\n this.$l.base = pb.add(pb.mul(this.b, INDEX_GROUP_SIZE), 1);\r\n this.$l.li = pb.add(this.base, this.local);\r\n this.$if(pb.lessThan(this.li, pb.uint(this.countParam.w)), function () {\r\n this.batchSpheres.setAt(this.local, this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.mul(this.li, 2)));\r\n this.batchBrightness.setAt(\r\n this.local,\r\n this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.add(pb.mul(this.li, 2), 1)).x\r\n );\r\n });\r\n pb.workgroupBarrier();\r\n this.$if(test.call(this), function () {\r\n this.$l.batchCount = pb.min(pb.sub(pb.uint(this.countParam.w), this.base), INDEX_GROUP_SIZE);\r\n this.$for(pb.uint('j'), 0, this.batchCount, function () {\r\n this.$l.lightId = pb.add(this.base, this.j);\r\n this.$l.lightPos = this.batchSpheres.at(this.j);\r\n this.$l.brightness = this.batchBrightness.at(this.j);\r\n body.call(this);\r\n });\r\n });\r\n // The next batch overwrites the one still being read.\r\n pb.workgroupBarrier();\r\n });\r\n };\r\n // Count pass: how many lights reach each cluster, and in total. The total decides\r\n // in the write pass whether the lists fit, which no single pass could know before\r\n // every cluster had allocated its list.\r\n this._lightCountProgram = device.buildComputeProgram({\r\n label: 'ClusteredLightCount',\r\n workgroupSize: [INDEX_GROUP_SIZE, 1, 1],\r\n compute(pb) {\r\n pb0 = pb;\r\n setup.call(this);\r\n pb.main(function () {\r\n emitMainSetup.call(this, pb);\r\n this.$l.listCount = pb.uint(0);\r\n forEachBatchedLight.call(\r\n this,\r\n pb,\r\n () => this.valid,\r\n function () {\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n this.listCount = pb.add(this.listCount, 1);\r\n });\r\n }\r\n );\r\n this.$if(this.valid, function () {\r\n this.clusterGrid.setAt(pb.add(this.cell, 1), this.listCount);\r\n pb.atomicAdd(this.listCounter.at(1), this.listCount);\r\n });\r\n });\r\n }\r\n })!;\r\n this._lightCountProgram.name = '@ClusteredLight_Count';\r\n this._countBindGroup = device.createBindGroup(this._lightCountProgram.bindGroupLayouts[0]);\r\n // Write pass: allocates each cluster's list and fills it.\r\n this._lightIndexProgram = device.buildComputeProgram({\r\n label: 'ClusteredLightIndex',\r\n workgroupSize: [INDEX_GROUP_SIZE, 1, 1],\r\n compute(pb) {\r\n pb0 = pb;\r\n setup.call(this);\r\n this.listCapacity = pb.uint().uniform(0);\r\n this.lightList = pb.uint[0]().storageBuffer(0);\r\n // The bucket of a score, higher for stronger lights.\r\n pb.func('scoreBucket', [pb.float('score')], function () {\r\n this.$return(\r\n pb.uint(\r\n pb.clamp(\r\n pb.add(pb.floor(pb.mul(pb.log2(pb.max(this.score, 1e-30)), 0.5)), SCORE_BUCKETS / 2),\r\n 0,\r\n SCORE_BUCKETS - 1\r\n )\r\n )\r\n );\r\n });\r\n pb.main(function () {\r\n emitMainSetup.call(this, pb);\r\n emitScoreSetup.call(this, pb);\r\n this.$l.need = pb.uint(0);\r\n this.$if(this.valid, function () {\r\n this.need = this.clusterGrid.at(pb.add(this.cell, 1));\r\n });\r\n // When the lists do not all fit, every cluster gives up the same share of its\r\n // lights, so the sum fits and none is left empty. The margin absorbs the\r\n // rounding of the float scale.\r\n this.$l.total = pb.atomicLoad(this.listCounter.at(1));\r\n this.$l.allowed = this.need;\r\n this.$if(pb.greaterThan(this.total, this.listCapacity), function () {\r\n this.allowed = pb.uint(\r\n pb.floor(\r\n pb.mul(\r\n pb.float(this.need),\r\n pb.div(pb.float(this.listCapacity), pb.float(this.total)),\r\n 0.999\r\n )\r\n )\r\n );\r\n });\r\n this.$l.truncated = pb.lessThan(this.allowed, this.need);\r\n // A cut list keeps the strongest lights for this cluster: the buckets above\r\n // `cutBucket` whole, and of that bucket only the first `cutRoom`.\r\n this.$l.hist = pb.uint[SCORE_BUCKETS]();\r\n this.$for(pb.int('h'), 0, SCORE_BUCKETS, function () {\r\n this.hist.setAt(this.h, 0);\r\n });\r\n forEachBatchedLight.call(\r\n this,\r\n pb,\r\n () => pb.and(this.valid, this.truncated),\r\n function () {\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n emitLightScore.call(this, pb, this.brightness);\r\n this.$l.bucket = this.scoreBucket(this.score);\r\n this.hist.setAt(this.bucket, pb.add(this.hist.at(this.bucket), 1));\r\n });\r\n }\r\n );\r\n this.$l.cutBucket = pb.int(-1);\r\n this.$l.cutRoom = pb.uint(0);\r\n this.$if(this.truncated, function () {\r\n this.$l.kept = pb.uint(0);\r\n this.$for(pb.int('h'), SCORE_BUCKETS - 1, 0, false, true, function () {\r\n this.$if(pb.greaterThan(pb.add(this.kept, this.hist.at(this.h)), this.allowed), function () {\r\n this.cutBucket = this.h;\r\n this.cutRoom = pb.sub(this.allowed, this.kept);\r\n this.$break();\r\n });\r\n this.kept = pb.add(this.kept, this.hist.at(this.h));\r\n });\r\n });\r\n this.$l.listOffset = pb.uint(0);\r\n this.$if(pb.and(this.valid, pb.greaterThan(this.allowed, 0)), function () {\r\n this.listOffset = pb.atomicAdd(this.listCounter.at(0), this.allowed);\r\n // Only rounding can leave the sum above the capacity; trim the last lists.\r\n this.allowed = pb.select(\r\n pb.uint(0),\r\n pb.min(this.allowed, pb.sub(this.listCapacity, this.listOffset)),\r\n pb.lessThan(this.listOffset, this.listCapacity)\r\n );\r\n });\r\n this.$l.written = pb.uint(0);\r\n forEachBatchedLight.call(\r\n this,\r\n pb,\r\n () => pb.and(this.valid, pb.lessThan(this.written, this.allowed)),\r\n function () {\r\n this.$if(pb.greaterThanEqual(this.written, this.allowed), function () {\r\n this.$break();\r\n });\r\n this.$if(emitLightReaches.call(this, pb), function () {\r\n this.$l.keep = true;\r\n this.$if(this.truncated, function () {\r\n emitLightScore.call(this, pb, this.brightness);\r\n this.$l.bucket = pb.int(this.scoreBucket(this.score));\r\n this.keep = pb.greaterThan(this.bucket, this.cutBucket);\r\n this.$if(\r\n pb.and(pb.equal(this.bucket, this.cutBucket), pb.greaterThan(this.cutRoom, 0)),\r\n function () {\r\n this.keep = true;\r\n this.cutRoom = pb.sub(this.cutRoom, 1);\r\n }\r\n );\r\n });\r\n this.$if(this.keep, function () {\r\n this.lightList.setAt(pb.add(this.listOffset, this.written), this.lightId);\r\n this.written = pb.add(this.written, 1);\r\n });\r\n });\r\n }\r\n );\r\n this.$if(this.valid, function () {\r\n this.clusterGrid.setAt(this.cell, this.listOffset);\r\n this.clusterGrid.setAt(pb.add(this.cell, 1), this.written);\r\n });\r\n });\r\n }\r\n })!;\r\n } else {\r\n this._lightIndexProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.value = pb.uvec4();\r\n declareIndexPassScope(pb, this, sphereStride, false);\r\n pb.main(function () {\r\n this.$builtins.pointSize = 1;\r\n this.$builtins.position = pb.vec4(this.$inputs.pos.xy, 0, 1);\r\n emitClusterBounds.call(this, pb, pb.int(this.$builtins.vertexIndex));\r\n emitSelectionInit.call(this, pb);\r\n this.$for(pb.uint('i'), 1, pb.uint(this.countParam.w), function () {\r\n emitConsiderLight.call(\r\n this,\r\n pb,\r\n this.i,\r\n this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.mul(this.i, sphereStride)),\r\n this[UNIFORM_NAME_LIGHT_SPHERES].at(pb.add(pb.mul(this.i, sphereStride), 1)).x\r\n );\r\n });\r\n this.$outputs.value = emitPackSelection.call(this, pb);\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.uvec4();\r\n pb.main(function () {\r\n this.$outputs.color = this.$inputs.value;\r\n });\r\n }\r\n })!;\r\n }\r\n this._lightIndexProgram.name = '@ClusteredLight_Index';\r\n this._bindGroup = device.createBindGroup(this._lightIndexProgram.bindGroupLayouts[0]);\r\n if (!ShaderHelper.usesClusterLightLists()) {\r\n this._lightSphereBuffer?.dispose();\r\n const sphereBufferType = this._lightIndexProgram.getBindingInfo(UNIFORM_NAME_LIGHT_SPHERES)!.type;\r\n this._lightSphereBuffer = device.createStructuredBuffer(sphereBufferType as PBStructTypeInfo, {\r\n usage: 'uniform'\r\n });\r\n }\r\n }\r\n /**\r\n * Grows the WebGPU light and sphere storage buffers to hold `count` entries (slot 0\r\n * included). The contents are rewritten every frame, so nothing is copied.\r\n */\r\n private ensureStorageLightCapacity(device: AbstractDevice, count: number) {\r\n if (this._storageLightCapacity >= count && this._lightBuffer && this._lightSphereBuffer) {\r\n return;\r\n }\r\n const capacity = Math.max(64, 1 << Math.ceil(Math.log2(count)));\r\n this._lightBuffer?.dispose();\r\n this._lightSphereBuffer?.dispose();\r\n this._lightBuffer = device.createBuffer(capacity * 64, { usage: 'uniform', storage: true })!;\r\n this._lightSphereBuffer = device.createBuffer(capacity * 16 * SPHERE_STRIDE, {\r\n usage: 'uniform',\r\n storage: true\r\n })!;\r\n this._storageLightCapacity = capacity;\r\n }\r\n /**\r\n * Makes the WebGPU cluster grid and light list buffers fit the current grid and\r\n * `numLights` lights. The list grows but is not shrunk.\r\n */\r\n private ensureListBuffers(device: AbstractDevice, numLights: number) {\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n if (!this._clusterGridBuffer) {\r\n this._clusterGridBuffer = device.createBuffer(numClusters * 8, { usage: 'uniform', storage: true })!;\r\n }\r\n const capacity = Math.min(\r\n Math.max(\r\n numClusters * Math.min(Math.max(numLights, 1), LIST_LIGHTS_PER_CLUSTER),\r\n // With some headroom, as moving lights change what the clusters ask for.\r\n Math.ceil(this._requestedListEntries * 1.25)\r\n ),\r\n MAX_LIST_ENTRIES\r\n );\r\n if (!this._lightListBuffer || this._lightListCapacity < capacity) {\r\n this._lightListBuffer?.dispose();\r\n this._lightListBuffer = device.createBuffer(capacity * 4, { usage: 'uniform', storage: true })!;\r\n this._lightListCapacity = capacity;\r\n }\r\n if (!this._listCounterBuffer) {\r\n this._listCounterBuffer = device.createBuffer(16, { usage: 'uniform', storage: true })!;\r\n }\r\n if (!this._listCounterReadBuffer) {\r\n this._listCounterReadBuffer = device.createBuffer(16, { usage: 'read' })!;\r\n }\r\n }\r\n /**\r\n * Reads back how many list entries the clusters asked for, so the next builds can\r\n * size the list to fit. One read is in flight at a time.\r\n */\r\n private readBackListRequest() {\r\n if (this._readbackPending) {\r\n return;\r\n }\r\n this._readbackPending = true;\r\n // The read buffer is copied into only while no read is pending, so a copy never\r\n // lands in it while it is being mapped.\r\n getDevice().copyBuffer(this._listCounterBuffer!, this._listCounterReadBuffer!, 0, 0, 16);\r\n this._listCounterReadBuffer!.getBufferSubData(this._readback, 0, 16).then(\r\n () => {\r\n this._readbackPending = false;\r\n const requested = new Uint32Array(this._readback.buffer, 0, 4)[1];\r\n this._requestedListEntries = requested;\r\n if (requested > MAX_LIST_ENTRIES && !this._warnedListOverflow) {\r\n this._warnedListOverflow = true;\r\n console.warn(\r\n `ClusteredLight: the light clusters ask for ${requested} list entries, above the ` +\r\n `${MAX_LIST_ENTRIES} budget; crowded clusters keep only their strongest lights. ` +\r\n `Giving lights a finite range usually cuts this down by orders of magnitude.`\r\n );\r\n }\r\n },\r\n () => {\r\n this._readbackPending = false;\r\n }\r\n );\r\n }\r\n /** Grows the CPU-side light arrays to hold `count` entries (slot 0 included). */\r\n private ensureLightArrayCapacity(count: number) {\r\n const stride = SPHERE_STRIDE;\r\n if (this._lights.length >= count * 16) {\r\n return;\r\n }\r\n const capacity = 1 << Math.ceil(Math.log2(count));\r\n this._lights = new Float32Array(capacity * 16);\r\n this._lightSpheres = new Float32Array(capacity * 4 * stride);\r\n }\r\n /** Creates the uniform light buffer read by the lit shaders, laid out as ShaderHelper declares it. */\r\n private createLightBuffer(device: AbstractDevice) {\r\n const lightBufferType = new PBStructTypeInfo('ClusteredLightBuffer', 'std140', [\r\n {\r\n name: ShaderHelper.getLightBufferUniformName(),\r\n type: new PBArrayTypeInfo(\r\n new PBPrimitiveTypeInfo(PBPrimitiveType.F32VEC4),\r\n (ShaderHelper.getMaxClusterLights() + 1) * 4\r\n )\r\n }\r\n ]);\r\n this._lightBuffer = device.createStructuredBuffer(lightBufferType, { usage: 'uniform' });\r\n }\r\n private createLightIndexTexture(device: AbstractDevice) {\r\n // One texel per cluster in row-major order; the tail of the last row is unused.\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n const textureWidth = Math.min(\r\n 1 << Math.ceil(Math.log2(Math.ceil(Math.sqrt(numClusters)))),\r\n device.getDeviceCaps().textureCaps.maxTextureSize\r\n );\r\n const textureHeight = Math.ceil(numClusters / textureWidth);\r\n this._lightIndexTexture = device.createTexture2D('rgba32ui', textureWidth, textureHeight, {\r\n mipmapping: false\r\n })!;\r\n this._lightIndexTexture.name = 'ClusterLightIndex';\r\n this._lightIndexTexSize[0] = textureWidth;\r\n this._lightIndexTexSize[1] = textureHeight;\r\n this._lightIndexFramebuffer?.dispose();\r\n this._lightIndexFramebuffer = device.createFrameBuffer([this._lightIndexTexture], null);\r\n }\r\n /**\r\n * Builds the per-cluster light lists for a camera.\r\n *\r\n * @param width - Width in device pixels of the target the lit pass will draw into.\r\n * @param height - Height in device pixels of that target.\r\n *\r\n * @remarks\r\n * The lit shader maps `fragCoord` to a tile with `width`/`height`, so they must be the\r\n * size of the target it actually renders to, not whatever viewport is current here.\r\n */\r\n calculateLightIndex(\r\n camera: Camera,\r\n renderQueue: RenderQueue,\r\n width: number,\r\n height: number,\r\n screenSpaceShadowMask = camera.screenSpaceShadowMask,\r\n preExposure = 1\r\n ) {\r\n const numLights = this.getVisibleLights(camera, renderQueue, screenSpaceShadowMask, preExposure);\r\n const device = getDevice();\r\n const compute = ShaderHelper.usesClusterLightLists();\r\n this.resizeGrid(width, height);\r\n if (compute) {\r\n this.ensureStorageLightCapacity(device, numLights + 1);\r\n this.ensureListBuffers(device, numLights);\r\n } else if (!this._lightIndexTexture) {\r\n this.createLightIndexTexture(device);\r\n }\r\n if (!this._lightIndexProgram) {\r\n this.createProgram(device);\r\n }\r\n if (!compute && !this._lightBuffer) {\r\n this.createLightBuffer(device);\r\n }\r\n if (!compute && !this._lightIndexVertexLayout) {\r\n this.createVertexLayout(device, this._lightIndexTexture!.width, this._lightIndexTexture!.height);\r\n }\r\n if (!compute && !this._lightIndexRenderStates) {\r\n this.createRenderState(device);\r\n }\r\n const vw = width;\r\n const vh = height;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n // The lit shader computes slice = t * scale + bias, where t is log2(view depth) for\r\n // perspective (exponential slices) and the view depth itself for orthographic (linear\r\n // slices: an orthographic near plane may be zero or negative, where log2 is undefined).\r\n this._orthographic = !camera.isPerspective();\r\n let scale: number;\r\n let bias: number;\r\n if (this._orthographic) {\r\n scale = this._tileCountZ / (far - near);\r\n bias = -near * scale;\r\n } else {\r\n // A near slice pays off only when it spans more than one regular exponential slice.\r\n const split = NEAR_SLICE_METERS / (camera.scene?.metersPerUnit ?? 1);\r\n const nearSlice = split > near * Math.pow(far / near, 1 / this._tileCountZ) && split < far;\r\n const expStart = nearSlice ? split : near;\r\n const firstExpSlice = nearSlice ? 1 : 0;\r\n const numExpSlices = this._tileCountZ - firstExpSlice;\r\n scale = numExpSlices / Math.log2(far / expStart);\r\n // Depths before the split land below firstExpSlice, which the lit shader's clamp\r\n // and integer conversion take to slice 0.\r\n bias = firstExpSlice - Math.log2(expStart) * scale;\r\n this._sliceParam.setXYZW(expStart, firstExpSlice, numExpSlices, 0);\r\n }\r\n this._clusterParam.setXYZW(vw, vh, scale, bias);\r\n this._sizeParam.setXYZW(vw, vh, near, far);\r\n this._countParam[0] = this._tileCountX;\r\n this._countParam[1] = this._tileCountY;\r\n this._countParam[2] = this._tileCountZ;\r\n // countParam.w stores light count + 1 because clustered indices start from 1.\r\n // Keep it valid even when there are no unshadowed punctual lights so clustered\r\n // shading math stays well-defined for emissive and environment lighting paths.\r\n this._countParam[3] = numLights + 1;\r\n const numClusters = this._tileCountX * this._tileCountY * this._tileCountZ;\r\n device.pushDeviceStates();\r\n if (!compute) {\r\n device.setFramebuffer(this._lightIndexFramebuffer);\r\n // setFramebuffer may no-op, so reset viewport and scissor explicitly.\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n // The compute pass writes every cluster itself, empty ones included.\r\n if (compute || numLights > 0) {\r\n if (this._lightSphereBuffer!.disposed) {\r\n this._lightSphereBuffer!.reload();\r\n }\r\n // Slot 0 is never read, so upload only up to the last light.\r\n if (this._lightBuffer!.disposed) {\r\n this._lightBuffer!.reload();\r\n }\r\n this._lightBuffer!.bufferSubData(0, this._lights, 0, (numLights + 1) * 16);\r\n this._lightSphereBuffer!.bufferSubData(0, this._lightSpheres, 0, (numLights + 1) * 4 * SPHERE_STRIDE);\r\n this._bindGroup!.setValue('invProjMatrix', camera.getInvProjectionMatrix());\r\n this._bindGroup!.setValue('sizeParam', this._sizeParam);\r\n this._bindGroup!.setValue('countParam', this._countParam);\r\n this._bindGroup!.setValue('orthoProj', this._orthographic ? 1 : 0);\r\n this._bindGroup!.setValue('sliceParam', this._sliceParam);\r\n this._bindGroup!.setBuffer(UNIFORM_NAME_LIGHT_SPHERES, this._lightSphereBuffer!);\r\n device.setProgram(this._lightIndexProgram);\r\n if (compute) {\r\n const numGroups = Math.ceil(numClusters / INDEX_GROUP_SIZE);\r\n this._listCounterBuffer!.bufferSubData(0, this._listCounterZero);\r\n const countBindGroup = this._countBindGroup!;\r\n countBindGroup.setValue('invProjMatrix', camera.getInvProjectionMatrix());\r\n countBindGroup.setValue('sizeParam', this._sizeParam);\r\n countBindGroup.setValue('countParam', this._countParam);\r\n countBindGroup.setValue('orthoProj', this._orthographic ? 1 : 0);\r\n countBindGroup.setValue('sliceParam', this._sliceParam);\r\n countBindGroup.setBuffer(UNIFORM_NAME_LIGHT_SPHERES, this._lightSphereBuffer!);\r\n countBindGroup.setBuffer('clusterGrid', this._clusterGridBuffer!);\r\n countBindGroup.setBuffer('listCounter', this._listCounterBuffer!);\r\n device.setProgram(this._lightCountProgram);\r\n device.setBindGroup(0, countBindGroup);\r\n device.compute(numGroups, 1, 1);\r\n this._bindGroup!.setValue('listCapacity', this._lightListCapacity);\r\n this._bindGroup!.setBuffer('clusterGrid', this._clusterGridBuffer!);\r\n this._bindGroup!.setBuffer('lightList', this._lightListBuffer!);\r\n this._bindGroup!.setBuffer('listCounter', this._listCounterBuffer!);\r\n device.setProgram(this._lightIndexProgram);\r\n device.setBindGroup(0, this._bindGroup!);\r\n device.compute(numGroups, 1, 1);\r\n this.readBackListRequest();\r\n } else {\r\n device.setVertexLayout(this._lightIndexVertexLayout);\r\n device.setBindGroup(0, this._bindGroup!);\r\n const savedRS = device.getRenderStates();\r\n device.setRenderStates(this._lightIndexRenderStates);\r\n device.draw('point-list', 0, numClusters);\r\n device.setRenderStates(savedRS);\r\n }\r\n } else {\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 0), DEPTH_CLEAR_VALUE, 0);\r\n }\r\n device.popDeviceStates();\r\n }\r\n /**\r\n * Orders `lights` by estimated contribution at the camera, most important first.\r\n *\r\n * @remarks\r\n * Both caps drop lights by buffer index - the global one truncates the tail, and\r\n * a full cluster keeps its lowest 16 indices - so without this whichever lights the\r\n * scene traversal happened to reach last are the ones that vanish. The score is\r\n * `brightness * r^2 / (r^2 + d^2)`, with `r` the radius of the sphere bounding the\r\n * lit region and `d` the camera's distance to it: 0 from anywhere inside it, falling\r\n * off with distance beyond it, and larger for lights that reach further. The sphere is\r\n * getLightBounds', so a spot light pointing away from the camera ranks by where it\r\n * shines rather than where it stands, and the brightness is lightBrightness', so a\r\n * rect light counts its whole area. Directional lights have no range and light\r\n * everything, so they always rank first.\r\n */\r\n private prioritize(lights: PunctualLight[], eye: Vector3) {\r\n if (lights.length < 2) {\r\n return;\r\n }\r\n // Scores and a permutation in reused typed arrays, so a frame allocates nothing.\r\n const n = lights.length;\r\n if (this._sortScores.length < n) {\r\n const capacity = 1 << Math.ceil(Math.log2(n));\r\n this._sortScores = new Float64Array(capacity);\r\n this._sortOrder = new Uint32Array(capacity);\r\n }\r\n const scores = this._sortScores;\r\n const order = this._sortOrder.subarray(0, n);\r\n const sorted = this._sortScratch;\r\n sorted.length = n;\r\n for (let i = 0; i < n; i++) {\r\n const light = lights[i];\r\n getLightBounds(light, _bounds);\r\n const range = _bounds[3];\r\n let score: number;\r\n if (light.isDirectionLight() || range <= 0) {\r\n score = Infinity;\r\n } else {\r\n const dx = _bounds[0] - eye.x;\r\n const dy = _bounds[1] - eye.y;\r\n const dz = _bounds[2] - eye.z;\r\n const d = Math.max(Math.sqrt(dx * dx + dy * dy + dz * dz) - range, 0);\r\n const range2 = range * range;\r\n score = (lightBrightness(light) * range2) / (range2 + d * d);\r\n }\r\n scores[i] = score;\r\n order[i] = i;\r\n sorted[i] = light;\r\n }\r\n order.sort(this._compareScores);\r\n for (let i = 0; i < n; i++) {\r\n lights[i] = sorted[order[i]];\r\n }\r\n sorted.length = 0;\r\n }\r\n /**\r\n * Orders buffer positions by descending score. Ties go to the lower position, which\r\n * keeps equally important lights in traversal order frame to frame. Compared rather\r\n * than subtracted: two directional lights would give Infinity - Infinity.\r\n */\r\n private readonly _compareScores = (a: number, b: number) => {\r\n const sa = this._sortScores[a];\r\n const sb = this._sortScores[b];\r\n return sa > sb ? -1 : sa < sb ? 1 : a - b;\r\n };\r\n private getVisibleLights(\r\n camera: Camera,\r\n renderQueue: RenderQueue,\r\n useShadowMask: boolean,\r\n preExposure: number\r\n ) {\r\n this.ensureLightArrayCapacity(\r\n Math.min(\r\n renderQueue.shadowedLights.length + renderQueue.unshadowedLights.length,\r\n ShaderHelper.getMaxClusterLights()\r\n ) + 1\r\n );\r\n const lights = this._lights;\r\n const view = camera.viewMatrix;\r\n const spheres = this._lightSpheres;\r\n const sphereStride = SPHERE_STRIDE;\r\n const globalLights = this._globalLights;\r\n globalLights.fill(0);\r\n let numGlobal = 0;\r\n const writeLight = (light: PunctualLight, slot: number) => {\r\n const offset = slot * 16;\r\n const colorIntensity = light.diffuseAndIntensity;\r\n const posRange = light.positionAndRange;\r\n const dirCutoff = light.directionAndCutoff;\r\n lights.set(posRange, offset);\r\n // Culling sphere: radius < 0 = shaded through a global slot, skipped by the index\r\n // pass; 0 = unbounded, in every cluster; otherwise it bounds the lit region.\r\n getLightBounds(light, _bounds);\r\n const x = _bounds[0];\r\n const y = _bounds[1];\r\n const z = _bounds[2];\r\n let radius = _bounds[3];\r\n if (radius <= 0) {\r\n if (numGlobal < MAX_GLOBAL_LIGHTS) {\r\n globalLights[numGlobal++] = slot;\r\n radius = -1;\r\n } else {\r\n radius = 0;\r\n }\r\n }\r\n // The view matrix is column-major.\r\n const s = slot * 4 * sphereStride;\r\n spheres[s + 0] = view[0] * x + view[4] * y + view[8] * z + view[12];\r\n spheres[s + 1] = view[1] * x + view[5] * y + view[9] * z + view[13];\r\n spheres[s + 2] = view[2] * x + view[6] * y + view[10] * z + view[14];\r\n spheres[s + 3] = radius;\r\n // Ranks the lights competing for a crowded cluster; same measure as prioritize().\r\n spheres[s + 4] = lightBrightness(light);\r\n lights.set(dirCutoff, offset + 4);\r\n // Only the intensity carries the camera pre-exposure; the color stays as authored. The\r\n // light's own cached vector must not be mutated because it is shared across cameras.\r\n lights[offset + 8] = colorIntensity.x;\r\n lights[offset + 9] = colorIntensity.y;\r\n lights[offset + 10] = colorIntensity.z;\r\n lights[offset + 11] = colorIntensity.w * preExposure;\r\n lights.set(light.extraParams, offset + 12);\r\n };\r\n // When the screen-space shadow mask is active, shadow-casting lights occupy\r\n // the head of the buffer (slots 1..N) in the exact order of\r\n // renderQueue.shadowedLights. The mask pass must assign layers/channels from\r\n // the SAME list in the SAME order so that a light's buffer index maps to its\r\n // mask slot without storing a per-light index. Keep these two in lockstep.\r\n let numShadow = 0;\r\n let slot = 0;\r\n if (useShadowMask) {\r\n numShadow = Math.min(\r\n renderQueue.shadowedLights.length,\r\n MAX_SHADOW_MASK_LIGHTS,\r\n ShaderHelper.getMaxClusterLights()\r\n );\r\n for (let i = 1; i <= numShadow; i++) {\r\n writeLight(renderQueue.shadowedLights[i - 1], i);\r\n }\r\n slot = numShadow;\r\n }\r\n // Everything without a mask slot fills the region after the mask-backed shadow\r\n // lights: the unshadowed lights, plus shadow-casting lights beyond the mask\r\n // capacity (MAX_SHADOW_MASK_LIGHTS). Rather than dropping the latter silently they\r\n // are still lit here - without a mask sample, i.e. degraded to no shadow. Both\r\n // compete for the remaining slots on equal terms, most important first.\r\n const rest = this._rest;\r\n rest.length = 0;\r\n for (const light of renderQueue.unshadowedLights) {\r\n rest.push(light);\r\n }\r\n const overflow = useShadowMask ? renderQueue.shadowedLights.length - numShadow : 0;\r\n for (let k = 0; k < overflow; k++) {\r\n rest.push(renderQueue.shadowedLights[numShadow + k]);\r\n }\r\n this.prioritize(rest, camera.getWorldPosition());\r\n const numRest = Math.min(rest.length, ShaderHelper.getMaxClusterLights() - slot);\r\n for (let j = 0; j < numRest; j++) {\r\n writeLight(rest[j], slot + j + 1);\r\n }\r\n slot += numRest;\r\n if (overflow > 0 && !ClusteredLight._warnedShadowMaskOverflow) {\r\n ClusteredLight._warnedShadowMaskOverflow = true;\r\n const dropped = rest.length - numRest;\r\n console.warn(\r\n `ClusteredLight: ${renderQueue.shadowedLights.length} shadow-casting lights exceed the ` +\r\n `screen-space shadow mask capacity (${MAX_SHADOW_MASK_LIGHTS}); ${overflow} light(s) are ` +\r\n `lit without shadows${dropped > 0 ? `, and the ${dropped} least important light(s) dropped` : ''}.`\r\n );\r\n }\r\n rest.length = 0;\r\n this._numShadowLights = numShadow;\r\n return slot;\r\n }\r\n}\r\n"],"names":["UNIFORM_NAME_LIGHT_SPHERES","SPHERE_STRIDE","TILE_SIZE_PX","MAX_TILES_PER_AXIS","TILE_COUNT_Z","NEAR_SLICE_METERS","INDEX_GROUP_SIZE","LIST_LIGHTS_PER_CLUSTER","MAX_LIST_ENTRIES","SCORE_BUCKETS","declareIndexPassScope","pb","scope","sphereStride","storage","invProjMatrix","mat4","uniform","sizeParam","vec4","countParam","ivec4","orthoProj","int","sliceParam","storageBufferReadonly","ShaderHelper","getMaxClusterLights","uniformBuffer","func","vec3","float","$l","normal","ab","sub","b","a","t","div","zDistance","dot","$return","add","mul","$if","lessThan","k","y","z","x","pow","w","view","clip","texCoord","screen","xy","vec2","clipToView","d","max","aabbMin","p","aabbMax","or","equal","sphere","lessThanEqual","distSq","r","neg","and","greaterThan","left","xyz","right","bottom","top","call","emitClusterBounds","tileIndex","tileSize","zIndex","yIndex","xIndex","maxPoint_sS","minPoint_sS","maxPoint_vS","screenToView","minPoint_vS","sliceNear","sliceFar","planeLeft","planeRight","planeBottom","planeTop","notEqual","tileNear","mix","tileFar","min","$else","sliceDepth","eyePos","minPointNear","lineIntersectionToZPlane","minPointFar","maxPointNear","maxPointFar","lo","hi","normalize","emitSelectionInit","n","lightIndex","uint","lightScore","minSlot","minScore","emitScoreSetup","halfDiagSq","center","emitLightScore","brightness","score","lightPos","f","clamp","toCenter","emitLightReaches","aabbDistSq","greaterThanEqual","sphereReachesAABB","not","sphereOutsideTile","emitConsiderLight","index","setAt","$elseif","$continue","$for","at","emitPackSelection","sal","g","uvec4","lightBrightness","light","c","diffuseAndIntensity","Math","isRectLight","width","height","getLightBounds","out","posRange","positionAndRange","isSpotLight","dirCutoff","directionAndCutoff","cosAngle","len","hypot","dist","SQRT1_2","sqrt","_bounds","Float32Array","ClusteredLight","_warnedShadowMaskOverflow","_pool","acquire","tileCount","findIndex","cl","_tileCountX","_tileCountY","splice","pop","size","ceil","release","push","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_countBindGroup","_readbackPending","_readback","_warnedListOverflow","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_lightSphereBuffer","_lightListCapacity","_listCounterZero","_lightIndexTexSize","_sizeParam","_countParam","_clusterParam","_numShadowLights","_orthographic","_sortOrder","_sortScratch","_lightSpheres","_globalLights","Int32Array","MAX_GLOBAL_LIGHTS","_storageLightCapacity","_clusterGridBuffer","_lightListBuffer","_listCounterBuffer","_listCounterReadBuffer","Uint32Array","_lightCountProgram","_requestedListEntries","Uint8Array","_lightIndexVertexBuffer","Vector4","_sliceParam","_rest","_sortScores","Float64Array","lightBuffer","numShadowLights","orthographic","globalLights","clusterParam","lightIndexTexture","lightIndexTexSize","clusterGridBuffer","lightListBuffer","createVertexLayout","device","textureWidth","textureHeight","numClusters","vertices","i","ix","iy","floor","vb","createVertexBuffer","vertexBuffers","buffer","resizeGrid","dispose","createRenderState","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","createProgram","type","setup","pb0","clusterGrid","storageBuffer","listCounter","atomic_uint","batchSpheres","workgroup","batchBrightness","emitMainSetup","cluster","$builtins","globalInvocationId","valid","cell","local","localInvocationId","numLights","numBatches","forEachBatchedLight","test","body","base","li","workgroupBarrier","batchCount","lightId","j","buildComputeProgram","label","workgroupSize","compute","main","listCount","atomicAdd","name","createBindGroup","bindGroupLayouts","listCapacity","lightList","log2","need","total","atomicLoad","allowed","truncated","hist","h","bucket","scoreBucket","cutBucket","cutRoom","kept","$break","listOffset","select","written","keep","buildRenderProgram","vertex","$inputs","pos","attrib","$outputs","value","pointSize","position","vertexIndex","fragment","color","usesClusterLightLists","sphereBufferType","getBindingInfo","createStructuredBuffer","usage","ensureStorageLightCapacity","count","capacity","createBuffer","ensureListBuffers","getDevice","copyBuffer","getBufferSubData","then","requested","console","warn","ensureLightArrayCapacity","stride","length","createLightBuffer","lightBufferType","PBStructTypeInfo","getLightBufferUniformName","PBArrayTypeInfo","PBPrimitiveTypeInfo","PBPrimitiveType","F32VEC4","createLightIndexTexture","getDeviceCaps","textureCaps","maxTextureSize","createTexture2D","mipmapping","createFrameBuffer","calculateLightIndex","camera","renderQueue","screenSpaceShadowMask","preExposure","getVisibleLights","vw","vh","near","getNearPlane","far","getFarPlane","isPerspective","scale","bias","split","scene","metersPerUnit","nearSlice","expStart","firstExpSlice","numExpSlices","setXYZW","pushDeviceStates","setFramebuffer","setViewport","setScissor","disposed","reload","bufferSubData","setValue","getInvProjectionMatrix","setBuffer","setProgram","numGroups","countBindGroup","setBindGroup","readBackListRequest","setVertexLayout","savedRS","getRenderStates","setRenderStates","draw","clearFrameBuffer","DEPTH_CLEAR_VALUE","popDeviceStates","prioritize","lights","eye","scores","order","subarray","sorted","range","isDirectionLight","Infinity","dx","dy","dz","range2","sort","_compareScores","sa","sb","useShadowMask","shadowedLights","unshadowedLights","viewMatrix","spheres","fill","numGlobal","writeLight","slot","offset","colorIntensity","set","radius","s","extraParams","numShadow","MAX_SHADOW_MASK_LIGHTS","rest","overflow","getWorldPosition","numRest","dropped"],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { ClipState } from '@zephyr3d/base';
|
|
2
2
|
import { OctreeNode } from '../scene/octree.js';
|
|
3
3
|
import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values.js';
|
|
4
|
+
import { getDevice } from '../app/api.js';
|
|
5
|
+
import { warnUnsupported } from '../utility/unsupported.js';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* Node visitor for culling
|
|
@@ -12,14 +14,16 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
12
14
|
/** @internal */ _renderPass;
|
|
13
15
|
/** @internal */ _isGPUPicking;
|
|
14
16
|
/** @internal */ _isShadowMapping;
|
|
17
|
+
/** @internal */ _lodCamera;
|
|
15
18
|
/**
|
|
16
19
|
* Creates an instance of CullVisitor
|
|
17
20
|
* @param renderPass - Render pass for the culling task
|
|
18
21
|
* @param camera - Camera that will be used for culling
|
|
19
22
|
* @param rendeQueue - RenderQueue
|
|
20
|
-
* @param
|
|
21
|
-
*/ constructor(renderPass, camera, renderQueue){
|
|
23
|
+
* @param lodCamera - Camera whose view selects the levels of detail, the culling camera by default
|
|
24
|
+
*/ constructor(renderPass, camera, renderQueue, lodCamera){
|
|
22
25
|
this._camera = camera;
|
|
26
|
+
this._lodCamera = lodCamera ?? camera;
|
|
23
27
|
this._renderQueue = renderQueue;
|
|
24
28
|
this._skipClipTest = false;
|
|
25
29
|
this._renderPass = renderPass;
|
|
@@ -32,6 +36,15 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
32
36
|
set camera(camera) {
|
|
33
37
|
this._camera = camera || null;
|
|
34
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* The camera whose view selects the levels of detail: the view being rendered, which for shadow
|
|
41
|
+
* maps is not the culling camera
|
|
42
|
+
*/ get lodCamera() {
|
|
43
|
+
return this._lodCamera;
|
|
44
|
+
}
|
|
45
|
+
set lodCamera(camera) {
|
|
46
|
+
this._lodCamera = camera;
|
|
47
|
+
}
|
|
35
48
|
/** true if cull with frustum culling, otherwise false. default is true */ get frustumCulling() {
|
|
36
49
|
return !this._skipClipTest;
|
|
37
50
|
}
|
|
@@ -50,8 +63,8 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
50
63
|
/** Frustum for culling */ get frustum() {
|
|
51
64
|
return this._camera?.frustum || null;
|
|
52
65
|
}
|
|
53
|
-
/** @internal */ push(camera, drawable) {
|
|
54
|
-
this.renderQueue.push(camera, drawable);
|
|
66
|
+
/** @internal */ push(camera, drawable, lod = 0) {
|
|
67
|
+
this.renderQueue.push(camera, drawable, lod);
|
|
55
68
|
}
|
|
56
69
|
/** @internal */ pushRenderQueue(renderQueue) {
|
|
57
70
|
this.renderQueue.pushRenderQueue(renderQueue);
|
|
@@ -164,7 +177,7 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
164
177
|
if (!node.hidden && (node.castShadow || !this._isShadowMapping) && (node.gpuPickable || !this._isGPUPicking)) {
|
|
165
178
|
const clipState = this.getClipStateWithNode(node);
|
|
166
179
|
if (clipState !== ClipState.NOT_CLIPPED) {
|
|
167
|
-
this.push(this._camera, node);
|
|
180
|
+
this.push(this._camera, node, node.selectLod(this._lodCamera));
|
|
168
181
|
return true;
|
|
169
182
|
}
|
|
170
183
|
}
|
|
@@ -178,6 +191,13 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
178
191
|
* strand material has a transparent shadow caster path built for exactly that.
|
|
179
192
|
* @internal
|
|
180
193
|
*/ visitHair(node) {
|
|
194
|
+
if (getDevice().type !== 'webgpu') {
|
|
195
|
+
// Kept out of the queue entirely: the strand shader reads storage buffers
|
|
196
|
+
// from the vertex stage, so every pass that drew it would fail to build its
|
|
197
|
+
// program and log an error that does not say why.
|
|
198
|
+
warnUnsupported('Hair strands (Hair node)', 'WebGPU', 'hair is not drawn');
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
181
201
|
if (!node.hidden && (node.castShadow || !this._isShadowMapping) && (node.gpuPickable || !this._isGPUPicking)) {
|
|
182
202
|
const clipState = this.getClipStateWithNode(node);
|
|
183
203
|
if (clipState !== ClipState.NOT_CLIPPED) {
|
|
@@ -192,6 +212,7 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
192
212
|
const clipState = this.getClipStateWithNode(node);
|
|
193
213
|
if (clipState !== ClipState.NOT_CLIPPED) {
|
|
194
214
|
this.push(this._camera, node);
|
|
215
|
+
this.renderQueue.pushWater(node);
|
|
195
216
|
return true;
|
|
196
217
|
}
|
|
197
218
|
}
|