@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
package/dist/scene/water.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"water.js","sources":["../../src/scene/water.ts"],"sourcesContent":["import { Vector4 } from '@zephyr3d/base';\r\nimport type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, Vector3, DRef } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { GraphNode } from './graph_node';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport { Clipmap, FBMWaveGenerator } from '../render';\r\nimport { WaterMaterial } from '../material/water';\r\nimport type { AbstractDevice, BindGroup, FrameBuffer, GPUProgram, RenderStateSet } from '@zephyr3d/device';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport type { Camera } from '../camera';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * Water scene node\r\n * @public\r\n */\r\nexport class Water extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _animationSpeed: number;\r\n private _timeStart: number;\r\n private _feedbackProgram: DRef<GPUProgram>;\r\n private _feedbackBindGroup: DRef<BindGroup>;\r\n private _feedbackPrimitive: DRef<Primitive>;\r\n private _feedbackRenderTarget: DRef<FrameBuffer>;\r\n private _feedbackRenderStates: Nullable<RenderStateSet>;\r\n private readonly _material: DRef<WaterMaterial>;\r\n /**\r\n * Creates an instance of Water node\r\n * @param scene - Scene object\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(32, []);\r\n this._renderData = null;\r\n this._gridScale = 1;\r\n this._animationSpeed = 1;\r\n this._timeStart = 0;\r\n this._material = new DRef(new WaterMaterial());\r\n this._material.get()!.region = new Vector4(-1, -1, 1, 1);\r\n this._material.get()!.TAAStrength = 0.4;\r\n this.waveGenerator = new FBMWaveGenerator();\r\n this._feedbackProgram = new DRef();\r\n this._feedbackBindGroup = new DRef();\r\n this._feedbackPrimitive = new DRef();\r\n this._feedbackRenderTarget = new DRef();\r\n this._feedbackRenderStates = null;\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /** Disposes the water node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap.dispose();\r\n this._renderData = null;\r\n this._feedbackBindGroup.dispose();\r\n this._feedbackPrimitive.dispose();\r\n this._feedbackProgram.dispose();\r\n this._feedbackRenderStates = null;\r\n if (this._feedbackRenderTarget.get()) {\r\n this._feedbackRenderTarget.get()!.getColorAttachment(0).dispose();\r\n this._feedbackRenderTarget.get()!.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._material.dispose();\r\n }\r\n /** Whether water should be drawn with lines */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val: boolean) {\r\n this._clipmap.wireframe = !!val;\r\n }\r\n /** Material of the water */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n /** Wave generator object of the water */\r\n get waveGenerator() {\r\n return this.material.waveGenerator;\r\n }\r\n set waveGenerator(waveGenerator) {\r\n this.material.waveGenerator = waveGenerator;\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n }\r\n }\r\n /** Animation speed of the water */\r\n get animationSpeed() {\r\n return this._animationSpeed;\r\n }\r\n set animationSpeed(val) {\r\n this._animationSpeed = val;\r\n }\r\n /** TAA strength of the water */\r\n get TAAStrength() {\r\n return this.material.TAAStrength;\r\n }\r\n set TAAStrength(val) {\r\n this.material.TAAStrength = val;\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number) {\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n if (this._timeStart === 0) {\r\n this._timeStart = elapsedInSeconds;\r\n }\r\n this.material.update(frameId, (elapsedInSeconds - this._timeStart) * this._animationSpeed);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (mat) {\r\n const that = this;\r\n this._renderData = this._clipmap.gather({\r\n camera,\r\n minMaxWorldPos: mat.region,\r\n gridScale: Math.max(0.01, this._gridScale),\r\n userData: this,\r\n frustumCulling: true,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n if (that.waveGenerator) {\r\n that.waveGenerator.calcClipmapTileAABB(minX, maxX, minZ, maxZ, p.y, outAABB);\r\n } else {\r\n outAABB.minPoint.setXYZ(minX, p.y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, p.y + 1, maxZ);\r\n }\r\n }\r\n });\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n getSkinInfluenceData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isWater}\r\n */\r\n isWater(): this is Water {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const mat = this._material?.get();\r\n if (mat) {\r\n const boundingBox = new BoundingBox();\r\n if (mat.waveGenerator) {\r\n mat.waveGenerator.calcClipmapTileAABB(\r\n mat.region.x,\r\n mat.region.z,\r\n mat.region.y,\r\n mat.region.w,\r\n p.y,\r\n boundingBox\r\n );\r\n } else {\r\n boundingBox.minPoint.setXYZ(mat.region.x, p.y, mat.region.y);\r\n boundingBox.maxPoint.setXYZ(mat.region.z, p.y + 1, mat.region.w);\r\n }\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Grid scale\r\n */\r\n get gridScale() {\r\n return this._gridScale;\r\n }\r\n set gridScale(val) {\r\n this._gridScale = val;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n const material = this._material?.get();\r\n if (material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x;\r\n const pz = this.position.z;\r\n material.region = new Vector4(px - x, pz - z, px + x, pz + z);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(this._gridScale, this.worldMatrix.m03, this.worldMatrix.m23);\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n }\r\n }\r\n /**\r\n * Retreive the disturbed world position and normal at water surface\r\n */\r\n async getSurfacePoint(points: Vector3[], outPos?: Vector3[], outNorm?: Vector3[]) {\r\n const device = getDevice();\r\n if (!points || points.length === 0) {\r\n return;\r\n }\r\n points = points.map((v) => v.clone());\r\n await device.runNextFrameAsync(async () => {\r\n if (!this._feedbackProgram.get()) {\r\n this._feedbackProgram.set(this._createFeedbackProgram(device));\r\n this._feedbackBindGroup.set(device.createBindGroup(this._feedbackProgram.get()!.bindGroupLayouts[0]));\r\n }\r\n if (!this._feedbackPrimitive.get()) {\r\n this._feedbackPrimitive.set(new Primitive());\r\n this._feedbackPrimitive.get()!.primitiveType = 'point-list';\r\n }\r\n if (!this._feedbackRenderStates) {\r\n this._feedbackRenderStates = device.createRenderStateSet();\r\n this._feedbackRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._feedbackRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n const primitive = this._feedbackPrimitive.get()!;\r\n const vertices = new Float32Array(points.length * 4);\r\n for (let i = 0; i < points.length; i++) {\r\n vertices[i * 4 + 0] = points[i].x;\r\n vertices[i * 4 + 1] = points[i].y;\r\n vertices[i * 4 + 2] = points[i].z;\r\n vertices[i * 4 + 3] = i;\r\n }\r\n let vb = primitive.getVertexBuffer('position');\r\n if (!vb || vb.byteLength !== vertices.byteLength) {\r\n vb = device.createVertexBuffer('position_f32x4', vertices, { dynamic: true })!;\r\n primitive.setVertexBuffer(vb);\r\n } else {\r\n vb.bufferSubData(0, vertices);\r\n }\r\n const fb = this._feedbackRenderTarget.get();\r\n if (!fb || fb.getColorAttachment(0).width < points.length) {\r\n const rt0 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n const rt1 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n if (fb) {\r\n fb.getColorAttachment(0).dispose();\r\n fb.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._feedbackRenderTarget.set(device.createFrameBuffer([rt0, rt1], null));\r\n }\r\n primitive.indexCount = points.length;\r\n const bindGroup = this._feedbackBindGroup.get()!;\r\n bindGroup.setValue('textureWidth', this._feedbackRenderTarget.get()!.getWidth());\r\n this.waveGenerator!.applyWaterBindGroup(bindGroup);\r\n device.pushDeviceStates();\r\n device.setProgram(this._feedbackProgram.get());\r\n device.setBindGroup(0, this._feedbackBindGroup.get()!);\r\n device.setFramebuffer(this._feedbackRenderTarget.get());\r\n this._feedbackPrimitive.get()!.draw();\r\n device.popDeviceStates();\r\n const pos = new Float32Array(points.length * 4);\r\n const norm = new Float32Array(points.length * 4);\r\n await Promise.all([\r\n this._feedbackRenderTarget.get()!.getColorAttachment(0).readPixels(0, 0, points.length, 1, 0, 0, pos),\r\n this._feedbackRenderTarget.get()!.getColorAttachment(1).readPixels(0, 0, points.length, 1, 0, 0, norm)\r\n ]);\r\n for (let i = 0; i < points.length; i++) {\r\n if (outPos) {\r\n outPos[i].setXYZ(pos[i * 4 + 0], pos[i * 4 + 1], pos[i * 4 + 2]);\r\n }\r\n if (outNorm) {\r\n outNorm[i].setXYZ(norm[i * 4 + 0], norm[i * 4 + 1], norm[i * 4 + 2]);\r\n }\r\n }\r\n });\r\n }\r\n /** @internal */\r\n private _createFeedbackProgram(device: AbstractDevice) {\r\n const that = this;\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.position = pb.vec4().attrib('position');\r\n this.textureWidth = pb.float().uniform(0);\r\n that.waveGenerator!.setupUniforms(this, 0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.vec3();\r\n this.$l.worldNorm = pb.vec3();\r\n that.waveGenerator!.calcVertexPositionAndNormal(\r\n this,\r\n this.$inputs.position.xyz,\r\n this.worldPos,\r\n this.worldNorm\r\n );\r\n this.$outputs.worldPos = this.worldPos;\r\n this.$outputs.worldNorm = this.worldNorm;\r\n this.$outputs.xz = this.$inputs.position.xz;\r\n this.$l.ndcX = pb.sub(\r\n pb.mul(pb.div(pb.add(this.$inputs.position.w, 0.5), this.textureWidth), 2),\r\n 1\r\n );\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$l.$builtins.position = pb.vec4(this.ndcX, 0, 0, 1);\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.worldPos = pb.vec4();\r\n this.$outputs.worldNorm = pb.vec4();\r\n that.waveGenerator!.setupUniforms(this, 0);\r\n pb.main(function () {\r\n this.$outputs.worldPos = pb.vec4(this.$inputs.worldPos, 1);\r\n this.$outputs.worldNorm = pb.vec4(\r\n that.waveGenerator!.calcFragmentNormal(this, this.$inputs.xz, this.$inputs.worldNorm),\r\n 1\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = '@Water_Feedback';\r\n return program;\r\n }\r\n}\r\n"],"names":["Water","applyMixins","GraphNode","mixinDrawable","_pickTarget","_clipmap","_renderData","_gridScale","_animationSpeed","_timeStart","_feedbackProgram","_feedbackBindGroup","_feedbackPrimitive","_feedbackRenderTarget","_feedbackRenderStates","_material","scene","node","Clipmap","DRef","WaterMaterial","get","region","Vector4","TAAStrength","waveGenerator","FBMWaveGenerator","queuePerCameraUpdateNode","onDispose","dispose","getColorAttachment","wireframe","val","material","needUpdate","queueUpdateNode","animationSpeed","update","frameId","elapsedInSeconds","invalidateWorldBoundingVolume","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","gather","minMaxWorldPos","gridScale","Math","max","userData","frustumCulling","calcAABB","minX","maxX","minZ","maxZ","outAABB","p","worldMatrix","transformPointAffine","Vector3","zero","calcClipmapTileAABB","y","minPoint","setXYZ","maxPoint","getPickTarget","getMorphData","getSkinInfluenceData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isWater","computeBoundingVolume","computeWorldBoundingVolume","boundingBox","BoundingBox","x","z","w","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","set","localMatrix","parent","m03","m13","m23","_onTransformChanged","invalidateLocal","abs","scale","px","position","pz","draw","ctx","renderQueue","bind","setClipmapGridInfo","apply","info","primitive","numInstances","getSurfacePoint","points","outPos","outNorm","device","getDevice","length","map","v","clone","runNextFrameAsync","_createFeedbackProgram","createBindGroup","bindGroupLayouts","Primitive","primitiveType","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","vertices","Float32Array","i","vb","getVertexBuffer","byteLength","createVertexBuffer","dynamic","setVertexBuffer","bufferSubData","fb","width","rt0","createTexture2D","mipmapping","rt1","createFrameBuffer","indexCount","bindGroup","setValue","getWidth","applyWaterBindGroup","pushDeviceStates","setProgram","setBindGroup","setFramebuffer","popDeviceStates","pos","norm","Promise","all","readPixels","program","buildRenderProgram","vertex","pb","$inputs","vec4","attrib","textureWidth","float","uniform","setupUniforms","main","$l","worldPos","vec3","worldNorm","calcVertexPositionAndNormal","xyz","$outputs","xz","ndcX","sub","mul","div","add","type","$builtins","pointSize","fragment","calcFragmentNormal","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"water.js","sources":["../../src/scene/water.ts"],"sourcesContent":["import { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, Vector3, DRef } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { GraphNode } from './graph_node';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, PrimitiveInstanceInfo, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport { Clipmap, FBMWaveGenerator } from '../render';\r\nimport { setWaterSubmergence } from '../render/underwater';\r\nimport { WaterMaterial } from '../material/water';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport {\r\n InteractiveWaveGenerator,\r\n type WaterBathymetry,\r\n type WaterInteraction\r\n} from '../render/water_interaction';\r\nimport type { ClipmapTerrain } from './terrain-cm/terrain-cm';\r\nimport type { WaterDebugOutput, WaterRefractionMode } from '../material/water';\r\nimport type { AbstractDevice, BindGroup, FrameBuffer, GPUProgram, RenderStateSet } from '@zephyr3d/device';\r\nimport type { WaveGenerator } from '../render/wavegenerator';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport type { Camera } from '../camera';\r\nimport { getDevice } from '../app/api';\r\nimport { TerrainWaterlineSource, WaterlineField } from '../render/sdf/waterline';\r\nimport { RenderGraphExecutor } from '../render/rendergraph/executor';\r\n\r\n/** Mean earth radius in meters, for the horizon distance. @internal */\r\nconst EARTH_RADIUS = 6371000;\r\n/** Floor on the eye height feeding the horizon distance, in meters. @internal */\r\nconst MIN_HORIZON_EYE_HEIGHT = 0.1;\r\n/**\r\n * How far past the tessellated surface the skirt's outer edge is placed, as a\r\n * multiple of the view distance. Its depth is pinned to the far plane.\r\n * @internal\r\n */\r\nconst SKIRT_DISTANCE_FACTOR = 10;\r\n/**\r\n * Region rectangle standing in for \"no bounds\", matching the WaterMaterial\r\n * default. @internal\r\n */\r\nconst WHOLE_DOMAIN = new Vector4(-99999, -99999, 99999, 99999);\r\n/**\r\n * The shore field's levels around the camera: cells along a side and the\r\n * finest cell size in metres, each level twice the size of the one before,\r\n * laid out as the foam field's are.\r\n */\r\nconst SHORE_FIELD_LEVELS = 4;\r\nconst SHORE_FIELD_CELLS = 256;\r\nconst SHORE_FIELD_CELL_SIZE = 0.5;\r\n/** Shore field levels rebuilt in a frame at most, so the camera crossing every level's cell at once is no spike. */\r\nconst SHORE_FIELD_REBUILDS = 2;\r\n/** No waterline grid: 0 cells. */\r\nconst NO_REGIONS: readonly Vector4[] = [new Vector4(0, 0, 1, 0)];\r\n\r\n/**\r\n * One evaluated point of a water surface, in world space.\r\n *\r\n * `nx`/`ny`/`nz` are only filled when the caller asked for normals; otherwise\r\n * they stay at the straight-up default.\r\n *\r\n * @public\r\n */\r\nexport interface SurfacePointHit {\r\n /** World X of the displaced surface. */\r\n x: number;\r\n /** World Y of the displaced surface. */\r\n y: number;\r\n /** World Z of the displaced surface. */\r\n z: number;\r\n /** X component of the surface normal. */\r\n nx: number;\r\n /** Y component of the surface normal. */\r\n ny: number;\r\n /** Z component of the surface normal. */\r\n nz: number;\r\n}\r\n\r\n/**\r\n * Water scene node\r\n * @public\r\n */\r\nexport class Water extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private readonly _pickTarget: PickTarget;\r\n private _clipmap: Clipmap;\r\n private _renderData: Nullable<PrimitiveInstanceInfo[]>;\r\n private _gridScale: number;\r\n private _viewDistance: number;\r\n private _animationSpeed: number;\r\n private _timeStart: number;\r\n /** Wave clock, in seconds. Advanced by `animationSpeed` per frame. */\r\n private _waveTime: number;\r\n /** Elapsed time at the previous update, for the frame delta. */\r\n private _lastUpdateTime: number;\r\n private _feedbackProgram: DRef<GPUProgram>;\r\n /** Hash of the wave generator the feedback program was built for. */\r\n private _feedbackHash: string;\r\n private _feedbackBindGroup: DRef<BindGroup>;\r\n private _feedbackPrimitive: DRef<Primitive>;\r\n private _feedbackRenderTarget: DRef<FrameBuffer>;\r\n private _feedbackRenderStates: Nullable<RenderStateSet>;\r\n /**\r\n * Tail of the surface-query queue. The feedback pass reuses one vertex buffer\r\n * and render target, so requests are serialized in issue order.\r\n */\r\n private _feedbackQueue: Promise<void>;\r\n /**\r\n * Frame numbers of the stages of the most recent surface-point query, for\r\n * latency diagnostics: when it was requested, when its render was recorded,\r\n * and when the readback resolved. All are `device.frameInfo.frameCounter`.\r\n * @public\r\n */\r\n lastFeedbackTiming = { issued: 0, recorded: 0, mapped: 0 };\r\n private readonly _material: DRef<WaterMaterial>;\r\n /**\r\n * Whether each camera was inside this body of water on its previous update;\r\n * the submerged test has a dead band around the surface, so it needs the\r\n * crossing direction.\r\n */\r\n private readonly _submerged: WeakMap<Camera, boolean>;\r\n /**\r\n * Creates an instance of Water node\r\n * @param scene - Scene object\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._pickTarget = { node: this };\r\n this._clipmap = new Clipmap(32, []);\r\n this._renderData = null;\r\n this._gridScale = 1;\r\n this._viewDistance = 0;\r\n this._animationSpeed = 1;\r\n this._timeStart = 0;\r\n this._waveTime = 0;\r\n this._lastUpdateTime = 0;\r\n this._material = new DRef(new WaterMaterial());\r\n this._material.get()!.region = new Vector4(-1, -1, 1, 1);\r\n this._material.get()!.TAAStrength = 0.2;\r\n this.waveGenerator = new FBMWaveGenerator();\r\n this._feedbackProgram = new DRef();\r\n this._feedbackHash = '';\r\n this._feedbackBindGroup = new DRef();\r\n this._feedbackPrimitive = new DRef();\r\n this._feedbackRenderTarget = new DRef();\r\n this._feedbackRenderStates = null;\r\n this._feedbackQueue = Promise.resolve();\r\n this._submerged = new WeakMap();\r\n scene.queuePerCameraUpdateNode(this);\r\n }\r\n /** Disposes the water node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._clipmap.dispose();\r\n this._shoreField?.dispose();\r\n this._shoreSource?.dispose();\r\n this._shoreField = null;\r\n this._shoreSource = null;\r\n this._renderData = null;\r\n this._feedbackBindGroup.dispose();\r\n this._feedbackPrimitive.dispose();\r\n this._feedbackProgram.dispose();\r\n this._feedbackRenderStates = null;\r\n if (this._feedbackRenderTarget.get()) {\r\n this._feedbackRenderTarget.get()!.getColorAttachment(0).dispose();\r\n this._feedbackRenderTarget.get()!.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._material.dispose();\r\n }\r\n /** Whether water should be drawn with lines */\r\n get wireframe() {\r\n return this._clipmap.wireframe;\r\n }\r\n set wireframe(val: boolean) {\r\n this._clipmap.wireframe = !!val;\r\n }\r\n /** Material of the water */\r\n get material() {\r\n return this._material.get()!;\r\n }\r\n /**\r\n * Wave generator object of the water: the source of the ambient surface.\r\n *\r\n * While an {@link interaction} is attached the surface actually drawn is\r\n * this generator plus the interaction field; this still returns the\r\n * generator on its own.\r\n */\r\n get waveGenerator() {\r\n return this.material.baseWaveGenerator;\r\n }\r\n set waveGenerator(waveGenerator) {\r\n this.material.waveGenerator = waveGenerator;\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * Dynamic height field layered over the surface, driven by things touching\r\n * the water, or null for none. See {@link WaterInteraction}.\r\n *\r\n * The field is stepped on this water's own clock, so {@link animationSpeed}\r\n * scales it too; it is added everywhere the surface is evaluated, so\r\n * {@link getSurfacePoint} and the caustics see it as well.\r\n */\r\n get interaction() {\r\n return this.material.interaction;\r\n }\r\n set interaction(val: Nullable<WaterInteraction>) {\r\n this.material.interaction = val;\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * Whether the surface reads as an unbounded ocean reaching the horizon,\r\n * rather than a body of water ending at the node's extent.\r\n *\r\n * Off by default. The region test is skipped while this is on.\r\n *\r\n * The horizon is reached without touching the camera's far plane: the\r\n * clipmap's outermost ring is drawn as a skirt whose outer vertices are\r\n * pushed well past it with their depth pinned to the far value.\r\n */\r\n get infinite() {\r\n return this.material.infinite;\r\n }\r\n set infinite(val: boolean) {\r\n if (!!val !== this.material.infinite) {\r\n this.material.infinite = !!val;\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n /**\r\n * How far the surface is built out from the camera while {@link infinite} is\r\n * on, in meters. 0 derives it from the true horizon distance for the camera's\r\n * height above the water.\r\n *\r\n * Geometry cost grows only logarithmically. Keep it within the sky's\r\n * {@link SkyRenderer.aerialPerspectiveDistance}, or the far water stops\r\n * converging towards the sky colour and shows a hard band.\r\n */\r\n get viewDistance() {\r\n return this._viewDistance;\r\n }\r\n set viewDistance(val: number) {\r\n this._viewDistance = Math.max(0, val);\r\n }\r\n /**\r\n * Animation speed of the water. Zero freezes the surface where it is rather\r\n * than resetting it: the wave phase is accumulated, and this scales the\r\n * increment.\r\n */\r\n get animationSpeed() {\r\n return this._animationSpeed;\r\n }\r\n set animationSpeed(val) {\r\n this._animationSpeed = val;\r\n }\r\n /**\r\n * The wave clock the surface is currently at, in seconds.\r\n *\r\n * The time the displaced surface was last evaluated with (the value\r\n * {@link WaterMaterial.update} is handed), not the scene's elapsed time. CPU\r\n * samplers of the surface should use this clock; it matches `elapsedInSeconds`\r\n * from {@link SceneNode.update} only while {@link animationSpeed} is 1 and the\r\n * water has not been paused.\r\n */\r\n get waveTime() {\r\n return this._waveTime;\r\n }\r\n /** TAA strength of the water */\r\n get TAAStrength() {\r\n return this.material.TAAStrength;\r\n }\r\n set TAAStrength(val) {\r\n this.material.TAAStrength = val;\r\n }\r\n /**\r\n * Whether this water projects caustics onto the geometry below it.\r\n *\r\n * Needs a shadow-casting directional light and a WebGL2/WebGPU device; the\r\n * caustics pass switches itself off when either is missing, and when the sun\r\n * drops close to the horizon.\r\n */\r\n get causticsEnabled() {\r\n return this.material.causticsEnabled;\r\n }\r\n set causticsEnabled(val: boolean) {\r\n this.material.causticsEnabled = val;\r\n }\r\n /** Strength of the caustic contrast. 0 leaves the light unmodulated. */\r\n get causticsIntensity() {\r\n return this.material.causticsIntensity;\r\n }\r\n set causticsIntensity(val: number) {\r\n this.material.causticsIntensity = val;\r\n }\r\n /** Depth in meters below the surface where the caustics are in focus. */\r\n get causticsDepth() {\r\n return this.material.causticsDepth;\r\n }\r\n set causticsDepth(val: number) {\r\n this.material.causticsDepth = val;\r\n }\r\n /**\r\n * Whether caustics land on the scene rather than on a plane at\r\n * {@link causticsDepth}. WebGL2 keeps the plane regardless.\r\n */\r\n get causticsSceneDepth() {\r\n return this.material.causticsSceneDepth;\r\n }\r\n set causticsSceneDepth(val: boolean) {\r\n this.material.causticsSceneDepth = val;\r\n }\r\n /**\r\n * Furthest distance in meters from the camera the caustic map reaches; the\r\n * map is fitted to the part of the water within this distance.\r\n */\r\n get causticsRange() {\r\n return this.material.causticsRange;\r\n }\r\n set causticsRange(val: number) {\r\n this.material.causticsRange = val;\r\n }\r\n /**\r\n * Width in meters of the band the caustics fade out over at the edge of the\r\n * map, or 0 to derive it from {@link causticsRange}.\r\n */\r\n get causticsFadeDistance() {\r\n return this.material.causticsFadeDistance;\r\n }\r\n set causticsFadeDistance(val: number) {\r\n this.material.causticsFadeDistance = val;\r\n }\r\n /**\r\n * How strongly caustic map texels are concentrated near the camera, 0 to\r\n * spread them evenly. Ignored while the map already fits the water within\r\n * {@link causticsRange}.\r\n */\r\n get causticsWarp() {\r\n return this.material.causticsWarp;\r\n }\r\n set causticsWarp(val: number) {\r\n this.material.causticsWarp = val;\r\n }\r\n /** Water depth in metres below which no caustics show. */\r\n get causticsMinDepth() {\r\n return this.material.causticsMinDepth;\r\n }\r\n set causticsMinDepth(val: number) {\r\n this.material.causticsMinDepth = val;\r\n }\r\n /**\r\n * Whether a camera inside this body of water sees the water from the inside:\r\n * the medium applied to the whole scene, the sky replaced by water, and the\r\n * surface read from below with its Snell window.\r\n *\r\n * Uses the same medium coefficients the surface does ({@link absorption},\r\n * {@link scattering} and their scales). Atmospheric fog is suppressed while\r\n * submerged. Only reaches opaque geometry, like the atmospheric fog it\r\n * replaces.\r\n */\r\n get underwaterEnabled() {\r\n return this.material.underwaterEnabled;\r\n }\r\n set underwaterEnabled(val: boolean) {\r\n this.material.underwaterEnabled = val;\r\n }\r\n /**\r\n * Scale on the downwelling sky light that fills the water column, 1 for the\r\n * value the sky implies. This is what the water fades to in the distance, so\r\n * it also sets how bright the underwater haze reads.\r\n */\r\n get underwaterAmbientIntensity() {\r\n return this.material.underwaterAmbientIntensity;\r\n }\r\n set underwaterAmbientIntensity(val: number) {\r\n this.material.underwaterAmbientIntensity = val;\r\n }\r\n /**\r\n * Whether shafts of sunlight are marched through the water column.\r\n *\r\n * Reads the caustic map as the surface's transmittance. Needs\r\n * {@link causticsEnabled}; switches itself off wherever the map is\r\n * unavailable.\r\n */\r\n get underwaterGodRays() {\r\n return this.material.underwaterGodRays;\r\n }\r\n set underwaterGodRays(val: boolean) {\r\n this.material.underwaterGodRays = val;\r\n }\r\n /** Strength of the light shafts, 1 for the value the medium implies. */\r\n get underwaterGodRayIntensity() {\r\n return this.material.underwaterGodRayIntensity;\r\n }\r\n set underwaterGodRayIntensity(val: number) {\r\n this.material.underwaterGodRayIntensity = val;\r\n }\r\n /**\r\n * Samples taken along each view ray for the light shafts. Raise it when the\r\n * shafts read as grain rather than as beams.\r\n */\r\n get underwaterGodRaySteps() {\r\n return this.material.underwaterGodRaySteps;\r\n }\r\n set underwaterGodRaySteps(val: number) {\r\n this.material.underwaterGodRaySteps = val;\r\n }\r\n /**\r\n * Whether geometry standing in the water breaks the light shafts. Off by\r\n * default.\r\n *\r\n * Without it a shaft runs straight through a piling or a hull. Costs a shadow\r\n * map lookup per march step, roughly doubling the cost of the shafts.\r\n */\r\n get underwaterGodRayShadow() {\r\n return this.material.underwaterGodRayShadow;\r\n }\r\n set underwaterGodRayShadow(val: boolean) {\r\n this.material.underwaterGodRayShadow = val;\r\n }\r\n /**\r\n * Half-width in meters of the dead band around the surface the submerged test\r\n * uses, so a camera sitting at water level does not flip state every frame.\r\n * The test is against the rest plane, not the displaced surface.\r\n */\r\n get underwaterHysteresis() {\r\n return this.material.underwaterHysteresis;\r\n }\r\n set underwaterHysteresis(val: number) {\r\n this.material.underwaterHysteresis = val;\r\n }\r\n /**\r\n * Strength of the glow of a backlit wave crest, 0 to disable. Authored, not\r\n * scaled by the light's intensity; {@link subsurfaceTint} supplies the hue.\r\n */\r\n get subsurfaceIntensity() {\r\n return this.material.subsurfaceIntensity;\r\n }\r\n set subsurfaceIntensity(val: number) {\r\n this.material.subsurfaceIntensity = val;\r\n }\r\n /**\r\n * Height above the still-water level, in meters, over which the lit wall of\r\n * a crest thins by a factor of `e`. Lower for a calm sea, higher so only the\r\n * tallest crests glow.\r\n */\r\n get subsurfaceCrestHeight() {\r\n return this.material.subsurfaceCrestHeight;\r\n }\r\n set subsurfaceCrestHeight(val: number) {\r\n this.material.subsurfaceCrestHeight = val;\r\n }\r\n /**\r\n * Colour of the crest glow, before the crest gate tints it with the medium's\r\n * extinction.\r\n */\r\n get subsurfaceTint() {\r\n return this.material.subsurfaceTint;\r\n }\r\n set subsurfaceTint(val: Vector3) {\r\n this.material.subsurfaceTint = val;\r\n }\r\n /**\r\n * Strength of the sunlight scattered out of the water column towards the eye,\r\n * 1 for the value the medium coefficients imply. Lets shadows darken the\r\n * water body and a low sun tint it; 0 leaves it lit by the environment alone.\r\n */\r\n get sunScatteringIntensity() {\r\n return this.material.sunScatteringIntensity;\r\n }\r\n set sunScatteringIntensity(val: number) {\r\n this.material.sunScatteringIntensity = val;\r\n }\r\n /**\r\n * Crest to trough height in metres of the waves rolling in to the shore,\r\n * breaking and running up the beach, 0 for none. They come square on to the\r\n * coast whatever its shape, and boats ride them. Needs the scene signed\r\n * distance field (WebGPU, scene SDF enabled).\r\n */\r\n get shoreWaveHeight() {\r\n return this.material.shoreWaveHeight;\r\n }\r\n set shoreWaveHeight(val: number) {\r\n this.material.shoreWaveHeight = val;\r\n }\r\n /** Thickness in metres over which a thin sheet of water fades in from the ground under it; 0 disables it. */\r\n get edgeFadeWidth() {\r\n return this.material.edgeFadeWidth;\r\n }\r\n set edgeFadeWidth(val: number) {\r\n this.material.edgeFadeWidth = val;\r\n }\r\n /** Distance in metres between shore wave crests at the outer edge of their zone. */\r\n get shoreWaveLength() {\r\n return this.material.shoreWaveLength;\r\n }\r\n set shoreWaveLength(val: number) {\r\n this.material.shoreWaveLength = val;\r\n }\r\n /** Seconds between successive shore waves. */\r\n get shoreWavePeriod() {\r\n return this.material.shoreWavePeriod;\r\n }\r\n set shoreWavePeriod(val: number) {\r\n this.material.shoreWavePeriod = val;\r\n }\r\n /** How far out from the waterline the shore waves rise, in metres. */\r\n get shoreWaveZone() {\r\n return this.material.shoreWaveZone;\r\n }\r\n set shoreWaveZone(val: number) {\r\n this.material.shoreWaveZone = val;\r\n }\r\n /** How sharp the shore wave crests become at the shore, 0 for a sine and towards 1 for a cusp. */\r\n get shoreWaveSharpness() {\r\n return this.material.shoreWaveSharpness;\r\n }\r\n set shoreWaveSharpness(val: number) {\r\n this.material.shoreWaveSharpness = val;\r\n }\r\n /** How far the shore wave crests lean towards the shore there, 0 for upright, 1 for a steep front face. */\r\n get shoreWaveLean() {\r\n return this.material.shoreWaveLean;\r\n }\r\n set shoreWaveLean(val: number) {\r\n this.material.shoreWaveLean = val;\r\n }\r\n /** How irregular the shore waves are, 0..1: 0 for parallel crests a fixed wavelength apart, higher for each wave with a period and a bend of its own. */\r\n get shoreWaveIrregularity() {\r\n return this.material.shoreWaveIrregularity;\r\n }\r\n set shoreWaveIrregularity(val: number) {\r\n this.material.shoreWaveIrregularity = val;\r\n }\r\n /** How fast the foam fades, per second (Crest's Foam Fade Rate): lower leaves longer trails behind breaking waves. */\r\n get foamFadeRate() {\r\n return this.material.foamFadeRate;\r\n }\r\n set foamFadeRate(val: number) {\r\n this.material.foamFadeRate = val;\r\n }\r\n /** How much foam the open water's breaking crests leave behind to drift and fade; 0 keeps foam only while a crest breaks. */\r\n get foamTrailStrength() {\r\n return this.material.foamTrailStrength;\r\n }\r\n set foamTrailStrength(val: number) {\r\n this.material.foamTrailStrength = val;\r\n }\r\n /** Share of the wind speed the foam drifts at, about 0.03 in nature. */\r\n get foamDrift() {\r\n return this.material.foamDrift;\r\n }\r\n set foamDrift(val: number) {\r\n this.material.foamDrift = val;\r\n }\r\n /** Side in metres of the finest square of water around the view whose foam lingers, in the most detail; coarser squares reach eight times as far, beyond which foam shows only while crests break. */\r\n get foamFieldSize() {\r\n return this.material.foamFieldSize;\r\n }\r\n set foamFieldSize(val: number) {\r\n this.material.foamFieldSize = val;\r\n }\r\n /** How much foam the breaking shore waves make (Crest's Wave Foam Strength). */\r\n get shoreWaveFoamStrength() {\r\n return this.material.shoreWaveFoamStrength;\r\n }\r\n set shoreWaveFoamStrength(val: number) {\r\n this.material.shoreWaveFoamStrength = val;\r\n }\r\n /** How much of the shore waves makes foam, 0..1, higher for more (Crest's Wave Foam Coverage). */\r\n get shoreWaveFoamCoverage() {\r\n return this.material.shoreWaveFoamCoverage;\r\n }\r\n set shoreWaveFoamCoverage(val: number) {\r\n this.material.shoreWaveFoamCoverage = val;\r\n }\r\n /** Water shallower than this many metres makes foam (Crest's Shoreline Foam Max Depth). */\r\n get shoreWaveShallowFoamDepth() {\r\n return this.material.shoreWaveShallowFoamDepth;\r\n }\r\n set shoreWaveShallowFoamDepth(val: number) {\r\n this.material.shoreWaveShallowFoamDepth = val;\r\n }\r\n /** How much foam shallow water makes (Crest's Shoreline Foam Strength). */\r\n get shoreWaveShallowFoamStrength() {\r\n return this.material.shoreWaveShallowFoamStrength;\r\n }\r\n set shoreWaveShallowFoamStrength(val: number) {\r\n this.material.shoreWaveShallowFoamStrength = val;\r\n }\r\n /** How opaque the foam is that the water makes against walls, rocks and piers standing in it, 0..1; it always rings them whole. */\r\n get wallFoamStrength() {\r\n return this.material.wallFoamStrength;\r\n }\r\n set wallFoamStrength(val: number) {\r\n this.material.wallFoamStrength = val;\r\n }\r\n /** Speed in metres per second the water has to hit a wall at before it makes any foam there. */\r\n get wallFoamMinSpeed() {\r\n return this.material.wallFoamMinSpeed;\r\n }\r\n set wallFoamMinSpeed(val: number) {\r\n this.material.wallFoamMinSpeed = val;\r\n }\r\n /** Speed in metres per second at which water hitting a wall makes the most foam. */\r\n get wallFoamMaxSpeed() {\r\n return this.material.wallFoamMaxSpeed;\r\n }\r\n set wallFoamMaxSpeed(val: number) {\r\n this.material.wallFoamMaxSpeed = val;\r\n }\r\n /** Speed in metres per second the foam drifts out from walls, rocks and piers at: higher for a wider ring of foam around them. */\r\n get wallFoamDrift() {\r\n return this.material.wallFoamDrift;\r\n }\r\n set wallFoamDrift(val: number) {\r\n this.material.wallFoamDrift = val;\r\n }\r\n /** Seconds the foam each breaking wave brings in lasts, behind the crest and up the beach. */\r\n get surfFoamDuration() {\r\n return this.material.surfFoamDuration;\r\n }\r\n set surfFoamDuration(val: number) {\r\n this.material.surfFoamDuration = val;\r\n }\r\n /** Water depth in metres at and below which foam stops drifting and stays where it is. */\r\n get foamSettleDepth() {\r\n return this.material.foamSettleDepth;\r\n }\r\n set foamSettleDepth(val: number) {\r\n this.material.foamSettleDepth = val;\r\n }\r\n /** Water depth in metres at and beyond which foam drifts freely. */\r\n get foamDriftDepth() {\r\n return this.material.foamDriftDepth;\r\n }\r\n set foamDriftDepth(val: number) {\r\n this.material.foamDriftDepth = val;\r\n }\r\n /** How fast foam settled in shallow water and on the sand fades, as a share of the foam's fade. */\r\n get settledFoamFade() {\r\n return this.material.settledFoamFade;\r\n }\r\n set settledFoamFade(val: number) {\r\n this.material.settledFoamFade = val;\r\n }\r\n /**\r\n * How the refracted view sample is located. Defaults to `march`.\r\n *\r\n * `offset` skips the depth-buffer search and displaces the screen UV by the\r\n * wave normal instead: cheaper, but submerged silhouettes smear. For hardware\r\n * that cannot afford the search.\r\n */\r\n get refractionMode() {\r\n return this.material.refractionMode;\r\n }\r\n set refractionMode(val: WaterRefractionMode) {\r\n this.material.refractionMode = val;\r\n }\r\n /**\r\n * Which intermediate shading term to display instead of the final colour.\r\n * A debugging aid; leave it at `none` in production. See\r\n * {@link WaterDebugOutput} for the available views.\r\n */\r\n get debugOutput() {\r\n return this.material.debugOutput;\r\n }\r\n set debugOutput(val: WaterDebugOutput) {\r\n this.material.debugOutput = val;\r\n }\r\n /**\r\n * Depth in meters the cheap refraction mode assumes the water is, used only\r\n * when {@link refractionMode} is `offset`.\r\n *\r\n * Sets how strong the cheap distortion looks. A constant, because an offset\r\n * scaled by the real depth paints a second copy of anything breaking the surface.\r\n */\r\n get cheapRefractionDepth() {\r\n return this.material.cheapRefractionDepth;\r\n }\r\n set cheapRefractionDepth(val: number) {\r\n this.material.cheapRefractionDepth = val;\r\n }\r\n /**\r\n * Scale on how much the medium blurs what is seen through it, 1 for the width\r\n * the scattering coefficient and the path length imply. 0 keeps the background\r\n * sharp at any depth.\r\n */\r\n get refractionBlur() {\r\n return this.material.refractionBlur;\r\n }\r\n set refractionBlur(val: number) {\r\n this.material.refractionBlur = val;\r\n }\r\n /** Absorption coefficient sigma_a in 1/m, per RGB channel. */\r\n get absorption() {\r\n return this.material.absorption;\r\n }\r\n set absorption(val: Vector3) {\r\n this.material.absorption = val;\r\n }\r\n /** Scale for the absorption coefficient. */\r\n get absorptionScale() {\r\n return this.material.absorptionScale;\r\n }\r\n set absorptionScale(val: number) {\r\n this.material.absorptionScale = val;\r\n }\r\n /** Scattering coefficient sigma_s in 1/m, per RGB channel. */\r\n get scattering() {\r\n return this.material.scattering;\r\n }\r\n set scattering(val: Vector3) {\r\n this.material.scattering = val;\r\n }\r\n /** Scale for the scattering coefficient. */\r\n get scatteringScale() {\r\n return this.material.scatteringScale;\r\n }\r\n set scatteringScale(val: number) {\r\n this.material.scatteringScale = val;\r\n }\r\n /**\r\n * Mean cosine of a single scattering event in the water, in `[0, 0.95]`.\r\n *\r\n * 0 scatters equally in all directions; higher brightens the water when\r\n * looking towards the sun through it.\r\n */\r\n get scatterAnisotropy() {\r\n return this.material.scatterAnisotropy;\r\n }\r\n set scatterAnisotropy(val: number) {\r\n this.material.scatterAnisotropy = val;\r\n }\r\n /**\r\n * Artistic scale on the refracted view offset. 1 is physical, 0 disables it.\r\n *\r\n * The offset comes from refracting the view ray by Snell's law and projecting\r\n * its hit point back to the screen; this only dials it for a stylised look.\r\n * Values above 1 exaggerate, and the medium tint may stop matching what is\r\n * visible through the water.\r\n */\r\n get refractionScale() {\r\n return this.material.refractionScale;\r\n }\r\n set refractionScale(val) {\r\n this.material.refractionScale = val;\r\n }\r\n /**\r\n * Scale on the Fresnel reflectance, 1 for the physical value.\r\n *\r\n * Below 1 the surface reflects less and shows more of what is beneath it. The\r\n * F0 floor is scaled with it, so 0 gives no specular response at all.\r\n */\r\n get reflectionStrength() {\r\n return this.material.reflectionStrength;\r\n }\r\n set reflectionStrength(val) {\r\n this.material.reflectionStrength = val;\r\n }\r\n /**\r\n * How much of a folded texel reads as foam.\r\n *\r\n * Scales the wave generator's fold measure into a coverage fraction. 0\r\n * disables foam.\r\n */\r\n get foamAmount() {\r\n return this.material.foamAmount;\r\n }\r\n set foamAmount(val: number) {\r\n this.material.foamAmount = val;\r\n }\r\n /**\r\n * Falloff applied to foam coverage before it is scaled.\r\n *\r\n * Above 1 this pushes light folding towards no foam, so only broken crests\r\n * show any.\r\n */\r\n get foamFalloff() {\r\n return this.material.foamFalloff;\r\n }\r\n set foamFalloff(val: number) {\r\n this.material.foamFalloff = val;\r\n }\r\n /** Diffuse albedo of the foam. */\r\n get foamColor() {\r\n return this.material.foamColor;\r\n }\r\n set foamColor(val: Vector3) {\r\n this.material.foamColor = val;\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number) {\r\n if (this.material.needUpdate()) {\r\n this.scene?.queueUpdateNode(this);\r\n if (this.hidden) {\r\n // Nothing shows the waves, the interaction or the foam: leave them be, and\r\n // pick the phase up from here once the water shows again\r\n this._lastUpdateTime = elapsedInSeconds;\r\n return;\r\n }\r\n if (this._timeStart === 0) {\r\n this._timeStart = elapsedInSeconds;\r\n }\r\n // Accumulate the scaled delta so a speed of zero freezes the phase in place.\r\n this._waveTime +=\r\n Math.max(0, elapsedInSeconds - Math.max(this._timeStart, this._lastUpdateTime)) *\r\n this._animationSpeed;\r\n this._lastUpdateTime = elapsedInSeconds;\r\n const interaction = this.material.interaction;\r\n if (interaction) {\r\n interaction.resolveNodes(this.scene);\r\n interaction.setWaterLevel(this.worldMatrix.m13);\r\n }\r\n this.material.update(frameId, this._waveTime);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.updatePerCamera} */\r\n updatePerCamera(camera: Camera, _elapsedInSeconds: number, _deltaInSeconds: number) {\r\n const mat = this._material.get();\r\n if (mat && this.hidden) {\r\n // Not drawn: no surface to gather, no shore or foam field to step\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n return;\r\n }\r\n if (mat) {\r\n const that = this;\r\n const infinite = mat.infinite;\r\n let viewDistance = 0;\r\n if (infinite) {\r\n viewDistance = this._viewDistance > 0 ? this._viewDistance : this.horizonDistance(camera);\r\n // The skirt's outer edge sits beyond the tessellated surface to hide its last ring.\r\n mat.setSkirtDistance(viewDistance * SKIRT_DISTANCE_FACTOR);\r\n }\r\n this._renderData = this._clipmap.gather({\r\n camera,\r\n // An unbounded surface is not clipped to the node's region.\r\n minMaxWorldPos: infinite ? WHOLE_DOMAIN : mat.region,\r\n gridScale: Math.max(0.01, this._gridScale),\r\n userData: this,\r\n frustumCulling: true,\r\n viewDistance: infinite ? viewDistance : undefined,\r\n skirt: infinite,\r\n calcAABB(userData: unknown, minX, maxX, minZ, maxZ, outAABB) {\r\n const p = that.worldMatrix.transformPointAffine(Vector3.zero());\r\n if (mat.waveGenerator) {\r\n mat.waveGenerator.calcClipmapTileAABB(minX, maxX, minZ, maxZ, p.y, outAABB);\r\n } else {\r\n outAABB.minPoint.setXYZ(minX, p.y, minZ);\r\n outAABB.maxPoint.setXYZ(maxX, p.y + 1, maxZ);\r\n }\r\n }\r\n });\r\n this.updateSubmergence(camera, mat);\r\n const interaction = mat.interaction;\r\n const wantsDepth = !!interaction && interaction.shallowDepth > 0;\r\n if ((mat.shoreWaveHeight > 0 || wantsDepth) && this.scene?.sdf.enabled) {\r\n // The interaction field and the shore waves read the waterline at the rest level\r\n this.scene.sdf.global?.waterline.request(this.worldMatrix.m13);\r\n }\r\n if (mat.shoreWaveHeight > 0) {\r\n // The waves and the beach's foam follow the terrain alone, in levels\r\n // out to the foam field's reach; the foam against walls, rocks and\r\n // piers the scene field's single level. Without a terrain the scene\r\n // field shapes the waves too.\r\n const terrainField = this.updateShoreField(camera);\r\n const waterline = this.scene?.sdf.enabled ? this.scene.sdf.global?.waterline : null;\r\n const wall = waterline?.ready ? waterline : null;\r\n const shore = terrainField?.ready ? terrainField : terrainField ? null : wall;\r\n mat.setShoreWaveFrame(\r\n shore?.smoothTexture ?? null,\r\n shore?.regions ?? NO_REGIONS,\r\n wall?.smoothTexture ?? null,\r\n wall?.region ?? NO_REGIONS[0],\r\n this.worldMatrix.m13\r\n );\r\n }\r\n if (interaction) {\r\n interaction.setBathymetry(wantsDepth ? this.findBathymetry() : null);\r\n }\r\n if (interaction && interaction.followMode === 'camera') {\r\n const focus = this.viewFocus(camera, interaction.windowSize * 0.5);\r\n interaction.setFocus(focus.x, focus.y);\r\n }\r\n // After the shore waves' frame, which the foam field's sources read\r\n const foamFocus = this.viewFocus(camera, mat.foamFieldSize * 0.5);\r\n RenderGraphExecutor.profileScope('WaterFoamField', () => mat.updateFoamField(foamFocus.x, foamFocus.y));\r\n this.scene?.queuePerCameraUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * Where the interaction field reads the depth of the water: the scene\r\n * field's waterline grid when there is one, else the first terrain's height\r\n * map, else nothing.\r\n * @internal\r\n */\r\n private findBathymetry(): Nullable<WaterBathymetry> {\r\n const level = this.worldMatrix.m13;\r\n const waterline = this.scene?.sdf.enabled ? this.scene.sdf.global?.waterline : null;\r\n if (waterline?.ready && waterline.texture) {\r\n const r = waterline.region;\r\n return {\r\n kind: 'field',\r\n texture: waterline.texture,\r\n region: [r.x, r.y, r.z * r.w, r.z * r.w],\r\n level\r\n };\r\n }\r\n let terrain = this.findTerrain();\r\n const heightMap = terrain?.heightMap;\r\n if (!terrain || !heightMap) {\r\n return null;\r\n }\r\n const region = terrain.worldRegion;\r\n return {\r\n kind: 'height',\r\n texture: heightMap,\r\n region: [region.x, region.y, region.z - region.x, region.w - region.y],\r\n level,\r\n heightScale: Math.abs(terrain.scale.y),\r\n heightOffset: terrain.worldMatrix.m13\r\n };\r\n }\r\n /** The first terrain in the scene, cached while it stays in it. @internal */\r\n private findTerrain(): Nullable<ClipmapTerrain> {\r\n let terrain =\r\n this._bathyTerrain?.attached && this._bathyTerrain.scene === this.scene ? this._bathyTerrain : null;\r\n if (!terrain && this.scene) {\r\n this.scene.rootNode.iterate((node) => {\r\n if (node.isClipmapTerrain()) {\r\n terrain = node;\r\n return true;\r\n }\r\n return false;\r\n });\r\n this._bathyTerrain = terrain;\r\n }\r\n return terrain;\r\n }\r\n /**\r\n * Rebuilds the shore field, the waterline of the terrain alone in levels\r\n * around the camera, which the shore waves read, and returns it. Null\r\n * without a terrain or off WebGPU.\r\n * @internal\r\n */\r\n private updateShoreField(camera: Camera): Nullable<WaterlineField> {\r\n const terrain = this.findTerrain();\r\n const device = getDevice();\r\n if (!terrain?.heightMap || device.type !== 'webgpu') {\r\n return null;\r\n }\r\n if (!this._shoreField) {\r\n this._shoreSource = new TerrainWaterlineSource();\r\n this._shoreField = new WaterlineField(this._shoreSource, {\r\n levels: SHORE_FIELD_LEVELS,\r\n resolution: SHORE_FIELD_CELLS,\r\n cellSize: SHORE_FIELD_CELL_SIZE,\r\n maxRebuilds: SHORE_FIELD_REBUILDS\r\n });\r\n }\r\n this._shoreSource!.setTerrain(terrain);\r\n this._shoreField.request(this.worldMatrix.m13);\r\n device.pushDeviceStates();\r\n try {\r\n RenderGraphExecutor.profileScope('WaterShoreField', () =>\r\n this._shoreField!.update(camera.getWorldPosition())\r\n );\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n return this._shoreField;\r\n }\r\n /** @internal */\r\n private _shoreSource: Nullable<TerrainWaterlineSource> = null;\r\n /** @internal */\r\n private _shoreField: Nullable<WaterlineField> = null;\r\n /** @internal */\r\n private _bathyTerrain: Nullable<ClipmapTerrain> = null;\r\n /**\r\n * Decide whether `camera` is inside this body of water and publish the result.\r\n *\r\n * Run from `updatePerCamera`, which runs every frame regardless of culling, so\r\n * the state survives the surface leaving the frustum.\r\n *\r\n * The test is against the rest plane rather than the displaced surface, which\r\n * would need a GPU readback. A dead band of\r\n * {@link WaterMaterial.underwaterHysteresis} around the plane keeps an eye at\r\n * water level from flipping state every frame.\r\n * @internal\r\n */\r\n private updateSubmergence(camera: Camera, mat: WaterMaterial) {\r\n const surfaceY = this.worldMatrix.transformPointAffine(Vector3.zero()).y;\r\n let submerged = false;\r\n if (!this.hidden && this.attached) {\r\n const camPos = camera.getWorldPosition();\r\n const region = mat.region;\r\n // A bounded surface is only entered from within its own footprint.\r\n const inside =\r\n mat.infinite ||\r\n (camPos.x >= region.x && camPos.x <= region.z && camPos.z >= region.y && camPos.z <= region.w);\r\n if (inside) {\r\n const band = mat.underwaterHysteresis;\r\n submerged = this._submerged.get(camera) ? camPos.y < surfaceY + band : camPos.y < surfaceY - band;\r\n }\r\n }\r\n this._submerged.set(camera, submerged);\r\n setWaterSubmergence(camera, this, submerged, surfaceY);\r\n }\r\n /**\r\n * The water the camera is looking at, on which a window that follows the\r\n * view (the interaction field, the foam field) is centred.\r\n *\r\n * Where the view direction meets the rest plane, no further ahead than\r\n * `reach` (half a window), so the window covers the visible water rather\r\n * than putting it in the sponge band at its edge.\r\n * @internal\r\n */\r\n private viewFocus(camera: Camera, reach: number) {\r\n const camPos = camera.getWorldPosition();\r\n const m = camera.worldMatrix;\r\n // The camera looks down its local -Z.\r\n const fx = -m.m02;\r\n const fy = -m.m12;\r\n const fz = -m.m22;\r\n const horizontal = Math.hypot(fx, fz);\r\n let ahead = reach;\r\n if (fy < -1e-4) {\r\n const t = (this.worldMatrix.m13 - camPos.y) / fy;\r\n if (t > 0) {\r\n ahead = Math.min(reach, t * horizontal);\r\n }\r\n }\r\n if (horizontal < 1e-6) {\r\n return new Vector2(camPos.x, camPos.z);\r\n }\r\n return new Vector2(camPos.x + (fx / horizontal) * ahead, camPos.z + (fz / horizontal) * ahead);\r\n }\r\n /**\r\n * Distance to the true horizon for the camera's height above this water, in\r\n * meters.\r\n *\r\n * `sqrt(2 * R * h)` for earth's radius: about 5km from an eye 2m up, 25km\r\n * from 50m.\r\n * @internal\r\n */\r\n private horizonDistance(camera: Camera) {\r\n const camPos = camera.getWorldPosition();\r\n const waterLevel = this.worldMatrix.transformPointAffine(Vector3.zero()).y;\r\n // Floored for cameras at or below the surface.\r\n const height = Math.max(camPos.y - waterLevel, MIN_HORIZON_EYE_HEIGHT);\r\n return Math.sqrt(2 * EARTH_RADIUS * height);\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n getSkinInfluenceData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isWater}\r\n */\r\n isWater(): this is Water {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeBoundingVolume}\r\n */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.computeWorldBoundingVolume}\r\n */\r\n computeWorldBoundingVolume() {\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const mat = this._material?.get();\r\n if (mat) {\r\n // Null keeps an unbounded surface in the queue (ClipState.CLIPPED) and\r\n // leaves culling to the clipmap's per-tile test.\r\n if (mat.infinite) {\r\n return null;\r\n }\r\n const boundingBox = new BoundingBox();\r\n if (mat.waveGenerator) {\r\n mat.waveGenerator.calcClipmapTileAABB(\r\n mat.region.x,\r\n mat.region.z,\r\n mat.region.y,\r\n mat.region.w,\r\n p.y,\r\n boundingBox\r\n );\r\n } else {\r\n boundingBox.minPoint.setXYZ(mat.region.x, p.y, mat.region.y);\r\n boundingBox.maxPoint.setXYZ(mat.region.z, p.y + 1, mat.region.w);\r\n }\r\n return boundingBox;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Grid scale\r\n */\r\n get gridScale() {\r\n return this._gridScale;\r\n }\r\n set gridScale(val) {\r\n this._gridScale = val;\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n outMatrix.translation(this._position);\r\n }\r\n calculateWorldTransform(outMatrix: Matrix4x4) {\r\n outMatrix.set(this.localMatrix);\r\n if (this.parent) {\r\n outMatrix.m03 += this.parent.worldMatrix.m03;\r\n outMatrix.m13 += this.parent.worldMatrix.m13;\r\n outMatrix.m23 += this.parent.worldMatrix.m23;\r\n }\r\n }\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n const material = this._material?.get();\r\n if (material) {\r\n const x = Math.abs(this.scale.x);\r\n const z = Math.abs(this.scale.z);\r\n const px = this.position.x;\r\n const pz = this.position.z;\r\n material.region = new Vector4(px - x, pz - z, px + x, pz + z);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const mat = this._material?.get();\r\n if (mat) {\r\n this.bind(ctx, renderQueue);\r\n mat.setClipmapGridInfo(\r\n this._gridScale,\r\n this.worldMatrix.m03,\r\n this.worldMatrix.m23,\r\n this._clipmap.tileResolution\r\n );\r\n mat.apply(ctx);\r\n for (const info of this._renderData!) {\r\n mat.draw(info.primitive, ctx, info.numInstances);\r\n }\r\n }\r\n }\r\n /**\r\n * Retrieve the disturbed world position and normal at water surface.\r\n * Set includeDisturbers to false for buoyancy: retain ambient waves and\r\n * external impulses, but exclude waves generated by moving disturbers.\r\n */\r\n async getSurfacePoint(\r\n points: Vector3[],\r\n outPos?: Vector3[],\r\n outNorm?: Vector3[],\r\n includeDisturbers = true\r\n ) {\r\n if (!outPos && !outNorm) {\r\n return;\r\n }\r\n const hits = await this._evaluateSurfacePoints(points, !!outNorm, includeDisturbers);\r\n if (!hits) {\r\n return;\r\n }\r\n for (let i = 0; i < points.length; i++) {\r\n outPos && outPos[i].setXYZ(hits[i].x, hits[i].y, hits[i].z);\r\n outNorm && outNorm[i].setXYZ(hits[i].nx, hits[i].ny, hits[i].nz);\r\n }\r\n }\r\n /**\r\n * Evaluate the disturbed surface over a set of world XZ positions.\r\n *\r\n * Evaluated by the same wave generator the material draws with, so it is\r\n * exact by construction. Costs one point-list draw plus one readback per call.\r\n * Requests are serialized because the vertex buffer and render target are\r\n * shared.\r\n *\r\n * @param points - World XZ positions to evaluate. Y is ignored.\r\n * @param withNormal - Whether to also read the surface normal back, which\r\n * costs a second readback of the same size.\r\n * @returns One hit per input point, or null if `points` was empty.\r\n * @internal\r\n */\r\n private async _evaluateSurfacePoints(\r\n points: Vector3[],\r\n withNormal: boolean,\r\n includeDisturbers = true\r\n ): Promise<Nullable<SurfacePointHit[]>> {\r\n const device = getDevice();\r\n if (!points || points.length === 0) {\r\n return null;\r\n }\r\n points = points.map((v) => v.clone());\r\n const timing = { issued: device.frameInfo.frameCounter, recorded: 0, mapped: 0 };\r\n // Take and replace the queue's tail in one synchronous step before awaiting,\r\n // so two callers arriving together cannot both pass the same settled tail.\r\n const previous = this._feedbackQueue;\r\n let release: () => void = () => {};\r\n this._feedbackQueue = new Promise<void>((resolve) => (release = resolve));\r\n await previous;\r\n const hits: SurfacePointHit[] = points.map(() => ({\r\n x: 0,\r\n y: 0,\r\n z: 0,\r\n nx: 0,\r\n ny: 1,\r\n nz: 0\r\n }));\r\n try {\r\n await device.runNextFrameAsync(async () => {\r\n timing.recorded = device.frameInfo.frameCounter;\r\n const renderedGenerator = this.material.waveGenerator;\r\n const waveGenerator =\r\n !includeDisturbers && renderedGenerator instanceof InteractiveWaveGenerator\r\n ? new InteractiveWaveGenerator(renderedGenerator.base, renderedGenerator.interaction, false)\r\n : renderedGenerator;\r\n const feedbackHash = waveGenerator?.getHash() ?? '';\r\n if (this._feedbackProgram.get() && this._feedbackHash !== feedbackHash) {\r\n // The wave generator changed; rebuild the program for it.\r\n this._feedbackBindGroup.dispose();\r\n this._feedbackProgram.dispose();\r\n }\r\n if (!this._feedbackProgram.get()) {\r\n this._feedbackHash = feedbackHash;\r\n this._feedbackProgram.set(this._createFeedbackProgram(device, waveGenerator));\r\n this._feedbackBindGroup.set(\r\n device.createBindGroup(this._feedbackProgram.get()!.bindGroupLayouts[0])\r\n );\r\n }\r\n if (!this._feedbackPrimitive.get()) {\r\n this._feedbackPrimitive.set(new Primitive());\r\n this._feedbackPrimitive.get()!.primitiveType = 'point-list';\r\n }\r\n if (!this._feedbackRenderStates) {\r\n this._feedbackRenderStates = device.createRenderStateSet();\r\n this._feedbackRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._feedbackRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n const primitive = this._feedbackPrimitive.get()!;\r\n const vertices = new Float32Array(points.length * 4);\r\n // The generators displace from the still-water level, so it replaces the caller's Y.\r\n const level = this.worldMatrix.m13;\r\n for (let i = 0; i < points.length; i++) {\r\n vertices[i * 4 + 0] = points[i].x;\r\n vertices[i * 4 + 1] = level;\r\n vertices[i * 4 + 2] = points[i].z;\r\n vertices[i * 4 + 3] = i;\r\n }\r\n let vb = primitive.getVertexBuffer('position');\r\n if (!vb || vb.byteLength !== vertices.byteLength) {\r\n vb = device.createVertexBuffer('position_f32x4', vertices, { dynamic: true })!;\r\n primitive.setVertexBuffer(vb);\r\n } else {\r\n vb.bufferSubData(0, vertices);\r\n }\r\n const fb = this._feedbackRenderTarget.get();\r\n if (!fb || fb.getColorAttachment(0).width < points.length) {\r\n const rt0 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n const rt1 = device.createTexture2D('rgba32f', points.length, 1, {\r\n mipmapping: false\r\n })!;\r\n if (fb) {\r\n fb.getColorAttachment(0).dispose();\r\n fb.getColorAttachment(1).dispose();\r\n this._feedbackRenderTarget.dispose();\r\n }\r\n this._feedbackRenderTarget.set(device.createFrameBuffer([rt0, rt1], null));\r\n }\r\n primitive.indexCount = points.length;\r\n const bindGroup = this._feedbackBindGroup.get()!;\r\n bindGroup.setValue('textureWidth', this._feedbackRenderTarget.get()!.getWidth());\r\n if (waveGenerator) {\r\n waveGenerator.applyWaterBindGroup(bindGroup);\r\n ShaderHelper.setStandaloneCameraTime(bindGroup);\r\n }\r\n device.pushDeviceStates();\r\n device.setProgram(this._feedbackProgram.get());\r\n device.setBindGroup(0, this._feedbackBindGroup.get()!);\r\n device.setFramebuffer(this._feedbackRenderTarget.get());\r\n this._feedbackPrimitive.get()!.draw();\r\n device.popDeviceStates();\r\n const pos = new Float32Array(points.length * 4);\r\n // The normal attachment is only read when wanted, halving the readback otherwise.\r\n const norm = withNormal ? new Float32Array(points.length * 4) : null;\r\n // readPixels records its copy synchronously; flushing right after lets the\r\n // readback start before this frame's main render is recorded. This runs from\r\n // beginFrame, so the submit carries only the feedback work.\r\n const readPos = this._feedbackRenderTarget\r\n .get()!\r\n .getColorAttachment(0)\r\n .readPixels(0, 0, points.length, 1, 0, 0, pos);\r\n const readNorm = norm\r\n ? this._feedbackRenderTarget\r\n .get()!\r\n .getColorAttachment(1)\r\n .readPixels(0, 0, points.length, 1, 0, 0, norm)\r\n : Promise.resolve();\r\n device.flush();\r\n await Promise.all([readPos, readNorm]);\r\n timing.mapped = device.frameInfo.frameCounter;\r\n this.lastFeedbackTiming = timing;\r\n for (let i = 0; i < points.length; i++) {\r\n hits[i].x = pos[i * 4 + 0];\r\n hits[i].y = pos[i * 4 + 1];\r\n hits[i].z = pos[i * 4 + 2];\r\n if (norm) {\r\n hits[i].nx = norm[i * 4 + 0];\r\n hits[i].ny = norm[i * 4 + 1];\r\n hits[i].nz = norm[i * 4 + 2];\r\n }\r\n }\r\n });\r\n } finally {\r\n release();\r\n }\r\n return hits;\r\n }\r\n /** @internal */\r\n private _createFeedbackProgram(device: AbstractDevice, waveGenerator: Nullable<WaveGenerator>) {\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.position = pb.vec4().attrib('position');\r\n this.textureWidth = pb.float().uniform(0);\r\n if (waveGenerator) {\r\n waveGenerator.setupUniforms(this, 0);\r\n // Wave generators animate from camera.elapsedTime, declared standalone here\r\n ShaderHelper.declareStandaloneCameraTime(this, 0);\r\n }\r\n pb.main(function () {\r\n if (waveGenerator) {\r\n this.$l.worldPos = pb.vec3();\r\n this.$l.worldNorm = pb.vec3();\r\n waveGenerator.calcVertexPositionAndNormal(\r\n this,\r\n this.$inputs.position.xyz,\r\n this.worldPos,\r\n this.worldNorm\r\n );\r\n } else {\r\n this.$l.worldPos = this.$inputs.position.xyz;\r\n this.$l.worldNorm = pb.vec3(0, 1, 0);\r\n }\r\n this.$outputs.worldPos = this.worldPos;\r\n this.$outputs.worldNorm = this.worldNorm;\r\n this.$outputs.xz = this.$inputs.position.xz;\r\n this.$l.ndcX = pb.sub(\r\n pb.mul(pb.div(pb.add(this.$inputs.position.w, 0.5), this.textureWidth), 2),\r\n 1\r\n );\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$l.$builtins.position = pb.vec4(this.ndcX, 0, 0, 1);\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.worldPos = pb.vec4();\r\n this.$outputs.worldNorm = pb.vec4();\r\n if (waveGenerator) {\r\n waveGenerator.setupUniforms(this, 0);\r\n ShaderHelper.declareStandaloneCameraTime(this, 0);\r\n }\r\n pb.main(function () {\r\n this.$outputs.worldPos = pb.vec4(this.$inputs.worldPos, 1);\r\n this.$outputs.worldNorm = waveGenerator\r\n ? pb.vec4(waveGenerator.calcFragmentNormal(this, this.$inputs.xz, this.$inputs.worldNorm), 1)\r\n : pb.vec4(0, 1, 0, 1);\r\n });\r\n }\r\n })!;\r\n program.name = '@Water_Feedback';\r\n return program;\r\n }\r\n}\r\n"],"names":["EARTH_RADIUS","MIN_HORIZON_EYE_HEIGHT","SKIRT_DISTANCE_FACTOR","WHOLE_DOMAIN","Vector4","SHORE_FIELD_LEVELS","SHORE_FIELD_CELLS","SHORE_FIELD_CELL_SIZE","SHORE_FIELD_REBUILDS","NO_REGIONS","Water","applyMixins","GraphNode","mixinDrawable","_pickTarget","_clipmap","_renderData","_gridScale","_viewDistance","_animationSpeed","_timeStart","_feedbackProgram","_feedbackBindGroup","_feedbackPrimitive","_feedbackRenderTarget","_feedbackRenderStates","lastFeedbackTiming","issued","recorded","mapped","_material","scene","node","Clipmap","_waveTime","_lastUpdateTime","DRef","WaterMaterial","get","region","TAAStrength","waveGenerator","FBMWaveGenerator","_feedbackHash","_feedbackQueue","Promise","resolve","_submerged","WeakMap","queuePerCameraUpdateNode","onDispose","dispose","_shoreField","_shoreSource","getColorAttachment","wireframe","val","material","baseWaveGenerator","needUpdate","queueUpdateNode","interaction","infinite","invalidateWorldBoundingVolume","viewDistance","Math","max","animationSpeed","waveTime","causticsEnabled","causticsIntensity","causticsDepth","causticsSceneDepth","causticsRange","causticsFadeDistance","causticsWarp","causticsMinDepth","underwaterEnabled","underwaterAmbientIntensity","underwaterGodRays","underwaterGodRayIntensity","underwaterGodRaySteps","underwaterGodRayShadow","underwaterHysteresis","subsurfaceIntensity","subsurfaceCrestHeight","subsurfaceTint","sunScatteringIntensity","shoreWaveHeight","edgeFadeWidth","shoreWaveLength","shoreWavePeriod","shoreWaveZone","shoreWaveSharpness","shoreWaveLean","shoreWaveIrregularity","foamFadeRate","foamTrailStrength","foamDrift","foamFieldSize","shoreWaveFoamStrength","shoreWaveFoamCoverage","shoreWaveShallowFoamDepth","shoreWaveShallowFoamStrength","wallFoamStrength","wallFoamMinSpeed","wallFoamMaxSpeed","wallFoamDrift","surfFoamDuration","foamSettleDepth","foamDriftDepth","settledFoamFade","refractionMode","debugOutput","cheapRefractionDepth","refractionBlur","absorption","absorptionScale","scattering","scatteringScale","scatterAnisotropy","refractionScale","reflectionStrength","foamAmount","foamFalloff","foamColor","update","frameId","elapsedInSeconds","hidden","resolveNodes","setWaterLevel","worldMatrix","m13","updatePerCamera","camera","_elapsedInSeconds","_deltaInSeconds","mat","that","horizonDistance","setSkirtDistance","gather","minMaxWorldPos","gridScale","userData","frustumCulling","undefined","skirt","calcAABB","minX","maxX","minZ","maxZ","outAABB","p","transformPointAffine","Vector3","zero","calcClipmapTileAABB","y","minPoint","setXYZ","maxPoint","updateSubmergence","wantsDepth","shallowDepth","sdf","enabled","global","waterline","request","terrainField","updateShoreField","wall","ready","shore","setShoreWaveFrame","smoothTexture","regions","setBathymetry","findBathymetry","followMode","focus","viewFocus","windowSize","setFocus","x","foamFocus","RenderGraphExecutor","profileScope","updateFoamField","level","texture","r","kind","z","w","terrain","findTerrain","heightMap","worldRegion","heightScale","abs","scale","heightOffset","_bathyTerrain","attached","rootNode","iterate","isClipmapTerrain","device","getDevice","type","TerrainWaterlineSource","WaterlineField","levels","resolution","cellSize","maxRebuilds","setTerrain","pushDeviceStates","getWorldPosition","popDeviceStates","surfaceY","submerged","camPos","inside","band","set","setWaterSubmergence","reach","m","fx","m02","fy","m12","fz","m22","horizontal","hypot","ahead","t","min","Vector2","waterLevel","height","sqrt","getPickTarget","getMorphData","getSkinInfluenceData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isWater","computeBoundingVolume","computeWorldBoundingVolume","boundingBox","BoundingBox","calculateLocalTransform","outMatrix","translation","_position","calculateWorldTransform","localMatrix","parent","m03","m23","_onTransformChanged","invalidateLocal","px","position","pz","draw","ctx","renderQueue","bind","setClipmapGridInfo","tileResolution","apply","info","primitive","numInstances","getSurfacePoint","points","outPos","outNorm","includeDisturbers","hits","_evaluateSurfacePoints","i","length","nx","ny","nz","withNormal","map","v","clone","timing","frameInfo","frameCounter","previous","release","runNextFrameAsync","renderedGenerator","InteractiveWaveGenerator","base","feedbackHash","getHash","_createFeedbackProgram","createBindGroup","bindGroupLayouts","Primitive","primitiveType","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","vertices","Float32Array","vb","getVertexBuffer","byteLength","createVertexBuffer","dynamic","setVertexBuffer","bufferSubData","fb","width","rt0","createTexture2D","mipmapping","rt1","createFrameBuffer","indexCount","bindGroup","setValue","getWidth","applyWaterBindGroup","ShaderHelper","setStandaloneCameraTime","setProgram","setBindGroup","setFramebuffer","pos","norm","readPos","readPixels","readNorm","flush","all","program","buildRenderProgram","vertex","pb","$inputs","vec4","attrib","textureWidth","float","uniform","setupUniforms","declareStandaloneCameraTime","main","$l","worldPos","vec3","worldNorm","calcVertexPositionAndNormal","xyz","$outputs","xz","ndcX","sub","mul","div","add","$builtins","pointSize","fragment","calcFragmentNormal","name"],"mappings":"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"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { Vector3 } from '@zephyr3d/base';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Height queries against a water surface, driven by the material's own
|
|
5
|
+
* evaluation of it.
|
|
6
|
+
*
|
|
7
|
+
* {@link Water.getSurfacePoint} evaluates the GPU displacement itself, so the
|
|
8
|
+
* result is exact by construction rather than a CPU re-implementation of the
|
|
9
|
+
* waves. By default it includes ambient waves and external interaction
|
|
10
|
+
* impulses, but excludes disturber wakes to prevent buoyancy feeding itself.
|
|
11
|
+
* Set includeDisturbers for queries that need the complete rendered surface.
|
|
12
|
+
* Each batch costs one point-list draw and one readback, so queries are
|
|
13
|
+
* batched and throttled rather than issued per call.
|
|
14
|
+
*
|
|
15
|
+
* The queries are placed on a fixed lattice at construction; the whole set
|
|
16
|
+
* costs one draw and one readback and the answer is interpolated across the
|
|
17
|
+
* lattice on demand. Moving positions (a hull's footprint, say) ride along
|
|
18
|
+
* through {@link addExtraPoints}.
|
|
19
|
+
*
|
|
20
|
+
* ## The motion
|
|
21
|
+
*
|
|
22
|
+
* The reported height eases exponentially towards the newest measurement; the
|
|
23
|
+
* query lag is not compensated. A rigid body should read
|
|
24
|
+
* {@link sampleWorldYRaw} instead and supply its own inertia.
|
|
25
|
+
*
|
|
26
|
+
* Consequences a caller has to accept:
|
|
27
|
+
* - Resolution is the lattice spacing. A grid at `h` metres resolves nothing
|
|
28
|
+
* shorter than about `2 * h`.
|
|
29
|
+
* - A probe outside the lattice is answered by the nearest cell rather than by
|
|
30
|
+
* a wrapped one; this is a window on the water, not a repeating field.
|
|
31
|
+
* - Nothing is known until the first batch lands; until then queries return
|
|
32
|
+
* the still-water level.
|
|
33
|
+
*
|
|
34
|
+
* @public
|
|
35
|
+
*/ class WaterSurfaceSampler {
|
|
36
|
+
_water;
|
|
37
|
+
_includeDisturbers;
|
|
38
|
+
_spacing;
|
|
39
|
+
_cols;
|
|
40
|
+
_rows;
|
|
41
|
+
_updateHz;
|
|
42
|
+
_timeConstant;
|
|
43
|
+
_pending;
|
|
44
|
+
_elapsed;
|
|
45
|
+
_waveTime;
|
|
46
|
+
_readCount;
|
|
47
|
+
_failCount;
|
|
48
|
+
_totalPoints;
|
|
49
|
+
_pendingSince;
|
|
50
|
+
_lastLatency;
|
|
51
|
+
_batchFrames;
|
|
52
|
+
_framesSinceLastBatch;
|
|
53
|
+
_originX;
|
|
54
|
+
_originZ;
|
|
55
|
+
_inputs;
|
|
56
|
+
_outPos;
|
|
57
|
+
_extraListeners;
|
|
58
|
+
_batchInputs;
|
|
59
|
+
_batchOutputs;
|
|
60
|
+
_extrasDirty;
|
|
61
|
+
/** Heights the queries read; null until the first batch. */ _height;
|
|
62
|
+
/** Where the newest measurement put the surface. */ _target;
|
|
63
|
+
/**
|
|
64
|
+
* Creates a sampler over a body of water.
|
|
65
|
+
* @param water - The water to sample.
|
|
66
|
+
* @param options - Lattice and rate options.
|
|
67
|
+
*/ constructor(water, options = {}){
|
|
68
|
+
this._water = water;
|
|
69
|
+
this._includeDisturbers = options.includeDisturbers ?? false;
|
|
70
|
+
this._spacing = Math.max(0.01, options.spacing ?? 6);
|
|
71
|
+
this._cols = Math.max(2, Math.floor(options.cols ?? 24));
|
|
72
|
+
this._rows = Math.max(2, Math.floor(options.rows ?? 24));
|
|
73
|
+
this._updateHz = Math.max(0.1, options.updateHz ?? 30);
|
|
74
|
+
this._timeConstant = Math.max(0.001, options.timeConstant ?? 0.25);
|
|
75
|
+
this._pending = false;
|
|
76
|
+
this._elapsed = 0;
|
|
77
|
+
this._waveTime = 0;
|
|
78
|
+
this._readCount = 0;
|
|
79
|
+
this._failCount = 0;
|
|
80
|
+
this._totalPoints = 0;
|
|
81
|
+
this._pendingSince = 0;
|
|
82
|
+
this._lastLatency = 0;
|
|
83
|
+
this._batchFrames = 0;
|
|
84
|
+
this._framesSinceLastBatch = 0;
|
|
85
|
+
// The lattice is anchored on the water's origin, in world space.
|
|
86
|
+
const ox = water.worldMatrix.m03;
|
|
87
|
+
const oz = water.worldMatrix.m23;
|
|
88
|
+
this._originX = ox - (this._cols - 1) / 2 * this._spacing;
|
|
89
|
+
this._originZ = oz - (this._rows - 1) / 2 * this._spacing;
|
|
90
|
+
const count = this._cols * this._rows;
|
|
91
|
+
this._inputs = new Array(count);
|
|
92
|
+
this._outPos = new Array(count);
|
|
93
|
+
for(let j = 0; j < this._rows; j++){
|
|
94
|
+
for(let i = 0; i < this._cols; i++){
|
|
95
|
+
const k = j * this._cols + i;
|
|
96
|
+
this._inputs[k] = new Vector3(this._originX + i * this._spacing, 0, this._originZ + j * this._spacing);
|
|
97
|
+
this._outPos[k] = new Vector3();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this._extraListeners = [];
|
|
101
|
+
this._batchInputs = this._inputs;
|
|
102
|
+
this._batchOutputs = this._outPos;
|
|
103
|
+
this._extrasDirty = false;
|
|
104
|
+
this._height = null;
|
|
105
|
+
this._target = null;
|
|
106
|
+
}
|
|
107
|
+
/** Water clock of the newest accepted batch, in seconds. */ get waveTime() {
|
|
108
|
+
return this._waveTime;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Upper bound on the query rate in hertz.
|
|
112
|
+
*
|
|
113
|
+
* A ceiling, not a schedule: the achieved rate is also limited by batch cost.
|
|
114
|
+
*/ get updateHz() {
|
|
115
|
+
return this._updateHz;
|
|
116
|
+
}
|
|
117
|
+
set updateHz(val) {
|
|
118
|
+
this._updateHz = Math.max(0.1, val);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Seconds for the reported height to close most of the gap to a new
|
|
122
|
+
* measurement. Independent of frame rate.
|
|
123
|
+
*/ get timeConstant() {
|
|
124
|
+
return this._timeConstant;
|
|
125
|
+
}
|
|
126
|
+
set timeConstant(val) {
|
|
127
|
+
this._timeConstant = Math.max(0.001, val);
|
|
128
|
+
}
|
|
129
|
+
/** Batches completed since construction. */ get readCount() {
|
|
130
|
+
return this._readCount;
|
|
131
|
+
}
|
|
132
|
+
/** Batches that failed. */ get failCount() {
|
|
133
|
+
return this._failCount;
|
|
134
|
+
}
|
|
135
|
+
/** True while a batch is in flight. */ get pending() {
|
|
136
|
+
return this._pending;
|
|
137
|
+
}
|
|
138
|
+
/** Seconds the batch in flight has been outstanding, or 0 when none is. */ get pendingSeconds() {
|
|
139
|
+
return this._pending ? this._pendingSince : 0;
|
|
140
|
+
}
|
|
141
|
+
/** Batch latency in seconds, as of the last one that landed. */ get lastLatency() {
|
|
142
|
+
return this._lastLatency;
|
|
143
|
+
}
|
|
144
|
+
/** Frames the newest batch took to come back. */ get batchFrames() {
|
|
145
|
+
return this._batchFrames;
|
|
146
|
+
}
|
|
147
|
+
/** Points evaluated per batch, the cost driver of this sampler. */ get batchSize() {
|
|
148
|
+
return this._totalPoints;
|
|
149
|
+
}
|
|
150
|
+
/** True once a batch has landed and queries return surface heights. */ get ready() {
|
|
151
|
+
return !!this._height;
|
|
152
|
+
}
|
|
153
|
+
/** World metres between lattice samples. */ get spacing() {
|
|
154
|
+
return this._spacing;
|
|
155
|
+
}
|
|
156
|
+
/** World Y of the still-water level. */ get waterLevel() {
|
|
157
|
+
return this._water.worldMatrix.m13;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Register world positions to evaluate alongside the lattice, every batch.
|
|
161
|
+
*
|
|
162
|
+
* The array is held by reference and read when a batch is issued, so a
|
|
163
|
+
* caller updates the vectors in place each frame and the next batch picks
|
|
164
|
+
* them up. The listener receives the surface positions for those inputs when
|
|
165
|
+
* the batch lands, in the same order.
|
|
166
|
+
*
|
|
167
|
+
* @param inputs - World positions; only X and Z are used.
|
|
168
|
+
* @param onResult - Called per batch with the surface positions.
|
|
169
|
+
* @returns A function that unregisters the points.
|
|
170
|
+
*/ addExtraPoints(inputs, onResult) {
|
|
171
|
+
const outputs = inputs.map(()=>new Vector3());
|
|
172
|
+
const entry = {
|
|
173
|
+
inputs,
|
|
174
|
+
outputs,
|
|
175
|
+
onResult
|
|
176
|
+
};
|
|
177
|
+
this._extraListeners.push(entry);
|
|
178
|
+
this._extrasDirty = true;
|
|
179
|
+
return ()=>{
|
|
180
|
+
const i = this._extraListeners.indexOf(entry);
|
|
181
|
+
if (i >= 0) {
|
|
182
|
+
this._extraListeners.splice(i, 1);
|
|
183
|
+
this._extrasDirty = true;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Advance the sampler. Call once per frame with the frame's delta.
|
|
189
|
+
* @param deltaSeconds - Frame delta in seconds.
|
|
190
|
+
*/ update(deltaSeconds) {
|
|
191
|
+
this._framesSinceLastBatch++;
|
|
192
|
+
// Ease once a frame so every query in a frame sees the same value; exact
|
|
193
|
+
// exponential decay keeps the result independent of frame size.
|
|
194
|
+
if (this._height && this._target) {
|
|
195
|
+
const k = 1 - Math.exp(-deltaSeconds / this._timeConstant);
|
|
196
|
+
const height = this._height;
|
|
197
|
+
const target = this._target;
|
|
198
|
+
for(let i = 0; i < height.length; i++){
|
|
199
|
+
height[i] += (target[i] - height[i]) * k;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (this._pending) {
|
|
203
|
+
this._pendingSince += deltaSeconds;
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
this._elapsed += deltaSeconds;
|
|
207
|
+
// Fire as soon as the previous batch has landed, capped at `updateHz`.
|
|
208
|
+
if (this._elapsed >= 1 / this._updateHz) {
|
|
209
|
+
this._elapsed = 0;
|
|
210
|
+
this._pending = true;
|
|
211
|
+
this._pendingSince = 0;
|
|
212
|
+
this._rebuildBatchArrays();
|
|
213
|
+
this._totalPoints = this._batchInputs.length;
|
|
214
|
+
// Only positions: the normal attachment would double the readback.
|
|
215
|
+
this._water.getSurfacePoint(this._batchInputs, this._batchOutputs, undefined, this._includeDisturbers).then(()=>this._acceptBatch()).catch((err)=>{
|
|
216
|
+
this._pending = false;
|
|
217
|
+
this._pendingSince = 0;
|
|
218
|
+
this._failCount++;
|
|
219
|
+
console.error('WaterSurfaceSampler: surface query failed', err);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Surface world Y at a world XZ, eased.
|
|
225
|
+
*
|
|
226
|
+
* Bilinear over the lattice, clamped at the edges. A pure lookup of the table
|
|
227
|
+
* advanced by {@link update}. For objects placed directly at the height,
|
|
228
|
+
* without inertia of their own.
|
|
229
|
+
*/ sampleWorldY(x, z) {
|
|
230
|
+
return this._sampleTable(this._height, x, z);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Surface world Y at a world XZ, from the newest measurement with no easing.
|
|
234
|
+
*
|
|
235
|
+
* For a rigid body, which would otherwise get the easing lag on top of the
|
|
236
|
+
* query lag.
|
|
237
|
+
*/ sampleWorldYRaw(x, z) {
|
|
238
|
+
return this._sampleTable(this._target, x, z);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Surface normal from the eased lattice, by central differences one cell
|
|
242
|
+
* apart.
|
|
243
|
+
* @param out - Destination, or a new vector.
|
|
244
|
+
* @returns Unit normal, Y up.
|
|
245
|
+
*/ sampleNormal(x, z, out) {
|
|
246
|
+
const h = this._spacing;
|
|
247
|
+
const dx = this.sampleWorldY(x + h, z) - this.sampleWorldY(x - h, z);
|
|
248
|
+
const dz = this.sampleWorldY(x, z + h) - this.sampleWorldY(x, z - h);
|
|
249
|
+
const nx = -dx / (2 * h);
|
|
250
|
+
const nz = -dz / (2 * h);
|
|
251
|
+
const len = Math.hypot(nx, 1, nz);
|
|
252
|
+
return (out ?? new Vector3()).setXYZ(nx / len, 1 / len, nz / len);
|
|
253
|
+
}
|
|
254
|
+
/** @internal */ _rebuildBatchArrays() {
|
|
255
|
+
if (!this._extrasDirty) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
this._extrasDirty = false;
|
|
259
|
+
if (this._extraListeners.length === 0) {
|
|
260
|
+
this._batchInputs = this._inputs;
|
|
261
|
+
this._batchOutputs = this._outPos;
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const inputs = this._inputs.slice();
|
|
265
|
+
const outputs = this._outPos.slice();
|
|
266
|
+
for (const entry of this._extraListeners){
|
|
267
|
+
for(let i = 0; i < entry.inputs.length; i++){
|
|
268
|
+
inputs.push(entry.inputs[i]);
|
|
269
|
+
outputs.push(entry.outputs[i]);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
this._batchInputs = inputs;
|
|
273
|
+
this._batchOutputs = outputs;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Point the sampler at a batch that just landed. The measurement becomes the
|
|
277
|
+
* target the reported height eases towards; the first batch is adopted
|
|
278
|
+
* outright, since there is no previous surface to ease from.
|
|
279
|
+
* @internal
|
|
280
|
+
*/ _acceptBatch() {
|
|
281
|
+
this._pending = false;
|
|
282
|
+
this._lastLatency = this._pendingSince;
|
|
283
|
+
this._pendingSince = 0;
|
|
284
|
+
this._elapsed = 0;
|
|
285
|
+
const count = this._outPos.length;
|
|
286
|
+
if (!this._target) {
|
|
287
|
+
this._target = new Float32Array(count);
|
|
288
|
+
for(let i = 0; i < count; i++){
|
|
289
|
+
this._target[i] = this._outPos[i].y;
|
|
290
|
+
}
|
|
291
|
+
this._height = this._target.slice();
|
|
292
|
+
} else {
|
|
293
|
+
for(let i = 0; i < count; i++){
|
|
294
|
+
this._target[i] = this._outPos[i].y;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
this._batchFrames = this._framesSinceLastBatch;
|
|
298
|
+
this._framesSinceLastBatch = 0;
|
|
299
|
+
this._readCount++;
|
|
300
|
+
this._waveTime = this._water.waveTime;
|
|
301
|
+
for (const entry of this._extraListeners){
|
|
302
|
+
entry.onResult(entry.outputs, entry.inputs);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
/** @internal */ _sampleTable(table, x, z) {
|
|
306
|
+
if (!table) {
|
|
307
|
+
return this._water.worldMatrix.m13;
|
|
308
|
+
}
|
|
309
|
+
const u = (x - this._originX) / this._spacing;
|
|
310
|
+
const v = (z - this._originZ) / this._spacing;
|
|
311
|
+
const cu = Math.min(this._cols - 1, Math.max(0, u));
|
|
312
|
+
const cv = Math.min(this._rows - 1, Math.max(0, v));
|
|
313
|
+
const i0 = Math.min(this._cols - 2, Math.max(0, Math.floor(cu)));
|
|
314
|
+
const j0 = Math.min(this._rows - 2, Math.max(0, Math.floor(cv)));
|
|
315
|
+
const fu = Math.min(1, Math.max(0, cu - i0));
|
|
316
|
+
const fv = Math.min(1, Math.max(0, cv - j0));
|
|
317
|
+
const r0 = j0 * this._cols;
|
|
318
|
+
const r1 = (j0 + 1) * this._cols;
|
|
319
|
+
return (table[r0 + i0] * (1 - fu) + table[r0 + i0 + 1] * fu) * (1 - fv) + (table[r1 + i0] * (1 - fu) + table[r1 + i0 + 1] * fu) * fv;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export { WaterSurfaceSampler };
|
|
324
|
+
//# sourceMappingURL=water_surface_sampler.js.map
|