@zephyr3d/scene 0.9.26 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +146 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +300 -56
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +177 -3
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +178 -200
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +30475 -19865
- package/dist/index.js +67 -12
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +362 -300
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +223 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +733 -190
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +2009 -201
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +668 -63
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +48 -50
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +34 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +40 -39
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +328 -62
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +26 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +53 -53
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +8 -13
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +268 -136
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +113 -28
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +23 -9
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +198 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +14 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +15 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +585 -59
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +524 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +1195 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +36 -36
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +997 -96
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +40 -87
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +42 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +87 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +36 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +77 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +140 -279
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +2473 -114
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +97 -109
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"water_caustics.js","sources":["../../src/render/water_caustics.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Matrix4x4, REVERSE_Z, Vector3, Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBRenderOptions,\r\n ProgramBuilder,\r\n RenderStateSet,\r\n Texture2D,\r\n Texture2DArray,\r\n TextureFormat,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport type { WaveGenerator } from './wavegenerator';\r\nimport type { Water } from '../scene/water';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Camera } from '../camera/camera';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { CAUSTIC_HEIGHT_BIAS, MAX_CAUSTIC_WATERS, ShaderHelper } from '../material/shader/helper';\r\nimport { warnUnsupported } from '../utility/unsupported';\r\n\r\n/** Index of refraction of water relative to air. */\r\nconst WATER_IOR = 1.333;\r\n/** Air-to-water eta used when refracting the sun ray at the surface. */\r\nconst WATER_ETA = 1 / WATER_IOR;\r\n/**\r\n * Minimum |sin(sun elevation)| for caustics to be generated; below it the\r\n * photon sweep degenerates and the pass switches off.\r\n */\r\nconst MIN_SUN_ELEVATION = 0.15;\r\n/**\r\n * Fixed-point steps taken to land a photon on the scene rather than on the\r\n * focal plane. Two suffice for a flat receiver; the third covers a steep slope.\r\n */\r\nconst SCENE_DEPTH_ITERATIONS = 3;\r\n/**\r\n * Photons per covered map texel the automatic grid size solves for. Four lands\r\n * within about 4% of a converged (16x denser) map.\r\n */\r\nconst PHOTONS_PER_TEXEL = 4;\r\n/** Automatic edge fade width, as a fraction of the map half-extent. */\r\nconst AUTO_FADE_FRACTION = 0.2;\r\n/** Floor in meters under the automatic fade width. */\r\nconst AUTO_FADE_MIN_DISTANCE = 3;\r\n/** Bounds on the share of the map half-extent the fade may consume. */\r\nconst MIN_FADE_FRACTION = 0.001;\r\nconst MAX_FADE_FRACTION = 0.9;\r\n/**\r\n * Largest ratio between the fitted slice's two half-extents. The map is square,\r\n * so an anisotropic slice resolves the pattern at different frequencies along\r\n * each axis.\r\n */\r\nconst MAX_SLICE_ASPECT = 2;\r\n/**\r\n * Steps per octave the fitted half-extents are quantised to. Four costs at most\r\n * 19% of linear resolution and keeps a level change from reading as a pop.\r\n */\r\nconst SLICE_QUANTISE_STEPS = 4;\r\n/** Smallest half-extent in meters a fitted slice may shrink to. */\r\nconst MIN_SLICE_EXTENT = 0.5;\r\n/**\r\n * Divisions of the half-extent the slice centre snaps to under a warp. A warped\r\n * map must be resampled whenever the centre moves, so it snaps coarsely.\r\n */\r\nconst WARPED_CENTER_SNAP_DIVISIONS = 8;\r\n/**\r\n * How far past the map border the photon grid is laid out, as a fraction of the\r\n * half-extent, on the sides where the range - not the water - is what bounds it.\r\n *\r\n * Horizontal displacement carries photons across the border both ways, so\r\n * launching from a margin outside keeps the border density consistent.\r\n * `_gridFraction` accounts for the larger launch area, so density per texel is\r\n * unchanged.\r\n */\r\nconst GRID_BORDER_MARGIN = 0.15;\r\n\r\n/**\r\n * Concentrates a map coordinate towards the centre. CPU twin of\r\n * `ShaderHelper.warpCausticNDC`.\r\n *\r\n * @internal\r\n */\r\nfunction warpCausticNDC(ndc: number, strength: number): number {\r\n return (ndc * (1 + strength)) / (1 + strength * Math.abs(ndc));\r\n}\r\n\r\n/**\r\n * Rounds a fitted half-extent up onto a discrete ladder below `range`.\r\n *\r\n * The ladder is geometric and anchored at `range`, so water that fills the range\r\n * lands exactly on a level.\r\n *\r\n * @internal\r\n */\r\nfunction quantiseSliceExtent(half: number, range: number): number {\r\n if (!(half > 0) || half >= range) {\r\n return range;\r\n }\r\n const steps = Math.floor(Math.log2(range / half) * SLICE_QUANTISE_STEPS);\r\n return range / Math.pow(2, steps / SLICE_QUANTISE_STEPS);\r\n}\r\n\r\n/**\r\n * CPU-side parameters describing the caustic map, uploaded to the light pass.\r\n *\r\n * The map is a single orthographic slice of light space, fitted to the water\r\n * within range of the camera. `frameX`/`frameY` are the two axes perpendicular\r\n * to the light direction, carrying the reciprocal of the slice's half-extent\r\n * along each, so a world position projects into the map with two dot products\r\n * and no matrix.\r\n *\r\n * @public\r\n */\r\nexport interface WaterCausticUniforms {\r\n /** (right.xyz, 1 / half-extent along right) */\r\n frameX: Vector4;\r\n /** (up.xyz, 1 / half-extent along up) */\r\n frameY: Vector4;\r\n /** (center.xyz, water surface level) */\r\n center: Vector4;\r\n /** (lightDir.xyz, 1 / max(-lightDir.y, MIN_SUN_ELEVATION)) */\r\n lightDir: Vector4;\r\n /** (intensity, focal depth, defocus rate, edge fade start in map-radius units) */\r\n params: Vector4;\r\n /** (minimum water depth, unused.yz, warp strength). The medium is in {@link waterMedia}. */\r\n extinction: Vector4;\r\n /** Water bodies contributing to this map, at most {@link MAX_CAUSTIC_WATERS}. */\r\n waterCount: number;\r\n /** Per body, world XZ footprint: (minX, minZ, maxX, maxZ). */\r\n waterRegions: Float32Array<ArrayBuffer>;\r\n /** Per body, (sigma_t.xyz, surface height). */\r\n waterMedia: Float32Array<ArrayBuffer>;\r\n}\r\n\r\n/** Shadow cascade reused as a light-space depth map of the scene. @internal */\r\ntype SceneDepthBinding = {\r\n texture: Texture2DArray;\r\n layer: number;\r\n size: number;\r\n matrix: Matrix4x4;\r\n matrixInv: Matrix4x4;\r\n};\r\n\r\n/**\r\n * Vertices per side of the grid the height map rasterises the surface with, laid\r\n * out in warped map space over the body's footprint.\r\n */\r\nconst HEIGHT_GRID_SIZE = 256;\r\n\r\n/** @internal */\r\ntype SplatProgramInfo = {\r\n program: GPUProgram;\r\n /** One per water slot; see _getSplatBindGroup. */\r\n bindGroups: BindGroup[];\r\n};\r\n\r\n/**\r\n * Shader for the photon splat pass.\r\n *\r\n * One vertex is one photon, emitted where it lands; the fragment stage deposits\r\n * the weight, which additive blending accumulates.\r\n *\r\n * Returned as a descriptor so it can be compiled against a bare\r\n * {@link ProgramBuilder} in tests, without a device.\r\n *\r\n * @param waveGenerator - Supplies the surface displacement and normal.\r\n * @internal\r\n */\r\nexport function createCausticSplatShader(waveGenerator: WaveGenerator, sceneDepth: boolean): PBRenderOptions {\r\n const setupUniforms = (scope: PBGlobalScope) => {\r\n const pb = scope.$builder;\r\n scope.causticFrameX = pb.vec4().uniform(0);\r\n scope.causticFrameY = pb.vec4().uniform(0);\r\n scope.causticCenter = pb.vec4().uniform(0);\r\n scope.causticLightDir = pb.vec4().uniform(0);\r\n scope.causticRegion = pb.vec4().uniform(0);\r\n /** Map-NDC rectangle the photon grid is laid out over: (minX, minY, maxX, maxY). */\r\n scope.causticGridBounds = pb.vec4().uniform(0);\r\n scope.causticSplatParams = pb.vec4().uniform(0);\r\n /** (grid size, 1 / grid size, 0, 0) */\r\n scope.causticPhotonParams = pb.vec4().uniform(0);\r\n if (sceneDepth) {\r\n // The sun's shadow cascade, reused as an orthographic light-space depth map.\r\n scope.causticSceneMatrix = pb.mat4().uniform(0);\r\n scope.causticSceneMatrixInv = pb.mat4().uniform(0);\r\n /** (cascade layer, 0, 0, 0) */\r\n scope.causticSceneParams = pb.vec4().uniform(0);\r\n // Read for its stored depth, not compared.\r\n scope.causticSceneDepth = pb.tex2DArrayShadow().uniform(0);\r\n }\r\n // Wave generators animate from camera.elapsedTime, which this standalone\r\n // pass supplies itself.\r\n ShaderHelper.declareStandaloneCameraTime(scope, 0);\r\n waveGenerator.setupUniforms(scope, 0);\r\n };\r\n return {\r\n vertex(this: PBGlobalScope, pb: ProgramBuilder) {\r\n // Photon ordinal; the grid coordinate is derived from it, so the buffer\r\n // serves any grid size.\r\n this.$inputs.photonIndex = pb.float().attrib('position');\r\n this.$outputs.photonWeight = pb.float();\r\n setupUniforms(this);\r\n pb.main(function () {\r\n // Per-axis: the slice's two half-extents are independent.\r\n this.$l.invRadius = pb.vec2(this.causticFrameX.w, this.causticFrameY.w);\r\n this.$l.radius = pb.div(pb.vec2(1), this.invRadius);\r\n this.$l.focalDepth = this.causticSplatParams.y;\r\n this.$l.eta = this.causticSplatParams.z;\r\n this.$l.L = this.causticLightDir.xyz;\r\n this.$l.waterLevel = this.causticCenter.w;\r\n // Grid position on the orthographic slice through the map centre. The\r\n // grid spans only the part of the slice the water casts through, and is\r\n // uniform in warped map space so calm water keeps photon (i,j) on texel\r\n // (i,j) and the map normalised to 1.0.\r\n //\r\n // Ordinal to grid coordinate: row is the quotient, column the remainder.\r\n this.$l.gridSize = this.causticPhotonParams.x;\r\n this.$l.invGrid = this.causticPhotonParams.y;\r\n this.$l.photonRow = pb.floor(pb.mul(this.$inputs.photonIndex, this.invGrid));\r\n this.$l.photonCol = pb.sub(this.$inputs.photonIndex, pb.mul(this.photonRow, this.gridSize));\r\n this.$l.photonUV = pb.mul(\r\n pb.add(pb.vec2(this.photonCol, this.photonRow), pb.vec2(0.5)),\r\n this.invGrid\r\n );\r\n this.$l.warpedNDC = pb.mix(this.causticGridBounds.xy, this.causticGridBounds.zw, this.photonUV);\r\n this.$l.ndc = ShaderHelper.unwarpCausticNDC(this, this.warpedNDC, this.causticSplatParams.x);\r\n this.$l.planePos = pb.add(\r\n this.causticCenter.xyz,\r\n pb.mul(this.causticFrameX.xyz, pb.mul(this.ndc.x, this.radius.x)),\r\n pb.mul(this.causticFrameY.xyz, pb.mul(this.ndc.y, this.radius.y))\r\n );\r\n // Sweep along the light direction onto the undisturbed water plane.\r\n this.$l.sweep = pb.div(pb.sub(this.waterLevel, this.planePos.y), this.L.y);\r\n this.$l.surfaceXZ = pb.add(this.planePos, pb.mul(this.L, this.sweep));\r\n this.$l.outside = pb.or(\r\n pb.any(pb.lessThan(this.surfaceXZ.xz, this.causticRegion.xy)),\r\n pb.any(pb.greaterThan(this.surfaceXZ.xz, this.causticRegion.zw))\r\n );\r\n // Displaced surface point and the detail normal that bends the ray. The\r\n // wave generators sample with an explicit LOD, legal in a vertex shader.\r\n //\r\n // Launching from the rest point over-weights compressed crests by 1/J;\r\n // inverting the displacement does not converge where the surface folds.\r\n this.$l.surfacePos = pb.vec3();\r\n this.$l.coarseNormal = pb.vec3();\r\n waveGenerator.calcVertexPositionAndNormal(this, this.surfaceXZ, this.surfacePos, this.coarseNormal);\r\n this.$l.normal = waveGenerator.calcFragmentNormal(this, this.surfaceXZ.xz, this.coarseNormal);\r\n // Refract, then subtract the deflection a flat surface would have\r\n // produced. Calm water then leaves the ray parallel to L, which lands\r\n // photon (i,j) back on texel (i,j) and normalises the map to 1.\r\n this.$l.refracted = pb.refract(this.L, this.normal, this.eta);\r\n this.$l.refractedFlat = pb.refract(this.L, pb.vec3(0, 1, 0), this.eta);\r\n this.$l.dir = pb.normalize(pb.add(pb.sub(this.refracted, this.refractedFlat), this.L));\r\n // Intersect the horizontal focal plane below the surface; clamped so a\r\n // grazing ray cannot produce an enormous or negative step.\r\n this.$l.invDirY = pb.min(this.dir.y, -1e-4);\r\n this.$l.targetY = pb.sub(this.waterLevel, this.focalDepth);\r\n this.$l.hitT = pb.div(pb.sub(this.targetY, this.surfacePos.y), this.invDirY);\r\n this.$l.hitPos = pb.add(this.surfacePos, pb.mul(this.dir, pb.max(this.hitT, 0)));\r\n if (sceneDepth) {\r\n // Land the photon on the scene by fixed-point iteration: read the scene\r\n // height under the current guess, re-intersect the ray with a\r\n // horizontal plane at that height, repeat. One fetch per step; at a\r\n // silhouette it lands on one of the two surfaces rather than diverging.\r\n this.$l.probe = this.hitPos;\r\n this.$l.layer = pb.int(this.causticSceneParams.x);\r\n for (let i = 0; i < SCENE_DEPTH_ITERATIONS; i++) {\r\n this.$l[`clip${i}`] = pb.mul(this.causticSceneMatrix, pb.vec4(this.probe, 1));\r\n this.$l[`ndc${i}`] = pb.div(this[`clip${i}`].xyz, this[`clip${i}`].w);\r\n this.$l[`uv${i}`] = pb.add(pb.mul(this[`ndc${i}`].xy, 0.5), pb.vec2(0.5));\r\n // Outside the cascade, keep the previous step's result.\r\n this.$l[`inside${i}`] = pb.and(\r\n pb.all(pb.greaterThanEqual(this[`uv${i}`], pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this[`uv${i}`], pb.vec2(1)))\r\n );\r\n // texelFetch, since filtered depths across a silhouette are wrong.\r\n // WebGPU only - GLSL ES 3.0 forbids texelFetch on a shadow-sampler\r\n // texture, which gates this whole path.\r\n this.$l[`depth${i}`] = pb.textureArrayLoad(\r\n this.causticSceneDepth,\r\n pb.ivec2(pb.mul(this[`uv${i}`], this.causticSceneParams.y)),\r\n this.layer,\r\n pb.int(0)\r\n );\r\n // Back to a world position through the orthographic cascade.\r\n this.$l[`sceneNDC${i}`] = pb.vec3(\r\n this[`ndc${i}`].xy,\r\n REVERSE_Z ? this[`depth${i}`] : pb.sub(pb.mul(this[`depth${i}`], 2), 1)\r\n );\r\n this.$l[`sceneClip${i}`] = pb.mul(this.causticSceneMatrixInv, pb.vec4(this[`sceneNDC${i}`], 1));\r\n this.$l[`scenePos${i}`] = pb.div(this[`sceneClip${i}`].xyz, this[`sceneClip${i}`].w);\r\n // Re-intersect at the height just read, accepted only below the\r\n // *displaced* surface at this photon's entry (not the rest level).\r\n this.$l[`t${i}`] = pb.div(pb.sub(this[`scenePos${i}`].y, this.surfacePos.y), this.invDirY);\r\n this.$l[`next${i}`] = pb.add(this.surfacePos, pb.mul(this.dir, pb.max(this[`t${i}`], 0)));\r\n // mix rather than select: the builder has no vec3 select.\r\n this.probe = pb.mix(\r\n this.probe,\r\n this[`next${i}`],\r\n pb.float(pb.and(this[`inside${i}`], pb.lessThan(this[`scenePos${i}`].y, this.surfacePos.y)))\r\n );\r\n }\r\n this.hitPos = this.probe;\r\n }\r\n // Project the hit back into the map. frameX/frameY are perpendicular to\r\n // L and to each other, so this is just two dot products.\r\n this.$l.rel = pb.sub(this.hitPos, this.causticCenter.xyz);\r\n this.$l.hitNDC = pb.mul(\r\n pb.vec2(pb.dot(this.rel, this.causticFrameX.xyz), pb.dot(this.rel, this.causticFrameY.xyz)),\r\n this.invRadius\r\n );\r\n // Into warped space, where the map's texels live.\r\n this.$l.hitWarped = ShaderHelper.warpCausticNDC(this, this.hitNDC, this.causticSplatParams.x);\r\n this.$outputs.photonWeight = this.causticSplatParams.w;\r\n // No per-backend y flip here; the blur and resolve quads account for it.\r\n this.$builtins.position = pb.vec4(this.hitWarped, 0, 1);\r\n if (pb.getDevice().type !== 'webgpu') {\r\n // GLSL rasterises nothing unless gl_PointSize is written; WebGPU points\r\n // are always one pixel.\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$if(this.outside, function () {\r\n // Park the photon outside the clip volume; w stays 1 to avoid NaN.\r\n this.$builtins.position = pb.vec4(-2, -2, 0, 1);\r\n });\r\n });\r\n },\r\n fragment(this: PBGlobalScope, pb: ProgramBuilder) {\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$outputs.outColor = pb.vec4(this.$inputs.photonWeight, 0, 0, 1);\r\n });\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Shader for the displaced surface height map.\r\n *\r\n * Rasterises the water surface into the light-space slice, one body per draw. A\r\n * grid over the body's footprint in warped map space is swept along the light\r\n * onto the rest plane, displaced by the wave generator, and projected back into\r\n * the map. The fragment writes its height above the rest plane, offset by\r\n * `CAUSTIC_HEIGHT_BIAS`, into this body's channel via a colour write mask (last\r\n * triangle wins). A texel the surface never reaches stays zero, which the\r\n * receiver reads as \"no water on this ray\".\r\n *\r\n * Rasterising handles horizontal displacement without inverting it, and keeps\r\n * the footprint edge exact. The receiver looks this up with the same uv as the\r\n * caustic pattern, since the projection is invariant along the light.\r\n *\r\n * @param waveGenerator - Supplies the surface displacement of this body.\r\n * @internal\r\n */\r\nexport function createCausticHeightShader(waveGenerator: WaveGenerator): PBRenderOptions {\r\n return {\r\n vertex(this: PBGlobalScope, pb: ProgramBuilder) {\r\n // Vertex ordinal; the grid coordinate is derived from it.\r\n this.$inputs.vertexIndex = pb.float().attrib('position');\r\n this.$outputs.height = pb.float();\r\n this.$outputs.inside = pb.float();\r\n this.causticFrameX = pb.vec4().uniform(0);\r\n this.causticFrameY = pb.vec4().uniform(0);\r\n /** (slice centre.xyz, this body's rest level) */\r\n this.causticCenter = pb.vec4().uniform(0);\r\n this.causticLightDir = pb.vec4().uniform(0);\r\n this.causticRegion = pb.vec4().uniform(0);\r\n /** Map-NDC rectangle the grid is laid out over: (minX, minY, maxX, maxY). */\r\n this.causticGridBounds = pb.vec4().uniform(0);\r\n /** (warp strength, grid size, 1 / (grid size + 1), 1 / grid size) */\r\n this.causticHeightParams = pb.vec4().uniform(0);\r\n ShaderHelper.declareStandaloneCameraTime(this, 0);\r\n waveGenerator.setupUniforms(this, 0);\r\n pb.main(function () {\r\n this.$l.invRadius = pb.vec2(this.causticFrameX.w, this.causticFrameY.w);\r\n this.$l.radius = pb.div(pb.vec2(1), this.invRadius);\r\n this.$l.L = this.causticLightDir.xyz;\r\n this.$l.waterLevel = this.causticCenter.w;\r\n // Ordinal to grid coordinate, (gridSize + 1) vertices per side. The +0.5\r\n // keeps the inexact reciprocal from rounding into the previous row.\r\n this.$l.row = pb.floor(pb.mul(pb.add(this.$inputs.vertexIndex, 0.5), this.causticHeightParams.z));\r\n this.$l.col = pb.sub(\r\n this.$inputs.vertexIndex,\r\n pb.mul(this.row, pb.add(this.causticHeightParams.y, 1))\r\n );\r\n this.$l.gridUV = pb.mul(pb.vec2(this.col, this.row), this.causticHeightParams.w);\r\n // Grid point to the slice, through the warp the map's texels live under.\r\n this.$l.warpedNDC = pb.mix(this.causticGridBounds.xy, this.causticGridBounds.zw, this.gridUV);\r\n this.$l.ndc = ShaderHelper.unwarpCausticNDC(this, this.warpedNDC, this.causticHeightParams.x);\r\n this.$l.planePos = pb.add(\r\n this.causticCenter.xyz,\r\n pb.mul(this.causticFrameX.xyz, pb.mul(this.ndc.x, this.radius.x)),\r\n pb.mul(this.causticFrameY.xyz, pb.mul(this.ndc.y, this.radius.y))\r\n );\r\n // Along the light onto the rest plane: the rest point of this vertex.\r\n this.$l.sweep = pb.div(pb.sub(this.waterLevel, this.planePos.y), this.L.y);\r\n this.$l.surfaceXZ = pb.add(this.planePos, pb.mul(this.L, this.sweep));\r\n // Footprint test, interpolated so the edge fades over one grid cell.\r\n this.$outputs.inside = pb.float(\r\n pb.and(\r\n pb.all(pb.greaterThanEqual(this.surfaceXZ.xz, this.causticRegion.xy)),\r\n pb.all(pb.lessThanEqual(this.surfaceXZ.xz, this.causticRegion.zw))\r\n )\r\n );\r\n // Where the surface carried this rest point, and how high it is there.\r\n this.$l.surfacePos = pb.vec3();\r\n this.$l.surfaceNormal = pb.vec3();\r\n waveGenerator.calcVertexPositionAndNormal(this, this.surfaceXZ, this.surfacePos, this.surfaceNormal);\r\n this.$outputs.height = pb.sub(this.surfacePos.y, this.waterLevel);\r\n // The displaced point back into the map, as the splat projects a hit.\r\n this.$l.rel = pb.sub(this.surfacePos, this.causticCenter.xyz);\r\n this.$l.hitNDC = pb.mul(\r\n pb.vec2(pb.dot(this.rel, this.causticFrameX.xyz), pb.dot(this.rel, this.causticFrameY.xyz)),\r\n this.invRadius\r\n );\r\n this.$l.hitWarped = ShaderHelper.warpCausticNDC(this, this.hitNDC, this.causticHeightParams.x);\r\n // The receiver reads the map at `v = 0.5 + 0.5 * ndc.y`. On WebGPU clip\r\n // +1 is the first row, so the surface is drawn flipped. The splat needs\r\n // no flip because its map passes through the blur and resolve quads.\r\n this.$builtins.position =\r\n pb.getDevice().type === 'webgpu'\r\n ? pb.vec4(this.hitWarped.x, pb.neg(this.hitWarped.y), 0, 1)\r\n : pb.vec4(this.hitWarped, 0, 1);\r\n });\r\n },\r\n fragment(this: PBGlobalScope, pb: ProgramBuilder) {\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n // Outside the footprint nothing is written, so the texel reads \"no surface\".\r\n this.$if(pb.lessThan(this.$inputs.inside, 0.5), function () {\r\n pb.discard();\r\n });\r\n // Every channel; the colour mask keeps all but this body's.\r\n this.$outputs.outColor = pb.vec4(pb.add(this.$inputs.height, CAUSTIC_HEIGHT_BIAS));\r\n });\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Shader for the caustic map blur.\r\n *\r\n * Four bilinear taps at the texel corners average a 2x2 neighbourhood; weights\r\n * sum to one, preserving the \"calm water reads 1.0\" normalisation.\r\n *\r\n * @internal\r\n */\r\nexport function createCausticBlurShader(): PBRenderOptions {\r\n return {\r\n vertex(this: PBGlobalScope, pb: ProgramBuilder) {\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos, 0.5), pb.vec2(0.5));\r\n });\r\n },\r\n fragment(this: PBGlobalScope, pb: ProgramBuilder) {\r\n this.causticSrc = pb.tex2D().uniform(0);\r\n this.causticTexelSize = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.o = pb.mul(this.causticTexelSize.xy, 0.5);\r\n this.$l.sum = pb.add(\r\n pb.textureSampleLevel(this.causticSrc, pb.add(this.$inputs.uv, pb.vec2(this.o.x, this.o.y)), 0),\r\n pb.textureSampleLevel(\r\n this.causticSrc,\r\n pb.add(this.$inputs.uv, pb.vec2(pb.neg(this.o.x), this.o.y)),\r\n 0\r\n ),\r\n pb.textureSampleLevel(\r\n this.causticSrc,\r\n pb.add(this.$inputs.uv, pb.vec2(this.o.x, pb.neg(this.o.y))),\r\n 0\r\n ),\r\n pb.textureSampleLevel(\r\n this.causticSrc,\r\n pb.add(this.$inputs.uv, pb.vec2(pb.neg(this.o.x), pb.neg(this.o.y))),\r\n 0\r\n )\r\n );\r\n this.$outputs.outColor = pb.vec4(pb.mul(this.sum.x, 0.25), 0, 0, 1);\r\n });\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Shader for the temporal resolve.\r\n *\r\n * Reprojection is exact and matrix-free: both frames are orthographic slices\r\n * perpendicular to the light, so a texel maps to the world with two scaled axes\r\n * and into the previous frame with two dot products.\r\n *\r\n * Map NDC relates to texture coordinate by the receiver's `ndc * 0.5 + 0.5`\r\n * (see `ShaderHelper.calculateWaterCaustic`).\r\n *\r\n * @internal\r\n */\r\nexport function createCausticResolveShader(): PBRenderOptions {\r\n return {\r\n vertex(this: PBGlobalScope, pb: ProgramBuilder) {\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, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos, 0.5), pb.vec2(0.5));\r\n });\r\n },\r\n fragment(this: PBGlobalScope, pb: ProgramBuilder) {\r\n this.causticCurrent = pb.tex2D().uniform(0);\r\n this.causticHistory = pb.tex2D().uniform(0);\r\n this.causticFrameX = pb.vec4().uniform(0);\r\n this.causticFrameY = pb.vec4().uniform(0);\r\n this.causticCenter = pb.vec4().uniform(0);\r\n this.causticPrevFrameX = pb.vec4().uniform(0);\r\n this.causticPrevFrameY = pb.vec4().uniform(0);\r\n this.causticPrevCenter = pb.vec4().uniform(0);\r\n /** (blend weight, texel size, warp, previous frame's warp) */\r\n this.causticResolveParams = pb.vec4().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.main(function () {\r\n this.$l.texel = this.causticResolveParams.y;\r\n this.$l.current = pb.textureSampleLevel(this.causticCurrent, this.$inputs.uv, 0).x;\r\n // Neighbourhood range of the current frame; history is clamped into it\r\n // so a long blend can follow an animated pattern.\r\n this.$l.mn = this.current;\r\n this.$l.mx = this.current;\r\n for (let dy = -1; dy <= 1; dy++) {\r\n for (let dx = -1; dx <= 1; dx++) {\r\n if (dx === 0 && dy === 0) {\r\n continue;\r\n }\r\n this.$l.s = pb.textureSampleLevel(\r\n this.causticCurrent,\r\n pb.add(this.$inputs.uv, pb.mul(pb.vec2(dx, dy), this.texel)),\r\n 0\r\n ).x;\r\n this.mn = pb.min(this.mn, this.s);\r\n this.mx = pb.max(this.mx, this.s);\r\n }\r\n }\r\n // This texel's world point, then its place in the previous frame; the\r\n // frames may differ in slice and warp strength.\r\n this.$l.warpedNDC = pb.sub(pb.mul(this.$inputs.uv, 2), pb.vec2(1));\r\n this.$l.ndc = ShaderHelper.unwarpCausticNDC(this, this.warpedNDC, this.causticResolveParams.z);\r\n this.$l.radius = pb.div(pb.vec2(1), pb.vec2(this.causticFrameX.w, this.causticFrameY.w));\r\n this.$l.world = pb.add(\r\n this.causticCenter.xyz,\r\n pb.mul(this.causticFrameX.xyz, pb.mul(this.ndc.x, this.radius.x)),\r\n pb.mul(this.causticFrameY.xyz, pb.mul(this.ndc.y, this.radius.y))\r\n );\r\n this.$l.rel = pb.sub(this.world, this.causticPrevCenter.xyz);\r\n this.$l.prevNDC = pb.mul(\r\n pb.vec2(pb.dot(this.rel, this.causticPrevFrameX.xyz), pb.dot(this.rel, this.causticPrevFrameY.xyz)),\r\n pb.vec2(this.causticPrevFrameX.w, this.causticPrevFrameY.w)\r\n );\r\n this.$l.prevWarped = ShaderHelper.warpCausticNDC(this, this.prevNDC, this.causticResolveParams.w);\r\n this.$l.prevUV = pb.add(pb.mul(this.prevWarped, 0.5), pb.vec2(0.5));\r\n // Ground the camera has just scrolled into has no history at all.\r\n this.$l.inside = pb.and(\r\n pb.all(pb.greaterThanEqual(this.prevUV, pb.vec2(0))),\r\n pb.all(pb.lessThanEqual(this.prevUV, pb.vec2(1)))\r\n );\r\n this.$l.history = pb.textureSampleLevel(this.causticHistory, this.prevUV, 0).x;\r\n this.$l.blend = pb.mul(this.causticResolveParams.x, pb.float(this.inside));\r\n this.$outputs.outColor = pb.vec4(\r\n pb.mix(this.current, pb.clamp(this.history, this.mn, this.mx), this.blend),\r\n 0,\r\n 0,\r\n 1\r\n );\r\n });\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Renders the water caustic map.\r\n *\r\n * One photon is emitted per texel of a uniform grid laid out on the same\r\n * orthographic light-space slice the map covers. Each photon is refracted at the\r\n * water surface, intersected with the scene (or a horizontal focal plane) below\r\n * it, and splatted additively at the hit position. With the flat-surface\r\n * deflection removed, calm water maps photon `(i,j)` onto texel `(i,j)` and the\r\n * map converges to a uniform 1.0 - which the receiver treats as \"no caustics\".\r\n *\r\n * @internal\r\n */\r\nexport class WaterCausticsRenderer {\r\n /** Splat programs keyed by the wave generator's shader hash. */\r\n private readonly _splatPrograms: Map<string, SplatProgramInfo>;\r\n /** Height-map programs keyed by the wave generator's shader hash. */\r\n private readonly _heightPrograms: Map<string, SplatProgramInfo>;\r\n /** One per water slot, differing only in which channel they let through. */\r\n private readonly _heightStates: Nullable<RenderStateSet>[];\r\n private readonly _heightParams: Vector4;\r\n /** The surface grid the height map is rasterised with; built once. */\r\n private _heightLayout: Nullable<VertexLayout>;\r\n private _heightIndexCount: number;\r\n private _blurProgram: Nullable<GPUProgram>;\r\n private _blurBindGroup: Nullable<BindGroup>;\r\n private _resolveProgram: Nullable<GPUProgram>;\r\n private _resolveBindGroup: Nullable<BindGroup>;\r\n private _resolveStates: Nullable<RenderStateSet>;\r\n /** Slice parameters of the last map committed as history, per camera. */\r\n private readonly _prevSlices: WeakMap<\r\n Camera,\r\n { frameX: Vector4; frameY: Vector4; center: Vector4; warp: number }\r\n >;\r\n private readonly _resolveParams: Vector4;\r\n private _photonLayout: Nullable<VertexLayout>;\r\n /** Photons the buffer can serve; it grows and is never rebuilt smaller. */\r\n private _photonCapacity: number;\r\n private _photonBuffer: Nullable<GPUDataBuffer>;\r\n private readonly _photonParams: Vector4;\r\n private _photonCount: number;\r\n private _splatStates: Nullable<RenderStateSet>;\r\n private _blurStates: Nullable<RenderStateSet>;\r\n private readonly _uniforms: WaterCausticUniforms;\r\n private readonly _tmpRight: Vector3;\r\n private readonly _tmpUp: Vector3;\r\n private readonly _tmpDir: Vector3;\r\n private readonly _tmpCenter: Vector3;\r\n private readonly _splatParams: Vector4;\r\n private readonly _blurTexelSize: Vector4;\r\n /** Map-NDC rectangle the photon grid covers, and the map fraction it is. */\r\n private readonly _gridBounds: Vector4;\r\n private _gridFraction: number;\r\n /** Furthest the fitted slice reaches from the camera, for cascade selection. */\r\n private _sliceReach: number;\r\n /** Slice frame and extents, kept for the per-body grid fit. */\r\n private _sliceRight: Vector3;\r\n private _sliceUp: Vector3;\r\n private _sliceCenterR: number;\r\n private _sliceCenterU: number;\r\n private _sliceHalfR: number;\r\n private _sliceHalfU: number;\r\n private readonly _splatCenter: Vector4;\r\n private readonly _sceneMatrixT: Matrix4x4;\r\n private readonly _sceneMatrix: Matrix4x4;\r\n private readonly _sceneMatrixInv: Matrix4x4;\r\n private readonly _sceneDepthParams: Vector4;\r\n /** Warp strength the current slice was built with; 0 when the map is linear. */\r\n private _warp: number;\r\n constructor() {\r\n this._splatPrograms = new Map();\r\n this._heightPrograms = new Map();\r\n this._heightStates = [];\r\n this._heightParams = new Vector4();\r\n this._heightLayout = null;\r\n this._heightIndexCount = 0;\r\n this._blurProgram = null;\r\n this._blurBindGroup = null;\r\n this._resolveProgram = null;\r\n this._resolveBindGroup = null;\r\n this._resolveStates = null;\r\n this._prevSlices = new WeakMap();\r\n this._resolveParams = new Vector4();\r\n this._photonLayout = null;\r\n this._photonCapacity = 0;\r\n this._photonBuffer = null;\r\n this._photonParams = new Vector4();\r\n this._photonCount = 0;\r\n this._splatStates = null;\r\n this._blurStates = null;\r\n this._uniforms = {\r\n frameX: new Vector4(),\r\n frameY: new Vector4(),\r\n center: new Vector4(),\r\n lightDir: new Vector4(),\r\n params: new Vector4(),\r\n extinction: new Vector4(),\r\n waterCount: 0,\r\n waterRegions: new Float32Array(MAX_CAUSTIC_WATERS * 4),\r\n waterMedia: new Float32Array(MAX_CAUSTIC_WATERS * 4)\r\n };\r\n this._tmpRight = new Vector3();\r\n this._tmpUp = new Vector3();\r\n this._tmpDir = new Vector3();\r\n this._tmpCenter = new Vector3();\r\n this._splatParams = new Vector4();\r\n this._blurTexelSize = new Vector4();\r\n this._gridBounds = new Vector4(-1, -1, 1, 1);\r\n this._gridFraction = 1;\r\n this._sliceReach = 1;\r\n this._sliceRight = new Vector3();\r\n this._sliceUp = new Vector3();\r\n this._sliceCenterR = 0;\r\n this._sliceCenterU = 0;\r\n this._sliceHalfR = 1;\r\n this._sliceHalfU = 1;\r\n this._splatCenter = new Vector4();\r\n this._sceneMatrixT = new Matrix4x4();\r\n this._sceneMatrix = new Matrix4x4();\r\n this._sceneMatrixInv = new Matrix4x4();\r\n this._sceneDepthParams = new Vector4();\r\n this._warp = 0;\r\n }\r\n /** Parameters of the map produced by the last successful {@link render}. */\r\n get uniforms(): WaterCausticUniforms {\r\n return this._uniforms;\r\n }\r\n /**\r\n * Storage format for the caustic map. Single channel when the device can both\r\n * render to and filter it, which the additive accumulation and the bilinear\r\n * sampling need.\r\n */\r\n static getMapFormat(device: AbstractDevice): TextureFormat {\r\n const info = device.getDeviceCaps().textureCaps.getTextureFormatInfo('r16f');\r\n return info.renderable && info.filterable ? 'r16f' : 'rgba16f';\r\n }\r\n /**\r\n * Storage format for the displaced surface height map: one channel per water\r\n * slot.\r\n */\r\n static getHeightMapFormat(): TextureFormat {\r\n return 'rgba16f';\r\n }\r\n /**\r\n * Whether caustics can be produced for this water surface and light.\r\n *\r\n * @param water - Water surface the photons are refracted through.\r\n * @param light - Directional light the photons come from.\r\n * @returns True when {@link render} would produce a usable map.\r\n */\r\n static canRender(water: Water, light: PunctualLight): boolean {\r\n const material = water.material;\r\n if (!material?.causticsEnabled || !material.waveGenerator || !light.isDirectionLight()) {\r\n return false;\r\n }\r\n // Sun too close to the horizon: the swept photon grid degenerates.\r\n return -light.directionAndCutoff.y >= MIN_SUN_ELEVATION;\r\n }\r\n /**\r\n * Builds the caustic map for one water surface.\r\n *\r\n * @param ctx - Draw context; supplies the device and the camera the map is centred on.\r\n * @param water - Water surface to refract through.\r\n * @param light - Directional light acting as the photon source.\r\n * @param map - Accumulation target; also the result when nothing resolves after it.\r\n * @param scratch - Ping-pong target for the blur, and the temporal resolve's\r\n * output. Same size and format as `map`.\r\n * @param heights - Target for the displaced surface height map, in\r\n * {@link getHeightMapFormat} and the same size as `map`. Filled by this call\r\n * and read by the light pass alongside the map.\r\n * @param history - Previous frame's resolved map, or null when there is none\r\n * to reproject. Ignored unless the material asks for temporal accumulation.\r\n * @param createFramebuffer - Wraps a target texture into a framebuffer.\r\n * @returns The texture holding the finished map, which is `map` or `scratch`\r\n * depending on whether the temporal resolve ran.\r\n */\r\n render(\r\n ctx: DrawContext,\r\n waters: readonly Water[],\r\n light: PunctualLight,\r\n map: Texture2D,\r\n scratch: Texture2D,\r\n heights: Texture2D,\r\n history: Nullable<Texture2D>,\r\n createFramebuffer: (texture: Texture2D) => FrameBuffer\r\n ): Texture2D {\r\n const device = ctx.device;\r\n this._updateUniforms(ctx, waters, light, map.width);\r\n const sceneDepth = this._anySceneDepth(waters) ? this._resolveSceneDepth(ctx, light) : null;\r\n\r\n // The height map first; it depends on the slice alone.\r\n device.pushDeviceStates();\r\n device.setFramebuffer(createFramebuffer(heights));\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.clearFrameBuffer(Vector4.zero(), null, null);\r\n this._ensureHeightGrid(device);\r\n for (let i = 0; i < waters.length; i++) {\r\n this._renderHeightsOne(device, ctx, waters[i], i);\r\n }\r\n device.popDeviceStates();\r\n\r\n device.pushDeviceStates();\r\n device.setFramebuffer(createFramebuffer(map));\r\n // Viewport and scissor survive a framebuffer change; reset them.\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.clearFrameBuffer(Vector4.zero(), null, null);\r\n device.setRenderStates(this._getSplatStates(device));\r\n\r\n // One draw per water body, accumulating into the one shared-slice map.\r\n for (let i = 0; i < waters.length; i++) {\r\n this._splatOne(device, ctx, waters[i], i, map, sceneDepth);\r\n }\r\n device.popDeviceStates();\r\n return this._postProcess(device, waters[0].material, map, scratch, history, ctx, createFramebuffer);\r\n }\r\n /**\r\n * Writes one body's displaced surface height into its channel of the height\r\n * map.\r\n * @internal\r\n */\r\n private _renderHeightsOne(device: AbstractDevice, ctx: DrawContext, water: Water, index: number): void {\r\n const material = water.material;\r\n const waveGenerator = material.waveGenerator!;\r\n // The grid covers this body's footprint.\r\n this._updateGridBounds(water);\r\n if (!(this._gridFraction > 0)) {\r\n return;\r\n }\r\n const info = this._getHeightProgram(device, waveGenerator);\r\n // A bind group per slot; see _getSplatBindGroup.\r\n const bindGroup = this._getSplatBindGroup(device, info, index);\r\n bindGroup.setValue('causticFrameX', this._uniforms.frameX);\r\n bindGroup.setValue('causticFrameY', this._uniforms.frameY);\r\n this._splatCenter.setXYZW(\r\n this._uniforms.center.x,\r\n this._uniforms.center.y,\r\n this._uniforms.center.z,\r\n water.worldMatrix.m13\r\n );\r\n bindGroup.setValue('causticCenter', this._splatCenter);\r\n bindGroup.setValue('causticLightDir', this._uniforms.lightDir);\r\n bindGroup.setValue('causticRegion', material.region);\r\n bindGroup.setValue('causticGridBounds', this._gridBounds);\r\n this._heightParams.setXYZW(\r\n this._warp,\r\n HEIGHT_GRID_SIZE,\r\n 1 / (HEIGHT_GRID_SIZE + 1),\r\n 1 / HEIGHT_GRID_SIZE\r\n );\r\n bindGroup.setValue('causticHeightParams', this._heightParams);\r\n ShaderHelper.setStandaloneCameraTime(bindGroup, ctx);\r\n waveGenerator.applyWaterBindGroup(bindGroup);\r\n // Channel i for slot i, which is how the receiver picks it back out.\r\n device.setRenderStates(this._getHeightStates(device, index));\r\n device.setProgram(info.program);\r\n device.setBindGroup(0, bindGroup);\r\n device.setVertexLayout(this._heightLayout!);\r\n device.draw('triangle-list', 0, this._heightIndexCount);\r\n }\r\n /**\r\n * Builds the surface grid once: vertex ordinals, and the index list that\r\n * stitches a (HEIGHT_GRID_SIZE + 1)^2 lattice of them into triangles.\r\n * @internal\r\n */\r\n private _ensureHeightGrid(device: AbstractDevice): void {\r\n if (this._heightLayout) {\r\n return;\r\n }\r\n const side = HEIGHT_GRID_SIZE + 1;\r\n const ordinals = new Float32Array(side * side);\r\n for (let i = 0; i < ordinals.length; i++) {\r\n ordinals[i] = i;\r\n }\r\n const indices = new Uint32Array(HEIGHT_GRID_SIZE * HEIGHT_GRID_SIZE * 6);\r\n let n = 0;\r\n for (let row = 0; row < HEIGHT_GRID_SIZE; row++) {\r\n for (let col = 0; col < HEIGHT_GRID_SIZE; col++) {\r\n const a = row * side + col;\r\n const b = a + 1;\r\n const c = a + side;\r\n const d = c + 1;\r\n indices[n++] = a;\r\n indices[n++] = b;\r\n indices[n++] = d;\r\n indices[n++] = a;\r\n indices[n++] = d;\r\n indices[n++] = c;\r\n }\r\n }\r\n const vertexBuffer = device.createVertexBuffer('position_f32', ordinals)!;\r\n const indexBuffer = device.createIndexBuffer(indices);\r\n this._heightLayout = device.createVertexLayout({\r\n vertexBuffers: [{ buffer: vertexBuffer }],\r\n indexBuffer\r\n });\r\n this._heightIndexCount = indices.length;\r\n }\r\n /** @internal */\r\n private _splatOne(\r\n device: AbstractDevice,\r\n ctx: DrawContext,\r\n water: Water,\r\n index: number,\r\n map: Texture2D,\r\n sceneDepth: Nullable<SceneDepthBinding>\r\n ): void {\r\n const material = water.material;\r\n const waveGenerator = material.waveGenerator!;\r\n // Photons are laid out over this body's own footprint.\r\n this._updateGridBounds(water);\r\n if (!(this._gridFraction > 0)) {\r\n return;\r\n }\r\n const photonGrid = this._resolvePhotonGrid(material.causticsPhotonResolution, map.width);\r\n this._updatePhotonLayout(device, photonGrid);\r\n const useSceneDepth = !!sceneDepth && material.causticsSceneDepth;\r\n const splat = this._getSplatProgram(device, waveGenerator, useSceneDepth);\r\n // A bind group per slot; see _getSplatBindGroup.\r\n const bindGroup = this._getSplatBindGroup(device, splat, index);\r\n if (useSceneDepth) {\r\n bindGroup.setValue('causticSceneMatrix', sceneDepth!.matrix);\r\n bindGroup.setValue('causticSceneMatrixInv', sceneDepth!.matrixInv);\r\n this._sceneDepthParams.setXYZW(sceneDepth!.layer, sceneDepth!.size, 0, 0);\r\n bindGroup.setValue('causticSceneParams', this._sceneDepthParams);\r\n bindGroup.setTexture('causticSceneDepth', sceneDepth!.texture, fetchSampler('clamp_nearest_nomip'));\r\n }\r\n bindGroup.setValue('causticFrameX', this._uniforms.frameX);\r\n bindGroup.setValue('causticFrameY', this._uniforms.frameY);\r\n // The slice centre is shared, but the water level in w is this body's.\r\n this._splatCenter.setXYZW(\r\n this._uniforms.center.x,\r\n this._uniforms.center.y,\r\n this._uniforms.center.z,\r\n water.worldMatrix.m13\r\n );\r\n bindGroup.setValue('causticCenter', this._splatCenter);\r\n bindGroup.setValue('causticLightDir', this._uniforms.lightDir);\r\n bindGroup.setValue('causticRegion', material.region);\r\n bindGroup.setValue('causticGridBounds', this._gridBounds);\r\n // Scale the deposit by covered texels per photon so a flat surface\r\n // integrates to exactly 1.\r\n const photonWeight = (this._gridFraction * map.width * map.height) / (photonGrid * photonGrid);\r\n this._splatParams.setXYZW(this._warp, material.causticsDepth, WATER_ETA, photonWeight);\r\n bindGroup.setValue('causticSplatParams', this._splatParams);\r\n this._photonParams.setXYZW(photonGrid, 1 / photonGrid, 0, 0);\r\n bindGroup.setValue('causticPhotonParams', this._photonParams);\r\n ShaderHelper.setStandaloneCameraTime(bindGroup, ctx);\r\n waveGenerator.applyWaterBindGroup(bindGroup);\r\n device.setProgram(splat.program);\r\n device.setBindGroup(0, bindGroup);\r\n device.setVertexLayout(this._photonLayout);\r\n device.draw('point-list', 0, this._photonCount);\r\n }\r\n /**\r\n * Blur and temporal resolve, run once over the finished map. Settings come\r\n * from the largest body's material.\r\n * @internal\r\n */\r\n private _postProcess(\r\n device: AbstractDevice,\r\n material: Water['material'],\r\n map: Texture2D,\r\n scratch: Texture2D,\r\n history: Nullable<Texture2D>,\r\n ctx: DrawContext,\r\n createFramebuffer: (texture: Texture2D) => FrameBuffer\r\n ): Texture2D {\r\n // Ping-pong between the two targets. The count is rounded up to an even\r\n // number by the material so the last pass always lands back in `map`.\r\n const blurPasses = Math.max(0, Math.min(material.causticsBlurPasses, 4));\r\n for (let i = 0; i < blurPasses; i++) {\r\n const src = i % 2 === 0 ? map : scratch;\r\n const dst = i % 2 === 0 ? scratch : map;\r\n this._blur(device, src, createFramebuffer(dst));\r\n }\r\n\r\n // The blur lands back in `map`, so `scratch` takes the resolve.\r\n const strength = material.causticsTemporalStrength;\r\n if (strength <= 0) {\r\n // No history committed; keep the recorded slice matching the history slot.\r\n return map;\r\n }\r\n const camera = ctx.camera;\r\n const previous = this._prevSlices.get(camera);\r\n // Without history the current map stands on its own and becomes the history.\r\n const resolved = history && previous ? scratch : map;\r\n if (resolved === scratch) {\r\n this._resolve(device, map, history!, previous!, strength, createFramebuffer(scratch));\r\n }\r\n this._rememberSlice(camera);\r\n return resolved;\r\n }\r\n /**\r\n * Shadow cascade to read the scene depth from, or null when this backend or\r\n * this light cannot supply one.\r\n * @internal\r\n */\r\n private _resolveSceneDepth(ctx: DrawContext, light: PunctualLight): Nullable<SceneDepthBinding> {\r\n // WebGPU only: GLSL ES 3.0 forbids texelFetch on a shadow-sampler texture.\r\n if (ctx.device.type !== 'webgpu') {\r\n warnUnsupported(\r\n 'Water caustics on scene depth (WaterMaterial.causticsSceneDepth)',\r\n 'WebGPU',\r\n 'caustics are projected onto the flat plane at causticsDepth'\r\n );\r\n return null;\r\n }\r\n const params = ctx.shadowMapInfo?.get(light);\r\n const shadowMap = params?.shadowMap;\r\n // Only cascaded native-depth maps; others fall back to the plane.\r\n if (!params || !shadowMap?.isTexture2DArray() || !shadowMap.isDepth()) {\r\n return null;\r\n }\r\n // The smallest cascade whose split distance clears the slice's reach, else\r\n // the last.\r\n const count = Math.max(1, Math.min(params.numShadowCascades, 4));\r\n const reach = Math.max(1, this._sliceReach);\r\n let layer = count - 1;\r\n for (let i = 0; i < count; i++) {\r\n if (params.cascadeDistances[i] >= reach) {\r\n layer = i;\r\n break;\r\n }\r\n }\r\n // shadowMatrices holds each cascade's view-projection transposed.\r\n this._sceneMatrixT.set(params.shadowMatrices.subarray(layer * 16, layer * 16 + 16));\r\n Matrix4x4.transpose(this._sceneMatrixT, this._sceneMatrix);\r\n Matrix4x4.invert(this._sceneMatrix, this._sceneMatrixInv);\r\n return {\r\n texture: shadowMap as Texture2DArray,\r\n layer,\r\n size: shadowMap.width,\r\n matrix: this._sceneMatrix,\r\n matrixInv: this._sceneMatrixInv\r\n };\r\n }\r\n /**\r\n * Photon grid edge length for this frame.\r\n *\r\n * Auto solves the grid for a fixed density in photons per covered map texel:\r\n * the grid covers `gridFraction` of the map, so the target is reached at\r\n * `grid = size * sqrt(target * gridFraction)`.\r\n *\r\n * @param requested - Material setting; 0 asks for the automatic size.\r\n * @param mapSize - Edge length of the caustic map.\r\n * @internal\r\n */\r\n private _resolvePhotonGrid(requested: number, mapSize: number): number {\r\n if (requested > 0) {\r\n return Math.max(8, Math.min(requested, 4096));\r\n }\r\n const grid = Math.round(mapSize * Math.sqrt(PHOTONS_PER_TEXEL * this._gridFraction));\r\n return Math.max(8, Math.min(grid, 4096));\r\n }\r\n /**\r\n * Records the slice the map just produced was built with, for the next frame's\r\n * reprojection.\r\n * @internal\r\n */\r\n private _rememberSlice(camera: Camera): void {\r\n let slice = this._prevSlices.get(camera);\r\n if (!slice) {\r\n slice = { frameX: new Vector4(), frameY: new Vector4(), center: new Vector4(), warp: 0 };\r\n this._prevSlices.set(camera, slice);\r\n }\r\n slice.frameX.set(this._uniforms.frameX);\r\n slice.frameY.set(this._uniforms.frameY);\r\n slice.center.set(this._uniforms.center);\r\n slice.warp = this._warp;\r\n }\r\n /** @internal */\r\n private _resolve(\r\n device: AbstractDevice,\r\n current: Texture2D,\r\n history: Texture2D,\r\n previous: { frameX: Vector4; frameY: Vector4; center: Vector4; warp: number },\r\n strength: number,\r\n dst: FrameBuffer\r\n ): void {\r\n const program = this._getResolveProgram(device);\r\n const bindGroup = this._resolveBindGroup!;\r\n device.pushDeviceStates();\r\n device.setFramebuffer(dst);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n device.setProgram(program);\r\n bindGroup.setTexture('causticCurrent', current, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setTexture('causticHistory', history, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('causticFrameX', this._uniforms.frameX);\r\n bindGroup.setValue('causticFrameY', this._uniforms.frameY);\r\n bindGroup.setValue('causticCenter', this._uniforms.center);\r\n bindGroup.setValue('causticPrevFrameX', previous.frameX);\r\n bindGroup.setValue('causticPrevFrameY', previous.frameY);\r\n bindGroup.setValue('causticPrevCenter', previous.center);\r\n this._resolveParams.setXYZW(strength, 1 / current.width, this._warp, previous.warp);\r\n bindGroup.setValue('causticResolveParams', this._resolveParams);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(this._getResolveStates(device));\r\n device.popDeviceStates();\r\n }\r\n /** @internal */\r\n private _getResolveProgram(device: AbstractDevice): GPUProgram {\r\n if (!this._resolveProgram) {\r\n this._resolveProgram = device.buildRenderProgram(createCausticResolveShader())!;\r\n this._resolveProgram.name = '@Water_CausticResolve';\r\n this._resolveBindGroup = device.createBindGroup(this._resolveProgram.bindGroupLayouts[0])!;\r\n }\r\n return this._resolveProgram;\r\n }\r\n /** @internal */\r\n private _getResolveStates(device: AbstractDevice): RenderStateSet {\r\n if (!this._resolveStates) {\r\n this._resolveStates = device.createRenderStateSet();\r\n this._resolveStates.useRasterizerState().setCullMode('none');\r\n this._resolveStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._resolveStates;\r\n }\r\n /** Releases the GPU objects owned by this renderer. */\r\n dispose(): void {\r\n for (const info of this._splatPrograms.values()) {\r\n for (const bindGroup of info.bindGroups) {\r\n bindGroup?.dispose();\r\n }\r\n info.program.dispose();\r\n }\r\n this._splatPrograms.clear();\r\n for (const info of this._heightPrograms.values()) {\r\n for (const bindGroup of info.bindGroups) {\r\n bindGroup?.dispose();\r\n }\r\n info.program.dispose();\r\n }\r\n this._heightPrograms.clear();\r\n this._heightStates.length = 0;\r\n // The layout does not own its buffers.\r\n this._heightLayout?.dispose();\r\n this._heightLayout = null;\r\n this._heightIndexCount = 0;\r\n this._blurBindGroup?.dispose();\r\n this._blurBindGroup = null;\r\n this._resolveProgram?.dispose();\r\n this._resolveProgram = null;\r\n this._resolveBindGroup?.dispose();\r\n this._resolveBindGroup = null;\r\n this._resolveStates = null;\r\n this._blurProgram?.dispose();\r\n this._blurProgram = null;\r\n this._photonLayout?.dispose();\r\n this._photonLayout = null;\r\n this._photonBuffer?.dispose();\r\n this._photonBuffer = null;\r\n this._photonCapacity = 0;\r\n this._photonCount = 0;\r\n this._splatStates = null;\r\n this._blurStates = null;\r\n }\r\n /** @internal */\r\n private _blur(device: AbstractDevice, src: Texture2D, dst: FrameBuffer): void {\r\n const program = this._getBlurProgram(device);\r\n device.pushDeviceStates();\r\n device.setFramebuffer(dst);\r\n device.setProgram(program);\r\n this._blurBindGroup!.setTexture('causticSrc', src, fetchSampler('clamp_linear_nomip'));\r\n this._blurTexelSize.setXYZW(1 / src.width, 1 / src.height, 0, 0);\r\n this._blurBindGroup!.setValue('causticTexelSize', this._blurTexelSize);\r\n device.setBindGroup(0, this._blurBindGroup!);\r\n drawFullscreenQuad(this._getBlurStates(device));\r\n device.popDeviceStates();\r\n }\r\n /**\r\n * Recomputes the orthographic light-space slice the map covers.\r\n * @internal\r\n */\r\n private _updateUniforms(\r\n ctx: DrawContext,\r\n waters: readonly Water[],\r\n light: PunctualLight,\r\n mapSize: number\r\n ): void {\r\n // Slice-wide settings come from the first (largest) body.\r\n const material = waters[0].material;\r\n const dir = this._tmpDir;\r\n dir.set(light.directionAndCutoff.xyz());\r\n dir.inplaceNormalize();\r\n // Two axes perpendicular to the light, seeded by a non-parallel world axis.\r\n const seed = Math.abs(dir.y) > 0.99 ? Vector3.axisPZ() : Vector3.axisPY();\r\n Vector3.cross(seed, dir, this._tmpRight);\r\n this._tmpRight.inplaceNormalize();\r\n Vector3.cross(dir, this._tmpRight, this._tmpUp);\r\n this._tmpUp.inplaceNormalize();\r\n const right = this._tmpRight;\r\n const up = this._tmpUp;\r\n const waterLevel = waters[0].worldMatrix.m13;\r\n const range = Math.max(1, material.causticsRange);\r\n const camera = ctx.camera.getWorldPosition();\r\n const center = this._tmpCenter.setXYZ(camera.x, waterLevel, camera.z);\r\n const cameraRight = Vector3.dot(center, right);\r\n const cameraUp = Vector3.dot(center, up);\r\n // The component along the light direction is arbitrary: both the projection\r\n // into the map and the photon sweep are invariant along it.\r\n const alongDir = Vector3.dot(center, dir);\r\n\r\n // Light-space AABB of all bodies' regions, from their four corners.\r\n let regionMinR = Infinity;\r\n let regionMaxR = -Infinity;\r\n let regionMinU = Infinity;\r\n let regionMaxU = -Infinity;\r\n for (const body of waters) {\r\n const region = body.material.region;\r\n // Each body's own height, since the projection is taken on its surface.\r\n const level = body.worldMatrix.m13;\r\n for (const [x, z] of [\r\n [region.x, region.y],\r\n [region.z, region.y],\r\n [region.x, region.w],\r\n [region.z, region.w]\r\n ]) {\r\n const r = x * right.x + level * right.y + z * right.z;\r\n const v = x * up.x + level * up.y + z * up.z;\r\n regionMinR = Math.min(regionMinR, r);\r\n regionMaxR = Math.max(regionMaxR, r);\r\n regionMinU = Math.min(regionMinU, v);\r\n regionMaxU = Math.max(regionMaxU, v);\r\n }\r\n }\r\n // Fit the slice to the water; `causticsRange` caps how far from the camera\r\n // the map reaches.\r\n let loR = Math.max(regionMinR, cameraRight - range);\r\n let hiR = Math.min(regionMaxR, cameraRight + range);\r\n let loU = Math.max(regionMinU, cameraUp - range);\r\n let hiU = Math.min(regionMaxU, cameraUp + range);\r\n if (hiR <= loR || hiU <= loU) {\r\n // No water within range; keep the slice finite so the grid bounds come\r\n // out empty rather than inverted.\r\n loR = cameraRight - range;\r\n hiR = cameraRight + range;\r\n loU = cameraUp - range;\r\n hiU = cameraUp + range;\r\n }\r\n let halfR = Math.max(MIN_SLICE_EXTENT, (hiR - loR) * 0.5);\r\n let halfU = Math.max(MIN_SLICE_EXTENT, (hiU - loU) * 0.5);\r\n // Cap the aspect ratio to bound directional smearing on the square map.\r\n halfR = Math.max(halfR, halfU / MAX_SLICE_ASPECT);\r\n halfU = Math.max(halfU, halfR / MAX_SLICE_ASPECT);\r\n // Quantise so the texel size holds still while the camera moves, which the\r\n // centre snapping and the temporal history rely on.\r\n halfR = Math.min(range, quantiseSliceExtent(halfR, range));\r\n halfU = Math.min(range, quantiseSliceExtent(halfU, range));\r\n // Warp only when the range, not the water, bounds the map.\r\n const rangeLimited =\r\n regionMinR < cameraRight - range ||\r\n regionMaxR > cameraRight + range ||\r\n regionMinU < cameraUp - range ||\r\n regionMaxU > cameraUp + range;\r\n const warp = rangeLimited ? material.causticsWarp : 0;\r\n // Snap the centre so the map does not crawl: whole texels when linear, a\r\n // coarse ladder under a warp.\r\n const snapR = warp > 0 ? halfR / WARPED_CENTER_SNAP_DIVISIONS : (2 * halfR) / mapSize;\r\n const snapU = warp > 0 ? halfU / WARPED_CENTER_SNAP_DIVISIONS : (2 * halfU) / mapSize;\r\n const centerR = Math.round(((loR + hiR) * 0.5) / snapR) * snapR;\r\n const centerU = Math.round(((loU + hiU) * 0.5) / snapU) * snapU;\r\n center.setXYZ(\r\n right.x * centerR + up.x * centerU + dir.x * alongDir,\r\n right.y * centerR + up.y * centerU + dir.y * alongDir,\r\n right.z * centerR + up.z * centerU + dir.z * alongDir\r\n );\r\n const u = this._uniforms;\r\n u.frameX.setXYZW(right.x, right.y, right.z, 1 / halfR);\r\n u.frameY.setXYZW(up.x, up.y, up.z, 1 / halfU);\r\n u.center.setXYZW(center.x, center.y, center.z, waterLevel);\r\n u.lightDir.setXYZW(dir.x, dir.y, dir.z, 1 / Math.max(-dir.y, MIN_SUN_ELEVATION));\r\n // Edge fade start, in units of the map half-extent. Only a border set by the\r\n // range is faded; a border fitted to the water coincides with the region.\r\n const minHalf = Math.min(halfR, halfU);\r\n const fadeDistance = !rangeLimited\r\n ? 0\r\n : material.causticsFadeDistance > 0\r\n ? material.causticsFadeDistance\r\n : Math.max(AUTO_FADE_MIN_DISTANCE, AUTO_FADE_FRACTION * minHalf);\r\n const fadeFraction = Math.max(MIN_FADE_FRACTION, Math.min(MAX_FADE_FRACTION, fadeDistance / minHalf));\r\n u.params.setXYZW(\r\n material.causticsIntensity,\r\n material.causticsDepth,\r\n material.causticsDefocus,\r\n 1 - fadeFraction\r\n );\r\n u.extinction.setXYZW(material.causticsMinDepth, 0, 0, warp);\r\n this._warp = warp;\r\n // Retained for the per-body grid fit.\r\n this._sliceRight = right;\r\n this._sliceUp = up;\r\n this._sliceCenterR = centerR;\r\n this._sliceCenterU = centerU;\r\n this._sliceHalfR = halfR;\r\n this._sliceHalfU = halfU;\r\n // Slice reach from the camera, for shadow cascade selection.\r\n this._sliceReach = Math.hypot(halfR, halfU);\r\n\r\n // Per-body table the receiver searches: footprint, medium and surface height.\r\n u.waterCount = Math.min(waters.length, MAX_CAUSTIC_WATERS);\r\n for (let i = 0; i < u.waterCount; i++) {\r\n const body = waters[i];\r\n const region = body.material.region;\r\n u.waterRegions[i * 4 + 0] = region.x;\r\n u.waterRegions[i * 4 + 1] = region.y;\r\n u.waterRegions[i * 4 + 2] = region.z;\r\n u.waterRegions[i * 4 + 3] = region.w;\r\n const ext = body.material.extinction;\r\n u.waterMedia[i * 4 + 0] = ext.x;\r\n u.waterMedia[i * 4 + 1] = ext.y;\r\n u.waterMedia[i * 4 + 2] = ext.z;\r\n u.waterMedia[i * 4 + 3] = body.worldMatrix.m13;\r\n }\r\n }\r\n /**\r\n * Map-NDC bounds of one body's footprint, so its photon grid covers just that.\r\n *\r\n * The body's light-space bounds carry over directly since the projection is\r\n * invariant along the light. Clamped to the map, then warped; the warp is\r\n * monotone and separable, so warping the interval's ends is exact.\r\n * @internal\r\n */\r\n private _updateGridBounds(water: Water): void {\r\n const region = water.material.region;\r\n const level = water.worldMatrix.m13;\r\n const right = this._sliceRight;\r\n const up = this._sliceUp;\r\n let minR = Infinity;\r\n let maxR = -Infinity;\r\n let minU = Infinity;\r\n let maxU = -Infinity;\r\n for (const [x, z] of [\r\n [region.x, region.y],\r\n [region.z, region.y],\r\n [region.x, region.w],\r\n [region.z, region.w]\r\n ]) {\r\n const r = x * right.x + level * right.y + z * right.z;\r\n const v = x * up.x + level * up.y + z * up.z;\r\n minR = Math.min(minR, r);\r\n maxR = Math.max(maxR, r);\r\n minU = Math.min(minU, v);\r\n maxU = Math.max(maxU, v);\r\n }\r\n const warp = this._warp;\r\n // Clamped to the map plus a margin (see GRID_BORDER_MARGIN), but never past\r\n // the water itself.\r\n const m = 1 + GRID_BORDER_MARGIN;\r\n const lo = (v: number) => Math.max(-m, Math.min(m, v));\r\n const minX = warpCausticNDC(lo((minR - this._sliceCenterR) / this._sliceHalfR), warp);\r\n const maxX = warpCausticNDC(lo((maxR - this._sliceCenterR) / this._sliceHalfR), warp);\r\n const minY = warpCausticNDC(lo((minU - this._sliceCenterU) / this._sliceHalfU), warp);\r\n const maxY = warpCausticNDC(lo((maxU - this._sliceCenterU) / this._sliceHalfU), warp);\r\n this._gridBounds.setXYZW(minX, minY, maxX, maxY);\r\n // Share of the map the grid covers; scales the photon weight to keep calm\r\n // water at 1.0.\r\n this._gridFraction = Math.max(0, ((maxX - minX) * (maxY - minY)) / 4);\r\n }\r\n /** @internal */\r\n private _updatePhotonLayout(device: AbstractDevice, gridSize: number): void {\r\n this._photonCount = gridSize * gridSize;\r\n if (this._photonCapacity >= this._photonCount) {\r\n return;\r\n }\r\n // Grow only. The buffer holds each photon's ordinal.\r\n const capacity = Math.max(this._photonCount, this._photonCapacity * 2);\r\n const indices = new Float32Array(capacity);\r\n for (let i = 0; i < capacity; i++) {\r\n indices[i] = i;\r\n }\r\n // WebGL2 refuses to draw without a bound vertex layout, so the ordinal is\r\n // materialised as an attribute rather than read from the vertex index.\r\n const buffer = device.createVertexBuffer('position_f32', indices)!;\r\n this._photonLayout?.dispose();\r\n this._photonBuffer?.dispose();\r\n this._photonBuffer = buffer;\r\n this._photonLayout = device.createVertexLayout({ vertexBuffers: [{ buffer }] });\r\n this._photonCapacity = capacity;\r\n }\r\n /** @internal */\r\n private _getSplatStates(device: AbstractDevice): RenderStateSet {\r\n if (!this._splatStates) {\r\n this._splatStates = device.createRenderStateSet();\r\n this._splatStates.useRasterizerState().setCullMode('none');\r\n this._splatStates.useDepthState().enableTest(false).enableWrite(false);\r\n // Photon accumulation: every splat adds to whatever is already there.\r\n this._splatStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFunc('one', 'one')\r\n .setBlendEquation('add', 'add');\r\n }\r\n return this._splatStates;\r\n }\r\n /** @internal */\r\n private _getHeightStates(device: AbstractDevice, slot: number): RenderStateSet {\r\n let states = this._heightStates[slot];\r\n if (!states) {\r\n states = device.createRenderStateSet();\r\n states.useRasterizerState().setCullMode('none');\r\n states.useDepthState().enableTest(false).enableWrite(false);\r\n // Plain overwrite into this slot's channel only.\r\n states.useColorState().setColorMask(slot === 0, slot === 1, slot === 2, slot === 3);\r\n this._heightStates[slot] = states;\r\n }\r\n return states;\r\n }\r\n /** @internal */\r\n private _getHeightProgram(device: AbstractDevice, waveGenerator: WaveGenerator): SplatProgramInfo {\r\n const key = waveGenerator.getHash();\r\n let info = this._heightPrograms.get(key);\r\n if (info) {\r\n return info;\r\n }\r\n const program = device.buildRenderProgram(createCausticHeightShader(waveGenerator))!;\r\n program.name = '@Water_CausticHeight';\r\n info = { program, bindGroups: [] };\r\n this._heightPrograms.set(key, info);\r\n return info;\r\n }\r\n /** @internal */\r\n private _getBlurStates(device: AbstractDevice): RenderStateSet {\r\n if (!this._blurStates) {\r\n this._blurStates = device.createRenderStateSet();\r\n this._blurStates.useRasterizerState().setCullMode('none');\r\n this._blurStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._blurStates;\r\n }\r\n /** @internal */\r\n private _getSplatProgram(\r\n device: AbstractDevice,\r\n waveGenerator: WaveGenerator,\r\n sceneDepth: boolean\r\n ): SplatProgramInfo {\r\n const key = `${waveGenerator.getHash()}:${sceneDepth ? 1 : 0}`;\r\n let info = this._splatPrograms.get(key);\r\n if (info) {\r\n return info;\r\n }\r\n const program = device.buildRenderProgram(createCausticSplatShader(waveGenerator, sceneDepth))!;\r\n program.name = `@Water_CausticSplat${sceneDepth ? '_SceneDepth' : ''}`;\r\n info = { program, bindGroups: [] };\r\n this._splatPrograms.set(key, info);\r\n return info;\r\n }\r\n /**\r\n * The bind group for one water slot of a splat program.\r\n * @internal\r\n */\r\n private _getSplatBindGroup(device: AbstractDevice, info: SplatProgramInfo, slot: number): BindGroup {\r\n let bindGroup = info.bindGroups[slot];\r\n if (!bindGroup) {\r\n bindGroup = device.createBindGroup(info.program.bindGroupLayouts[0])!;\r\n info.bindGroups[slot] = bindGroup;\r\n }\r\n return bindGroup;\r\n }\r\n /**\r\n * Whether any body asks for the scene-depth intersection, which decides\r\n * whether the shadow cascade needs resolving at all.\r\n * @internal\r\n */\r\n private _anySceneDepth(waters: readonly Water[]): boolean {\r\n return waters.some((w) => w.material.causticsSceneDepth);\r\n }\r\n /** @internal */\r\n private _getBlurProgram(device: AbstractDevice): GPUProgram {\r\n if (!this._blurProgram) {\r\n this._blurProgram = device.buildRenderProgram(createCausticBlurShader())!;\r\n this._blurProgram.name = '@Water_CausticBlur';\r\n this._blurBindGroup = device.createBindGroup(this._blurProgram.bindGroupLayouts[0])!;\r\n }\r\n return this._blurProgram;\r\n }\r\n}\r\n"],"names":["WATER_IOR","WATER_ETA","MIN_SUN_ELEVATION","SCENE_DEPTH_ITERATIONS","PHOTONS_PER_TEXEL","AUTO_FADE_FRACTION","AUTO_FADE_MIN_DISTANCE","MIN_FADE_FRACTION","MAX_FADE_FRACTION","MAX_SLICE_ASPECT","SLICE_QUANTISE_STEPS","MIN_SLICE_EXTENT","WARPED_CENTER_SNAP_DIVISIONS","GRID_BORDER_MARGIN","warpCausticNDC","ndc","strength","Math","abs","quantiseSliceExtent","half","range","steps","floor","log2","pow","HEIGHT_GRID_SIZE","createCausticSplatShader","waveGenerator","sceneDepth","setupUniforms","scope","pb","$builder","causticFrameX","vec4","uniform","causticFrameY","causticCenter","causticLightDir","causticRegion","causticGridBounds","causticSplatParams","causticPhotonParams","causticSceneMatrix","mat4","causticSceneMatrixInv","causticSceneParams","causticSceneDepth","tex2DArrayShadow","ShaderHelper","declareStandaloneCameraTime","vertex","$inputs","photonIndex","float","attrib","$outputs","photonWeight","main","$l","invRadius","vec2","w","radius","div","focalDepth","y","eta","z","L","xyz","waterLevel","gridSize","x","invGrid","photonRow","mul","photonCol","sub","photonUV","add","warpedNDC","mix","xy","zw","unwarpCausticNDC","planePos","sweep","surfaceXZ","outside","or","any","lessThan","xz","greaterThan","surfacePos","vec3","coarseNormal","calcVertexPositionAndNormal","normal","calcFragmentNormal","refracted","refract","refractedFlat","dir","normalize","invDirY","min","targetY","hitT","hitPos","max","probe","layer","int","i","and","all","greaterThanEqual","lessThanEqual","textureArrayLoad","ivec2","REVERSE_Z","rel","hitNDC","dot","hitWarped","$builtins","position","getDevice","type","pointSize","$if","fragment","outColor","createCausticHeightShader","vertexIndex","height","inside","causticHeightParams","row","col","gridUV","surfaceNormal","neg","discard","CAUSTIC_HEIGHT_BIAS","createCausticBlurShader","pos","uv","causticSrc","tex2D","causticTexelSize","o","sum","textureSampleLevel","createCausticResolveShader","causticCurrent","causticHistory","causticPrevFrameX","causticPrevFrameY","causticPrevCenter","causticResolveParams","texel","current","mn","mx","dy","dx","s","world","prevNDC","prevWarped","prevUV","history","blend","clamp","WaterCausticsRenderer","_heightParams","_heightIndexCount","_blurProgram","_blurBindGroup","_resolveProgram","_resolveBindGroup","_resolveStates","_resolveParams","_photonLayout","_photonBuffer","_photonParams","_photonCount","_splatStates","_blurStates","_uniforms","_tmpRight","_tmpUp","_tmpDir","_tmpCenter","_splatParams","_blurTexelSize","_gridFraction","_sliceUp","_sliceCenterR","_sliceCenterU","_sliceHalfR","_sliceHalfU","_splatCenter","_sceneMatrixT","_sceneMatrix","_sceneMatrixInv","_sceneDepthParams","_splatPrograms","Map","_heightPrograms","_heightStates","Vector4","_heightLayout","_prevSlices","WeakMap","_photonCapacity","frameX","frameY","center","lightDir","params","extinction","waterCount","waterRegions","Float32Array","MAX_CAUSTIC_WATERS","waterMedia","Vector3","_gridBounds","_sliceReach","_sliceRight","Matrix4x4","_warp","uniforms","getMapFormat","device","info","getDeviceCaps","textureCaps","getTextureFormatInfo","renderable","filterable","getHeightMapFormat","canRender","water","light","material","causticsEnabled","isDirectionLight","directionAndCutoff","render","ctx","waters","map","scratch","heights","createFramebuffer","_updateUniforms","width","_anySceneDepth","_resolveSceneDepth","pushDeviceStates","setFramebuffer","setViewport","setScissor","clearFrameBuffer","zero","_ensureHeightGrid","length","_renderHeightsOne","popDeviceStates","setRenderStates","_getSplatStates","_splatOne","_postProcess","index","_updateGridBounds","_getHeightProgram","bindGroup","_getSplatBindGroup","setValue","setXYZW","worldMatrix","m13","region","setStandaloneCameraTime","applyWaterBindGroup","_getHeightStates","setProgram","program","setBindGroup","setVertexLayout","draw","side","ordinals","indices","Uint32Array","n","a","b","c","d","vertexBuffer","createVertexBuffer","indexBuffer","createIndexBuffer","createVertexLayout","vertexBuffers","buffer","photonGrid","_resolvePhotonGrid","causticsPhotonResolution","_updatePhotonLayout","useSceneDepth","causticsSceneDepth","splat","_getSplatProgram","matrix","matrixInv","size","setTexture","texture","fetchSampler","causticsDepth","blurPasses","causticsBlurPasses","src","dst","_blur","causticsTemporalStrength","camera","previous","get","resolved","_resolve","_rememberSlice","warnUnsupported","shadowMapInfo","shadowMap","isTexture2DArray","isDepth","count","numShadowCascades","reach","cascadeDistances","set","shadowMatrices","subarray","transpose","invert","requested","mapSize","grid","round","sqrt","slice","warp","_getResolveProgram","drawFullscreenQuad","_getResolveStates","buildRenderProgram","name","createBindGroup","bindGroupLayouts","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","dispose","values","bindGroups","clear","_getBlurProgram","_getBlurStates","inplaceNormalize","seed","axisPZ","axisPY","cross","right","up","causticsRange","getWorldPosition","setXYZ","cameraRight","cameraUp","alongDir","regionMinR","Infinity","regionMaxR","regionMinU","regionMaxU","body","level","r","v","loR","hiR","loU","hiU","halfR","halfU","rangeLimited","causticsWarp","snapR","snapU","centerR","centerU","u","minHalf","fadeDistance","causticsFadeDistance","fadeFraction","causticsIntensity","causticsDefocus","causticsMinDepth","hypot","ext","minR","maxR","minU","maxU","m","lo","minX","maxX","minY","maxY","capacity","useBlendingState","enable","setBlendFunc","setBlendEquation","slot","states","useColorState","setColorMask","key","getHash","some"],"mappings":"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"}
|