@zephyr3d/scene 0.9.27 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -27
- package/dist/animation/animation_bank.js +634 -0
- package/dist/animation/animation_bank.js.map +1 -0
- package/dist/animation/animation_bank_gpu.js +256 -0
- package/dist/animation/animation_bank_gpu.js.map +1 -0
- package/dist/animation/animationset.js +54 -0
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_component.js +406 -0
- package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
- package/dist/animation/cloth/gpu_cloth_system.js +332 -202
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
- package/dist/animation/gpu_animation_driver.js +289 -0
- package/dist/animation/gpu_animation_driver.js.map +1 -0
- package/dist/animation/joint_dynamics/collision.js +112 -1
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +6 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +50 -12
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/skeleton.js +279 -55
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skin_palette_atlas.js +252 -0
- package/dist/animation/skin_palette_atlas.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +298 -38
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +2 -0
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +159 -21
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_solver.js +173 -0
- package/dist/animation/spring/spring_solver.js.map +1 -0
- package/dist/animation/spring/spring_system.js +249 -24
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring_modifier.js +32 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/app.js +26 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/engine.js +86 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/gamepad.js +191 -0
- package/dist/app/gamepad.js.map +1 -0
- package/dist/app/inputactions.js +271 -0
- package/dist/app/inputactions.js.map +1 -0
- package/dist/app/inputmgr.js +331 -22
- package/dist/app/inputmgr.js.map +1 -1
- package/dist/app/loading.js +138 -0
- package/dist/app/loading.js.map +1 -0
- package/dist/app/pipelinecache.js +209 -0
- package/dist/app/pipelinecache.js.map +1 -0
- package/dist/app/runtimescript.js +25 -0
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/scriptingsystem.js +54 -0
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +7 -2
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/asset_manifest.js +59 -0
- package/dist/asset/asset_manifest.js.map +1 -0
- package/dist/asset/asset_preload.js +258 -0
- package/dist/asset/asset_preload.js.map +1 -0
- package/dist/asset/assetmanager.js +117 -65
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/dist/asset/loaders/ktx2/basis_location.js +17 -0
- package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
- package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
- package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
- package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
- package/dist/asset/mesh_lod_builder.js +104 -0
- package/dist/asset/mesh_lod_builder.js.map +1 -0
- package/dist/asset/mesh_settings.js +111 -0
- package/dist/asset/mesh_settings.js.map +1 -0
- package/dist/asset/meshopt_decoder.js +18 -0
- package/dist/asset/meshopt_decoder.js.map +1 -0
- package/dist/asset/meshopt_simplifier.js +26 -0
- package/dist/asset/meshopt_simplifier.js.map +1 -0
- package/dist/asset/model.js +171 -1
- package/dist/asset/model.js.map +1 -1
- package/dist/asset/texture_settings.js +231 -0
- package/dist/asset/texture_settings.js.map +1 -0
- package/dist/asset/zmsh_binary.js +131 -0
- package/dist/asset/zmsh_binary.js.map +1 -0
- package/dist/asset/zsdf_binary.js +111 -0
- package/dist/asset/zsdf_binary.js.map +1 -0
- package/dist/blitter/bilateralblur.js +1 -2
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/gaussianblur.js +1 -6
- package/dist/blitter/gaussianblur.js.map +1 -1
- package/dist/camera/base.js +31 -10
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +104 -178
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/follow.js +342 -0
- package/dist/camera/follow.js.map +1 -0
- package/dist/camera/fps.js +9 -7
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +46 -19
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +25436 -15990
- package/dist/index.js +65 -11
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +3 -0
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/eye.js +1 -1
- package/dist/material/eye.js.map +1 -1
- package/dist/material/hair.js +2 -3
- package/dist/material/hair.js.map +1 -1
- package/dist/material/lambert.js +4 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +66 -4
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +118 -45
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +191 -83
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +31 -206
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +1 -1
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrmr.js +3 -0
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +3 -0
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/sdf_debug.js +78 -0
- package/dist/material/sdf_debug.js.map +1 -0
- package/dist/material/shader/helper.js +333 -191
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/shader/terrain_blend.js +204 -43
- package/dist/material/shader/terrain_blend.js.map +1 -1
- package/dist/material/skin.js +331 -297
- package/dist/material/skin.js.map +1 -1
- package/dist/material/skinprofile.js +1058 -0
- package/dist/material/skinprofile.js.map +1 -0
- package/dist/material/sss.js +353 -0
- package/dist/material/sss.js.map +1 -0
- package/dist/material/sss_kernel.js +265 -0
- package/dist/material/sss_kernel.js.map +1 -0
- package/dist/material/sssprofile.js +879 -0
- package/dist/material/sssprofile.js.map +1 -0
- package/dist/material/subsurfaceprofile.js +4 -8
- package/dist/material/subsurfaceprofile.js.map +1 -1
- package/dist/material/terrain-cm.js +464 -188
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/unlit.js +3 -0
- package/dist/material/unlit.js.map +1 -1
- package/dist/material/water.js +1261 -1438
- package/dist/material/water.js.map +1 -1
- package/dist/node_modules/meshoptimizer/LICENSE +21 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
- package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
- package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
- package/dist/physics/character.js +226 -0
- package/dist/physics/character.js.map +1 -0
- package/dist/physics/collider.js +209 -0
- package/dist/physics/collider.js.map +1 -0
- package/dist/physics/events.js +79 -0
- package/dist/physics/events.js.map +1 -0
- package/dist/physics/joint.js +272 -0
- package/dist/physics/joint.js.map +1 -0
- package/dist/physics/node_physics.js +234 -0
- package/dist/physics/node_physics.js.map +1 -0
- package/dist/physics/part.js +91 -0
- package/dist/physics/part.js.map +1 -0
- package/dist/physics/rigid_body.js +379 -0
- package/dist/physics/rigid_body.js.map +1 -0
- package/dist/physics/vehicle.js +335 -0
- package/dist/physics/vehicle.js.map +1 -0
- package/dist/physics/world.js +25 -0
- package/dist/physics/world.js.map +1 -0
- package/dist/posteffect/bloom.js +49 -14
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/motionblur.js +106 -106
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/postsss.js +572 -0
- package/dist/posteffect/postsss.js.map +1 -0
- package/dist/posteffect/sao.js +2 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +605 -355
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +91 -162
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +3 -11
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +4 -13
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +1 -0
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/abuffer_oit.js +3 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +179 -64
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cluster_light.js +958 -224
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +25 -5
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/debug_views.js +37 -0
- package/dist/render/debug_views.js.map +1 -0
- package/dist/render/depthpass.js +5 -1
- package/dist/render/depthpass.js.map +1 -1
- package/dist/render/drawable_mixin.js +53 -6
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +5 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +196 -113
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +5 -10
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +247 -157
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +16 -38
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/gi/probe_volume.js +1334 -0
- package/dist/render/gi/probe_volume.js.map +1 -0
- package/dist/render/gi/scene_gi.js +282 -0
- package/dist/render/gi/scene_gi.js.map +1 -0
- package/dist/render/gi/voxel_atlas.js +198 -0
- package/dist/render/gi/voxel_atlas.js.map +1 -0
- package/dist/render/gi/voxel_lighting.js +652 -0
- package/dist/render/gi/voxel_lighting.js.map +1 -0
- package/dist/render/gi/voxel_scene.js +642 -0
- package/dist/render/gi/voxel_scene.js.map +1 -0
- package/dist/render/gi/voxelize_pass.js +223 -0
- package/dist/render/gi/voxelize_pass.js.map +1 -0
- package/dist/render/globalbindgroup_allocator.js +3 -2
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/gpu_picking.js +9 -36
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/instance_culling.js +499 -0
- package/dist/render/instance_culling.js.map +1 -0
- package/dist/render/lightpass.js +19 -8
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/lod.js +46 -0
- package/dist/render/lod.js.map +1 -0
- package/dist/render/primitive.js +301 -9
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/primitive_readback.js +209 -0
- package/dist/render/primitive_readback.js.map +1 -0
- package/dist/render/render_queue.js +162 -11
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +10 -7
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +14 -1
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/executor.js +136 -0
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +272 -55
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- package/dist/render/rendergraph/scene_render_context.js +31 -2
- package/dist/render/rendergraph/scene_render_context.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +28 -5
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/sdf/box_allocator.js +98 -0
- package/dist/render/sdf/box_allocator.js.map +1 -0
- package/dist/render/sdf/global_sdf.js +865 -0
- package/dist/render/sdf/global_sdf.js.map +1 -0
- package/dist/render/sdf/scene_sdf.js +562 -0
- package/dist/render/sdf/scene_sdf.js.map +1 -0
- package/dist/render/sdf/sdf_atlas.js +227 -0
- package/dist/render/sdf/sdf_atlas.js.map +1 -0
- package/dist/render/sdf/sdf_programs.js +42 -0
- package/dist/render/sdf/sdf_programs.js.map +1 -0
- package/dist/render/sdf/sdf_view.js +199 -0
- package/dist/render/sdf/sdf_view.js.map +1 -0
- package/dist/render/sdf/waterline.js +610 -0
- package/dist/render/sdf/waterline.js.map +1 -0
- package/dist/render/shadow_mask_pass.js +142 -25
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/shore_wave_generator.js +1193 -0
- package/dist/render/shore_wave_generator.js.map +1 -0
- package/dist/render/sky.js +516 -86
- package/dist/render/sky.js.map +1 -1
- package/dist/render/transmission_thickness_pass.js +477 -0
- package/dist/render/transmission_thickness_pass.js.map +1 -0
- package/dist/render/underwater.js +58 -158
- package/dist/render/underwater.js.map +1 -1
- package/dist/render/virtualtexture/virtual_texture.js +1214 -0
- package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_common.js +472 -0
- package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
- package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
- package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
- package/dist/render/volumetric_cloud/debug_view.js +131 -0
- package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
- package/dist/render/volumetric_cloud/resources.js +380 -0
- package/dist/render/volumetric_cloud/resources.js.map +1 -0
- package/dist/render/volumetric_cloud/sky_cache.js +380 -0
- package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
- package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
- package/dist/render/water_caustics.js +134 -319
- package/dist/render/water_caustics.js.map +1 -1
- package/dist/render/water_foam.js +627 -0
- package/dist/render/water_foam.js.map +1 -0
- package/dist/render/water_interaction.js +1795 -0
- package/dist/render/water_interaction.js.map +1 -0
- package/dist/render/weightedblended_oit.js +3 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +9 -4
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +108 -12
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +28 -7
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/foliage.js +1020 -0
- package/dist/scene/foliage.js.map +1 -0
- package/dist/scene/foliage_buckets.js +147 -0
- package/dist/scene/foliage_buckets.js.map +1 -0
- package/dist/scene/foliage_mask.js +358 -0
- package/dist/scene/foliage_mask.js.map +1 -0
- package/dist/scene/hair.js +15 -4
- package/dist/scene/hair.js.map +1 -1
- package/dist/scene/light.js +179 -13
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +327 -45
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +6 -0
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +9 -3
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +9 -3
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +8 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/physics_settings.js +157 -0
- package/dist/scene/physics_settings.js.map +1 -0
- package/dist/scene/scene.js +190 -44
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +147 -6
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
- package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +881 -42
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grass_gpu.js +929 -0
- package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js +180 -9
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +465 -36
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
- package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
- package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
- package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
- package/dist/scene/update_queue.js +54 -0
- package/dist/scene/update_queue.js.map +1 -0
- package/dist/scene/water.js +633 -268
- package/dist/scene/water.js.map +1 -1
- package/dist/scene/water_surface_sampler.js +324 -0
- package/dist/scene/water_surface_sampler.js.map +1 -0
- package/dist/scene/wind.js +317 -0
- package/dist/scene/wind.js.map +1 -0
- package/dist/shaders/atmosphere.js +388 -166
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +100 -32
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/gi.js +365 -0
- package/dist/shaders/gi.js.map +1 -0
- package/dist/shaders/ltc_rect.js +202 -0
- package/dist/shaders/ltc_rect.js.map +1 -0
- package/dist/shaders/misc.js +1 -10
- package/dist/shaders/misc.js.map +1 -1
- package/dist/shaders/noise.js +5 -1
- package/dist/shaders/noise.js.map +1 -1
- package/dist/shaders/probes.js +309 -0
- package/dist/shaders/probes.js.map +1 -0
- package/dist/shaders/sdf.js +537 -0
- package/dist/shaders/sdf.js.map +1 -0
- package/dist/shaders/shadow.js +104 -70
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/skin_brdf.js +243 -0
- package/dist/shaders/skin_brdf.js.map +1 -0
- package/dist/shaders/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +6 -159
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shaders/temporal.js +38 -27
- package/dist/shaders/temporal.js.map +1 -1
- package/dist/shaders/water.js +32 -82
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +7 -21
- package/dist/shaders/water_medium.js.map +1 -1
- package/dist/shadow/dom.js +110 -19
- package/dist/shadow/dom.js.map +1 -1
- package/dist/shadow/esm.js +3 -3
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -48
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -53
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +34 -9
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +3 -8
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadow_region.js +40 -2
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/shadow/shadowmapper.js +93 -53
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +18 -72
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +3 -3
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/shapes/shape.js +44 -1
- package/dist/shapes/shape.js.map +1 -1
- package/dist/utility/buoyancy.js +287 -0
- package/dist/utility/buoyancy.js.map +1 -0
- package/dist/utility/physical.js +10 -1
- package/dist/utility/physical.js.map +1 -1
- package/dist/utility/pmrem.js +17 -43
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/sdf/bake.js +435 -0
- package/dist/utility/sdf/bake.js.map +1 -0
- package/dist/utility/sdf/bvh.js +576 -0
- package/dist/utility/sdf/bvh.js.map +1 -0
- package/dist/utility/serialization/manager.js +34 -6
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +46 -5
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +11 -4
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +87 -254
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth.js +25 -0
- package/dist/utility/serialization/scene/cloth.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +14 -6
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/foliage.js +821 -0
- package/dist/utility/serialization/scene/foliage.js.map +1 -0
- package/dist/utility/serialization/scene/hair.js +11 -4
- package/dist/utility/serialization/scene/hair.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +115 -7
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +388 -220
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +69 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +140 -5
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/node_physics.js +1318 -0
- package/dist/utility/serialization/scene/node_physics.js.map +1 -0
- package/dist/utility/serialization/scene/particle.js +11 -4
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/physics.js +120 -0
- package/dist/utility/serialization/scene/physics.js.map +1 -0
- package/dist/utility/serialization/scene/primitive.js +124 -10
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +1687 -51
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +11 -4
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +163 -33
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +11 -4
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1543 -264
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/shprojector.js +10 -22
- package/dist/utility/shprojector.js.map +1 -1
- package/dist/utility/textures/foam.js +170 -0
- package/dist/utility/textures/foam.js.map +1 -0
- package/dist/utility/textures/ggxlut.js +17 -43
- package/dist/utility/textures/ggxlut.js.map +1 -1
- package/dist/utility/textures/ltcdata.js +4 -4
- package/dist/utility/textures/ltcdata.js.map +1 -1
- package/dist/utility/textures/ltclut.js +16 -6
- package/dist/utility/textures/ltclut.js.map +1 -1
- package/dist/utility/unsupported.js +24 -0
- package/dist/utility/unsupported.js.map +1 -0
- package/dist/values.js +13 -1
- package/dist/values.js.map +1 -1
- package/package.json +25 -12
- package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
- package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
- package/src/asset/meshoptimizer/LICENSE +21 -0
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -0,0 +1,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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"water_surface_sampler.js","sources":["../../src/scene/water_surface_sampler.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\n\r\n/**\r\n * What {@link WaterSurfaceSampler} needs from a body of water: where its rest\r\n * plane is, what time its surface is at, and a way to evaluate the displaced\r\n * surface at a set of positions. {@link Water} provides all three.\r\n * @public\r\n */\r\nexport interface WaterSurfaceSource {\r\n /** World matrix; only the translation is read. */\r\n readonly worldMatrix: { readonly m03: number; readonly m13: number; readonly m23: number };\r\n /** Wave clock of the surface, in seconds. */\r\n readonly waveTime: number;\r\n /** Evaluate the displaced surface over world XZ positions. */\r\n getSurfacePoint(\r\n points: Vector3[],\r\n outPos?: Vector3[],\r\n outNorm?: Vector3[],\r\n includeDisturbers?: boolean\r\n ): Promise<void>;\r\n}\r\n\r\n/**\r\n * Options for {@link WaterSurfaceSampler}.\r\n * @public\r\n */\r\nexport interface WaterSurfaceSamplerOptions {\r\n /** Include moving disturbers' wakes. Defaults to false to prevent buoyancy feedback. */\r\n includeDisturbers?: boolean;\r\n /** Lattice cell size in world metres. Defaults to 6. */\r\n spacing?: number;\r\n /** Lattice columns, along X. Defaults to 24. */\r\n cols?: number;\r\n /** Lattice rows, along Z. Defaults to 24. */\r\n rows?: number;\r\n /**\r\n * Upper bound on the query rate in hertz. The achieved rate is the lower of\r\n * this and what a batch costs. Defaults to 30.\r\n */\r\n updateHz?: number;\r\n /**\r\n * Seconds for the reported height to close most of the gap to a new\r\n * measurement. Lower is tighter to the wave, higher is heavier. Defaults to\r\n * 0.25.\r\n */\r\n timeConstant?: number;\r\n}\r\n\r\n/** A set of moving positions evaluated alongside the lattice. @internal */\r\ninterface ExtraPoints {\r\n inputs: Vector3[];\r\n outputs: Vector3[];\r\n onResult: (results: Vector3[], inputs: Vector3[]) => void;\r\n}\r\n\r\n/**\r\n * Height queries against a water surface, driven by the material's own\r\n * evaluation of it.\r\n *\r\n * {@link Water.getSurfacePoint} evaluates the GPU displacement itself, so the\r\n * result is exact by construction rather than a CPU re-implementation of the\r\n * waves. By default it includes ambient waves and external interaction\r\n * impulses, but excludes disturber wakes to prevent buoyancy feeding itself.\r\n * Set includeDisturbers for queries that need the complete rendered surface.\r\n * Each batch costs one point-list draw and one readback, so queries are\r\n * batched and throttled rather than issued per call.\r\n *\r\n * The queries are placed on a fixed lattice at construction; the whole set\r\n * costs one draw and one readback and the answer is interpolated across the\r\n * lattice on demand. Moving positions (a hull's footprint, say) ride along\r\n * through {@link addExtraPoints}.\r\n *\r\n * ## The motion\r\n *\r\n * The reported height eases exponentially towards the newest measurement; the\r\n * query lag is not compensated. A rigid body should read\r\n * {@link sampleWorldYRaw} instead and supply its own inertia.\r\n *\r\n * Consequences a caller has to accept:\r\n * - Resolution is the lattice spacing. A grid at `h` metres resolves nothing\r\n * shorter than about `2 * h`.\r\n * - A probe outside the lattice is answered by the nearest cell rather than by\r\n * a wrapped one; this is a window on the water, not a repeating field.\r\n * - Nothing is known until the first batch lands; until then queries return\r\n * the still-water level.\r\n *\r\n * @public\r\n */\r\nexport class WaterSurfaceSampler {\r\n private readonly _water: WaterSurfaceSource;\r\n private readonly _includeDisturbers: boolean;\r\n private readonly _spacing: number;\r\n private readonly _cols: number;\r\n private readonly _rows: number;\r\n private _updateHz: number;\r\n private _timeConstant: number;\r\n private _pending: boolean;\r\n private _elapsed: number;\r\n private _waveTime: number;\r\n private _readCount: number;\r\n private _failCount: number;\r\n private _totalPoints: number;\r\n private _pendingSince: number;\r\n private _lastLatency: number;\r\n private _batchFrames: number;\r\n private _framesSinceLastBatch: number;\r\n private readonly _originX: number;\r\n private readonly _originZ: number;\r\n private readonly _inputs: Vector3[];\r\n private readonly _outPos: Vector3[];\r\n private readonly _extraListeners: ExtraPoints[];\r\n private _batchInputs: Vector3[];\r\n private _batchOutputs: Vector3[];\r\n private _extrasDirty: boolean;\r\n /** Heights the queries read; null until the first batch. */\r\n private _height: Nullable<Float32Array>;\r\n /** Where the newest measurement put the surface. */\r\n private _target: Nullable<Float32Array>;\r\n /**\r\n * Creates a sampler over a body of water.\r\n * @param water - The water to sample.\r\n * @param options - Lattice and rate options.\r\n */\r\n constructor(water: WaterSurfaceSource, options: WaterSurfaceSamplerOptions = {}) {\r\n this._water = water;\r\n this._includeDisturbers = options.includeDisturbers ?? false;\r\n this._spacing = Math.max(0.01, options.spacing ?? 6);\r\n this._cols = Math.max(2, Math.floor(options.cols ?? 24));\r\n this._rows = Math.max(2, Math.floor(options.rows ?? 24));\r\n this._updateHz = Math.max(0.1, options.updateHz ?? 30);\r\n this._timeConstant = Math.max(0.001, options.timeConstant ?? 0.25);\r\n this._pending = false;\r\n this._elapsed = 0;\r\n this._waveTime = 0;\r\n this._readCount = 0;\r\n this._failCount = 0;\r\n this._totalPoints = 0;\r\n this._pendingSince = 0;\r\n this._lastLatency = 0;\r\n this._batchFrames = 0;\r\n this._framesSinceLastBatch = 0;\r\n // The lattice is anchored on the water's origin, in world space.\r\n const ox = water.worldMatrix.m03;\r\n const oz = water.worldMatrix.m23;\r\n this._originX = ox - ((this._cols - 1) / 2) * this._spacing;\r\n this._originZ = oz - ((this._rows - 1) / 2) * this._spacing;\r\n const count = this._cols * this._rows;\r\n this._inputs = new Array(count);\r\n this._outPos = new Array(count);\r\n for (let j = 0; j < this._rows; j++) {\r\n for (let i = 0; i < this._cols; i++) {\r\n const k = j * this._cols + i;\r\n this._inputs[k] = new Vector3(\r\n this._originX + i * this._spacing,\r\n 0,\r\n this._originZ + j * this._spacing\r\n );\r\n this._outPos[k] = new Vector3();\r\n }\r\n }\r\n this._extraListeners = [];\r\n this._batchInputs = this._inputs;\r\n this._batchOutputs = this._outPos;\r\n this._extrasDirty = false;\r\n this._height = null;\r\n this._target = null;\r\n }\r\n /** Water clock of the newest accepted batch, in seconds. */\r\n get waveTime() {\r\n return this._waveTime;\r\n }\r\n /**\r\n * Upper bound on the query rate in hertz.\r\n *\r\n * A ceiling, not a schedule: the achieved rate is also limited by batch cost.\r\n */\r\n get updateHz() {\r\n return this._updateHz;\r\n }\r\n set updateHz(val: number) {\r\n this._updateHz = Math.max(0.1, val);\r\n }\r\n /**\r\n * Seconds for the reported height to close most of the gap to a new\r\n * measurement. Independent of frame rate.\r\n */\r\n get timeConstant() {\r\n return this._timeConstant;\r\n }\r\n set timeConstant(val: number) {\r\n this._timeConstant = Math.max(0.001, val);\r\n }\r\n /** Batches completed since construction. */\r\n get readCount() {\r\n return this._readCount;\r\n }\r\n /** Batches that failed. */\r\n get failCount() {\r\n return this._failCount;\r\n }\r\n /** True while a batch is in flight. */\r\n get pending() {\r\n return this._pending;\r\n }\r\n /** Seconds the batch in flight has been outstanding, or 0 when none is. */\r\n get pendingSeconds() {\r\n return this._pending ? this._pendingSince : 0;\r\n }\r\n /** Batch latency in seconds, as of the last one that landed. */\r\n get lastLatency() {\r\n return this._lastLatency;\r\n }\r\n /** Frames the newest batch took to come back. */\r\n get batchFrames() {\r\n return this._batchFrames;\r\n }\r\n /** Points evaluated per batch, the cost driver of this sampler. */\r\n get batchSize() {\r\n return this._totalPoints;\r\n }\r\n /** True once a batch has landed and queries return surface heights. */\r\n get ready() {\r\n return !!this._height;\r\n }\r\n /** World metres between lattice samples. */\r\n get spacing() {\r\n return this._spacing;\r\n }\r\n /** World Y of the still-water level. */\r\n get waterLevel() {\r\n return this._water.worldMatrix.m13;\r\n }\r\n /**\r\n * Register world positions to evaluate alongside the lattice, every batch.\r\n *\r\n * The array is held by reference and read when a batch is issued, so a\r\n * caller updates the vectors in place each frame and the next batch picks\r\n * them up. The listener receives the surface positions for those inputs when\r\n * the batch lands, in the same order.\r\n *\r\n * @param inputs - World positions; only X and Z are used.\r\n * @param onResult - Called per batch with the surface positions.\r\n * @returns A function that unregisters the points.\r\n */\r\n addExtraPoints(inputs: Vector3[], onResult: (results: Vector3[], inputs: Vector3[]) => void) {\r\n const outputs = inputs.map(() => new Vector3());\r\n const entry: ExtraPoints = { inputs, outputs, onResult };\r\n this._extraListeners.push(entry);\r\n this._extrasDirty = true;\r\n return () => {\r\n const i = this._extraListeners.indexOf(entry);\r\n if (i >= 0) {\r\n this._extraListeners.splice(i, 1);\r\n this._extrasDirty = true;\r\n }\r\n };\r\n }\r\n /**\r\n * Advance the sampler. Call once per frame with the frame's delta.\r\n * @param deltaSeconds - Frame delta in seconds.\r\n */\r\n update(deltaSeconds: number) {\r\n this._framesSinceLastBatch++;\r\n // Ease once a frame so every query in a frame sees the same value; exact\r\n // exponential decay keeps the result independent of frame size.\r\n if (this._height && this._target) {\r\n const k = 1 - Math.exp(-deltaSeconds / this._timeConstant);\r\n const height = this._height;\r\n const target = this._target;\r\n for (let i = 0; i < height.length; i++) {\r\n height[i] += (target[i] - height[i]) * k;\r\n }\r\n }\r\n if (this._pending) {\r\n this._pendingSince += deltaSeconds;\r\n return;\r\n }\r\n this._elapsed += deltaSeconds;\r\n // Fire as soon as the previous batch has landed, capped at `updateHz`.\r\n if (this._elapsed >= 1 / this._updateHz) {\r\n this._elapsed = 0;\r\n this._pending = true;\r\n this._pendingSince = 0;\r\n this._rebuildBatchArrays();\r\n this._totalPoints = this._batchInputs.length;\r\n // Only positions: the normal attachment would double the readback.\r\n this._water\r\n .getSurfacePoint(this._batchInputs, this._batchOutputs, undefined, this._includeDisturbers)\r\n .then(() => this._acceptBatch())\r\n .catch((err) => {\r\n this._pending = false;\r\n this._pendingSince = 0;\r\n this._failCount++;\r\n console.error('WaterSurfaceSampler: surface query failed', err);\r\n });\r\n }\r\n }\r\n /**\r\n * Surface world Y at a world XZ, eased.\r\n *\r\n * Bilinear over the lattice, clamped at the edges. A pure lookup of the table\r\n * advanced by {@link update}. For objects placed directly at the height,\r\n * without inertia of their own.\r\n */\r\n sampleWorldY(x: number, z: number) {\r\n return this._sampleTable(this._height, x, z);\r\n }\r\n /**\r\n * Surface world Y at a world XZ, from the newest measurement with no easing.\r\n *\r\n * For a rigid body, which would otherwise get the easing lag on top of the\r\n * query lag.\r\n */\r\n sampleWorldYRaw(x: number, z: number) {\r\n return this._sampleTable(this._target, x, z);\r\n }\r\n /**\r\n * Surface normal from the eased lattice, by central differences one cell\r\n * apart.\r\n * @param out - Destination, or a new vector.\r\n * @returns Unit normal, Y up.\r\n */\r\n sampleNormal(x: number, z: number, out?: Vector3) {\r\n const h = this._spacing;\r\n const dx = this.sampleWorldY(x + h, z) - this.sampleWorldY(x - h, z);\r\n const dz = this.sampleWorldY(x, z + h) - this.sampleWorldY(x, z - h);\r\n const nx = -dx / (2 * h);\r\n const nz = -dz / (2 * h);\r\n const len = Math.hypot(nx, 1, nz);\r\n return (out ?? new Vector3()).setXYZ(nx / len, 1 / len, nz / len);\r\n }\r\n /** @internal */\r\n private _rebuildBatchArrays() {\r\n if (!this._extrasDirty) {\r\n return;\r\n }\r\n this._extrasDirty = false;\r\n if (this._extraListeners.length === 0) {\r\n this._batchInputs = this._inputs;\r\n this._batchOutputs = this._outPos;\r\n return;\r\n }\r\n const inputs = this._inputs.slice();\r\n const outputs = this._outPos.slice();\r\n for (const entry of this._extraListeners) {\r\n for (let i = 0; i < entry.inputs.length; i++) {\r\n inputs.push(entry.inputs[i]);\r\n outputs.push(entry.outputs[i]);\r\n }\r\n }\r\n this._batchInputs = inputs;\r\n this._batchOutputs = outputs;\r\n }\r\n /**\r\n * Point the sampler at a batch that just landed. The measurement becomes the\r\n * target the reported height eases towards; the first batch is adopted\r\n * outright, since there is no previous surface to ease from.\r\n * @internal\r\n */\r\n private _acceptBatch() {\r\n this._pending = false;\r\n this._lastLatency = this._pendingSince;\r\n this._pendingSince = 0;\r\n this._elapsed = 0;\r\n const count = this._outPos.length;\r\n if (!this._target) {\r\n this._target = new Float32Array(count);\r\n for (let i = 0; i < count; i++) {\r\n this._target[i] = this._outPos[i].y;\r\n }\r\n this._height = this._target.slice();\r\n } else {\r\n for (let i = 0; i < count; i++) {\r\n this._target[i] = this._outPos[i].y;\r\n }\r\n }\r\n this._batchFrames = this._framesSinceLastBatch;\r\n this._framesSinceLastBatch = 0;\r\n this._readCount++;\r\n this._waveTime = this._water.waveTime;\r\n for (const entry of this._extraListeners) {\r\n entry.onResult(entry.outputs, entry.inputs);\r\n }\r\n }\r\n /** @internal */\r\n private _sampleTable(table: Nullable<Float32Array>, x: number, z: number) {\r\n if (!table) {\r\n return this._water.worldMatrix.m13;\r\n }\r\n const u = (x - this._originX) / this._spacing;\r\n const v = (z - this._originZ) / this._spacing;\r\n const cu = Math.min(this._cols - 1, Math.max(0, u));\r\n const cv = Math.min(this._rows - 1, Math.max(0, v));\r\n const i0 = Math.min(this._cols - 2, Math.max(0, Math.floor(cu)));\r\n const j0 = Math.min(this._rows - 2, Math.max(0, Math.floor(cv)));\r\n const fu = Math.min(1, Math.max(0, cu - i0));\r\n const fv = Math.min(1, Math.max(0, cv - j0));\r\n const r0 = j0 * this._cols;\r\n const r1 = (j0 + 1) * this._cols;\r\n return (\r\n (table[r0 + i0] * (1 - fu) + table[r0 + i0 + 1] * fu) * (1 - fv) +\r\n (table[r1 + i0] * (1 - fu) + table[r1 + i0 + 1] * fu) * fv\r\n );\r\n }\r\n}\r\n"],"names":["WaterSurfaceSampler","_water","_includeDisturbers","_spacing","_cols","_rows","_updateHz","_timeConstant","_pending","_elapsed","_waveTime","_readCount","_failCount","_totalPoints","_pendingSince","_lastLatency","_batchFrames","_framesSinceLastBatch","_originX","_originZ","_inputs","_outPos","_extraListeners","_batchInputs","_batchOutputs","_extrasDirty","water","options","includeDisturbers","Math","max","spacing","floor","cols","rows","updateHz","timeConstant","ox","worldMatrix","m03","oz","m23","count","Array","j","i","k","Vector3","_height","_target","waveTime","val","readCount","failCount","pending","pendingSeconds","lastLatency","batchFrames","batchSize","ready","waterLevel","m13","addExtraPoints","inputs","onResult","outputs","map","entry","push","indexOf","splice","update","deltaSeconds","exp","height","target","length","_rebuildBatchArrays","getSurfacePoint","undefined","then","_acceptBatch","catch","err","console","error","sampleWorldY","x","z","_sampleTable","sampleWorldYRaw","sampleNormal","out","h","dx","dz","nx","nz","len","hypot","setXYZ","slice","Float32Array","y","table","u","v","cu","min","cv","i0","j0","fu","fv","r0","r1"],"mappings":"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"}
|