@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":"shadowmapper.js","sources":["../../src/shadow/shadowmapper.ts"],"sourcesContent":["import type { RequireOptionals, Nullable } from '@zephyr3d/base';\r\nimport {\r\n retainObject,\r\n Matrix4x4,\r\n Vector3,\r\n Vector4,\r\n AABB,\r\n CubeFace,\r\n Frustum,\r\n Disposable\r\n} from '@zephyr3d/base';\r\nimport type {\r\n PBShaderExp,\r\n FrameBuffer,\r\n Texture2D,\r\n Texture2DArray,\r\n TextureCube,\r\n TextureFormat,\r\n PBInsideFunctionScope,\r\n TextureSampler,\r\n TextureCreationOptions,\r\n TextureType,\r\n BaseTexture\r\n} from '@zephyr3d/device';\r\nimport { Camera } from '../camera/camera';\r\nimport { SSM } from './ssm';\r\nimport { ESM } from './esm';\r\nimport { VSM } from './vsm';\r\nimport type { PCFPD } from './pcf_pd';\r\nimport { PCFOPT } from './pcf_opt';\r\nimport { PCSS } from './pcss';\r\nimport { DOM } from './dom';\r\nimport type { PointLight, PunctualLight, RectLight, SpotLight } from '../scene/light';\r\nimport type { ShadowMapPass } from '../render/shadowmap_pass';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { ShadowImpl } from './shadow_impl';\r\nimport type { DrawContext } from '../render';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT } from '../values';\r\nimport { getDevice } from '../app/api';\r\nimport { ShadowRegion } from './shadow_region';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\nconst tmpFrustum = new Frustum(Matrix4x4.identity());\r\n\r\n/**\r\n * Shadow mapping mode\r\n * @public\r\n */\r\nexport type ShadowMode =\r\n | 'hard'\r\n | 'vsm'\r\n | 'esm'\r\n | 'pcf'\r\n | 'pcss'\r\n /**\r\n * Deep opacity map. Fractional occlusion through hair rather than a binary\r\n * blocked/unblocked test. WebGPU only.\r\n */\r\n | 'dom'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-pd'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-opt';\r\n/**\r\n * Preset shadow quality profiles.\r\n *\r\n * @public\r\n */\r\nexport type ShadowQualityPreset = 'character-small' | 'outdoor-large';\r\n\r\n/** @internal */\r\nexport type ShadowMapParams = {\r\n lightType: number;\r\n shaderHash: string;\r\n numShadowCascades: number;\r\n depthClampEnabled: boolean;\r\n cascadeDistances: Vector4;\r\n depthBiasValues: Vector4[];\r\n depthBiasScales: Vector4;\r\n cameraParams: Vector4;\r\n shadowMatrices: Float32Array;\r\n shadowMapFramebuffer: Nullable<FrameBuffer>;\r\n shadowMap: Nullable<BaseTexture>;\r\n shadowMapSampler: Nullable<TextureSampler>;\r\n impl: Nullable<ShadowImpl>;\r\n implData: unknown;\r\n /**\r\n * Zero-based ordinal of this light within the screen-space shadow mask\r\n * (`layer = ordinal >> 2`, `channel = ordinal & 3`). Set by\r\n * {@link ShadowMaskRenderer.render} each frame the mask is built; undefined\r\n * when the mask is not in use. Consumed by effects that sample the mask\r\n * instead of recomputing shadows (e.g. the SSS combine pass).\r\n */\r\n maskOrdinal?: number;\r\n};\r\n\r\n/** @internal */\r\nexport type ShadowMapType = Texture2D | TextureCube | Texture2DArray;\r\n\r\n/** @internal */\r\nexport interface ShadowConfig {\r\n shadowMapSize: number;\r\n numCascades?: number;\r\n splitLambda?: number;\r\n depthBias?: number;\r\n normalBias?: number;\r\n nearClip?: number;\r\n}\r\n\r\n/**\r\n * The shadow map generator\r\n * @public\r\n */\r\nexport class ShadowMapper extends Disposable {\r\n /** @internal */\r\n private static readonly _snapMatrix = new Matrix4x4();\r\n /** @internal */\r\n private static readonly _target = new Vector3();\r\n /** @internal */\r\n private static readonly _up = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMin = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMax = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumCenter = new Vector3();\r\n /** @internal */\r\n private static readonly _lightCameras: WeakMap<Scene, Camera[]> = new WeakMap();\r\n /** @internal */\r\n private static readonly _shadowMapParams: ShadowMapParams[] = [];\r\n /** @internal */\r\n protected _light: PunctualLight;\r\n /** @internal */\r\n protected _config: RequireOptionals<ShadowConfig>;\r\n /** @internal */\r\n protected _resourceDirty: boolean;\r\n /** @internal */\r\n protected _shadowMode: ShadowMode;\r\n /** @internal */\r\n protected _shadowDistance: number;\r\n /** @internal */\r\n protected _impl: Nullable<ShadowImpl>;\r\n /** @internal */\r\n protected _pdSampleCount: number;\r\n /** @internal */\r\n protected _pdSampleRadius: number;\r\n /** @internal */\r\n protected _pcfKernelSize: number;\r\n /** @internal */\r\n protected _pcssLightRadius: number;\r\n /** @internal */\r\n protected _pcssBlockerSampleCount: number;\r\n /** @internal */\r\n protected _pcssFilterSampleCount: number;\r\n /** @internal */\r\n protected _pcssMaxFilterRadius: number;\r\n /** @internal */\r\n protected _pcssTemporalJitter: boolean;\r\n /** @internal */\r\n protected _domLayerDistance: number;\r\n /** @internal */\r\n protected _domDensity: number;\r\n /** @internal */\r\n protected _domFilterSize: number;\r\n /** @internal */\r\n protected _vsmBlurKernelSize: number;\r\n /** @internal */\r\n protected _vsmBlurRadius: number;\r\n /** @internal */\r\n protected _vsmDarkness: number;\r\n /** @internal */\r\n protected _esmBlur: boolean;\r\n /** @internal */\r\n protected _esmLogSpace: boolean;\r\n /** @internal */\r\n protected _esmBlurKernelSize: number;\r\n /** @internal */\r\n protected _esmBlurRadius: number;\r\n /** @internal */\r\n protected _esmDepthScale: number;\r\n /** @internal */\r\n protected _shadowStrength: number;\r\n /** @internal */\r\n protected _shadowRegion: ShadowRegion;\r\n /**\r\n * Creates an instance of ShadowMapper\r\n * @param light - The light that is used to generate shadow map\r\n */\r\n constructor(light: PunctualLight) {\r\n super();\r\n this._light = light;\r\n this._config = {\r\n shadowMapSize: 1024,\r\n numCascades: 1,\r\n splitLambda: 0.5,\r\n depthBias: 0.003,\r\n normalBias: 1.5,\r\n nearClip: 1\r\n };\r\n this._resourceDirty = true;\r\n this._shadowMode = 'pcf';\r\n this._shadowDistance = 2000;\r\n this._impl = null;\r\n this._pdSampleCount = 24;\r\n this._pdSampleRadius = 3;\r\n this._pcfKernelSize = 7;\r\n this._pcssLightRadius = 8;\r\n this._pcssBlockerSampleCount = 24;\r\n this._pcssFilterSampleCount = 32;\r\n this._pcssMaxFilterRadius = 32;\r\n this._pcssTemporalJitter = true;\r\n this._domLayerDistance = 0.25;\r\n this._domDensity = 1;\r\n this._domFilterSize = 5;\r\n this._vsmBlurKernelSize = 5;\r\n this._vsmBlurRadius = 4;\r\n this._vsmDarkness = 0.3;\r\n this._esmBlur = true;\r\n this._esmLogSpace = true;\r\n this._esmBlurKernelSize = 5;\r\n this._esmBlurRadius = 4;\r\n this._esmDepthScale = 200;\r\n this._shadowStrength = 1;\r\n this._shadowRegion = new ShadowRegion();\r\n this.applyMode(this._shadowMode);\r\n }\r\n /** The light that is used to generate shadow map */\r\n get light() {\r\n return this._light;\r\n }\r\n /** Size of the shadow map */\r\n get shadowMapSize() {\r\n return this._config.shadowMapSize;\r\n }\r\n set shadowMapSize(num) {\r\n if (!Number.isInteger(num) || num < 1) {\r\n console.error(`invalid shadow map size: ${num}`);\r\n return;\r\n }\r\n if (this._config.shadowMapSize !== num) {\r\n this._config.shadowMapSize = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** Shadow region for directional light */\r\n get shadowRegion() {\r\n return this._shadowRegion;\r\n }\r\n /** @internal */\r\n updateDirectionalShadowRegion(force = false) {\r\n if (!this._light.isDirectionLight()) {\r\n return;\r\n }\r\n if (!force) {\r\n return;\r\n }\r\n const scene = this._light.scene;\r\n if (!scene) {\r\n return;\r\n }\r\n this._shadowRegion.clear();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n this._shadowRegion.addDynamicCaster(child);\r\n }\r\n });\r\n }\r\n /** @internal */\r\n computeDirectionalShadowRegion(scene: Scene) {\r\n const aabb = new AABB();\r\n aabb.beginExtend();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n const bbox = child.getWorldBoundingVolume()?.toAABB();\r\n if (bbox) {\r\n aabb.extend(bbox.minPoint);\r\n aabb.extend(bbox.maxPoint);\r\n }\r\n }\r\n });\r\n return aabb.isValid() ? aabb : null;\r\n }\r\n /** Maximum distance from the camera, shadow will not be rendered beyond this range */\r\n get shadowDistance() {\r\n return this._shadowDistance;\r\n }\r\n set shadowDistance(val) {\r\n this._shadowDistance = Math.max(0, val);\r\n }\r\n /** Count of the cascades, The maximum value is 4 */\r\n get numShadowCascades() {\r\n return this._config.numCascades;\r\n }\r\n set numShadowCascades(num) {\r\n if (num !== 1 && num !== 2 && num !== 3 && num !== 4) {\r\n console.error(`invalid shadow cascade number: ${num}`);\r\n return;\r\n }\r\n if (!this._light.isDirectionLight() && num > 1) {\r\n console.error(`only directional light can have more than one shadow cascades`);\r\n return;\r\n }\r\n if (num !== this._config.numCascades) {\r\n this._config.numCascades = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** The split lambda for cascaded shadow mapping */\r\n get splitLambda() {\r\n return this._config.splitLambda;\r\n }\r\n set splitLambda(val) {\r\n if (this._config.splitLambda !== val) {\r\n this._config.splitLambda = val;\r\n }\r\n }\r\n /** Depth bias for the shadow map */\r\n get depthBias() {\r\n return this._config.depthBias;\r\n }\r\n set depthBias(val) {\r\n this._config.depthBias = val;\r\n }\r\n /**\r\n * Normal offset bias, in shadow map texels.\r\n *\r\n * @remarks\r\n * Before sampling, the receiver is moved along its normal by this many texel\r\n * widths, scaled by `sin(theta)` between the normal and the light so the\r\n * offset is zero facing the light and largest at grazing incidence. This is\r\n * what removes grazing-angle self-shadowing acne; {@link depthBias} alone\r\n * cannot, because the depth error over one texel grows without bound as the\r\n * surface turns away from the light.\r\n *\r\n * Useful values are roughly 1 to 4. Too little leaves acne on curved surfaces\r\n * near the terminator; too much detaches contact shadows from thin geometry.\r\n */\r\n get normalBias() {\r\n return this._config.normalBias;\r\n }\r\n set normalBias(val) {\r\n this._config.normalBias = val;\r\n }\r\n /** Near clip plane */\r\n get nearClip() {\r\n return this._config.nearClip;\r\n }\r\n set nearClip(val) {\r\n if (this._config.nearClip !== val) {\r\n this._config.nearClip = val;\r\n }\r\n }\r\n /** Shadow strength, 0 means no shadowing and 1 means full shadowing */\r\n get shadowStrength() {\r\n return this._shadowStrength;\r\n }\r\n set shadowStrength(val) {\r\n this._shadowStrength = Math.min(1, Math.max(0, Number(val) || 0));\r\n }\r\n /** Shadow map mode */\r\n get mode() {\r\n return this._shadowMode;\r\n }\r\n set mode(mode) {\r\n if (mode !== this._shadowMode) {\r\n this._shadowMode = mode;\r\n this.applyMode(this._shadowMode);\r\n }\r\n }\r\n /**\r\n * Applies a practical shadow preset for common scenarios.\r\n *\r\n * `character-small`: higher contact quality and tighter distance for character-centric scenes.\r\n * `outdoor-large`: longer distance coverage for open scenes.\r\n */\r\n applyQualityPreset(preset: ShadowQualityPreset) {\r\n if (preset === 'character-small') {\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 120;\r\n this.splitLambda = 0.75;\r\n this.depthBias = 0.005;\r\n this.normalBias = 2;\r\n this.nearClip = 0.2;\r\n this.pcfKernelSize = 5;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 3 : 1;\r\n return;\r\n }\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 800;\r\n this.splitLambda = 0.6;\r\n this.depthBias = 0.0035;\r\n this.normalBias = 1.5;\r\n this.nearClip = 1;\r\n this.pcfKernelSize = 3;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 4 : 1;\r\n }\r\n /** @internal */\r\n getShaderHash(shadowMapParams: ShadowMapParams) {\r\n return `${shadowMapParams.impl!.constructor.name}_${shadowMapParams.impl!.getShaderHash()}_${\r\n shadowMapParams.lightType\r\n }_${shadowMapParams.shadowMap!.target}_${Number(shadowMapParams.numShadowCascades > 1)}_${Number(\r\n getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMapParams.shadowMap!.format)\r\n .filterable\r\n )}`;\r\n }\r\n /** Sample count for poisson disc PCF */\r\n get pdSampleCount() {\r\n return this._pdSampleCount;\r\n }\r\n set pdSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pdSampleCount) {\r\n this._pdSampleCount = val;\r\n const pcfpd = this.asPCFPD();\r\n if (pcfpd) {\r\n pcfpd.tapCount = this._pdSampleCount;\r\n }\r\n }\r\n }\r\n /** Radius for poisson disc PCF */\r\n get pdSampleRadius() {\r\n return this._pdSampleRadius;\r\n }\r\n set pdSampleRadius(val) {\r\n val = Math.max(0, Number(val) >> 0);\r\n if (val !== this._pdSampleRadius) {\r\n this._pdSampleRadius = val;\r\n this.asPCFPD()?.setDepthScale(this._pdSampleRadius);\r\n }\r\n }\r\n /** Kernel size for optimized PCF */\r\n get pcfKernelSize() {\r\n return this._pcfKernelSize;\r\n }\r\n set pcfKernelSize(val) {\r\n val = val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n if (val !== this._pcfKernelSize) {\r\n this._pcfKernelSize = val;\r\n const pcfopt = this.asPCFOPT();\r\n if (pcfopt) {\r\n pcfopt.kernelSize = this._pcfKernelSize;\r\n }\r\n }\r\n }\r\n /** Light radius for PCSS shadow, measured in shadow-map texels */\r\n get pcssLightRadius() {\r\n return this._pcssLightRadius;\r\n }\r\n set pcssLightRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._pcssLightRadius) {\r\n this._pcssLightRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.lightRadius = this._pcssLightRadius;\r\n }\r\n }\r\n }\r\n /**\r\n * Depth spanned by the deep opacity map's layers, in world units along the\r\n * light direction. Only meaningful when the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * Set it to roughly the thickness of the hair. Too small and everything past\r\n * the outer strands saturates the last layer, which is a hard shadow again;\r\n * too large and all three layers fall inside the first strand, leaving the\r\n * interior unshadowed.\r\n */\r\n get domLayerDistance() {\r\n return this._domLayerDistance;\r\n }\r\n set domLayerDistance(val) {\r\n val = Math.max(0.0001, Number(val) || 0);\r\n if (val !== this._domLayerDistance) {\r\n this._domLayerDistance = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.layerDistance = this._domLayerDistance;\r\n }\r\n }\r\n }\r\n /**\r\n * How strongly accumulated hair coverage attenuates light. Only meaningful when\r\n * the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * Raise it to darken the interior of a groom without moving the layers.\r\n */\r\n get domDensity() {\r\n return this._domDensity;\r\n }\r\n set domDensity(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._domDensity) {\r\n this._domDensity = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.density = this._domDensity;\r\n }\r\n }\r\n }\r\n /**\r\n * Width of the deep opacity map's sampling kernel in texels: 1, 3, 5 or 7. Only\r\n * meaningful when the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * The technique's own gradation runs along the light rather than across the\r\n * map, so without a kernel the silhouette of a groom is as hard an edge as an\r\n * unfiltered shadow map gives. This is what softens it, at one layer lookup per\r\n * tap. Defaults to 5.\r\n */\r\n get domFilterSize() {\r\n return this._domFilterSize;\r\n }\r\n set domFilterSize(val) {\r\n val = val !== 1 && val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n if (val !== this._domFilterSize) {\r\n this._domFilterSize = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.filterSize = this._domFilterSize;\r\n }\r\n }\r\n }\r\n /** Blocker search sample count for PCSS shadow */\r\n get pcssBlockerSampleCount() {\r\n return this._pcssBlockerSampleCount;\r\n }\r\n set pcssBlockerSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssBlockerSampleCount) {\r\n this._pcssBlockerSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.blockerSampleCount = this._pcssBlockerSampleCount;\r\n }\r\n }\r\n }\r\n /** Filter sample count for PCSS shadow */\r\n get pcssFilterSampleCount() {\r\n return this._pcssFilterSampleCount;\r\n }\r\n set pcssFilterSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssFilterSampleCount) {\r\n this._pcssFilterSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.filterSampleCount = this._pcssFilterSampleCount;\r\n }\r\n }\r\n }\r\n /** Maximum PCSS filter radius, measured in shadow-map texels */\r\n get pcssMaxFilterRadius() {\r\n return this._pcssMaxFilterRadius;\r\n }\r\n set pcssMaxFilterRadius(val) {\r\n val = Math.max(1, Number(val) || 1);\r\n if (val !== this._pcssMaxFilterRadius) {\r\n this._pcssMaxFilterRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.maxFilterRadius = this._pcssMaxFilterRadius;\r\n }\r\n }\r\n }\r\n /** If true, rotates PCSS sampling pattern over frames for TAA accumulation */\r\n get pcssTemporalJitter() {\r\n return this._pcssTemporalJitter;\r\n }\r\n set pcssTemporalJitter(val) {\r\n val = !!val;\r\n if (val !== this._pcssTemporalJitter) {\r\n this._pcssTemporalJitter = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.temporalJitter = this._pcssTemporalJitter;\r\n }\r\n }\r\n }\r\n /** Kernel size of VSM */\r\n get vsmBlurKernelSize() {\r\n return this._vsmBlurKernelSize;\r\n }\r\n set vsmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._vsmBlurKernelSize) {\r\n this._vsmBlurKernelSize = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.kernelSize = this._vsmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for VSM */\r\n get vsmBlurRadius() {\r\n return this._vsmBlurRadius;\r\n }\r\n set vsmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._vsmBlurRadius) {\r\n this._vsmBlurRadius = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.blurSize = this._vsmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Darkness for VSM */\r\n get vsmDarkness() {\r\n return this._vsmDarkness;\r\n }\r\n set vsmDarkness(val) {\r\n val = Math.min(0.999, Math.max(0, Number(val) || 0));\r\n if (val !== this._vsmDarkness) {\r\n this._vsmDarkness = val;\r\n this.asVSM()?.setDepthScale(this._vsmDarkness);\r\n }\r\n }\r\n /** Whether to enable ESM blur */\r\n get esmBlur() {\r\n return this._esmBlur;\r\n }\r\n set esmBlur(val) {\r\n if (!!val !== this.esmBlur) {\r\n this._esmBlur = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blur = this._esmBlur;\r\n }\r\n }\r\n }\r\n /** Whether to enable log space ESM blur */\r\n get esmLogSpace() {\r\n return this._esmLogSpace;\r\n }\r\n set esmLogSpace(val) {\r\n if (!!val !== this.esmLogSpace) {\r\n this._esmLogSpace = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.logSpace = this._esmLogSpace;\r\n }\r\n }\r\n }\r\n /** Kernel size for ESM */\r\n get esmBlurKernelSize() {\r\n return this._esmBlurKernelSize;\r\n }\r\n set esmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._esmBlurKernelSize) {\r\n this._esmBlurKernelSize = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.kernelSize = this._esmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for ESM */\r\n get esmBlurRadius() {\r\n return this._esmBlurRadius;\r\n }\r\n set esmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmBlurRadius) {\r\n this._esmBlurRadius = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blurSize = this._esmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Depth scale for ESM */\r\n get esmDepthScale() {\r\n return this._esmDepthScale;\r\n }\r\n set esmDepthScale(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmDepthScale) {\r\n this._esmDepthScale = val;\r\n this.asESM()?.setDepthScale(this._esmDepthScale);\r\n }\r\n }\r\n /** @internal */\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadow(shadowMapParams, scope, shadowVertex, NdotL);\r\n }\r\n /** @internal */\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadowCSM(shadowMapParams, scope, shadowVertex, NdotL, split);\r\n }\r\n /** @internal */\r\n static releaseTemporalResources(ctx: DrawContext) {\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n const shadowMapParams = ctx.shadowMapInfo.get(k)!;\r\n //ctx.device.pool.releaseFrameBuffer(shadowMapParams.shadowMapFramebuffer);\r\n shadowMapParams.lightType = LIGHT_TYPE_NONE;\r\n shadowMapParams.depthClampEnabled = false;\r\n shadowMapParams.shaderHash = '';\r\n shadowMapParams.numShadowCascades = 1;\r\n shadowMapParams.shadowMapFramebuffer = null;\r\n shadowMapParams.impl = null;\r\n shadowMapParams.shadowMap = null;\r\n shadowMapParams.shadowMapSampler = null;\r\n shadowMapParams.implData = null;\r\n this._shadowMapParams.push(shadowMapParams);\r\n }\r\n ctx.shadowMapInfo = null;\r\n }\r\n }\r\n /** @internal */\r\n protected isTextureInvalid(\r\n texture: Texture2D | TextureCube | Texture2DArray,\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number\r\n ) {\r\n return (\r\n texture &&\r\n (texture.target !== target ||\r\n texture.format !== format ||\r\n texture.width !== width ||\r\n texture.height !== height ||\r\n texture.depth !== this.numShadowCascades)\r\n );\r\n }\r\n /** @internal */\r\n protected createTexture(\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number\r\n ) {\r\n const device = getDevice();\r\n const options: TextureCreationOptions = {\r\n mipmapping: false\r\n };\r\n switch (target) {\r\n case '2d':\r\n return device.createTexture2D(format, width, height, options)!;\r\n case 'cube':\r\n return device.createCubeTexture(format, width, options)!;\r\n case '2darray':\r\n return device.createTexture2DArray(format, width, height, depth, options)!;\r\n default:\r\n throw new Error(`Invalid target ${target}`);\r\n }\r\n }\r\n /** @internal */\r\n static fetchTemporalFramebuffer(\r\n autoRelease: boolean,\r\n lightType: number,\r\n numCascades: number,\r\n width: number,\r\n height: number,\r\n colorFormat: TextureFormat,\r\n depthFormat: TextureFormat,\r\n mipmapping?: boolean\r\n ) {\r\n const device = getDevice();\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [\r\n device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n colorFormat,\r\n width,\r\n height,\r\n numCascades,\r\n mipmapping\r\n )\r\n ]\r\n : lightType === LIGHT_TYPE_POINT\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, width, mipmapping)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, width, height, mipmapping)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, width, height, numCascades, false)\r\n : device.type !== 'webgl' && lightType === LIGHT_TYPE_POINT\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, width, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, width, height, false)\r\n : null;\r\n const fb = device.pool.createTemporalFramebuffer(autoRelease, colorAttachments!, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n /** @internal */\r\n protected updateResources(shadowMapParams: ShadowMapParams) {\r\n const device = getDevice();\r\n const colorFormat = shadowMapParams.impl!.getShadowMapColorFormat(shadowMapParams);\r\n const depthFormat = shadowMapParams.impl!.getShadowMapDepthFormat(shadowMapParams);\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const shadowMapWidth =\r\n numCascades > 1 && !useTextureArray ? 2 * this._config.shadowMapSize : this._config.shadowMapSize;\r\n const shadowMapHeight =\r\n numCascades > 2 && !useTextureArray ? 2 * this._config.shadowMapSize : this._config.shadowMapSize;\r\n /*\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [device.pool.fetchTemporalTexture2DArray(false, colorFormat, shadowMapWidth, shadowMapHeight, numCascades, false)]\r\n : this._light.isPointLight()\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, shadowMapWidth, false)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, shadowMapWidth, shadowMapHeight, false)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, shadowMapWidth, shadowMapHeight, numCascades, false)\r\n : device.type !== 'webgl' && this._light.isPointLight()\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, shadowMapWidth, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, shadowMapWidth, shadowMapHeight, false)\r\n : null;\r\n shadowMapParams.shadowMapFramebuffer = device.pool.createTemporalFramebuffer(false, colorAttachments, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n */\r\n shadowMapParams.shadowMapFramebuffer = ShadowMapper.fetchTemporalFramebuffer(\r\n true,\r\n this._light.lightType,\r\n numCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat!,\r\n depthFormat\r\n );\r\n shadowMapParams.impl = this._impl;\r\n this._impl!.updateResources(shadowMapParams);\r\n }\r\n /** @internal */\r\n protected createLightCameraPoint(lightCamera: Camera) {\r\n //lightCamera.reparent(this._light);\r\n lightCamera.parent = lightCamera.scene!.rootNode;\r\n lightCamera.position.setXYZ(0, 0, 0);\r\n lightCamera.rotation.identity();\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n lightCamera.setPerspective(\r\n Math.PI / 2,\r\n 1,\r\n this._config.nearClip!,\r\n Math.min(this._shadowDistance, (this._light as PointLight).positionAndRange.w)\r\n );\r\n lightCamera.position.set(this._light.positionAndRange.xyz());\r\n }\r\n /** @internal */\r\n protected createLightCameraSpot(lightCamera: Camera) {\r\n this._light.worldMatrix.decompose(null, lightCamera.rotation, lightCamera.position);\r\n lightCamera.parent = this._light.scene?.rootNode ?? null;\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n const spot = this._light as SpotLight;\r\n // The shadow frustum must match the lit cone. Physical mode defines it by the outer cone\r\n // half-angle; legacy stores the cosine of its own cutoff angle.\r\n const fov =\r\n spot.scene?.lightingMode === 'physical' ? 2 * spot.outerConeAngle : 2 * Math.acos(spot.cutoff);\r\n lightCamera.setPerspective(\r\n fov,\r\n 1,\r\n this._config.nearClip,\r\n Math.min(this._shadowDistance, spot.positionAndRange.w)\r\n );\r\n }\r\n /** @internal */\r\n protected createLightCameraRect(lightCamera: Camera) {\r\n const rect = this._light as RectLight;\r\n this._light.worldMatrix.decompose(null, lightCamera.rotation, lightCamera.position);\r\n lightCamera.parent = this._light.scene?.rootNode ?? null;\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n const halfW = rect.width * 0.5;\r\n const halfH = rect.height * 0.5;\r\n const far = Math.min(this._shadowDistance, rect.range);\r\n lightCamera.setOrtho(\r\n -halfW,\r\n halfW,\r\n -halfH,\r\n halfH,\r\n this._config.nearClip,\r\n Math.max(this._config.nearClip + 0.001, far)\r\n );\r\n }\r\n /** @internal */\r\n protected createLightCameraDirectional(\r\n sceneAABB: AABB,\r\n sceneCamera: Camera,\r\n lightCamera: Camera,\r\n cropMatrix?: Nullable<Matrix4x4>,\r\n border?: number\r\n ) {\r\n let frustum = sceneCamera.frustumViewSpace;\r\n if (this._shadowDistance < sceneCamera.getFarPlane()) {\r\n tmpMatrix.set(sceneCamera.getProjectionMatrix());\r\n tmpMatrix.setNearFar(tmpMatrix.getNearPlane(), this._shadowDistance);\r\n //tmpMatrix.multiplyRight(sceneCamera.viewMatrix);\r\n tmpFrustum.initWithMatrix(tmpMatrix);\r\n frustum = tmpFrustum;\r\n }\r\n const borderSize = Number.isFinite(border ?? 0) ? Math.max(0, border ?? 0) : 0;\r\n const clampedBorderSize = Math.min(borderSize, (this.shadowMapSize - 1) * 0.5);\r\n const paddingScale = this.shadowMapSize / (this.shadowMapSize - 2 * clampedBorderSize);\r\n //const frustum = sceneCamera.frustum;\r\n const frustumMin = ShadowMapper._frustumMin;\r\n const frustumMax = ShadowMapper._frustumMax;\r\n const frustumCenter = ShadowMapper._frustumCenter;\r\n const target = ShadowMapper._target;\r\n const up = ShadowMapper._up;\r\n // const frustum = new Frustum(sceneCamera.viewProjectionMatrix);\r\n frustumMin.setXYZ(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n frustumMax.setXYZ(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n frustum.corners.forEach((p) => {\r\n frustumMin.inplaceMin(p);\r\n frustumMax.inplaceMax(p);\r\n });\r\n let radius = Vector3.distance(frustumMin, frustumMax) * 0.5 * paddingScale;\r\n const center = sceneCamera.thisToWorld(\r\n Vector3.add(frustumMin, frustumMax, frustumCenter).scaleBy(0.5),\r\n frustumCenter\r\n );\r\n // Clamp to the scene bounds first, then apply the filter border.\r\n const sceneRadius = sceneAABB.diagonalLength * 0.5 * paddingScale;\r\n if (sceneRadius < radius) {\r\n radius = sceneRadius;\r\n Vector3.add(sceneAABB.minPoint, sceneAABB.maxPoint, center).scaleBy(0.5);\r\n }\r\n target.setXYZ(\r\n center.x + this._light.directionAndCutoff.x,\r\n center.y + this._light.directionAndCutoff.y,\r\n center.z + this._light.directionAndCutoff.z\r\n );\r\n up.setXYZ(0, 1, 0);\r\n lightCamera.lookAt(center, target, up);\r\n lightCamera.position.set(center);\r\n lightCamera.setOrtho(\r\n -radius,\r\n radius,\r\n -radius,\r\n radius,\r\n -radius,\r\n Math.max(Vector3.distance(center, sceneCamera.getWorldPosition()), sceneCamera.getFarPlane())\r\n );\r\n center.setXYZ(0, 0, 0);\r\n lightCamera.viewProjectionMatrix.transformPointP(center, center);\r\n if (cropMatrix) {\r\n const tx = center.x * this.shadowMapSize * 0.5;\r\n const ty = center.y * this.shadowMapSize * 0.5;\r\n const rx = Math.round(tx);\r\n const ry = Math.round(ty);\r\n center.setXYZ(((rx - tx) * 2) / this.shadowMapSize, ((ry - ty) * 2) / this.shadowMapSize, 0);\r\n cropMatrix.translation(center);\r\n }\r\n\r\n /*\r\n const minx = frustumMin.x;\r\n const maxx = frustumMax.x;\r\n const miny = frustumMin.y;\r\n const maxy = frustumMax.y;\r\n const minz = frustumMin.z;\r\n const maxz = frustumMax.z;\r\n const texelSizeW = (maxx - minx) / this.shadowMapSize;\r\n const texelSizeH = (maxy - miny) / this.shadowMapSize;\r\n const cx = Math.floor((minx + maxx) / 2 / texelSizeW) * texelSizeW;\r\n const cy = Math.floor((miny + maxy) / 2 / texelSizeH) * texelSizeH;\r\n const cz = (minz + maxz) / 2;\r\n const hx = Math.floor(((maxx - minx) * (expand + 0.5)) / texelSizeW) * texelSizeW;\r\n const hy = Math.floor(((maxy - miny) * (expand + 0.5)) / texelSizeH) * texelSizeH;\r\n lightCamera.position.setXYZ(cx, cy, cz);\r\n lightCamera.setOrtho(\r\n -hx,\r\n hx,\r\n -hy,\r\n hy,\r\n sceneMax.z - maxz,\r\n sceneMax.z - minz + 1\r\n );\r\n if (cropMatrix) {\r\n // compute crop matrix\r\n let clipMaxX = 0,\r\n clipMaxY = 0;\r\n let clipMinX = Number.MAX_VALUE,\r\n clipMinY = Number.MAX_VALUE;\r\n frustum.corners.forEach((p) => {\r\n const clipPos = lightCamera.viewProjectionMatrix.transformPoint(p);\r\n clipPos.x = Math.min(1, Math.max(-1, clipPos.x / clipPos.w));\r\n clipPos.y = Math.min(1, Math.max(-1, clipPos.y / clipPos.w));\r\n if (clipPos.x > clipMaxX) {\r\n clipMaxX = clipPos.x;\r\n }\r\n if (clipPos.x < clipMinX) {\r\n clipMinX = clipPos.x;\r\n }\r\n if (clipPos.y > clipMaxY) {\r\n clipMaxY = clipPos.y;\r\n }\r\n if (clipPos.y < clipMinY) {\r\n clipMinY = clipPos.y;\r\n }\r\n });\r\n const clipW = clipMaxX - clipMinX;\r\n const clipH = clipMaxY - clipMinY;\r\n clipMinX -= expand * clipW;\r\n clipMinY -= expand * clipH;\r\n clipMaxX += expand * clipW;\r\n clipMaxY += expand * clipH;\r\n const scaleX = 2 / (clipMaxX - clipMinX);\r\n const scaleY = 2 / (clipMaxY - clipMinY);\r\n const offsetX = -0.5 * (clipMaxX + clipMinX) * scaleX;\r\n const offsetY = -0.5 * (clipMaxY + clipMinY) * scaleY;\r\n cropMatrix.identity();\r\n cropMatrix.m00 = scaleX;\r\n cropMatrix.m11 = scaleY;\r\n cropMatrix.m03 = offsetX;\r\n cropMatrix.m13 = offsetY;\r\n }\r\n */\r\n }\r\n /** {@inheritDoc Disposable.onDispose} */\r\n protected onDispose(): void {\r\n this._shadowRegion.dispose();\r\n }\r\n /** @internal */\r\n private static fetchShadowMapParams() {\r\n if (this._shadowMapParams.length > 0) {\r\n const params = this._shadowMapParams.pop()!;\r\n // Pooled objects retain last frame's ordinal; clear it so it is only set\r\n // again by ShadowMaskRenderer for lights actually written to the mask.\r\n params.maskOrdinal = undefined;\r\n return params;\r\n } else {\r\n return {\r\n lightType: LIGHT_TYPE_NONE,\r\n depthClampEnabled: false,\r\n shaderHash: '',\r\n cameraParams: new Vector4(),\r\n cascadeDistances: new Vector4(),\r\n depthBiasScales: new Vector4(),\r\n depthBiasValues: [new Vector4(), new Vector4(), new Vector4(), new Vector4()],\r\n numShadowCascades: 1,\r\n shadowMatrices: new Float32Array(16 * 4),\r\n shadowMap: null,\r\n shadowMapSampler: null,\r\n shadowMapFramebuffer: null,\r\n impl: null,\r\n implData: null\r\n };\r\n }\r\n }\r\n /** @internal */\r\n private static fetchCameraForScene(scene: Scene) {\r\n const cameras = this._lightCameras.get(scene);\r\n if (!cameras || cameras.length === 0) {\r\n const camera = new Camera(scene);\r\n retainObject(camera);\r\n return camera;\r\n } else {\r\n const camera = cameras.pop()!;\r\n camera.parent = scene.rootNode;\r\n camera.position.setXYZ(0, 0, 0);\r\n camera.rotation.identity();\r\n camera.scale.setXYZ(1, 1, 1);\r\n camera.clipMask = 0;\r\n return camera;\r\n }\r\n }\r\n /** @internal */\r\n private static releaseCamera(camera: Camera) {\r\n let cameras = this._lightCameras.get(camera.scene!);\r\n if (!cameras) {\r\n cameras = [];\r\n this._lightCameras.set(camera.scene!, cameras);\r\n }\r\n camera.remove();\r\n cameras.push(camera);\r\n }\r\n /** @internal */\r\n calcSplitDistances(nearPlane: number, farPlane: number, numCascades: number) {\r\n const result: number[] = [0, 0, 0, 0, 0];\r\n for (let i = 0; i <= numCascades; ++i) {\r\n const fIDM = i / numCascades;\r\n const fLog = nearPlane * Math.pow(farPlane / nearPlane, fIDM);\r\n const fUniform = nearPlane + (farPlane - nearPlane) * fIDM;\r\n result[i] = fLog * this._config.splitLambda + fUniform * (1 - this._config.splitLambda);\r\n }\r\n return result;\r\n }\r\n /** @internal */\r\n protected calcDepthBiasParams(\r\n camera: Camera,\r\n shadowMapSize: number,\r\n depthBias: number,\r\n normalBias: number,\r\n depthScale: number,\r\n result: Vector4\r\n ) {\r\n const sizeNear = Math.min(\r\n camera.getProjectionMatrix().getNearPlaneWidth(),\r\n camera.getProjectionMatrix().getNearPlaneHeight()\r\n );\r\n const sizeFar = Math.min(\r\n camera.getProjectionMatrix().getFarPlaneWidth(),\r\n camera.getProjectionMatrix().getFarPlaneHeight()\r\n );\r\n // World-space size of one shadow map texel at the near plane. Both bias\r\n // terms are expressed in multiples of it, so a tighter cascade automatically\r\n // gets a proportionally smaller offset.\r\n const texelWorldSize = sizeNear / shadowMapSize;\r\n result.setXYZW(\r\n depthBias * texelWorldSize * 2,\r\n // Normal offset distance in world units. Unlike a depth bias this moves\r\n // the receiver sideways out of the texel that produces grazing-angle\r\n // acne, which no amount of depth bias can fix (the required depth offset\r\n // diverges as NdotL approaches zero).\r\n normalBias * texelWorldSize,\r\n depthScale,\r\n sizeFar / sizeNear\r\n );\r\n }\r\n /** @internal */\r\n protected postRenderShadowMap(shadowMapParams: ShadowMapParams) {\r\n this._impl!.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n render(ctx: DrawContext, renderPass: ShadowMapPass) {\r\n if (!ctx.shadowMapInfo) {\r\n ctx.shadowMapInfo = new Map();\r\n }\r\n const shadowMapParams = ShadowMapper.fetchShadowMapParams();\r\n shadowMapParams.impl = this._impl;\r\n shadowMapParams.lightType = this.light.lightType;\r\n shadowMapParams.numShadowCascades =\r\n shadowMapParams.lightType === LIGHT_TYPE_DIRECTIONAL && this._impl!.supportsCascades()\r\n ? (this._config.numCascades ?? 1)\r\n : 1;\r\n ctx.shadowMapInfo.set(this.light, shadowMapParams);\r\n const scene = ctx.scene;\r\n const camera = ctx.camera;\r\n renderPass.light = this._light;\r\n this.updateResources(shadowMapParams);\r\n shadowMapParams.shaderHash = this.getShaderHash(shadowMapParams);\r\n const device = getDevice();\r\n const fb = shadowMapParams.shadowMapFramebuffer!;\r\n shadowMapParams.depthClampEnabled = false;\r\n renderPass.clearColor = this._impl!.getShadowMapClearColor(shadowMapParams);\r\n const depthScale = this._impl!.getDepthScale();\r\n const geometryPassCount = Math.max(1, this._impl!.getGeometryPassCount(shadowMapParams) >> 0);\r\n // Repeats the caster draw for implementations that need more than one look at\r\n // the geometry (deep opacity maps). Single-pass implementations - every one\r\n // but DOM - take the `pass === 0` path once and behave exactly as before.\r\n const renderGeometry = (renderCamera: Camera, cullCamera?: Camera) => {\r\n if (geometryPassCount === 1) {\r\n renderPass.render(ctx, renderCamera, cullCamera);\r\n return;\r\n }\r\n // Culling depends only on the camera, so the extra passes reuse the first\r\n // pass's queue rather than walking the scene graph again per pass.\r\n const renderQueue = renderPass.cullScene(ctx, cullCamera ?? renderCamera);\r\n try {\r\n for (let pass = 0; pass < geometryPassCount; pass++) {\r\n this._impl!.beginGeometryPass(shadowMapParams, pass);\r\n // The emitted caster shader differs between passes, and the shadow pass\r\n // keys its programs on this hash, so it has to be refreshed per pass\r\n // rather than computed once up front.\r\n shadowMapParams.shaderHash = this.getShaderHash(shadowMapParams);\r\n renderPass.clearColor = this._impl!.getShadowMapClearColor(shadowMapParams);\r\n renderPass.render(ctx, renderCamera, cullCamera, renderQueue);\r\n }\r\n } finally {\r\n renderQueue.dispose();\r\n }\r\n };\r\n const directionalShadowRegion = this._shadowRegion.region;\r\n const shadowRegion =\r\n this._light.isDirectionLight() && directionalShadowRegion?.isValid()\r\n ? directionalShadowRegion\r\n : scene.boundingBox;\r\n if (this._light.isPointLight()) {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n this.createLightCameraPoint(shadowMapRenderCamera);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewMatrix));\r\n for (const face of [CubeFace.PX, CubeFace.NX, CubeFace.PY, CubeFace.NY, CubeFace.PZ, CubeFace.NZ]) {\r\n shadowMapRenderCamera.lookAtCubeFace(face);\r\n fb.setColorAttachmentCubeFace(0, face);\r\n fb.setDepthAttachmentCubeFace(face);\r\n renderGeometry(shadowMapRenderCamera);\r\n }\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.identity());\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n } else {\r\n // Reads the resolved count, not the configured one: an implementation that\r\n // cannot store cascades has already collapsed it to a single split, and the\r\n // cascade path would index array layers its shadow map does not have.\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n if (numCascades > 1) {\r\n const distances = this.calcSplitDistances(\r\n camera.getNearPlane(),\r\n Math.min(this._shadowDistance, camera.getFarPlane()),\r\n numCascades\r\n );\r\n const cascadeCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapCullCamera = ShadowMapper.fetchCameraForScene(scene);\r\n shadowMapCullCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n cascadeCamera.parent = camera;\r\n shadowMapParams.depthClampEnabled = getDevice().getDeviceCaps().shaderCaps.supportFragmentDepth;\r\n for (let split = 0; split < numCascades; split++) {\r\n cascadeCamera.setPerspective(\r\n camera.getFOV(),\r\n camera.getAspect(),\r\n distances[split],\r\n distances[split + 1]\r\n );\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n const border = shadowMapParams.impl!.getShadowMapBorder(shadowMapParams); //20 / this._config.shadowMapSize;\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n cascadeCamera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n border\r\n );\r\n this.createLightCameraDirectional(shadowRegion, cascadeCamera, shadowMapCullCamera, null, border);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[split]\r\n );\r\n shadowMapParams.depthBiasScales[split] =\r\n shadowMapParams.depthBiasValues[0].x !== 0\r\n ? shadowMapParams.depthBiasValues[split].x / shadowMapParams.depthBiasValues[0].x\r\n : 1;\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n let scissor: Nullable<number[]> = null;\r\n if (\r\n fb.getColorAttachments()[0]?.isTexture2DArray() ||\r\n fb.getDepthAttachment()?.isTexture2DArray()\r\n ) {\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n fb.setColorAttachmentLayer(0, split);\r\n fb.setDepthAttachmentLayer(split);\r\n } else {\r\n const numRows = numCascades > 2 ? 2 : 1;\r\n const numCols = numCascades > 1 ? 2 : 1;\r\n const adjMatrix = new Matrix4x4();\r\n const col = split % 2;\r\n const row = split >> 1;\r\n adjMatrix.setRowXYZW(0, 1.5 - 0.5 * numCols, 0, 0, 0);\r\n adjMatrix.setRowXYZW(1, 0, 1.5 - 0.5 * numRows, 0, 0);\r\n adjMatrix.setRowXYZW(2, 0, 0, 1, 0);\r\n adjMatrix.setRowXYZW(3, col - 0.5 * numCols + 0.5, row - 0.5 * numRows + 0.5, 0, 1);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(\r\n adjMatrix,\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n )\r\n );\r\n if (device.type === 'webgpu') {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n (numRows - 1 - row) * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n } else {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n row * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n }\r\n }\r\n device.setFramebuffer(fb);\r\n device.setScissor(scissor);\r\n renderGeometry(shadowMapRenderCamera, shadowMapCullCamera);\r\n shadowMapParams.shadowMatrices.set(\r\n Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix),\r\n split * 16\r\n );\r\n shadowMapParams.cascadeDistances[split] = distances[split + 1];\r\n }\r\n ShadowMapper.releaseCamera(cascadeCamera);\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n ShadowMapper.releaseCamera(shadowMapCullCamera);\r\n } else {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene)!;\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n snapMatrix.identity();\r\n shadowMapRenderCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n if (this._light.isDirectionLight()) {\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n camera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n shadowMapParams.impl!.getShadowMapBorder(shadowMapParams)\r\n );\r\n } else if (this._light.isRectLight()) {\r\n this.createLightCameraRect(shadowMapRenderCamera);\r\n } else {\r\n this.createLightCameraSpot(shadowMapRenderCamera);\r\n }\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n renderGeometry(shadowMapRenderCamera);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix));\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n }\r\n }\r\n this.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n private applyMode(mode: ShadowMode) {\r\n if (\r\n mode !== 'hard' &&\r\n mode !== 'vsm' &&\r\n mode !== 'esm' &&\r\n mode !== 'pcf' &&\r\n mode !== 'pcf-pd' &&\r\n mode !== 'pcf-opt' &&\r\n mode !== 'pcss' &&\r\n mode !== 'dom'\r\n ) {\r\n console.error(`ShadowMapper.setShadowMode() failed: invalid mode: ${mode}`);\r\n return;\r\n }\r\n if (mode === 'dom' && getDevice().type !== 'webgpu') {\r\n // The strand geometry this mode exists to shadow is WebGPU only, so the\r\n // WebGL paths were never built. Falling back keeps a scene authored with it\r\n // renderable rather than failing to produce a shadow map at all.\r\n console.warn(`ShadowMapper.setShadowMode(): 'dom' requires WebGPU, falling back to 'pcf'`);\r\n this.applyMode('pcf');\r\n return;\r\n }\r\n this._impl = null;\r\n if (mode === 'hard') {\r\n this._impl = new SSM();\r\n } else if (mode === 'vsm') {\r\n this._impl = new VSM(this._vsmBlurKernelSize, this._vsmBlurRadius, this._vsmDarkness);\r\n } else if (mode === 'esm') {\r\n this._impl = new ESM(this._esmBlurKernelSize, this._esmBlurRadius, this._esmDepthScale);\r\n const esm = this._impl as ESM;\r\n esm.blur = this._esmBlur;\r\n esm.logSpace = this._esmLogSpace;\r\n } else if (mode === 'pcf' || mode === 'pcf-opt' || mode === 'pcf-pd') {\r\n this._impl = new PCFOPT(this._pcfKernelSize);\r\n } else if (mode === 'dom') {\r\n this._impl = new DOM(this._domLayerDistance, this._domDensity, this._domFilterSize);\r\n } else if (mode === 'pcss') {\r\n this._impl = new PCSS(\r\n this._pcssLightRadius,\r\n this._pcssBlockerSampleCount,\r\n this._pcssFilterSampleCount,\r\n this._pcssMaxFilterRadius,\r\n this._pcssTemporalJitter\r\n );\r\n }\r\n }\r\n /** @internal */\r\n private asVSM() {\r\n return this._impl?.getType() === 'vsm' ? (this._impl as VSM) : null;\r\n }\r\n /** @internal */\r\n private asDOM() {\r\n return this._impl?.getType() === 'dom' ? (this._impl as DOM) : null;\r\n }\r\n /** @internal */\r\n private asESM() {\r\n return this._impl?.getType() === 'esm' ? (this._impl as ESM) : null;\r\n }\r\n /** @internal */\r\n private asPCFPD() {\r\n return this._impl?.getType() === 'pcf-pd' ? (this._impl as PCFPD) : null;\r\n }\r\n /** @internal */\r\n private asPCFOPT() {\r\n return this._impl?.getType() === 'pcf-opt' ? (this._impl as PCFOPT) : null;\r\n }\r\n /** @internal */\r\n private asPCSS() {\r\n return this._impl?.getType() === 'pcss' ? (this._impl as PCSS) : null;\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","tmpFrustum","Frustum","identity","ShadowMapper","Disposable","_snapMatrix","_target","Vector3","_up","_frustumMin","_frustumMax","_frustumCenter","_lightCameras","WeakMap","_shadowMapParams","light","_light","_config","shadowMapSize","numCascades","splitLambda","depthBias","normalBias","nearClip","_resourceDirty","_shadowMode","_shadowDistance","_impl","_pdSampleCount","_pdSampleRadius","_pcfKernelSize","_pcssLightRadius","_pcssBlockerSampleCount","_pcssFilterSampleCount","_pcssMaxFilterRadius","_pcssTemporalJitter","_domLayerDistance","_domDensity","_domFilterSize","_vsmBlurKernelSize","_vsmBlurRadius","_vsmDarkness","_esmBlur","_esmLogSpace","_esmBlurKernelSize","_esmBlurRadius","_esmDepthScale","_shadowStrength","_shadowRegion","ShadowRegion","applyMode","num","Number","isInteger","console","error","shadowRegion","updateDirectionalShadowRegion","force","isDirectionLight","scene","clear","rootNode","iterate","child","isMesh","isClipmapTerrain","castShadow","addDynamicCaster","computeDirectionalShadowRegion","aabb","AABB","beginExtend","bbox","getWorldBoundingVolume","toAABB","extend","minPoint","maxPoint","isValid","shadowDistance","val","Math","max","numShadowCascades","shadowStrength","min","mode","applyQualityPreset","preset","pcfKernelSize","getShaderHash","shadowMapParams","impl","name","lightType","shadowMap","target","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","pdSampleCount","pcfpd","asPCFPD","tapCount","pdSampleRadius","setDepthScale","pcfopt","asPCFOPT","kernelSize","pcssLightRadius","pcss","asPCSS","lightRadius","domLayerDistance","dom","asDOM","layerDistance","domDensity","density","domFilterSize","filterSize","pcssBlockerSampleCount","blockerSampleCount","pcssFilterSampleCount","filterSampleCount","pcssMaxFilterRadius","maxFilterRadius","pcssTemporalJitter","temporalJitter","vsmBlurKernelSize","vsm","asVSM","vsmBlurRadius","blurSize","vsmDarkness","esmBlur","esm","asESM","blur","esmLogSpace","logSpace","esmBlurKernelSize","esmBlurRadius","esmDepthScale","computeShadow","scope","shadowVertex","NdotL","computeShadowCSM","split","releaseTemporalResources","ctx","shadowMapInfo","k","keys","get","LIGHT_TYPE_NONE","depthClampEnabled","shaderHash","shadowMapFramebuffer","shadowMapSampler","implData","push","isTextureInvalid","texture","width","height","depth","createTexture","device","options","mipmapping","createTexture2D","createCubeTexture","createTexture2DArray","Error","fetchTemporalFramebuffer","autoRelease","colorFormat","depthFormat","useTextureArray","type","colorAttachments","pool","fetchTemporalTexture2DArray","LIGHT_TYPE_POINT","fetchTemporalTextureCube","fetchTemporalTexture2D","depthAttachment","fb","createTemporalFramebuffer","releaseTexture","updateResources","getShadowMapColorFormat","getShadowMapDepthFormat","shadowMapWidth","shadowMapHeight","createLightCameraPoint","lightCamera","parent","position","setXYZ","rotation","scale","setPerspective","PI","positionAndRange","w","set","xyz","createLightCameraSpot","worldMatrix","decompose","spot","fov","lightingMode","outerConeAngle","acos","cutoff","createLightCameraRect","rect","halfW","halfH","far","range","setOrtho","createLightCameraDirectional","sceneAABB","sceneCamera","cropMatrix","border","frustum","frustumViewSpace","getFarPlane","getProjectionMatrix","setNearFar","getNearPlane","initWithMatrix","borderSize","isFinite","clampedBorderSize","paddingScale","frustumMin","frustumMax","frustumCenter","up","MAX_VALUE","corners","forEach","p","inplaceMin","inplaceMax","radius","distance","center","thisToWorld","add","scaleBy","sceneRadius","diagonalLength","x","directionAndCutoff","y","z","lookAt","getWorldPosition","viewProjectionMatrix","transformPointP","tx","ty","rx","round","ry","translation","dispose","fetchShadowMapParams","length","params","pop","maskOrdinal","undefined","cameraParams","Vector4","cascadeDistances","depthBiasScales","depthBiasValues","shadowMatrices","Float32Array","fetchCameraForScene","cameras","camera","Camera","retainObject","clipMask","releaseCamera","remove","calcSplitDistances","nearPlane","farPlane","result","i","fIDM","fLog","pow","fUniform","calcDepthBiasParams","depthScale","sizeNear","getNearPlaneWidth","getNearPlaneHeight","sizeFar","getFarPlaneWidth","getFarPlaneHeight","texelWorldSize","setXYZW","postRenderShadowMap","render","renderPass","Map","LIGHT_TYPE_DIRECTIONAL","supportsCascades","clearColor","getShadowMapClearColor","getDepthScale","geometryPassCount","getGeometryPassCount","renderGeometry","renderCamera","cullCamera","renderQueue","cullScene","pass","beginGeometryPass","directionalShadowRegion","region","boundingBox","isPointLight","shadowMapRenderCamera","setFramebuffer","transpose","viewMatrix","face","CubeFace","PX","NX","PY","NY","PZ","NZ","lookAtCubeFace","setColorAttachmentCubeFace","setDepthAttachmentCubeFace","distances","cascadeCamera","shadowMapCullCamera","ClipLeft","ClipRight","ClipBottom","ClipTop","shaderCaps","supportFragmentDepth","getFOV","getAspect","snapMatrix","getShadowMapBorder","scissor","getColorAttachments","isTexture2DArray","getDepthAttachment","setProjectionMatrix","multiply","setColorAttachmentLayer","setDepthAttachmentLayer","numRows","numCols","adjMatrix","col","row","setRowXYZW","setScissor","isRectLight","warn","SSM","VSM","ESM","PCFOPT","DOM","PCSS","getType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shadowmapper.js","sources":["../../src/shadow/shadowmapper.ts"],"sourcesContent":["import type { RequireOptionals, Nullable } from '@zephyr3d/base';\r\nimport {\r\n retainObject,\r\n Matrix4x4,\r\n Vector3,\r\n Vector4,\r\n AABB,\r\n CubeFace,\r\n Frustum,\r\n Disposable\r\n} from '@zephyr3d/base';\r\nimport type {\r\n PBShaderExp,\r\n FrameBuffer,\r\n Texture2D,\r\n Texture2DArray,\r\n TextureCube,\r\n TextureFormat,\r\n PBInsideFunctionScope,\r\n TextureSampler,\r\n TextureCreationOptions,\r\n TextureType,\r\n BaseTexture\r\n} from '@zephyr3d/device';\r\nimport { Camera } from '../camera/camera';\r\nimport { SSM } from './ssm';\r\nimport { ESM } from './esm';\r\nimport { VSM } from './vsm';\r\nimport type { PCFPD } from './pcf_pd';\r\nimport { PCFOPT } from './pcf_opt';\r\nimport { PCSS } from './pcss';\r\nimport { DOM } from './dom';\r\nimport type { PunctualLight, SpotLight } from '../scene/light';\r\nimport type { ShadowMapPass } from '../render/shadowmap_pass';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { ShadowImpl } from './shadow_impl';\r\nimport type { DrawContext } from '../render';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT } from '../values';\r\nimport { getDevice } from '../app/api';\r\nimport { ShadowRegion } from './shadow_region';\r\nimport { warnUnsupported } from '../utility/unsupported';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\nconst tmpFrustum = new Frustum(Matrix4x4.identity());\r\n\r\n/**\r\n * Shadow mapping mode\r\n * @public\r\n */\r\nexport type ShadowMode =\r\n | 'hard'\r\n | 'vsm'\r\n | 'esm'\r\n | 'pcf'\r\n | 'pcss'\r\n /**\r\n * Deep opacity map. Fractional occlusion through hair rather than a binary\r\n * blocked/unblocked test. WebGPU only.\r\n */\r\n | 'dom'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-pd'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-opt';\r\n/**\r\n * Preset shadow quality profiles.\r\n *\r\n * @public\r\n */\r\nexport type ShadowQualityPreset = 'character-small' | 'outdoor-large';\r\n\r\n/** @internal */\r\nexport type ShadowMapParams = {\r\n lightType: number;\r\n shaderHash: string;\r\n numShadowCascades: number;\r\n depthClampEnabled: boolean;\r\n cascadeDistances: Vector4;\r\n depthBiasValues: Vector4[];\r\n depthBiasScales: Vector4;\r\n cameraParams: Vector4;\r\n shadowMatrices: Float32Array;\r\n shadowMapFramebuffer: Nullable<FrameBuffer>;\r\n shadowMap: Nullable<BaseTexture>;\r\n shadowMapSampler: Nullable<TextureSampler>;\r\n impl: Nullable<ShadowImpl>;\r\n implData: unknown;\r\n /**\r\n * Zero-based ordinal of this light within the screen-space shadow mask\r\n * (`layer = ordinal >> 2`, `channel = ordinal & 3`). Set by\r\n * {@link ShadowMaskRenderer.render} each frame the mask is built; undefined\r\n * when the mask is not in use. Consumed by effects that sample the mask\r\n * instead of recomputing shadows (e.g. the SSS combine pass).\r\n */\r\n maskOrdinal?: number;\r\n /**\r\n * The cube face being rendered, while a point-projection shadow map draws its\r\n * casters. Lets an implementation that binds framebuffers of its own target\r\n * the same face the shared one is on.\r\n */\r\n cubeFace?: CubeFace;\r\n /**\r\n * The cascade being rendered while a directional shadow map draws its casters, 0 for a shadow\r\n * map without cascades. Lets a caster draw into some cascades only.\r\n */\r\n cascadeIndex?: number;\r\n /**\r\n * World distance that a normalized depth of 1 stands for in a point-projection\r\n * shadow map, whose casters store radial distance over the light's range.\r\n */\r\n depthRange?: number;\r\n};\r\n\r\n/** @internal */\r\nexport type ShadowMapType = Texture2D | TextureCube | Texture2DArray;\r\n\r\n/** @internal */\r\nexport interface ShadowConfig {\r\n shadowMapSize: number;\r\n numCascades?: number;\r\n splitLambda?: number;\r\n depthBias?: number;\r\n normalBias?: number;\r\n nearClip?: number;\r\n}\r\n\r\n/**\r\n * The shadow map generator\r\n * @public\r\n */\r\nexport class ShadowMapper extends Disposable {\r\n /** @internal */\r\n private static readonly _snapMatrix = new Matrix4x4();\r\n /** @internal */\r\n private static readonly _target = new Vector3();\r\n /** @internal */\r\n private static readonly _up = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMin = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMax = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumCenter = new Vector3();\r\n /** @internal */\r\n private static readonly _clipMin = new Vector3();\r\n /** @internal */\r\n private static readonly _clipMax = new Vector3();\r\n /** @internal */\r\n private static readonly _cameraPos = new Vector3();\r\n /** @internal */\r\n private static readonly _lightCameras: WeakMap<Scene, Camera[]> = new WeakMap();\r\n /** @internal */\r\n private static readonly _shadowMapParams: ShadowMapParams[] = [];\r\n /** @internal */\r\n protected _light: PunctualLight;\r\n /** @internal */\r\n protected _config: RequireOptionals<ShadowConfig>;\r\n /** @internal */\r\n protected _resourceDirty: boolean;\r\n /** @internal */\r\n protected _shadowMode: ShadowMode;\r\n /** @internal */\r\n protected _shadowDistance: number;\r\n /** @internal */\r\n protected _impl: Nullable<ShadowImpl>;\r\n /** @internal */\r\n protected _pdSampleCount: number;\r\n /** @internal */\r\n protected _pdSampleRadius: number;\r\n /** @internal */\r\n protected _pcfKernelSize: number;\r\n /** @internal */\r\n protected _pcssLightRadius: number;\r\n /** @internal */\r\n protected _pcssBlockerSampleCount: number;\r\n /** @internal */\r\n protected _pcssFilterSampleCount: number;\r\n /** @internal */\r\n protected _pcssMaxFilterRadius: number;\r\n /** @internal */\r\n protected _pcssTemporalJitter: boolean;\r\n /** @internal */\r\n protected _domLayerDistance: number;\r\n /** @internal */\r\n protected _domDensity: number;\r\n /** @internal */\r\n protected _domFilterSize: number;\r\n /** @internal */\r\n protected _vsmBlurKernelSize: number;\r\n /** @internal */\r\n protected _vsmBlurRadius: number;\r\n /** @internal */\r\n protected _vsmDarkness: number;\r\n /** @internal */\r\n protected _esmBlur: boolean;\r\n /** @internal */\r\n protected _esmLogSpace: boolean;\r\n /** @internal */\r\n protected _esmBlurKernelSize: number;\r\n /** @internal */\r\n protected _esmBlurRadius: number;\r\n /** @internal */\r\n protected _esmDepthScale: number;\r\n /** @internal */\r\n protected _shadowStrength: number;\r\n /** @internal */\r\n protected _shadowRegion: ShadowRegion;\r\n /**\r\n * Creates an instance of ShadowMapper\r\n * @param light - The light that is used to generate shadow map\r\n */\r\n constructor(light: PunctualLight) {\r\n super();\r\n this._light = light;\r\n this._config = {\r\n shadowMapSize: 1024,\r\n numCascades: 1,\r\n splitLambda: 0.5,\r\n depthBias: 0.003,\r\n normalBias: 1.5,\r\n nearClip: ShadowMapper.getDefaultNearClip(light)\r\n };\r\n this._resourceDirty = true;\r\n this._shadowMode = 'pcf';\r\n this._shadowDistance = 2000;\r\n this._impl = null;\r\n this._pdSampleCount = 24;\r\n this._pdSampleRadius = 3;\r\n this._pcfKernelSize = 7;\r\n this._pcssLightRadius = 8;\r\n this._pcssBlockerSampleCount = 24;\r\n this._pcssFilterSampleCount = 32;\r\n this._pcssMaxFilterRadius = 32;\r\n this._pcssTemporalJitter = true;\r\n this._domLayerDistance = 0.25;\r\n this._domDensity = 1;\r\n this._domFilterSize = 5;\r\n this._vsmBlurKernelSize = 5;\r\n this._vsmBlurRadius = 4;\r\n this._vsmDarkness = 0.3;\r\n this._esmBlur = true;\r\n this._esmLogSpace = true;\r\n this._esmBlurKernelSize = 5;\r\n this._esmBlurRadius = 4;\r\n this._esmDepthScale = 200;\r\n this._shadowStrength = 1;\r\n this._shadowRegion = new ShadowRegion();\r\n this.applyMode(this._shadowMode);\r\n }\r\n /** The light that is used to generate shadow map */\r\n get light() {\r\n return this._light;\r\n }\r\n /** Size of the shadow map */\r\n get shadowMapSize() {\r\n return this._config.shadowMapSize;\r\n }\r\n set shadowMapSize(num) {\r\n if (!Number.isInteger(num) || num < 1) {\r\n console.error(`invalid shadow map size: ${num}`);\r\n return;\r\n }\r\n if (this._config.shadowMapSize !== num) {\r\n this._config.shadowMapSize = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** Shadow region for directional light */\r\n get shadowRegion() {\r\n return this._shadowRegion;\r\n }\r\n /** @internal */\r\n updateDirectionalShadowRegion(force = false) {\r\n if (!this._light.isDirectionLight()) {\r\n return;\r\n }\r\n if (!force) {\r\n return;\r\n }\r\n const scene = this._light.scene;\r\n if (!scene) {\r\n return;\r\n }\r\n this._shadowRegion.clear();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n this._shadowRegion.addDynamicCaster(child);\r\n }\r\n });\r\n }\r\n /** @internal */\r\n computeDirectionalShadowRegion(scene: Scene) {\r\n const aabb = new AABB();\r\n aabb.beginExtend();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n const bbox = child.getWorldBoundingVolume()?.toAABB();\r\n if (bbox) {\r\n aabb.extend(bbox.minPoint);\r\n aabb.extend(bbox.maxPoint);\r\n }\r\n }\r\n });\r\n return aabb.isValid() ? aabb : null;\r\n }\r\n /** Maximum distance from the camera, shadow will not be rendered beyond this range */\r\n get shadowDistance() {\r\n return this._shadowDistance;\r\n }\r\n set shadowDistance(val) {\r\n this._shadowDistance = Math.max(0, val);\r\n }\r\n /** Count of the cascades, The maximum value is 4 */\r\n get numShadowCascades() {\r\n return this._config.numCascades;\r\n }\r\n set numShadowCascades(num) {\r\n if (num !== 1 && num !== 2 && num !== 3 && num !== 4) {\r\n console.error(`invalid shadow cascade number: ${num}`);\r\n return;\r\n }\r\n if (!this._light.isDirectionLight() && num > 1) {\r\n console.error(`only directional light can have more than one shadow cascades`);\r\n return;\r\n }\r\n if (num !== this._config.numCascades) {\r\n this._config.numCascades = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** The split lambda for cascaded shadow mapping */\r\n get splitLambda() {\r\n return this._config.splitLambda;\r\n }\r\n set splitLambda(val) {\r\n if (this._config.splitLambda !== val) {\r\n this._config.splitLambda = val;\r\n }\r\n }\r\n /** Depth bias for the shadow map */\r\n get depthBias() {\r\n return this._config.depthBias;\r\n }\r\n set depthBias(val) {\r\n this._config.depthBias = val;\r\n }\r\n /**\r\n * Normal offset bias, in shadow map texels.\r\n *\r\n * @remarks\r\n * Before sampling, the receiver is moved along its normal by this many texel\r\n * widths, scaled by `sin(theta)` between the normal and the light so the\r\n * offset is zero facing the light and largest at grazing incidence. This is\r\n * what removes grazing-angle self-shadowing acne; {@link depthBias} alone\r\n * cannot, because the depth error over one texel grows without bound as the\r\n * surface turns away from the light.\r\n *\r\n * Useful values are roughly 1 to 4. Too little leaves acne on curved surfaces\r\n * near the terminator; too much detaches contact shadows from thin geometry.\r\n */\r\n get normalBias() {\r\n return this._config.normalBias;\r\n }\r\n set normalBias(val) {\r\n this._config.normalBias = val;\r\n }\r\n /** Near clip plane */\r\n get nearClip() {\r\n return this._config.nearClip;\r\n }\r\n set nearClip(val) {\r\n if (this._config.nearClip !== val) {\r\n this._config.nearClip = val;\r\n }\r\n }\r\n /** Shadow strength, 0 means no shadowing and 1 means full shadowing */\r\n get shadowStrength() {\r\n return this._shadowStrength;\r\n }\r\n set shadowStrength(val) {\r\n this._shadowStrength = Math.min(1, Math.max(0, Number(val) || 0));\r\n }\r\n /** Shadow map mode */\r\n get mode() {\r\n return this._shadowMode;\r\n }\r\n set mode(mode) {\r\n if (mode !== this._shadowMode) {\r\n this._shadowMode = mode;\r\n this.applyMode(this._shadowMode);\r\n }\r\n }\r\n /**\r\n * Applies a practical shadow preset for common scenarios.\r\n *\r\n * `character-small`: higher contact quality and tighter distance for character-centric scenes.\r\n * `outdoor-large`: longer distance coverage for open scenes.\r\n */\r\n applyQualityPreset(preset: ShadowQualityPreset) {\r\n if (preset === 'character-small') {\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 120;\r\n this.splitLambda = 0.75;\r\n this.depthBias = 0.005;\r\n this.normalBias = 2;\r\n // Tighter than the default for spot lights; point and rect lights are\r\n // already at their close-range default.\r\n this.nearClip = Math.min(0.2, ShadowMapper.getDefaultNearClip(this._light));\r\n this.pcfKernelSize = 5;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 3 : 1;\r\n return;\r\n }\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 800;\r\n this.splitLambda = 0.6;\r\n this.depthBias = 0.0035;\r\n this.normalBias = 1.5;\r\n this.nearClip = ShadowMapper.getDefaultNearClip(this._light);\r\n this.pcfKernelSize = 3;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 4 : 1;\r\n }\r\n /** @internal */\r\n getShaderHash(shadowMapParams: ShadowMapParams) {\r\n return `${shadowMapParams.impl!.constructor.name}_${shadowMapParams.impl!.getShaderHash()}_${\r\n shadowMapParams.lightType\r\n }_${shadowMapParams.shadowMap!.target}_${Number(shadowMapParams.numShadowCascades > 1)}_${Number(\r\n getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMapParams.shadowMap!.format)\r\n .filterable\r\n )}`;\r\n }\r\n /** Sample count for poisson disc PCF */\r\n get pdSampleCount() {\r\n return this._pdSampleCount;\r\n }\r\n set pdSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pdSampleCount) {\r\n this._pdSampleCount = val;\r\n const pcfpd = this.asPCFPD();\r\n if (pcfpd) {\r\n pcfpd.tapCount = this._pdSampleCount;\r\n }\r\n }\r\n }\r\n /** Radius for poisson disc PCF */\r\n get pdSampleRadius() {\r\n return this._pdSampleRadius;\r\n }\r\n set pdSampleRadius(val) {\r\n val = Math.max(0, Number(val) >> 0);\r\n if (val !== this._pdSampleRadius) {\r\n this._pdSampleRadius = val;\r\n this.asPCFPD()?.setDepthScale(this._pdSampleRadius);\r\n }\r\n }\r\n /** Kernel size for optimized PCF */\r\n get pcfKernelSize() {\r\n return this._pcfKernelSize;\r\n }\r\n set pcfKernelSize(val) {\r\n val = val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n if (val !== this._pcfKernelSize) {\r\n this._pcfKernelSize = val;\r\n const pcfopt = this.asPCFOPT();\r\n if (pcfopt) {\r\n pcfopt.kernelSize = this._pcfKernelSize;\r\n }\r\n }\r\n }\r\n /**\r\n * Light radius for PCSS shadow, measured in shadow-map texels.\r\n *\r\n * @remarks\r\n * Ignored for rect lights, whose penumbra is derived from their actual size\r\n * and the receiver's distance instead.\r\n */\r\n get pcssLightRadius() {\r\n return this._pcssLightRadius;\r\n }\r\n set pcssLightRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._pcssLightRadius) {\r\n this._pcssLightRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.lightRadius = this._pcssLightRadius;\r\n }\r\n }\r\n }\r\n /**\r\n * Depth spanned by the deep opacity map's layers, in world units along the\r\n * light direction. Only meaningful when the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * Set it to roughly the thickness of the hair. Too small and everything past\r\n * the outer strands saturates the last layer, which is a hard shadow again;\r\n * too large and all three layers fall inside the first strand, leaving the\r\n * interior unshadowed.\r\n */\r\n get domLayerDistance() {\r\n return this._domLayerDistance;\r\n }\r\n set domLayerDistance(val) {\r\n val = Math.max(0.0001, Number(val) || 0);\r\n if (val !== this._domLayerDistance) {\r\n this._domLayerDistance = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.layerDistance = this._domLayerDistance;\r\n }\r\n }\r\n }\r\n /**\r\n * How strongly accumulated hair coverage attenuates light. Only meaningful when\r\n * the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * Raise it to darken the interior of a groom without moving the layers.\r\n */\r\n get domDensity() {\r\n return this._domDensity;\r\n }\r\n set domDensity(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._domDensity) {\r\n this._domDensity = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.density = this._domDensity;\r\n }\r\n }\r\n }\r\n /**\r\n * Width of the deep opacity map's sampling kernel in texels: 1, 3, 5 or 7. Only\r\n * meaningful when the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * The technique's own gradation runs along the light rather than across the\r\n * map, so without a kernel the silhouette of a groom is as hard an edge as an\r\n * unfiltered shadow map gives. This is what softens it, at one layer lookup per\r\n * tap. Defaults to 5.\r\n */\r\n get domFilterSize() {\r\n return this._domFilterSize;\r\n }\r\n set domFilterSize(val) {\r\n val = val !== 1 && val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n if (val !== this._domFilterSize) {\r\n this._domFilterSize = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.filterSize = this._domFilterSize;\r\n }\r\n }\r\n }\r\n /** Blocker search sample count for PCSS shadow */\r\n get pcssBlockerSampleCount() {\r\n return this._pcssBlockerSampleCount;\r\n }\r\n set pcssBlockerSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssBlockerSampleCount) {\r\n this._pcssBlockerSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.blockerSampleCount = this._pcssBlockerSampleCount;\r\n }\r\n }\r\n }\r\n /** Filter sample count for PCSS shadow */\r\n get pcssFilterSampleCount() {\r\n return this._pcssFilterSampleCount;\r\n }\r\n set pcssFilterSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssFilterSampleCount) {\r\n this._pcssFilterSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.filterSampleCount = this._pcssFilterSampleCount;\r\n }\r\n }\r\n }\r\n /** Maximum PCSS filter radius, measured in shadow-map texels */\r\n get pcssMaxFilterRadius() {\r\n return this._pcssMaxFilterRadius;\r\n }\r\n set pcssMaxFilterRadius(val) {\r\n val = Math.max(1, Number(val) || 1);\r\n if (val !== this._pcssMaxFilterRadius) {\r\n this._pcssMaxFilterRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.maxFilterRadius = this._pcssMaxFilterRadius;\r\n }\r\n }\r\n }\r\n /** If true, rotates PCSS sampling pattern over frames for TAA accumulation */\r\n get pcssTemporalJitter() {\r\n return this._pcssTemporalJitter;\r\n }\r\n set pcssTemporalJitter(val) {\r\n val = !!val;\r\n if (val !== this._pcssTemporalJitter) {\r\n this._pcssTemporalJitter = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.temporalJitter = this._pcssTemporalJitter;\r\n }\r\n }\r\n }\r\n /** Kernel size of VSM */\r\n get vsmBlurKernelSize() {\r\n return this._vsmBlurKernelSize;\r\n }\r\n set vsmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._vsmBlurKernelSize) {\r\n this._vsmBlurKernelSize = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.kernelSize = this._vsmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for VSM */\r\n get vsmBlurRadius() {\r\n return this._vsmBlurRadius;\r\n }\r\n set vsmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._vsmBlurRadius) {\r\n this._vsmBlurRadius = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.blurSize = this._vsmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Darkness for VSM */\r\n get vsmDarkness() {\r\n return this._vsmDarkness;\r\n }\r\n set vsmDarkness(val) {\r\n val = Math.min(0.999, Math.max(0, Number(val) || 0));\r\n if (val !== this._vsmDarkness) {\r\n this._vsmDarkness = val;\r\n this.asVSM()?.setDepthScale(this._vsmDarkness);\r\n }\r\n }\r\n /** Whether to enable ESM blur */\r\n get esmBlur() {\r\n return this._esmBlur;\r\n }\r\n set esmBlur(val) {\r\n if (!!val !== this.esmBlur) {\r\n this._esmBlur = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blur = this._esmBlur;\r\n }\r\n }\r\n }\r\n /** Whether to enable log space ESM blur */\r\n get esmLogSpace() {\r\n return this._esmLogSpace;\r\n }\r\n set esmLogSpace(val) {\r\n if (!!val !== this.esmLogSpace) {\r\n this._esmLogSpace = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.logSpace = this._esmLogSpace;\r\n }\r\n }\r\n }\r\n /** Kernel size for ESM */\r\n get esmBlurKernelSize() {\r\n return this._esmBlurKernelSize;\r\n }\r\n set esmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._esmBlurKernelSize) {\r\n this._esmBlurKernelSize = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.kernelSize = this._esmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for ESM */\r\n get esmBlurRadius() {\r\n return this._esmBlurRadius;\r\n }\r\n set esmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmBlurRadius) {\r\n this._esmBlurRadius = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blurSize = this._esmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Depth scale for ESM */\r\n get esmDepthScale() {\r\n return this._esmDepthScale;\r\n }\r\n set esmDepthScale(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmDepthScale) {\r\n this._esmDepthScale = val;\r\n this.asESM()?.setDepthScale(this._esmDepthScale);\r\n }\r\n }\r\n /** @internal */\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadow(shadowMapParams, scope, shadowVertex, NdotL);\r\n }\r\n /** @internal */\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadowCSM(shadowMapParams, scope, shadowVertex, NdotL, split);\r\n }\r\n /** @internal */\r\n static releaseTemporalResources(ctx: DrawContext) {\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n const shadowMapParams = ctx.shadowMapInfo.get(k)!;\r\n //ctx.device.pool.releaseFrameBuffer(shadowMapParams.shadowMapFramebuffer);\r\n shadowMapParams.lightType = LIGHT_TYPE_NONE;\r\n shadowMapParams.depthClampEnabled = false;\r\n shadowMapParams.shaderHash = '';\r\n shadowMapParams.numShadowCascades = 1;\r\n shadowMapParams.shadowMapFramebuffer = null;\r\n shadowMapParams.impl = null;\r\n shadowMapParams.shadowMap = null;\r\n shadowMapParams.shadowMapSampler = null;\r\n shadowMapParams.implData = null;\r\n this._shadowMapParams.push(shadowMapParams);\r\n }\r\n ctx.shadowMapInfo = null;\r\n }\r\n }\r\n /** @internal */\r\n protected isTextureInvalid(\r\n texture: Texture2D | TextureCube | Texture2DArray,\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number\r\n ) {\r\n return (\r\n texture &&\r\n (texture.target !== target ||\r\n texture.format !== format ||\r\n texture.width !== width ||\r\n texture.height !== height ||\r\n texture.depth !== this.numShadowCascades)\r\n );\r\n }\r\n /** @internal */\r\n protected createTexture(\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number\r\n ) {\r\n const device = getDevice();\r\n const options: TextureCreationOptions = {\r\n mipmapping: false\r\n };\r\n switch (target) {\r\n case '2d':\r\n return device.createTexture2D(format, width, height, options)!;\r\n case 'cube':\r\n return device.createCubeTexture(format, width, options)!;\r\n case '2darray':\r\n return device.createTexture2DArray(format, width, height, depth, options)!;\r\n default:\r\n throw new Error(`Invalid target ${target}`);\r\n }\r\n }\r\n /** @internal */\r\n static fetchTemporalFramebuffer(\r\n autoRelease: boolean,\r\n lightType: number,\r\n numCascades: number,\r\n width: number,\r\n height: number,\r\n colorFormat: TextureFormat,\r\n depthFormat: TextureFormat,\r\n mipmapping?: boolean\r\n ) {\r\n const device = getDevice();\r\n const useTextureArray = numCascades > 1;\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [\r\n device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n colorFormat,\r\n width,\r\n height,\r\n numCascades,\r\n mipmapping\r\n )\r\n ]\r\n : lightType === LIGHT_TYPE_POINT\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, width, mipmapping)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, width, height, mipmapping)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, width, height, numCascades, false)\r\n : lightType === LIGHT_TYPE_POINT\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, width, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, width, height, false)\r\n : null;\r\n const fb = device.pool.createTemporalFramebuffer(autoRelease, colorAttachments!, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n /** @internal */\r\n protected updateResources(shadowMapParams: ShadowMapParams) {\r\n const colorFormat = shadowMapParams.impl!.getShadowMapColorFormat(shadowMapParams);\r\n const depthFormat = shadowMapParams.impl!.getShadowMapDepthFormat(shadowMapParams);\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const shadowMapWidth = this._config.shadowMapSize;\r\n const shadowMapHeight = this._config.shadowMapSize;\r\n shadowMapParams.shadowMapFramebuffer = ShadowMapper.fetchTemporalFramebuffer(\r\n true,\r\n shadowMapParams.lightType,\r\n numCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat!,\r\n depthFormat\r\n );\r\n shadowMapParams.impl = this._impl;\r\n this._impl!.updateResources(shadowMapParams);\r\n }\r\n /**\r\n * Default shadow camera near plane for a light, in world units.\r\n *\r\n * @internal\r\n */\r\n static getDefaultNearClip(light: PunctualLight) {\r\n return light.isPointLight() || light.isRectLight() ? 0.1 : 1;\r\n }\r\n /**\r\n * The projection a light's shadow map is rendered with, which is not always the light's own type.\r\n *\r\n * @internal\r\n */\r\n static getShadowProjectionType(light: PunctualLight) {\r\n return light.isRectLight() ? LIGHT_TYPE_POINT : light.lightType;\r\n }\r\n /** @internal */\r\n protected createLightCameraPoint(lightCamera: Camera) {\r\n //lightCamera.reparent(this._light);\r\n lightCamera.parent = lightCamera.scene!.rootNode;\r\n lightCamera.position.setXYZ(0, 0, 0);\r\n lightCamera.rotation.identity();\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n lightCamera.setPerspective(\r\n Math.PI / 2,\r\n 1,\r\n this._config.nearClip!,\r\n Math.min(this._shadowDistance, this._light.positionAndRange.w)\r\n );\r\n lightCamera.position.set(this._light.positionAndRange.xyz());\r\n }\r\n /** @internal */\r\n protected createLightCameraSpot(lightCamera: Camera) {\r\n this._light.worldMatrix.decompose(null, lightCamera.rotation, lightCamera.position);\r\n lightCamera.parent = this._light.scene?.rootNode ?? null;\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n const spot = this._light as SpotLight;\r\n // The shadow frustum must match the lit cone. Physical mode defines it by the outer cone\r\n // half-angle; legacy stores the cosine of its own cutoff angle.\r\n const fov =\r\n spot.scene?.lightingMode === 'physical' ? 2 * spot.outerConeAngle : 2 * Math.acos(spot.cutoff);\r\n lightCamera.setPerspective(\r\n fov,\r\n 1,\r\n this._config.nearClip,\r\n Math.min(this._shadowDistance, spot.positionAndRange.w)\r\n );\r\n }\r\n /** @internal */\r\n protected createLightCameraDirectional(\r\n sceneAABB: AABB,\r\n sceneCamera: Camera,\r\n lightCamera: Camera,\r\n cropMatrix?: Nullable<Matrix4x4>,\r\n border?: number\r\n ) {\r\n let frustum = sceneCamera.frustumViewSpace;\r\n if (this._shadowDistance < sceneCamera.getFarPlane()) {\r\n tmpMatrix.set(sceneCamera.getProjectionMatrix());\r\n tmpMatrix.setNearFar(tmpMatrix.getNearPlane(), this._shadowDistance);\r\n //tmpMatrix.multiplyRight(sceneCamera.viewMatrix);\r\n tmpFrustum.initWithMatrix(tmpMatrix);\r\n frustum = tmpFrustum;\r\n }\r\n const borderSize = Number.isFinite(border ?? 0) ? Math.max(0, border ?? 0) : 0;\r\n const clampedBorderSize = Math.min(borderSize, (this.shadowMapSize - 1) * 0.5);\r\n const paddingScale = this.shadowMapSize / (this.shadowMapSize - 2 * clampedBorderSize);\r\n //const frustum = sceneCamera.frustum;\r\n const frustumMin = ShadowMapper._frustumMin;\r\n const frustumMax = ShadowMapper._frustumMax;\r\n const frustumCenter = ShadowMapper._frustumCenter;\r\n const target = ShadowMapper._target;\r\n const up = ShadowMapper._up;\r\n // const frustum = new Frustum(sceneCamera.viewProjectionMatrix);\r\n frustumMin.setXYZ(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n frustumMax.setXYZ(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n frustum.corners.forEach((p) => {\r\n frustumMin.inplaceMin(p);\r\n frustumMax.inplaceMax(p);\r\n });\r\n let radius = Vector3.distance(frustumMin, frustumMax) * 0.5 * paddingScale;\r\n const center = sceneCamera.thisToWorld(\r\n Vector3.add(frustumMin, frustumMax, frustumCenter).scaleBy(0.5),\r\n frustumCenter\r\n );\r\n // Clamp to the scene bounds, but only to the part of them that is within\r\n // the shadow distance of the camera. Clipping first is what makes the two\r\n // settings compose. The clamp replaces the centre as well as the radius, so\r\n // without the clip a region is taken whole or not at all: one caster\r\n // wandering off drags the region - and with it the shadow map - after it,\r\n // however short the shadow distance is, until the region finally outgrows\r\n // the frustum and the clamp stops applying altogether. Clipped, a caster\r\n // beyond the shadow distance simply stops counting, which is what the\r\n // shadow distance means.\r\n //\r\n // The clip volume is a box about the camera's position, not about the\r\n // frustum, so the clipped extents - and the radius taken from them - do not\r\n // depend on where the camera is looking. That is deliberate: a radius that\r\n // changed with the view direction would make the shadow edges crawl as the\r\n // camera turned.\r\n const clipDistance = Math.min(this._shadowDistance, sceneCamera.getFarPlane());\r\n const cameraPos = sceneCamera.getWorldPosition(ShadowMapper._cameraPos);\r\n const clipMin = ShadowMapper._clipMin;\r\n const clipMax = ShadowMapper._clipMax;\r\n clipMin.setXYZ(\r\n Math.max(sceneAABB.minPoint.x, cameraPos.x - clipDistance),\r\n Math.max(sceneAABB.minPoint.y, cameraPos.y - clipDistance),\r\n Math.max(sceneAABB.minPoint.z, cameraPos.z - clipDistance)\r\n );\r\n clipMax.setXYZ(\r\n Math.min(sceneAABB.maxPoint.x, cameraPos.x + clipDistance),\r\n Math.min(sceneAABB.maxPoint.y, cameraPos.y + clipDistance),\r\n Math.min(sceneAABB.maxPoint.z, cameraPos.z + clipDistance)\r\n );\r\n // An empty intersection means nothing within the shadow distance casts a\r\n // shadow. There is no tighter volume to move to, so the frustum stands.\r\n if (clipMax.x >= clipMin.x && clipMax.y >= clipMin.y && clipMax.z >= clipMin.z) {\r\n const sceneRadius = Vector3.distance(clipMin, clipMax) * 0.5 * paddingScale;\r\n if (sceneRadius < radius) {\r\n radius = sceneRadius;\r\n Vector3.add(clipMin, clipMax, center).scaleBy(0.5);\r\n }\r\n }\r\n target.setXYZ(\r\n center.x + this._light.directionAndCutoff.x,\r\n center.y + this._light.directionAndCutoff.y,\r\n center.z + this._light.directionAndCutoff.z\r\n );\r\n up.setXYZ(0, 1, 0);\r\n lightCamera.lookAt(center, target, up);\r\n lightCamera.position.set(center);\r\n lightCamera.setOrtho(\r\n -radius,\r\n radius,\r\n -radius,\r\n radius,\r\n -radius,\r\n Math.max(Vector3.distance(center, sceneCamera.getWorldPosition()), sceneCamera.getFarPlane())\r\n );\r\n center.setXYZ(0, 0, 0);\r\n lightCamera.viewProjectionMatrix.transformPointP(center, center);\r\n if (cropMatrix) {\r\n const tx = center.x * this.shadowMapSize * 0.5;\r\n const ty = center.y * this.shadowMapSize * 0.5;\r\n const rx = Math.round(tx);\r\n const ry = Math.round(ty);\r\n center.setXYZ(((rx - tx) * 2) / this.shadowMapSize, ((ry - ty) * 2) / this.shadowMapSize, 0);\r\n cropMatrix.translation(center);\r\n }\r\n\r\n /*\r\n const minx = frustumMin.x;\r\n const maxx = frustumMax.x;\r\n const miny = frustumMin.y;\r\n const maxy = frustumMax.y;\r\n const minz = frustumMin.z;\r\n const maxz = frustumMax.z;\r\n const texelSizeW = (maxx - minx) / this.shadowMapSize;\r\n const texelSizeH = (maxy - miny) / this.shadowMapSize;\r\n const cx = Math.floor((minx + maxx) / 2 / texelSizeW) * texelSizeW;\r\n const cy = Math.floor((miny + maxy) / 2 / texelSizeH) * texelSizeH;\r\n const cz = (minz + maxz) / 2;\r\n const hx = Math.floor(((maxx - minx) * (expand + 0.5)) / texelSizeW) * texelSizeW;\r\n const hy = Math.floor(((maxy - miny) * (expand + 0.5)) / texelSizeH) * texelSizeH;\r\n lightCamera.position.setXYZ(cx, cy, cz);\r\n lightCamera.setOrtho(\r\n -hx,\r\n hx,\r\n -hy,\r\n hy,\r\n sceneMax.z - maxz,\r\n sceneMax.z - minz + 1\r\n );\r\n if (cropMatrix) {\r\n // compute crop matrix\r\n let clipMaxX = 0,\r\n clipMaxY = 0;\r\n let clipMinX = Number.MAX_VALUE,\r\n clipMinY = Number.MAX_VALUE;\r\n frustum.corners.forEach((p) => {\r\n const clipPos = lightCamera.viewProjectionMatrix.transformPoint(p);\r\n clipPos.x = Math.min(1, Math.max(-1, clipPos.x / clipPos.w));\r\n clipPos.y = Math.min(1, Math.max(-1, clipPos.y / clipPos.w));\r\n if (clipPos.x > clipMaxX) {\r\n clipMaxX = clipPos.x;\r\n }\r\n if (clipPos.x < clipMinX) {\r\n clipMinX = clipPos.x;\r\n }\r\n if (clipPos.y > clipMaxY) {\r\n clipMaxY = clipPos.y;\r\n }\r\n if (clipPos.y < clipMinY) {\r\n clipMinY = clipPos.y;\r\n }\r\n });\r\n const clipW = clipMaxX - clipMinX;\r\n const clipH = clipMaxY - clipMinY;\r\n clipMinX -= expand * clipW;\r\n clipMinY -= expand * clipH;\r\n clipMaxX += expand * clipW;\r\n clipMaxY += expand * clipH;\r\n const scaleX = 2 / (clipMaxX - clipMinX);\r\n const scaleY = 2 / (clipMaxY - clipMinY);\r\n const offsetX = -0.5 * (clipMaxX + clipMinX) * scaleX;\r\n const offsetY = -0.5 * (clipMaxY + clipMinY) * scaleY;\r\n cropMatrix.identity();\r\n cropMatrix.m00 = scaleX;\r\n cropMatrix.m11 = scaleY;\r\n cropMatrix.m03 = offsetX;\r\n cropMatrix.m13 = offsetY;\r\n }\r\n */\r\n }\r\n /** {@inheritDoc Disposable.onDispose} */\r\n protected onDispose(): void {\r\n this._shadowRegion.dispose();\r\n }\r\n /** @internal */\r\n private static fetchShadowMapParams() {\r\n if (this._shadowMapParams.length > 0) {\r\n const params = this._shadowMapParams.pop()!;\r\n // Pooled objects retain last frame's ordinal; clear it so it is only set\r\n // again by ShadowMaskRenderer for lights actually written to the mask.\r\n params.maskOrdinal = undefined;\r\n params.cubeFace = undefined;\r\n params.depthRange = undefined;\r\n return params;\r\n } else {\r\n return {\r\n lightType: LIGHT_TYPE_NONE,\r\n depthClampEnabled: false,\r\n shaderHash: '',\r\n cameraParams: new Vector4(),\r\n cascadeDistances: new Vector4(),\r\n depthBiasScales: new Vector4(),\r\n depthBiasValues: [new Vector4(), new Vector4(), new Vector4(), new Vector4()],\r\n numShadowCascades: 1,\r\n shadowMatrices: new Float32Array(16 * 4),\r\n shadowMap: null,\r\n shadowMapSampler: null,\r\n shadowMapFramebuffer: null,\r\n impl: null,\r\n implData: null\r\n };\r\n }\r\n }\r\n /** @internal */\r\n private static fetchCameraForScene(scene: Scene) {\r\n const cameras = this._lightCameras.get(scene);\r\n if (!cameras || cameras.length === 0) {\r\n const camera = new Camera(scene);\r\n retainObject(camera);\r\n return camera;\r\n } else {\r\n const camera = cameras.pop()!;\r\n camera.parent = scene.rootNode;\r\n camera.position.setXYZ(0, 0, 0);\r\n camera.rotation.identity();\r\n camera.scale.setXYZ(1, 1, 1);\r\n camera.clipMask = 0;\r\n return camera;\r\n }\r\n }\r\n /** @internal */\r\n private static releaseCamera(camera: Camera) {\r\n let cameras = this._lightCameras.get(camera.scene!);\r\n if (!cameras) {\r\n cameras = [];\r\n this._lightCameras.set(camera.scene!, cameras);\r\n }\r\n camera.remove();\r\n cameras.push(camera);\r\n }\r\n /**\r\n * View distances bounding the cascades a directional light's shadow map will be rendered with\r\n * for a camera, the same ones render() computes: cascade i covers [result[i], result[i + 1]].\r\n * A shadow map without cascades has one, up to the shadow distance.\r\n * @internal\r\n */\r\n getCascadeDistances(camera: Camera): number[] {\r\n const numCascades =\r\n this._light.isDirectionLight() && this._impl!.supportsCascades() ? (this._config.numCascades ?? 1) : 1;\r\n const near = camera.getNearPlane();\r\n const far = Math.min(this._shadowDistance, camera.getFarPlane());\r\n return numCascades > 1\r\n ? this.calcSplitDistances(near, far, numCascades).slice(0, numCascades + 1)\r\n : [near, far];\r\n }\r\n /** @internal */\r\n calcSplitDistances(nearPlane: number, farPlane: number, numCascades: number) {\r\n const result: number[] = [0, 0, 0, 0, 0];\r\n for (let i = 0; i <= numCascades; ++i) {\r\n const fIDM = i / numCascades;\r\n const fLog = nearPlane * Math.pow(farPlane / nearPlane, fIDM);\r\n const fUniform = nearPlane + (farPlane - nearPlane) * fIDM;\r\n result[i] = fLog * this._config.splitLambda + fUniform * (1 - this._config.splitLambda);\r\n }\r\n return result;\r\n }\r\n /** @internal */\r\n protected calcDepthBiasParams(\r\n camera: Camera,\r\n shadowMapSize: number,\r\n depthBias: number,\r\n normalBias: number,\r\n depthScale: number,\r\n result: Vector4\r\n ) {\r\n const sizeNear = Math.min(\r\n camera.getProjectionMatrix().getNearPlaneWidth(),\r\n camera.getProjectionMatrix().getNearPlaneHeight()\r\n );\r\n const sizeFar = Math.min(\r\n camera.getProjectionMatrix().getFarPlaneWidth(),\r\n camera.getProjectionMatrix().getFarPlaneHeight()\r\n );\r\n // World-space size of one shadow map texel at the near plane. Both bias\r\n // terms are expressed in multiples of it, so a tighter cascade automatically\r\n // gets a proportionally smaller offset.\r\n const texelWorldSize = sizeNear / shadowMapSize;\r\n result.setXYZW(\r\n depthBias * texelWorldSize * 2,\r\n // Normal offset distance in world units. Unlike a depth bias this moves\r\n // the receiver sideways out of the texel that produces grazing-angle\r\n // acne, which no amount of depth bias can fix (the required depth offset\r\n // diverges as NdotL approaches zero).\r\n normalBias * texelWorldSize,\r\n depthScale,\r\n sizeFar / sizeNear\r\n );\r\n }\r\n /** @internal */\r\n protected postRenderShadowMap(shadowMapParams: ShadowMapParams) {\r\n this._impl!.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n render(ctx: DrawContext, renderPass: ShadowMapPass) {\r\n if (!ctx.shadowMapInfo) {\r\n ctx.shadowMapInfo = new Map();\r\n }\r\n const shadowMapParams = ShadowMapper.fetchShadowMapParams();\r\n shadowMapParams.impl = this._impl;\r\n shadowMapParams.lightType = ShadowMapper.getShadowProjectionType(this.light);\r\n if (this._impl instanceof PCSS) {\r\n // A rect light's penumbra follows its size: the radius of the disc of\r\n // equal area, in world units. Refreshed every frame so resizing the\r\n // light is picked up without touching the shadow settings.\r\n this._impl.physicalLightRadius = this._light.isRectLight()\r\n ? Math.sqrt((this._light.width * this._light.height) / Math.PI)\r\n : 0;\r\n }\r\n shadowMapParams.numShadowCascades =\r\n shadowMapParams.lightType === LIGHT_TYPE_DIRECTIONAL && this._impl!.supportsCascades()\r\n ? (this._config.numCascades ?? 1)\r\n : 1;\r\n shadowMapParams.cascadeIndex = 0;\r\n ctx.shadowMapInfo.set(this.light, shadowMapParams);\r\n const scene = ctx.scene;\r\n const camera = ctx.camera;\r\n renderPass.light = this._light;\r\n this.updateResources(shadowMapParams);\r\n shadowMapParams.shaderHash = this.getShaderHash(shadowMapParams);\r\n const device = getDevice();\r\n const fb = shadowMapParams.shadowMapFramebuffer!;\r\n shadowMapParams.depthClampEnabled = false;\r\n renderPass.clearColor = this._impl!.getShadowMapClearColor(shadowMapParams);\r\n const depthScale = this._impl!.getDepthScale();\r\n const geometryPassCount = Math.max(1, this._impl!.getGeometryPassCount(shadowMapParams) >> 0);\r\n // Repeats the caster draw for implementations that need more than one look at\r\n // the geometry (deep opacity maps). Single-pass implementations - every one\r\n // but DOM - take the `pass === 0` path once and behave exactly as before.\r\n const renderGeometry = (renderCamera: Camera, cullCamera?: Camera) => {\r\n if (geometryPassCount === 1) {\r\n renderPass.render(ctx, renderCamera, cullCamera);\r\n return;\r\n }\r\n // Culling depends only on the camera, so the extra passes reuse the first\r\n // pass's queue rather than walking the scene graph again per pass.\r\n const renderQueue = renderPass.cullScene(ctx, cullCamera ?? renderCamera);\r\n try {\r\n for (let pass = 0; pass < geometryPassCount; pass++) {\r\n this._impl!.beginGeometryPass(shadowMapParams, pass);\r\n // The emitted caster shader differs between passes, and the shadow pass\r\n // keys its programs on this hash, so it has to be refreshed per pass\r\n // rather than computed once up front.\r\n shadowMapParams.shaderHash = this.getShaderHash(shadowMapParams);\r\n renderPass.clearColor = this._impl!.getShadowMapClearColor(shadowMapParams);\r\n renderPass.render(ctx, renderCamera, cullCamera, renderQueue);\r\n }\r\n } finally {\r\n renderQueue.dispose();\r\n }\r\n };\r\n const directionalShadowRegion = this._shadowRegion.region;\r\n const shadowRegion =\r\n this._light.isDirectionLight() && directionalShadowRegion?.isValid()\r\n ? directionalShadowRegion\r\n : scene.boundingBox;\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n this.createLightCameraPoint(shadowMapRenderCamera);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewMatrix));\r\n shadowMapParams.depthRange = this._light.positionAndRange.w;\r\n for (const face of [CubeFace.PX, CubeFace.NX, CubeFace.PY, CubeFace.NY, CubeFace.PZ, CubeFace.NZ]) {\r\n shadowMapRenderCamera.lookAtCubeFace(face);\r\n fb.setColorAttachmentCubeFace(0, face);\r\n fb.setDepthAttachmentCubeFace(face);\r\n shadowMapParams.cubeFace = face;\r\n renderGeometry(shadowMapRenderCamera);\r\n }\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.identity());\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n } else {\r\n // Reads the resolved count, not the configured one: an implementation that\r\n // cannot store cascades has already collapsed it to a single split, and the\r\n // cascade path would index array layers its shadow map does not have.\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n if (numCascades > 1) {\r\n const distances = this.calcSplitDistances(\r\n camera.getNearPlane(),\r\n Math.min(this._shadowDistance, camera.getFarPlane()),\r\n numCascades\r\n );\r\n const cascadeCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapCullCamera = ShadowMapper.fetchCameraForScene(scene);\r\n shadowMapCullCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n cascadeCamera.parent = camera;\r\n shadowMapParams.depthClampEnabled = getDevice().getDeviceCaps().shaderCaps.supportFragmentDepth;\r\n for (let split = 0; split < numCascades; split++) {\r\n cascadeCamera.setPerspective(\r\n camera.getFOV(),\r\n camera.getAspect(),\r\n distances[split],\r\n distances[split + 1]\r\n );\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n const border = shadowMapParams.impl!.getShadowMapBorder(shadowMapParams); //20 / this._config.shadowMapSize;\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n cascadeCamera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n border\r\n );\r\n this.createLightCameraDirectional(shadowRegion, cascadeCamera, shadowMapCullCamera, null, border);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[split]\r\n );\r\n shadowMapParams.depthBiasScales[split] =\r\n shadowMapParams.depthBiasValues[0].x !== 0\r\n ? shadowMapParams.depthBiasValues[split].x / shadowMapParams.depthBiasValues[0].x\r\n : 1;\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n let scissor: Nullable<number[]> = null;\r\n if (\r\n fb.getColorAttachments()[0]?.isTexture2DArray() ||\r\n fb.getDepthAttachment()?.isTexture2DArray()\r\n ) {\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n fb.setColorAttachmentLayer(0, split);\r\n fb.setDepthAttachmentLayer(split);\r\n } else {\r\n const numRows = numCascades > 2 ? 2 : 1;\r\n const numCols = numCascades > 1 ? 2 : 1;\r\n const adjMatrix = new Matrix4x4();\r\n const col = split % 2;\r\n const row = split >> 1;\r\n adjMatrix.setRowXYZW(0, 1.5 - 0.5 * numCols, 0, 0, 0);\r\n adjMatrix.setRowXYZW(1, 0, 1.5 - 0.5 * numRows, 0, 0);\r\n adjMatrix.setRowXYZW(2, 0, 0, 1, 0);\r\n adjMatrix.setRowXYZW(3, col - 0.5 * numCols + 0.5, row - 0.5 * numRows + 0.5, 0, 1);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(\r\n adjMatrix,\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n )\r\n );\r\n if (device.type === 'webgpu') {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n (numRows - 1 - row) * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n } else {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n row * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n }\r\n }\r\n device.setFramebuffer(fb);\r\n device.setScissor(scissor);\r\n shadowMapParams.cascadeIndex = split;\r\n renderGeometry(shadowMapRenderCamera, shadowMapCullCamera);\r\n shadowMapParams.shadowMatrices.set(\r\n Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix),\r\n split * 16\r\n );\r\n shadowMapParams.cascadeDistances[split] = distances[split + 1];\r\n }\r\n ShadowMapper.releaseCamera(cascadeCamera);\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n ShadowMapper.releaseCamera(shadowMapCullCamera);\r\n } else {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene)!;\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n snapMatrix.identity();\r\n shadowMapRenderCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n if (this._light.isDirectionLight()) {\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n camera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n shadowMapParams.impl!.getShadowMapBorder(shadowMapParams)\r\n );\r\n } else {\r\n this.createLightCameraSpot(shadowMapRenderCamera);\r\n }\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n renderGeometry(shadowMapRenderCamera);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix));\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n }\r\n }\r\n this.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n private applyMode(mode: ShadowMode) {\r\n if (\r\n mode !== 'hard' &&\r\n mode !== 'vsm' &&\r\n mode !== 'esm' &&\r\n mode !== 'pcf' &&\r\n mode !== 'pcf-pd' &&\r\n mode !== 'pcf-opt' &&\r\n mode !== 'pcss' &&\r\n mode !== 'dom'\r\n ) {\r\n console.error(`ShadowMapper.setShadowMode() failed: invalid mode: ${mode}`);\r\n return;\r\n }\r\n if (mode === 'dom' && getDevice().type !== 'webgpu') {\r\n // The strand geometry this mode exists to shadow is WebGPU only, so the\r\n // WebGL paths were never built. Falling back keeps a scene authored with it\r\n // renderable rather than failing to produce a shadow map at all.\r\n warnUnsupported(\"Deep opacity map shadows (shadow mode 'dom')\", 'WebGPU', \"falling back to 'pcf'\");\r\n this.applyMode('pcf');\r\n return;\r\n }\r\n this._impl = null;\r\n if (mode === 'hard') {\r\n this._impl = new SSM();\r\n } else if (mode === 'vsm') {\r\n this._impl = new VSM(this._vsmBlurKernelSize, this._vsmBlurRadius, this._vsmDarkness);\r\n } else if (mode === 'esm') {\r\n this._impl = new ESM(this._esmBlurKernelSize, this._esmBlurRadius, this._esmDepthScale);\r\n const esm = this._impl as ESM;\r\n esm.blur = this._esmBlur;\r\n esm.logSpace = this._esmLogSpace;\r\n } else if (mode === 'pcf' || mode === 'pcf-opt' || mode === 'pcf-pd') {\r\n this._impl = new PCFOPT(this._pcfKernelSize);\r\n } else if (mode === 'dom') {\r\n this._impl = new DOM(this._domLayerDistance, this._domDensity, this._domFilterSize);\r\n } else if (mode === 'pcss') {\r\n this._impl = new PCSS(\r\n this._pcssLightRadius,\r\n this._pcssBlockerSampleCount,\r\n this._pcssFilterSampleCount,\r\n this._pcssMaxFilterRadius,\r\n this._pcssTemporalJitter\r\n );\r\n }\r\n }\r\n /** @internal */\r\n private asVSM() {\r\n return this._impl?.getType() === 'vsm' ? (this._impl as VSM) : null;\r\n }\r\n /** @internal */\r\n private asDOM() {\r\n return this._impl?.getType() === 'dom' ? (this._impl as DOM) : null;\r\n }\r\n /** @internal */\r\n private asESM() {\r\n return this._impl?.getType() === 'esm' ? (this._impl as ESM) : null;\r\n }\r\n /** @internal */\r\n private asPCFPD() {\r\n return this._impl?.getType() === 'pcf-pd' ? (this._impl as PCFPD) : null;\r\n }\r\n /** @internal */\r\n private asPCFOPT() {\r\n return this._impl?.getType() === 'pcf-opt' ? (this._impl as PCFOPT) : null;\r\n }\r\n /** @internal */\r\n private asPCSS() {\r\n return this._impl?.getType() === 'pcss' ? (this._impl as PCSS) : null;\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","tmpFrustum","Frustum","identity","ShadowMapper","Disposable","_snapMatrix","_target","Vector3","_up","_frustumMin","_frustumMax","_frustumCenter","_clipMin","_clipMax","_cameraPos","_lightCameras","WeakMap","_shadowMapParams","light","_light","_config","shadowMapSize","numCascades","splitLambda","depthBias","normalBias","nearClip","getDefaultNearClip","_resourceDirty","_shadowMode","_shadowDistance","_impl","_pdSampleCount","_pdSampleRadius","_pcfKernelSize","_pcssLightRadius","_pcssBlockerSampleCount","_pcssFilterSampleCount","_pcssMaxFilterRadius","_pcssTemporalJitter","_domLayerDistance","_domDensity","_domFilterSize","_vsmBlurKernelSize","_vsmBlurRadius","_vsmDarkness","_esmBlur","_esmLogSpace","_esmBlurKernelSize","_esmBlurRadius","_esmDepthScale","_shadowStrength","_shadowRegion","ShadowRegion","applyMode","num","Number","isInteger","console","error","shadowRegion","updateDirectionalShadowRegion","force","isDirectionLight","scene","clear","rootNode","iterate","child","isMesh","isClipmapTerrain","castShadow","addDynamicCaster","computeDirectionalShadowRegion","aabb","AABB","beginExtend","bbox","getWorldBoundingVolume","toAABB","extend","minPoint","maxPoint","isValid","shadowDistance","val","Math","max","numShadowCascades","shadowStrength","min","mode","applyQualityPreset","preset","pcfKernelSize","getShaderHash","shadowMapParams","impl","name","lightType","shadowMap","target","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","pdSampleCount","pcfpd","asPCFPD","tapCount","pdSampleRadius","setDepthScale","pcfopt","asPCFOPT","kernelSize","pcssLightRadius","pcss","asPCSS","lightRadius","domLayerDistance","dom","asDOM","layerDistance","domDensity","density","domFilterSize","filterSize","pcssBlockerSampleCount","blockerSampleCount","pcssFilterSampleCount","filterSampleCount","pcssMaxFilterRadius","maxFilterRadius","pcssTemporalJitter","temporalJitter","vsmBlurKernelSize","vsm","asVSM","vsmBlurRadius","blurSize","vsmDarkness","esmBlur","esm","asESM","blur","esmLogSpace","logSpace","esmBlurKernelSize","esmBlurRadius","esmDepthScale","computeShadow","scope","shadowVertex","NdotL","computeShadowCSM","split","releaseTemporalResources","ctx","shadowMapInfo","k","keys","get","LIGHT_TYPE_NONE","depthClampEnabled","shaderHash","shadowMapFramebuffer","shadowMapSampler","implData","push","isTextureInvalid","texture","width","height","depth","createTexture","device","options","mipmapping","createTexture2D","createCubeTexture","createTexture2DArray","Error","fetchTemporalFramebuffer","autoRelease","colorFormat","depthFormat","useTextureArray","colorAttachments","pool","fetchTemporalTexture2DArray","LIGHT_TYPE_POINT","fetchTemporalTextureCube","fetchTemporalTexture2D","depthAttachment","fb","createTemporalFramebuffer","releaseTexture","updateResources","getShadowMapColorFormat","getShadowMapDepthFormat","shadowMapWidth","shadowMapHeight","isPointLight","isRectLight","getShadowProjectionType","createLightCameraPoint","lightCamera","parent","position","setXYZ","rotation","scale","setPerspective","PI","positionAndRange","w","set","xyz","createLightCameraSpot","worldMatrix","decompose","spot","fov","lightingMode","outerConeAngle","acos","cutoff","createLightCameraDirectional","sceneAABB","sceneCamera","cropMatrix","border","frustum","frustumViewSpace","getFarPlane","getProjectionMatrix","setNearFar","getNearPlane","initWithMatrix","borderSize","isFinite","clampedBorderSize","paddingScale","frustumMin","frustumMax","frustumCenter","up","MAX_VALUE","corners","forEach","p","inplaceMin","inplaceMax","radius","distance","center","thisToWorld","add","scaleBy","clipDistance","cameraPos","getWorldPosition","clipMin","clipMax","x","y","z","sceneRadius","directionAndCutoff","lookAt","setOrtho","viewProjectionMatrix","transformPointP","tx","ty","rx","round","ry","translation","dispose","fetchShadowMapParams","length","params","pop","maskOrdinal","undefined","cubeFace","depthRange","cameraParams","Vector4","cascadeDistances","depthBiasScales","depthBiasValues","shadowMatrices","Float32Array","fetchCameraForScene","cameras","camera","Camera","retainObject","clipMask","releaseCamera","remove","getCascadeDistances","supportsCascades","near","far","calcSplitDistances","slice","nearPlane","farPlane","result","i","fIDM","fLog","pow","fUniform","calcDepthBiasParams","depthScale","sizeNear","getNearPlaneWidth","getNearPlaneHeight","sizeFar","getFarPlaneWidth","getFarPlaneHeight","texelWorldSize","setXYZW","postRenderShadowMap","render","renderPass","Map","PCSS","physicalLightRadius","sqrt","LIGHT_TYPE_DIRECTIONAL","cascadeIndex","clearColor","getShadowMapClearColor","getDepthScale","geometryPassCount","getGeometryPassCount","renderGeometry","renderCamera","cullCamera","renderQueue","cullScene","pass","beginGeometryPass","directionalShadowRegion","region","boundingBox","shadowMapRenderCamera","setFramebuffer","transpose","viewMatrix","face","CubeFace","PX","NX","PY","NY","PZ","NZ","lookAtCubeFace","setColorAttachmentCubeFace","setDepthAttachmentCubeFace","distances","cascadeCamera","shadowMapCullCamera","ClipLeft","ClipRight","ClipBottom","ClipTop","shaderCaps","supportFragmentDepth","getFOV","getAspect","snapMatrix","getShadowMapBorder","scissor","getColorAttachments","isTexture2DArray","getDepthAttachment","setProjectionMatrix","multiply","setColorAttachmentLayer","setDepthAttachmentLayer","numRows","numCols","adjMatrix","col","row","setRowXYZW","type","setScissor","warnUnsupported","SSM","VSM","ESM","PCFOPT","DOM","getType"],"mappings":"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"}
|