@zephyr3d/scene 0.9.27 → 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 +54 -0
- 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 +279 -55
- 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 +171 -1
- 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 +104 -178
- 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 +25436 -15990
- package/dist/index.js +65 -11
- 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/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +66 -4
- 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 +191 -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 +333 -191
- 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 +1261 -1438
- 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 +106 -106
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +2 -6
- 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 +4 -13
- 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 +3 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +179 -64
- 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 +25 -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 +5 -5
- 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 +5 -10
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +247 -157
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +16 -38
- 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/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +19 -8
- 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/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 +162 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +10 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +14 -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 +272 -55
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- 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 +58 -158
- package/dist/render/underwater.js.map +1 -1
- 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 +134 -319
- package/dist/render/water_caustics.js.map +1 -1
- 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 +3 -3
- 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 +633 -268
- 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/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.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 +32 -82
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +7 -21
- package/dist/shaders/water_medium.js.map +1 -1
- 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 +40 -2
- 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 +34 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +46 -5
- 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 +87 -254
- 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 +1543 -264
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +10 -22
- 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
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import { Vector2, Vector4, DEPTH_FARTHEST, REVERSE_Z } from '@zephyr3d/base';
|
|
2
|
+
import { ShaderHelper } from '../material/shader/helper.js';
|
|
3
|
+
import { drawFullscreenQuad } from './fullscreenquad.js';
|
|
4
|
+
import { MAX_SHADOW_MASK_LIGHTS, LIGHT_TYPE_DIRECTIONAL } from '../values.js';
|
|
5
|
+
import { ndcToShadowCoord } from '../shaders/shadow.js';
|
|
6
|
+
import { SHADOW_MASK_LIGHTS_PER_LAYER } from './shadow_mask_pass.js';
|
|
7
|
+
import { SSSProfile, SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT, SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR, SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS, SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH } from '../material/sssprofile.js';
|
|
8
|
+
import { fetchSampler } from '../utility/misc.js';
|
|
9
|
+
|
|
10
|
+
const UNIFORM_NAME_SHADOW_DEPTH = 'Z_UniformShadowDepth';
|
|
11
|
+
/**
|
|
12
|
+
* Largest optical depth the transmission profile is defined over.
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* Re-exported from {@link SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH}: the encoding this
|
|
16
|
+
* pass writes (`1 - opticalDepth / MAX`) and the baked profile the BxDF indexes
|
|
17
|
+
* with it must agree on the same number, and the profile owns the baking.
|
|
18
|
+
*
|
|
19
|
+
* The clamp floor and additive bias below are in profile millimetres, not world
|
|
20
|
+
* units, so a producer feeding `opticalDepthScale` has to convert.
|
|
21
|
+
*
|
|
22
|
+
* @internal
|
|
23
|
+
*/ const MAX_TRANSMISSION_OPTICAL_DEPTH = SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH;
|
|
24
|
+
/** Poisson disc the light-space thickness is averaged over. */ const POISSON_DISC = [
|
|
25
|
+
[
|
|
26
|
+
0.25,
|
|
27
|
+
0.0
|
|
28
|
+
],
|
|
29
|
+
[
|
|
30
|
+
-0.31929,
|
|
31
|
+
0.292496
|
|
32
|
+
],
|
|
33
|
+
[
|
|
34
|
+
0.048872,
|
|
35
|
+
-0.556877
|
|
36
|
+
],
|
|
37
|
+
[
|
|
38
|
+
0.402444,
|
|
39
|
+
0.524918
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
-0.738535,
|
|
43
|
+
-0.130636
|
|
44
|
+
],
|
|
45
|
+
[
|
|
46
|
+
0.699605,
|
|
47
|
+
-0.445031
|
|
48
|
+
],
|
|
49
|
+
[
|
|
50
|
+
-0.234004,
|
|
51
|
+
0.870484
|
|
52
|
+
],
|
|
53
|
+
[
|
|
54
|
+
-0.446271,
|
|
55
|
+
-0.859268
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
-0.25,
|
|
59
|
+
0.0
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
0.31929,
|
|
63
|
+
-0.292496
|
|
64
|
+
],
|
|
65
|
+
[
|
|
66
|
+
-0.048872,
|
|
67
|
+
0.556877
|
|
68
|
+
],
|
|
69
|
+
[
|
|
70
|
+
-0.402444,
|
|
71
|
+
-0.524918
|
|
72
|
+
],
|
|
73
|
+
[
|
|
74
|
+
0.738535,
|
|
75
|
+
0.130636
|
|
76
|
+
],
|
|
77
|
+
[
|
|
78
|
+
-0.699605,
|
|
79
|
+
0.445031
|
|
80
|
+
],
|
|
81
|
+
[
|
|
82
|
+
0.234004,
|
|
83
|
+
-0.870484
|
|
84
|
+
],
|
|
85
|
+
[
|
|
86
|
+
0.446271,
|
|
87
|
+
0.859268
|
|
88
|
+
]
|
|
89
|
+
];
|
|
90
|
+
/** Radius the disc is scaled to, in shadow map texels. */ const SEARCH_RADIUS_TEXELS = 1;
|
|
91
|
+
/** The offsets actually sampled. A zero radius needs one tap, not sixteen copies of it. */ const taps = POISSON_DISC ;
|
|
92
|
+
/**
|
|
93
|
+
* Whether a light can contribute back-lit transmission this frame.
|
|
94
|
+
* @internal
|
|
95
|
+
*/ function lightSupportsTransmission(light, params) {
|
|
96
|
+
return !!light.transmission && !!params?.shadowMapFramebuffer?.getDepthAttachment();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Renders the screen-space light-space thickness used by subsurface transmission.
|
|
100
|
+
*
|
|
101
|
+
* WebGPU and WebGL2.
|
|
102
|
+
*
|
|
103
|
+
* @internal
|
|
104
|
+
*/ class TransmissionThicknessRenderer {
|
|
105
|
+
_programs;
|
|
106
|
+
_bindGroups;
|
|
107
|
+
_channelStates;
|
|
108
|
+
_nearFar;
|
|
109
|
+
_invRenderSize;
|
|
110
|
+
_cameraPosition;
|
|
111
|
+
_cameraParams;
|
|
112
|
+
_profileTexelSize;
|
|
113
|
+
constructor(){
|
|
114
|
+
this._programs = new Map();
|
|
115
|
+
this._bindGroups = new Map();
|
|
116
|
+
this._channelStates = null;
|
|
117
|
+
this._nearFar = new Vector2();
|
|
118
|
+
this._invRenderSize = new Vector2();
|
|
119
|
+
this._cameraPosition = new Vector4();
|
|
120
|
+
this._cameraParams = new Vector4();
|
|
121
|
+
this._profileTexelSize = new Vector2();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Render light-space thickness for every transmission-enabled light.
|
|
125
|
+
*
|
|
126
|
+
* @param ctx - Draw context, carrying `shadowMapInfo` for the lights.
|
|
127
|
+
* @param depthTexture - Linear depth from the depth prepass.
|
|
128
|
+
* @param profileIdTexture - Per-pixel skin profile id from the depth prepass,
|
|
129
|
+
* `0` where the pixel is not skin.
|
|
130
|
+
* @param lights - Shadow-casting lights in clustered-buffer order, i.e. exactly
|
|
131
|
+
* the array {@link ShadowMaskRenderer.render} is given, so that ordinals agree.
|
|
132
|
+
* @param getLayerFramebuffer - Resolves the framebuffer for array layer `k`.
|
|
133
|
+
*/ render(ctx, depthTexture, profileIdTexture, lights, getLayerFramebuffer) {
|
|
134
|
+
const device = ctx.device;
|
|
135
|
+
const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);
|
|
136
|
+
if (numLights === 0 || !ctx.shadowMapInfo) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const profileTable = SSSProfile.getTable(device);
|
|
140
|
+
if (!profileTable) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const numLayers = Math.ceil(numLights / SHADOW_MASK_LIGHTS_PER_LAYER);
|
|
144
|
+
const channelStates = this.getChannelStates(device);
|
|
145
|
+
const savedShadowLight = ctx.currentShadowLight;
|
|
146
|
+
this._profileTexelSize.setXY(1 / SSSProfile.tableColumns, 1 / SSSProfile.tableRows);
|
|
147
|
+
device.pushDeviceStates();
|
|
148
|
+
for(let layer = 0; layer < numLayers; layer++){
|
|
149
|
+
device.setFramebuffer(getLayerFramebuffer(layer));
|
|
150
|
+
// 1 encodes zero optical depth, so an untouched channel reads as "nothing
|
|
151
|
+
// in the way" and contributes no transmission.
|
|
152
|
+
device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);
|
|
153
|
+
for(let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++){
|
|
154
|
+
const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;
|
|
155
|
+
if (ordinal >= numLights) {
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
const light = lights[ordinal];
|
|
159
|
+
const shadowMapParams = ctx.shadowMapInfo.get(light) ?? null;
|
|
160
|
+
if (!lightSupportsTransmission(light, shadowMapParams)) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
ctx.currentShadowLight = light;
|
|
164
|
+
this.renderLightChannel(ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams, channelStates[channel]);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
device.popDeviceStates();
|
|
168
|
+
ctx.currentShadowLight = savedShadowLight;
|
|
169
|
+
}
|
|
170
|
+
renderLightChannel(ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams, renderState) {
|
|
171
|
+
const device = ctx.device;
|
|
172
|
+
const key = this.getProgramKey(ctx, shadowMapParams);
|
|
173
|
+
let program = this._programs.get(key) ?? null;
|
|
174
|
+
if (!program) {
|
|
175
|
+
program = this.createProgram(ctx, shadowMapParams);
|
|
176
|
+
this._programs.set(key, program);
|
|
177
|
+
this._bindGroups.set(key, device.createBindGroup(program.bindGroupLayouts[0]));
|
|
178
|
+
}
|
|
179
|
+
const bindGroup = this._bindGroups.get(key);
|
|
180
|
+
this.setUniforms(bindGroup, ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams);
|
|
181
|
+
device.setProgram(program);
|
|
182
|
+
device.setBindGroup(0, bindGroup);
|
|
183
|
+
drawFullscreenQuad(renderState);
|
|
184
|
+
}
|
|
185
|
+
getProgramKey(ctx, shadowMapParams) {
|
|
186
|
+
const depth = shadowMapParams.shadowMapFramebuffer.getDepthAttachment();
|
|
187
|
+
return `${ctx.device.type}|${shadowMapParams.lightType}|${shadowMapParams.numShadowCascades}|${depth.isTexture2DArray() ? 'array' : depth.isTextureCube() ? 'cube' : '2d'}`;
|
|
188
|
+
}
|
|
189
|
+
getChannelStates(device) {
|
|
190
|
+
if (!this._channelStates) {
|
|
191
|
+
this._channelStates = [];
|
|
192
|
+
for(let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++){
|
|
193
|
+
const rs = device.createRenderStateSet();
|
|
194
|
+
rs.useDepthState().enableTest(false).enableWrite(false);
|
|
195
|
+
rs.useRasterizerState().setCullMode('none');
|
|
196
|
+
rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);
|
|
197
|
+
this._channelStates.push(rs);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return this._channelStates;
|
|
201
|
+
}
|
|
202
|
+
setUniforms(bindGroup, ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams) {
|
|
203
|
+
const camera = ctx.camera;
|
|
204
|
+
const light = ctx.currentShadowLight;
|
|
205
|
+
const near = camera.getNearPlane();
|
|
206
|
+
const far = camera.getFarPlane();
|
|
207
|
+
const cameraPos = camera.getWorldPosition();
|
|
208
|
+
this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);
|
|
209
|
+
this._cameraParams.setXYZW(near, far, 1, 1);
|
|
210
|
+
this._nearFar.setXY(near, far);
|
|
211
|
+
bindGroup.setValue('camera', {
|
|
212
|
+
position: this._cameraPosition,
|
|
213
|
+
params: this._cameraParams,
|
|
214
|
+
shadowDebugCascades: 0,
|
|
215
|
+
framestamp: ctx.device.frameInfo.frameCounter
|
|
216
|
+
});
|
|
217
|
+
const implParams = new Vector4();
|
|
218
|
+
shadowMapParams.impl.getParams(implParams);
|
|
219
|
+
bindGroup.setValue('light', {
|
|
220
|
+
sunDir: ctx.sunLight ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1) : new Vector4(0, 1, 0, 0).xyz(),
|
|
221
|
+
shadowCascades: shadowMapParams.numShadowCascades,
|
|
222
|
+
positionAndRange: light.positionAndRange,
|
|
223
|
+
directionAndCutoff: light.directionAndCutoff,
|
|
224
|
+
diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),
|
|
225
|
+
extraParams: light.extraParams,
|
|
226
|
+
cascadeDistances: shadowMapParams.cascadeDistances,
|
|
227
|
+
depthBiasValues: shadowMapParams.depthBiasValues[0],
|
|
228
|
+
shadowCameraParams: shadowMapParams.cameraParams,
|
|
229
|
+
depthBiasScales: shadowMapParams.depthBiasScales,
|
|
230
|
+
implParams: implParams,
|
|
231
|
+
shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),
|
|
232
|
+
shadowStrength: light.shadow.shadowStrength,
|
|
233
|
+
envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),
|
|
234
|
+
envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1
|
|
235
|
+
});
|
|
236
|
+
// The depth prepass draws with the TAA jitter; take positions back through it
|
|
237
|
+
// (see ShadowMaskPass)
|
|
238
|
+
bindGroup.setValue('invViewProjMatrix', ctx.motionVectors ? camera.jitteredInvVPMatrix : camera.invViewProjectionMatrix);
|
|
239
|
+
bindGroup.setValue('cameraNearFar', this._nearFar);
|
|
240
|
+
bindGroup.setValue('profileTexelSize', this._profileTexelSize);
|
|
241
|
+
this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);
|
|
242
|
+
bindGroup.setValue('invRenderSize', this._invRenderSize);
|
|
243
|
+
bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));
|
|
244
|
+
bindGroup.setTexture('profileIdTex', profileIdTexture, fetchSampler('clamp_nearest_nomip'));
|
|
245
|
+
// rgba32f, so WebGPU only accepts a non-filtering sampler; every read is a
|
|
246
|
+
// single texel anyway.
|
|
247
|
+
bindGroup.setTexture('profileTex', profileTable, fetchSampler('clamp_nearest_nomip'));
|
|
248
|
+
const shadowDepth = shadowMapParams.shadowMapFramebuffer.getDepthAttachment();
|
|
249
|
+
if (shadowDepth.isTextureCube()) {
|
|
250
|
+
// Point sampled, for the reason the 2D maps use textureLoad: see
|
|
251
|
+
// zLoadShadowDepth.
|
|
252
|
+
bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth, fetchSampler('clamp_nearest_nomip'));
|
|
253
|
+
} else {
|
|
254
|
+
// Sampled through textureLoad only, so no sampler is bound for it.
|
|
255
|
+
bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
createProgram(ctx, shadowMapParams) {
|
|
259
|
+
const device = ctx.device;
|
|
260
|
+
const numCascades = shadowMapParams.numShadowCascades;
|
|
261
|
+
const lightType = shadowMapParams.lightType;
|
|
262
|
+
const depthAttachment = shadowMapParams.shadowMapFramebuffer.getDepthAttachment();
|
|
263
|
+
const isArray = depthAttachment.isTexture2DArray();
|
|
264
|
+
const cube = depthAttachment.isTextureCube();
|
|
265
|
+
const ortho = lightType === LIGHT_TYPE_DIRECTIONAL;
|
|
266
|
+
// WebGL2 has no depth texture type that allows a non-comparison read:
|
|
267
|
+
// texelFetch is undefined on sampler2DShadow and samplerCubeShadow always
|
|
268
|
+
// compares. A depth texture bound to a plain float sampler with compare
|
|
269
|
+
// mode off returns its depth in .r, so declare it that way there.
|
|
270
|
+
const webgpu = device.type === 'webgpu';
|
|
271
|
+
const program = device.buildRenderProgram({
|
|
272
|
+
label: 'TransmissionThickness',
|
|
273
|
+
vertex (pb) {
|
|
274
|
+
this.$inputs.pos = pb.vec2().attrib('position');
|
|
275
|
+
this.$outputs.uv = pb.vec2();
|
|
276
|
+
pb.main(function() {
|
|
277
|
+
this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);
|
|
278
|
+
this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
|
|
279
|
+
if (device.type === 'webgpu') {
|
|
280
|
+
this.$builtins.position.y = pb.neg(this.$builtins.position.y);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
},
|
|
284
|
+
fragment (pb) {
|
|
285
|
+
const cameraStruct = pb.defineStruct([
|
|
286
|
+
pb.vec4('position'),
|
|
287
|
+
pb.vec4('params'),
|
|
288
|
+
pb.float('shadowDebugCascades'),
|
|
289
|
+
pb.int('framestamp')
|
|
290
|
+
]);
|
|
291
|
+
// Must match helper.ts currentShadowLight lightStruct field-for-field:
|
|
292
|
+
// ShaderHelper.calculateShadowSpaceVertex and friends read scope.light.
|
|
293
|
+
const lightStruct = pb.defineStruct([
|
|
294
|
+
pb.vec3('sunDir'),
|
|
295
|
+
pb.int('shadowCascades'),
|
|
296
|
+
pb.vec4('positionAndRange'),
|
|
297
|
+
pb.vec4('directionAndCutoff'),
|
|
298
|
+
pb.vec4('diffuseAndIntensity'),
|
|
299
|
+
pb.vec4('extraParams'),
|
|
300
|
+
pb.vec4('cascadeDistances'),
|
|
301
|
+
pb.vec4('depthBiasValues'),
|
|
302
|
+
pb.vec4('shadowCameraParams'),
|
|
303
|
+
pb.vec4('depthBiasScales'),
|
|
304
|
+
pb.vec4('implParams'),
|
|
305
|
+
pb.vec4[16]('shadowMatrices'),
|
|
306
|
+
pb.float('shadowStrength'),
|
|
307
|
+
pb.float('envLightStrength'),
|
|
308
|
+
pb.float('envLightSpecularStrength')
|
|
309
|
+
]);
|
|
310
|
+
this.camera = cameraStruct().uniform(0);
|
|
311
|
+
this.light = lightStruct().uniform(0);
|
|
312
|
+
if (webgpu) {
|
|
313
|
+
this[UNIFORM_NAME_SHADOW_DEPTH] = cube ? pb.texCubeShadow().uniform(0) : (isArray ? pb.tex2DArrayShadow() : pb.tex2DShadow()).uniform(0).noSampler();
|
|
314
|
+
} else {
|
|
315
|
+
this[UNIFORM_NAME_SHADOW_DEPTH] = (cube ? pb.texCube() : isArray ? pb.tex2DArray() : pb.tex2D()).sampleType('unfilterable-float').uniform(0);
|
|
316
|
+
}
|
|
317
|
+
this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
|
|
318
|
+
this.profileIdTex = pb.tex2D().uniform(0);
|
|
319
|
+
// rgba32f, hence unfilterable; every read here is a single texel.
|
|
320
|
+
this.profileTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);
|
|
321
|
+
this.invViewProjMatrix = pb.mat4().uniform(0);
|
|
322
|
+
this.cameraNearFar = pb.vec2().uniform(0);
|
|
323
|
+
this.invRenderSize = pb.vec2().uniform(0);
|
|
324
|
+
this.profileTexelSize = pb.vec2().uniform(0);
|
|
325
|
+
this.$outputs.color = pb.vec4();
|
|
326
|
+
// One texel of a profile row, addressed exactly as skin_brdf.ts does:
|
|
327
|
+
// the row is the normalized id and the column is a parameter group.
|
|
328
|
+
pb.func('zReadProfile', [
|
|
329
|
+
pb.float('id'),
|
|
330
|
+
pb.float('column')
|
|
331
|
+
], function() {
|
|
332
|
+
this.$l.u = pb.mul(pb.add(this.column, 0.5), this.profileTexelSize.x);
|
|
333
|
+
this.$l.v = pb.mul(pb.add(pb.mul(pb.clamp(this.id, 0, 1), 255), 0.5), this.profileTexelSize.y);
|
|
334
|
+
this.$return(pb.textureSampleLevel(this.profileTex, pb.vec2(this.u, this.v), 0));
|
|
335
|
+
});
|
|
336
|
+
/**
|
|
337
|
+
* Geometric normal from the depth prepass. Transcribed from
|
|
338
|
+
* ShadowMaskRenderer: a fullscreen pass has no interpolated normal, and
|
|
339
|
+
* the naive cross(ddx, ddy) spans depth discontinuities.
|
|
340
|
+
*/ pb.func('zReconstructNormal', [
|
|
341
|
+
pb.vec2('uv'),
|
|
342
|
+
pb.vec4('center')
|
|
343
|
+
], function() {
|
|
344
|
+
this.$l.dx = pb.vec2(this.invRenderSize.x, 0);
|
|
345
|
+
this.$l.dy = pb.vec2(0, this.invRenderSize.y);
|
|
346
|
+
const tap = (uv)=>ShaderHelper.samplePositionFromDepth(this, this.depthTex, uv, this.invViewProjMatrix, this.cameraNearFar);
|
|
347
|
+
this.$l.right = tap(pb.add(this.uv, this.dx));
|
|
348
|
+
this.$l.left = tap(pb.sub(this.uv, this.dx));
|
|
349
|
+
this.$l.up = tap(pb.add(this.uv, this.dy));
|
|
350
|
+
this.$l.down = tap(pb.sub(this.uv, this.dy));
|
|
351
|
+
this.$l.edgeX = pb.sub(this.right.xyz, this.center.xyz);
|
|
352
|
+
this.$if(pb.lessThan(pb.abs(pb.sub(this.left.w, this.center.w)), pb.abs(pb.sub(this.right.w, this.center.w))), function() {
|
|
353
|
+
this.edgeX = pb.sub(this.center.xyz, this.left.xyz);
|
|
354
|
+
});
|
|
355
|
+
this.$l.edgeY = pb.sub(this.up.xyz, this.center.xyz);
|
|
356
|
+
this.$if(pb.lessThan(pb.abs(pb.sub(this.down.w, this.center.w)), pb.abs(pb.sub(this.up.w, this.center.w))), function() {
|
|
357
|
+
this.edgeY = pb.sub(this.center.xyz, this.down.xyz);
|
|
358
|
+
});
|
|
359
|
+
this.$l.n = pb.cross(this.edgeX, this.edgeY);
|
|
360
|
+
this.$l.len = pb.length(this.n);
|
|
361
|
+
this.$if(pb.lessThan(this.len, 1e-12), function() {
|
|
362
|
+
this.$return(pb.vec3(0));
|
|
363
|
+
});
|
|
364
|
+
this.n = pb.div(this.n, this.len);
|
|
365
|
+
this.$l.toEye = pb.sub(this.camera.position.xyz, this.center.xyz);
|
|
366
|
+
this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function() {
|
|
367
|
+
this.n = pb.neg(this.n);
|
|
368
|
+
});
|
|
369
|
+
this.$return(this.n);
|
|
370
|
+
});
|
|
371
|
+
if (!cube) {
|
|
372
|
+
pb.func('zLoadShadowDepth', [
|
|
373
|
+
pb.vec2('coord'),
|
|
374
|
+
pb.float('size'),
|
|
375
|
+
...isArray ? [
|
|
376
|
+
pb.int('layer')
|
|
377
|
+
] : []
|
|
378
|
+
], function() {
|
|
379
|
+
this.$l.texel = pb.ivec2(pb.clamp(pb.mul(this.coord, this.size), pb.vec2(0), pb.sub(pb.vec2(this.size), pb.vec2(1))));
|
|
380
|
+
const depth = isArray ? pb.textureArrayLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, this.layer, 0) : pb.textureLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, 0);
|
|
381
|
+
this.$return(webgpu ? depth : depth.x);
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
pb.main(function() {
|
|
385
|
+
this.$l.pos = ShaderHelper.samplePositionFromDepth(this, this.depthTex, this.$inputs.uv, this.invViewProjMatrix, this.cameraNearFar);
|
|
386
|
+
this.$outputs.color = pb.vec4(1);
|
|
387
|
+
this.$l.profileId = pb.textureSampleLevel(this.profileIdTex, this.$inputs.uv, 0).r;
|
|
388
|
+
this.$if(pb.lessThan(this.profileId, 0.5 / 255), function() {
|
|
389
|
+
this.$return();
|
|
390
|
+
});
|
|
391
|
+
this.$l.trParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.transmissionParamColumn));
|
|
392
|
+
this.$l.scalingParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.scalingParamColumn));
|
|
393
|
+
this.$l.opticalDepthScale = pb.mul(SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT, this.trParams.x);
|
|
394
|
+
this.$l.shrinkDistance = pb.mul(this.trParams.y, 0.5 * 0.01, this.scalingParams.x);
|
|
395
|
+
this.$l.normalScaleBias = pb.mul(this.shrinkDistance, this.opticalDepthScale);
|
|
396
|
+
this.$if(pb.lessThan(this.pos.w, 1), function() {
|
|
397
|
+
this.$l.normal = this.zReconstructNormal(this.$inputs.uv, this.pos);
|
|
398
|
+
this.$l.split = pb.int(0);
|
|
399
|
+
if (numCascades > 1) {
|
|
400
|
+
this.$l.linearDepth = pb.mul(this.pos.w, this.camera.params.y);
|
|
401
|
+
this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.light.cascadeDistances));
|
|
402
|
+
this.$l.cascadeFlags = pb.vec4(pb.float(pb.greaterThan(this.light.shadowCascades, 0)), pb.float(pb.greaterThan(this.light.shadowCascades, 1)), pb.float(pb.greaterThan(this.light.shadowCascades, 2)), pb.float(pb.greaterThan(this.light.shadowCascades, 3)));
|
|
403
|
+
this.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));
|
|
404
|
+
}
|
|
405
|
+
this.$l.shrunk = pb.sub(this.pos.xyz, pb.mul(this.normal, this.shrinkDistance));
|
|
406
|
+
if (cube) {
|
|
407
|
+
this.$l.lv = pb.sub(this.shrunk, this.light.positionAndRange.xyz);
|
|
408
|
+
this.$l.maxZ = pb.max(pb.max(pb.abs(this.lv.x), pb.abs(this.lv.y)), pb.abs(this.lv.z));
|
|
409
|
+
this.$l.inside = pb.and(pb.greaterThanEqual(this.maxZ, this.light.shadowCameraParams.x), pb.lessThanEqual(this.maxZ, this.light.shadowCameraParams.y));
|
|
410
|
+
} else {
|
|
411
|
+
this.$l.sv = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.shrunk, 1), numCascades > 1 ? this.split : 0);
|
|
412
|
+
this.$l.sc = ndcToShadowCoord(this, pb.div(this.sv, this.sv.w));
|
|
413
|
+
this.$l.inside = pb.all(pb.bvec4(pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.x, 0), pb.lessThanEqual(this.sc.x, 1))), pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.y, 0), pb.lessThanEqual(this.sc.y, 1))), pb.greaterThanEqual(this.sc.z, 0), pb.lessThanEqual(this.sc.z, 1)));
|
|
414
|
+
}
|
|
415
|
+
this.$if(this.inside, function() {
|
|
416
|
+
this.$l.size = this.light.shadowCameraParams.z;
|
|
417
|
+
if (cube) {
|
|
418
|
+
this.$l.receiverDist = pb.length(this.lv);
|
|
419
|
+
this.$l.dir = pb.div(this.lv, this.receiverDist);
|
|
420
|
+
this.$l.onCube = pb.div(this.lv, this.maxZ);
|
|
421
|
+
this.$l.helper = this.$choice(pb.lessThan(pb.abs(this.dir.y), 0.99), pb.vec3(0, 1, 0), pb.vec3(1, 0, 0));
|
|
422
|
+
this.$l.side = pb.normalize(pb.cross(this.helper, this.dir));
|
|
423
|
+
this.$l.up = pb.cross(this.dir, this.side);
|
|
424
|
+
{
|
|
425
|
+
this.$l.radius = pb.div(2 * SEARCH_RADIUS_TEXELS, this.size);
|
|
426
|
+
}
|
|
427
|
+
} else {
|
|
428
|
+
this.$l.radius = pb.div(SEARCH_RADIUS_TEXELS, this.size);
|
|
429
|
+
}
|
|
430
|
+
if (ortho) {
|
|
431
|
+
this.$l.zRow = this.light.shadowMatrices.at(pb.add(pb.mul(this.split, 4), 2));
|
|
432
|
+
this.$l.zRange = pb.div(REVERSE_Z ? 1 : 2, pb.max(pb.length(this.zRow.xyz), 1e-8));
|
|
433
|
+
}
|
|
434
|
+
this.$l.sum = pb.float(0);
|
|
435
|
+
for(let i = 0; i < taps.length; i++){
|
|
436
|
+
if (cube) {
|
|
437
|
+
this.$l[`u${i}`] = pb.add(this.onCube, pb.mul(pb.add(pb.mul(this.side, taps[i][0]), pb.mul(this.up, taps[i][1])), this.radius)) ;
|
|
438
|
+
this.$l[`b${i}`] = pb.textureSampleLevel(this[UNIFORM_NAME_SHADOW_DEPTH], this[`u${i}`], 0).x;
|
|
439
|
+
this.$l[`m${i}`] = pb.max(pb.max(pb.abs(this[`u${i}`].x), pb.abs(this[`u${i}`].y)), pb.abs(this[`u${i}`].z));
|
|
440
|
+
this.$l[`t${i}`] = pb.sub(this.receiverDist, pb.mul(ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams), pb.div(pb.length(this[`u${i}`]), this[`m${i}`])));
|
|
441
|
+
} else {
|
|
442
|
+
this.$l[`c${i}`] = pb.add(this.sc.xy, pb.mul(pb.vec2(taps[i][0], taps[i][1]), this.radius)) ;
|
|
443
|
+
this.$l[`b${i}`] = isArray ? this.zLoadShadowDepth(this[`c${i}`], this.size, this.split) : this.zLoadShadowDepth(this[`c${i}`], this.size);
|
|
444
|
+
// Under reverse-Z a blocker sits at a larger depth value.
|
|
445
|
+
this.$l[`d${i}`] = REVERSE_Z ? pb.sub(this[`b${i}`], this.sc.z) : pb.sub(this.sc.z, this[`b${i}`]);
|
|
446
|
+
if (ortho) {
|
|
447
|
+
this.$l[`t${i}`] = pb.mul(this[`d${i}`], this.zRange);
|
|
448
|
+
} else {
|
|
449
|
+
this.$l[`t${i}`] = pb.sub(ShaderHelper.nonLinearDepthToLinear(this, this.sc.z, this.light.shadowCameraParams), ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
this.$l[`o${i}`] = pb.mul(this[`t${i}`], this.opticalDepthScale);
|
|
453
|
+
this.$l[`k${i}`] = pb.clamp(pb.max(pb.add(this[`o${i}`], this.normalScaleBias), 0), SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR, MAX_TRANSMISSION_OPTICAL_DEPTH);
|
|
454
|
+
this.sum = pb.add(this.sum, this[`k${i}`]);
|
|
455
|
+
}
|
|
456
|
+
this.$l.opticalDepth = pb.add(pb.div(this.sum, taps.length), SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS);
|
|
457
|
+
this.$outputs.color = pb.vec4(pb.sub(1, pb.div(this.opticalDepth, MAX_TRANSMISSION_OPTICAL_DEPTH)));
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
program.name = '@TransmissionThickness';
|
|
464
|
+
return program;
|
|
465
|
+
}
|
|
466
|
+
/** Release cached GPU resources. */ dispose() {
|
|
467
|
+
for (const program of this._programs.values()){
|
|
468
|
+
program.dispose();
|
|
469
|
+
}
|
|
470
|
+
this._programs.clear();
|
|
471
|
+
this._bindGroups.clear();
|
|
472
|
+
this._channelStates = null;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
export { MAX_TRANSMISSION_OPTICAL_DEPTH, TransmissionThicknessRenderer, lightSupportsTransmission };
|
|
477
|
+
//# sourceMappingURL=transmission_thickness_pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmission_thickness_pass.js","sources":["../../src/render/transmission_thickness_pass.ts"],"sourcesContent":["import { DEPTH_FARTHEST, REVERSE_Z, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { ShadowMapParams } from '../shadow/shadowmapper';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { LIGHT_TYPE_DIRECTIONAL, MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport { ndcToShadowCoord } from '../shaders/shadow';\r\nimport { SHADOW_MASK_LIGHTS_PER_LAYER } from './shadow_mask_pass';\r\nimport {\r\n SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH,\r\n SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT,\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS,\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR,\r\n SSSProfile\r\n} from '../material/sssprofile';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\nconst UNIFORM_NAME_SHADOW_DEPTH = 'Z_UniformShadowDepth';\r\n\r\n/**\r\n * Largest optical depth the transmission profile is defined over.\r\n *\r\n * @remarks\r\n * Re-exported from {@link SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH}: the encoding this\r\n * pass writes (`1 - opticalDepth / MAX`) and the baked profile the BxDF indexes\r\n * with it must agree on the same number, and the profile owns the baking.\r\n *\r\n * The clamp floor and additive bias below are in profile millimetres, not world\r\n * units, so a producer feeding `opticalDepthScale` has to convert.\r\n *\r\n * @internal\r\n */\r\nexport const MAX_TRANSMISSION_OPTICAL_DEPTH = SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH;\r\n\r\n/** Poisson disc the light-space thickness is averaged over. */\r\nconst POISSON_DISC: number[][] = [\r\n [0.25, 0.0],\r\n [-0.31929, 0.292496],\r\n [0.048872, -0.556877],\r\n [0.402444, 0.524918],\r\n [-0.738535, -0.130636],\r\n [0.699605, -0.445031],\r\n [-0.234004, 0.870484],\r\n [-0.446271, -0.859268],\r\n [-0.25, 0.0],\r\n [0.31929, -0.292496],\r\n [-0.048872, 0.556877],\r\n [-0.402444, -0.524918],\r\n [0.738535, 0.130636],\r\n [-0.699605, 0.445031],\r\n [0.234004, -0.870484],\r\n [0.446271, 0.859268]\r\n];\r\n\r\n/** Radius the disc is scaled to, in shadow map texels. */\r\nconst SEARCH_RADIUS_TEXELS = 1;\r\n\r\n/** The offsets actually sampled. A zero radius needs one tap, not sixteen copies of it. */\r\nconst taps: number[][] = SEARCH_RADIUS_TEXELS > 0 ? POISSON_DISC : [[0, 0]];\r\n\r\n/**\r\n * Whether a light can contribute back-lit transmission this frame.\r\n * @internal\r\n */\r\nexport function lightSupportsTransmission(light: PunctualLight, params: Nullable<ShadowMapParams>): boolean {\r\n return !!light.transmission && !!params?.shadowMapFramebuffer?.getDepthAttachment();\r\n}\r\n\r\n/**\r\n * Renders the screen-space light-space thickness used by subsurface transmission.\r\n *\r\n * WebGPU and WebGL2.\r\n *\r\n * @internal\r\n */\r\nexport class TransmissionThicknessRenderer {\r\n private _programs: Map<string, GPUProgram>;\r\n private _bindGroups: Map<string, BindGroup>;\r\n private _channelStates: Nullable<RenderStateSet[]>;\r\n private readonly _nearFar: Vector2;\r\n private readonly _invRenderSize: Vector2;\r\n private readonly _cameraPosition: Vector4;\r\n private readonly _cameraParams: Vector4;\r\n private readonly _profileTexelSize: Vector2;\r\n\r\n constructor() {\r\n this._programs = new Map();\r\n this._bindGroups = new Map();\r\n this._channelStates = null;\r\n this._nearFar = new Vector2();\r\n this._invRenderSize = new Vector2();\r\n this._cameraPosition = new Vector4();\r\n this._cameraParams = new Vector4();\r\n this._profileTexelSize = new Vector2();\r\n }\r\n\r\n /**\r\n * Render light-space thickness for every transmission-enabled light.\r\n *\r\n * @param ctx - Draw context, carrying `shadowMapInfo` for the lights.\r\n * @param depthTexture - Linear depth from the depth prepass.\r\n * @param profileIdTexture - Per-pixel skin profile id from the depth prepass,\r\n * `0` where the pixel is not skin.\r\n * @param lights - Shadow-casting lights in clustered-buffer order, i.e. exactly\r\n * the array {@link ShadowMaskRenderer.render} is given, so that ordinals agree.\r\n * @param getLayerFramebuffer - Resolves the framebuffer for array layer `k`.\r\n */\r\n render(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n profileIdTexture: Texture2D,\r\n lights: PunctualLight[],\r\n getLayerFramebuffer: (layer: number) => FrameBuffer\r\n ): void {\r\n const device = ctx.device;\r\n const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);\r\n if (numLights === 0 || !ctx.shadowMapInfo) {\r\n return;\r\n }\r\n const profileTable = SSSProfile.getTable(device);\r\n if (!profileTable) {\r\n return;\r\n }\r\n const numLayers = Math.ceil(numLights / SHADOW_MASK_LIGHTS_PER_LAYER);\r\n const channelStates = this.getChannelStates(device);\r\n const savedShadowLight = ctx.currentShadowLight;\r\n this._profileTexelSize.setXY(1 / SSSProfile.tableColumns, 1 / SSSProfile.tableRows);\r\n\r\n device.pushDeviceStates();\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n device.setFramebuffer(getLayerFramebuffer(layer));\r\n // 1 encodes zero optical depth, so an untouched channel reads as \"nothing\r\n // in the way\" and contributes no transmission.\r\n device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);\r\n for (let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++) {\r\n const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;\r\n if (ordinal >= numLights) {\r\n break;\r\n }\r\n const light = lights[ordinal];\r\n const shadowMapParams = ctx.shadowMapInfo.get(light) ?? null;\r\n if (!lightSupportsTransmission(light, shadowMapParams)) {\r\n continue;\r\n }\r\n ctx.currentShadowLight = light;\r\n this.renderLightChannel(\r\n ctx,\r\n depthTexture,\r\n profileIdTexture,\r\n profileTable,\r\n shadowMapParams!,\r\n channelStates[channel]\r\n );\r\n }\r\n }\r\n device.popDeviceStates();\r\n ctx.currentShadowLight = savedShadowLight;\r\n }\r\n\r\n private renderLightChannel(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n profileIdTexture: Texture2D,\r\n profileTable: Texture2D,\r\n shadowMapParams: ShadowMapParams,\r\n renderState: RenderStateSet\r\n ): void {\r\n const device = ctx.device;\r\n const key = this.getProgramKey(ctx, shadowMapParams);\r\n let program = this._programs.get(key) ?? null;\r\n if (!program) {\r\n program = this.createProgram(ctx, shadowMapParams);\r\n this._programs.set(key, program);\r\n this._bindGroups.set(key, device.createBindGroup(program.bindGroupLayouts[0]));\r\n }\r\n const bindGroup = this._bindGroups.get(key)!;\r\n this.setUniforms(bindGroup, ctx, depthTexture, profileIdTexture, profileTable, shadowMapParams);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(renderState);\r\n }\r\n\r\n private getProgramKey(ctx: DrawContext, shadowMapParams: ShadowMapParams): string {\r\n const depth = shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()!;\r\n return `${ctx.device.type}|${shadowMapParams.lightType}|${shadowMapParams.numShadowCascades}|${\r\n depth.isTexture2DArray() ? 'array' : depth.isTextureCube() ? 'cube' : '2d'\r\n }`;\r\n }\r\n\r\n private getChannelStates(device: AbstractDevice): RenderStateSet[] {\r\n if (!this._channelStates) {\r\n this._channelStates = [];\r\n for (let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++) {\r\n const rs = device.createRenderStateSet();\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);\r\n this._channelStates.push(rs);\r\n }\r\n }\r\n return this._channelStates;\r\n }\r\n\r\n private setUniforms(\r\n bindGroup: BindGroup,\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n profileIdTexture: Texture2D,\r\n profileTable: Texture2D,\r\n shadowMapParams: ShadowMapParams\r\n ): void {\r\n const camera = ctx.camera;\r\n const light = ctx.currentShadowLight!;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n const cameraPos = camera.getWorldPosition();\r\n this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\r\n this._cameraParams.setXYZW(near, far, 1, 1);\r\n this._nearFar.setXY(near, far);\r\n bindGroup.setValue('camera', {\r\n position: this._cameraPosition,\r\n params: this._cameraParams,\r\n shadowDebugCascades: 0,\r\n framestamp: ctx.device.frameInfo.frameCounter\r\n });\r\n const implParams = new Vector4();\r\n shadowMapParams.impl!.getParams(implParams);\r\n bindGroup.setValue('light', {\r\n sunDir: ctx.sunLight\r\n ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1)\r\n : new Vector4(0, 1, 0, 0).xyz(),\r\n shadowCascades: shadowMapParams.numShadowCascades,\r\n positionAndRange: light.positionAndRange,\r\n directionAndCutoff: light.directionAndCutoff,\r\n diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),\r\n extraParams: light.extraParams,\r\n cascadeDistances: shadowMapParams.cascadeDistances,\r\n depthBiasValues: shadowMapParams.depthBiasValues[0],\r\n shadowCameraParams: shadowMapParams.cameraParams,\r\n depthBiasScales: shadowMapParams.depthBiasScales,\r\n implParams: implParams,\r\n shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),\r\n shadowStrength: light.shadow.shadowStrength,\r\n envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),\r\n envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1\r\n });\r\n // The depth prepass draws with the TAA jitter; take positions back through it\r\n // (see ShadowMaskPass)\r\n bindGroup.setValue(\r\n 'invViewProjMatrix',\r\n ctx.motionVectors ? camera.jitteredInvVPMatrix : camera.invViewProjectionMatrix\r\n );\r\n bindGroup.setValue('cameraNearFar', this._nearFar);\r\n bindGroup.setValue('profileTexelSize', this._profileTexelSize);\r\n this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);\r\n bindGroup.setValue('invRenderSize', this._invRenderSize);\r\n bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture('profileIdTex', profileIdTexture, fetchSampler('clamp_nearest_nomip'));\r\n // rgba32f, so WebGPU only accepts a non-filtering sampler; every read is a\r\n // single texel anyway.\r\n bindGroup.setTexture('profileTex', profileTable, fetchSampler('clamp_nearest_nomip'));\r\n const shadowDepth = shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()!;\r\n if (shadowDepth.isTextureCube()) {\r\n // Point sampled, for the reason the 2D maps use textureLoad: see\r\n // zLoadShadowDepth.\r\n bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth, fetchSampler('clamp_nearest_nomip'));\r\n } else {\r\n // Sampled through textureLoad only, so no sampler is bound for it.\r\n bindGroup.setTexture(UNIFORM_NAME_SHADOW_DEPTH, shadowDepth);\r\n }\r\n }\r\n\r\n private createProgram(ctx: DrawContext, shadowMapParams: ShadowMapParams): GPUProgram {\r\n const device = ctx.device;\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const lightType = shadowMapParams.lightType;\r\n const depthAttachment = shadowMapParams.shadowMapFramebuffer!.getDepthAttachment()!;\r\n const isArray = depthAttachment.isTexture2DArray();\r\n const cube = depthAttachment.isTextureCube();\r\n const ortho = lightType === LIGHT_TYPE_DIRECTIONAL;\r\n // WebGL2 has no depth texture type that allows a non-comparison read:\r\n // texelFetch is undefined on sampler2DShadow and samplerCubeShadow always\r\n // compares. A depth texture bound to a plain float sampler with compare\r\n // mode off returns its depth in .r, so declare it that way there.\r\n const webgpu = device.type === 'webgpu';\r\n const program = device.buildRenderProgram({\r\n label: 'TransmissionThickness',\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n const cameraStruct = pb.defineStruct([\r\n pb.vec4('position'),\r\n pb.vec4('params'),\r\n pb.float('shadowDebugCascades'),\r\n pb.int('framestamp')\r\n ]);\r\n // Must match helper.ts currentShadowLight lightStruct field-for-field:\r\n // ShaderHelper.calculateShadowSpaceVertex and friends read scope.light.\r\n const lightStruct = pb.defineStruct([\r\n pb.vec3('sunDir'),\r\n pb.int('shadowCascades'),\r\n pb.vec4('positionAndRange'),\r\n pb.vec4('directionAndCutoff'),\r\n pb.vec4('diffuseAndIntensity'),\r\n pb.vec4('extraParams'),\r\n pb.vec4('cascadeDistances'),\r\n pb.vec4('depthBiasValues'),\r\n pb.vec4('shadowCameraParams'),\r\n pb.vec4('depthBiasScales'),\r\n pb.vec4('implParams'),\r\n pb.vec4[16]('shadowMatrices'),\r\n pb.float('shadowStrength'),\r\n pb.float('envLightStrength'),\r\n pb.float('envLightSpecularStrength')\r\n ]);\r\n this.camera = cameraStruct().uniform(0);\r\n this.light = lightStruct().uniform(0);\r\n if (webgpu) {\r\n this[UNIFORM_NAME_SHADOW_DEPTH] = cube\r\n ? pb.texCubeShadow().uniform(0)\r\n : (isArray ? pb.tex2DArrayShadow() : pb.tex2DShadow()).uniform(0).noSampler();\r\n } else {\r\n this[UNIFORM_NAME_SHADOW_DEPTH] = (cube ? pb.texCube() : isArray ? pb.tex2DArray() : pb.tex2D())\r\n .sampleType('unfilterable-float')\r\n .uniform(0);\r\n }\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.profileIdTex = pb.tex2D().uniform(0);\r\n // rgba32f, hence unfilterable; every read here is a single texel.\r\n this.profileTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.invViewProjMatrix = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.invRenderSize = pb.vec2().uniform(0);\r\n this.profileTexelSize = pb.vec2().uniform(0);\r\n this.$outputs.color = pb.vec4();\r\n // One texel of a profile row, addressed exactly as skin_brdf.ts does:\r\n // the row is the normalized id and the column is a parameter group.\r\n pb.func('zReadProfile', [pb.float('id'), pb.float('column')], function () {\r\n this.$l.u = pb.mul(pb.add(this.column, 0.5), this.profileTexelSize.x);\r\n this.$l.v = pb.mul(pb.add(pb.mul(pb.clamp(this.id, 0, 1), 255), 0.5), this.profileTexelSize.y);\r\n this.$return(pb.textureSampleLevel(this.profileTex, pb.vec2(this.u, this.v), 0));\r\n });\r\n /**\r\n * Geometric normal from the depth prepass. Transcribed from\r\n * ShadowMaskRenderer: a fullscreen pass has no interpolated normal, and\r\n * the naive cross(ddx, ddy) spans depth discontinuities.\r\n */\r\n pb.func('zReconstructNormal', [pb.vec2('uv'), pb.vec4('center')], function () {\r\n this.$l.dx = pb.vec2(this.invRenderSize.x, 0);\r\n this.$l.dy = pb.vec2(0, this.invRenderSize.y);\r\n const tap = (uv: any) =>\r\n ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.right = tap(pb.add(this.uv, this.dx));\r\n this.$l.left = tap(pb.sub(this.uv, this.dx));\r\n this.$l.up = tap(pb.add(this.uv, this.dy));\r\n this.$l.down = tap(pb.sub(this.uv, this.dy));\r\n this.$l.edgeX = pb.sub(this.right.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(\r\n pb.abs(pb.sub(this.left.w, this.center.w)),\r\n pb.abs(pb.sub(this.right.w, this.center.w))\r\n ),\r\n function () {\r\n this.edgeX = pb.sub(this.center.xyz, this.left.xyz);\r\n }\r\n );\r\n this.$l.edgeY = pb.sub(this.up.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(pb.abs(pb.sub(this.down.w, this.center.w)), pb.abs(pb.sub(this.up.w, this.center.w))),\r\n function () {\r\n this.edgeY = pb.sub(this.center.xyz, this.down.xyz);\r\n }\r\n );\r\n this.$l.n = pb.cross(this.edgeX, this.edgeY);\r\n this.$l.len = pb.length(this.n);\r\n this.$if(pb.lessThan(this.len, 1e-12), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.n = pb.div(this.n, this.len);\r\n this.$l.toEye = pb.sub(this.camera.position.xyz, this.center.xyz);\r\n this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function () {\r\n this.n = pb.neg(this.n);\r\n });\r\n this.$return(this.n);\r\n });\r\n if (!cube) {\r\n pb.func(\r\n 'zLoadShadowDepth',\r\n [pb.vec2('coord'), pb.float('size'), ...(isArray ? [pb.int('layer')] : [])],\r\n function () {\r\n this.$l.texel = pb.ivec2(\r\n pb.clamp(pb.mul(this.coord, this.size), pb.vec2(0), pb.sub(pb.vec2(this.size), pb.vec2(1)))\r\n );\r\n const depth = isArray\r\n ? pb.textureArrayLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, this.layer, 0)\r\n : pb.textureLoad(this[UNIFORM_NAME_SHADOW_DEPTH], this.texel, 0);\r\n this.$return(webgpu ? depth : depth.x);\r\n }\r\n );\r\n }\r\n pb.main(function () {\r\n this.$l.pos = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n this.$inputs.uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$outputs.color = pb.vec4(1);\r\n this.$l.profileId = pb.textureSampleLevel(this.profileIdTex, this.$inputs.uv, 0).r;\r\n this.$if(pb.lessThan(this.profileId, 0.5 / 255), function () {\r\n this.$return();\r\n });\r\n this.$l.trParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.transmissionParamColumn));\r\n this.$l.scalingParams = this.zReadProfile(this.profileId, pb.float(SSSProfile.scalingParamColumn));\r\n this.$l.opticalDepthScale = pb.mul(SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT, this.trParams.x);\r\n this.$l.shrinkDistance = pb.mul(this.trParams.y, 0.5 * 0.01, this.scalingParams.x);\r\n this.$l.normalScaleBias = pb.mul(this.shrinkDistance, this.opticalDepthScale);\r\n this.$if(pb.lessThan(this.pos.w, 1), function () {\r\n this.$l.normal = this.zReconstructNormal(this.$inputs.uv, this.pos);\r\n this.$l.split = pb.int(0);\r\n if (numCascades > 1) {\r\n this.$l.linearDepth = pb.mul(this.pos.w, this.camera.params.y);\r\n this.$l.comparison = pb.vec4(\r\n pb.greaterThan(pb.vec4(this.linearDepth), this.light.cascadeDistances)\r\n );\r\n this.$l.cascadeFlags = pb.vec4(\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 0)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 1)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 2)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 3))\r\n );\r\n this.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));\r\n }\r\n this.$l.shrunk = pb.sub(this.pos.xyz, pb.mul(this.normal, this.shrinkDistance));\r\n if (cube) {\r\n this.$l.lv = pb.sub(this.shrunk, this.light.positionAndRange.xyz);\r\n this.$l.maxZ = pb.max(pb.max(pb.abs(this.lv.x), pb.abs(this.lv.y)), pb.abs(this.lv.z));\r\n this.$l.inside = pb.and(\r\n pb.greaterThanEqual(this.maxZ, this.light.shadowCameraParams.x),\r\n pb.lessThanEqual(this.maxZ, this.light.shadowCameraParams.y)\r\n );\r\n } else {\r\n this.$l.sv = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.shrunk, 1),\r\n numCascades > 1 ? this.split : 0\r\n );\r\n this.$l.sc = ndcToShadowCoord(this, pb.div(this.sv, this.sv.w));\r\n this.$l.inside = pb.all(\r\n pb.bvec4(\r\n pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.x, 0), pb.lessThanEqual(this.sc.x, 1))),\r\n pb.all(pb.bvec2(pb.greaterThanEqual(this.sc.y, 0), pb.lessThanEqual(this.sc.y, 1))),\r\n pb.greaterThanEqual(this.sc.z, 0),\r\n pb.lessThanEqual(this.sc.z, 1)\r\n )\r\n );\r\n }\r\n this.$if(this.inside, function () {\r\n this.$l.size = this.light.shadowCameraParams.z;\r\n if (cube) {\r\n this.$l.receiverDist = pb.length(this.lv);\r\n this.$l.dir = pb.div(this.lv, this.receiverDist);\r\n this.$l.onCube = pb.div(this.lv, this.maxZ);\r\n this.$l.helper = this.$choice(\r\n pb.lessThan(pb.abs(this.dir.y), 0.99),\r\n pb.vec3(0, 1, 0),\r\n pb.vec3(1, 0, 0)\r\n );\r\n this.$l.side = pb.normalize(pb.cross(this.helper, this.dir));\r\n this.$l.up = pb.cross(this.dir, this.side);\r\n if (SEARCH_RADIUS_TEXELS > 0) {\r\n this.$l.radius = pb.div(2 * SEARCH_RADIUS_TEXELS, this.size);\r\n }\r\n } else if (SEARCH_RADIUS_TEXELS > 0) {\r\n this.$l.radius = pb.div(SEARCH_RADIUS_TEXELS, this.size);\r\n }\r\n if (ortho) {\r\n this.$l.zRow = this.light.shadowMatrices.at(pb.add(pb.mul(this.split, 4), 2));\r\n this.$l.zRange = pb.div(REVERSE_Z ? 1 : 2, pb.max(pb.length(this.zRow.xyz), 1e-8));\r\n }\r\n this.$l.sum = pb.float(0);\r\n for (let i = 0; i < taps.length; i++) {\r\n if (cube) {\r\n this.$l[`u${i}`] =\r\n SEARCH_RADIUS_TEXELS > 0\r\n ? pb.add(\r\n this.onCube,\r\n pb.mul(\r\n pb.add(pb.mul(this.side, taps[i][0]), pb.mul(this.up, taps[i][1])),\r\n this.radius\r\n )\r\n )\r\n : this.onCube;\r\n this.$l[`b${i}`] = pb.textureSampleLevel(\r\n this[UNIFORM_NAME_SHADOW_DEPTH],\r\n this[`u${i}`],\r\n 0\r\n ).x;\r\n this.$l[`m${i}`] = pb.max(\r\n pb.max(pb.abs(this[`u${i}`].x), pb.abs(this[`u${i}`].y)),\r\n pb.abs(this[`u${i}`].z)\r\n );\r\n this.$l[`t${i}`] = pb.sub(\r\n this.receiverDist,\r\n pb.mul(\r\n ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams),\r\n pb.div(pb.length(this[`u${i}`]), this[`m${i}`])\r\n )\r\n );\r\n } else {\r\n this.$l[`c${i}`] =\r\n SEARCH_RADIUS_TEXELS > 0\r\n ? pb.add(this.sc.xy, pb.mul(pb.vec2(taps[i][0], taps[i][1]), this.radius))\r\n : this.sc.xy;\r\n this.$l[`b${i}`] = isArray\r\n ? this.zLoadShadowDepth(this[`c${i}`], this.size, this.split)\r\n : this.zLoadShadowDepth(this[`c${i}`], this.size);\r\n // Under reverse-Z a blocker sits at a larger depth value.\r\n this.$l[`d${i}`] = REVERSE_Z\r\n ? pb.sub(this[`b${i}`], this.sc.z)\r\n : pb.sub(this.sc.z, this[`b${i}`]);\r\n if (ortho) {\r\n this.$l[`t${i}`] = pb.mul(this[`d${i}`], this.zRange);\r\n } else {\r\n this.$l[`t${i}`] = pb.sub(\r\n ShaderHelper.nonLinearDepthToLinear(this, this.sc.z, this.light.shadowCameraParams),\r\n ShaderHelper.nonLinearDepthToLinear(this, this[`b${i}`], this.light.shadowCameraParams)\r\n );\r\n }\r\n }\r\n this.$l[`o${i}`] = pb.mul(this[`t${i}`], this.opticalDepthScale);\r\n this.$l[`k${i}`] = pb.clamp(\r\n pb.max(pb.add(this[`o${i}`], this.normalScaleBias), 0),\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR,\r\n MAX_TRANSMISSION_OPTICAL_DEPTH\r\n );\r\n this.sum = pb.add(this.sum, this[`k${i}`]);\r\n }\r\n this.$l.opticalDepth = pb.add(\r\n pb.div(this.sum, taps.length),\r\n SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS\r\n );\r\n this.$outputs.color = pb.vec4(\r\n pb.sub(1, pb.div(this.opticalDepth, MAX_TRANSMISSION_OPTICAL_DEPTH))\r\n );\r\n });\r\n });\r\n });\r\n }\r\n })!;\r\n program.name = '@TransmissionThickness';\r\n return program;\r\n }\r\n\r\n /** Release cached GPU resources. */\r\n dispose(): void {\r\n for (const program of this._programs.values()) {\r\n program.dispose();\r\n }\r\n this._programs.clear();\r\n this._bindGroups.clear();\r\n this._channelStates = null;\r\n }\r\n}\r\n"],"names":["UNIFORM_NAME_SHADOW_DEPTH","MAX_TRANSMISSION_OPTICAL_DEPTH","SKIN_MAX_TRANSMISSION_OPTICAL_DEPTH","POISSON_DISC","SEARCH_RADIUS_TEXELS","taps","lightSupportsTransmission","light","params","transmission","shadowMapFramebuffer","getDepthAttachment","TransmissionThicknessRenderer","_programs","_bindGroups","_channelStates","_nearFar","_invRenderSize","_cameraPosition","_cameraParams","_profileTexelSize","Map","Vector2","Vector4","render","ctx","depthTexture","profileIdTexture","lights","getLayerFramebuffer","device","numLights","Math","min","length","MAX_SHADOW_MASK_LIGHTS","shadowMapInfo","profileTable","SSSProfile","getTable","numLayers","ceil","SHADOW_MASK_LIGHTS_PER_LAYER","channelStates","getChannelStates","savedShadowLight","currentShadowLight","setXY","tableColumns","tableRows","pushDeviceStates","layer","setFramebuffer","clearFrameBuffer","channel","ordinal","shadowMapParams","get","renderLightChannel","popDeviceStates","renderState","key","getProgramKey","program","createProgram","set","createBindGroup","bindGroupLayouts","bindGroup","setUniforms","setProgram","setBindGroup","drawFullscreenQuad","depth","type","lightType","numShadowCascades","isTexture2DArray","isTextureCube","c","rs","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","useColorState","setColorMask","push","camera","near","getNearPlane","far","getFarPlane","cameraPos","getWorldPosition","setXYZW","x","y","z","setValue","position","shadowDebugCascades","framestamp","frameInfo","frameCounter","implParams","impl","getParams","sunDir","sunLight","directionAndCutoff","xyz","scaleBy","shadowCascades","positionAndRange","diffuseAndIntensity","ShaderHelper","getPreExposedColorIntensity","extraParams","cascadeDistances","depthBiasValues","shadowCameraParams","cameraParams","depthBiasScales","shadowMatrices","Float32Array","shadowStrength","shadow","envLightStrength","getEnvLightLuminance","envLightSpecularStrength","env","specularStrength","motionVectors","jitteredInvVPMatrix","invViewProjectionMatrix","width","height","setTexture","fetchSampler","shadowDepth","numCascades","depthAttachment","isArray","cube","ortho","LIGHT_TYPE_DIRECTIONAL","webgpu","buildRenderProgram","label","vertex","pb","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","vec4","DEPTH_FARTHEST","add","mul","xy","neg","fragment","cameraStruct","defineStruct","float","int","lightStruct","vec3","uniform","texCubeShadow","tex2DArrayShadow","tex2DShadow","noSampler","texCube","tex2DArray","tex2D","sampleType","depthTex","profileIdTex","profileTex","invViewProjMatrix","mat4","cameraNearFar","invRenderSize","profileTexelSize","color","func","$l","u","column","v","clamp","id","$return","textureSampleLevel","dx","dy","tap","samplePositionFromDepth","right","left","sub","up","down","edgeX","center","$if","lessThan","abs","w","edgeY","n","cross","len","div","toEye","dot","texel","ivec2","coord","size","textureArrayLoad","textureLoad","profileId","r","trParams","zReadProfile","transmissionParamColumn","scalingParams","scalingParamColumn","opticalDepthScale","SKIN_OPTICAL_DEPTH_PER_WORLD_UNIT","shrinkDistance","normalScaleBias","normal","zReconstructNormal","split","linearDepth","comparison","greaterThan","cascadeFlags","shrunk","lv","maxZ","max","inside","and","greaterThanEqual","lessThanEqual","sv","calculateShadowSpaceVertex","sc","ndcToShadowCoord","all","bvec4","bvec2","receiverDist","dir","onCube","helper","$choice","side","normalize","radius","zRow","at","zRange","REVERSE_Z","sum","i","nonLinearDepthToLinear","zLoadShadowDepth","SKIN_TRANSMISSION_OPTICAL_DEPTH_FLOOR","opticalDepth","SKIN_TRANSMISSION_OPTICAL_DEPTH_BIAS","name","dispose","values","clear"],"mappings":"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"}
|