@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":"pcf_pd.js","sources":["../../src/shadow/pcf_pd.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureSampler } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowPCF,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport class PCFPD extends ShadowImpl {\r\n private static readonly SHADER_VERSION = 3;\r\n protected _tapCount: number;\r\n protected _sampleRadius: number;\r\n protected _shadowSampler: Nullable<TextureSampler>;\r\n constructor(tapCount?: number, sampleRadius?: number) {\r\n super();\r\n this._tapCount = tapCount ?? 3;\r\n this._sampleRadius = sampleRadius ?? 1;\r\n this._shadowSampler = null;\r\n }\r\n get tapCount() {\r\n return this._tapCount;\r\n }\r\n set tapCount(val) {\r\n this._tapCount = val;\r\n }\r\n getType() {\r\n return 'pcf-pd' as const;\r\n }\r\n dispose() {\r\n this._shadowSampler = null;\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n private getPCFKernelSize() {\r\n if (this._sampleRadius >= 4 || this._tapCount >= 32) {\r\n return 7;\r\n }\r\n if (this._sampleRadius >= 2 || this._tapCount >= 12) {\r\n return 5;\r\n }\r\n return 3;\r\n }\r\n getParams(out?: Vector4) {\r\n return out ?? Vector4.zero();\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return Math.max(this._sampleRadius + 1, this.getPCFKernelSize());\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return (\r\n this.useNativeShadowMap(shadowMapParams)\r\n ? shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()\r\n : shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0]\r\n ) as ShadowMapType;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler =\r\n shadowMapParams.shadowMap?.getDefaultSampler(this.useNativeShadowMap(shadowMapParams)) || null;\r\n }\r\n postRenderShadowMap() {}\r\n getDepthScale() {\r\n return this._sampleRadius;\r\n }\r\n setDepthScale(val: number) {\r\n this._sampleRadius = val;\r\n }\r\n getShaderHash() {\r\n return `${PCFPD.SHADER_VERSION}-${this._tapCount}-${this._sampleRadius}`;\r\n }\r\n getShadowMapColorFormat(shadowMapParams: ShadowMapParams) {\r\n if (this.useNativeShadowMap(shadowMapParams)) {\r\n return null;\r\n } else {\r\n const device = getDevice();\r\n return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? device.type === 'webgl'\r\n ? 'rgba16f'\r\n : 'r16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? device.type === 'webgl'\r\n ? 'rgba32f'\r\n : 'r32f'\r\n : 'rgba8unorm';\r\n }\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams) {\r\n return this.preferredShadowMapDepthFormat();\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n }\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 const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n const kernelSize = this.getPCFKernelSize();\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\r\n this.shadowCoord,\r\n this.split\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n const that = this;\r\n const kernelSize = this.getPCFKernelSize();\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.$l.maxZ = pb.max(pb.max(pb.abs(this.dir.x), pb.abs(this.dir.y)), pb.abs(this.dir.z));\r\n this.$l.distance = ShaderHelper.linearDepthToNonLinear(this, this.maxZ, this.nearFar);\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n pb.div(this.maxZ, ShaderHelper.getLightPositionAndRangeForShadow(this).w),\r\n this.NdotL,\r\n true\r\n );\r\n this.$return(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\r\n } else {\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$return(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\r\n }\r\n } else {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\r\n this.shadowCoord\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return getDevice().type !== 'webgl';\r\n }\r\n /** @internal */\r\n sampleShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = 'lib_sampleShadowMapPD';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords,\r\n applyShadowDepthBias(this, this.z, this.bias, true)\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n /** @internal */\r\n sampleShadowMapCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n split: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMapCSM = 'lib_sampleShadowMapCSMPD';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameSampleShadowMapCSM,\r\n [pb.vec4('coords'), pb.int('split'), pb.float('z'), pb.float('bias')],\r\n function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.distance = applyShadowDepthBias(this, this.z, this.bias, true);\r\n if (that.useNativeShadowMap(shadowMapParams)) {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords.xy,\r\n this.split,\r\n this.distance\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), this.coords.xy, this.distance),\r\n 0,\r\n 1\r\n )\r\n );\r\n }\r\n } else {\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$l.shadowTex = pb.textureArraySampleLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords.xy,\r\n this.split,\r\n 0\r\n );\r\n } else {\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords.xy, 0);\r\n }\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$return(\r\n REVERSE_Z ? pb.step(this.shadowTex.x, this.distance) : pb.step(this.distance, this.shadowTex.x)\r\n );\r\n }\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameSampleShadowMapCSM](coords, split, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCFPD","ShadowImpl","SHADER_VERSION","_tapCount","_sampleRadius","_shadowSampler","tapCount","sampleRadius","val","getType","dispose","resourceDirty","getPCFKernelSize","getParams","out","Vector4","zero","getShadowMapBorder","_shadowMapParams","Math","max","getShadowMap","shadowMapParams","useNativeShadowMap","shadowMapFramebuffer","getDepthAttachment","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","getShaderHash","getShadowMapColorFormat","device","getDevice","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","type","supportFloatColorBuffer","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","kernelSize","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCF","lightType","$return","getGlobalScope","computeShadow","funcNameComputeShadow","that","LIGHT_TYPE_POINT","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","xy","maxZ","abs","distance","linearDepthToNonLinear","computeShadowBias","sampleShadowMap","length","coords","bias","funcNameSampleShadowMap","vec3","floatDepthTexture","clamp","textureSampleCompareLevel","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step","sampleShadowMapCSM","funcNameSampleShadowMapCSM","isTexture2DArray","textureArraySampleCompareLevel","textureArraySampleLevel","REVERSE_Z"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pcf_pd.js","sources":["../../src/shadow/pcf_pd.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureSampler } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport {\r\n applyShadowDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowPCF,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { LIGHT_TYPE_POINT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport class PCFPD extends ShadowImpl {\r\n private static readonly SHADER_VERSION = 3;\r\n protected _tapCount: number;\r\n protected _sampleRadius: number;\r\n protected _shadowSampler: Nullable<TextureSampler>;\r\n constructor(tapCount?: number, sampleRadius?: number) {\r\n super();\r\n this._tapCount = tapCount ?? 3;\r\n this._sampleRadius = sampleRadius ?? 1;\r\n this._shadowSampler = null;\r\n }\r\n get tapCount() {\r\n return this._tapCount;\r\n }\r\n set tapCount(val) {\r\n this._tapCount = val;\r\n }\r\n getType() {\r\n return 'pcf-pd' as const;\r\n }\r\n dispose() {\r\n this._shadowSampler = null;\r\n }\r\n resourceDirty() {\r\n return false;\r\n }\r\n private getPCFKernelSize() {\r\n if (this._sampleRadius >= 4 || this._tapCount >= 32) {\r\n return 7;\r\n }\r\n if (this._sampleRadius >= 2 || this._tapCount >= 12) {\r\n return 5;\r\n }\r\n return 3;\r\n }\r\n getParams(out?: Vector4) {\r\n return out ?? Vector4.zero();\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return Math.max(this._sampleRadius + 1, this.getPCFKernelSize());\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return shadowMapParams.shadowMapFramebuffer!.getDepthAttachment() as ShadowMapType;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler = shadowMapParams.shadowMap?.getDefaultSampler(true) || null;\r\n }\r\n postRenderShadowMap() {}\r\n getDepthScale() {\r\n return this._sampleRadius;\r\n }\r\n setDepthScale(val: number) {\r\n this._sampleRadius = val;\r\n }\r\n getShaderHash() {\r\n return `${PCFPD.SHADER_VERSION}-${this._tapCount}-${this._sampleRadius}`;\r\n }\r\n getShadowMapColorFormat(_shadowMapParams: ShadowMapParams) {\r\n return null;\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams) {\r\n return this.preferredShadowMapDepthFormat();\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n }\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 const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n const kernelSize = this.getPCFKernelSize();\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\r\n this.shadowCoord,\r\n this.split\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n const that = this;\r\n const kernelSize = this.getPCFKernelSize();\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.$l.maxZ = pb.max(pb.max(pb.abs(this.dir.x), pb.abs(this.dir.y)), pb.abs(this.dir.z));\r\n this.$l.distance = ShaderHelper.linearDepthToNonLinear(this, this.maxZ, this.nearFar);\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n pb.div(this.maxZ, ShaderHelper.getLightPositionAndRangeForShadow(this).w),\r\n this.NdotL,\r\n true\r\n );\r\n this.$return(that.sampleShadowMap(shadowMapParams, this, this.dir, this.distance, this.shadowBias));\r\n } else {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = filterShadowPCF(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n kernelSize,\r\n this.shadowCoord\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return true;\r\n }\r\n /** @internal */\r\n sampleShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = 'lib_sampleShadowMapPD';\r\n const pb = scope.$builder;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords,\r\n applyShadowDepthBias(this, this.z, this.bias, true)\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n /** @internal */\r\n sampleShadowMapCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n split: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMapCSM = 'lib_sampleShadowMapCSMPD';\r\n const pb = scope.$builder;\r\n pb.func(\r\n funcNameSampleShadowMapCSM,\r\n [pb.vec4('coords'), pb.int('split'), pb.float('z'), pb.float('bias')],\r\n function () {\r\n this.$l.distance = applyShadowDepthBias(this, this.z, this.bias, true);\r\n if (shadowMapParams.shadowMap!.isTexture2DArray()) {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureArraySampleCompareLevel(\r\n ShaderHelper.getShadowMap(this),\r\n this.coords.xy,\r\n this.split,\r\n this.distance\r\n ),\r\n 0,\r\n 1\r\n )\r\n );\r\n } else {\r\n this.$return(\r\n pb.clamp(\r\n pb.textureSampleCompareLevel(ShaderHelper.getShadowMap(this), this.coords.xy, this.distance),\r\n 0,\r\n 1\r\n )\r\n );\r\n }\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameSampleShadowMapCSM](coords, split, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCFPD","ShadowImpl","SHADER_VERSION","_tapCount","_sampleRadius","_shadowSampler","tapCount","sampleRadius","val","getType","dispose","resourceDirty","getPCFKernelSize","getParams","out","Vector4","zero","getShadowMapBorder","_shadowMapParams","Math","max","getShadowMap","shadowMapParams","shadowMapFramebuffer","getDepthAttachment","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","getShaderHash","getShadowMapColorFormat","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","kernelSize","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCF","lightType","$return","getGlobalScope","computeShadow","funcNameComputeShadow","that","LIGHT_TYPE_POINT","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","nearFar","getShadowCameraParams","xy","maxZ","abs","distance","linearDepthToNonLinear","computeShadowBias","sampleShadowMap","useNativeShadowMap","coords","bias","funcNameSampleShadowMap","vec3","clamp","textureSampleCompareLevel","sampleShadowMapCSM","funcNameSampleShadowMapCSM","isTexture2DArray","textureArraySampleCompareLevel"],"mappings":";;;;;;;AAgBA,iBACO,MAAMA,KAAcC,SAAAA,UAAAA,CAAAA;AACzB,IAAA,OAAwBC,iBAAiB,CAAE;IACjCC,SAAkB;IAClBC,aAAsB;IACtBC,cAAyC;IACnD,WAAYC,CAAAA,QAAiB,EAAEC,YAAqB,CAAE;QACpD,KAAK,EAAA;QACL,IAAI,CAACJ,SAAS,GAAGG,QAAY,IAAA,CAAA;QAC7B,IAAI,CAACF,aAAa,GAAGG,YAAgB,IAAA,CAAA;QACrC,IAAI,CAACF,cAAc,GAAG,IAAA;AACxB;AACA,IAAA,IAAIC,QAAW,GAAA;QACb,OAAO,IAAI,CAACH,SAAS;AACvB;IACA,IAAIG,QAAAA,CAASE,GAAG,EAAE;QAChB,IAAI,CAACL,SAAS,GAAGK,GAAAA;AACnB;IACAC,OAAU,GAAA;QACR,OAAO,QAAA;AACT;IACAC,OAAU,GAAA;QACR,IAAI,CAACL,cAAc,GAAG,IAAA;AACxB;IACAM,aAAgB,GAAA;QACd,OAAO,KAAA;AACT;IACQC,gBAAmB,GAAA;QACzB,IAAI,IAAI,CAACR,aAAa,IAAI,KAAK,IAAI,CAACD,SAAS,IAAI,EAAI,EAAA;YACnD,OAAO,CAAA;AACT;QACA,IAAI,IAAI,CAACC,aAAa,IAAI,KAAK,IAAI,CAACD,SAAS,IAAI,EAAI,EAAA;YACnD,OAAO,CAAA;AACT;QACA,OAAO,CAAA;AACT;AACAU,IAAAA,SAAAA,CAAUC,GAAa,EAAE;QACvB,OAAOA,GAAAA,IAAOC,QAAQC,IAAI,EAAA;AAC5B;AACAC,IAAAA,kBAAAA,CAAmBC,gBAAiC,EAAE;QACpD,OAAOC,IAAAA,CAAKC,GAAG,CAAC,IAAI,CAAChB,aAAa,GAAG,CAAA,EAAG,IAAI,CAACQ,gBAAgB,EAAA,CAAA;AAC/D;AACAS,IAAAA,YAAAA,CAAaC,eAAgC,EAAE;QAC7C,OAAOA,eAAAA,CAAgBC,oBAAoB,CAAEC,kBAAkB,EAAA;AACjE;AACAC,IAAAA,iBAAAA,CAAkBH,eAAgC,EAAE;AAClDA,QAAAA,eAAAA,CAAgBI,SAAS,GAAG,IAAI,CAACL,YAAY,CAACC,eAAAA,CAAAA;AAC9CA,QAAAA,eAAAA,CAAgBK,gBAAgB,GAAGL,eAAAA,CAAgBI,SAAS,EAAEE,kBAAkB,IAAS,CAAA,IAAA,IAAA;AAC3F;AACAC,IAAAA,mBAAAA,GAAsB;IACtBC,aAAgB,GAAA;QACd,OAAO,IAAI,CAAC1B,aAAa;AAC3B;AACA2B,IAAAA,aAAAA,CAAcvB,GAAW,EAAE;QACzB,IAAI,CAACJ,aAAa,GAAGI,GAAAA;AACvB;IACAwB,aAAgB,GAAA;AACd,QAAA,OAAO,CAAGhC,EAAAA,KAAAA,CAAME,cAAc,CAAC,CAAC,EAAE,IAAI,CAACC,SAAS,CAAC,CAAC,EAAE,IAAI,CAACC,aAAa,CAAE,CAAA;AAC1E;AACA6B,IAAAA,uBAAAA,CAAwBf,gBAAiC,EAAE;QACzD,OAAO,IAAA;AACT;AACAgB,IAAAA,uBAAAA,CAAwBhB,gBAAiC,EAAE;QACzD,OAAO,IAAI,CAACiB,6BAA6B,EAAA;AAC3C;AACAC,IAAAA,qBAAAA,CACEd,eAAgC,EAChCe,KAA4B,EAC5BC,QAAqB,EACrB;AACA,QAAA,OAAOF,sBAAsBC,KAAOC,EAAAA,QAAAA,EAAUhB,eAAgBI,CAAAA,SAAS,CAAEa,MAAM,CAAA;AACjF;IACAC,gBACElB,CAAAA,eAAgC,EAChCe,KAA4B,EAC5BI,YAAyB,EACzBC,KAAkB,EAClBC,KAAkB,EAClB;AACA,QAAA,MAAMC,wBAA2B,GAAA,sBAAA;QACjC,MAAMC,EAAAA,GAAKR,MAAMS,QAAQ;QACzB,MAAMC,UAAAA,GAAa,IAAI,CAACnC,gBAAgB,EAAA;QACxCiC,EAAGG,CAAAA,IAAI,CACLJ,wBACA,EAAA;AAACC,YAAAA,EAAAA,CAAGI,IAAI,CAAC,cAAA,CAAA;AAAiBJ,YAAAA,EAAAA,CAAGK,KAAK,CAAC,OAAA,CAAA;AAAUL,YAAAA,EAAAA,CAAGM,GAAG,CAAC,OAAA;SAAS,EAC7D,WAAA;AACE,YAAA,IAAI,CAACC,EAAE,CAACC,WAAW,GAAGR,GAAGS,GAAG,CAAC,IAAI,CAACb,YAAY,EAAE,IAAI,CAACA,YAAY,CAACc,CAAC,CAAA;YACnE,IAAI,CAACH,EAAE,CAACC,WAAW,GAAGG,iBAAiB,IAAI,EAAE,IAAI,CAACH,WAAW,CAAA;AAC7D,YAAA,IAAI,CAACD,EAAE,CAACK,QAAQ,GAAGZ,EAAAA,CAAGa,GAAG,CACvBb,EAAGc,CAAAA,KAAK,CACNd,EAAAA,CAAGa,GAAG,CACJb,EAAAA,CAAGe,KAAK,CACNf,EAAGgB,CAAAA,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACS,CAAC,EAAE,CAAA,CAAA,EACxCjB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACS,CAAC,EAAE,CACrCjB,CAAAA,EAAAA,EAAAA,CAAGgB,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACW,CAAC,EAAE,IACxCnB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACW,CAAC,EAAE,CAAA,CAAA,CAAA,CAAA,EAGzCC,uBAAwB,CAAA,IAAI,EAAE,IAAI,CAACZ,WAAW,CAACa,CAAC,CAAA,CAAA,CAAA;AAGpD,YAAA,IAAI,CAACd,EAAE,CAACe,MAAM,GAAGtB,EAAAA,CAAGK,KAAK,CAAC,CAAA,CAAA;AAC1B,YAAA,IAAI,CAACkB,GAAG,CAAC,IAAI,CAACX,QAAQ,EAAE,WAAA;AACtB,gBAAA,IAAI,CAACL,EAAE,CAACiB,UAAU,GAAGC,oBAAqB,CAAA,IAAI,EAAE,IAAI,CAAC5B,KAAK,EAAE,IAAI,CAACC,KAAK,CAAA;AACtE,gBAAA,IAAI,CAACU,WAAW,CAACa,CAAC,GAAGK,qBAAqB,IAAI,EAAE,IAAI,CAAClB,WAAW,CAACa,CAAC,EAAE,IAAI,CAACG,UAAU,EAAE,IAAA,CAAA;gBACrF,IAAI,CAACF,MAAM,GAAGK,eAAAA,CACZ,IAAI,EACJlD,eAAAA,CAAgBmD,SAAS,EACzBnD,eAAAA,CAAgBI,SAAS,CAAEa,MAAM,EACjCQ,UACA,EAAA,IAAI,CAACM,WAAW,EAChB,IAAI,CAACV,KAAK,CAAA;AAEd,aAAA,CAAA;AACA,YAAA,IAAI,CAAC+B,OAAO,CAAC,IAAI,CAACP,MAAM,CAAA;AAC1B,SAAA,CAAA;AAEF,QAAA,OAAOtB,GAAG8B,cAAc,EAAE,CAAC/B,wBAAyB,CAAA,CAACH,cAAcC,KAAOC,EAAAA,KAAAA,CAAAA;AAC5E;AACAiC,IAAAA,aAAAA,CACEtD,eAAgC,EAChCe,KAA4B,EAC5BI,YAAyB,EACzBC,KAAkB,EAClB;AACA,QAAA,MAAMmC,qBAAwB,GAAA,mBAAA;QAC9B,MAAMhC,EAAAA,GAAKR,MAAMS,QAAQ;AACzB,QAAA,MAAMgC,OAAO,IAAI;QACjB,MAAM/B,UAAAA,GAAa,IAAI,CAACnC,gBAAgB,EAAA;QACxCiC,EAAGG,CAAAA,IAAI,CAAC6B,qBAAuB,EAAA;AAAChC,YAAAA,EAAAA,CAAGI,IAAI,CAAC,cAAA,CAAA;AAAiBJ,YAAAA,EAAAA,CAAGK,KAAK,CAAC,OAAA;SAAS,EAAE,WAAA;YAC3E,IAAI5B,eAAAA,CAAgBmD,SAAS,KAAKM,gBAAkB,EAAA;AAClD,gBAAA,IAAI,CAAC3B,EAAE,CAAC4B,GAAG,GAAGnC,EAAAA,CAAGoC,GAAG,CAAC,IAAI,CAACxC,YAAY,CAACyC,GAAG,EAAEC,YAAAA,CAAaC,iCAAiC,CAAC,IAAI,EAAEF,GAAG,CAAA;gBACpG,IAAI,CAAC9B,EAAE,CAACiC,OAAO,GAAGF,aAAaG,qBAAqB,CAAC,IAAI,CAAA,CAAEC,EAAE;AAC7D,gBAAA,IAAI,CAACnC,EAAE,CAACoC,IAAI,GAAG3C,GAAGzB,GAAG,CAACyB,EAAGzB,CAAAA,GAAG,CAACyB,EAAG4C,CAAAA,GAAG,CAAC,IAAI,CAACT,GAAG,CAAClB,CAAC,CAAA,EAAGjB,GAAG4C,GAAG,CAAC,IAAI,CAACT,GAAG,CAAChB,CAAC,CAAInB,CAAAA,EAAAA,EAAAA,CAAG4C,GAAG,CAAC,IAAI,CAACT,GAAG,CAACd,CAAC,CAAA,CAAA;AACvF,gBAAA,IAAI,CAACd,EAAE,CAACsC,QAAQ,GAAGP,aAAaQ,sBAAsB,CAAC,IAAI,EAAE,IAAI,CAACH,IAAI,EAAE,IAAI,CAACH,OAAO,CAAA;AACpF,gBAAA,IAAI,CAACjC,EAAE,CAACiB,UAAU,GAAGuB,iBAAAA,CACnBtE,eAAgBmD,CAAAA,SAAS,EACzB,IAAI,EACJ5B,EAAAA,CAAGS,GAAG,CAAC,IAAI,CAACkC,IAAI,EAAEL,YAAaC,CAAAA,iCAAiC,CAAC,IAAI,CAAE7B,CAAAA,CAAC,CACxE,EAAA,IAAI,CAACb,KAAK,EACV,IAAA,CAAA;AAEF,gBAAA,IAAI,CAACgC,OAAO,CAACI,KAAKe,eAAe,CAACvE,iBAAiB,IAAI,EAAE,IAAI,CAAC0D,GAAG,EAAE,IAAI,CAACU,QAAQ,EAAE,IAAI,CAACrB,UAAU,CAAA,CAAA;aAC5F,MAAA;AACL,gBAAA,IAAI,CAACjB,EAAE,CAACC,WAAW,GAAGR,GAAGS,GAAG,CAAC,IAAI,CAACb,YAAY,EAAE,IAAI,CAACA,YAAY,CAACc,CAAC,CAAA;gBACnE,IAAI,CAACH,EAAE,CAACC,WAAW,GAAGG,iBAAiB,IAAI,EAAE,IAAI,CAACH,WAAW,CAAA;AAC7D,gBAAA,IAAI,CAACD,EAAE,CAACK,QAAQ,GAAGZ,EAAAA,CAAGa,GAAG,CACvBb,EAAGc,CAAAA,KAAK,CACNd,EAAAA,CAAGa,GAAG,CACJb,EAAAA,CAAGe,KAAK,CACNf,EAAGgB,CAAAA,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACS,CAAC,EAAE,CAAA,CAAA,EACxCjB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACS,CAAC,EAAE,CACrCjB,CAAAA,EAAAA,EAAAA,CAAGgB,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACW,CAAC,EAAE,IACxCnB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACW,CAAC,EAAE,CAAA,CAAA,CAAA,CAAA,EAGzCC,uBAAwB,CAAA,IAAI,EAAE,IAAI,CAACZ,WAAW,CAACa,CAAC,CAAA,CAAA,CAAA;AAGpD,gBAAA,IAAI,CAACd,EAAE,CAACe,MAAM,GAAGtB,EAAAA,CAAGK,KAAK,CAAC,CAAA,CAAA;AAC1B,gBAAA,IAAI,CAACkB,GAAG,CAAC,IAAI,CAACX,QAAQ,EAAE,WAAA;oBACtB,IAAI,CAACL,EAAE,CAACiB,UAAU,GAAGuB,iBACnBtE,CAAAA,eAAAA,CAAgBmD,SAAS,EACzB,IAAI,EACJ,IAAI,CAACpB,WAAW,CAACa,CAAC,EAClB,IAAI,CAACxB,KAAK,EACV,KAAA,CAAA;AAEF,oBAAA,IAAI,CAACW,WAAW,CAACa,CAAC,GAAGK,qBAAqB,IAAI,EAAE,IAAI,CAAClB,WAAW,CAACa,CAAC,EAAE,IAAI,CAACG,UAAU,EAAE,IAAA,CAAA;AACrF,oBAAA,IAAI,CAACF,MAAM,GAAGK,eACZ,CAAA,IAAI,EACJlD,eAAgBmD,CAAAA,SAAS,EACzBnD,eAAAA,CAAgBI,SAAS,CAAEa,MAAM,EACjCQ,UACA,EAAA,IAAI,CAACM,WAAW,CAAA;AAEpB,iBAAA,CAAA;AACA,gBAAA,IAAI,CAACqB,OAAO,CAAC,IAAI,CAACP,MAAM,CAAA;AAC1B;AACF,SAAA,CAAA;AACA,QAAA,OAAOtB,GAAG8B,cAAc,EAAE,CAACE,qBAAAA,CAAsB,CAACpC,YAAcC,EAAAA,KAAAA,CAAAA;AAClE;AACAoD,IAAAA,kBAAAA,CAAmB5E,gBAAiC,EAAE;QACpD,OAAO,IAAA;AACT;qBAEA2E,eACEvE,CAAAA,eAAgC,EAChCe,KAA4B,EAC5B0D,MAAmB,EACnB7B,CAAc,EACd8B,IAAiB,EACjB;AACA,QAAA,MAAMC,uBAA0B,GAAA,uBAAA;QAChC,MAAMpD,EAAAA,GAAKR,MAAMS,QAAQ;QACzBD,EAAGG,CAAAA,IAAI,CAACiD,uBAAyB,EAAA;AAACpD,YAAAA,EAAAA,CAAGqD,IAAI,CAAC,QAAA,CAAA;AAAWrD,YAAAA,EAAAA,CAAGK,KAAK,CAAC,GAAA,CAAA;AAAML,YAAAA,EAAAA,CAAGK,KAAK,CAAC,MAAA;SAAQ,EAAE,WAAA;AACrF,YAAA,IAAI,CAACwB,OAAO,CACV7B,EAAAA,CAAGsD,KAAK,CACNtD,EAAGuD,CAAAA,yBAAyB,CAC1BjB,YAAAA,CAAa9D,YAAY,CAAC,IAAI,CAC9B,EAAA,IAAI,CAAC0E,MAAM,EACXxB,oBAAAA,CAAqB,IAAI,EAAE,IAAI,CAACL,CAAC,EAAE,IAAI,CAAC8B,IAAI,EAAE,QAEhD,CACA,EAAA,CAAA,CAAA,CAAA;AAGN,SAAA,CAAA;AACA,QAAA,OAAOnD,GAAG8B,cAAc,EAAE,CAACsB,uBAAwB,CAAA,CAACF,QAAQ7B,CAAG8B,EAAAA,IAAAA,CAAAA;AACjE;AACA,qBACAK,kBAAAA,CACE/E,eAAgC,EAChCe,KAA4B,EAC5B0D,MAAmB,EACnBpD,KAAkB,EAClBuB,CAAc,EACd8B,IAAiB,EACjB;AACA,QAAA,MAAMM,0BAA6B,GAAA,0BAAA;QACnC,MAAMzD,EAAAA,GAAKR,MAAMS,QAAQ;QACzBD,EAAGG,CAAAA,IAAI,CACLsD,0BACA,EAAA;AAACzD,YAAAA,EAAAA,CAAGI,IAAI,CAAC,QAAA,CAAA;AAAWJ,YAAAA,EAAAA,CAAGM,GAAG,CAAC,OAAA,CAAA;AAAUN,YAAAA,EAAAA,CAAGK,KAAK,CAAC,GAAA,CAAA;AAAML,YAAAA,EAAAA,CAAGK,KAAK,CAAC,MAAA;SAAQ,EACrE,WAAA;AACE,YAAA,IAAI,CAACE,EAAE,CAACsC,QAAQ,GAAGnB,oBAAqB,CAAA,IAAI,EAAE,IAAI,CAACL,CAAC,EAAE,IAAI,CAAC8B,IAAI,EAAE,IAAA,CAAA;AACjE,YAAA,IAAI1E,eAAgBI,CAAAA,SAAS,CAAE6E,gBAAgB,EAAI,EAAA;AACjD,gBAAA,IAAI,CAAC7B,OAAO,CACV7B,EAAAA,CAAGsD,KAAK,CACNtD,EAAG2D,CAAAA,8BAA8B,CAC/BrB,YAAAA,CAAa9D,YAAY,CAAC,IAAI,CAAA,EAC9B,IAAI,CAAC0E,MAAM,CAACR,EAAE,EACd,IAAI,CAAC5C,KAAK,EACV,IAAI,CAAC+C,QAAQ,CAAA,EAEf,CACA,EAAA,CAAA,CAAA,CAAA;aAGC,MAAA;gBACL,IAAI,CAAChB,OAAO,CACV7B,EAAGsD,CAAAA,KAAK,CACNtD,EAAGuD,CAAAA,yBAAyB,CAACjB,YAAAA,CAAa9D,YAAY,CAAC,IAAI,CAAG,EAAA,IAAI,CAAC0E,MAAM,CAACR,EAAE,EAAE,IAAI,CAACG,QAAQ,CAAA,EAC3F,CACA,EAAA,CAAA,CAAA,CAAA;AAGN;AACF,SAAA,CAAA;QAEF,OAAO7C,EAAAA,CAAG8B,cAAc,EAAE,CAAC2B,2BAA2B,CAACP,MAAAA,EAAQpD,OAAOuB,CAAG8B,EAAAA,IAAAA,CAAAA;AAC3E;AACF;;;;"}
|
package/dist/shadow/pcss.js
CHANGED
|
@@ -13,6 +13,7 @@ import { getDevice } from '../app/api.js';
|
|
|
13
13
|
_filterSampleCount;
|
|
14
14
|
_maxFilterRadius;
|
|
15
15
|
_temporalJitter;
|
|
16
|
+
_physicalLightRadius;
|
|
16
17
|
constructor(lightRadius, blockerSampleCount, filterSampleCount, maxFilterRadius, temporalJitter){
|
|
17
18
|
super();
|
|
18
19
|
this._lightRadius = lightRadius ?? 8;
|
|
@@ -20,6 +21,22 @@ import { getDevice } from '../app/api.js';
|
|
|
20
21
|
this._filterSampleCount = filterSampleCount ?? 32;
|
|
21
22
|
this._maxFilterRadius = maxFilterRadius ?? 32;
|
|
22
23
|
this._temporalJitter = temporalJitter ?? true;
|
|
24
|
+
this._physicalLightRadius = 0;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Source radius in world units, overriding {@link lightRadius} when positive.
|
|
28
|
+
*
|
|
29
|
+
* @remarks
|
|
30
|
+
* {@link lightRadius} is a fixed size in shadow map texels, so the penumbra it
|
|
31
|
+
* produces does not follow the light's actual size or the receiver's distance
|
|
32
|
+
* from it. A physical radius is converted per pixel instead (cube maps only,
|
|
33
|
+
* i.e. point and rect lights); the shadow mapper sets it from a rect light's
|
|
34
|
+
* size. It travels to the shader as a negative `lightRadius`.
|
|
35
|
+
*/ get physicalLightRadius() {
|
|
36
|
+
return this._physicalLightRadius;
|
|
37
|
+
}
|
|
38
|
+
set physicalLightRadius(val) {
|
|
39
|
+
this._physicalLightRadius = Math.max(0, Number(val) || 0);
|
|
23
40
|
}
|
|
24
41
|
get lightRadius() {
|
|
25
42
|
return this._lightRadius;
|
|
@@ -86,14 +103,11 @@ import { getDevice } from '../app/api.js';
|
|
|
86
103
|
}
|
|
87
104
|
getShadowMapColorFormat(_shadowMapParams) {
|
|
88
105
|
const device = getDevice();
|
|
89
|
-
if (device.type === 'webgl') {
|
|
90
|
-
return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : device.getDeviceCaps().textureCaps.supportFloatColorBuffer ? 'rgba32f' : 'rgba8unorm';
|
|
91
|
-
}
|
|
92
106
|
return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'r16f' : device.getDeviceCaps().textureCaps.supportFloatColorBuffer ? 'r32f' : 'rgba8unorm';
|
|
93
107
|
}
|
|
94
108
|
getParams(out) {
|
|
95
109
|
out = out ?? new Vector4();
|
|
96
|
-
out.setXYZW(this._lightRadius, this._blockerSampleCount, this._filterSampleCount, this._maxFilterRadius);
|
|
110
|
+
out.setXYZW(this._physicalLightRadius > 0 ? -this._physicalLightRadius : this._lightRadius, this._blockerSampleCount, this._filterSampleCount, this._maxFilterRadius);
|
|
97
111
|
return out;
|
|
98
112
|
}
|
|
99
113
|
getShadowMapDepthFormat(_shadowMapParams) {
|
|
@@ -125,20 +139,29 @@ import { getDevice } from '../app/api.js';
|
|
|
125
139
|
});
|
|
126
140
|
return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split);
|
|
127
141
|
}
|
|
128
|
-
computeShadow(shadowMapParams, scope, shadowVertex, NdotL) {
|
|
129
|
-
|
|
142
|
+
computeShadow(shadowMapParams, scope, shadowVertex, NdotL, worldNormal) {
|
|
143
|
+
// Only the cube branch reads the normal, so only it gets the extra parameter.
|
|
144
|
+
const withNormal = !!worldNormal && shadowMapParams.lightType === LIGHT_TYPE_POINT;
|
|
145
|
+
const funcNameComputeShadow = withNormal ? 'lib_computeShadow_N' : 'lib_computeShadow';
|
|
130
146
|
const pb = scope.$builder;
|
|
131
147
|
const that = this;
|
|
132
148
|
pb.func(funcNameComputeShadow, [
|
|
133
149
|
pb.vec4('shadowVertex'),
|
|
134
|
-
pb.float('NdotL')
|
|
150
|
+
pb.float('NdotL'),
|
|
151
|
+
...withNormal ? [
|
|
152
|
+
pb.vec3('worldNormal')
|
|
153
|
+
] : []
|
|
135
154
|
], function() {
|
|
136
155
|
if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {
|
|
137
156
|
this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);
|
|
138
157
|
this.$l.distance = pb.div(pb.length(this.dir), ShaderHelper.getLightPositionAndRangeForShadow(this).w);
|
|
139
158
|
this.$l.shadowBias = computeShadowBias(shadowMapParams.lightType, this, this.distance, this.NdotL, true);
|
|
140
159
|
this.$l.shadowCoord = pb.vec4(this.dir, pb.sub(this.distance, this.shadowBias));
|
|
141
|
-
this.$return(filterShadowPCSS(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.shadowCoord,
|
|
160
|
+
this.$return(filterShadowPCSS(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.shadowCoord, // The receiver's plane, so wide kernels compare each tap against the
|
|
161
|
+
// receiver's own depth there - see pointReceiverPlaneDepth. The
|
|
162
|
+
// geometric normal rather than screen derivatives: no uniform control
|
|
163
|
+
// flow requirement, and no mixing across silhouettes.
|
|
164
|
+
withNormal ? this.worldNormal : undefined, undefined, that._temporalJitter));
|
|
142
165
|
}
|
|
143
166
|
this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);
|
|
144
167
|
this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);
|
|
@@ -160,7 +183,9 @@ import { getDevice } from '../app/api.js';
|
|
|
160
183
|
});
|
|
161
184
|
this.$return(this.shadow);
|
|
162
185
|
});
|
|
163
|
-
return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL
|
|
186
|
+
return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL, ...withNormal ? [
|
|
187
|
+
worldNormal
|
|
188
|
+
] : []);
|
|
164
189
|
}
|
|
165
190
|
useNativeShadowMap(_shadowMapParams) {
|
|
166
191
|
return false;
|
package/dist/shadow/pcss.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcss.js","sources":["../../src/shadow/pcss.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, TextureFormat } from '@zephyr3d/device';\r\nimport { getPackedShadowMapClearColor, getShadowMapFarthestDepth, ShadowImpl } from './shadow_impl';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport {\r\n applyShadowDepthBias,\r\n computeReceiverPlaneDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowPCSS,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport class PCSS extends ShadowImpl {\r\n protected _lightRadius: number;\r\n protected _blockerSampleCount: number;\r\n protected _filterSampleCount: number;\r\n protected _maxFilterRadius: number;\r\n protected _temporalJitter: boolean;\r\n constructor(\r\n lightRadius?: number,\r\n blockerSampleCount?: number,\r\n filterSampleCount?: number,\r\n maxFilterRadius?: number,\r\n temporalJitter?: boolean\r\n ) {\r\n super();\r\n this._lightRadius = lightRadius ?? 8;\r\n this._blockerSampleCount = blockerSampleCount ?? 24;\r\n this._filterSampleCount = filterSampleCount ?? 32;\r\n this._maxFilterRadius = maxFilterRadius ?? 32;\r\n this._temporalJitter = temporalJitter ?? true;\r\n }\r\n get lightRadius() {\r\n return this._lightRadius;\r\n }\r\n set lightRadius(val) {\r\n this._lightRadius = Math.max(0, Number(val) || 0);\r\n }\r\n get blockerSampleCount() {\r\n return this._blockerSampleCount;\r\n }\r\n set blockerSampleCount(val) {\r\n this._blockerSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n }\r\n get filterSampleCount() {\r\n return this._filterSampleCount;\r\n }\r\n set filterSampleCount(val) {\r\n this._filterSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n }\r\n get maxFilterRadius() {\r\n return this._maxFilterRadius;\r\n }\r\n set maxFilterRadius(val) {\r\n this._maxFilterRadius = Math.max(1, Number(val) || 1);\r\n }\r\n get temporalJitter() {\r\n return this._temporalJitter;\r\n }\r\n set temporalJitter(val) {\r\n this._temporalJitter = !!val;\r\n }\r\n getType() {\r\n return 'pcss' as const;\r\n }\r\n dispose() {}\r\n resourceDirty() {\r\n return false;\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return this._lightRadius > 0 ? Math.ceil(Math.max(this._lightRadius, this._maxFilterRadius) + 2) : 0;\r\n }\r\n getShadowMapClearColor(shadowMapParams: ShadowMapParams) {\r\n const colorAttachment = shadowMapParams.shadowMapFramebuffer?.getColorAttachments()[0];\r\n // Empty texels must read as \"farthest\" (no blocker): under reverse-Z\r\n // that is 0 for the device-encoded directional/rect maps, while the\r\n // linear point/spot encodings keep 1 = far.\r\n const farthest = getShadowMapFarthestDepth(shadowMapParams.lightType);\r\n return colorAttachment\r\n ? colorAttachment.format === 'rgba8unorm'\r\n ? getPackedShadowMapClearColor(shadowMapParams.lightType)\r\n : new Vector4(farthest, farthest, farthest, 1)\r\n : null;\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0] as ShadowMapType;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler = shadowMapParams.shadowMap?.getDefaultSampler(false) ?? null;\r\n }\r\n postRenderShadowMap() {}\r\n getDepthScale() {\r\n return 1;\r\n }\r\n setDepthScale(_val: number) {}\r\n getShaderHash() {\r\n return `${Number(this._temporalJitter)}`;\r\n }\r\n getShadowMapColorFormat(_shadowMapParams: ShadowMapParams): Nullable<TextureFormat> {\r\n const device = getDevice();\r\n if (device.type === 'webgl') {\r\n return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? 'rgba32f'\r\n : 'rgba8unorm';\r\n }\r\n return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'r16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? 'r32f'\r\n : 'rgba8unorm';\r\n }\r\n getParams(out: Vector4) {\r\n out = out ?? new Vector4();\r\n out.setXYZW(this._lightRadius, this._blockerSampleCount, this._filterSampleCount, this._maxFilterRadius);\r\n return out;\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams): TextureFormat {\r\n return this.preferredShadowMapDepthFormat();\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n }\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 const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias,\r\n this.split,\r\n that._temporalJitter,\r\n shadowMapParams.numShadowCascades\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$l.shadowCoord = pb.vec4(this.dir, pb.sub(this.distance, this.shadowBias));\r\n this.$return(\r\n filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n undefined,\r\n undefined,\r\n that._temporalJitter\r\n )\r\n );\r\n }\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(\r\n this,\r\n this.shadowCoord.z,\r\n this.nearFar\r\n );\r\n }\r\n this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\r\n this.$if(this.inShadow, function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n true\r\n );\r\n } else {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n }\r\n this.shadowCoord.z = applyShadowDepthBias(\r\n this,\r\n this.shadowCoord.z,\r\n this.shadowBias,\r\n shadowMapParams.lightType !== LIGHT_TYPE_SPOT\r\n );\r\n this.shadow = filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias,\r\n undefined,\r\n that._temporalJitter\r\n );\r\n });\r\n this.$return(this.shadow);\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return false;\r\n }\r\n /** @internal */\r\n samplePointShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = 'lib_samplePointShadowMapPCSS';\r\n const pb = scope.$builder;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCSS","ShadowImpl","_lightRadius","_blockerSampleCount","_filterSampleCount","_maxFilterRadius","_temporalJitter","lightRadius","blockerSampleCount","filterSampleCount","maxFilterRadius","temporalJitter","val","Math","max","Number","min","getType","dispose","resourceDirty","getShadowMapBorder","_shadowMapParams","ceil","getShadowMapClearColor","shadowMapParams","colorAttachment","shadowMapFramebuffer","getColorAttachments","farthest","getShadowMapFarthestDepth","lightType","format","getPackedShadowMapClearColor","Vector4","getShadowMap","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","_val","getShaderHash","getShadowMapColorFormat","device","getDevice","type","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","supportFloatColorBuffer","getParams","out","setXYZW","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","that","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","receiverPlaneDepthBias","computeReceiverPlaneDepthBias","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCSS","numShadowCascades","$return","getGlobalScope","computeShadow","funcNameComputeShadow","LIGHT_TYPE_POINT","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","distance","length","computeShadowBias","undefined","LIGHT_TYPE_SPOT","nearFar","getShadowCameraParams","xy","nonLinearDepthToLinearNormalized","useNativeShadowMap","samplePointShadowMap","coords","bias","funcNameSampleShadowMap","vec3","floatDepthTexture","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pcss.js","sources":["../../src/shadow/pcss.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, TextureFormat } from '@zephyr3d/device';\r\nimport { getPackedShadowMapClearColor, getShadowMapFarthestDepth, ShadowImpl } from './shadow_impl';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport {\r\n applyShadowDepthBias,\r\n computeReceiverPlaneDepthBias,\r\n computeShadowMapDepth,\r\n filterShadowPCSS,\r\n ndcToShadowCoord,\r\n shadowCoordDepthInRange\r\n} from '../shaders/shadow';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport class PCSS extends ShadowImpl {\r\n protected _lightRadius: number;\r\n protected _blockerSampleCount: number;\r\n protected _filterSampleCount: number;\r\n protected _maxFilterRadius: number;\r\n protected _temporalJitter: boolean;\r\n protected _physicalLightRadius: number;\r\n constructor(\r\n lightRadius?: number,\r\n blockerSampleCount?: number,\r\n filterSampleCount?: number,\r\n maxFilterRadius?: number,\r\n temporalJitter?: boolean\r\n ) {\r\n super();\r\n this._lightRadius = lightRadius ?? 8;\r\n this._blockerSampleCount = blockerSampleCount ?? 24;\r\n this._filterSampleCount = filterSampleCount ?? 32;\r\n this._maxFilterRadius = maxFilterRadius ?? 32;\r\n this._temporalJitter = temporalJitter ?? true;\r\n this._physicalLightRadius = 0;\r\n }\r\n /**\r\n * Source radius in world units, overriding {@link lightRadius} when positive.\r\n *\r\n * @remarks\r\n * {@link lightRadius} is a fixed size in shadow map texels, so the penumbra it\r\n * produces does not follow the light's actual size or the receiver's distance\r\n * from it. A physical radius is converted per pixel instead (cube maps only,\r\n * i.e. point and rect lights); the shadow mapper sets it from a rect light's\r\n * size. It travels to the shader as a negative `lightRadius`.\r\n */\r\n get physicalLightRadius() {\r\n return this._physicalLightRadius;\r\n }\r\n set physicalLightRadius(val) {\r\n this._physicalLightRadius = Math.max(0, Number(val) || 0);\r\n }\r\n get lightRadius() {\r\n return this._lightRadius;\r\n }\r\n set lightRadius(val) {\r\n this._lightRadius = Math.max(0, Number(val) || 0);\r\n }\r\n get blockerSampleCount() {\r\n return this._blockerSampleCount;\r\n }\r\n set blockerSampleCount(val) {\r\n this._blockerSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n }\r\n get filterSampleCount() {\r\n return this._filterSampleCount;\r\n }\r\n set filterSampleCount(val) {\r\n this._filterSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n }\r\n get maxFilterRadius() {\r\n return this._maxFilterRadius;\r\n }\r\n set maxFilterRadius(val) {\r\n this._maxFilterRadius = Math.max(1, Number(val) || 1);\r\n }\r\n get temporalJitter() {\r\n return this._temporalJitter;\r\n }\r\n set temporalJitter(val) {\r\n this._temporalJitter = !!val;\r\n }\r\n getType() {\r\n return 'pcss' as const;\r\n }\r\n dispose() {}\r\n resourceDirty() {\r\n return false;\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return this._lightRadius > 0 ? Math.ceil(Math.max(this._lightRadius, this._maxFilterRadius) + 2) : 0;\r\n }\r\n getShadowMapClearColor(shadowMapParams: ShadowMapParams) {\r\n const colorAttachment = shadowMapParams.shadowMapFramebuffer?.getColorAttachments()[0];\r\n // Empty texels must read as \"farthest\" (no blocker): under reverse-Z\r\n // that is 0 for the device-encoded directional/rect maps, while the\r\n // linear point/spot encodings keep 1 = far.\r\n const farthest = getShadowMapFarthestDepth(shadowMapParams.lightType);\r\n return colorAttachment\r\n ? colorAttachment.format === 'rgba8unorm'\r\n ? getPackedShadowMapClearColor(shadowMapParams.lightType)\r\n : new Vector4(farthest, farthest, farthest, 1)\r\n : null;\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0] as ShadowMapType;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler = shadowMapParams.shadowMap?.getDefaultSampler(false) ?? null;\r\n }\r\n postRenderShadowMap() {}\r\n getDepthScale() {\r\n return 1;\r\n }\r\n setDepthScale(_val: number) {}\r\n getShaderHash() {\r\n return `${Number(this._temporalJitter)}`;\r\n }\r\n getShadowMapColorFormat(_shadowMapParams: ShadowMapParams): Nullable<TextureFormat> {\r\n const device = getDevice();\r\n return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'r16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? 'r32f'\r\n : 'rgba8unorm';\r\n }\r\n getParams(out: Vector4) {\r\n out = out ?? new Vector4();\r\n out.setXYZW(\r\n this._physicalLightRadius > 0 ? -this._physicalLightRadius : this._lightRadius,\r\n this._blockerSampleCount,\r\n this._filterSampleCount,\r\n this._maxFilterRadius\r\n );\r\n return out;\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams): TextureFormat {\r\n return this.preferredShadowMapDepthFormat();\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n }\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 const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = applyShadowDepthBias(this, this.shadowCoord.z, this.shadowBias, true);\r\n this.shadow = filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias,\r\n this.split,\r\n that._temporalJitter,\r\n shadowMapParams.numShadowCascades\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n worldNormal?: PBShaderExp\r\n ) {\r\n // Only the cube branch reads the normal, so only it gets the extra parameter.\r\n const withNormal = !!worldNormal && shadowMapParams.lightType === LIGHT_TYPE_POINT;\r\n const funcNameComputeShadow = withNormal ? 'lib_computeShadow_N' : 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameComputeShadow,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), ...(withNormal ? [pb.vec3('worldNormal')] : [])],\r\n function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(\r\n this.shadowVertex.xyz,\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).xyz\r\n );\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$l.shadowCoord = pb.vec4(this.dir, pb.sub(this.distance, this.shadowBias));\r\n this.$return(\r\n filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n // The receiver's plane, so wide kernels compare each tap against the\r\n // receiver's own depth there - see pointReceiverPlaneDepth. The\r\n // geometric normal rather than screen derivatives: no uniform control\r\n // flow requirement, and no mixing across silhouettes.\r\n withNormal ? this.worldNormal : undefined,\r\n undefined,\r\n that._temporalJitter\r\n )\r\n );\r\n }\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = ndcToShadowCoord(this, this.shadowCoord);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n shadowCoordDepthInRange(this, this.shadowCoord.z)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(\r\n this,\r\n this.shadowCoord.z,\r\n this.nearFar\r\n );\r\n }\r\n this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\r\n this.$if(this.inShadow, function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n true\r\n );\r\n } else {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n }\r\n this.shadowCoord.z = applyShadowDepthBias(\r\n this,\r\n this.shadowCoord.z,\r\n this.shadowBias,\r\n shadowMapParams.lightType !== LIGHT_TYPE_SPOT\r\n );\r\n this.shadow = filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias,\r\n undefined,\r\n that._temporalJitter\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb\r\n .getGlobalScope()\r\n [funcNameComputeShadow](shadowVertex, NdotL, ...(withNormal ? [worldNormal!] : [])) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return false;\r\n }\r\n /** @internal */\r\n samplePointShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = 'lib_samplePointShadowMapPCSS';\r\n const pb = scope.$builder;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCSS","ShadowImpl","_lightRadius","_blockerSampleCount","_filterSampleCount","_maxFilterRadius","_temporalJitter","_physicalLightRadius","lightRadius","blockerSampleCount","filterSampleCount","maxFilterRadius","temporalJitter","physicalLightRadius","val","Math","max","Number","min","getType","dispose","resourceDirty","getShadowMapBorder","_shadowMapParams","ceil","getShadowMapClearColor","shadowMapParams","colorAttachment","shadowMapFramebuffer","getColorAttachments","farthest","getShadowMapFarthestDepth","lightType","format","getPackedShadowMapClearColor","Vector4","getShadowMap","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","_val","getShaderHash","getShadowMapColorFormat","device","getDevice","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","supportFloatColorBuffer","getParams","out","setXYZW","getShadowMapDepthFormat","preferredShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","that","func","vec4","float","int","$l","shadowCoord","div","w","ndcToShadowCoord","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","shadowCoordDepthInRange","z","shadow","receiverPlaneDepthBias","computeReceiverPlaneDepthBias","$if","shadowBias","computeShadowBiasCSM","applyShadowDepthBias","filterShadowPCSS","numShadowCascades","$return","getGlobalScope","computeShadow","worldNormal","withNormal","LIGHT_TYPE_POINT","funcNameComputeShadow","vec3","dir","sub","xyz","ShaderHelper","getLightPositionAndRangeForShadow","distance","length","computeShadowBias","undefined","LIGHT_TYPE_SPOT","nearFar","getShadowCameraParams","xy","nonLinearDepthToLinearNormalized","useNativeShadowMap","samplePointShadowMap","coords","bias","funcNameSampleShadowMap","floatDepthTexture","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step"],"mappings":";;;;;;;;;AAmBA,iBACO,MAAMA,IAAaC,SAAAA,UAAAA,CAAAA;IACdC,YAAqB;IACrBC,mBAA4B;IAC5BC,kBAA2B;IAC3BC,gBAAyB;IACzBC,eAAyB;IACzBC,oBAA6B;IACvC,WACEC,CAAAA,WAAoB,EACpBC,kBAA2B,EAC3BC,iBAA0B,EAC1BC,eAAwB,EACxBC,cAAwB,CACxB;QACA,KAAK,EAAA;QACL,IAAI,CAACV,YAAY,GAAGM,WAAe,IAAA,CAAA;QACnC,IAAI,CAACL,mBAAmB,GAAGM,kBAAsB,IAAA,EAAA;QACjD,IAAI,CAACL,kBAAkB,GAAGM,iBAAqB,IAAA,EAAA;QAC/C,IAAI,CAACL,gBAAgB,GAAGM,eAAmB,IAAA,EAAA;QAC3C,IAAI,CAACL,eAAe,GAAGM,cAAkB,IAAA,IAAA;QACzC,IAAI,CAACL,oBAAoB,GAAG,CAAA;AAC9B;AACA;;;;;;;;;AASC,MACD,IAAIM,mBAAsB,GAAA;QACxB,OAAO,IAAI,CAACN,oBAAoB;AAClC;IACA,IAAIM,mBAAAA,CAAoBC,GAAG,EAAE;QAC3B,IAAI,CAACP,oBAAoB,GAAGQ,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGC,OAAOH,GAAQ,CAAA,IAAA,CAAA,CAAA;AACzD;AACA,IAAA,IAAIN,WAAc,GAAA;QAChB,OAAO,IAAI,CAACN,YAAY;AAC1B;IACA,IAAIM,WAAAA,CAAYM,GAAG,EAAE;QACnB,IAAI,CAACZ,YAAY,GAAGa,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGC,OAAOH,GAAQ,CAAA,IAAA,CAAA,CAAA;AACjD;AACA,IAAA,IAAIL,kBAAqB,GAAA;QACvB,OAAO,IAAI,CAACN,mBAAmB;AACjC;IACA,IAAIM,kBAAAA,CAAmBK,GAAG,EAAE;AAC1B,QAAA,IAAI,CAACX,mBAAmB,GAAGY,IAAAA,CAAKG,GAAG,CAACH,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGC,MAAOH,CAAAA,GAAAA,CAAAA,IAAQ,CAAI,CAAA,EAAA,EAAA,CAAA;AACrE;AACA,IAAA,IAAIJ,iBAAoB,GAAA;QACtB,OAAO,IAAI,CAACN,kBAAkB;AAChC;IACA,IAAIM,iBAAAA,CAAkBI,GAAG,EAAE;AACzB,QAAA,IAAI,CAACV,kBAAkB,GAAGW,IAAAA,CAAKG,GAAG,CAACH,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGC,MAAOH,CAAAA,GAAAA,CAAAA,IAAQ,CAAI,CAAA,EAAA,EAAA,CAAA;AACpE;AACA,IAAA,IAAIH,eAAkB,GAAA;QACpB,OAAO,IAAI,CAACN,gBAAgB;AAC9B;IACA,IAAIM,eAAAA,CAAgBG,GAAG,EAAE;QACvB,IAAI,CAACT,gBAAgB,GAAGU,IAAAA,CAAKC,GAAG,CAAC,CAAA,EAAGC,OAAOH,GAAQ,CAAA,IAAA,CAAA,CAAA;AACrD;AACA,IAAA,IAAIF,cAAiB,GAAA;QACnB,OAAO,IAAI,CAACN,eAAe;AAC7B;IACA,IAAIM,cAAAA,CAAeE,GAAG,EAAE;AACtB,QAAA,IAAI,CAACR,eAAe,GAAG,CAAC,CAACQ,GAAAA;AAC3B;IACAK,OAAU,GAAA;QACR,OAAO,MAAA;AACT;AACAC,IAAAA,OAAAA,GAAU;IACVC,aAAgB,GAAA;QACd,OAAO,KAAA;AACT;AACAC,IAAAA,kBAAAA,CAAmBC,gBAAiC,EAAE;AACpD,QAAA,OAAO,IAAI,CAACrB,YAAY,GAAG,CAAIa,GAAAA,IAAAA,CAAKS,IAAI,CAACT,IAAAA,CAAKC,GAAG,CAAC,IAAI,CAACd,YAAY,EAAE,IAAI,CAACG,gBAAgB,IAAI,CAAK,CAAA,GAAA,CAAA;AACrG;AACAoB,IAAAA,sBAAAA,CAAuBC,eAAgC,EAAE;AACvD,QAAA,MAAMC,kBAAkBD,eAAgBE,CAAAA,oBAAoB,EAAEC,mBAAAA,EAAqB,CAAC,CAAE,CAAA;;;;QAItF,MAAMC,QAAAA,GAAWC,yBAA0BL,CAAAA,eAAAA,CAAgBM,SAAS,CAAA;AACpE,QAAA,OAAOL,eACHA,GAAAA,eAAAA,CAAgBM,MAAM,KAAK,eACzBC,4BAA6BR,CAAAA,eAAAA,CAAgBM,SAAS,CAAA,GACtD,IAAIG,OAAAA,CAAQL,QAAUA,EAAAA,QAAAA,EAAUA,UAAU,CAC5C,CAAA,GAAA,IAAA;AACN;AACAM,IAAAA,YAAAA,CAAaV,eAAgC,EAAE;AAC7C,QAAA,OAAOA,gBAAgBE,oBAAoB,CAAEC,mBAAmB,EAAE,CAAC,CAAE,CAAA;AACvE;AACAQ,IAAAA,iBAAAA,CAAkBX,eAAgC,EAAE;AAClDA,QAAAA,eAAAA,CAAgBY,SAAS,GAAG,IAAI,CAACF,YAAY,CAACV,eAAAA,CAAAA;AAC9CA,QAAAA,eAAAA,CAAgBa,gBAAgB,GAAGb,eAAAA,CAAgBY,SAAS,EAAEE,kBAAkB,KAAU,CAAA,IAAA,IAAA;AAC5F;AACAC,IAAAA,mBAAAA,GAAsB;IACtBC,aAAgB,GAAA;QACd,OAAO,CAAA;AACT;IACAC,aAAcC,CAAAA,IAAY,EAAE;IAC5BC,aAAgB,GAAA;AACd,QAAA,OAAO,CAAG5B,EAAAA,MAAAA,CAAO,IAAI,CAACX,eAAe,CAAG,CAAA,CAAA;AAC1C;AACAwC,IAAAA,uBAAAA,CAAwBvB,gBAAiC,EAA2B;AAClF,QAAA,MAAMwB,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,OAAOD,MAAOE,CAAAA,aAAa,EAAGC,CAAAA,WAAW,CAACC,2BAA2B,GACjE,MACAJ,GAAAA,MAAAA,CAAOE,aAAa,EAAGC,CAAAA,WAAW,CAACE,uBAAuB,GACxD,MACA,GAAA,YAAA;AACR;AACAC,IAAAA,SAAAA,CAAUC,GAAY,EAAE;AACtBA,QAAAA,GAAAA,GAAMA,OAAO,IAAInB,OAAAA,EAAAA;QACjBmB,GAAIC,CAAAA,OAAO,CACT,IAAI,CAAChD,oBAAoB,GAAG,CAAA,GAAI,CAAC,IAAI,CAACA,oBAAoB,GAAG,IAAI,CAACL,YAAY,EAC9E,IAAI,CAACC,mBAAmB,EACxB,IAAI,CAACC,kBAAkB,EACvB,IAAI,CAACC,gBAAgB,CAAA;QAEvB,OAAOiD,GAAAA;AACT;AACAE,IAAAA,uBAAAA,CAAwBjC,gBAAiC,EAAiB;QACxE,OAAO,IAAI,CAACkC,6BAA6B,EAAA;AAC3C;AACAC,IAAAA,qBAAAA,CACEhC,eAAgC,EAChCiC,KAA4B,EAC5BC,QAAqB,EACrB;AACA,QAAA,OAAOF,sBAAsBC,KAAOC,EAAAA,QAAAA,EAAUlC,eAAgBY,CAAAA,SAAS,CAAEL,MAAM,CAAA;AACjF;IACA4B,gBACEnC,CAAAA,eAAgC,EAChCiC,KAA4B,EAC5BG,YAAyB,EACzBC,KAAkB,EAClBC,KAAkB,EAClB;AACA,QAAA,MAAMC,wBAA2B,GAAA,sBAAA;QACjC,MAAMC,EAAAA,GAAKP,MAAMQ,QAAQ;AACzB,QAAA,MAAMC,OAAO,IAAI;QACjBF,EAAGG,CAAAA,IAAI,CACLJ,wBACA,EAAA;AAACC,YAAAA,EAAAA,CAAGI,IAAI,CAAC,cAAA,CAAA;AAAiBJ,YAAAA,EAAAA,CAAGK,KAAK,CAAC,OAAA,CAAA;AAAUL,YAAAA,EAAAA,CAAGM,GAAG,CAAC,OAAA;SAAS,EAC7D,WAAA;AACE,YAAA,IAAI,CAACC,EAAE,CAACC,WAAW,GAAGR,GAAGS,GAAG,CAAC,IAAI,CAACb,YAAY,EAAE,IAAI,CAACA,YAAY,CAACc,CAAC,CAAA;YACnE,IAAI,CAACH,EAAE,CAACC,WAAW,GAAGG,iBAAiB,IAAI,EAAE,IAAI,CAACH,WAAW,CAAA;AAC7D,YAAA,IAAI,CAACD,EAAE,CAACK,QAAQ,GAAGZ,EAAAA,CAAGa,GAAG,CACvBb,EAAGc,CAAAA,KAAK,CACNd,EAAAA,CAAGa,GAAG,CACJb,EAAAA,CAAGe,KAAK,CACNf,EAAGgB,CAAAA,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACS,CAAC,EAAE,CAAA,CAAA,EACxCjB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACS,CAAC,EAAE,CACrCjB,CAAAA,EAAAA,EAAAA,CAAGgB,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACW,CAAC,EAAE,IACxCnB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACW,CAAC,EAAE,CAAA,CAAA,CAAA,CAAA,EAGzCC,uBAAwB,CAAA,IAAI,EAAE,IAAI,CAACZ,WAAW,CAACa,CAAC,CAAA,CAAA,CAAA;AAGpD,YAAA,IAAI,CAACd,EAAE,CAACe,MAAM,GAAGtB,EAAAA,CAAGK,KAAK,CAAC,CAAA,CAAA;YAC1B,IAAI,CAACE,EAAE,CAACgB,sBAAsB,GAAGC,8BAA8B,IAAI,EAAE,IAAI,CAAChB,WAAW,CAAA;AACrF,YAAA,IAAI,CAACiB,GAAG,CAAC,IAAI,CAACb,QAAQ,EAAE,WAAA;AACtB,gBAAA,IAAI,CAACL,EAAE,CAACmB,UAAU,GAAGC,oBAAqB,CAAA,IAAI,EAAE,IAAI,CAAC9B,KAAK,EAAE,IAAI,CAACC,KAAK,CAAA;AACtE,gBAAA,IAAI,CAACU,WAAW,CAACa,CAAC,GAAGO,qBAAqB,IAAI,EAAE,IAAI,CAACpB,WAAW,CAACa,CAAC,EAAE,IAAI,CAACK,UAAU,EAAE,IAAA,CAAA;AACrF,gBAAA,IAAI,CAACJ,MAAM,GAAGO,gBAAAA,CACZ,IAAI,EACJrE,eAAgBM,CAAAA,SAAS,EACzBN,eAAAA,CAAgBY,SAAS,CAAEL,MAAM,EACjC,IAAI,CAACyC,WAAW,EAChB,IAAI,CAACe,sBAAsB,EAC3B,IAAI,CAACzB,KAAK,EACVI,IAAAA,CAAK9D,eAAe,EACpBoB,gBAAgBsE,iBAAiB,CAAA;AAErC,aAAA,CAAA;AACA,YAAA,IAAI,CAACC,OAAO,CAAC,IAAI,CAACT,MAAM,CAAA;AAC1B,SAAA,CAAA;AAEF,QAAA,OAAOtB,GAAGgC,cAAc,EAAE,CAACjC,wBAAyB,CAAA,CAACH,cAAcC,KAAOC,EAAAA,KAAAA,CAAAA;AAC5E;IACAmC,aACEzE,CAAAA,eAAgC,EAChCiC,KAA4B,EAC5BG,YAAyB,EACzBC,KAAkB,EAClBqC,WAAyB,EACzB;;AAEA,QAAA,MAAMC,aAAa,CAAC,CAACD,WAAe1E,IAAAA,eAAAA,CAAgBM,SAAS,KAAKsE,gBAAAA;QAClE,MAAMC,qBAAAA,GAAwBF,aAAa,qBAAwB,GAAA,mBAAA;QACnE,MAAMnC,EAAAA,GAAKP,MAAMQ,QAAQ;AACzB,QAAA,MAAMC,OAAO,IAAI;QACjBF,EAAGG,CAAAA,IAAI,CACLkC,qBACA,EAAA;AAACrC,YAAAA,EAAAA,CAAGI,IAAI,CAAC,cAAA,CAAA;AAAiBJ,YAAAA,EAAAA,CAAGK,KAAK,CAAC,OAAA,CAAA;eAAc8B,UAAa,GAAA;AAACnC,gBAAAA,EAAAA,CAAGsC,IAAI,CAAC,aAAA;AAAe,aAAA,GAAG;SAAI,EAC7F,WAAA;YACE,IAAI9E,eAAAA,CAAgBM,SAAS,KAAKsE,gBAAkB,EAAA;AAClD,gBAAA,IAAI,CAAC7B,EAAE,CAACgC,GAAG,GAAGvC,EAAAA,CAAGwC,GAAG,CAClB,IAAI,CAAC5C,YAAY,CAAC6C,GAAG,EACrBC,YAAAA,CAAaC,iCAAiC,CAAC,IAAI,EAAEF,GAAG,CAAA;gBAE1D,IAAI,CAAClC,EAAE,CAACqC,QAAQ,GAAG5C,EAAGS,CAAAA,GAAG,CACvBT,EAAG6C,CAAAA,MAAM,CAAC,IAAI,CAACN,GAAG,CAClBG,EAAAA,YAAAA,CAAaC,iCAAiC,CAAC,IAAI,EAAEjC,CAAC,CAAA;AAExD,gBAAA,IAAI,CAACH,EAAE,CAACmB,UAAU,GAAGoB,iBAAAA,CACnBtF,gBAAgBM,SAAS,EACzB,IAAI,EACJ,IAAI,CAAC8E,QAAQ,EACb,IAAI,CAAC/C,KAAK,EACV,IAAA,CAAA;gBAEF,IAAI,CAACU,EAAE,CAACC,WAAW,GAAGR,EAAGI,CAAAA,IAAI,CAAC,IAAI,CAACmC,GAAG,EAAEvC,EAAAA,CAAGwC,GAAG,CAAC,IAAI,CAACI,QAAQ,EAAE,IAAI,CAAClB,UAAU,CAAA,CAAA;AAC7E,gBAAA,IAAI,CAACK,OAAO,CACVF,iBACE,IAAI,EACJrE,gBAAgBM,SAAS,EACzBN,eAAgBY,CAAAA,SAAS,CAAEL,MAAM,EACjC,IAAI,CAACyC,WAAW;;;;AAKhB2B,gBAAAA,UAAAA,GAAa,IAAI,CAACD,WAAW,GAAGa,SAChCA,EAAAA,SAAAA,EACA7C,KAAK9D,eAAe,CAAA,CAAA;AAG1B;AACA,YAAA,IAAI,CAACmE,EAAE,CAACC,WAAW,GAAGR,GAAGS,GAAG,CAAC,IAAI,CAACb,YAAY,EAAE,IAAI,CAACA,YAAY,CAACc,CAAC,CAAA;YACnE,IAAI,CAACH,EAAE,CAACC,WAAW,GAAGG,iBAAiB,IAAI,EAAE,IAAI,CAACH,WAAW,CAAA;AAC7D,YAAA,IAAI,CAACD,EAAE,CAACK,QAAQ,GAAGZ,EAAAA,CAAGa,GAAG,CACvBb,EAAGc,CAAAA,KAAK,CACNd,EAAAA,CAAGa,GAAG,CACJb,EAAAA,CAAGe,KAAK,CACNf,EAAGgB,CAAAA,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACS,CAAC,EAAE,CAAA,CAAA,EACxCjB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACS,CAAC,EAAE,CACrCjB,CAAAA,EAAAA,EAAAA,CAAGgB,gBAAgB,CAAC,IAAI,CAACR,WAAW,CAACW,CAAC,EAAE,IACxCnB,EAAGkB,CAAAA,aAAa,CAAC,IAAI,CAACV,WAAW,CAACW,CAAC,EAAE,CAAA,CAAA,CAAA,CAAA,EAGzCC,uBAAwB,CAAA,IAAI,EAAE,IAAI,CAACZ,WAAW,CAACa,CAAC,CAAA,CAAA,CAAA;AAGpD,YAAA,IAAI,CAACd,EAAE,CAACe,MAAM,GAAGtB,EAAAA,CAAGK,KAAK,CAAC,CAAA,CAAA;YAC1B,IAAI7C,eAAAA,CAAgBM,SAAS,KAAKkF,eAAiB,EAAA;gBACjD,IAAI,CAACzC,EAAE,CAAC0C,OAAO,GAAGP,aAAaQ,qBAAqB,CAAC,IAAI,CAAA,CAAEC,EAAE;AAC7D,gBAAA,IAAI,CAAC3C,WAAW,CAACa,CAAC,GAAGqB,YAAAA,CAAaU,gCAAgC,CAChE,IAAI,EACJ,IAAI,CAAC5C,WAAW,CAACa,CAAC,EAClB,IAAI,CAAC4B,OAAO,CAAA;AAEhB;YACA,IAAI,CAAC1C,EAAE,CAACgB,sBAAsB,GAAGC,8BAA8B,IAAI,EAAE,IAAI,CAAChB,WAAW,CAAA;AACrF,YAAA,IAAI,CAACiB,GAAG,CAAC,IAAI,CAACb,QAAQ,EAAE,WAAA;gBACtB,IAAIpD,eAAAA,CAAgBM,SAAS,KAAKkF,eAAiB,EAAA;oBACjD,IAAI,CAACzC,EAAE,CAACmB,UAAU,GAAGoB,iBACnBtF,CAAAA,eAAAA,CAAgBM,SAAS,EACzB,IAAI,EACJ,IAAI,CAAC0C,WAAW,CAACa,CAAC,EAClB,IAAI,CAACxB,KAAK,EACV,IAAA,CAAA;iBAEG,MAAA;oBACL,IAAI,CAACU,EAAE,CAACmB,UAAU,GAAGoB,iBACnBtF,CAAAA,eAAAA,CAAgBM,SAAS,EACzB,IAAI,EACJ,IAAI,CAAC0C,WAAW,CAACa,CAAC,EAClB,IAAI,CAACxB,KAAK,EACV,KAAA,CAAA;AAEJ;gBACA,IAAI,CAACW,WAAW,CAACa,CAAC,GAAGO,oBACnB,CAAA,IAAI,EACJ,IAAI,CAACpB,WAAW,CAACa,CAAC,EAClB,IAAI,CAACK,UAAU,EACflE,eAAAA,CAAgBM,SAAS,KAAKkF,eAAAA,CAAAA;gBAEhC,IAAI,CAAC1B,MAAM,GAAGO,gBACZ,CAAA,IAAI,EACJrE,eAAgBM,CAAAA,SAAS,EACzBN,eAAAA,CAAgBY,SAAS,CAAEL,MAAM,EACjC,IAAI,CAACyC,WAAW,EAChB,IAAI,CAACe,sBAAsB,EAC3BwB,SACA7C,EAAAA,IAAAA,CAAK9D,eAAe,CAAA;AAExB,aAAA,CAAA;AACA,YAAA,IAAI,CAAC2F,OAAO,CAAC,IAAI,CAACT,MAAM,CAAA;AAC1B,SAAA,CAAA;QAEF,OAAOtB,EAAAA,CACJgC,cAAc,EACf,CAACK,sBAAsB,CAACzC,YAAAA,EAAcC,UAAWsC,UAAa,GAAA;AAACD,YAAAA;AAAa,SAAA,GAAG,EAAE,CAAA;AACrF;AACAmB,IAAAA,kBAAAA,CAAmBhG,gBAAiC,EAAE;QACpD,OAAO,KAAA;AACT;qBAEAiG,oBACE9F,CAAAA,eAAgC,EAChCiC,KAA4B,EAC5B8D,MAAmB,EACnBlC,CAAc,EACdmC,IAAiB,EACjB;AACA,QAAA,MAAMC,uBAA0B,GAAA,8BAAA;QAChC,MAAMzD,EAAAA,GAAKP,MAAMQ,QAAQ;QACzBD,EAAGG,CAAAA,IAAI,CAACsD,uBAAyB,EAAA;AAACzD,YAAAA,EAAAA,CAAGsC,IAAI,CAAC,QAAA,CAAA;AAAWtC,YAAAA,EAAAA,CAAGK,KAAK,CAAC,GAAA,CAAA;AAAML,YAAAA,EAAAA,CAAGK,KAAK,CAAC,MAAA;SAAQ,EAAE,WAAA;AACrF,YAAA,MAAMqD,iBAAoBlG,GAAAA,eAAAA,CAAgBY,SAAS,CAAEL,MAAM,KAAK,YAAA;AAChE,YAAA,IAAI,CAACwC,EAAE,CAACoD,SAAS,GAAG3D,GAAG4D,kBAAkB,CAAClB,YAAaxE,CAAAA,YAAY,CAAC,IAAI,CAAA,EAAG,IAAI,CAACqF,MAAM,EAAE,CAAA,CAAA;AACxF,YAAA,IAAI,CAACG,iBAAmB,EAAA;gBACtB,IAAI,CAACC,SAAS,CAAC1C,CAAC,GAAG4C,8BAA8B,IAAI,EAAE,IAAI,CAACF,SAAS,CAAA;AACvE;AACA,YAAA,IAAI,CAACpD,EAAE,CAACqC,QAAQ,GAAG5C,EAAGwC,CAAAA,GAAG,CAAC,IAAI,CAACnB,CAAC,EAAE,IAAI,CAACmC,IAAI,CAAA;AAC3C,YAAA,IAAI,CAACzB,OAAO,CAAC/B,EAAAA,CAAG8D,IAAI,CAAC,IAAI,CAAClB,QAAQ,EAAE,IAAI,CAACe,SAAS,CAAC1C,CAAC,CAAA,CAAA;AACtD,SAAA,CAAA;AACA,QAAA,OAAOjB,GAAGgC,cAAc,EAAE,CAACyB,uBAAwB,CAAA,CAACF,QAAQlC,CAAGmC,EAAAA,IAAAA,CAAAA;AACjE;AACF;;;;"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Vector4, REVERSE_Z } from '@zephyr3d/base';
|
|
2
2
|
import { isDeviceDepthShadow } from '../shaders/shadow.js';
|
|
3
|
-
import { getDevice } from '../app/api.js';
|
|
4
3
|
|
|
5
4
|
/** @internal */ function getShadowMapFarthestDepth(lightType) {
|
|
6
5
|
return REVERSE_Z && isDeviceDepthShadow(lightType) ? 0 : 1;
|
|
@@ -31,15 +30,11 @@ import { getDevice } from '../app/api.js';
|
|
|
31
30
|
/**
|
|
32
31
|
* Depth format for shadow maps rendered into a native depth attachment.
|
|
33
32
|
*
|
|
34
|
-
* Float depth
|
|
35
|
-
*
|
|
36
|
-
* reverse-Z the WebGL2 float depth format is used so shadow maps share
|
|
37
|
-
* the near-uniform precision distribution (full benefit with
|
|
38
|
-
* EXT_clip_control active).
|
|
33
|
+
* Float depth on every backend, so shadow maps share the near-uniform
|
|
34
|
+
* precision distribution of reverse-Z.
|
|
39
35
|
* @internal
|
|
40
36
|
*/ preferredShadowMapDepthFormat() {
|
|
41
|
-
|
|
42
|
-
return device.type !== 'webgl' || REVERSE_Z && device.getDeviceCaps().framebufferCaps.supportDepth32float ? 'd32f' : 'd24s8';
|
|
37
|
+
return 'd32f';
|
|
43
38
|
}
|
|
44
39
|
/**
|
|
45
40
|
* Number of geometry passes this implementation needs over the shadow casters.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow_impl.js","sources":["../../src/shadow/shadow_impl.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { ShadowMapParams, ShadowMapType, ShadowMode } from './shadowmapper';\r\nimport { REVERSE_Z, Vector4, type Nullable } from '@zephyr3d/base';\r\nimport { isDeviceDepthShadow } from '../shaders/shadow';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport function getShadowMapFarthestDepth(lightType: number) {\r\n return REVERSE_Z && isDeviceDepthShadow(lightType) ? 0 : 1;\r\n}\r\n\r\n/** @internal */\r\nexport function getPackedShadowMapClearColor(lightType: number) {\r\n // The RGBA8 decoder assigns the alpha channel a weight of 1, so the\r\n // normalized depth endpoints are represented by transparent/opaque black.\r\n return new Vector4(0, 0, 0, getShadowMapFarthestDepth(lightType));\r\n}\r\n\r\n/** @internal */\r\nexport abstract class ShadowImpl {\r\n protected _resourceDirty: boolean;\r\n constructor() {\r\n this._resourceDirty = true;\r\n }\r\n invalidateResource() {\r\n this._resourceDirty = true;\r\n }\r\n updateResources(shadowMapParams: ShadowMapParams) {\r\n this.doUpdateResources(shadowMapParams);\r\n }\r\n abstract getType(): ShadowMode;\r\n abstract getShadowMapBorder(shadowMapParams: ShadowMapParams): number;\r\n getShadowMapClearColor(shadowMapParams: ShadowMapParams) {\r\n const colorAttachment = shadowMapParams.shadowMapFramebuffer?.getColorAttachments()[0];\r\n // Empty texels must read as \"farthest\": under reverse-Z that is 0 for\r\n // device-encoded directional/rect maps, 1 for linear point/spot maps.\r\n const farthest = getShadowMapFarthestDepth(shadowMapParams.lightType);\r\n return colorAttachment\r\n ? colorAttachment.isFloatFormat()\r\n ? new Vector4(farthest, farthest, farthest, 1)\r\n : getPackedShadowMapClearColor(shadowMapParams.lightType)\r\n : null;\r\n }\r\n /**\r\n * Depth format for shadow maps rendered into a native depth attachment.\r\n *\r\n * Float depth everywhere except WebGL, where d24s8 is kept under\r\n * standard-Z (WebGL1 compatibility, no precision benefit anyway). Under\r\n * reverse-Z the WebGL2 float depth format is used so shadow maps share\r\n * the near-uniform precision distribution (full benefit with\r\n * EXT_clip_control active).\r\n * @internal\r\n */\r\n protected preferredShadowMapDepthFormat(): TextureFormat {\r\n const device = getDevice();\r\n return device.type !== 'webgl' ||\r\n (REVERSE_Z && device.getDeviceCaps().framebufferCaps.supportDepth32float)\r\n ? 'd32f'\r\n : 'd24s8';\r\n }\r\n abstract getParams(out?: Vector4): Vector4;\r\n /**\r\n * Number of geometry passes this implementation needs over the shadow casters.\r\n *\r\n * Almost every technique rasterises the casters once and post-processes the\r\n * result, which is what {@link postRenderShadowMap} is for - it runs after the\r\n * geometry is on the map and receives no scene state, so a blur or resolve\r\n * fits there but a second draw of the casters does not.\r\n *\r\n * Deep opacity maps do need that second draw: the first pass establishes the\r\n * frontmost depth per texel and the second accumulates transmittance in layers\r\n * measured from it, so the casters must be rasterised again with the first\r\n * pass's output already available. Returning a count above one makes\r\n * `ShadowMapper.render` repeat the draw, calling {@link beginGeometryPass}\r\n * before each one.\r\n *\r\n * @returns The number of passes; one unless overridden.\r\n */\r\n getGeometryPassCount(_shadowMapParams: ShadowMapParams): number {\r\n return 1;\r\n }\r\n /**\r\n * Whether this implementation can split a directional light into cascades.\r\n *\r\n * Cascades need one shadow map per split, which every depth-based technique\r\n * gets by rendering into array layers. A technique whose storage is already\r\n * spoken for - a deep opacity map packs layer depth and coverage into the one\r\n * texture the receiver is allowed to bind - has nowhere to put them, and asks\r\n * to be driven with a single split instead.\r\n *\r\n * @returns True unless overridden.\r\n */\r\n supportsCascades(): boolean {\r\n return true;\r\n }\r\n /**\r\n * Prepares state for the given geometry pass.\r\n *\r\n * Only called when {@link getGeometryPassCount} returns more than one. The\r\n * index is zero-based. Implementations that vary the emitted shader between\r\n * passes must fold the index into {@link getShaderHash} as well, since the\r\n * shadow pass keys its programs on that hash.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @param pass - Zero-based index of the geometry pass about to run.\r\n */\r\n beginGeometryPass(_shadowMapParams: ShadowMapParams, _pass: number): void {}\r\n /**\r\n * Last say on the render states a shadow caster is drawn with.\r\n *\r\n * Runs after the material has set up its own states, in the same spirit as the\r\n * OIT hook on the transparent pass. Techniques that rasterise the casters once\r\n * want the defaults - depth test and write on, no blending - and leave this\r\n * alone. An accumulating pass wants the opposite and overrides it here rather\r\n * than teaching the material about shadow implementations.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @param stateSet - The state set about to be applied, already populated.\r\n */\r\n setCasterRenderStates(_shadowMapParams: ShadowMapParams, _stateSet: RenderStateSet): void {}\r\n /**\r\n * Declares any extra resources the caster shader needs, in bind group 0.\r\n *\r\n * The shadow map pass otherwise gives a caster only the camera and the light,\r\n * which is all a technique needs when it just records depth. One that reads\r\n * back its own earlier output - a deep opacity map measuring layers from the\r\n * frontmost strand - declares that input here instead of the pass hard-coding\r\n * knowledge of the implementation.\r\n *\r\n * @param scope - Global shader scope of the caster program.\r\n * @param shadowMapParams - Current shadow map state.\r\n */\r\n declareCasterUniforms(_scope: PBGlobalScope, _shadowMapParams: ShadowMapParams): void {}\r\n /**\r\n * Binds whatever {@link declareCasterUniforms} declared.\r\n *\r\n * @param bindGroup - Bind group 0 of the caster program.\r\n * @param shadowMapParams - Current shadow map state.\r\n */\r\n applyCasterUniforms(_bindGroup: BindGroup, _shadowMapParams: ShadowMapParams): void {}\r\n /**\r\n * Whether casters should still be alpha-clipped before their shadow output.\r\n *\r\n * A depth-recording technique wants the clip: a fragment that fails it is not\r\n * there, and letting it write depth would block light with geometry the eye\r\n * never sees. A technique that records coverage instead wants the raw alpha,\r\n * because the clip destroys exactly the quantity it is accumulating - a\r\n * dithered caster survives with probability alpha and then contributes alpha,\r\n * which accumulates alpha squared, and a cutoff drops the thin strands that\r\n * carry most of a groom's transmittance.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @returns True unless overridden.\r\n */\r\n clipsCasterAlpha(_shadowMapParams: ShadowMapParams): boolean {\r\n return true;\r\n }\r\n abstract getShadowMap(shadowMapParams: ShadowMapParams): ShadowMapType;\r\n abstract postRenderShadowMap(shadowMapParams: ShadowMapParams): void;\r\n abstract getDepthScale(): number;\r\n abstract setDepthScale(val: number): void;\r\n abstract resourceDirty(): boolean;\r\n abstract doUpdateResources(shadowMapParams: ShadowMapParams): void;\r\n abstract getShaderHash(): string;\r\n /**\r\n * Fragment output for a shadow caster.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @param scope - Caster fragment scope.\r\n * @param worldPos - World position of the fragment.\r\n * @param alpha - The material's own alpha, or null when it computes no fragment\r\n * colour and the fragment is therefore fully opaque. Depth-recording techniques\r\n * ignore it - by the time this runs the fragment has already survived whatever\r\n * alpha test applies - but one that records absorption needs the value itself.\r\n * It must be passed rather than read out of `scope`, because the caller's\r\n * `outColor` is local to the material's own shader function and defaults to a\r\n * zero vector when no colour was computed, which is indistinguishable from a\r\n * genuinely transparent fragment.\r\n */\r\n abstract computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n alpha: Nullable<PBShaderExp>\r\n ): PBShaderExp;\r\n abstract computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ): PBShaderExp;\r\n abstract computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ): PBShaderExp;\r\n abstract getShadowMapColorFormat(shadowMapParams: ShadowMapParams): Nullable<TextureFormat>;\r\n abstract getShadowMapDepthFormat(shadowMapParams: ShadowMapParams): TextureFormat;\r\n abstract useNativeShadowMap(shadowMapParams: ShadowMapParams): boolean;\r\n}\r\n"],"names":["getShadowMapFarthestDepth","lightType","REVERSE_Z","isDeviceDepthShadow","getPackedShadowMapClearColor","Vector4","ShadowImpl","_resourceDirty","invalidateResource","updateResources","shadowMapParams","doUpdateResources","getShadowMapClearColor","colorAttachment","shadowMapFramebuffer","getColorAttachments","farthest","isFloatFormat","device","getDevice","type","getDeviceCaps","framebufferCaps","supportDepth32float","getGeometryPassCount","_shadowMapParams","supportsCascades","beginGeometryPass","_pass","setCasterRenderStates","_stateSet","declareCasterUniforms","_scope","applyCasterUniforms","_bindGroup","clipsCasterAlpha"],"mappings":";;;;AAaA,iBACO,SAASA,yBAAAA,CAA0BC,SAAiB,EAAA;IACzD,OAAOC,SAAAA,IAAaC,mBAAoBF,CAAAA,SAAAA,CAAAA,GAAa,CAAI,GAAA,CAAA;AAC3D;AAEA,iBACO,SAASG,4BAAAA,CAA6BH,SAAiB,EAAA;;;AAG5D,IAAA,OAAO,IAAII,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAGL,yBAA0BC,CAAAA,SAAAA,CAAAA,CAAAA;AACxD;AAEA,iBACO,MAAeK,UAAAA,CAAAA;IACVC,cAAwB;IAClC,WAAc,EAAA;QACZ,IAAI,CAACA,cAAc,GAAG,IAAA;AACxB;IACAC,kBAAqB,GAAA;QACnB,IAAI,CAACD,cAAc,GAAG,IAAA;AACxB;AACAE,IAAAA,eAAAA,CAAgBC,eAAgC,EAAE;QAChD,IAAI,CAACC,iBAAiB,CAACD,eAAAA,CAAAA;AACzB;AAGAE,IAAAA,sBAAAA,CAAuBF,eAAgC,EAAE;AACvD,QAAA,MAAMG,kBAAkBH,eAAgBI,CAAAA,oBAAoB,EAAEC,mBAAAA,EAAqB,CAAC,CAAE,CAAA;;;QAGtF,MAAMC,QAAAA,GAAWhB,yBAA0BU,CAAAA,eAAAA,CAAgBT,SAAS,CAAA;AACpE,QAAA,OAAOY,eACHA,GAAAA,eAAAA,CAAgBI,aAAa,EAAA,GAC3B,IAAIZ,OAAAA,CAAQW,QAAUA,EAAAA,QAAAA,EAAUA,QAAU,EAAA,CAAA,CAAA,GAC1CZ,4BAA6BM,CAAAA,eAAAA,CAAgBT,SAAS,CACxD,GAAA,IAAA;AACN;AACA;;;;;;;;;AASC,MACD,6BAAyD,GAAA;AACvD,QAAA,MAAMiB,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,OAAOD,MAAOE,CAAAA,IAAI,KAAK,OAAA,IACpBlB,SAAagB,IAAAA,MAAAA,CAAOG,aAAa,EAAA,CAAGC,eAAe,CAACC,mBAAmB,GACtE,MACA,GAAA,OAAA;AACN;AAEA;;;;;;;;;;;;;;;;MAiBAC,oBAAAA,CAAqBC,gBAAiC,EAAU;QAC9D,OAAO,CAAA;AACT;AACA;;;;;;;;;;AAUC,MACDC,gBAA4B,GAAA;QAC1B,OAAO,IAAA;AACT;AACA;;;;;;;;;;AAUC,MACDC,iBAAkBF,CAAAA,gBAAiC,EAAEG,KAAa,EAAQ;AAC1E;;;;;;;;;;;AAWC,MACDC,qBAAsBJ,CAAAA,gBAAiC,EAAEK,SAAyB,EAAQ;AAC1F;;;;;;;;;;;AAWC,MACDC,qBAAsBC,CAAAA,MAAqB,EAAEP,gBAAiC,EAAQ;AACtF;;;;;AAKC,MACDQ,mBAAoBC,CAAAA,UAAqB,EAAET,gBAAiC,EAAQ;AACpF;;;;;;;;;;;;;MAcAU,gBAAAA,CAAiBV,gBAAiC,EAAW;QAC3D,OAAO,IAAA;AACT;AA6CF;;;;"}
|
|
1
|
+
{"version":3,"file":"shadow_impl.js","sources":["../../src/shadow/shadow_impl.ts"],"sourcesContent":["import type {\r\n BindGroup,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { ShadowMapParams, ShadowMapType, ShadowMode } from './shadowmapper';\r\nimport { REVERSE_Z, Vector4, type Nullable } from '@zephyr3d/base';\r\nimport { isDeviceDepthShadow } from '../shaders/shadow';\r\n\r\n/** @internal */\r\nexport function getShadowMapFarthestDepth(lightType: number) {\r\n return REVERSE_Z && isDeviceDepthShadow(lightType) ? 0 : 1;\r\n}\r\n\r\n/** @internal */\r\nexport function getPackedShadowMapClearColor(lightType: number) {\r\n // The RGBA8 decoder assigns the alpha channel a weight of 1, so the\r\n // normalized depth endpoints are represented by transparent/opaque black.\r\n return new Vector4(0, 0, 0, getShadowMapFarthestDepth(lightType));\r\n}\r\n\r\n/** @internal */\r\nexport abstract class ShadowImpl {\r\n protected _resourceDirty: boolean;\r\n constructor() {\r\n this._resourceDirty = true;\r\n }\r\n invalidateResource() {\r\n this._resourceDirty = true;\r\n }\r\n updateResources(shadowMapParams: ShadowMapParams) {\r\n this.doUpdateResources(shadowMapParams);\r\n }\r\n abstract getType(): ShadowMode;\r\n abstract getShadowMapBorder(shadowMapParams: ShadowMapParams): number;\r\n getShadowMapClearColor(shadowMapParams: ShadowMapParams) {\r\n const colorAttachment = shadowMapParams.shadowMapFramebuffer?.getColorAttachments()[0];\r\n // Empty texels must read as \"farthest\": under reverse-Z that is 0 for\r\n // device-encoded directional/rect maps, 1 for linear point/spot maps.\r\n const farthest = getShadowMapFarthestDepth(shadowMapParams.lightType);\r\n return colorAttachment\r\n ? colorAttachment.isFloatFormat()\r\n ? new Vector4(farthest, farthest, farthest, 1)\r\n : getPackedShadowMapClearColor(shadowMapParams.lightType)\r\n : null;\r\n }\r\n /**\r\n * Depth format for shadow maps rendered into a native depth attachment.\r\n *\r\n * Float depth on every backend, so shadow maps share the near-uniform\r\n * precision distribution of reverse-Z.\r\n * @internal\r\n */\r\n protected preferredShadowMapDepthFormat(): TextureFormat {\r\n return 'd32f';\r\n }\r\n abstract getParams(out?: Vector4): Vector4;\r\n /**\r\n * Number of geometry passes this implementation needs over the shadow casters.\r\n *\r\n * Almost every technique rasterises the casters once and post-processes the\r\n * result, which is what {@link postRenderShadowMap} is for - it runs after the\r\n * geometry is on the map and receives no scene state, so a blur or resolve\r\n * fits there but a second draw of the casters does not.\r\n *\r\n * Deep opacity maps do need that second draw: the first pass establishes the\r\n * frontmost depth per texel and the second accumulates transmittance in layers\r\n * measured from it, so the casters must be rasterised again with the first\r\n * pass's output already available. Returning a count above one makes\r\n * `ShadowMapper.render` repeat the draw, calling {@link beginGeometryPass}\r\n * before each one.\r\n *\r\n * @returns The number of passes; one unless overridden.\r\n */\r\n getGeometryPassCount(_shadowMapParams: ShadowMapParams): number {\r\n return 1;\r\n }\r\n /**\r\n * Whether this implementation can split a directional light into cascades.\r\n *\r\n * Cascades need one shadow map per split, which every depth-based technique\r\n * gets by rendering into array layers. A technique whose storage is already\r\n * spoken for - a deep opacity map packs layer depth and coverage into the one\r\n * texture the receiver is allowed to bind - has nowhere to put them, and asks\r\n * to be driven with a single split instead.\r\n *\r\n * @returns True unless overridden.\r\n */\r\n supportsCascades(): boolean {\r\n return true;\r\n }\r\n /**\r\n * Prepares state for the given geometry pass.\r\n *\r\n * Only called when {@link getGeometryPassCount} returns more than one. The\r\n * index is zero-based. Implementations that vary the emitted shader between\r\n * passes must fold the index into {@link getShaderHash} as well, since the\r\n * shadow pass keys its programs on that hash.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @param pass - Zero-based index of the geometry pass about to run.\r\n */\r\n beginGeometryPass(_shadowMapParams: ShadowMapParams, _pass: number): void {}\r\n /**\r\n * Last say on the render states a shadow caster is drawn with.\r\n *\r\n * Runs after the material has set up its own states, in the same spirit as the\r\n * OIT hook on the transparent pass. Techniques that rasterise the casters once\r\n * want the defaults - depth test and write on, no blending - and leave this\r\n * alone. An accumulating pass wants the opposite and overrides it here rather\r\n * than teaching the material about shadow implementations.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @param stateSet - The state set about to be applied, already populated.\r\n */\r\n setCasterRenderStates(_shadowMapParams: ShadowMapParams, _stateSet: RenderStateSet): void {}\r\n /**\r\n * Declares any extra resources the caster shader needs, in bind group 0.\r\n *\r\n * The shadow map pass otherwise gives a caster only the camera and the light,\r\n * which is all a technique needs when it just records depth. One that reads\r\n * back its own earlier output - a deep opacity map measuring layers from the\r\n * frontmost strand - declares that input here instead of the pass hard-coding\r\n * knowledge of the implementation.\r\n *\r\n * @param scope - Global shader scope of the caster program.\r\n * @param shadowMapParams - Current shadow map state.\r\n */\r\n declareCasterUniforms(_scope: PBGlobalScope, _shadowMapParams: ShadowMapParams): void {}\r\n /**\r\n * Binds whatever {@link declareCasterUniforms} declared.\r\n *\r\n * @param bindGroup - Bind group 0 of the caster program.\r\n * @param shadowMapParams - Current shadow map state.\r\n */\r\n applyCasterUniforms(_bindGroup: BindGroup, _shadowMapParams: ShadowMapParams): void {}\r\n /**\r\n * Whether casters should still be alpha-clipped before their shadow output.\r\n *\r\n * A depth-recording technique wants the clip: a fragment that fails it is not\r\n * there, and letting it write depth would block light with geometry the eye\r\n * never sees. A technique that records coverage instead wants the raw alpha,\r\n * because the clip destroys exactly the quantity it is accumulating - a\r\n * dithered caster survives with probability alpha and then contributes alpha,\r\n * which accumulates alpha squared, and a cutoff drops the thin strands that\r\n * carry most of a groom's transmittance.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @returns True unless overridden.\r\n */\r\n clipsCasterAlpha(_shadowMapParams: ShadowMapParams): boolean {\r\n return true;\r\n }\r\n abstract getShadowMap(shadowMapParams: ShadowMapParams): ShadowMapType;\r\n abstract postRenderShadowMap(shadowMapParams: ShadowMapParams): void;\r\n abstract getDepthScale(): number;\r\n abstract setDepthScale(val: number): void;\r\n abstract resourceDirty(): boolean;\r\n abstract doUpdateResources(shadowMapParams: ShadowMapParams): void;\r\n abstract getShaderHash(): string;\r\n /**\r\n * Fragment output for a shadow caster.\r\n *\r\n * @param shadowMapParams - Current shadow map state.\r\n * @param scope - Caster fragment scope.\r\n * @param worldPos - World position of the fragment.\r\n * @param alpha - The material's own alpha, or null when it computes no fragment\r\n * colour and the fragment is therefore fully opaque. Depth-recording techniques\r\n * ignore it - by the time this runs the fragment has already survived whatever\r\n * alpha test applies - but one that records absorption needs the value itself.\r\n * It must be passed rather than read out of `scope`, because the caller's\r\n * `outColor` is local to the material's own shader function and defaults to a\r\n * zero vector when no colour was computed, which is indistinguishable from a\r\n * genuinely transparent fragment.\r\n */\r\n abstract computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n alpha: Nullable<PBShaderExp>\r\n ): PBShaderExp;\r\n /**\r\n * Shadow factor for a receiver, 1 meaning fully lit.\r\n *\r\n * @param worldNormal - The receiver's geometric normal, when the caller has\r\n * one. Implementations filtering a wide kernel over a cube map use it to\r\n * compare each tap against the receiver's own plane.\r\n */\r\n abstract computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n worldNormal?: PBShaderExp\r\n ): PBShaderExp;\r\n abstract computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ): PBShaderExp;\r\n abstract getShadowMapColorFormat(shadowMapParams: ShadowMapParams): Nullable<TextureFormat>;\r\n abstract getShadowMapDepthFormat(shadowMapParams: ShadowMapParams): TextureFormat;\r\n abstract useNativeShadowMap(shadowMapParams: ShadowMapParams): boolean;\r\n}\r\n"],"names":["getShadowMapFarthestDepth","lightType","REVERSE_Z","isDeviceDepthShadow","getPackedShadowMapClearColor","Vector4","ShadowImpl","_resourceDirty","invalidateResource","updateResources","shadowMapParams","doUpdateResources","getShadowMapClearColor","colorAttachment","shadowMapFramebuffer","getColorAttachments","farthest","isFloatFormat","getGeometryPassCount","_shadowMapParams","supportsCascades","beginGeometryPass","_pass","setCasterRenderStates","_stateSet","declareCasterUniforms","_scope","applyCasterUniforms","_bindGroup","clipsCasterAlpha"],"mappings":";;;AAYA,iBACO,SAASA,yBAAAA,CAA0BC,SAAiB,EAAA;IACzD,OAAOC,SAAAA,IAAaC,mBAAoBF,CAAAA,SAAAA,CAAAA,GAAa,CAAI,GAAA,CAAA;AAC3D;AAEA,iBACO,SAASG,4BAAAA,CAA6BH,SAAiB,EAAA;;;AAG5D,IAAA,OAAO,IAAII,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAGL,yBAA0BC,CAAAA,SAAAA,CAAAA,CAAAA;AACxD;AAEA,iBACO,MAAeK,UAAAA,CAAAA;IACVC,cAAwB;IAClC,WAAc,EAAA;QACZ,IAAI,CAACA,cAAc,GAAG,IAAA;AACxB;IACAC,kBAAqB,GAAA;QACnB,IAAI,CAACD,cAAc,GAAG,IAAA;AACxB;AACAE,IAAAA,eAAAA,CAAgBC,eAAgC,EAAE;QAChD,IAAI,CAACC,iBAAiB,CAACD,eAAAA,CAAAA;AACzB;AAGAE,IAAAA,sBAAAA,CAAuBF,eAAgC,EAAE;AACvD,QAAA,MAAMG,kBAAkBH,eAAgBI,CAAAA,oBAAoB,EAAEC,mBAAAA,EAAqB,CAAC,CAAE,CAAA;;;QAGtF,MAAMC,QAAAA,GAAWhB,yBAA0BU,CAAAA,eAAAA,CAAgBT,SAAS,CAAA;AACpE,QAAA,OAAOY,eACHA,GAAAA,eAAAA,CAAgBI,aAAa,EAAA,GAC3B,IAAIZ,OAAAA,CAAQW,QAAUA,EAAAA,QAAAA,EAAUA,QAAU,EAAA,CAAA,CAAA,GAC1CZ,4BAA6BM,CAAAA,eAAAA,CAAgBT,SAAS,CACxD,GAAA,IAAA;AACN;AACA;;;;;;AAMC,MACD,6BAAyD,GAAA;QACvD,OAAO,MAAA;AACT;AAEA;;;;;;;;;;;;;;;;MAiBAiB,oBAAAA,CAAqBC,gBAAiC,EAAU;QAC9D,OAAO,CAAA;AACT;AACA;;;;;;;;;;AAUC,MACDC,gBAA4B,GAAA;QAC1B,OAAO,IAAA;AACT;AACA;;;;;;;;;;AAUC,MACDC,iBAAkBF,CAAAA,gBAAiC,EAAEG,KAAa,EAAQ;AAC1E;;;;;;;;;;;AAWC,MACDC,qBAAsBJ,CAAAA,gBAAiC,EAAEK,SAAyB,EAAQ;AAC1F;;;;;;;;;;;AAWC,MACDC,qBAAsBC,CAAAA,MAAqB,EAAEP,gBAAiC,EAAQ;AACtF;;;;;AAKC,MACDQ,mBAAoBC,CAAAA,UAAqB,EAAET,gBAAiC,EAAQ;AACpF;;;;;;;;;;;;;MAcAU,gBAAAA,CAAiBV,gBAAiC,EAAW;QAC3D,OAAO,IAAA;AACT;AAqDF;;;;"}
|
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
import { Disposable, AABB, DWeakRef } from '@zephyr3d/base';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Maintains the world-space region used by directional light shadow maps.
|
|
5
|
-
*
|
|
6
|
-
* @
|
|
3
|
+
/**
|
|
4
|
+
* Maintains the world-space region used by directional light shadow maps.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* The region is the union of a manual AABB and the bounds of the static and dynamic
|
|
8
|
+
* casters, clipped to the optional limit set with {@link ShadowRegion.setLimit}.
|
|
9
|
+
* The limit keeps tracked casters that leave the play area, such as a falling
|
|
10
|
+
* physics body, from stretching the shadow map over empty space.
|
|
11
|
+
*
|
|
12
|
+
* @public
|
|
7
13
|
*/ class ShadowRegion extends Disposable {
|
|
8
14
|
/** @internal */ _manualRegion;
|
|
15
|
+
/** @internal */ _limit;
|
|
9
16
|
/** @internal */ _staticRegion;
|
|
10
17
|
/** @internal */ _dynamicRegion;
|
|
11
18
|
/** @internal */ _region;
|
|
12
19
|
/** @internal */ _staticCasters;
|
|
13
20
|
/** @internal */ _dynamicCasters;
|
|
14
|
-
/**
|
|
15
|
-
* Creates a shadow region.
|
|
16
|
-
*
|
|
17
|
-
* @param region - Optional manual world-space AABB used to initialize the region.
|
|
21
|
+
/**
|
|
22
|
+
* Creates a shadow region.
|
|
23
|
+
*
|
|
24
|
+
* @param region - Optional manual world-space AABB used to initialize the region.
|
|
18
25
|
*/ constructor(region){
|
|
19
26
|
super();
|
|
20
27
|
this._manualRegion = region ? new AABB(region) : null;
|
|
28
|
+
this._limit = null;
|
|
21
29
|
this._staticRegion = new AABB().beginExtend();
|
|
22
30
|
this._dynamicRegion = new AABB().beginExtend();
|
|
23
31
|
this._region = new AABB().beginExtend();
|
|
@@ -25,47 +33,66 @@ import { Disposable, AABB, DWeakRef } from '@zephyr3d/base';
|
|
|
25
33
|
this._dynamicCasters = [];
|
|
26
34
|
this.updateRegion();
|
|
27
35
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Final world-space shadow region.
|
|
30
|
-
*
|
|
31
|
-
* @returns The union of the manual, static caster, and dynamic caster regions
|
|
36
|
+
/**
|
|
37
|
+
* Final world-space shadow region.
|
|
38
|
+
*
|
|
39
|
+
* @returns The union of the manual, static caster, and dynamic caster regions clipped to
|
|
40
|
+
* {@link ShadowRegion.limit}, or `null` if no valid region exists or the union lies
|
|
41
|
+
* entirely outside the limit.
|
|
32
42
|
*/ get region() {
|
|
33
43
|
return this._region.isValid() ? this._region : null;
|
|
34
44
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Region contributed by manually assigned AABB.
|
|
37
|
-
*
|
|
38
|
-
* @returns The manually assigned region, or `null` if no manual region is set.
|
|
45
|
+
/**
|
|
46
|
+
* Region contributed by manually assigned AABB.
|
|
47
|
+
*
|
|
48
|
+
* @returns The manually assigned region, or `null` if no manual region is set.
|
|
39
49
|
*/ get manualRegion() {
|
|
40
50
|
return this._manualRegion;
|
|
41
51
|
}
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* @returns The
|
|
52
|
+
/**
|
|
53
|
+
* World-space AABB the final region is clipped to.
|
|
54
|
+
*
|
|
55
|
+
* @returns The limit, or `null` if the region is not limited.
|
|
56
|
+
*/ get limit() {
|
|
57
|
+
return this._limit;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Limits the final region to a world-space AABB.
|
|
61
|
+
*
|
|
62
|
+
* @param limit - The AABB to clip the region to, or `null` to remove the limit.
|
|
63
|
+
* @returns `this` for chaining.
|
|
64
|
+
*/ setLimit(limit) {
|
|
65
|
+
this._limit = limit?.isValid() ? new AABB(limit) : null;
|
|
66
|
+
this.updateRegion();
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Region contributed by static shadow casters.
|
|
71
|
+
*
|
|
72
|
+
* @returns The combined static caster region, or `null` if no valid static caster region exists.
|
|
46
73
|
*/ get staticRegion() {
|
|
47
74
|
return this._staticRegion.isValid() ? this._staticRegion : null;
|
|
48
75
|
}
|
|
49
|
-
/**
|
|
50
|
-
* Region contributed by dynamic shadow casters.
|
|
51
|
-
*
|
|
52
|
-
* @returns The combined dynamic caster region, or `null` if no valid dynamic caster region exists.
|
|
76
|
+
/**
|
|
77
|
+
* Region contributed by dynamic shadow casters.
|
|
78
|
+
*
|
|
79
|
+
* @returns The combined dynamic caster region, or `null` if no valid dynamic caster region exists.
|
|
53
80
|
*/ get dynamicRegion() {
|
|
54
81
|
return this._dynamicRegion.isValid() ? this._dynamicRegion : null;
|
|
55
82
|
}
|
|
56
|
-
/**
|
|
57
|
-
* Assigns a manual world-space AABB to the region.
|
|
58
|
-
*
|
|
59
|
-
* @param region - The manual world-space AABB to use, or `null` to clear the manual region.
|
|
83
|
+
/**
|
|
84
|
+
* Assigns a manual world-space AABB to the region.
|
|
85
|
+
*
|
|
86
|
+
* @param region - The manual world-space AABB to use, or `null` to clear the manual region.
|
|
60
87
|
*/ setRegion(region) {
|
|
61
88
|
this._manualRegion = region ? new AABB(region) : null;
|
|
62
89
|
this.updateRegion();
|
|
63
90
|
}
|
|
64
|
-
/**
|
|
65
|
-
* Adds a static shadow caster using a snapshot of its current world-space AABB.
|
|
66
|
-
*
|
|
67
|
-
* @param caster - The mesh or clipmap terrain node to include as a static caster.
|
|
68
|
-
* @returns `this` for chaining.
|
|
91
|
+
/**
|
|
92
|
+
* Adds a static shadow caster using a snapshot of its current world-space AABB.
|
|
93
|
+
*
|
|
94
|
+
* @param caster - The mesh or clipmap terrain node to include as a static caster.
|
|
95
|
+
* @returns `this` for chaining.
|
|
69
96
|
*/ addStaticCaster(caster) {
|
|
70
97
|
if (!this.isShadowCaster(caster) || this.hasCaster(caster)) {
|
|
71
98
|
return this;
|
|
@@ -82,11 +109,11 @@ import { Disposable, AABB, DWeakRef } from '@zephyr3d/base';
|
|
|
82
109
|
this.updateRegion();
|
|
83
110
|
return this;
|
|
84
111
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Adds a dynamic shadow caster and tracks its bounding volume changes.
|
|
87
|
-
*
|
|
88
|
-
* @param caster - The mesh or clipmap terrain node to include as a dynamic caster.
|
|
89
|
-
* @returns `this` for chaining.
|
|
112
|
+
/**
|
|
113
|
+
* Adds a dynamic shadow caster and tracks its bounding volume changes.
|
|
114
|
+
*
|
|
115
|
+
* @param caster - The mesh or clipmap terrain node to include as a dynamic caster.
|
|
116
|
+
* @returns `this` for chaining.
|
|
90
117
|
*/ addDynamicCaster(caster) {
|
|
91
118
|
if (!this.isShadowCaster(caster) || this.hasCaster(caster)) {
|
|
92
119
|
return this;
|
|
@@ -106,11 +133,11 @@ import { Disposable, AABB, DWeakRef } from '@zephyr3d/base';
|
|
|
106
133
|
}
|
|
107
134
|
return this;
|
|
108
135
|
}
|
|
109
|
-
/**
|
|
110
|
-
* Removes a previously added shadow caster.
|
|
111
|
-
*
|
|
112
|
-
* @param caster - The caster node to remove from the static or dynamic caster list.
|
|
113
|
-
* @returns `this` for chaining.
|
|
136
|
+
/**
|
|
137
|
+
* Removes a previously added shadow caster.
|
|
138
|
+
*
|
|
139
|
+
* @param caster - The caster node to remove from the static or dynamic caster list.
|
|
140
|
+
* @returns `this` for chaining.
|
|
114
141
|
*/ removeCaster(caster) {
|
|
115
142
|
let changed = false;
|
|
116
143
|
for(let i = this._staticCasters.length - 1; i >= 0; i--){
|
|
@@ -138,8 +165,8 @@ import { Disposable, AABB, DWeakRef } from '@zephyr3d/base';
|
|
|
138
165
|
}
|
|
139
166
|
return this;
|
|
140
167
|
}
|
|
141
|
-
/**
|
|
142
|
-
* Removes all shadow casters while keeping the manual region.
|
|
168
|
+
/**
|
|
169
|
+
* Removes all shadow casters while keeping the manual region.
|
|
143
170
|
*/ clearCasters() {
|
|
144
171
|
for (const entry of this._dynamicCasters){
|
|
145
172
|
entry.ref.get()?.off('bvchanged', entry.callback);
|
|
@@ -154,10 +181,10 @@ import { Disposable, AABB, DWeakRef } from '@zephyr3d/base';
|
|
|
154
181
|
this._dynamicRegion.beginExtend();
|
|
155
182
|
this.updateRegion();
|
|
156
183
|
}
|
|
157
|
-
/**
|
|
158
|
-
* Clears the manual region and all shadow casters.
|
|
159
|
-
*
|
|
160
|
-
* @returns `this` for chaining.
|
|
184
|
+
/**
|
|
185
|
+
* Clears the manual region and all shadow casters. The limit is kept.
|
|
186
|
+
*
|
|
187
|
+
* @returns `this` for chaining.
|
|
161
188
|
*/ clear() {
|
|
162
189
|
this._manualRegion = null;
|
|
163
190
|
this.clearCasters();
|
|
@@ -218,6 +245,17 @@ import { Disposable, AABB, DWeakRef } from '@zephyr3d/base';
|
|
|
218
245
|
if (this._dynamicRegion.isValid()) {
|
|
219
246
|
this.extendRegion(this._region, this._dynamicRegion);
|
|
220
247
|
}
|
|
248
|
+
if (this._limit && this._region.isValid()) {
|
|
249
|
+
const min = this._region.minPoint;
|
|
250
|
+
const max = this._region.maxPoint;
|
|
251
|
+
const lmin = this._limit.minPoint;
|
|
252
|
+
const lmax = this._limit.maxPoint;
|
|
253
|
+
min.setXYZ(Math.max(min.x, lmin.x), Math.max(min.y, lmin.y), Math.max(min.z, lmin.z));
|
|
254
|
+
max.setXYZ(Math.min(max.x, lmax.x), Math.min(max.y, lmax.y), Math.min(max.z, lmax.z));
|
|
255
|
+
if (min.x > max.x || min.y > max.y || min.z > max.z) {
|
|
256
|
+
this._region.beginExtend();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
221
259
|
}
|
|
222
260
|
/** @internal */ extendRegion(region, aabb) {
|
|
223
261
|
region.extend(aabb.minPoint);
|