@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi_chain_spring_system.js","sources":["../../../src/animation/spring/multi_chain_spring_system.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport type { SpringChain } from './spring_chain';\r\nimport type { SpringParticle } from './spring_particle';\r\nimport type { SpringConstraint } from './spring_constraint';\r\nimport { IKUtils } from '../ik/ik_utils';\r\nimport type { SpringCollider } from './spring_collider';\r\nimport {\r\n resolveSphereCollision,\r\n resolveCapsuleCollision,\r\n resolvePlaneCollision,\r\n type CapsuleCollider,\r\n type PlaneCollider,\r\n type SphereCollider,\r\n updateColliderFromNode\r\n} from './spring_collider';\r\nimport { SpringNodePoseTracker } from './spring_node_pose_tracker';\r\n\r\nexport interface InterChainConstraint {\r\n chainAIndex: number;\r\n chainBIndex: number;\r\n particleAIndex: number;\r\n particleBIndex: number;\r\n restLength: number;\r\n stiffness: number;\r\n compliance: number;\r\n lambda: number;\r\n}\r\n\r\nexport interface MultiChainSpringSystemOptions {\r\n iterations?: number;\r\n gravity?: Vector3;\r\n wind?: Vector3;\r\n enableInertialForces?: boolean;\r\n centrifugalScale?: number;\r\n coriolisScale?: number;\r\n solver?: 'verlet' | 'xpbd';\r\n poseFollow?: number;\r\n poseFollowRoot?: number;\r\n poseFollowTip?: number;\r\n poseFollowExponent?: number;\r\n maxPoseOffset?: number;\r\n maxPoseOffsetRoot?: number;\r\n maxPoseOffsetTip?: number;\r\n}\r\n\r\n/** Options used when rebuilding runtime spring state from the current node pose. */\r\nexport interface SpringPoseReinitializeOptions {\r\n /** Recompute maintained anchor offsets against runtime-remapped anchor nodes. */\r\n recomputeAnchorOffsets?: boolean;\r\n /** Recompute structural and inter-chain rest lengths from the current pose. */\r\n recalculateRestLengths?: boolean;\r\n}\r\n\r\nconst FIXED_SIMULATION_TIME_STEP = 1 / 60;\r\nconst MAX_ACCUMULATED_SIMULATION_TIME = 1 / 20;\r\nconst MAX_SIMULATION_STEPS_PER_UPDATE = Math.max(\r\n 1,\r\n Math.ceil(MAX_ACCUMULATED_SIMULATION_TIME / FIXED_SIMULATION_TIME_STEP)\r\n);\r\nconst DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME = 1 / 30;\r\nconst DEFAULT_COLLIDER_SMOOTHING_TIME = 1 / 30;\r\n\r\nexport class MultiChainSpringSystem {\r\n private _chains: SpringChain[];\r\n private _interChainConstraints: InterChainConstraint[];\r\n private _iterations: number;\r\n private _gravity: Vector3;\r\n private _wind: Vector3;\r\n private _enableInertialForces: boolean;\r\n private _centrifugalScale: number;\r\n private _coriolisScale: number;\r\n private _solver: 'verlet' | 'xpbd';\r\n private _poseFollow: number;\r\n private _maxPoseOffset: number;\r\n private _poseFollowRoot: number;\r\n private _poseFollowTip: number;\r\n private _poseFollowExponent: number;\r\n private _maxPoseOffsetRoot: number;\r\n private _maxPoseOffsetTip: number;\r\n private _colliders: SpringCollider[];\r\n private _timeAccumulator: number;\r\n private _smoothedParticleTargets: WeakMap<object, Vector3>;\r\n private _smoothedSphereCenters: WeakMap<SphereCollider, Vector3>;\r\n private _smoothedCapsuleEndpoints: WeakMap<CapsuleCollider, { start: Vector3; end: Vector3 }>;\r\n private _smoothedPlaneData: WeakMap<PlaneCollider, { point: Vector3; normal: Vector3 }>;\r\n private _runtimeNodeMap: ReadonlyMap<SceneNode, SceneNode> | null;\r\n private _runtimeAnchorOffsets: WeakMap<SpringParticle, Vector3>;\r\n private _runtimeRestLengths: WeakMap<object, number>;\r\n private _nodePoseTracker: SpringNodePoseTracker;\r\n\r\n constructor(options?: MultiChainSpringSystemOptions) {\r\n this._chains = [];\r\n this._interChainConstraints = [];\r\n this._iterations = options?.iterations ?? 5;\r\n this._gravity = options?.gravity?.clone() ?? new Vector3(0, -9.8, 0);\r\n this._wind = options?.wind?.clone() ?? new Vector3(0, 0, 0);\r\n this._enableInertialForces = options?.enableInertialForces ?? true;\r\n this._centrifugalScale = options?.centrifugalScale ?? 1.0;\r\n this._coriolisScale = options?.coriolisScale ?? 1.0;\r\n this._solver = options?.solver ?? 'verlet';\r\n this._poseFollow = Math.max(0, Math.min(1, options?.poseFollow ?? 0.35));\r\n this._maxPoseOffset = Math.max(0, options?.maxPoseOffset ?? 0);\r\n this._poseFollowRoot = Math.max(0, Math.min(1, options?.poseFollowRoot ?? this._poseFollow));\r\n this._poseFollowTip = Math.max(0, Math.min(1, options?.poseFollowTip ?? this._poseFollow));\r\n this._poseFollowExponent = Math.max(0.1, options?.poseFollowExponent ?? 1.6);\r\n this._maxPoseOffsetRoot = Math.max(0, options?.maxPoseOffsetRoot ?? this._maxPoseOffset);\r\n this._maxPoseOffsetTip = Math.max(0, options?.maxPoseOffsetTip ?? this._maxPoseOffset);\r\n this._colliders = [];\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._runtimeNodeMap = null;\r\n this._runtimeAnchorOffsets = new WeakMap();\r\n this._runtimeRestLengths = new WeakMap();\r\n this._nodePoseTracker = new SpringNodePoseTracker();\r\n }\r\n\r\n addChain(chain: SpringChain): number {\r\n this._chains.push(chain);\r\n return this._chains.length - 1;\r\n }\r\n\r\n addInterChainConstraint(constraint: InterChainConstraint): void {\r\n this._interChainConstraints.push(constraint);\r\n }\r\n\r\n createRadialConstraints(options: {\r\n stiffness: number;\r\n maxDistance: number;\r\n skipRows?: number;\r\n connectDistance?: number;\r\n compliance?: number;\r\n }): void {\r\n const skipRows = options.skipRows ?? 0;\r\n const connectDistance = options.connectDistance ?? 1;\r\n const compliance = options.compliance ?? 0;\r\n\r\n for (let i = 0; i < this._chains.length; i++) {\r\n for (let offset = 1; offset <= connectDistance; offset++) {\r\n const j = (i + offset) % this._chains.length;\r\n const chainA = this._chains[i];\r\n const chainB = this._chains[j];\r\n const minLength = Math.min(chainA.particles.length, chainB.particles.length);\r\n\r\n for (let row = skipRows; row < minLength; row++) {\r\n const pA = chainA.particles[row];\r\n const pB = chainB.particles[row];\r\n const distance = Vector3.distance(pA.position, pB.position);\r\n if (distance <= options.maxDistance) {\r\n this.addInterChainConstraint({\r\n chainAIndex: i,\r\n chainBIndex: j,\r\n particleAIndex: row,\r\n particleBIndex: row,\r\n restLength: distance,\r\n stiffness: options.stiffness,\r\n compliance,\r\n lambda: 0\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n update(deltaTime: number): void {\r\n this._nodePoseTracker.restoreInputPose();\r\n const frameDt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (frameDt <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.min(this._timeAccumulator + frameDt, MAX_ACCUMULATED_SIMULATION_TIME);\r\n const stepCount = Math.min(\r\n MAX_SIMULATION_STEPS_PER_UPDATE,\r\n Math.floor((this._timeAccumulator + 1e-8) / FIXED_SIMULATION_TIME_STEP)\r\n );\r\n if (stepCount <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.max(0, this._timeAccumulator - stepCount * FIXED_SIMULATION_TIME_STEP);\r\n for (let i = 0; i < stepCount; i++) {\r\n this.simulateStep(FIXED_SIMULATION_TIME_STEP, i === 0 ? frameDt : 0);\r\n }\r\n }\r\n\r\n applyToNodes(weight: number = 1.0): void {\r\n const baseNodeStates = new Map<any, { position: Vector3; rotation: Quaternion }>();\r\n const desiredWorldRotations = new Map<any, Quaternion>();\r\n\r\n for (const chain of this._chains) {\r\n this.collectChainNodeRotations(chain, weight, baseNodeStates, desiredWorldRotations);\r\n }\r\n\r\n const nodes = Array.from(desiredWorldRotations.keys());\r\n nodes.sort((a, b) => this.getNodeDepth(a) - this.getNodeDepth(b));\r\n\r\n for (const node of nodes) {\r\n const worldRotation = desiredWorldRotations.get(node);\r\n if (!worldRotation) {\r\n continue;\r\n }\r\n const parent = node.parent;\r\n const inputRotation = node.rotation.clone();\r\n if (parent) {\r\n const parentWorldRotation = new Quaternion();\r\n parent.worldMatrix.decompose(null, parentWorldRotation, null);\r\n const parentInvRotation = Quaternion.conjugate(parentWorldRotation, new Quaternion());\r\n const localRotation = Quaternion.multiply(parentInvRotation, worldRotation, new Quaternion());\r\n node.rotation = localRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, localRotation);\r\n } else {\r\n node.rotation = worldRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, worldRotation);\r\n }\r\n }\r\n }\r\n\r\n reset(): void {\r\n this._nodePoseTracker.clear(true);\r\n for (const chain of this._chains) {\r\n chain.reset();\r\n for (const particle of chain.particles) {\r\n particle.animPosition.set(particle.originalPosition);\r\n particle.lastFramePosition.set(particle.originalPosition);\r\n if (particle.positionHistory) {\r\n particle.positionHistory.length = 0;\r\n }\r\n }\r\n }\r\n for (const constraint of this._interChainConstraints) {\r\n constraint.lambda = 0;\r\n }\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n }\r\n\r\n get chains(): SpringChain[] {\r\n return this._chains;\r\n }\r\n\r\n get interChainConstraints(): InterChainConstraint[] {\r\n return this._interChainConstraints;\r\n }\r\n\r\n get gravity(): Vector3 {\r\n return this._gravity;\r\n }\r\n\r\n set gravity(gravity: Vector3) {\r\n this._gravity.set(gravity);\r\n }\r\n\r\n get wind(): Vector3 {\r\n return this._wind;\r\n }\r\n\r\n set wind(wind: Vector3) {\r\n this._wind.set(wind);\r\n }\r\n\r\n get iterations(): number {\r\n return this._iterations;\r\n }\r\n\r\n set iterations(count: number) {\r\n this._iterations = Math.max(1, count);\r\n }\r\n\r\n get enableInertialForces(): boolean {\r\n return this._enableInertialForces;\r\n }\r\n\r\n set enableInertialForces(enabled: boolean) {\r\n this._enableInertialForces = enabled;\r\n }\r\n\r\n get centrifugalScale(): number {\r\n return this._centrifugalScale;\r\n }\r\n\r\n set centrifugalScale(scale: number) {\r\n this._centrifugalScale = Math.max(0, scale);\r\n }\r\n\r\n get coriolisScale(): number {\r\n return this._coriolisScale;\r\n }\r\n\r\n set coriolisScale(scale: number) {\r\n this._coriolisScale = Math.max(0, scale);\r\n }\r\n\r\n get solver(): 'verlet' | 'xpbd' {\r\n return this._solver;\r\n }\r\n\r\n set solver(type: 'verlet' | 'xpbd') {\r\n if (this._solver !== type) {\r\n this._solver = type;\r\n if (type === 'xpbd') {\r\n this.resetConstraintLambdas();\r\n }\r\n }\r\n }\r\n\r\n get poseFollow(): number {\r\n return this._poseFollow;\r\n }\r\n\r\n set poseFollow(value: number) {\r\n const v = Math.max(0, Math.min(1, value));\r\n this._poseFollow = v;\r\n this._poseFollowRoot = v;\r\n this._poseFollowTip = v;\r\n }\r\n\r\n get poseFollowRoot(): number {\r\n return this._poseFollowRoot;\r\n }\r\n\r\n set poseFollowRoot(value: number) {\r\n this._poseFollowRoot = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n get poseFollowTip(): number {\r\n return this._poseFollowTip;\r\n }\r\n\r\n set poseFollowTip(value: number) {\r\n this._poseFollowTip = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n get poseFollowExponent(): number {\r\n return this._poseFollowExponent;\r\n }\r\n\r\n set poseFollowExponent(value: number) {\r\n this._poseFollowExponent = Math.max(0.1, value);\r\n }\r\n\r\n get maxPoseOffset(): number {\r\n return this._maxPoseOffset;\r\n }\r\n\r\n set maxPoseOffset(value: number) {\r\n const v = Math.max(0, value);\r\n this._maxPoseOffset = v;\r\n this._maxPoseOffsetRoot = v;\r\n this._maxPoseOffsetTip = v;\r\n }\r\n\r\n get maxPoseOffsetRoot(): number {\r\n return this._maxPoseOffsetRoot;\r\n }\r\n\r\n set maxPoseOffsetRoot(value: number) {\r\n this._maxPoseOffsetRoot = Math.max(0, value);\r\n }\r\n\r\n get maxPoseOffsetTip(): number {\r\n return this._maxPoseOffsetTip;\r\n }\r\n\r\n set maxPoseOffsetTip(value: number) {\r\n this._maxPoseOffsetTip = Math.max(0, value);\r\n }\r\n\r\n addCollider(collider: SpringCollider): void {\r\n this._colliders.push(collider);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n }\r\n\r\n removeCollider(collider: SpringCollider): boolean {\r\n const index = this._colliders.indexOf(collider);\r\n if (index >= 0) {\r\n this._colliders.splice(index, 1);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n clearColliders(): void {\r\n this._colliders = [];\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n }\r\n\r\n get colliders(): SpringCollider[] {\r\n return this._colliders;\r\n }\r\n\r\n /**\r\n * Sets a runtime-only node remapping used by particles, anchors and colliders.\r\n * The authored node references remain unchanged and therefore serialize normally.\r\n */\r\n setRuntimeNodeMap(nodeMap: ReadonlyMap<SceneNode, SceneNode> | null): void {\r\n this._nodePoseTracker.clear(false);\r\n this._runtimeNodeMap = nodeMap;\r\n this._runtimeAnchorOffsets = new WeakMap();\r\n this._runtimeRestLengths = new WeakMap();\r\n this.clearRuntimeCaches();\r\n }\r\n\r\n /**\r\n * Rebuilds particle history from the current runtime-remapped node pose.\r\n * This must be called after a hierarchy graft or skeleton rebind.\r\n */\r\n reinitializeFromCurrentPose(options?: SpringPoseReinitializeOptions): void {\r\n this._nodePoseTracker.clear(false);\r\n const recomputeAnchorOffsets = options?.recomputeAnchorOffsets ?? true;\r\n const recalculateRestLengths = options?.recalculateRestLengths ?? true;\r\n this._runtimeAnchorOffsets = new WeakMap();\r\n this._runtimeRestLengths = new WeakMap();\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n const particleNode = this.resolveRuntimeNode(particle.node);\r\n let position = particleNode\r\n ? new Vector3(\r\n particleNode.worldMatrix.m03,\r\n particleNode.worldMatrix.m13,\r\n particleNode.worldMatrix.m23\r\n )\r\n : particle.position.clone();\r\n const anchorNode = this.resolveRuntimeNode(particle.anchorNode);\r\n if (particle.fixed && anchorNode) {\r\n let anchorOffset = particle.anchorOffset;\r\n if (recomputeAnchorOffsets && anchorOffset && particleNode) {\r\n anchorOffset = anchorNode.worldToThis(position, new Vector3());\r\n this._runtimeAnchorOffsets.set(particle, anchorOffset);\r\n }\r\n position = anchorOffset\r\n ? anchorNode.worldMatrix.transformPointAffine(anchorOffset, new Vector3())\r\n : new Vector3(anchorNode.worldMatrix.m03, anchorNode.worldMatrix.m13, anchorNode.worldMatrix.m23);\r\n }\r\n particle.position.set(position);\r\n particle.prevPosition.set(position);\r\n particle.animPosition.set(position);\r\n particle.lastFramePosition.set(position);\r\n if (particle.positionHistory) {\r\n particle.positionHistory.length = 0;\r\n }\r\n }\r\n\r\n for (const constraint of chain.constraints) {\r\n constraint.lambda = 0;\r\n if (recalculateRestLengths) {\r\n this._runtimeRestLengths.set(\r\n constraint,\r\n Vector3.distance(\r\n chain.particles[constraint.particleA].position,\r\n chain.particles[constraint.particleB].position\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n for (const constraint of this._interChainConstraints) {\r\n constraint.lambda = 0;\r\n if (recalculateRestLengths) {\r\n const particleA = this._chains[constraint.chainAIndex]?.particles[constraint.particleAIndex];\r\n const particleB = this._chains[constraint.chainBIndex]?.particles[constraint.particleBIndex];\r\n if (particleA && particleB) {\r\n this._runtimeRestLengths.set(constraint, Vector3.distance(particleA.position, particleB.position));\r\n }\r\n }\r\n }\r\n\r\n for (const collider of this._colliders) {\r\n const colliderNode = this.resolveRuntimeNode(collider.node);\r\n if (colliderNode) {\r\n updateColliderFromNode(collider, colliderNode);\r\n }\r\n }\r\n this.clearRuntimeCaches();\r\n }\r\n\r\n private simulateStep(dt: number, inputDeltaTime: number): void {\r\n if (this._enableInertialForces) {\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n particle.lastFramePosition.set(particle.position);\r\n }\r\n }\r\n }\r\n\r\n this.updateFixedParticles(inputDeltaTime);\r\n\r\n let rotationCenter: Vector3 | null = null;\r\n let angularVelocity: Vector3 | null = null;\r\n\r\n if (this._enableInertialForces && dt > 0.0001) {\r\n const result = this.calculateGlobalRotation(dt);\r\n rotationCenter = result.center;\r\n angularVelocity = result.omega;\r\n }\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n\r\n const velocity = Vector3.sub(particle.position, particle.prevPosition, new Vector3());\r\n velocity.scaleBy(particle.damping);\r\n\r\n const acceleration = Vector3.add(this._gravity, this._wind, new Vector3());\r\n if (this._enableInertialForces && rotationCenter && angularVelocity) {\r\n const inertialAccel = this.calculateInertialAcceleration(\r\n particle,\r\n rotationCenter,\r\n angularVelocity,\r\n velocity,\r\n this._centrifugalScale,\r\n this._coriolisScale\r\n );\r\n Vector3.add(acceleration, inertialAccel, acceleration);\r\n }\r\n\r\n const positionDelta = Vector3.scale(acceleration, dt * dt, new Vector3());\r\n Vector3.add(velocity, positionDelta, velocity);\r\n\r\n particle.prevPosition.set(particle.position);\r\n Vector3.add(particle.position, velocity, particle.position);\r\n }\r\n }\r\n\r\n if (this._solver === 'xpbd') {\r\n this.resetConstraintLambdas();\r\n }\r\n\r\n for (let iter = 0; iter < this._iterations; iter++) {\r\n for (const chain of this._chains) {\r\n for (const constraint of chain.constraints) {\r\n if (this._solver === 'xpbd') {\r\n this.solveConstraintXPBD(chain, constraint, dt);\r\n } else {\r\n this.solveConstraint(chain, constraint);\r\n }\r\n }\r\n }\r\n\r\n for (const constraint of this._interChainConstraints) {\r\n if (this._solver === 'xpbd') {\r\n this.solveInterChainConstraintXPBD(constraint, dt);\r\n } else {\r\n this.solveInterChainConstraint(constraint);\r\n }\r\n }\r\n\r\n this.solvePosePreservation(this._iterations);\r\n this.solveCollisions(inputDeltaTime);\r\n }\r\n }\r\n\r\n private updateFixedParticles(deltaTime: number): void {\r\n const blend = this.getTemporalBlendFactor(deltaTime, DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME);\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n const sourceNode = this.resolveRuntimeNode(particle.anchorNode ?? particle.node);\r\n if (!sourceNode) {\r\n continue;\r\n }\r\n const anchorOffset = this._runtimeAnchorOffsets.get(particle) ?? particle.anchorOffset;\r\n const worldPos = anchorOffset\r\n ? sourceNode.worldMatrix.transformPointAffine(anchorOffset)\r\n : new Vector3(sourceNode.worldMatrix.m03, sourceNode.worldMatrix.m13, sourceNode.worldMatrix.m23);\r\n const smoothedTarget = this.getSmoothedParticleTarget(particle, worldPos, blend);\r\n particle.animPosition.set(smoothedTarget);\r\n if (particle.fixed) {\r\n particle.position.set(smoothedTarget);\r\n particle.prevPosition.set(smoothedTarget);\r\n if (this._enableInertialForces) {\r\n if (!particle.positionHistory) {\r\n particle.positionHistory = [];\r\n }\r\n particle.positionHistory.push(smoothedTarget.clone());\r\n if (particle.positionHistory.length > 5) {\r\n particle.positionHistory.shift();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private solvePosePreservation(totalIterations: number): void {\r\n if (this._poseFollowRoot <= 0 && this._poseFollowTip <= 0) {\r\n return;\r\n }\r\n\r\n for (const chain of this._chains) {\r\n const lastIndex = Math.max(1, chain.particles.length - 1);\r\n for (let i = 0; i < chain.particles.length; i++) {\r\n const particle = chain.particles[i];\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n\r\n const t = Math.pow(i / lastIndex, this._poseFollowExponent);\r\n const particlePoseFollow = this.lerp(this._poseFollowRoot, this._poseFollowTip, t);\r\n const iterationFollow =\r\n totalIterations > 1\r\n ? 1 - Math.pow(Math.max(0, 1 - particlePoseFollow), 1 / totalIterations)\r\n : particlePoseFollow;\r\n const toAnim = Vector3.sub(particle.animPosition, particle.position, new Vector3());\r\n const correction = Vector3.scale(toAnim, iterationFollow, new Vector3());\r\n Vector3.add(particle.position, correction, particle.position);\r\n\r\n const particleMaxPoseOffset = this.lerp(this._maxPoseOffsetRoot, this._maxPoseOffsetTip, t);\r\n if (particleMaxPoseOffset > 0) {\r\n const offset = Vector3.sub(particle.position, particle.animPosition, new Vector3());\r\n const offsetLen = offset.magnitude;\r\n if (offsetLen > particleMaxPoseOffset && offsetLen > 1e-6) {\r\n offset.scaleBy(particleMaxPoseOffset / offsetLen);\r\n Vector3.add(particle.animPosition, offset, particle.position);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private solveCollisions(deltaTime: number): void {\r\n const blend = this.getTemporalBlendFactor(deltaTime, DEFAULT_COLLIDER_SMOOTHING_TIME);\r\n const spheres: SphereCollider[] = [];\r\n const capsules: CapsuleCollider[] = [];\r\n const planes: PlaneCollider[] = [];\r\n\r\n for (const collider of this._colliders) {\r\n const colliderNode = this.resolveRuntimeNode(collider.node);\r\n if (colliderNode) {\r\n updateColliderFromNode(collider, colliderNode);\r\n }\r\n if (!collider.enabled) {\r\n continue;\r\n }\r\n switch (collider.type) {\r\n case 'sphere': {\r\n const source = collider as SphereCollider;\r\n spheres.push({\r\n ...source,\r\n center: this.getSmoothedSphereCenter(source, blend)\r\n });\r\n break;\r\n }\r\n case 'capsule': {\r\n const source = collider as CapsuleCollider;\r\n const endpoints = this.getSmoothedCapsuleEndpoints(source, blend);\r\n capsules.push({\r\n ...source,\r\n start: endpoints.start,\r\n end: endpoints.end\r\n });\r\n break;\r\n }\r\n case 'plane': {\r\n const source = collider as PlaneCollider;\r\n const plane = this.getSmoothedPlaneData(source, blend);\r\n planes.push({\r\n ...source,\r\n point: plane.point,\r\n normal: plane.normal\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n const positionBeforeCollision = particle.position.clone();\r\n let collided = false;\r\n for (const collider of spheres) {\r\n collided = resolveSphereCollision(particle.position, collider) || collided;\r\n }\r\n for (const collider of capsules) {\r\n collided = resolveCapsuleCollision(particle.position, collider) || collided;\r\n }\r\n for (const collider of planes) {\r\n collided = resolvePlaneCollision(particle.position, collider) || collided;\r\n }\r\n if (collided) {\r\n Vector3.add(\r\n particle.prevPosition,\r\n Vector3.sub(particle.position, positionBeforeCollision, new Vector3()),\r\n particle.prevPosition\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n private calculateGlobalRotation(dt: number): { center: Vector3; omega: Vector3 } {\r\n const fixedParticles: any[] = [];\r\n const velocities: Vector3[] = [];\r\n const drivenNodes = new Set<SceneNode>();\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n const node = this.resolveRuntimeNode(particle.node);\r\n if (node) {\r\n drivenNodes.add(node);\r\n }\r\n }\r\n }\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n if (!particle.fixed || !this.isExternalInertialAnchor(particle, drivenNodes)) {\r\n continue;\r\n }\r\n const velocity = Vector3.sub(particle.position, particle.lastFramePosition, new Vector3());\r\n velocity.scaleBy(1.0 / dt);\r\n if (velocity.magnitudeSq > 0.001) {\r\n fixedParticles.push(particle);\r\n velocities.push(velocity);\r\n }\r\n }\r\n }\r\n\r\n if (fixedParticles.length === 0) {\r\n return { center: new Vector3(0, 0, 0), omega: new Vector3(0, 0, 0) };\r\n }\r\n\r\n let center: Vector3;\r\n if (fixedParticles.length === 1) {\r\n center = this.estimateRotationCenterFromHistory(fixedParticles[0], velocities[0]);\r\n } else {\r\n center = new Vector3(0, 0, 0);\r\n for (const particle of fixedParticles) {\r\n Vector3.add(center, particle.position, center);\r\n }\r\n center.scaleBy(1.0 / fixedParticles.length);\r\n }\r\n\r\n let sumOmega = new Vector3(0, 0, 0);\r\n let count = 0;\r\n for (let i = 0; i < fixedParticles.length; i++) {\r\n const r = Vector3.sub(fixedParticles[i].position, center, new Vector3());\r\n const v = velocities[i];\r\n const rLengthSq = r.magnitudeSq;\r\n if (rLengthSq > 0.0001) {\r\n const omega = Vector3.cross(r, v, new Vector3());\r\n omega.scaleBy(1.0 / rLengthSq);\r\n Vector3.add(sumOmega, omega, sumOmega);\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n sumOmega.scaleBy(1.0 / count);\r\n }\r\n return { center, omega: sumOmega };\r\n }\r\n\r\n private estimateRotationCenterFromHistory(particle: any, currentVelocity: Vector3): Vector3 {\r\n const history = particle.positionHistory;\r\n if (!history || history.length < 3) {\r\n const speed = currentVelocity.magnitude;\r\n if (speed < 0.001) {\r\n return particle.position.clone();\r\n }\r\n\r\n const estimatedRadius = Math.max(0.5, speed * 0.5);\r\n const up = new Vector3(0, 1, 0);\r\n const perpDir = Vector3.cross(currentVelocity, up, new Vector3());\r\n if (perpDir.magnitudeSq < 0.0001) {\r\n perpDir.set(new Vector3(1, 0, 0));\r\n } else {\r\n perpDir.inplaceNormalize();\r\n }\r\n\r\n return Vector3.add(\r\n particle.position,\r\n Vector3.scale(perpDir, estimatedRadius, new Vector3()),\r\n new Vector3()\r\n );\r\n }\r\n\r\n const p1 = history[0];\r\n const p2 = history[Math.floor(history.length / 2)];\r\n const p3 = history[history.length - 1];\r\n return this.calculateCircleCenter(p1, p2, p3);\r\n }\r\n\r\n private calculateCircleCenter(p1: Vector3, p2: Vector3, p3: Vector3): Vector3 {\r\n const mid12 = Vector3.scale(Vector3.add(p1, p2, new Vector3()), 0.5, new Vector3());\r\n const mid23 = Vector3.scale(Vector3.add(p2, p3, new Vector3()), 0.5, new Vector3());\r\n const dir12 = Vector3.sub(p2, p1, new Vector3());\r\n const dir23 = Vector3.sub(p3, p2, new Vector3());\r\n const normal = Vector3.cross(dir12, dir23, new Vector3());\r\n\r\n if (normal.magnitudeSq < 0.0001) {\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n normal.inplaceNormalize();\r\n const perp12 = Vector3.cross(dir12, normal, new Vector3()).inplaceNormalize();\r\n const perp23 = Vector3.cross(dir23, normal, new Vector3()).inplaceNormalize();\r\n const diff = Vector3.sub(mid23, mid12, new Vector3());\r\n const det = perp12.x * perp23.y - perp12.y * perp23.x;\r\n\r\n if (Math.abs(det) > 0.0001) {\r\n const t = (diff.x * perp23.y - diff.y * perp23.x) / det;\r\n return Vector3.add(mid12, Vector3.scale(perp12, t, new Vector3()), new Vector3());\r\n }\r\n\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n private calculateInertialAcceleration(\r\n particle: any,\r\n rotationCenter: Vector3,\r\n angularVelocity: Vector3,\r\n particleVelocity: Vector3,\r\n centrifugalScale: number,\r\n coriolisScale: number\r\n ): Vector3 {\r\n const r = Vector3.sub(particle.position, rotationCenter, new Vector3());\r\n const omegaCrossR = Vector3.cross(angularVelocity, r, new Vector3());\r\n const centrifugalAccel = Vector3.cross(angularVelocity, omegaCrossR, new Vector3());\r\n centrifugalAccel.scaleBy(centrifugalScale);\r\n const coriolisAccel = Vector3.cross(angularVelocity, particleVelocity, new Vector3());\r\n coriolisAccel.scaleBy(-2.0 * coriolisScale);\r\n return Vector3.add(centrifugalAccel, coriolisAccel, new Vector3());\r\n }\r\n\r\n private solveConstraint(chain: SpringChain, constraint: SpringConstraint): void {\r\n const pA = chain.particles[constraint.particleA];\r\n const pB = chain.particles[constraint.particleB];\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const diff = (currentLength - this.getRuntimeRestLength(constraint)) / currentLength;\r\n const correction = Vector3.scale(delta, diff * constraint.stiffness * 0.5, new Vector3());\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, correction, pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.sub(pB.position, correction, pB.position);\r\n }\r\n }\r\n\r\n private solveInterChainConstraint(constraint: InterChainConstraint): void {\r\n const chainA = this._chains[constraint.chainAIndex];\r\n const chainB = this._chains[constraint.chainBIndex];\r\n const pA = chainA.particles[constraint.particleAIndex];\r\n const pB = chainB.particles[constraint.particleBIndex];\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const diff = (currentLength - this.getRuntimeRestLength(constraint)) / currentLength;\r\n const correction = Vector3.scale(delta, diff * constraint.stiffness * 0.5, new Vector3());\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, correction, pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.sub(pB.position, correction, pB.position);\r\n }\r\n }\r\n\r\n private solveConstraintXPBD(chain: SpringChain, constraint: SpringConstraint, dt: number): void {\r\n const pA = chain.particles[constraint.particleA];\r\n const pB = chain.particles[constraint.particleB];\r\n const wA = pA.fixed ? 0 : 1.0 / pA.mass;\r\n const wB = pB.fixed ? 0 : 1.0 / pB.mass;\r\n const wSum = wA + wB;\r\n if (wSum < 1e-10) {\r\n return;\r\n }\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const C = currentLength - this.getRuntimeRestLength(constraint);\r\n const alphaTilde = constraint.compliance / (dt * dt);\r\n const deltaLambda = (-C - alphaTilde * constraint.lambda) / (wSum + alphaTilde);\r\n constraint.lambda += deltaLambda;\r\n const n = Vector3.scale(delta, 1.0 / currentLength, new Vector3());\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, Vector3.scale(n, -wA * deltaLambda, new Vector3()), pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.add(pB.position, Vector3.scale(n, wB * deltaLambda, new Vector3()), pB.position);\r\n }\r\n }\r\n\r\n private solveInterChainConstraintXPBD(constraint: InterChainConstraint, dt: number): void {\r\n const chainA = this._chains[constraint.chainAIndex];\r\n const chainB = this._chains[constraint.chainBIndex];\r\n const pA = chainA.particles[constraint.particleAIndex];\r\n const pB = chainB.particles[constraint.particleBIndex];\r\n const wA = pA.fixed ? 0 : 1.0 / pA.mass;\r\n const wB = pB.fixed ? 0 : 1.0 / pB.mass;\r\n const wSum = wA + wB;\r\n if (wSum < 1e-10) {\r\n return;\r\n }\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const C = currentLength - this.getRuntimeRestLength(constraint);\r\n const alphaTilde = constraint.compliance / (dt * dt);\r\n const deltaLambda = (-C - alphaTilde * constraint.lambda) / (wSum + alphaTilde);\r\n constraint.lambda += deltaLambda;\r\n const n = Vector3.scale(delta, 1.0 / currentLength, new Vector3());\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, Vector3.scale(n, -wA * deltaLambda, new Vector3()), pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.add(pB.position, Vector3.scale(n, wB * deltaLambda, new Vector3()), pB.position);\r\n }\r\n }\r\n\r\n private collectChainNodeRotations(\r\n chain: SpringChain,\r\n weight: number,\r\n baseNodeStates: Map<any, { position: Vector3; rotation: Quaternion }>,\r\n desiredWorldRotations: Map<any, Quaternion>\r\n ): void {\r\n for (let i = 0; i < chain.particles.length - 1; i++) {\r\n const particle = chain.particles[i];\r\n const nextParticle = chain.particles[i + 1];\r\n const node = this.resolveRuntimeNode(particle.node);\r\n if (!node) {\r\n continue;\r\n }\r\n\r\n const nextNode = this.resolveRuntimeNode(nextParticle.node);\r\n if (!nextNode) {\r\n continue;\r\n }\r\n\r\n let nodeState = baseNodeStates.get(node);\r\n if (!nodeState) {\r\n const currentBoneRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, currentBoneRotation, null);\r\n nodeState = {\r\n position: new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23),\r\n rotation: currentBoneRotation\r\n };\r\n baseNodeStates.set(node, nodeState);\r\n }\r\n let nextNodeState = baseNodeStates.get(nextNode);\r\n if (!nextNodeState) {\r\n const nextBoneRotation = new Quaternion();\r\n nextNode.worldMatrix.decompose(null, nextBoneRotation, null);\r\n nextNodeState = {\r\n position: new Vector3(nextNode.worldMatrix.m03, nextNode.worldMatrix.m13, nextNode.worldMatrix.m23),\r\n rotation: nextBoneRotation\r\n };\r\n baseNodeStates.set(nextNode, nextNodeState);\r\n }\r\n\r\n const originalDir = Vector3.sub(nextNodeState.position, nodeState.position, new Vector3());\r\n const currentBoneRotation = nodeState.rotation;\r\n\r\n const newDir = Vector3.sub(nextParticle.position, particle.position, new Vector3());\r\n const deltaRotation = new Quaternion();\r\n IKUtils.fromToRotation(originalDir, newDir, deltaRotation);\r\n let worldRotation = Quaternion.multiply(deltaRotation, currentBoneRotation, new Quaternion());\r\n\r\n if (weight < 1) {\r\n Quaternion.slerp(currentBoneRotation, worldRotation, weight, worldRotation);\r\n }\r\n\r\n desiredWorldRotations.set(node, worldRotation);\r\n }\r\n }\r\n\r\n private getNodeDepth(node: any): number {\r\n let depth = 0;\r\n let current = node?.parent;\r\n while (current) {\r\n depth++;\r\n current = current.parent;\r\n }\r\n return depth;\r\n }\r\n\r\n private resetConstraintLambdas(): void {\r\n for (const chain of this._chains) {\r\n for (const constraint of chain.constraints) {\r\n constraint.lambda = 0;\r\n }\r\n }\r\n for (const constraint of this._interChainConstraints) {\r\n constraint.lambda = 0;\r\n }\r\n }\r\n\r\n private resolveRuntimeNode(node: SceneNode | null | undefined): SceneNode | null {\r\n return node ? (this._runtimeNodeMap?.get(node) ?? node) : null;\r\n }\r\n\r\n private isExternalInertialAnchor(particle: SpringParticle, drivenNodes: Set<SceneNode>): boolean {\r\n const particleNode = this.resolveRuntimeNode(particle.node);\r\n let current = this.resolveRuntimeNode(particle.anchorNode ?? particle.node);\r\n while (current) {\r\n if (current !== particleNode && drivenNodes.has(current)) {\r\n return false;\r\n }\r\n current = current.parent;\r\n }\r\n return true;\r\n }\r\n\r\n private getRuntimeRestLength(constraint: SpringConstraint | InterChainConstraint): number {\r\n return this._runtimeRestLengths.get(constraint) ?? constraint.restLength;\r\n }\r\n\r\n private clearRuntimeCaches(): void {\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n }\r\n\r\n private lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n }\r\n\r\n private getTemporalBlendFactor(deltaTime: number, smoothingTime: number): number {\r\n const dt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (smoothingTime <= 0) {\r\n return 1;\r\n }\r\n if (dt <= 0) {\r\n return 0;\r\n }\r\n return 1 - Math.exp(-dt / smoothingTime);\r\n }\r\n\r\n private getSmoothedParticleTarget(target: object, current: Vector3, blend: number): Vector3 {\r\n const cached = this._smoothedParticleTargets.get(target);\r\n if (!cached || blend >= 1) {\r\n const next = current.clone();\r\n this._smoothedParticleTargets.set(target, next);\r\n return next;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedSphereCenter(collider: SphereCollider, blend: number): Vector3 {\r\n const current = collider.center?.clone() ?? new Vector3();\r\n const cached = this._smoothedSphereCenters.get(collider);\r\n if (!cached || blend >= 1) {\r\n this._smoothedSphereCenters.set(collider, current);\r\n return current;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedCapsuleEndpoints(\r\n collider: CapsuleCollider,\r\n blend: number\r\n ): { start: Vector3; end: Vector3 } {\r\n const currentStart = collider.start?.clone() ?? new Vector3();\r\n const currentEnd = collider.end?.clone() ?? new Vector3();\r\n const cached = this._smoothedCapsuleEndpoints.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = { start: currentStart, end: currentEnd };\r\n this._smoothedCapsuleEndpoints.set(collider, next);\r\n return next;\r\n }\r\n cached.start.setXYZ(\r\n cached.start.x + (currentStart.x - cached.start.x) * blend,\r\n cached.start.y + (currentStart.y - cached.start.y) * blend,\r\n cached.start.z + (currentStart.z - cached.start.z) * blend\r\n );\r\n cached.end.setXYZ(\r\n cached.end.x + (currentEnd.x - cached.end.x) * blend,\r\n cached.end.y + (currentEnd.y - cached.end.y) * blend,\r\n cached.end.z + (currentEnd.z - cached.end.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedPlaneData(collider: PlaneCollider, blend: number): { point: Vector3; normal: Vector3 } {\r\n const currentPoint = collider.point?.clone() ?? new Vector3();\r\n const currentNormal = collider.normal?.clone() ?? new Vector3(0, 1, 0);\r\n const cached = this._smoothedPlaneData.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = { point: currentPoint, normal: currentNormal };\r\n this._smoothedPlaneData.set(collider, next);\r\n return next;\r\n }\r\n cached.point.setXYZ(\r\n cached.point.x + (currentPoint.x - cached.point.x) * blend,\r\n cached.point.y + (currentPoint.y - cached.point.y) * blend,\r\n cached.point.z + (currentPoint.z - cached.point.z) * blend\r\n );\r\n cached.normal.setXYZ(\r\n cached.normal.x + (currentNormal.x - cached.normal.x) * blend,\r\n cached.normal.y + (currentNormal.y - cached.normal.y) * blend,\r\n cached.normal.z + (currentNormal.z - cached.normal.z) * blend\r\n );\r\n cached.normal.inplaceNormalize();\r\n return cached;\r\n }\r\n}\r\n"],"names":["FIXED_SIMULATION_TIME_STEP","MAX_ACCUMULATED_SIMULATION_TIME","MAX_SIMULATION_STEPS_PER_UPDATE","Math","max","ceil","DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME","DEFAULT_COLLIDER_SMOOTHING_TIME","MultiChainSpringSystem","_chains","_interChainConstraints","_iterations","_gravity","_wind","_enableInertialForces","_centrifugalScale","_coriolisScale","_solver","_poseFollow","_maxPoseOffset","_poseFollowRoot","_poseFollowTip","_poseFollowExponent","_maxPoseOffsetRoot","_maxPoseOffsetTip","_colliders","_timeAccumulator","_smoothedParticleTargets","_smoothedSphereCenters","_smoothedCapsuleEndpoints","_smoothedPlaneData","_runtimeNodeMap","_runtimeAnchorOffsets","_runtimeRestLengths","_nodePoseTracker","options","iterations","gravity","clone","Vector3","wind","enableInertialForces","centrifugalScale","coriolisScale","solver","min","poseFollow","maxPoseOffset","poseFollowRoot","poseFollowTip","poseFollowExponent","maxPoseOffsetRoot","maxPoseOffsetTip","WeakMap","SpringNodePoseTracker","addChain","chain","push","length","addInterChainConstraint","constraint","createRadialConstraints","skipRows","connectDistance","compliance","i","offset","j","chainA","chainB","minLength","particles","row","pA","pB","distance","position","maxDistance","chainAIndex","chainBIndex","particleAIndex","particleBIndex","restLength","stiffness","lambda","update","deltaTime","restoreInputPose","frameDt","Number","stepCount","floor","simulateStep","applyToNodes","weight","baseNodeStates","Map","desiredWorldRotations","collectChainNodeRotations","nodes","Array","from","keys","sort","a","b","getNodeDepth","node","worldRotation","get","parent","inputRotation","rotation","parentWorldRotation","Quaternion","worldMatrix","decompose","parentInvRotation","conjugate","localRotation","multiply","recordAppliedRotation","reset","clear","particle","animPosition","set","originalPosition","lastFramePosition","positionHistory","chains","interChainConstraints","count","enabled","scale","type","resetConstraintLambdas","value","v","addCollider","collider","removeCollider","index","indexOf","splice","clearColliders","colliders","setRuntimeNodeMap","nodeMap","clearRuntimeCaches","reinitializeFromCurrentPose","recomputeAnchorOffsets","recalculateRestLengths","particleNode","resolveRuntimeNode","m03","m13","m23","anchorNode","fixed","anchorOffset","worldToThis","transformPointAffine","prevPosition","constraints","particleA","particleB","colliderNode","updateColliderFromNode","dt","inputDeltaTime","updateFixedParticles","rotationCenter","angularVelocity","result","calculateGlobalRotation","center","omega","velocity","sub","scaleBy","damping","acceleration","add","inertialAccel","calculateInertialAcceleration","positionDelta","iter","solveConstraintXPBD","solveConstraint","solveInterChainConstraintXPBD","solveInterChainConstraint","solvePosePreservation","solveCollisions","blend","getTemporalBlendFactor","sourceNode","worldPos","smoothedTarget","getSmoothedParticleTarget","shift","totalIterations","lastIndex","t","pow","particlePoseFollow","lerp","iterationFollow","toAnim","correction","particleMaxPoseOffset","offsetLen","magnitude","spheres","capsules","planes","source","getSmoothedSphereCenter","endpoints","getSmoothedCapsuleEndpoints","start","end","plane","getSmoothedPlaneData","point","normal","positionBeforeCollision","collided","resolveSphereCollision","resolveCapsuleCollision","resolvePlaneCollision","fixedParticles","velocities","drivenNodes","Set","isExternalInertialAnchor","magnitudeSq","estimateRotationCenterFromHistory","sumOmega","r","rLengthSq","cross","currentVelocity","history","speed","estimatedRadius","up","perpDir","inplaceNormalize","p1","p2","p3","calculateCircleCenter","mid12","mid23","dir12","dir23","perp12","perp23","diff","det","x","y","abs","particleVelocity","omegaCrossR","centrifugalAccel","coriolisAccel","delta","currentLength","getRuntimeRestLength","wA","mass","wB","wSum","C","alphaTilde","deltaLambda","n","nextParticle","nextNode","nodeState","currentBoneRotation","nextNodeState","nextBoneRotation","originalDir","newDir","deltaRotation","IKUtils","fromToRotation","slerp","depth","current","has","smoothingTime","exp","target","cached","next","setXYZ","z","currentStart","currentEnd","currentPoint","currentNormal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi_chain_spring_system.js","sources":["../../../src/animation/spring/multi_chain_spring_system.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport type { SpringChain } from './spring_chain';\r\nimport type { SpringParticle } from './spring_particle';\r\nimport type { SpringConstraint } from './spring_constraint';\r\nimport { IKUtils } from '../ik/ik_utils';\r\nimport type { SpringCollider } from './spring_collider';\r\nimport {\r\n resolveSphereCollision,\r\n resolveCapsuleCollision,\r\n resolvePlaneCollision,\r\n resolveBoxCollision,\r\n type CapsuleCollider,\r\n type BoxCollider,\r\n type PlaneCollider,\r\n type SphereCollider,\r\n updateColliderFromNode\r\n} from './spring_collider';\r\nimport { SpringNodePoseTracker } from './spring_node_pose_tracker';\r\nimport {\r\n DEFAULT_INITIAL_COLLISION_PENETRATION_RELEASE_TIME,\r\n getIterationStrength,\r\n getKawaiiPoseTarget,\r\n getReleasedCollisionPenetration,\r\n getSpringPoseTopology,\r\n INITIAL_COLLISION_PENETRATION_SLOP,\r\n interpolateSpringValue,\r\n measureCollisionPenetration,\r\n resolveInelasticCollision,\r\n solveAngleLimit,\r\n solveDistanceConstraint,\r\n type SpringMotionModel\r\n} from './spring_solver';\r\n\r\nexport interface InterChainConstraint {\r\n chainAIndex: number;\r\n chainBIndex: number;\r\n particleAIndex: number;\r\n particleBIndex: number;\r\n restLength: number;\r\n stiffness: number;\r\n compliance: number;\r\n lambda: number;\r\n}\r\n\r\nexport interface MultiChainSpringSystemOptions {\r\n /** Integration behavior. `kawaii` preserves animated local shape while simulating (default: `kawaii`). */\r\n motionModel?: SpringMotionModel;\r\n iterations?: number;\r\n gravity?: Vector3;\r\n wind?: Vector3;\r\n enableInertialForces?: boolean;\r\n centrifugalScale?: number;\r\n coriolisScale?: number;\r\n solver?: 'verlet' | 'xpbd';\r\n poseFollow?: number;\r\n poseFollowRoot?: number;\r\n poseFollowTip?: number;\r\n poseFollowExponent?: number;\r\n maxPoseOffset?: number;\r\n maxPoseOffsetRoot?: number;\r\n maxPoseOffsetTip?: number;\r\n /** Root angle limit in degrees. 0 disables angle limiting. */\r\n angleLimitRoot?: number;\r\n /** Tip angle limit in degrees. 0 disables angle limiting. */\r\n angleLimitTip?: number;\r\n /** Fraction of XPBD positional correction retained in Verlet history (default: 0.35). */\r\n constraintVelocityHistoryRetention?: number;\r\n /** Temporarily preserve collider overlap present in the initialized pose while blocking deeper penetration. */\r\n preserveInitialCollisionPenetration?: boolean;\r\n /** Seconds used to smoothly release preserved startup overlap (default: 0.25). */\r\n initialCollisionPenetrationReleaseTime?: number;\r\n}\r\n\r\n/** Options used when rebuilding runtime spring state from the current node pose. */\r\nexport interface SpringPoseReinitializeOptions {\r\n /** Recompute maintained anchor offsets against runtime-remapped anchor nodes. */\r\n recomputeAnchorOffsets?: boolean;\r\n /** Recompute structural and inter-chain rest lengths from the current pose. */\r\n recalculateRestLengths?: boolean;\r\n}\r\n\r\nconst FIXED_SIMULATION_TIME_STEP = 1 / 60;\r\nconst MAX_ACCUMULATED_SIMULATION_TIME = 1 / 20;\r\nconst MAX_SIMULATION_STEPS_PER_UPDATE = Math.max(\r\n 1,\r\n Math.ceil(MAX_ACCUMULATED_SIMULATION_TIME / FIXED_SIMULATION_TIME_STEP)\r\n);\r\nconst DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME = 1 / 30;\r\nconst DEFAULT_COLLIDER_SMOOTHING_TIME = 1 / 30;\r\n\r\nexport class MultiChainSpringSystem {\r\n private _chains: SpringChain[];\r\n private _interChainConstraints: InterChainConstraint[];\r\n private _iterations: number;\r\n private _gravity: Vector3;\r\n private _wind: Vector3;\r\n private _enableInertialForces: boolean;\r\n private _centrifugalScale: number;\r\n private _coriolisScale: number;\r\n private _solver: 'verlet' | 'xpbd';\r\n private _poseFollow: number;\r\n private _maxPoseOffset: number;\r\n private _poseFollowRoot: number;\r\n private _poseFollowTip: number;\r\n private _poseFollowExponent: number;\r\n private _maxPoseOffsetRoot: number;\r\n private _maxPoseOffsetTip: number;\r\n private _colliders: SpringCollider[];\r\n private _timeAccumulator: number;\r\n private _smoothedParticleTargets: WeakMap<object, Vector3>;\r\n private _smoothedSphereCenters: WeakMap<SphereCollider, Vector3>;\r\n private _smoothedCapsuleEndpoints: WeakMap<CapsuleCollider, { start: Vector3; end: Vector3 }>;\r\n private _smoothedPlaneData: WeakMap<PlaneCollider, { point: Vector3; normal: Vector3 }>;\r\n private _smoothedBoxData: WeakMap<\r\n BoxCollider,\r\n { center: Vector3; halfExtents: Vector3; axes: [Vector3, Vector3, Vector3] }\r\n >;\r\n private _runtimeNodeMap: ReadonlyMap<SceneNode, SceneNode> | null;\r\n private _runtimeAnchorOffsets: WeakMap<SpringParticle, Vector3>;\r\n private _runtimeRestLengths: WeakMap<object, number>;\r\n private _nodePoseTracker: SpringNodePoseTracker;\r\n private _motionModel: SpringMotionModel;\r\n private _angleLimitRoot: number;\r\n private _angleLimitTip: number;\r\n private _constraintVelocityHistoryRetention: number;\r\n private _preserveInitialCollisionPenetration: boolean;\r\n private _initialCollisionPenetrationReleaseTime: number;\r\n private _initialCollisionPenetrationElapsed: number;\r\n private _initialCollisionPenetration: WeakMap<SpringParticle, WeakMap<SpringCollider, number>>;\r\n\r\n constructor(options?: MultiChainSpringSystemOptions) {\r\n this._chains = [];\r\n this._interChainConstraints = [];\r\n this._iterations = options?.iterations ?? 5;\r\n this._gravity = options?.gravity?.clone() ?? new Vector3(0, -9.8, 0);\r\n this._wind = options?.wind?.clone() ?? new Vector3(0, 0, 0);\r\n this._enableInertialForces = options?.enableInertialForces ?? true;\r\n this._centrifugalScale = options?.centrifugalScale ?? 1.0;\r\n this._coriolisScale = options?.coriolisScale ?? 1.0;\r\n this._solver = options?.solver ?? 'verlet';\r\n this._poseFollow = Math.max(0, Math.min(1, options?.poseFollow ?? 0.35));\r\n this._maxPoseOffset = Math.max(0, options?.maxPoseOffset ?? 0);\r\n this._poseFollowRoot = Math.max(0, Math.min(1, options?.poseFollowRoot ?? this._poseFollow));\r\n this._poseFollowTip = Math.max(0, Math.min(1, options?.poseFollowTip ?? this._poseFollow));\r\n this._poseFollowExponent = Math.max(0.1, options?.poseFollowExponent ?? 1.6);\r\n this._maxPoseOffsetRoot = Math.max(0, options?.maxPoseOffsetRoot ?? this._maxPoseOffset);\r\n this._maxPoseOffsetTip = Math.max(0, options?.maxPoseOffsetTip ?? this._maxPoseOffset);\r\n this._colliders = [];\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._runtimeNodeMap = null;\r\n this._runtimeAnchorOffsets = new WeakMap();\r\n this._runtimeRestLengths = new WeakMap();\r\n this._nodePoseTracker = new SpringNodePoseTracker();\r\n this._motionModel = options?.motionModel ?? 'kawaii';\r\n this._angleLimitRoot = Math.max(0, options?.angleLimitRoot ?? 0);\r\n this._angleLimitTip = Math.max(0, options?.angleLimitTip ?? this._angleLimitRoot);\r\n this._constraintVelocityHistoryRetention = Math.max(\r\n 0,\r\n Math.min(1, options?.constraintVelocityHistoryRetention ?? 0.35)\r\n );\r\n this._preserveInitialCollisionPenetration =\r\n options?.preserveInitialCollisionPenetration ?? this._motionModel === 'kawaii';\r\n this._initialCollisionPenetrationReleaseTime = Math.max(\r\n 0,\r\n options?.initialCollisionPenetrationReleaseTime ?? DEFAULT_INITIAL_COLLISION_PENETRATION_RELEASE_TIME\r\n );\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n addChain(chain: SpringChain): number {\r\n this._chains.push(chain);\r\n return this._chains.length - 1;\r\n }\r\n\r\n addInterChainConstraint(constraint: InterChainConstraint): void {\r\n this._interChainConstraints.push(constraint);\r\n }\r\n\r\n createRadialConstraints(options: {\r\n stiffness: number;\r\n maxDistance: number;\r\n skipRows?: number;\r\n connectDistance?: number;\r\n compliance?: number;\r\n }): void {\r\n const skipRows = options.skipRows ?? 0;\r\n const connectDistance = options.connectDistance ?? 1;\r\n const compliance = options.compliance ?? 0;\r\n\r\n for (let i = 0; i < this._chains.length; i++) {\r\n for (let offset = 1; offset <= connectDistance; offset++) {\r\n const j = (i + offset) % this._chains.length;\r\n const chainA = this._chains[i];\r\n const chainB = this._chains[j];\r\n const minLength = Math.min(chainA.particles.length, chainB.particles.length);\r\n\r\n for (let row = skipRows; row < minLength; row++) {\r\n const pA = chainA.particles[row];\r\n const pB = chainB.particles[row];\r\n const distance = Vector3.distance(pA.position, pB.position);\r\n if (distance <= options.maxDistance) {\r\n this.addInterChainConstraint({\r\n chainAIndex: i,\r\n chainBIndex: j,\r\n particleAIndex: row,\r\n particleBIndex: row,\r\n restLength: distance,\r\n stiffness: options.stiffness,\r\n compliance,\r\n lambda: 0\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n update(deltaTime: number): void {\r\n this._nodePoseTracker.restoreInputPose();\r\n const frameDt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (frameDt <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.min(this._timeAccumulator + frameDt, MAX_ACCUMULATED_SIMULATION_TIME);\r\n const stepCount = Math.min(\r\n MAX_SIMULATION_STEPS_PER_UPDATE,\r\n Math.floor((this._timeAccumulator + 1e-8) / FIXED_SIMULATION_TIME_STEP)\r\n );\r\n if (stepCount <= 0) {\r\n return;\r\n }\r\n this._timeAccumulator = Math.max(0, this._timeAccumulator - stepCount * FIXED_SIMULATION_TIME_STEP);\r\n for (let i = 0; i < stepCount; i++) {\r\n this.simulateStep(FIXED_SIMULATION_TIME_STEP, i === 0 ? frameDt : 0, i, stepCount);\r\n }\r\n }\r\n\r\n applyToNodes(weight: number = 1.0): void {\r\n const baseNodeStates = new Map<any, { position: Vector3; rotation: Quaternion }>();\r\n const desiredWorldRotations = new Map<any, Quaternion>();\r\n\r\n for (const chain of this._chains) {\r\n this.collectChainNodeRotations(chain, weight, baseNodeStates, desiredWorldRotations);\r\n }\r\n\r\n const nodes = Array.from(desiredWorldRotations.keys());\r\n nodes.sort((a, b) => this.getNodeDepth(a) - this.getNodeDepth(b));\r\n\r\n for (const node of nodes) {\r\n const worldRotation = desiredWorldRotations.get(node);\r\n if (!worldRotation) {\r\n continue;\r\n }\r\n const parent = node.parent;\r\n const inputRotation = node.rotation.clone();\r\n if (parent) {\r\n const parentWorldRotation = new Quaternion();\r\n parent.worldMatrix.decompose(null, parentWorldRotation, null);\r\n const parentInvRotation = Quaternion.conjugate(parentWorldRotation, new Quaternion());\r\n const localRotation = Quaternion.multiply(parentInvRotation, worldRotation, new Quaternion());\r\n node.rotation = localRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, localRotation);\r\n } else {\r\n node.rotation = worldRotation;\r\n this._nodePoseTracker.recordAppliedRotation(node, inputRotation, worldRotation);\r\n }\r\n }\r\n }\r\n\r\n reset(): void {\r\n this._nodePoseTracker.clear(true);\r\n for (const chain of this._chains) {\r\n chain.reset();\r\n for (const particle of chain.particles) {\r\n particle.animPosition.set(particle.originalPosition);\r\n particle.lastFramePosition.set(particle.originalPosition);\r\n if (particle.positionHistory) {\r\n particle.positionHistory.length = 0;\r\n }\r\n }\r\n }\r\n for (const constraint of this._interChainConstraints) {\r\n constraint.lambda = 0;\r\n }\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n get chains(): SpringChain[] {\r\n return this._chains;\r\n }\r\n\r\n get interChainConstraints(): InterChainConstraint[] {\r\n return this._interChainConstraints;\r\n }\r\n\r\n get gravity(): Vector3 {\r\n return this._gravity;\r\n }\r\n\r\n set gravity(gravity: Vector3) {\r\n this._gravity.set(gravity);\r\n }\r\n\r\n get wind(): Vector3 {\r\n return this._wind;\r\n }\r\n\r\n set wind(wind: Vector3) {\r\n this._wind.set(wind);\r\n }\r\n\r\n get iterations(): number {\r\n return this._iterations;\r\n }\r\n\r\n set iterations(count: number) {\r\n this._iterations = Math.max(1, count);\r\n }\r\n\r\n get enableInertialForces(): boolean {\r\n return this._enableInertialForces;\r\n }\r\n\r\n set enableInertialForces(enabled: boolean) {\r\n this._enableInertialForces = enabled;\r\n }\r\n\r\n get centrifugalScale(): number {\r\n return this._centrifugalScale;\r\n }\r\n\r\n set centrifugalScale(scale: number) {\r\n this._centrifugalScale = Math.max(0, scale);\r\n }\r\n\r\n get coriolisScale(): number {\r\n return this._coriolisScale;\r\n }\r\n\r\n set coriolisScale(scale: number) {\r\n this._coriolisScale = Math.max(0, scale);\r\n }\r\n\r\n get solver(): 'verlet' | 'xpbd' {\r\n return this._solver;\r\n }\r\n\r\n set solver(type: 'verlet' | 'xpbd') {\r\n if (this._solver !== type) {\r\n this._solver = type;\r\n if (type === 'xpbd') {\r\n this.resetConstraintLambdas();\r\n }\r\n }\r\n }\r\n\r\n get motionModel(): SpringMotionModel {\r\n return this._motionModel;\r\n }\r\n\r\n set motionModel(value: SpringMotionModel) {\r\n if (value !== 'legacy' && value !== 'kawaii') {\r\n return;\r\n }\r\n if (this._motionModel !== value) {\r\n this._motionModel = value;\r\n this.reset();\r\n }\r\n }\r\n\r\n get angleLimitRoot(): number {\r\n return this._angleLimitRoot;\r\n }\r\n\r\n set angleLimitRoot(value: number) {\r\n this._angleLimitRoot = Math.max(0, Number(value) || 0);\r\n }\r\n\r\n get angleLimitTip(): number {\r\n return this._angleLimitTip;\r\n }\r\n\r\n set angleLimitTip(value: number) {\r\n this._angleLimitTip = Math.max(0, Number(value) || 0);\r\n }\r\n\r\n get constraintVelocityHistoryRetention(): number {\r\n return this._constraintVelocityHistoryRetention;\r\n }\r\n\r\n set constraintVelocityHistoryRetention(value: number) {\r\n this._constraintVelocityHistoryRetention = Math.max(0, Math.min(1, Number(value) || 0));\r\n }\r\n\r\n get preserveInitialCollisionPenetration(): boolean {\r\n return this._preserveInitialCollisionPenetration;\r\n }\r\n\r\n set preserveInitialCollisionPenetration(value: boolean) {\r\n if (this._preserveInitialCollisionPenetration !== value) {\r\n this._preserveInitialCollisionPenetration = value;\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n }\r\n\r\n get initialCollisionPenetrationReleaseTime(): number {\r\n return this._initialCollisionPenetrationReleaseTime;\r\n }\r\n\r\n set initialCollisionPenetrationReleaseTime(value: number) {\r\n const duration = Math.max(0, Number(value) || 0);\r\n if (this._initialCollisionPenetrationReleaseTime !== duration) {\r\n this._initialCollisionPenetrationReleaseTime = duration;\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n }\r\n\r\n get poseFollow(): number {\r\n return this._poseFollow;\r\n }\r\n\r\n set poseFollow(value: number) {\r\n const v = Math.max(0, Math.min(1, value));\r\n this._poseFollow = v;\r\n this._poseFollowRoot = v;\r\n this._poseFollowTip = v;\r\n }\r\n\r\n get poseFollowRoot(): number {\r\n return this._poseFollowRoot;\r\n }\r\n\r\n set poseFollowRoot(value: number) {\r\n this._poseFollowRoot = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n get poseFollowTip(): number {\r\n return this._poseFollowTip;\r\n }\r\n\r\n set poseFollowTip(value: number) {\r\n this._poseFollowTip = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n get poseFollowExponent(): number {\r\n return this._poseFollowExponent;\r\n }\r\n\r\n set poseFollowExponent(value: number) {\r\n this._poseFollowExponent = Math.max(0.1, value);\r\n }\r\n\r\n get maxPoseOffset(): number {\r\n return this._maxPoseOffset;\r\n }\r\n\r\n set maxPoseOffset(value: number) {\r\n const v = Math.max(0, value);\r\n this._maxPoseOffset = v;\r\n this._maxPoseOffsetRoot = v;\r\n this._maxPoseOffsetTip = v;\r\n }\r\n\r\n get maxPoseOffsetRoot(): number {\r\n return this._maxPoseOffsetRoot;\r\n }\r\n\r\n set maxPoseOffsetRoot(value: number) {\r\n this._maxPoseOffsetRoot = Math.max(0, value);\r\n }\r\n\r\n get maxPoseOffsetTip(): number {\r\n return this._maxPoseOffsetTip;\r\n }\r\n\r\n set maxPoseOffsetTip(value: number) {\r\n this._maxPoseOffsetTip = Math.max(0, value);\r\n }\r\n\r\n addCollider(collider: SpringCollider): void {\r\n this._colliders.push(collider);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n removeCollider(collider: SpringCollider): boolean {\r\n const index = this._colliders.indexOf(collider);\r\n if (index >= 0) {\r\n this._colliders.splice(index, 1);\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n clearColliders(): void {\r\n this._colliders = [];\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n get colliders(): SpringCollider[] {\r\n return this._colliders;\r\n }\r\n\r\n /**\r\n * Sets a runtime-only node remapping used by particles, anchors and colliders.\r\n * The authored node references remain unchanged and therefore serialize normally.\r\n */\r\n setRuntimeNodeMap(nodeMap: ReadonlyMap<SceneNode, SceneNode> | null): void {\r\n this._nodePoseTracker.clear(false);\r\n this._runtimeNodeMap = nodeMap;\r\n this._runtimeAnchorOffsets = new WeakMap();\r\n this._runtimeRestLengths = new WeakMap();\r\n this.clearRuntimeCaches();\r\n }\r\n\r\n /**\r\n * Rebuilds particle history from the current runtime-remapped node pose.\r\n * This must be called after a hierarchy graft or skeleton rebind.\r\n */\r\n reinitializeFromCurrentPose(options?: SpringPoseReinitializeOptions): void {\r\n this._nodePoseTracker.clear(false);\r\n const recomputeAnchorOffsets = options?.recomputeAnchorOffsets ?? true;\r\n const recalculateRestLengths = options?.recalculateRestLengths ?? true;\r\n this._runtimeAnchorOffsets = new WeakMap();\r\n this._runtimeRestLengths = new WeakMap();\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n const particleNode = this.resolveRuntimeNode(particle.node);\r\n let position = particleNode\r\n ? new Vector3(\r\n particleNode.worldMatrix.m03,\r\n particleNode.worldMatrix.m13,\r\n particleNode.worldMatrix.m23\r\n )\r\n : particle.position.clone();\r\n const anchorNode = this.resolveRuntimeNode(particle.anchorNode);\r\n if (particle.fixed && anchorNode) {\r\n let anchorOffset = particle.anchorOffset;\r\n if (recomputeAnchorOffsets && anchorOffset && particleNode) {\r\n anchorOffset = anchorNode.worldToThis(position, new Vector3());\r\n this._runtimeAnchorOffsets.set(particle, anchorOffset);\r\n }\r\n position = anchorOffset\r\n ? anchorNode.worldMatrix.transformPointAffine(anchorOffset, new Vector3())\r\n : new Vector3(anchorNode.worldMatrix.m03, anchorNode.worldMatrix.m13, anchorNode.worldMatrix.m23);\r\n }\r\n particle.position.set(position);\r\n particle.prevPosition.set(position);\r\n particle.animPosition.set(position);\r\n particle.lastFramePosition.set(position);\r\n if (particle.positionHistory) {\r\n particle.positionHistory.length = 0;\r\n }\r\n }\r\n\r\n for (const constraint of chain.constraints) {\r\n constraint.lambda = 0;\r\n if (recalculateRestLengths) {\r\n this._runtimeRestLengths.set(\r\n constraint,\r\n Vector3.distance(\r\n chain.particles[constraint.particleA].position,\r\n chain.particles[constraint.particleB].position\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n for (const constraint of this._interChainConstraints) {\r\n constraint.lambda = 0;\r\n if (recalculateRestLengths) {\r\n const particleA = this._chains[constraint.chainAIndex]?.particles[constraint.particleAIndex];\r\n const particleB = this._chains[constraint.chainBIndex]?.particles[constraint.particleBIndex];\r\n if (particleA && particleB) {\r\n this._runtimeRestLengths.set(constraint, Vector3.distance(particleA.position, particleB.position));\r\n }\r\n }\r\n }\r\n\r\n for (const collider of this._colliders) {\r\n const colliderNode = this.resolveRuntimeNode(collider.node);\r\n if (colliderNode) {\r\n updateColliderFromNode(collider, colliderNode);\r\n }\r\n }\r\n this.clearRuntimeCaches();\r\n }\r\n\r\n private simulateStep(dt: number, inputDeltaTime: number, stepIndex: number, stepCount: number): void {\r\n if (this._enableInertialForces) {\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n particle.lastFramePosition.set(particle.position);\r\n }\r\n }\r\n }\r\n\r\n const substepBlend = 1 / Math.max(1, stepCount - stepIndex);\r\n this.updateFixedParticles(inputDeltaTime, substepBlend);\r\n\r\n let rotationCenter: Vector3 | null = null;\r\n let angularVelocity: Vector3 | null = null;\r\n\r\n if (this._enableInertialForces && dt > 0.0001) {\r\n const result = this.calculateGlobalRotation(dt);\r\n rotationCenter = result.center;\r\n angularVelocity = result.omega;\r\n }\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n\r\n const velocity = Vector3.sub(particle.position, particle.prevPosition, new Vector3());\r\n velocity.scaleBy(particle.damping);\r\n\r\n const acceleration = Vector3.add(this._gravity, this._wind, new Vector3());\r\n if (this._enableInertialForces && rotationCenter && angularVelocity) {\r\n const inertialAccel = this.calculateInertialAcceleration(\r\n particle,\r\n rotationCenter,\r\n angularVelocity,\r\n velocity,\r\n this._centrifugalScale,\r\n this._coriolisScale\r\n );\r\n Vector3.add(acceleration, inertialAccel, acceleration);\r\n }\r\n\r\n const positionDelta = Vector3.scale(acceleration, dt * dt, new Vector3());\r\n Vector3.add(velocity, positionDelta, velocity);\r\n\r\n particle.prevPosition.set(particle.position);\r\n Vector3.add(particle.position, velocity, particle.position);\r\n }\r\n }\r\n\r\n if (this._solver === 'xpbd') {\r\n this.resetConstraintLambdas();\r\n }\r\n\r\n if (this._motionModel === 'kawaii') {\r\n this.solvePosePreservation(1, true);\r\n }\r\n\r\n for (let iter = 0; iter < this._iterations; iter++) {\r\n for (const chain of this._chains) {\r\n const reverse = this._motionModel === 'kawaii' && !!(iter & 1);\r\n for (let constraintIndex = 0; constraintIndex < chain.constraints.length; constraintIndex++) {\r\n const constraint =\r\n chain.constraints[reverse ? chain.constraints.length - 1 - constraintIndex : constraintIndex];\r\n if (this._solver === 'xpbd') {\r\n this.solveConstraintXPBD(chain, constraint, dt);\r\n } else {\r\n this.solveConstraint(chain, constraint);\r\n }\r\n }\r\n }\r\n\r\n const reverse = this._motionModel === 'kawaii' && !!(iter & 1);\r\n for (let constraintIndex = 0; constraintIndex < this._interChainConstraints.length; constraintIndex++) {\r\n const constraint =\r\n this._interChainConstraints[\r\n reverse ? this._interChainConstraints.length - 1 - constraintIndex : constraintIndex\r\n ];\r\n if (this._solver === 'xpbd') {\r\n this.solveInterChainConstraintXPBD(constraint, dt);\r\n } else {\r\n this.solveInterChainConstraint(constraint);\r\n }\r\n }\r\n\r\n if (this._motionModel === 'legacy') {\r\n this.solvePosePreservation(this._iterations, false);\r\n this.solveCollisions(inputDeltaTime);\r\n }\r\n }\r\n\r\n if (this._motionModel === 'kawaii') {\r\n this.solveCollisions(inputDeltaTime, substepBlend);\r\n this.solveAngleLimits();\r\n if (this._solver === 'xpbd') {\r\n this.solveCollisions(0, 0);\r\n this.resetConstraintLambdas();\r\n const closureIterations = Math.min(16, Math.max(4, this._iterations));\r\n for (let iteration = 0; iteration < closureIterations; iteration++) {\r\n const reverse = !!(iteration & 1);\r\n for (const chain of this._chains) {\r\n for (let constraintIndex = 0; constraintIndex < chain.constraints.length; constraintIndex++) {\r\n const constraint =\r\n chain.constraints[reverse ? chain.constraints.length - 1 - constraintIndex : constraintIndex];\r\n this.solveConstraintXPBD(chain, constraint, dt);\r\n }\r\n }\r\n for (\r\n let constraintIndex = 0;\r\n constraintIndex < this._interChainConstraints.length;\r\n constraintIndex++\r\n ) {\r\n const constraint =\r\n this._interChainConstraints[\r\n reverse ? this._interChainConstraints.length - 1 - constraintIndex : constraintIndex\r\n ];\r\n this.solveInterChainConstraintXPBD(constraint, dt);\r\n }\r\n }\r\n if (this._colliders.some((collider) => collider.enabled)) {\r\n this.resetConstraintLambdas();\r\n const contactClosureIterations = Math.min(4, closureIterations);\r\n for (let iteration = 0; iteration < contactClosureIterations; iteration++) {\r\n const reverse = !!(iteration & 1);\r\n for (const chain of this._chains) {\r\n for (let constraintIndex = 0; constraintIndex < chain.constraints.length; constraintIndex++) {\r\n const constraint =\r\n chain.constraints[\r\n reverse ? chain.constraints.length - 1 - constraintIndex : constraintIndex\r\n ];\r\n this.solveConstraintXPBD(chain, constraint, dt);\r\n }\r\n }\r\n for (\r\n let constraintIndex = 0;\r\n constraintIndex < this._interChainConstraints.length;\r\n constraintIndex++\r\n ) {\r\n const constraint =\r\n this._interChainConstraints[\r\n reverse ? this._interChainConstraints.length - 1 - constraintIndex : constraintIndex\r\n ];\r\n this.solveInterChainConstraintXPBD(constraint, dt);\r\n }\r\n this.solveCollisions(0, 0);\r\n }\r\n }\r\n } else {\r\n for (const chain of this._chains) {\r\n for (const constraint of chain.constraints) {\r\n this.solveConstraint(chain, constraint);\r\n }\r\n }\r\n for (const constraint of this._interChainConstraints) {\r\n this.solveInterChainConstraint(constraint);\r\n }\r\n this.solveCollisions(0, 0);\r\n }\r\n }\r\n this.advanceInitialCollisionPenetrationRelease(dt);\r\n }\r\n\r\n private updateFixedParticles(deltaTime: number, substepBlend: number): void {\r\n const blend =\r\n this._motionModel === 'kawaii'\r\n ? substepBlend\r\n : this.getTemporalBlendFactor(deltaTime, DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME);\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n const sourceNode = this.resolveRuntimeNode(particle.anchorNode ?? particle.node);\r\n if (!sourceNode) {\r\n continue;\r\n }\r\n const anchorOffset = this._runtimeAnchorOffsets.get(particle) ?? particle.anchorOffset;\r\n const worldPos = anchorOffset\r\n ? sourceNode.worldMatrix.transformPointAffine(anchorOffset)\r\n : new Vector3(sourceNode.worldMatrix.m03, sourceNode.worldMatrix.m13, sourceNode.worldMatrix.m23);\r\n const smoothedTarget = this.getSmoothedParticleTarget(particle, worldPos, blend);\r\n particle.animPosition.set(smoothedTarget);\r\n if (particle.fixed) {\r\n particle.position.set(smoothedTarget);\r\n particle.prevPosition.set(smoothedTarget);\r\n if (this._enableInertialForces) {\r\n if (!particle.positionHistory) {\r\n particle.positionHistory = [];\r\n }\r\n particle.positionHistory.push(smoothedTarget.clone());\r\n if (particle.positionHistory.length > 5) {\r\n particle.positionHistory.shift();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private solvePosePreservation(totalIterations: number, parentRelative: boolean): void {\r\n if (this._poseFollowRoot <= 0 && this._poseFollowTip <= 0) {\r\n return;\r\n }\r\n\r\n for (const chain of this._chains) {\r\n const topology = getSpringPoseTopology(chain.particles);\r\n for (let i = 0; i < chain.particles.length; i++) {\r\n const particle = chain.particles[i];\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n\r\n const t = Math.pow(topology[i].normalizedDistance, this._poseFollowExponent);\r\n const particlePoseFollow = this.lerp(this._poseFollowRoot, this._poseFollowTip, t);\r\n const iterationFollow = getIterationStrength(particlePoseFollow, totalIterations);\r\n const poseTarget = parentRelative\r\n ? getKawaiiPoseTarget(particle, topology[i])\r\n : particle.animPosition;\r\n const toAnim = Vector3.sub(poseTarget, particle.position, new Vector3());\r\n const correction = Vector3.scale(toAnim, iterationFollow, new Vector3());\r\n Vector3.add(particle.position, correction, particle.position);\r\n\r\n const particleMaxPoseOffset = this.lerp(this._maxPoseOffsetRoot, this._maxPoseOffsetTip, t);\r\n if (particleMaxPoseOffset > 0) {\r\n const offset = Vector3.sub(particle.position, poseTarget, new Vector3());\r\n const offsetLen = offset.magnitude;\r\n if (offsetLen > particleMaxPoseOffset && offsetLen > 1e-6) {\r\n offset.scaleBy(particleMaxPoseOffset / offsetLen);\r\n Vector3.add(poseTarget, offset, particle.position);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private solveAngleLimits(): void {\r\n if (this._angleLimitRoot <= 0 && this._angleLimitTip <= 0) {\r\n return;\r\n }\r\n for (const chain of this._chains) {\r\n const particles = chain.particles;\r\n for (let i = 1; i < particles.length; i++) {\r\n const limit = interpolateSpringValue(\r\n this._angleLimitRoot,\r\n this._angleLimitTip,\r\n this._poseFollowExponent,\r\n i,\r\n particles.length\r\n );\r\n solveAngleLimit(particles[i - 1], particles[i], limit, this._solver === 'xpbd');\r\n }\r\n }\r\n }\r\n\r\n private solveCollisions(deltaTime: number, blendOverride?: number): void {\r\n const blend = blendOverride ?? this.getTemporalBlendFactor(deltaTime, DEFAULT_COLLIDER_SMOOTHING_TIME);\r\n const spheres: { source: SphereCollider; collider: SphereCollider }[] = [];\r\n const capsules: { source: CapsuleCollider; collider: CapsuleCollider }[] = [];\r\n const planes: { source: PlaneCollider; collider: PlaneCollider }[] = [];\r\n const boxes: { source: BoxCollider; collider: BoxCollider }[] = [];\r\n\r\n for (const collider of this._colliders) {\r\n const colliderNode = this.resolveRuntimeNode(collider.node);\r\n if (colliderNode) {\r\n updateColliderFromNode(collider, colliderNode);\r\n }\r\n if (!collider.enabled) {\r\n continue;\r\n }\r\n switch (collider.type) {\r\n case 'sphere': {\r\n const source = collider as SphereCollider;\r\n spheres.push({\r\n source,\r\n collider: { ...source, center: this.getSmoothedSphereCenter(source, blend) }\r\n });\r\n break;\r\n }\r\n case 'capsule': {\r\n const source = collider as CapsuleCollider;\r\n const endpoints = this.getSmoothedCapsuleEndpoints(source, blend);\r\n capsules.push({\r\n source,\r\n collider: { ...source, start: endpoints.start, end: endpoints.end }\r\n });\r\n break;\r\n }\r\n case 'plane': {\r\n const source = collider as PlaneCollider;\r\n const plane = this.getSmoothedPlaneData(source, blend);\r\n planes.push({\r\n source,\r\n collider: { ...source, point: plane.point, normal: plane.normal }\r\n });\r\n break;\r\n }\r\n case 'box': {\r\n const source = collider as BoxCollider;\r\n boxes.push({\r\n source,\r\n collider: { ...source, ...this.getSmoothedBoxData(source, blend) }\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n if (particle.fixed) {\r\n continue;\r\n }\r\n for (const collider of spheres) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolveSphereCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.source,\r\n collider.collider,\r\n resolveSphereCollision\r\n )\r\n );\r\n } else {\r\n resolveSphereCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n for (const collider of capsules) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolveCapsuleCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.source,\r\n collider.collider,\r\n resolveCapsuleCollision\r\n )\r\n );\r\n } else {\r\n resolveCapsuleCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n for (const collider of planes) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolvePlaneCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.source,\r\n collider.collider,\r\n resolvePlaneCollision\r\n )\r\n );\r\n } else {\r\n resolvePlaneCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n for (const collider of boxes) {\r\n if (this._motionModel === 'kawaii') {\r\n resolveInelasticCollision(\r\n particle,\r\n collider.collider,\r\n resolveBoxCollision,\r\n this.getInitialCollisionPenetration(\r\n particle,\r\n collider.source,\r\n collider.collider,\r\n resolveBoxCollision\r\n )\r\n );\r\n } else {\r\n resolveBoxCollision(particle.position, collider.collider, particle.collisionRadius);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private calculateGlobalRotation(dt: number): { center: Vector3; omega: Vector3 } {\r\n const fixedParticles: any[] = [];\r\n const velocities: Vector3[] = [];\r\n const drivenNodes = new Set<SceneNode>();\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n const node = this.resolveRuntimeNode(particle.node);\r\n if (node) {\r\n drivenNodes.add(node);\r\n }\r\n }\r\n }\r\n\r\n for (const chain of this._chains) {\r\n for (const particle of chain.particles) {\r\n if (!particle.fixed || !this.isExternalInertialAnchor(particle, drivenNodes)) {\r\n continue;\r\n }\r\n const velocity = Vector3.sub(particle.position, particle.lastFramePosition, new Vector3());\r\n velocity.scaleBy(1.0 / dt);\r\n if (velocity.magnitudeSq > 0.001) {\r\n fixedParticles.push(particle);\r\n velocities.push(velocity);\r\n }\r\n }\r\n }\r\n\r\n if (fixedParticles.length === 0) {\r\n return { center: new Vector3(0, 0, 0), omega: new Vector3(0, 0, 0) };\r\n }\r\n\r\n let center: Vector3;\r\n if (fixedParticles.length === 1) {\r\n center = this.estimateRotationCenterFromHistory(fixedParticles[0], velocities[0]);\r\n } else {\r\n center = new Vector3(0, 0, 0);\r\n for (const particle of fixedParticles) {\r\n Vector3.add(center, particle.position, center);\r\n }\r\n center.scaleBy(1.0 / fixedParticles.length);\r\n }\r\n\r\n let sumOmega = new Vector3(0, 0, 0);\r\n let count = 0;\r\n for (let i = 0; i < fixedParticles.length; i++) {\r\n const r = Vector3.sub(fixedParticles[i].position, center, new Vector3());\r\n const v = velocities[i];\r\n const rLengthSq = r.magnitudeSq;\r\n if (rLengthSq > 0.0001) {\r\n const omega = Vector3.cross(r, v, new Vector3());\r\n omega.scaleBy(1.0 / rLengthSq);\r\n Vector3.add(sumOmega, omega, sumOmega);\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n sumOmega.scaleBy(1.0 / count);\r\n }\r\n return { center, omega: sumOmega };\r\n }\r\n\r\n private estimateRotationCenterFromHistory(particle: any, currentVelocity: Vector3): Vector3 {\r\n const history = particle.positionHistory;\r\n if (!history || history.length < 3) {\r\n const speed = currentVelocity.magnitude;\r\n if (speed < 0.001) {\r\n return particle.position.clone();\r\n }\r\n\r\n const estimatedRadius = Math.max(0.5, speed * 0.5);\r\n const up = new Vector3(0, 1, 0);\r\n const perpDir = Vector3.cross(currentVelocity, up, new Vector3());\r\n if (perpDir.magnitudeSq < 0.0001) {\r\n perpDir.set(new Vector3(1, 0, 0));\r\n } else {\r\n perpDir.inplaceNormalize();\r\n }\r\n\r\n return Vector3.add(\r\n particle.position,\r\n Vector3.scale(perpDir, estimatedRadius, new Vector3()),\r\n new Vector3()\r\n );\r\n }\r\n\r\n const p1 = history[0];\r\n const p2 = history[Math.floor(history.length / 2)];\r\n const p3 = history[history.length - 1];\r\n return this.calculateCircleCenter(p1, p2, p3);\r\n }\r\n\r\n private calculateCircleCenter(p1: Vector3, p2: Vector3, p3: Vector3): Vector3 {\r\n const mid12 = Vector3.scale(Vector3.add(p1, p2, new Vector3()), 0.5, new Vector3());\r\n const mid23 = Vector3.scale(Vector3.add(p2, p3, new Vector3()), 0.5, new Vector3());\r\n const dir12 = Vector3.sub(p2, p1, new Vector3());\r\n const dir23 = Vector3.sub(p3, p2, new Vector3());\r\n const normal = Vector3.cross(dir12, dir23, new Vector3());\r\n\r\n if (normal.magnitudeSq < 0.0001) {\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n normal.inplaceNormalize();\r\n const perp12 = Vector3.cross(dir12, normal, new Vector3()).inplaceNormalize();\r\n const perp23 = Vector3.cross(dir23, normal, new Vector3()).inplaceNormalize();\r\n const diff = Vector3.sub(mid23, mid12, new Vector3());\r\n const det = perp12.x * perp23.y - perp12.y * perp23.x;\r\n\r\n if (Math.abs(det) > 0.0001) {\r\n const t = (diff.x * perp23.y - diff.y * perp23.x) / det;\r\n return Vector3.add(mid12, Vector3.scale(perp12, t, new Vector3()), new Vector3());\r\n }\r\n\r\n return Vector3.scale(\r\n Vector3.add(Vector3.add(p1, p2, new Vector3()), p3, new Vector3()),\r\n 1.0 / 3.0,\r\n new Vector3()\r\n );\r\n }\r\n\r\n private calculateInertialAcceleration(\r\n particle: any,\r\n rotationCenter: Vector3,\r\n angularVelocity: Vector3,\r\n particleVelocity: Vector3,\r\n centrifugalScale: number,\r\n coriolisScale: number\r\n ): Vector3 {\r\n const r = Vector3.sub(particle.position, rotationCenter, new Vector3());\r\n const omegaCrossR = Vector3.cross(angularVelocity, r, new Vector3());\r\n const centrifugalAccel = Vector3.cross(angularVelocity, omegaCrossR, new Vector3());\r\n centrifugalAccel.scaleBy(centrifugalScale);\r\n const coriolisAccel = Vector3.cross(angularVelocity, particleVelocity, new Vector3());\r\n coriolisAccel.scaleBy(-2.0 * coriolisScale);\r\n return Vector3.add(centrifugalAccel, coriolisAccel, new Vector3());\r\n }\r\n\r\n private solveConstraint(chain: SpringChain, constraint: SpringConstraint): void {\r\n const pA = chain.particles[constraint.particleA];\r\n const pB = chain.particles[constraint.particleB];\r\n if (this._motionModel === 'kawaii') {\r\n solveDistanceConstraint(pA, pB, this.getRuntimeRestLength(constraint), constraint.stiffness);\r\n return;\r\n }\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const diff = (currentLength - this.getRuntimeRestLength(constraint)) / currentLength;\r\n const correction = Vector3.scale(delta, diff * constraint.stiffness * 0.5, new Vector3());\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, correction, pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.sub(pB.position, correction, pB.position);\r\n }\r\n }\r\n\r\n private solveInterChainConstraint(constraint: InterChainConstraint): void {\r\n const chainA = this._chains[constraint.chainAIndex];\r\n const chainB = this._chains[constraint.chainBIndex];\r\n const pA = chainA.particles[constraint.particleAIndex];\r\n const pB = chainB.particles[constraint.particleBIndex];\r\n if (this._motionModel === 'kawaii') {\r\n solveDistanceConstraint(pA, pB, this.getRuntimeRestLength(constraint), constraint.stiffness);\r\n return;\r\n }\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const diff = (currentLength - this.getRuntimeRestLength(constraint)) / currentLength;\r\n const correction = Vector3.scale(delta, diff * constraint.stiffness * 0.5, new Vector3());\r\n if (!pA.fixed) {\r\n Vector3.add(pA.position, correction, pA.position);\r\n }\r\n if (!pB.fixed) {\r\n Vector3.sub(pB.position, correction, pB.position);\r\n }\r\n }\r\n\r\n private solveConstraintXPBD(chain: SpringChain, constraint: SpringConstraint, dt: number): void {\r\n const pA = chain.particles[constraint.particleA];\r\n const pB = chain.particles[constraint.particleB];\r\n const wA = pA.fixed ? 0 : 1.0 / pA.mass;\r\n const wB = pB.fixed ? 0 : 1.0 / pB.mass;\r\n const wSum = wA + wB;\r\n if (wSum < 1e-10) {\r\n return;\r\n }\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const C = currentLength - this.getRuntimeRestLength(constraint);\r\n const alphaTilde = constraint.compliance / (dt * dt);\r\n const deltaLambda = (-C - alphaTilde * constraint.lambda) / (wSum + alphaTilde);\r\n constraint.lambda += deltaLambda;\r\n const n = Vector3.scale(delta, 1.0 / currentLength, new Vector3());\r\n if (!pA.fixed) {\r\n const correction = Vector3.scale(n, -wA * deltaLambda, new Vector3());\r\n Vector3.add(pA.position, correction, pA.position);\r\n if (this._motionModel === 'kawaii') {\r\n Vector3.add(\r\n pA.prevPosition,\r\n Vector3.scale(correction, this._constraintVelocityHistoryRetention, new Vector3()),\r\n pA.prevPosition\r\n );\r\n }\r\n }\r\n if (!pB.fixed) {\r\n const correction = Vector3.scale(n, wB * deltaLambda, new Vector3());\r\n Vector3.add(pB.position, correction, pB.position);\r\n if (this._motionModel === 'kawaii') {\r\n Vector3.add(\r\n pB.prevPosition,\r\n Vector3.scale(correction, this._constraintVelocityHistoryRetention, new Vector3()),\r\n pB.prevPosition\r\n );\r\n }\r\n }\r\n }\r\n\r\n private solveInterChainConstraintXPBD(constraint: InterChainConstraint, dt: number): void {\r\n const chainA = this._chains[constraint.chainAIndex];\r\n const chainB = this._chains[constraint.chainBIndex];\r\n const pA = chainA.particles[constraint.particleAIndex];\r\n const pB = chainB.particles[constraint.particleBIndex];\r\n const wA = pA.fixed ? 0 : 1.0 / pA.mass;\r\n const wB = pB.fixed ? 0 : 1.0 / pB.mass;\r\n const wSum = wA + wB;\r\n if (wSum < 1e-10) {\r\n return;\r\n }\r\n const delta = Vector3.sub(pB.position, pA.position, new Vector3());\r\n const currentLength = delta.magnitude;\r\n if (currentLength < 0.0001) {\r\n return;\r\n }\r\n const C = currentLength - this.getRuntimeRestLength(constraint);\r\n const alphaTilde = constraint.compliance / (dt * dt);\r\n const deltaLambda = (-C - alphaTilde * constraint.lambda) / (wSum + alphaTilde);\r\n constraint.lambda += deltaLambda;\r\n const n = Vector3.scale(delta, 1.0 / currentLength, new Vector3());\r\n if (!pA.fixed) {\r\n const correction = Vector3.scale(n, -wA * deltaLambda, new Vector3());\r\n Vector3.add(pA.position, correction, pA.position);\r\n if (this._motionModel === 'kawaii') {\r\n Vector3.add(\r\n pA.prevPosition,\r\n Vector3.scale(correction, this._constraintVelocityHistoryRetention, new Vector3()),\r\n pA.prevPosition\r\n );\r\n }\r\n }\r\n if (!pB.fixed) {\r\n const correction = Vector3.scale(n, wB * deltaLambda, new Vector3());\r\n Vector3.add(pB.position, correction, pB.position);\r\n if (this._motionModel === 'kawaii') {\r\n Vector3.add(\r\n pB.prevPosition,\r\n Vector3.scale(correction, this._constraintVelocityHistoryRetention, new Vector3()),\r\n pB.prevPosition\r\n );\r\n }\r\n }\r\n }\r\n\r\n private collectChainNodeRotations(\r\n chain: SpringChain,\r\n weight: number,\r\n baseNodeStates: Map<any, { position: Vector3; rotation: Quaternion }>,\r\n desiredWorldRotations: Map<any, Quaternion>\r\n ): void {\r\n for (let i = 0; i < chain.particles.length - 1; i++) {\r\n const particle = chain.particles[i];\r\n const nextParticle = chain.particles[i + 1];\r\n const node = this.resolveRuntimeNode(particle.node);\r\n if (!node) {\r\n continue;\r\n }\r\n\r\n const nextNode = this.resolveRuntimeNode(nextParticle.node);\r\n if (!nextNode) {\r\n continue;\r\n }\r\n\r\n let nodeState = baseNodeStates.get(node);\r\n if (!nodeState) {\r\n const currentBoneRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, currentBoneRotation, null);\r\n nodeState = {\r\n position: new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23),\r\n rotation: currentBoneRotation\r\n };\r\n baseNodeStates.set(node, nodeState);\r\n }\r\n let nextNodeState = baseNodeStates.get(nextNode);\r\n if (!nextNodeState) {\r\n const nextBoneRotation = new Quaternion();\r\n nextNode.worldMatrix.decompose(null, nextBoneRotation, null);\r\n nextNodeState = {\r\n position: new Vector3(nextNode.worldMatrix.m03, nextNode.worldMatrix.m13, nextNode.worldMatrix.m23),\r\n rotation: nextBoneRotation\r\n };\r\n baseNodeStates.set(nextNode, nextNodeState);\r\n }\r\n\r\n const originalDir = Vector3.sub(nextNodeState.position, nodeState.position, new Vector3());\r\n const currentBoneRotation = nodeState.rotation;\r\n\r\n const newDir = Vector3.sub(nextParticle.position, particle.position, new Vector3());\r\n const deltaRotation = new Quaternion();\r\n IKUtils.fromToRotation(originalDir, newDir, deltaRotation);\r\n let worldRotation = Quaternion.multiply(deltaRotation, currentBoneRotation, new Quaternion());\r\n\r\n if (weight < 1) {\r\n Quaternion.slerp(currentBoneRotation, worldRotation, weight, worldRotation);\r\n }\r\n\r\n desiredWorldRotations.set(node, worldRotation);\r\n }\r\n }\r\n\r\n private getNodeDepth(node: any): number {\r\n let depth = 0;\r\n let current = node?.parent;\r\n while (current) {\r\n depth++;\r\n current = current.parent;\r\n }\r\n return depth;\r\n }\r\n\r\n private resetConstraintLambdas(): void {\r\n for (const chain of this._chains) {\r\n for (const constraint of chain.constraints) {\r\n constraint.lambda = 0;\r\n }\r\n }\r\n for (const constraint of this._interChainConstraints) {\r\n constraint.lambda = 0;\r\n }\r\n }\r\n\r\n private resolveRuntimeNode(node: SceneNode | null | undefined): SceneNode | null {\r\n return node ? (this._runtimeNodeMap?.get(node) ?? node) : null;\r\n }\r\n\r\n private isExternalInertialAnchor(particle: SpringParticle, drivenNodes: Set<SceneNode>): boolean {\r\n const particleNode = this.resolveRuntimeNode(particle.node);\r\n let current = this.resolveRuntimeNode(particle.anchorNode ?? particle.node);\r\n while (current) {\r\n if (current !== particleNode && drivenNodes.has(current)) {\r\n return false;\r\n }\r\n current = current.parent;\r\n }\r\n return true;\r\n }\r\n\r\n private getRuntimeRestLength(constraint: SpringConstraint | InterChainConstraint): number {\r\n return this._runtimeRestLengths.get(constraint) ?? constraint.restLength;\r\n }\r\n\r\n private clearRuntimeCaches(): void {\r\n this._timeAccumulator = 0;\r\n this._smoothedParticleTargets = new WeakMap();\r\n this._smoothedSphereCenters = new WeakMap();\r\n this._smoothedCapsuleEndpoints = new WeakMap();\r\n this._smoothedPlaneData = new WeakMap();\r\n this._smoothedBoxData = new WeakMap();\r\n this._initialCollisionPenetrationElapsed = 0;\r\n this._initialCollisionPenetration = new WeakMap();\r\n }\r\n\r\n private getInitialCollisionPenetration<TCollider extends SpringCollider>(\r\n particle: SpringParticle,\r\n sourceCollider: SpringCollider,\r\n collider: TCollider,\r\n resolveCollision: (position: Vector3, collider: TCollider) => boolean\r\n ): number {\r\n if (!this._preserveInitialCollisionPenetration) {\r\n return 0;\r\n }\r\n let particlePenetrations = this._initialCollisionPenetration.get(particle);\r\n if (!particlePenetrations) {\r\n particlePenetrations = new WeakMap();\r\n this._initialCollisionPenetration.set(particle, particlePenetrations);\r\n }\r\n let penetration = particlePenetrations.get(sourceCollider);\r\n if (penetration === undefined) {\r\n penetration =\r\n measureCollisionPenetration(\r\n particle.animPosition,\r\n collider,\r\n resolveCollision,\r\n particle.collisionRadius\r\n ) + INITIAL_COLLISION_PENETRATION_SLOP;\r\n particlePenetrations.set(sourceCollider, penetration);\r\n }\r\n return getReleasedCollisionPenetration(\r\n penetration,\r\n this._initialCollisionPenetrationElapsed,\r\n this._initialCollisionPenetrationReleaseTime\r\n );\r\n }\r\n\r\n private advanceInitialCollisionPenetrationRelease(deltaTime: number): void {\r\n if (!this._preserveInitialCollisionPenetration) {\r\n return;\r\n }\r\n this._initialCollisionPenetrationElapsed = Math.min(\r\n this._initialCollisionPenetrationReleaseTime,\r\n this._initialCollisionPenetrationElapsed + Math.max(0, deltaTime)\r\n );\r\n }\r\n\r\n private lerp(a: number, b: number, t: number): number {\r\n return a + (b - a) * t;\r\n }\r\n\r\n private getTemporalBlendFactor(deltaTime: number, smoothingTime: number): number {\r\n const dt = Math.min(Math.max(Number(deltaTime) || 0, 0), MAX_ACCUMULATED_SIMULATION_TIME);\r\n if (smoothingTime <= 0) {\r\n return 1;\r\n }\r\n if (dt <= 0) {\r\n return 0;\r\n }\r\n return 1 - Math.exp(-dt / smoothingTime);\r\n }\r\n\r\n private getSmoothedParticleTarget(target: object, current: Vector3, blend: number): Vector3 {\r\n const cached = this._smoothedParticleTargets.get(target);\r\n if (!cached || blend >= 1) {\r\n const next = current.clone();\r\n this._smoothedParticleTargets.set(target, next);\r\n return next;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedSphereCenter(collider: SphereCollider, blend: number): Vector3 {\r\n const current = collider.center?.clone() ?? new Vector3();\r\n const cached = this._smoothedSphereCenters.get(collider);\r\n if (!cached || blend >= 1) {\r\n this._smoothedSphereCenters.set(collider, current);\r\n return current;\r\n }\r\n cached.setXYZ(\r\n cached.x + (current.x - cached.x) * blend,\r\n cached.y + (current.y - cached.y) * blend,\r\n cached.z + (current.z - cached.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedCapsuleEndpoints(\r\n collider: CapsuleCollider,\r\n blend: number\r\n ): { start: Vector3; end: Vector3 } {\r\n const currentStart = collider.start?.clone() ?? new Vector3();\r\n const currentEnd = collider.end?.clone() ?? new Vector3();\r\n const cached = this._smoothedCapsuleEndpoints.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = { start: currentStart, end: currentEnd };\r\n this._smoothedCapsuleEndpoints.set(collider, next);\r\n return next;\r\n }\r\n cached.start.setXYZ(\r\n cached.start.x + (currentStart.x - cached.start.x) * blend,\r\n cached.start.y + (currentStart.y - cached.start.y) * blend,\r\n cached.start.z + (currentStart.z - cached.start.z) * blend\r\n );\r\n cached.end.setXYZ(\r\n cached.end.x + (currentEnd.x - cached.end.x) * blend,\r\n cached.end.y + (currentEnd.y - cached.end.y) * blend,\r\n cached.end.z + (currentEnd.z - cached.end.z) * blend\r\n );\r\n return cached;\r\n }\r\n\r\n private getSmoothedPlaneData(collider: PlaneCollider, blend: number): { point: Vector3; normal: Vector3 } {\r\n const currentPoint = collider.point?.clone() ?? new Vector3();\r\n const currentNormal = collider.normal?.clone() ?? new Vector3(0, 1, 0);\r\n const cached = this._smoothedPlaneData.get(collider);\r\n if (!cached || blend >= 1) {\r\n const next = { point: currentPoint, normal: currentNormal };\r\n this._smoothedPlaneData.set(collider, next);\r\n return next;\r\n }\r\n cached.point.setXYZ(\r\n cached.point.x + (currentPoint.x - cached.point.x) * blend,\r\n cached.point.y + (currentPoint.y - cached.point.y) * blend,\r\n cached.point.z + (currentPoint.z - cached.point.z) * blend\r\n );\r\n cached.normal.setXYZ(\r\n cached.normal.x + (currentNormal.x - cached.normal.x) * blend,\r\n cached.normal.y + (currentNormal.y - cached.normal.y) * blend,\r\n cached.normal.z + (currentNormal.z - cached.normal.z) * blend\r\n );\r\n cached.normal.inplaceNormalize();\r\n return cached;\r\n }\r\n\r\n private getSmoothedBoxData(\r\n collider: BoxCollider,\r\n blend: number\r\n ): { center: Vector3; halfExtents: Vector3; axes: [Vector3, Vector3, Vector3] } {\r\n const current = {\r\n center: collider.center.clone(),\r\n halfExtents: collider.halfExtents.clone(),\r\n axes: collider.axes.map((axis) => axis.clone()) as [Vector3, Vector3, Vector3]\r\n };\r\n const cached = this._smoothedBoxData.get(collider);\r\n if (!cached || blend >= 1) {\r\n this._smoothedBoxData.set(collider, current);\r\n return current;\r\n }\r\n Vector3.lerp(cached.center, current.center, blend, cached.center);\r\n Vector3.lerp(cached.halfExtents, current.halfExtents, blend, cached.halfExtents);\r\n for (let i = 0; i < 3; i++) {\r\n Vector3.lerp(cached.axes[i], current.axes[i], blend, cached.axes[i]);\r\n cached.axes[i].inplaceNormalize();\r\n }\r\n return cached;\r\n }\r\n}\r\n"],"names":["FIXED_SIMULATION_TIME_STEP","MAX_ACCUMULATED_SIMULATION_TIME","MAX_SIMULATION_STEPS_PER_UPDATE","Math","max","ceil","DEFAULT_PARTICLE_TARGET_SMOOTHING_TIME","DEFAULT_COLLIDER_SMOOTHING_TIME","MultiChainSpringSystem","_chains","_interChainConstraints","_iterations","_gravity","_wind","_enableInertialForces","_centrifugalScale","_coriolisScale","_solver","_poseFollow","_maxPoseOffset","_poseFollowRoot","_poseFollowTip","_poseFollowExponent","_maxPoseOffsetRoot","_maxPoseOffsetTip","_colliders","_timeAccumulator","_smoothedParticleTargets","_smoothedSphereCenters","_smoothedCapsuleEndpoints","_smoothedPlaneData","_smoothedBoxData","_runtimeNodeMap","_runtimeAnchorOffsets","_runtimeRestLengths","_nodePoseTracker","_motionModel","_angleLimitRoot","_angleLimitTip","_constraintVelocityHistoryRetention","_preserveInitialCollisionPenetration","_initialCollisionPenetrationReleaseTime","_initialCollisionPenetrationElapsed","_initialCollisionPenetration","options","iterations","gravity","clone","Vector3","wind","enableInertialForces","centrifugalScale","coriolisScale","solver","min","poseFollow","maxPoseOffset","poseFollowRoot","poseFollowTip","poseFollowExponent","maxPoseOffsetRoot","maxPoseOffsetTip","WeakMap","SpringNodePoseTracker","motionModel","angleLimitRoot","angleLimitTip","constraintVelocityHistoryRetention","preserveInitialCollisionPenetration","initialCollisionPenetrationReleaseTime","DEFAULT_INITIAL_COLLISION_PENETRATION_RELEASE_TIME","addChain","chain","push","length","addInterChainConstraint","constraint","createRadialConstraints","skipRows","connectDistance","compliance","i","offset","j","chainA","chainB","minLength","particles","row","pA","pB","distance","position","maxDistance","chainAIndex","chainBIndex","particleAIndex","particleBIndex","restLength","stiffness","lambda","update","deltaTime","restoreInputPose","frameDt","Number","stepCount","floor","simulateStep","applyToNodes","weight","baseNodeStates","Map","desiredWorldRotations","collectChainNodeRotations","nodes","Array","from","keys","sort","a","b","getNodeDepth","node","worldRotation","get","parent","inputRotation","rotation","parentWorldRotation","Quaternion","worldMatrix","decompose","parentInvRotation","conjugate","localRotation","multiply","recordAppliedRotation","reset","clear","particle","animPosition","set","originalPosition","lastFramePosition","positionHistory","chains","interChainConstraints","count","enabled","scale","type","resetConstraintLambdas","value","duration","v","addCollider","collider","removeCollider","index","indexOf","splice","clearColliders","colliders","setRuntimeNodeMap","nodeMap","clearRuntimeCaches","reinitializeFromCurrentPose","recomputeAnchorOffsets","recalculateRestLengths","particleNode","resolveRuntimeNode","m03","m13","m23","anchorNode","fixed","anchorOffset","worldToThis","transformPointAffine","prevPosition","constraints","particleA","particleB","colliderNode","updateColliderFromNode","dt","inputDeltaTime","stepIndex","substepBlend","updateFixedParticles","rotationCenter","angularVelocity","result","calculateGlobalRotation","center","omega","velocity","sub","scaleBy","damping","acceleration","add","inertialAccel","calculateInertialAcceleration","positionDelta","solvePosePreservation","iter","reverse","constraintIndex","solveConstraintXPBD","solveConstraint","solveInterChainConstraintXPBD","solveInterChainConstraint","solveCollisions","solveAngleLimits","closureIterations","iteration","some","contactClosureIterations","advanceInitialCollisionPenetrationRelease","blend","getTemporalBlendFactor","sourceNode","worldPos","smoothedTarget","getSmoothedParticleTarget","shift","totalIterations","parentRelative","topology","getSpringPoseTopology","t","pow","normalizedDistance","particlePoseFollow","lerp","iterationFollow","getIterationStrength","poseTarget","getKawaiiPoseTarget","toAnim","correction","particleMaxPoseOffset","offsetLen","magnitude","limit","interpolateSpringValue","solveAngleLimit","blendOverride","spheres","capsules","planes","boxes","source","getSmoothedSphereCenter","endpoints","getSmoothedCapsuleEndpoints","start","end","plane","getSmoothedPlaneData","point","normal","getSmoothedBoxData","resolveInelasticCollision","resolveSphereCollision","getInitialCollisionPenetration","collisionRadius","resolveCapsuleCollision","resolvePlaneCollision","resolveBoxCollision","fixedParticles","velocities","drivenNodes","Set","isExternalInertialAnchor","magnitudeSq","estimateRotationCenterFromHistory","sumOmega","r","rLengthSq","cross","currentVelocity","history","speed","estimatedRadius","up","perpDir","inplaceNormalize","p1","p2","p3","calculateCircleCenter","mid12","mid23","dir12","dir23","perp12","perp23","diff","det","x","y","abs","particleVelocity","omegaCrossR","centrifugalAccel","coriolisAccel","solveDistanceConstraint","getRuntimeRestLength","delta","currentLength","wA","mass","wB","wSum","C","alphaTilde","deltaLambda","n","nextParticle","nextNode","nodeState","currentBoneRotation","nextNodeState","nextBoneRotation","originalDir","newDir","deltaRotation","IKUtils","fromToRotation","slerp","depth","current","has","sourceCollider","resolveCollision","particlePenetrations","penetration","undefined","measureCollisionPenetration","INITIAL_COLLISION_PENETRATION_SLOP","getReleasedCollisionPenetration","smoothingTime","exp","target","cached","next","setXYZ","z","currentStart","currentEnd","currentPoint","currentNormal","halfExtents","axes","map","axis"],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ import { createSpringConstraint } from './spring_constraint.js';
|
|
|
24
24
|
const mass = options?.mass ?? 1.0;
|
|
25
25
|
const damping = options?.damping ?? 0.95;
|
|
26
26
|
const stiffness = options?.stiffness ?? 0.8;
|
|
27
|
+
const collisionRadius = Math.max(0, Number(options?.collisionRadius) || 0);
|
|
27
28
|
// Collect nodes from startNode to endNode
|
|
28
29
|
const nodes = [];
|
|
29
30
|
let current = startNode;
|
|
@@ -49,6 +50,7 @@ import { createSpringConstraint } from './spring_constraint.js';
|
|
|
49
50
|
const particle = createSpringParticle(worldPos, {
|
|
50
51
|
mass,
|
|
51
52
|
damping,
|
|
53
|
+
collisionRadius,
|
|
52
54
|
fixed: i === 0,
|
|
53
55
|
node,
|
|
54
56
|
originalRotation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spring_chain.js","sources":["../../../src/animation/spring/spring_chain.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport type { SpringParticle } from './spring_particle';\r\nimport { createSpringParticle } from './spring_particle';\r\nimport type { SpringConstraint } from './spring_constraint';\r\nimport { createSpringConstraint } from './spring_constraint';\r\n\r\n/**\r\n * Manages a chain of spring particles and constraints\r\n *\r\n * @public\r\n */\r\nexport class SpringChain {\r\n /** Array of particles in the chain */\r\n particles: SpringParticle[];\r\n /** Array of constraints between particles */\r\n constraints: SpringConstraint[];\r\n\r\n constructor() {\r\n this.particles = [];\r\n this.constraints = [];\r\n }\r\n\r\n /**\r\n * Creates a spring chain from a bone hierarchy\r\n * @param startNode - Root node of the bone chain\r\n * @param endNode - End node of the bone chain (optional, if null uses all descendants)\r\n * @param options - Additional options\r\n * @returns A new SpringChain instance\r\n */\r\n static fromBoneChain(\r\n startNode: SceneNode,\r\n endNode: SceneNode | null = null,\r\n options?: {\r\n mass?: number;\r\n damping?: number;\r\n stiffness?: number;\r\n }\r\n ): SpringChain {\r\n const chain = new SpringChain();\r\n const mass = options?.mass ?? 1.0;\r\n const damping = options?.damping ?? 0.95;\r\n const stiffness = options?.stiffness ?? 0.8;\r\n\r\n // Collect nodes from startNode to endNode\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode | null = startNode;\r\n\r\n while (current) {\r\n nodes.push(current);\r\n if (current === endNode) {\r\n break;\r\n }\r\n\r\n const children: SceneNode[] = current.children;\r\n if (children.length > 0) {\r\n current = children[0];\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Create particles for each bone\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n const worldPos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);\r\n\r\n // Get the original world rotation\r\n const originalRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, originalRotation, null);\r\n\r\n const particle = createSpringParticle(worldPos, {\r\n mass,\r\n damping,\r\n fixed: i === 0, // First particle is fixed (anchor)\r\n node,\r\n originalRotation\r\n });\r\n\r\n const particleIndex = chain.addParticle(particle);\r\n\r\n // Create constraint with previous particle\r\n if (i > 0) {\r\n const prevIndex = particleIndex - 1;\r\n const prevParticle = chain.particles[prevIndex];\r\n const restLength = Vector3.distance(particle.position, prevParticle.position);\r\n\r\n chain.addConstraint(createSpringConstraint(prevIndex, particleIndex, restLength, stiffness));\r\n }\r\n }\r\n\r\n return chain;\r\n }\r\n\r\n /**\r\n * Adds a particle to the chain\r\n * @param particle - The particle to add\r\n * @returns The index of the added particle\r\n */\r\n addParticle(particle: SpringParticle): number {\r\n this.particles.push(particle);\r\n return this.particles.length - 1;\r\n }\r\n\r\n /**\r\n * Adds a constraint to the chain\r\n * @param constraint - The constraint to add\r\n */\r\n addConstraint(constraint: SpringConstraint): void {\r\n this.constraints.push(constraint);\r\n }\r\n\r\n /**\r\n * Adds cross constraints between particles for cloth-like behavior\r\n * @param stiffness - Stiffness of the cross constraints\r\n * @param skipDistance - Distance between particles to connect (default: 2)\r\n */\r\n addCrossConstraints(stiffness: number = 0.6, skipDistance: number = 2): void {\r\n for (let i = 0; i < this.particles.length - skipDistance; i++) {\r\n const pA = this.particles[i];\r\n const pB = this.particles[i + skipDistance];\r\n const restLength = Vector3.distance(pA.position, pB.position);\r\n\r\n this.addConstraint(createSpringConstraint(i, i + skipDistance, restLength, stiffness));\r\n }\r\n }\r\n\r\n /**\r\n * Resets all particles to their original positions\r\n */\r\n reset(): void {\r\n for (const particle of this.particles) {\r\n particle.position.set(particle.originalPosition);\r\n particle.prevPosition.set(particle.originalPosition);\r\n }\r\n }\r\n}\r\n"],"names":["SpringChain","particles","constraints","fromBoneChain","startNode","endNode","options","chain","mass","damping","stiffness","nodes","current","push","children","length","i","node","worldPos","Vector3","worldMatrix","m03","m13","m23","originalRotation","Quaternion","decompose","particle","createSpringParticle","fixed","particleIndex","addParticle","prevIndex","prevParticle","restLength","distance","position","addConstraint","createSpringConstraint","constraint","addCrossConstraints","skipDistance","pA","pB","reset","set","originalPosition","prevPosition"],"mappings":";;;;AAOA;;;;AAIC,IACM,MAAMA,WAAAA,CAAAA;AACX,2CACAC,SAA4B;AAC5B,kDACAC,WAAgC;IAEhC,WAAc,EAAA;QACZ,IAAI,CAACD,SAAS,GAAG,EAAE;QACnB,IAAI,CAACC,WAAW,GAAG,EAAE;AACvB;AAEA;;;;;;MAOA,OAAOC,cACLC,SAAoB,EACpBC,UAA4B,IAAI,EAChCC,
|
|
1
|
+
{"version":3,"file":"spring_chain.js","sources":["../../../src/animation/spring/spring_chain.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\nimport type { SpringParticle } from './spring_particle';\r\nimport { createSpringParticle } from './spring_particle';\r\nimport type { SpringConstraint } from './spring_constraint';\r\nimport { createSpringConstraint } from './spring_constraint';\r\n\r\n/**\r\n * Manages a chain of spring particles and constraints\r\n *\r\n * @public\r\n */\r\nexport class SpringChain {\r\n /** Array of particles in the chain */\r\n particles: SpringParticle[];\r\n /** Array of constraints between particles */\r\n constraints: SpringConstraint[];\r\n\r\n constructor() {\r\n this.particles = [];\r\n this.constraints = [];\r\n }\r\n\r\n /**\r\n * Creates a spring chain from a bone hierarchy\r\n * @param startNode - Root node of the bone chain\r\n * @param endNode - End node of the bone chain (optional, if null uses all descendants)\r\n * @param options - Additional options\r\n * @returns A new SpringChain instance\r\n */\r\n static fromBoneChain(\r\n startNode: SceneNode,\r\n endNode: SceneNode | null = null,\r\n options?: {\r\n mass?: number;\r\n damping?: number;\r\n stiffness?: number;\r\n collisionRadius?: number;\r\n }\r\n ): SpringChain {\r\n const chain = new SpringChain();\r\n const mass = options?.mass ?? 1.0;\r\n const damping = options?.damping ?? 0.95;\r\n const stiffness = options?.stiffness ?? 0.8;\r\n const collisionRadius = Math.max(0, Number(options?.collisionRadius) || 0);\r\n\r\n // Collect nodes from startNode to endNode\r\n const nodes: SceneNode[] = [];\r\n let current: SceneNode | null = startNode;\r\n\r\n while (current) {\r\n nodes.push(current);\r\n if (current === endNode) {\r\n break;\r\n }\r\n\r\n const children: SceneNode[] = current.children;\r\n if (children.length > 0) {\r\n current = children[0];\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Create particles for each bone\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n const worldPos = new Vector3(node.worldMatrix.m03, node.worldMatrix.m13, node.worldMatrix.m23);\r\n\r\n // Get the original world rotation\r\n const originalRotation = new Quaternion();\r\n node.worldMatrix.decompose(null, originalRotation, null);\r\n\r\n const particle = createSpringParticle(worldPos, {\r\n mass,\r\n damping,\r\n collisionRadius,\r\n fixed: i === 0, // First particle is fixed (anchor)\r\n node,\r\n originalRotation\r\n });\r\n\r\n const particleIndex = chain.addParticle(particle);\r\n\r\n // Create constraint with previous particle\r\n if (i > 0) {\r\n const prevIndex = particleIndex - 1;\r\n const prevParticle = chain.particles[prevIndex];\r\n const restLength = Vector3.distance(particle.position, prevParticle.position);\r\n\r\n chain.addConstraint(createSpringConstraint(prevIndex, particleIndex, restLength, stiffness));\r\n }\r\n }\r\n\r\n return chain;\r\n }\r\n\r\n /**\r\n * Adds a particle to the chain\r\n * @param particle - The particle to add\r\n * @returns The index of the added particle\r\n */\r\n addParticle(particle: SpringParticle): number {\r\n this.particles.push(particle);\r\n return this.particles.length - 1;\r\n }\r\n\r\n /**\r\n * Adds a constraint to the chain\r\n * @param constraint - The constraint to add\r\n */\r\n addConstraint(constraint: SpringConstraint): void {\r\n this.constraints.push(constraint);\r\n }\r\n\r\n /**\r\n * Adds cross constraints between particles for cloth-like behavior\r\n * @param stiffness - Stiffness of the cross constraints\r\n * @param skipDistance - Distance between particles to connect (default: 2)\r\n */\r\n addCrossConstraints(stiffness: number = 0.6, skipDistance: number = 2): void {\r\n for (let i = 0; i < this.particles.length - skipDistance; i++) {\r\n const pA = this.particles[i];\r\n const pB = this.particles[i + skipDistance];\r\n const restLength = Vector3.distance(pA.position, pB.position);\r\n\r\n this.addConstraint(createSpringConstraint(i, i + skipDistance, restLength, stiffness));\r\n }\r\n }\r\n\r\n /**\r\n * Resets all particles to their original positions\r\n */\r\n reset(): void {\r\n for (const particle of this.particles) {\r\n particle.position.set(particle.originalPosition);\r\n particle.prevPosition.set(particle.originalPosition);\r\n }\r\n }\r\n}\r\n"],"names":["SpringChain","particles","constraints","fromBoneChain","startNode","endNode","options","chain","mass","damping","stiffness","collisionRadius","Math","max","Number","nodes","current","push","children","length","i","node","worldPos","Vector3","worldMatrix","m03","m13","m23","originalRotation","Quaternion","decompose","particle","createSpringParticle","fixed","particleIndex","addParticle","prevIndex","prevParticle","restLength","distance","position","addConstraint","createSpringConstraint","constraint","addCrossConstraints","skipDistance","pA","pB","reset","set","originalPosition","prevPosition"],"mappings":"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"}
|