@zephyr3d/scene 0.9.4 → 0.9.6
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/dist/animation/animationmask.js +224 -0
- package/dist/animation/animationmask.js.map +1 -0
- package/dist/animation/animationset.js +268 -67
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +3 -0
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +7 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +6 -4
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +390 -43
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +4 -3
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/joint_dynamics_modifier.js +2 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -1
- package/dist/animation/morphtarget.js +3 -72
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -0
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +3 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/proptrack.js +3 -0
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +3 -0
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +3 -0
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +254 -79
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/animation/translationtrack.js +3 -0
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/engine.js +171 -107
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptregistry.js +251 -80
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +344 -365
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/loader.js +1 -6
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
- package/dist/asset/model.js +1000 -131
- package/dist/asset/model.js.map +1 -1
- package/dist/avatar/wardrobe.js +474 -0
- package/dist/avatar/wardrobe.js.map +1 -0
- package/dist/index.d.ts +1126 -199
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -15
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/msdf_text.js +3 -3
- package/dist/material/msdf_text.js.map +1 -1
- package/dist/material/msdf_text_sprite.js +4 -4
- package/dist/material/msdf_text_sprite.js.map +1 -1
- package/dist/material/pbrblueprint.js +102 -102
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/render/envlight.js +54 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/sky.js +9 -0
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/batchgroup.js +11 -13
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +15 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +79 -16
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/scene.js +1 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +203 -2
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/text/font/cff_font.js +890 -0
- package/dist/text/font/cff_font.js.map +1 -0
- package/dist/text/font/font_asset.js +17 -3
- package/dist/text/font/font_asset.js.map +1 -1
- package/dist/text/msdf/generator.js.map +1 -1
- package/dist/text/msdf/shape.js +4 -1
- package/dist/text/msdf/shape.js.map +1 -1
- package/dist/text/runtime/msdf_text_atlas_manager.js +4 -1
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js +1157 -1154
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/pmrem.js +34 -8
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/serialization/manager.js +22 -9
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +700 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +64 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +187 -8
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/textures/sheenlut.js +138 -0
- package/dist/utility/textures/sheenlut.js.map +1 -0
- package/package.json +2 -2
- package/dist/animation/ik/ik_chain_builder.js +0 -68
- package/dist/animation/ik/ik_chain_builder.js.map +0 -1
- package/dist/animation/ik/ik_pole_constraint.js +0 -123
- package/dist/animation/ik/ik_pole_constraint.js.map +0 -1
- package/dist/animation/ik/ik_track.js +0 -96
- package/dist/animation/ik/ik_track.js.map +0 -1
- package/dist/animation/ik_postprocessor.js +0 -71
- package/dist/animation/ik_postprocessor.js.map +0 -1
- package/dist/animation/joint_dynamics/math.js +0 -16
- package/dist/animation/joint_dynamics/math.js.map +0 -1
- package/dist/animation/manual_transform_processor.js +0 -156
- package/dist/animation/manual_transform_processor.js.map +0 -1
- package/dist/animation/skeleton_postprocessor.js +0 -50
- package/dist/animation/skeleton_postprocessor.js.map +0 -1
- package/dist/animation/spring2/collision.js +0 -469
- package/dist/animation/spring2/collision.js.map +0 -1
- package/dist/animation/spring2/constraints.js +0 -329
- package/dist/animation/spring2/constraints.js.map +0 -1
- package/dist/animation/spring2/controller.js +0 -434
- package/dist/animation/spring2/controller.js.map +0 -1
- package/dist/animation/spring2/math.js +0 -16
- package/dist/animation/spring2/math.js.map +0 -1
- package/dist/animation/spring2/solver.js +0 -624
- package/dist/animation/spring2/solver.js.map +0 -1
- package/dist/animation/spring2/spring_system.js +0 -118
- package/dist/animation/spring2/spring_system.js.map +0 -1
- package/dist/animation/spring2/types.js +0 -19
- package/dist/animation/spring2/types.js.map +0 -1
- package/dist/animation/spring_postprocessor.js +0 -54
- package/dist/animation/spring_postprocessor.js.map +0 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +0 -1273
- package/dist/asset/loaders/gltf/gltf_loader.js.map +0 -1
- package/dist/asset/loaders/gltf/helpers.js +0 -331
- package/dist/asset/loaders/gltf/helpers.js.map +0 -1
- package/dist/material/sprite3d.js +0 -301
- package/dist/material/sprite3d.js.map +0 -1
- package/dist/material/sprite3d_std.js +0 -116
- package/dist/material/sprite3d_std.js.map +0 -1
- package/dist/material/sprite3dblueprint.js +0 -235
- package/dist/material/sprite3dblueprint.js.map +0 -1
- package/dist/material/sprite_sdf.js +0 -106
- package/dist/material/sprite_sdf.js.map +0 -1
- package/dist/material/terrainmaterial.js +0 -368
- package/dist/material/terrainmaterial.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
- package/dist/render/deferredlightpass.js +0 -510
- package/dist/render/deferredlightpass.js.map +0 -1
- package/dist/render/deferredshadowlightpass.js +0 -428
- package/dist/render/deferredshadowlightpass.js.map +0 -1
- package/dist/render/gbufferpass.js +0 -50
- package/dist/render/gbufferpass.js.map +0 -1
- package/dist/scene/sdftextsprite.js +0 -322
- package/dist/scene/sdftextsprite.js.map +0 -1
- package/dist/scene/sprite3d.js +0 -18
- package/dist/scene/sprite3d.js.map +0 -1
- package/dist/scene/terrain/grass.js +0 -280
- package/dist/scene/terrain/grass.js.map +0 -1
- package/dist/scene/terrain/heightfield.js +0 -475
- package/dist/scene/terrain/heightfield.js.map +0 -1
- package/dist/scene/terrain/patch.js +0 -532
- package/dist/scene/terrain/patch.js.map +0 -1
- package/dist/scene/terrain/quadtree.js +0 -461
- package/dist/scene/terrain/quadtree.js.map +0 -1
- package/dist/scene/terrain/terrain.js +0 -231
- package/dist/scene/terrain/terrain.js.map +0 -1
- package/dist/src/animation/animation.js +0 -127
- package/dist/src/animation/animation.js.map +0 -1
- package/dist/src/animation/animationset.js +0 -255
- package/dist/src/animation/animationset.js.map +0 -1
- package/dist/src/animation/animationtrack.js +0 -34
- package/dist/src/animation/animationtrack.js.map +0 -1
- package/dist/src/animation/eulerrotationtrack.js +0 -52
- package/dist/src/animation/eulerrotationtrack.js.map +0 -1
- package/dist/src/animation/morphtarget.js +0 -93
- package/dist/src/animation/morphtarget.js.map +0 -1
- package/dist/src/animation/morphtrack.js +0 -70
- package/dist/src/animation/morphtrack.js.map +0 -1
- package/dist/src/animation/proptrack.js +0 -161
- package/dist/src/animation/proptrack.js.map +0 -1
- package/dist/src/animation/rotationtrack.js +0 -51
- package/dist/src/animation/rotationtrack.js.map +0 -1
- package/dist/src/animation/scaletrack.js +0 -50
- package/dist/src/animation/scaletrack.js.map +0 -1
- package/dist/src/animation/skeleton.js +0 -204
- package/dist/src/animation/skeleton.js.map +0 -1
- package/dist/src/animation/translationtrack.js +0 -50
- package/dist/src/animation/translationtrack.js.map +0 -1
- package/dist/src/app/app.js +0 -129
- package/dist/src/app/app.js.map +0 -1
- package/dist/src/app/inputmgr.js +0 -267
- package/dist/src/app/inputmgr.js.map +0 -1
- package/dist/src/asset/assetmanager.js +0 -404
- package/dist/src/asset/assetmanager.js.map +0 -1
- package/dist/src/asset/builtin.js +0 -337
- package/dist/src/asset/builtin.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds.js +0 -470
- package/dist/src/asset/loaders/dds/dds.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
- package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
- package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/helpers.js +0 -327
- package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
- package/dist/src/asset/loaders/hdr/hdr.js +0 -180
- package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
- package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
- package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
- package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
- package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
- package/dist/src/asset/loaders/loader.js +0 -45
- package/dist/src/asset/loaders/loader.js.map +0 -1
- package/dist/src/asset/model.js +0 -414
- package/dist/src/asset/model.js.map +0 -1
- package/dist/src/blitter/bilateralblur.js +0 -221
- package/dist/src/blitter/bilateralblur.js.map +0 -1
- package/dist/src/blitter/blitter.js +0 -390
- package/dist/src/blitter/blitter.js.map +0 -1
- package/dist/src/blitter/box.js +0 -118
- package/dist/src/blitter/box.js.map +0 -1
- package/dist/src/blitter/copy.js +0 -22
- package/dist/src/blitter/copy.js.map +0 -1
- package/dist/src/blitter/gaussianblur.js +0 -228
- package/dist/src/blitter/gaussianblur.js.map +0 -1
- package/dist/src/camera/base.js +0 -92
- package/dist/src/camera/base.js.map +0 -1
- package/dist/src/camera/camera.js +0 -1005
- package/dist/src/camera/camera.js.map +0 -1
- package/dist/src/camera/fps.js +0 -238
- package/dist/src/camera/fps.js.map +0 -1
- package/dist/src/camera/orbit.js +0 -245
- package/dist/src/camera/orbit.js.map +0 -1
- package/dist/src/camera/orthocamera.js +0 -167
- package/dist/src/camera/orthocamera.js.map +0 -1
- package/dist/src/camera/perspectivecamera.js +0 -141
- package/dist/src/camera/perspectivecamera.js.map +0 -1
- package/dist/src/index.js +0 -120
- package/dist/src/index.js.map +0 -1
- package/dist/src/material/blinn.js +0 -81
- package/dist/src/material/blinn.js.map +0 -1
- package/dist/src/material/grassmaterial.js +0 -113
- package/dist/src/material/grassmaterial.js.map +0 -1
- package/dist/src/material/lambert.js +0 -92
- package/dist/src/material/lambert.js.map +0 -1
- package/dist/src/material/material.js +0 -301
- package/dist/src/material/material.js.map +0 -1
- package/dist/src/material/meshmaterial.js +0 -704
- package/dist/src/material/meshmaterial.js.map +0 -1
- package/dist/src/material/mixins/albedocolor.js +0 -76
- package/dist/src/material/mixins/albedocolor.js.map +0 -1
- package/dist/src/material/mixins/foliage.js +0 -47
- package/dist/src/material/mixins/foliage.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
- package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
- package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
- package/dist/src/material/mixins/lit.js +0 -476
- package/dist/src/material/mixins/lit.js.map +0 -1
- package/dist/src/material/mixins/pbr/common.js +0 -918
- package/dist/src/material/mixins/pbr/common.js.map +0 -1
- package/dist/src/material/mixins/texture.js +0 -172
- package/dist/src/material/mixins/texture.js.map +0 -1
- package/dist/src/material/mixins/vertexcolor.js +0 -56
- package/dist/src/material/mixins/vertexcolor.js.map +0 -1
- package/dist/src/material/particle.js +0 -178
- package/dist/src/material/particle.js.map +0 -1
- package/dist/src/material/pbrmr.js +0 -97
- package/dist/src/material/pbrmr.js.map +0 -1
- package/dist/src/material/pbrsg.js +0 -97
- package/dist/src/material/pbrsg.js.map +0 -1
- package/dist/src/material/shader/helper.js +0 -1209
- package/dist/src/material/shader/helper.js.map +0 -1
- package/dist/src/material/terrain-cm.js +0 -606
- package/dist/src/material/terrain-cm.js.map +0 -1
- package/dist/src/material/terrainmaterial.js +0 -375
- package/dist/src/material/terrainmaterial.js.map +0 -1
- package/dist/src/material/unlit.js +0 -41
- package/dist/src/material/unlit.js.map +0 -1
- package/dist/src/material/water.js +0 -417
- package/dist/src/material/water.js.map +0 -1
- package/dist/src/posteffect/bloom.js +0 -361
- package/dist/src/posteffect/bloom.js.map +0 -1
- package/dist/src/posteffect/compositor.js +0 -226
- package/dist/src/posteffect/compositor.js.map +0 -1
- package/dist/src/posteffect/fxaa.js +0 -273
- package/dist/src/posteffect/fxaa.js.map +0 -1
- package/dist/src/posteffect/grayscale.js +0 -69
- package/dist/src/posteffect/grayscale.js.map +0 -1
- package/dist/src/posteffect/motionblur.js +0 -96
- package/dist/src/posteffect/motionblur.js.map +0 -1
- package/dist/src/posteffect/posteffect.js +0 -126
- package/dist/src/posteffect/posteffect.js.map +0 -1
- package/dist/src/posteffect/sao.js +0 -324
- package/dist/src/posteffect/sao.js.map +0 -1
- package/dist/src/posteffect/ssr.js +0 -489
- package/dist/src/posteffect/ssr.js.map +0 -1
- package/dist/src/posteffect/taa.js +0 -172
- package/dist/src/posteffect/taa.js.map +0 -1
- package/dist/src/posteffect/tonemap.js +0 -94
- package/dist/src/posteffect/tonemap.js.map +0 -1
- package/dist/src/render/abuffer_oit.js +0 -361
- package/dist/src/render/abuffer_oit.js.map +0 -1
- package/dist/src/render/clipmap.js +0 -851
- package/dist/src/render/clipmap.js.map +0 -1
- package/dist/src/render/cluster_light.js +0 -333
- package/dist/src/render/cluster_light.js.map +0 -1
- package/dist/src/render/cull_visitor.js +0 -187
- package/dist/src/render/cull_visitor.js.map +0 -1
- package/dist/src/render/depthpass.js +0 -68
- package/dist/src/render/depthpass.js.map +0 -1
- package/dist/src/render/drawable_mixin.js +0 -227
- package/dist/src/render/drawable_mixin.js.map +0 -1
- package/dist/src/render/envlight.js +0 -463
- package/dist/src/render/envlight.js.map +0 -1
- package/dist/src/render/fbm_wavegenerator.js +0 -251
- package/dist/src/render/fbm_wavegenerator.js.map +0 -1
- package/dist/src/render/fft_wavegenerator.js +0 -1006
- package/dist/src/render/fft_wavegenerator.js.map +0 -1
- package/dist/src/render/fullscreenquad.js +0 -38
- package/dist/src/render/fullscreenquad.js.map +0 -1
- package/dist/src/render/gerstner_wavegenerator.js +0 -314
- package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
- package/dist/src/render/globalbindgroup_allocator.js +0 -60
- package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
- package/dist/src/render/hzb.js +0 -273
- package/dist/src/render/hzb.js.map +0 -1
- package/dist/src/render/lightpass.js +0 -172
- package/dist/src/render/lightpass.js.map +0 -1
- package/dist/src/render/objectcolorpass.js +0 -51
- package/dist/src/render/objectcolorpass.js.map +0 -1
- package/dist/src/render/primitive.js +0 -364
- package/dist/src/render/primitive.js.map +0 -1
- package/dist/src/render/render_queue.js +0 -467
- package/dist/src/render/render_queue.js.map +0 -1
- package/dist/src/render/renderbundle_wrapper.js +0 -152
- package/dist/src/render/renderbundle_wrapper.js.map +0 -1
- package/dist/src/render/renderer.js +0 -455
- package/dist/src/render/renderer.js.map +0 -1
- package/dist/src/render/renderpass.js +0 -200
- package/dist/src/render/renderpass.js.map +0 -1
- package/dist/src/render/shadowmap_pass.js +0 -56
- package/dist/src/render/shadowmap_pass.js.map +0 -1
- package/dist/src/render/sky.js +0 -1103
- package/dist/src/render/sky.js.map +0 -1
- package/dist/src/render/weightedblended_oit.js +0 -168
- package/dist/src/render/weightedblended_oit.js.map +0 -1
- package/dist/src/scene/batchgroup.js +0 -162
- package/dist/src/scene/batchgroup.js.map +0 -1
- package/dist/src/scene/environment.js +0 -209
- package/dist/src/scene/environment.js.map +0 -1
- package/dist/src/scene/graph_node.js +0 -72
- package/dist/src/scene/graph_node.js.map +0 -1
- package/dist/src/scene/light.js +0 -416
- package/dist/src/scene/light.js.map +0 -1
- package/dist/src/scene/mesh.js +0 -341
- package/dist/src/scene/mesh.js.map +0 -1
- package/dist/src/scene/octree.js +0 -649
- package/dist/src/scene/octree.js.map +0 -1
- package/dist/src/scene/particlesys.js +0 -738
- package/dist/src/scene/particlesys.js.map +0 -1
- package/dist/src/scene/raycast_visitor.js +0 -103
- package/dist/src/scene/raycast_visitor.js.map +0 -1
- package/dist/src/scene/scene.js +0 -284
- package/dist/src/scene/scene.js.map +0 -1
- package/dist/src/scene/scene_node.js +0 -732
- package/dist/src/scene/scene_node.js.map +0 -1
- package/dist/src/scene/terrain/grass.js +0 -278
- package/dist/src/scene/terrain/grass.js.map +0 -1
- package/dist/src/scene/terrain/heightfield.js +0 -475
- package/dist/src/scene/terrain/heightfield.js.map +0 -1
- package/dist/src/scene/terrain/patch.js +0 -530
- package/dist/src/scene/terrain/patch.js.map +0 -1
- package/dist/src/scene/terrain/quadtree.js +0 -461
- package/dist/src/scene/terrain/quadtree.js.map +0 -1
- package/dist/src/scene/terrain/terrain.js +0 -246
- package/dist/src/scene/terrain/terrain.js.map +0 -1
- package/dist/src/scene/terrain-cm/grass.js +0 -594
- package/dist/src/scene/terrain-cm/grass.js.map +0 -1
- package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
- package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
- package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
- package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
- package/dist/src/scene/water.js +0 -374
- package/dist/src/scene/water.js.map +0 -1
- package/dist/src/shaders/atmosphere.js +0 -957
- package/dist/src/shaders/atmosphere.js.map +0 -1
- package/dist/src/shaders/fog.js +0 -112
- package/dist/src/shaders/fog.js.map +0 -1
- package/dist/src/shaders/misc.js +0 -266
- package/dist/src/shaders/misc.js.map +0 -1
- package/dist/src/shaders/noise.js +0 -222
- package/dist/src/shaders/noise.js.map +0 -1
- package/dist/src/shaders/pbr.js +0 -51
- package/dist/src/shaders/pbr.js.map +0 -1
- package/dist/src/shaders/shadow.js +0 -636
- package/dist/src/shaders/shadow.js.map +0 -1
- package/dist/src/shaders/ssr.js +0 -490
- package/dist/src/shaders/ssr.js.map +0 -1
- package/dist/src/shaders/temporal.js +0 -215
- package/dist/src/shaders/temporal.js.map +0 -1
- package/dist/src/shaders/water.js +0 -756
- package/dist/src/shaders/water.js.map +0 -1
- package/dist/src/shadow/esm.js +0 -237
- package/dist/src/shadow/esm.js.map +0 -1
- package/dist/src/shadow/pcf_opt.js +0 -181
- package/dist/src/shadow/pcf_opt.js.map +0 -1
- package/dist/src/shadow/pcf_pd.js +0 -189
- package/dist/src/shadow/pcf_pd.js.map +0 -1
- package/dist/src/shadow/shader.js +0 -37
- package/dist/src/shadow/shader.js.map +0 -1
- package/dist/src/shadow/shadow_impl.js +0 -15
- package/dist/src/shadow/shadow_impl.js.map +0 -1
- package/dist/src/shadow/shadowmapper.js +0 -790
- package/dist/src/shadow/shadowmapper.js.map +0 -1
- package/dist/src/shadow/ssm.js +0 -159
- package/dist/src/shadow/ssm.js.map +0 -1
- package/dist/src/shadow/vsm.js +0 -297
- package/dist/src/shadow/vsm.js.map +0 -1
- package/dist/src/shapes/box.js +0 -386
- package/dist/src/shapes/box.js.map +0 -1
- package/dist/src/shapes/cylinder.js +0 -125
- package/dist/src/shapes/cylinder.js.map +0 -1
- package/dist/src/shapes/plane.js +0 -88
- package/dist/src/shapes/plane.js.map +0 -1
- package/dist/src/shapes/shape.js +0 -87
- package/dist/src/shapes/shape.js.map +0 -1
- package/dist/src/shapes/sphere.js +0 -114
- package/dist/src/shapes/sphere.js.map +0 -1
- package/dist/src/shapes/tetrahedron.js +0 -188
- package/dist/src/shapes/tetrahedron.js.map +0 -1
- package/dist/src/shapes/torus.js +0 -111
- package/dist/src/shapes/torus.js.map +0 -1
- package/dist/src/utility/aabbtree.js +0 -400
- package/dist/src/utility/aabbtree.js.map +0 -1
- package/dist/src/utility/bounding_volume.js +0 -29
- package/dist/src/utility/bounding_volume.js.map +0 -1
- package/dist/src/utility/debug.js +0 -28
- package/dist/src/utility/debug.js.map +0 -1
- package/dist/src/utility/draco/decoder.js +0 -116
- package/dist/src/utility/draco/decoder.js.map +0 -1
- package/dist/src/utility/misc.js +0 -105
- package/dist/src/utility/misc.js.map +0 -1
- package/dist/src/utility/panorama.js +0 -163
- package/dist/src/utility/panorama.js.map +0 -1
- package/dist/src/utility/pmrem.js +0 -354
- package/dist/src/utility/pmrem.js.map +0 -1
- package/dist/src/utility/rendermipmap.js +0 -115
- package/dist/src/utility/rendermipmap.js.map +0 -1
- package/dist/src/utility/serialization/json.js +0 -402
- package/dist/src/utility/serialization/json.js.map +0 -1
- package/dist/src/utility/serialization/manager.js +0 -623
- package/dist/src/utility/serialization/manager.js.map +0 -1
- package/dist/src/utility/serialization/scene/animation.js +0 -248
- package/dist/src/utility/serialization/scene/animation.js.map +0 -1
- package/dist/src/utility/serialization/scene/batch.js +0 -59
- package/dist/src/utility/serialization/scene/batch.js.map +0 -1
- package/dist/src/utility/serialization/scene/camera.js +0 -790
- package/dist/src/utility/serialization/scene/camera.js.map +0 -1
- package/dist/src/utility/serialization/scene/common.js +0 -222
- package/dist/src/utility/serialization/scene/common.js.map +0 -1
- package/dist/src/utility/serialization/scene/light.js +0 -575
- package/dist/src/utility/serialization/scene/light.js.map +0 -1
- package/dist/src/utility/serialization/scene/material.js +0 -1111
- package/dist/src/utility/serialization/scene/material.js.map +0 -1
- package/dist/src/utility/serialization/scene/mesh.js +0 -148
- package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
- package/dist/src/utility/serialization/scene/misc.js +0 -39
- package/dist/src/utility/serialization/scene/misc.js.map +0 -1
- package/dist/src/utility/serialization/scene/node.js +0 -451
- package/dist/src/utility/serialization/scene/node.js.map +0 -1
- package/dist/src/utility/serialization/scene/particle.js +0 -425
- package/dist/src/utility/serialization/scene/particle.js.map +0 -1
- package/dist/src/utility/serialization/scene/primitive.js +0 -692
- package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
- package/dist/src/utility/serialization/scene/scene.js +0 -704
- package/dist/src/utility/serialization/scene/scene.js.map +0 -1
- package/dist/src/utility/serialization/scene/terrain.js +0 -488
- package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
- package/dist/src/utility/serialization/scene/water.js +0 -465
- package/dist/src/utility/serialization/scene/water.js.map +0 -1
- package/dist/src/utility/shprojector.js +0 -297
- package/dist/src/utility/shprojector.js.map +0 -1
- package/dist/src/utility/textures/ggxlut.js +0 -213
- package/dist/src/utility/textures/ggxlut.js.map +0 -1
- package/dist/src/utility/textures/gradientnoise.js +0 -62
- package/dist/src/utility/textures/gradientnoise.js.map +0 -1
- package/dist/src/utility/textures/randomnoise.js +0 -41
- package/dist/src/utility/textures/randomnoise.js.map +0 -1
- package/dist/src/values.js +0 -162
- package/dist/src/values.js.map +0 -1
- package/dist/utility/blueprint/material/common.js +0 -7
- package/dist/utility/blueprint/material/common.js.map +0 -1
- package/dist/utility/serialization/blueprint/constants.js +0 -255
- package/dist/utility/serialization/blueprint/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/constants.js +0 -203
- package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/texture.js +0 -165
- package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
- package/dist/utility/serialization/scene/cloth_script.js +0 -834
- package/dist/utility/serialization/scene/cloth_script.js.map +0 -1
- package/dist/utility/serialization/scene/spring_script.js +0 -596
- package/dist/utility/serialization/scene/spring_script.js.map +0 -1
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
import { clamp01 } from './math.js';
|
|
2
|
-
import { EPSILON } from './types.js';
|
|
3
|
-
import { buildConstraints, buildSurfaceFaces } from './constraints.js';
|
|
4
|
-
import { simulate, applyAngleLimits, applyResult } from './solver.js';
|
|
5
|
-
import { Vector3, Quaternion, Matrix4x4 } from '@zephyr3d/base';
|
|
6
|
-
|
|
7
|
-
// High-level orchestrator — SPCRJointDynamicsController API
|
|
8
|
-
class SpringSystemController {
|
|
9
|
-
_config;
|
|
10
|
-
_pointsR = [];
|
|
11
|
-
_pointsRW = [];
|
|
12
|
-
_constraints = [];
|
|
13
|
-
_collidersR = [];
|
|
14
|
-
_collidersRW = [];
|
|
15
|
-
_grabbersR = [];
|
|
16
|
-
_grabbersRW = [];
|
|
17
|
-
_movableLimitTargets = [];
|
|
18
|
-
_flatPlanes = [];
|
|
19
|
-
_surfaceConstraints = [];
|
|
20
|
-
_positionsToTransform = [];
|
|
21
|
-
_fakeWaveCounter = 0;
|
|
22
|
-
_previousRootPosition = Vector3.zero();
|
|
23
|
-
_previousRootRotation = Quaternion.identity();
|
|
24
|
-
_rootTransform = null;
|
|
25
|
-
_pointTransforms = [];
|
|
26
|
-
_colliderTransforms = [];
|
|
27
|
-
_grabberTransforms = [];
|
|
28
|
-
_initialized = false;
|
|
29
|
-
_isPaused = false;
|
|
30
|
-
_fadeState = 'none';
|
|
31
|
-
_fadeTimer = 0;
|
|
32
|
-
_fadeDuration = 0;
|
|
33
|
-
constructor(config){
|
|
34
|
-
this._config = config;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* 初始化物理系统
|
|
38
|
-
* @param rootTransform 根骨骼的 transform(用于检测根运动)
|
|
39
|
-
* @param rootPoints 骨骼层级的根节点数组(可以有多个根,如裙子的多条链)
|
|
40
|
-
* @param pointTransforms 所有物理点的 transform 数组(顺序必须与 BoneNode.index 对应)
|
|
41
|
-
* @param colliders 碰撞器数组(球体/胶囊体)
|
|
42
|
-
* @param grabbers 抓取器数组(用于鼠标交互等)
|
|
43
|
-
* @param flatPlanes 平面限制器数组(如地板,防止穿透)
|
|
44
|
-
*/ initialize(rootTransform, rootPoints, pointTransforms, colliders, grabbers, flatPlanes) {
|
|
45
|
-
this._rootTransform = rootTransform;
|
|
46
|
-
this._pointTransforms = pointTransforms;
|
|
47
|
-
this._colliderTransforms = colliders.map((c)=>c.transform);
|
|
48
|
-
this._grabberTransforms = grabbers.map((g)=>g.transform);
|
|
49
|
-
// Build constraints
|
|
50
|
-
this._constraints = buildConstraints(rootPoints, this._config.constraintOptions);
|
|
51
|
-
this._surfaceConstraints = buildSurfaceFaces(rootPoints, this._config.constraintOptions.isLoop);
|
|
52
|
-
// Flatten bone hierarchy to point list, build parent map
|
|
53
|
-
const allPoints = [];
|
|
54
|
-
const parentMap = new Map(); // child index → parent index
|
|
55
|
-
function walk(node) {
|
|
56
|
-
allPoints.push(node);
|
|
57
|
-
for (const c of node.children){
|
|
58
|
-
parentMap.set(c.index, node.index);
|
|
59
|
-
walk(c);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
for (const r of rootPoints){
|
|
63
|
-
walk(r);
|
|
64
|
-
}
|
|
65
|
-
const maxDepth = Math.max(...allPoints.map((p)=>p.depth));
|
|
66
|
-
// Compute boneAxis from transforms: local-space direction to first child
|
|
67
|
-
// This is critical for correct bone rotation in skinned meshes
|
|
68
|
-
const indexToNode = new Map();
|
|
69
|
-
for (const p of allPoints){
|
|
70
|
-
indexToNode.set(p.index, p);
|
|
71
|
-
}
|
|
72
|
-
for (const p of allPoints){
|
|
73
|
-
if (!p.boneAxis && p.children.length > 0) {
|
|
74
|
-
const childPos = pointTransforms[p.children[0].index].getWorldPosition();
|
|
75
|
-
const parentPos = pointTransforms[p.index].getWorldPosition();
|
|
76
|
-
// InverseTransformPoint: convert child world pos to parent local space
|
|
77
|
-
const parentRot = pointTransforms[p.index].getWorldRotation();
|
|
78
|
-
const parentScale = pointTransforms[p.index].getLocalScale();
|
|
79
|
-
const diff = Vector3.sub(childPos, parentPos);
|
|
80
|
-
const invRot = Quaternion.inverse(parentRot);
|
|
81
|
-
const localDir = invRot.transform(diff);
|
|
82
|
-
// Apply inverse scale
|
|
83
|
-
const unscaled = new Vector3(parentScale.x !== 0 ? localDir.x / parentScale.x : 0, parentScale.y !== 0 ? localDir.y / parentScale.y : 0, parentScale.z !== 0 ? localDir.z / parentScale.z : 0);
|
|
84
|
-
p.boneAxis = Vector3.normalize(unscaled);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Build PointR/RW arrays
|
|
88
|
-
this._pointsR = allPoints.map((p)=>this._createPointR(p, maxDepth, parentMap, pointTransforms));
|
|
89
|
-
this._pointsRW = allPoints.map(()=>this._createPointRW());
|
|
90
|
-
this._positionsToTransform = new Array(allPoints.length).fill(Vector3.zero());
|
|
91
|
-
// Initialize colliders
|
|
92
|
-
this._collidersR = colliders.map((c)=>c.r);
|
|
93
|
-
this._collidersRW = colliders.map((c)=>this._createColliderRW(c.transform));
|
|
94
|
-
// Initialize grabbers
|
|
95
|
-
this._grabbersR = grabbers.map((g)=>g.r);
|
|
96
|
-
this._grabbersRW = grabbers.map((g)=>({
|
|
97
|
-
enabled: g.enabled ? 1 : 0,
|
|
98
|
-
position: g.transform.getWorldPosition()
|
|
99
|
-
}));
|
|
100
|
-
// Flat planes
|
|
101
|
-
this._flatPlanes = flatPlanes.map((fp)=>({
|
|
102
|
-
normal: Vector3.normalize(fp.up),
|
|
103
|
-
distance: -Vector3.dot(Vector3.normalize(fp.up), fp.position)
|
|
104
|
-
}));
|
|
105
|
-
// Capture initial state
|
|
106
|
-
this._previousRootPosition = rootTransform.getWorldPosition();
|
|
107
|
-
this._previousRootRotation = rootTransform.getWorldRotation();
|
|
108
|
-
for(let i = 0; i < this._pointsRW.length; i++){
|
|
109
|
-
const pos = pointTransforms[i].getWorldPosition();
|
|
110
|
-
this._pointsRW[i].positionCurrent = pos.clone();
|
|
111
|
-
this._pointsRW[i].positionPrevious = pos.clone();
|
|
112
|
-
this._pointsRW[i].positionCurrentTransform = pos.clone();
|
|
113
|
-
this._pointsRW[i].positionPreviousTransform = pos.clone();
|
|
114
|
-
this._pointsRW[i].positionToTransform = pos.clone();
|
|
115
|
-
this._pointsRW[i].directionPrevious = Vector3.axisPZ();
|
|
116
|
-
this._pointsRW[i].fakeWindDirection = Vector3.axisPZ();
|
|
117
|
-
this._pointsRW[i].grabberIndex = -1;
|
|
118
|
-
this._pointsRW[i].grabberDistance = 0;
|
|
119
|
-
this._pointsRW[i].friction = 0;
|
|
120
|
-
}
|
|
121
|
-
this._initialized = true;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* 执行一帧物理模拟
|
|
125
|
-
* 内部流程:读取当前 transform → 运行 Verlet 积分和约束求解 → 写回 transform
|
|
126
|
-
* @param deltaTime 帧间隔时间(秒)。内部会被 subSteps 细分
|
|
127
|
-
*/ step(deltaTime) {
|
|
128
|
-
if (!this._initialized || !this._rootTransform) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// Update fade
|
|
132
|
-
if (this._fadeState !== 'none') {
|
|
133
|
-
this._fadeTimer += deltaTime;
|
|
134
|
-
if (this._fadeTimer >= this._fadeDuration) {
|
|
135
|
-
this._fadeState = 'none';
|
|
136
|
-
this._fadeTimer = 0;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
const blendRatio = this._computeBlendRatio();
|
|
140
|
-
// Capture current transforms
|
|
141
|
-
const rootPos = this._rootTransform.getWorldPosition();
|
|
142
|
-
const rootRot = this._rootTransform.getWorldRotation();
|
|
143
|
-
for(let i = 0; i < this._pointsRW.length; i++){
|
|
144
|
-
this._pointsRW[i].positionPreviousTransform = this._pointsRW[i].positionCurrentTransform.clone();
|
|
145
|
-
this._pointsRW[i].positionCurrentTransform = this._pointTransforms[i].getWorldPosition();
|
|
146
|
-
}
|
|
147
|
-
for(let i = 0; i < this._collidersRW.length; i++){
|
|
148
|
-
const t = this._colliderTransforms[i];
|
|
149
|
-
this._collidersRW[i].positionPreviousTransform = this._collidersRW[i].positionCurrentTransform.clone();
|
|
150
|
-
this._collidersRW[i].directionPreviousTransform = this._collidersRW[i].directionCurrentTransform.clone();
|
|
151
|
-
this._collidersRW[i].positionCurrentTransform = t.getWorldPosition();
|
|
152
|
-
this._collidersRW[i].directionCurrentTransform = t.getWorldRotation();
|
|
153
|
-
this._collidersRW[i].worldToLocal = Matrix4x4.compose(t.getLocalScale(), this._collidersRW[i].directionCurrentTransform, this._collidersRW[i].positionCurrentTransform).inplaceInvertAffine();
|
|
154
|
-
}
|
|
155
|
-
for(let i = 0; i < this._grabbersRW.length; i++){
|
|
156
|
-
this._grabbersRW[i].position = this._grabberTransforms[i].getWorldPosition();
|
|
157
|
-
}
|
|
158
|
-
// Run simulation
|
|
159
|
-
const params = {
|
|
160
|
-
isPaused: this._isPaused,
|
|
161
|
-
stepTime: deltaTime,
|
|
162
|
-
subSteps: this._config.subSteps,
|
|
163
|
-
rootPosition: rootPos,
|
|
164
|
-
previousRootPosition: this._previousRootPosition,
|
|
165
|
-
rootSlideLimit: this._config.rootSlideLimit,
|
|
166
|
-
rootRotation: rootRot,
|
|
167
|
-
previousRootRotation: this._previousRootRotation,
|
|
168
|
-
rootRotateLimit: this._config.rootRotateLimit,
|
|
169
|
-
windForce: this._config.windForce,
|
|
170
|
-
enableSurfaceCollision: this._config.enableSurfaceCollision,
|
|
171
|
-
surfaceConstraints: this._surfaceConstraints,
|
|
172
|
-
relaxation: this._config.relaxation,
|
|
173
|
-
constraintShrinkLimit: this._config.constraintShrinkLimit,
|
|
174
|
-
blendRatio,
|
|
175
|
-
isFakeWave: this._config.isFakeWave,
|
|
176
|
-
fakeWaveSpeed: this._config.fakeWaveSpeed,
|
|
177
|
-
fakeWavePower: this._config.fakeWavePower,
|
|
178
|
-
fakeWaveCounter: this._fakeWaveCounter,
|
|
179
|
-
collisionScale: 1.0,
|
|
180
|
-
enableBroadPhase: this._config.enableBroadPhase
|
|
181
|
-
};
|
|
182
|
-
const result = simulate(params, this._pointsR, this._pointsRW, this._constraints, this._collidersR, this._collidersRW, this._grabbersR, this._grabbersRW, this._movableLimitTargets, this._flatPlanes);
|
|
183
|
-
this._positionsToTransform = result.positionsToTransform;
|
|
184
|
-
this._fakeWaveCounter = result.fakeWaveCounter;
|
|
185
|
-
// Angle limits
|
|
186
|
-
if (this._config.angleLimitConfig.angleLimit >= 0) {
|
|
187
|
-
applyAngleLimits(this._pointsR, this._pointsRW, this._config.angleLimitConfig);
|
|
188
|
-
}
|
|
189
|
-
// Apply results
|
|
190
|
-
const transformRots = this._pointTransforms.map((t)=>t.getWorldRotation());
|
|
191
|
-
const transformLocalRots = this._pointTransforms.map((t)=>t.getLocalRotation());
|
|
192
|
-
const outputs = applyResult(this._pointsR, this._pointsRW, this._positionsToTransform, blendRatio, transformRots, transformLocalRots);
|
|
193
|
-
for(let i = 0; i < outputs.length; i++){
|
|
194
|
-
this._pointTransforms[i].setWorldPosition(outputs[i].position);
|
|
195
|
-
this._pointTransforms[i].setWorldRotation(outputs[i].rotation);
|
|
196
|
-
}
|
|
197
|
-
this._previousRootPosition = rootPos;
|
|
198
|
-
this._previousRootRotation = rootRot;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* 获取所有点的模拟结果(世界坐标位置和旋转)
|
|
202
|
-
* 通常不需要手动调用——step() 已经自动写回 transform。
|
|
203
|
-
* 适用于需要在不写回 transform 的情况下读取物理结果的场景。
|
|
204
|
-
*/ getResults() {
|
|
205
|
-
const transformRots = this._pointTransforms.map((t)=>t.getWorldRotation());
|
|
206
|
-
const transformLocalRots = this._pointTransforms.map((t)=>t.getLocalRotation());
|
|
207
|
-
const outputs = applyResult(this._pointsR, this._pointsRW, this._positionsToTransform, this._config.blendRatio, transformRots, transformLocalRots);
|
|
208
|
-
return outputs.map((o)=>({
|
|
209
|
-
position: o.position,
|
|
210
|
-
rotation: o.rotation
|
|
211
|
-
}));
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* 瞬移补偿——在角色传送/瞬移后调用
|
|
215
|
-
* 将上一帧的根骨骼位置和旋转设为当前值,
|
|
216
|
-
* 使下一帧的根运动增量为零,避免物理点因巨大位移而弹射。
|
|
217
|
-
*/ warp() {
|
|
218
|
-
if (!this._rootTransform) {
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
this._previousRootPosition = this._rootTransform.getWorldPosition();
|
|
222
|
-
this._previousRootRotation = this._rootTransform.getWorldRotation();
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* 重置所有物理状态
|
|
226
|
-
* 将所有点的模拟位置重置为当前 transform 位置,清除速度和抓取状态。
|
|
227
|
-
* 适用于场景切换或需要消除所有物理运动的场景。
|
|
228
|
-
*/ reset() {
|
|
229
|
-
for(let i = 0; i < this._pointsRW.length; i++){
|
|
230
|
-
const pos = this._pointTransforms[i].getWorldPosition();
|
|
231
|
-
this._pointsRW[i].positionCurrent = pos.clone();
|
|
232
|
-
this._pointsRW[i].positionPrevious = pos.clone();
|
|
233
|
-
this._pointsRW[i].grabberIndex = -1;
|
|
234
|
-
}
|
|
235
|
-
this._fakeWaveCounter = 0;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* 释放固定点为动态点(如脱衣、布料脱落)
|
|
239
|
-
* 将 weight 从 0 改为 1,同时重置该点的模拟状态避免瞬间弹射。
|
|
240
|
-
* @param index 点的索引
|
|
241
|
-
*/ releasePoint(index) {
|
|
242
|
-
if (index < 0 || index >= this._pointsR.length) {
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
this._pointsR[index].weight = 1;
|
|
246
|
-
const pos = this._pointTransforms[index].getWorldPosition();
|
|
247
|
-
this._pointsRW[index].positionCurrent = pos.clone();
|
|
248
|
-
this._pointsRW[index].positionPrevious = pos.clone();
|
|
249
|
-
this._pointsRW[index].grabberIndex = -1;
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* 将动态点重新固定为跟随动画(如重新穿戴)
|
|
253
|
-
* 将 weight 从 1 改为 0,清除抓取状态。
|
|
254
|
-
* @param index 点的索引
|
|
255
|
-
*/ fixPoint(index) {
|
|
256
|
-
if (index < 0 || index >= this._pointsR.length) {
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
this._pointsR[index].weight = 0;
|
|
260
|
-
this._pointsRW[index].grabberIndex = -1;
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* 查询某个点是否为固定状态(weight=0,跟随动画)
|
|
264
|
-
* @param index 点的索引
|
|
265
|
-
*/ isPointFixed(index) {
|
|
266
|
-
if (index < 0 || index >= this._pointsR.length) {
|
|
267
|
-
return false;
|
|
268
|
-
}
|
|
269
|
-
return this._pointsR[index].weight <= EPSILON;
|
|
270
|
-
}
|
|
271
|
-
/** 获取物理点总数 */ get pointCount() {
|
|
272
|
-
return this._pointsR.length;
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* 渐入物理——从动画姿态平滑过渡到物理模拟
|
|
276
|
-
* blendRatio 从 1(纯动画)渐变到 0(纯物理)
|
|
277
|
-
* @param seconds 过渡时长(秒)
|
|
278
|
-
*/ fadeIn(seconds) {
|
|
279
|
-
this._fadeState = 'in';
|
|
280
|
-
this._fadeTimer = 0;
|
|
281
|
-
this._fadeDuration = seconds;
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* 渐出物理——从物理模拟平滑过渡回动画姿态
|
|
285
|
-
* blendRatio 从 0(纯物理)渐变到 1(纯动画)
|
|
286
|
-
* @param seconds 过渡时长(秒)
|
|
287
|
-
*/ fadeOut(seconds) {
|
|
288
|
-
this._fadeState = 'out';
|
|
289
|
-
this._fadeTimer = 0;
|
|
290
|
-
this._fadeDuration = seconds;
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* 设置全局风力向量
|
|
294
|
-
* 风力会按每个点的 windForceScale 和质量进行缩放
|
|
295
|
-
* @param wind 风力向量(世界坐标)
|
|
296
|
-
*/ setWindForce(wind) {
|
|
297
|
-
this._config.windForce = wind;
|
|
298
|
-
}
|
|
299
|
-
/** Enable/disable broad-phase pruning for runtime performance comparison */ setBroadPhaseEnabled(enabled) {
|
|
300
|
-
this._config.enableBroadPhase = enabled;
|
|
301
|
-
}
|
|
302
|
-
/**
|
|
303
|
-
* 暂停/恢复物理模拟
|
|
304
|
-
* 暂停时仍会跟随根骨骼运动,但不进行力学积分和约束求解
|
|
305
|
-
* @param paused true=暂停, false=恢复
|
|
306
|
-
*/ setPaused(paused) {
|
|
307
|
-
this._isPaused = paused;
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* 运行时更新碰撞器状态
|
|
311
|
-
* 用于外部直接控制碰撞器的启用/禁用和位置,而不通过 TransformAccess 读取
|
|
312
|
-
* @param index 碰撞器索引
|
|
313
|
-
* @param enabled 是否启用
|
|
314
|
-
* @param position 世界坐标位置
|
|
315
|
-
* @param rotation 世界旋转
|
|
316
|
-
*/ updateColliderState(index, enabled, position, rotation) {
|
|
317
|
-
if (index >= 0 && index < this._collidersRW.length) {
|
|
318
|
-
this._collidersRW[index].enabled = enabled ? 1 : 0;
|
|
319
|
-
this._collidersRW[index].positionCurrentTransform = position;
|
|
320
|
-
this._collidersRW[index].directionCurrentTransform = rotation;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* 运行时更新抓取器状态
|
|
325
|
-
* 用于鼠标拖拽等交互场景,控制抓取器的启用和位置
|
|
326
|
-
* @param index 抓取器索引
|
|
327
|
-
* @param enabled 是否启用(鼠标按下=true,松开=false)
|
|
328
|
-
* @param position 抓取器世界坐标位置
|
|
329
|
-
*/ updateGrabberState(index, enabled, position) {
|
|
330
|
-
if (index >= 0 && index < this._grabbersRW.length) {
|
|
331
|
-
this._grabbersRW[index].enabled = enabled ? 1 : 0;
|
|
332
|
-
this._grabbersRW[index].position = position;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
_computeBlendRatio() {
|
|
336
|
-
if (this._fadeState === 'in') {
|
|
337
|
-
return 1.0 - clamp01(this._fadeTimer / this._fadeDuration);
|
|
338
|
-
}
|
|
339
|
-
if (this._fadeState === 'out') {
|
|
340
|
-
return clamp01(this._fadeTimer / this._fadeDuration);
|
|
341
|
-
}
|
|
342
|
-
return this._config.blendRatio;
|
|
343
|
-
}
|
|
344
|
-
_createPointR(node, maxDepth, parentMap, transforms) {
|
|
345
|
-
const rate = maxDepth > 0 ? node.depth / maxDepth : 0;
|
|
346
|
-
const c = this._config.curves;
|
|
347
|
-
const parentIdx = parentMap.get(node.index) ?? -1;
|
|
348
|
-
const childIdx = node.children.length > 0 ? node.children[0].index : -1;
|
|
349
|
-
// Capture initial local transform for rotation blending
|
|
350
|
-
const t = transforms[node.index];
|
|
351
|
-
const initLocalPos = t.getLocalPosition();
|
|
352
|
-
const initLocalRot = t.getLocalRotation();
|
|
353
|
-
const initLocalScale = t.getLocalScale();
|
|
354
|
-
// BoneAxis: local-space direction to first child (computed in initialize)
|
|
355
|
-
const boneAxis = node.boneAxis ?? new Vector3(0, -1, 0);
|
|
356
|
-
// ParentLength: distance to parent
|
|
357
|
-
let parentLength = 0;
|
|
358
|
-
if (parentIdx !== -1) {
|
|
359
|
-
const pPos = transforms[parentIdx].getWorldPosition();
|
|
360
|
-
const cPos = transforms[node.index].getWorldPosition();
|
|
361
|
-
parentLength = Vector3.distance(pPos, cPos);
|
|
362
|
-
}
|
|
363
|
-
return {
|
|
364
|
-
parent: parentIdx,
|
|
365
|
-
child: childIdx,
|
|
366
|
-
applyInvertCollision: 0,
|
|
367
|
-
movableLimitIndex: -1,
|
|
368
|
-
movableLimitRadius: 0,
|
|
369
|
-
weight: node.isFixed ? 0 : 1,
|
|
370
|
-
mass: c.massScale.evaluate(rate),
|
|
371
|
-
resistance: clamp01(c.resistance.evaluate(rate)),
|
|
372
|
-
hardness: clamp01(c.hardness.evaluate(rate)),
|
|
373
|
-
frictionScale: c.friction.evaluate(rate),
|
|
374
|
-
sliderJointLength: c.sliderJointLength.evaluate(rate),
|
|
375
|
-
parentLength,
|
|
376
|
-
structuralShrinkVertical: c.structuralShrinkVertical.evaluate(rate) * 0.5,
|
|
377
|
-
structuralStretchVertical: c.structuralStretchVertical.evaluate(rate) * 0.5,
|
|
378
|
-
structuralShrinkHorizontal: c.structuralShrinkHorizontal.evaluate(rate) * 0.5,
|
|
379
|
-
structuralStretchHorizontal: c.structuralStretchHorizontal.evaluate(rate) * 0.5,
|
|
380
|
-
shearShrink: c.shearShrink.evaluate(rate) * 0.5,
|
|
381
|
-
shearStretch: c.shearStretch.evaluate(rate) * 0.5,
|
|
382
|
-
bendingShrinkVertical: c.bendingShrinkVertical.evaluate(rate) * 0.5,
|
|
383
|
-
bendingStretchVertical: c.bendingStretchVertical.evaluate(rate) * 0.5,
|
|
384
|
-
bendingShrinkHorizontal: c.bendingShrinkHorizontal.evaluate(rate) * 0.5,
|
|
385
|
-
bendingStretchHorizontal: c.bendingStretchHorizontal.evaluate(rate) * 0.5,
|
|
386
|
-
windForceScale: c.windForceScale.evaluate(rate) * rate,
|
|
387
|
-
fakeWavePower: c.fakeWavePower.evaluate(rate),
|
|
388
|
-
fakeWaveFreq: c.fakeWaveFreq.evaluate(rate),
|
|
389
|
-
forceFadeRatio: 0,
|
|
390
|
-
pointRadius: 0.05,
|
|
391
|
-
gravity: Vector3.scale(this._config.gravity, c.gravityScale.evaluate(rate)),
|
|
392
|
-
boneAxis,
|
|
393
|
-
initialLocalScale: initLocalScale,
|
|
394
|
-
initialLocalRotation: initLocalRot,
|
|
395
|
-
initialLocalPosition: initLocalPos
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
_createPointRW() {
|
|
399
|
-
return {
|
|
400
|
-
positionToTransform: Vector3.zero(),
|
|
401
|
-
positionCurrentTransform: Vector3.zero(),
|
|
402
|
-
positionPreviousTransform: Vector3.zero(),
|
|
403
|
-
positionCurrent: Vector3.zero(),
|
|
404
|
-
positionPrevious: Vector3.zero(),
|
|
405
|
-
directionPrevious: Vector3.axisPZ(),
|
|
406
|
-
fakeWindDirection: Vector3.axisPZ(),
|
|
407
|
-
grabberIndex: -1,
|
|
408
|
-
grabberDistance: 0,
|
|
409
|
-
friction: 0
|
|
410
|
-
};
|
|
411
|
-
}
|
|
412
|
-
_createColliderRW(transform) {
|
|
413
|
-
const pos = transform.getWorldPosition();
|
|
414
|
-
const rot = transform.getWorldRotation();
|
|
415
|
-
return {
|
|
416
|
-
positionCurrent: pos.clone(),
|
|
417
|
-
directionCurrent: Vector3.zero(),
|
|
418
|
-
boundsCenter: pos.clone(),
|
|
419
|
-
boundsRadius: 0,
|
|
420
|
-
positionCurrentTransform: pos.clone(),
|
|
421
|
-
positionPreviousTransform: pos.clone(),
|
|
422
|
-
directionCurrentTransform: rot.clone(),
|
|
423
|
-
directionPreviousTransform: rot.clone(),
|
|
424
|
-
worldToLocal: Matrix4x4.identity(),
|
|
425
|
-
localBoundsMin: Vector3.zero(),
|
|
426
|
-
localBoundsMax: Vector3.zero(),
|
|
427
|
-
radius: 0,
|
|
428
|
-
enabled: 1
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
export { SpringSystemController };
|
|
434
|
-
//# sourceMappingURL=controller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sources":["../../../src/animation/spring2/controller.ts"],"sourcesContent":["// High-level orchestrator — SPCRJointDynamicsController API\n\nimport { clamp01 } from './math';\nimport {\n EPSILON,\n type PointR,\n type PointRW,\n type Constraint,\n type ColliderR,\n type ColliderRW,\n type GrabberR,\n type GrabberRW,\n type AngleLimitConfig,\n type FlatPlane,\n type TransformAccess,\n type BoneNode\n} from './types';\nimport { buildConstraints, buildSurfaceFaces, type ConstraintBuildOptions } from './constraints';\nimport { simulate, applyResult, applyAngleLimits, type SimulationParams } from './solver';\nimport type { InterpolatorScalar } from '@zephyr3d/base';\nimport { Vector3, Quaternion, Matrix4x4 } from '@zephyr3d/base';\n\n/**\n * Depth-based physics parameter curves.\n * Each curve is evaluated with t = pointDepth / maxDepth (0 at root, 1 at tip).\n * This allows parameters to vary smoothly along the bone chain.\n */\nexport interface PhysicsCurves {\n /** Scales point mass by depth */\n massScale: InterpolatorScalar;\n /** Scales gravity strength by depth */\n gravityScale: InterpolatorScalar;\n /** Scales wind force effect by depth (also multiplied by depth rate) */\n windForceScale: InterpolatorScalar;\n /** Velocity damping [0-1]. Higher = less damping. Controls how much velocity is preserved */\n resistance: InterpolatorScalar;\n /** Restore-to-animation stiffness [0-1]. Higher = bone stays closer to animated pose */\n hardness: InterpolatorScalar;\n /** Friction multiplier by depth. Scales collision friction accumulation */\n friction: InterpolatorScalar;\n /** Extra slack length for horizontal/shear constraints (allows stretching) */\n sliderJointLength: InterpolatorScalar;\n /** Global shrink stiffness multiplier (applied to all constraint types) */\n allShrinkScale: InterpolatorScalar;\n /** Global stretch stiffness multiplier (applied to all constraint types) */\n allStretchScale: InterpolatorScalar;\n /** Structural vertical constraint shrink stiffness by depth */\n structuralShrinkVertical: InterpolatorScalar;\n /** Structural vertical constraint stretch stiffness by depth */\n structuralStretchVertical: InterpolatorScalar;\n /** Structural horizontal constraint shrink stiffness by depth */\n structuralShrinkHorizontal: InterpolatorScalar;\n /** Structural horizontal constraint stretch stiffness by depth */\n structuralStretchHorizontal: InterpolatorScalar;\n /** Shear constraint shrink stiffness by depth */\n shearShrink: InterpolatorScalar;\n /** Shear constraint stretch stiffness by depth */\n shearStretch: InterpolatorScalar;\n /** Bending vertical constraint shrink stiffness by depth */\n bendingShrinkVertical: InterpolatorScalar;\n /** Bending vertical constraint stretch stiffness by depth */\n bendingStretchVertical: InterpolatorScalar;\n /** Bending horizontal constraint shrink stiffness by depth */\n bendingShrinkHorizontal: InterpolatorScalar;\n /** Bending horizontal constraint stretch stiffness by depth */\n bendingStretchHorizontal: InterpolatorScalar;\n /** Fake wave amplitude by depth (sinusoidal pseudo-wind on leaf bones) */\n fakeWavePower: InterpolatorScalar;\n /** Fake wave frequency offset by depth */\n fakeWaveFreq: InterpolatorScalar;\n}\n\n/** Top-level configuration for the physics controller */\nexport interface ControllerConfig {\n /** Global gravity vector (e.g. {x:0, y:-9.8, z:0}) */\n gravity: Vector3;\n /** Global wind force vector applied to all dynamic points */\n windForce: Vector3;\n /** Number of constraint relaxation iterations per substep. Higher = more stable but slower */\n relaxation: number;\n /** Number of simulation substeps per frame. Higher = more stable at cost of performance */\n subSteps: number;\n /** Max root bone slide distance per substep. Excess is distributed as offset. -1 = unlimited */\n rootSlideLimit: number;\n /** Max root bone rotation angle (degrees) per substep. Excess is distributed. -1 = unlimited */\n rootRotateLimit: number;\n /** Upper limit for horizontal/shear constraint shrink power. Prevents over-compression */\n constraintShrinkLimit: number;\n /** Global blend ratio between physics and animation [0-1]. 0 = full physics, 1 = full animation */\n blendRatio: number;\n /** Target frame rate for stabilization (currently unused, reserved) */\n stabilizationFrameRate: number;\n /** Enable sinusoidal fake wave effect on leaf bones */\n isFakeWave: boolean;\n /** Fake wave global speed (accumulates over time) */\n fakeWaveSpeed: number;\n /** Fake wave global amplitude multiplier */\n fakeWavePower: number;\n /** Enable triangle-based surface collision (cloth vs colliders) */\n enableSurfaceCollision: boolean;\n /** Enable broad-phase pruning before precise collider tests */\n enableBroadPhase: boolean;\n /** Post-simulation angle limiting between parent-child bones */\n angleLimitConfig: AngleLimitConfig;\n /** Depth-based physics parameter curves */\n curves: PhysicsCurves;\n /** Which constraint types to generate and their collision flags */\n constraintOptions: ConstraintBuildOptions;\n}\n\nexport class SpringSystemController {\n private _config: ControllerConfig;\n private _pointsR: PointR[] = [];\n private _pointsRW: PointRW[] = [];\n private _constraints: Constraint[] = [];\n private _collidersR: ColliderR[] = [];\n private _collidersRW: ColliderRW[] = [];\n private _grabbersR: GrabberR[] = [];\n private _grabbersRW: GrabberRW[] = [];\n private _movableLimitTargets: Vector3[] = [];\n private _flatPlanes: FlatPlane[] = [];\n private _surfaceConstraints: number[] = [];\n private _positionsToTransform: Vector3[] = [];\n private _fakeWaveCounter = 0;\n private _previousRootPosition = Vector3.zero();\n private _previousRootRotation = Quaternion.identity();\n private _rootTransform: TransformAccess | null = null;\n private _pointTransforms: TransformAccess[] = [];\n private _colliderTransforms: TransformAccess[] = [];\n private _grabberTransforms: TransformAccess[] = [];\n private _initialized = false;\n private _isPaused = false;\n private _fadeState: 'none' | 'in' | 'out' = 'none';\n private _fadeTimer = 0;\n private _fadeDuration = 0;\n\n constructor(config: ControllerConfig) {\n this._config = config;\n }\n\n /**\n * 初始化物理系统\n * @param rootTransform 根骨骼的 transform(用于检测根运动)\n * @param rootPoints 骨骼层级的根节点数组(可以有多个根,如裙子的多条链)\n * @param pointTransforms 所有物理点的 transform 数组(顺序必须与 BoneNode.index 对应)\n * @param colliders 碰撞器数组(球体/胶囊体)\n * @param grabbers 抓取器数组(用于鼠标交互等)\n * @param flatPlanes 平面限制器数组(如地板,防止穿透)\n */\n initialize(\n rootTransform: TransformAccess,\n rootPoints: BoneNode[],\n pointTransforms: TransformAccess[],\n colliders: Array<{ r: ColliderR; transform: TransformAccess }>,\n grabbers: Array<{\n r: GrabberR;\n transform: TransformAccess;\n enabled: boolean;\n }>,\n flatPlanes: Array<{ up: Vector3; position: Vector3 }>\n ): void {\n this._rootTransform = rootTransform;\n this._pointTransforms = pointTransforms;\n this._colliderTransforms = colliders.map((c) => c.transform);\n this._grabberTransforms = grabbers.map((g) => g.transform);\n\n // Build constraints\n this._constraints = buildConstraints(rootPoints, this._config.constraintOptions);\n this._surfaceConstraints = buildSurfaceFaces(rootPoints, this._config.constraintOptions.isLoop);\n\n // Flatten bone hierarchy to point list, build parent map\n const allPoints: BoneNode[] = [];\n const parentMap = new Map<number, number>(); // child index → parent index\n function walk(node: BoneNode) {\n allPoints.push(node);\n for (const c of node.children) {\n parentMap.set(c.index, node.index);\n walk(c);\n }\n }\n for (const r of rootPoints) {\n walk(r);\n }\n\n const maxDepth = Math.max(...allPoints.map((p) => p.depth));\n\n // Compute boneAxis from transforms: local-space direction to first child\n // This is critical for correct bone rotation in skinned meshes\n const indexToNode = new Map<number, BoneNode>();\n for (const p of allPoints) {\n indexToNode.set(p.index, p);\n }\n\n for (const p of allPoints) {\n if (!p.boneAxis && p.children.length > 0) {\n const childPos = pointTransforms[p.children[0].index].getWorldPosition();\n const parentPos = pointTransforms[p.index].getWorldPosition();\n // InverseTransformPoint: convert child world pos to parent local space\n const parentRot = pointTransforms[p.index].getWorldRotation();\n const parentScale = pointTransforms[p.index].getLocalScale();\n const diff = Vector3.sub(childPos, parentPos);\n const invRot = Quaternion.inverse(parentRot);\n const localDir = invRot.transform(diff);\n // Apply inverse scale\n const unscaled = new Vector3(\n parentScale.x !== 0 ? localDir.x / parentScale.x : 0,\n parentScale.y !== 0 ? localDir.y / parentScale.y : 0,\n parentScale.z !== 0 ? localDir.z / parentScale.z : 0\n );\n p.boneAxis = Vector3.normalize(unscaled);\n }\n }\n\n // Build PointR/RW arrays\n this._pointsR = allPoints.map((p) => this._createPointR(p, maxDepth, parentMap, pointTransforms));\n this._pointsRW = allPoints.map(() => this._createPointRW());\n this._positionsToTransform = new Array(allPoints.length).fill(Vector3.zero());\n\n // Initialize colliders\n this._collidersR = colliders.map((c) => c.r);\n this._collidersRW = colliders.map((c) => this._createColliderRW(c.transform));\n\n // Initialize grabbers\n this._grabbersR = grabbers.map((g) => g.r);\n this._grabbersRW = grabbers.map((g) => ({\n enabled: g.enabled ? 1 : 0,\n position: g.transform.getWorldPosition()\n }));\n\n // Flat planes\n this._flatPlanes = flatPlanes.map((fp) => ({\n normal: Vector3.normalize(fp.up),\n distance: -Vector3.dot(Vector3.normalize(fp.up), fp.position)\n }));\n\n // Capture initial state\n this._previousRootPosition = rootTransform.getWorldPosition();\n this._previousRootRotation = rootTransform.getWorldRotation();\n\n for (let i = 0; i < this._pointsRW.length; i++) {\n const pos = pointTransforms[i].getWorldPosition();\n this._pointsRW[i].positionCurrent = pos.clone();\n this._pointsRW[i].positionPrevious = pos.clone();\n this._pointsRW[i].positionCurrentTransform = pos.clone();\n this._pointsRW[i].positionPreviousTransform = pos.clone();\n this._pointsRW[i].positionToTransform = pos.clone();\n this._pointsRW[i].directionPrevious = Vector3.axisPZ();\n this._pointsRW[i].fakeWindDirection = Vector3.axisPZ();\n this._pointsRW[i].grabberIndex = -1;\n this._pointsRW[i].grabberDistance = 0;\n this._pointsRW[i].friction = 0;\n }\n\n this._initialized = true;\n }\n\n /**\n * 执行一帧物理模拟\n * 内部流程:读取当前 transform → 运行 Verlet 积分和约束求解 → 写回 transform\n * @param deltaTime 帧间隔时间(秒)。内部会被 subSteps 细分\n */\n step(deltaTime: number): void {\n if (!this._initialized || !this._rootTransform) {\n return;\n }\n\n // Update fade\n if (this._fadeState !== 'none') {\n this._fadeTimer += deltaTime;\n if (this._fadeTimer >= this._fadeDuration) {\n this._fadeState = 'none';\n this._fadeTimer = 0;\n }\n }\n\n const blendRatio = this._computeBlendRatio();\n\n // Capture current transforms\n const rootPos = this._rootTransform.getWorldPosition();\n const rootRot = this._rootTransform.getWorldRotation();\n\n for (let i = 0; i < this._pointsRW.length; i++) {\n this._pointsRW[i].positionPreviousTransform = this._pointsRW[i].positionCurrentTransform.clone();\n this._pointsRW[i].positionCurrentTransform = this._pointTransforms[i].getWorldPosition();\n }\n\n for (let i = 0; i < this._collidersRW.length; i++) {\n const t = this._colliderTransforms[i];\n this._collidersRW[i].positionPreviousTransform = this._collidersRW[i].positionCurrentTransform.clone();\n this._collidersRW[i].directionPreviousTransform =\n this._collidersRW[i].directionCurrentTransform.clone();\n this._collidersRW[i].positionCurrentTransform = t.getWorldPosition();\n this._collidersRW[i].directionCurrentTransform = t.getWorldRotation();\n this._collidersRW[i].worldToLocal = Matrix4x4.compose(\n t.getLocalScale(),\n this._collidersRW[i].directionCurrentTransform,\n this._collidersRW[i].positionCurrentTransform\n ).inplaceInvertAffine();\n }\n\n for (let i = 0; i < this._grabbersRW.length; i++) {\n this._grabbersRW[i].position = this._grabberTransforms[i].getWorldPosition();\n }\n\n // Run simulation\n const params: SimulationParams = {\n isPaused: this._isPaused,\n stepTime: deltaTime,\n subSteps: this._config.subSteps,\n rootPosition: rootPos,\n previousRootPosition: this._previousRootPosition,\n rootSlideLimit: this._config.rootSlideLimit,\n rootRotation: rootRot,\n previousRootRotation: this._previousRootRotation,\n rootRotateLimit: this._config.rootRotateLimit,\n windForce: this._config.windForce,\n enableSurfaceCollision: this._config.enableSurfaceCollision,\n surfaceConstraints: this._surfaceConstraints,\n relaxation: this._config.relaxation,\n constraintShrinkLimit: this._config.constraintShrinkLimit,\n blendRatio,\n isFakeWave: this._config.isFakeWave,\n fakeWaveSpeed: this._config.fakeWaveSpeed,\n fakeWavePower: this._config.fakeWavePower,\n fakeWaveCounter: this._fakeWaveCounter,\n collisionScale: 1.0,\n enableBroadPhase: this._config.enableBroadPhase\n };\n\n const result = simulate(\n params,\n this._pointsR,\n this._pointsRW,\n this._constraints,\n this._collidersR,\n this._collidersRW,\n this._grabbersR,\n this._grabbersRW,\n this._movableLimitTargets,\n this._flatPlanes\n );\n\n this._positionsToTransform = result.positionsToTransform;\n this._fakeWaveCounter = result.fakeWaveCounter;\n\n // Angle limits\n if (this._config.angleLimitConfig.angleLimit >= 0) {\n applyAngleLimits(this._pointsR, this._pointsRW, this._config.angleLimitConfig);\n }\n\n // Apply results\n const transformRots = this._pointTransforms.map((t) => t.getWorldRotation());\n const transformLocalRots = this._pointTransforms.map((t) => t.getLocalRotation());\n const outputs = applyResult(\n this._pointsR,\n this._pointsRW,\n this._positionsToTransform,\n blendRatio,\n transformRots,\n transformLocalRots\n );\n\n for (let i = 0; i < outputs.length; i++) {\n this._pointTransforms[i].setWorldPosition(outputs[i].position);\n this._pointTransforms[i].setWorldRotation(outputs[i].rotation);\n }\n\n this._previousRootPosition = rootPos;\n this._previousRootRotation = rootRot;\n }\n\n /**\n * 获取所有点的模拟结果(世界坐标位置和旋转)\n * 通常不需要手动调用——step() 已经自动写回 transform。\n * 适用于需要在不写回 transform 的情况下读取物理结果的场景。\n */\n getResults(): Array<{ position: Vector3; rotation: Quaternion }> {\n const transformRots = this._pointTransforms.map((t) => t.getWorldRotation());\n const transformLocalRots = this._pointTransforms.map((t) => t.getLocalRotation());\n const outputs = applyResult(\n this._pointsR,\n this._pointsRW,\n this._positionsToTransform,\n this._config.blendRatio,\n transformRots,\n transformLocalRots\n );\n return outputs.map((o) => ({ position: o.position, rotation: o.rotation }));\n }\n\n /**\n * 瞬移补偿——在角色传送/瞬移后调用\n * 将上一帧的根骨骼位置和旋转设为当前值,\n * 使下一帧的根运动增量为零,避免物理点因巨大位移而弹射。\n */\n warp(): void {\n if (!this._rootTransform) {\n return;\n }\n this._previousRootPosition = this._rootTransform.getWorldPosition();\n this._previousRootRotation = this._rootTransform.getWorldRotation();\n }\n\n /**\n * 重置所有物理状态\n * 将所有点的模拟位置重置为当前 transform 位置,清除速度和抓取状态。\n * 适用于场景切换或需要消除所有物理运动的场景。\n */\n reset(): void {\n for (let i = 0; i < this._pointsRW.length; i++) {\n const pos = this._pointTransforms[i].getWorldPosition();\n this._pointsRW[i].positionCurrent = pos.clone();\n this._pointsRW[i].positionPrevious = pos.clone();\n this._pointsRW[i].grabberIndex = -1;\n }\n this._fakeWaveCounter = 0;\n }\n\n /**\n * 释放固定点为动态点(如脱衣、布料脱落)\n * 将 weight 从 0 改为 1,同时重置该点的模拟状态避免瞬间弹射。\n * @param index 点的索引\n */\n releasePoint(index: number): void {\n if (index < 0 || index >= this._pointsR.length) {\n return;\n }\n (this._pointsR[index] as any).weight = 1;\n const pos = this._pointTransforms[index].getWorldPosition();\n this._pointsRW[index].positionCurrent = pos.clone();\n this._pointsRW[index].positionPrevious = pos.clone();\n this._pointsRW[index].grabberIndex = -1;\n }\n\n /**\n * 将动态点重新固定为跟随动画(如重新穿戴)\n * 将 weight 从 1 改为 0,清除抓取状态。\n * @param index 点的索引\n */\n fixPoint(index: number): void {\n if (index < 0 || index >= this._pointsR.length) {\n return;\n }\n (this._pointsR[index] as any).weight = 0;\n this._pointsRW[index].grabberIndex = -1;\n }\n\n /**\n * 查询某个点是否为固定状态(weight=0,跟随动画)\n * @param index 点的索引\n */\n isPointFixed(index: number): boolean {\n if (index < 0 || index >= this._pointsR.length) {\n return false;\n }\n return this._pointsR[index].weight <= EPSILON;\n }\n\n /** 获取物理点总数 */\n get pointCount(): number {\n return this._pointsR.length;\n }\n\n /**\n * 渐入物理——从动画姿态平滑过渡到物理模拟\n * blendRatio 从 1(纯动画)渐变到 0(纯物理)\n * @param seconds 过渡时长(秒)\n */\n fadeIn(seconds: number): void {\n this._fadeState = 'in';\n this._fadeTimer = 0;\n this._fadeDuration = seconds;\n }\n\n /**\n * 渐出物理——从物理模拟平滑过渡回动画姿态\n * blendRatio 从 0(纯物理)渐变到 1(纯动画)\n * @param seconds 过渡时长(秒)\n */\n fadeOut(seconds: number): void {\n this._fadeState = 'out';\n this._fadeTimer = 0;\n this._fadeDuration = seconds;\n }\n\n /**\n * 设置全局风力向量\n * 风力会按每个点的 windForceScale 和质量进行缩放\n * @param wind 风力向量(世界坐标)\n */\n setWindForce(wind: Vector3): void {\n this._config.windForce = wind;\n }\n\n /** Enable/disable broad-phase pruning for runtime performance comparison */\n setBroadPhaseEnabled(enabled: boolean): void {\n this._config.enableBroadPhase = enabled;\n }\n\n /**\n * 暂停/恢复物理模拟\n * 暂停时仍会跟随根骨骼运动,但不进行力学积分和约束求解\n * @param paused true=暂停, false=恢复\n */\n setPaused(paused: boolean): void {\n this._isPaused = paused;\n }\n\n /**\n * 运行时更新碰撞器状态\n * 用于外部直接控制碰撞器的启用/禁用和位置,而不通过 TransformAccess 读取\n * @param index 碰撞器索引\n * @param enabled 是否启用\n * @param position 世界坐标位置\n * @param rotation 世界旋转\n */\n updateColliderState(index: number, enabled: boolean, position: Vector3, rotation: Quaternion): void {\n if (index >= 0 && index < this._collidersRW.length) {\n this._collidersRW[index].enabled = enabled ? 1 : 0;\n this._collidersRW[index].positionCurrentTransform = position;\n this._collidersRW[index].directionCurrentTransform = rotation;\n }\n }\n\n /**\n * 运行时更新抓取器状态\n * 用于鼠标拖拽等交互场景,控制抓取器的启用和位置\n * @param index 抓取器索引\n * @param enabled 是否启用(鼠标按下=true,松开=false)\n * @param position 抓取器世界坐标位置\n */\n updateGrabberState(index: number, enabled: boolean, position: Vector3): void {\n if (index >= 0 && index < this._grabbersRW.length) {\n this._grabbersRW[index].enabled = enabled ? 1 : 0;\n this._grabbersRW[index].position = position;\n }\n }\n\n private _computeBlendRatio(): number {\n if (this._fadeState === 'in') {\n return 1.0 - clamp01(this._fadeTimer / this._fadeDuration);\n }\n if (this._fadeState === 'out') {\n return clamp01(this._fadeTimer / this._fadeDuration);\n }\n return this._config.blendRatio;\n }\n\n private _createPointR(\n node: BoneNode,\n maxDepth: number,\n parentMap: Map<number, number>,\n transforms: TransformAccess[]\n ): PointR {\n const rate = maxDepth > 0 ? node.depth / maxDepth : 0;\n const c = this._config.curves;\n\n const parentIdx = parentMap.get(node.index) ?? -1;\n const childIdx = node.children.length > 0 ? node.children[0].index : -1;\n\n // Capture initial local transform for rotation blending\n const t = transforms[node.index];\n const initLocalPos = t.getLocalPosition();\n const initLocalRot = t.getLocalRotation();\n const initLocalScale = t.getLocalScale();\n\n // BoneAxis: local-space direction to first child (computed in initialize)\n const boneAxis = node.boneAxis ?? new Vector3(0, -1, 0);\n\n // ParentLength: distance to parent\n let parentLength = 0;\n if (parentIdx !== -1) {\n const pPos = transforms[parentIdx].getWorldPosition();\n const cPos = transforms[node.index].getWorldPosition();\n parentLength = Vector3.distance(pPos, cPos);\n }\n\n return {\n parent: parentIdx,\n child: childIdx,\n applyInvertCollision: 0,\n movableLimitIndex: -1,\n movableLimitRadius: 0,\n weight: node.isFixed ? 0 : 1,\n mass: c.massScale.evaluate(rate),\n resistance: clamp01(c.resistance.evaluate(rate)),\n hardness: clamp01(c.hardness.evaluate(rate)),\n frictionScale: c.friction.evaluate(rate),\n sliderJointLength: c.sliderJointLength.evaluate(rate),\n parentLength,\n structuralShrinkVertical: c.structuralShrinkVertical.evaluate(rate) * 0.5,\n structuralStretchVertical: c.structuralStretchVertical.evaluate(rate) * 0.5,\n structuralShrinkHorizontal: c.structuralShrinkHorizontal.evaluate(rate) * 0.5,\n structuralStretchHorizontal: c.structuralStretchHorizontal.evaluate(rate) * 0.5,\n shearShrink: c.shearShrink.evaluate(rate) * 0.5,\n shearStretch: c.shearStretch.evaluate(rate) * 0.5,\n bendingShrinkVertical: c.bendingShrinkVertical.evaluate(rate) * 0.5,\n bendingStretchVertical: c.bendingStretchVertical.evaluate(rate) * 0.5,\n bendingShrinkHorizontal: c.bendingShrinkHorizontal.evaluate(rate) * 0.5,\n bendingStretchHorizontal: c.bendingStretchHorizontal.evaluate(rate) * 0.5,\n windForceScale: c.windForceScale.evaluate(rate) * rate,\n fakeWavePower: c.fakeWavePower.evaluate(rate),\n fakeWaveFreq: c.fakeWaveFreq.evaluate(rate),\n forceFadeRatio: 0,\n pointRadius: 0.05,\n gravity: Vector3.scale(this._config.gravity, c.gravityScale.evaluate(rate)),\n boneAxis,\n initialLocalScale: initLocalScale,\n initialLocalRotation: initLocalRot,\n initialLocalPosition: initLocalPos\n };\n }\n\n private _createPointRW(): PointRW {\n return {\n positionToTransform: Vector3.zero(),\n positionCurrentTransform: Vector3.zero(),\n positionPreviousTransform: Vector3.zero(),\n positionCurrent: Vector3.zero(),\n positionPrevious: Vector3.zero(),\n directionPrevious: Vector3.axisPZ(),\n fakeWindDirection: Vector3.axisPZ(),\n grabberIndex: -1,\n grabberDistance: 0,\n friction: 0\n };\n }\n\n private _createColliderRW(transform: TransformAccess): ColliderRW {\n const pos = transform.getWorldPosition();\n const rot = transform.getWorldRotation();\n return {\n positionCurrent: pos.clone(),\n directionCurrent: Vector3.zero(),\n boundsCenter: pos.clone(),\n boundsRadius: 0,\n positionCurrentTransform: pos.clone(),\n positionPreviousTransform: pos.clone(),\n directionCurrentTransform: rot.clone(),\n directionPreviousTransform: rot.clone(),\n worldToLocal: Matrix4x4.identity(),\n localBoundsMin: Vector3.zero(),\n localBoundsMax: Vector3.zero(),\n radius: 0,\n enabled: 1\n };\n }\n}\n"],"names":["SpringSystemController","_config","_pointsR","_pointsRW","_constraints","_collidersR","_collidersRW","_grabbersR","_grabbersRW","_movableLimitTargets","_flatPlanes","_surfaceConstraints","_positionsToTransform","_fakeWaveCounter","_previousRootPosition","Vector3","zero","_previousRootRotation","Quaternion","identity","_rootTransform","_pointTransforms","_colliderTransforms","_grabberTransforms","_initialized","_isPaused","_fadeState","_fadeTimer","_fadeDuration","config","initialize","rootTransform","rootPoints","pointTransforms","colliders","grabbers","flatPlanes","map","c","transform","g","buildConstraints","constraintOptions","buildSurfaceFaces","isLoop","allPoints","parentMap","Map","walk","node","push","children","set","index","r","maxDepth","Math","max","p","depth","indexToNode","boneAxis","length","childPos","getWorldPosition","parentPos","parentRot","getWorldRotation","parentScale","getLocalScale","diff","sub","invRot","inverse","localDir","unscaled","x","y","z","normalize","_createPointR","_createPointRW","Array","fill","_createColliderRW","enabled","position","fp","normal","up","distance","dot","i","pos","positionCurrent","clone","positionPrevious","positionCurrentTransform","positionPreviousTransform","positionToTransform","directionPrevious","axisPZ","fakeWindDirection","grabberIndex","grabberDistance","friction","step","deltaTime","blendRatio","_computeBlendRatio","rootPos","rootRot","t","directionPreviousTransform","directionCurrentTransform","worldToLocal","Matrix4x4","compose","inplaceInvertAffine","params","isPaused","stepTime","subSteps","rootPosition","previousRootPosition","rootSlideLimit","rootRotation","previousRootRotation","rootRotateLimit","windForce","enableSurfaceCollision","surfaceConstraints","relaxation","constraintShrinkLimit","isFakeWave","fakeWaveSpeed","fakeWavePower","fakeWaveCounter","collisionScale","enableBroadPhase","result","simulate","positionsToTransform","angleLimitConfig","angleLimit","applyAngleLimits","transformRots","transformLocalRots","getLocalRotation","outputs","applyResult","setWorldPosition","setWorldRotation","rotation","getResults","o","warp","reset","releasePoint","weight","fixPoint","isPointFixed","EPSILON","pointCount","fadeIn","seconds","fadeOut","setWindForce","wind","setBroadPhaseEnabled","setPaused","paused","updateColliderState","updateGrabberState","clamp01","transforms","rate","curves","parentIdx","get","childIdx","initLocalPos","getLocalPosition","initLocalRot","initLocalScale","parentLength","pPos","cPos","parent","child","applyInvertCollision","movableLimitIndex","movableLimitRadius","isFixed","mass","massScale","evaluate","resistance","hardness","frictionScale","sliderJointLength","structuralShrinkVertical","structuralStretchVertical","structuralShrinkHorizontal","structuralStretchHorizontal","shearShrink","shearStretch","bendingShrinkVertical","bendingStretchVertical","bendingShrinkHorizontal","bendingStretchHorizontal","windForceScale","fakeWaveFreq","forceFadeRatio","pointRadius","gravity","scale","gravityScale","initialLocalScale","initialLocalRotation","initialLocalPosition","rot","directionCurrent","boundsCenter","boundsRadius","localBoundsMin","localBoundsMax","radius"],"mappings":";;;;;;AAAA;AA8GO,MAAMA,sBAAAA,CAAAA;IACHC,OAA0B;AAC1BC,IAAAA,QAAAA,GAAqB,EAAE;AACvBC,IAAAA,SAAAA,GAAuB,EAAE;AACzBC,IAAAA,YAAAA,GAA6B,EAAE;AAC/BC,IAAAA,WAAAA,GAA2B,EAAE;AAC7BC,IAAAA,YAAAA,GAA6B,EAAE;AAC/BC,IAAAA,UAAAA,GAAyB,EAAE;AAC3BC,IAAAA,WAAAA,GAA2B,EAAE;AAC7BC,IAAAA,oBAAAA,GAAkC,EAAE;AACpCC,IAAAA,WAAAA,GAA2B,EAAE;AAC7BC,IAAAA,mBAAAA,GAAgC,EAAE;AAClCC,IAAAA,qBAAAA,GAAmC,EAAE;AACrCC,IAAAA,gBAAAA,GAAmB,CAAE;IACrBC,qBAAwBC,GAAAA,OAAAA,CAAQC,IAAI,EAAG;IACvCC,qBAAwBC,GAAAA,UAAAA,CAAWC,QAAQ,EAAG;AAC9CC,IAAAA,cAAAA,GAAyC,IAAK;AAC9CC,IAAAA,gBAAAA,GAAsC,EAAE;AACxCC,IAAAA,mBAAAA,GAAyC,EAAE;AAC3CC,IAAAA,kBAAAA,GAAwC,EAAE;AAC1CC,IAAAA,YAAAA,GAAe,KAAM;AACrBC,IAAAA,SAAAA,GAAY,KAAM;AAClBC,IAAAA,UAAAA,GAAoC,MAAO;AAC3CC,IAAAA,UAAAA,GAAa,CAAE;AACfC,IAAAA,aAAAA,GAAgB,CAAE;AAE1B,IAAA,WAAA,CAAYC,MAAwB,CAAE;QACpC,IAAI,CAAC5B,OAAO,GAAG4B,MAAAA;AACjB;AAEA;;;;;;;;AAQC,MACDC,UACEC,CAAAA,aAA8B,EAC9BC,UAAsB,EACtBC,eAAkC,EAClCC,SAA8D,EAC9DC,QAIE,EACFC,UAAqD,EAC/C;QACN,IAAI,CAAChB,cAAc,GAAGW,aAAAA;QACtB,IAAI,CAACV,gBAAgB,GAAGY,eAAAA;QACxB,IAAI,CAACX,mBAAmB,GAAGY,SAAAA,CAAUG,GAAG,CAAC,CAACC,CAAMA,GAAAA,CAAAA,CAAEC,SAAS,CAAA;QAC3D,IAAI,CAAChB,kBAAkB,GAAGY,QAAAA,CAASE,GAAG,CAAC,CAACG,CAAMA,GAAAA,CAAAA,CAAED,SAAS,CAAA;;QAGzD,IAAI,CAACnC,YAAY,GAAGqC,gBAAAA,CAAiBT,YAAY,IAAI,CAAC/B,OAAO,CAACyC,iBAAiB,CAAA;QAC/E,IAAI,CAAC/B,mBAAmB,GAAGgC,iBAAkBX,CAAAA,UAAAA,EAAY,IAAI,CAAC/B,OAAO,CAACyC,iBAAiB,CAACE,MAAM,CAAA;;AAG9F,QAAA,MAAMC,YAAwB,EAAE;QAChC,MAAMC,SAAAA,GAAY,IAAIC,GAAAA,EAAAA,CAAAA;AACtB,QAAA,SAASC,KAAKC,IAAc,EAAA;AAC1BJ,YAAAA,SAAAA,CAAUK,IAAI,CAACD,IAAAA,CAAAA;AACf,YAAA,KAAK,MAAMX,CAAAA,IAAKW,IAAKE,CAAAA,QAAQ,CAAE;AAC7BL,gBAAAA,SAAAA,CAAUM,GAAG,CAACd,CAAAA,CAAEe,KAAK,EAAEJ,KAAKI,KAAK,CAAA;gBACjCL,IAAKV,CAAAA,CAAAA,CAAAA;AACP;AACF;QACA,KAAK,MAAMgB,KAAKtB,UAAY,CAAA;YAC1BgB,IAAKM,CAAAA,CAAAA,CAAAA;AACP;QAEA,MAAMC,QAAAA,GAAWC,IAAKC,CAAAA,GAAG,CAAIZ,GAAAA,SAAAA,CAAUR,GAAG,CAAC,CAACqB,CAAMA,GAAAA,CAAAA,CAAEC,KAAK,CAAA,CAAA;;;AAIzD,QAAA,MAAMC,cAAc,IAAIb,GAAAA,EAAAA;QACxB,KAAK,MAAMW,KAAKb,SAAW,CAAA;AACzBe,YAAAA,WAAAA,CAAYR,GAAG,CAACM,CAAEL,CAAAA,KAAK,EAAEK,CAAAA,CAAAA;AAC3B;QAEA,KAAK,MAAMA,KAAKb,SAAW,CAAA;YACzB,IAAI,CAACa,EAAEG,QAAQ,IAAIH,EAAEP,QAAQ,CAACW,MAAM,GAAG,CAAG,EAAA;gBACxC,MAAMC,QAAAA,GAAW9B,eAAe,CAACyB,CAAEP,CAAAA,QAAQ,CAAC,CAAA,CAAE,CAACE,KAAK,CAAC,CAACW,gBAAgB,EAAA;AACtE,gBAAA,MAAMC,YAAYhC,eAAe,CAACyB,EAAEL,KAAK,CAAC,CAACW,gBAAgB,EAAA;;AAE3D,gBAAA,MAAME,YAAYjC,eAAe,CAACyB,EAAEL,KAAK,CAAC,CAACc,gBAAgB,EAAA;AAC3D,gBAAA,MAAMC,cAAcnC,eAAe,CAACyB,EAAEL,KAAK,CAAC,CAACgB,aAAa,EAAA;AAC1D,gBAAA,MAAMC,IAAOvD,GAAAA,OAAAA,CAAQwD,GAAG,CAACR,QAAUE,EAAAA,SAAAA,CAAAA;gBACnC,MAAMO,MAAAA,GAAStD,UAAWuD,CAAAA,OAAO,CAACP,SAAAA,CAAAA;gBAClC,MAAMQ,QAAAA,GAAWF,MAAOjC,CAAAA,SAAS,CAAC+B,IAAAA,CAAAA;;AAElC,gBAAA,MAAMK,QAAW,GAAA,IAAI5D,OACnBqD,CAAAA,WAAAA,CAAYQ,CAAC,KAAK,CAAA,GAAIF,QAASE,CAAAA,CAAC,GAAGR,WAAYQ,CAAAA,CAAC,GAAG,CAAA,EACnDR,YAAYS,CAAC,KAAK,CAAIH,GAAAA,QAAAA,CAASG,CAAC,GAAGT,WAAYS,CAAAA,CAAC,GAAG,CACnDT,EAAAA,WAAAA,CAAYU,CAAC,KAAK,IAAIJ,QAASI,CAAAA,CAAC,GAAGV,WAAAA,CAAYU,CAAC,GAAG,CAAA,CAAA;AAErDpB,gBAAAA,CAAAA,CAAEG,QAAQ,GAAG9C,OAAQgE,CAAAA,SAAS,CAACJ,QAAAA,CAAAA;AACjC;AACF;;AAGA,QAAA,IAAI,CAACzE,QAAQ,GAAG2C,SAAAA,CAAUR,GAAG,CAAC,CAACqB,CAAM,GAAA,IAAI,CAACsB,aAAa,CAACtB,CAAAA,EAAGH,UAAUT,SAAWb,EAAAA,eAAAA,CAAAA,CAAAA;QAChF,IAAI,CAAC9B,SAAS,GAAG0C,SAAAA,CAAUR,GAAG,CAAC,IAAM,IAAI,CAAC4C,cAAc,EAAA,CAAA;QACxD,IAAI,CAACrE,qBAAqB,GAAG,IAAIsE,KAAAA,CAAMrC,SAAUiB,CAAAA,MAAM,CAAEqB,CAAAA,IAAI,CAACpE,OAAAA,CAAQC,IAAI,EAAA,CAAA;;QAG1E,IAAI,CAACX,WAAW,GAAG6B,SAAAA,CAAUG,GAAG,CAAC,CAACC,CAAMA,GAAAA,CAAAA,CAAEgB,CAAC,CAAA;AAC3C,QAAA,IAAI,CAAChD,YAAY,GAAG4B,SAAAA,CAAUG,GAAG,CAAC,CAACC,CAAAA,GAAM,IAAI,CAAC8C,iBAAiB,CAAC9C,EAAEC,SAAS,CAAA,CAAA;;QAG3E,IAAI,CAAChC,UAAU,GAAG4B,QAAAA,CAASE,GAAG,CAAC,CAACG,CAAMA,GAAAA,CAAAA,CAAEc,CAAC,CAAA;QACzC,IAAI,CAAC9C,WAAW,GAAG2B,QAAAA,CAASE,GAAG,CAAC,CAACG,KAAO;gBACtC6C,OAAS7C,EAAAA,CAAAA,CAAE6C,OAAO,GAAG,CAAI,GAAA,CAAA;gBACzBC,QAAU9C,EAAAA,CAAAA,CAAED,SAAS,CAACyB,gBAAgB;aACxC,CAAA,CAAA;;QAGA,IAAI,CAACtD,WAAW,GAAG0B,UAAAA,CAAWC,GAAG,CAAC,CAACkD,MAAQ;AACzCC,gBAAAA,MAAAA,EAAQzE,OAAQgE,CAAAA,SAAS,CAACQ,EAAAA,CAAGE,EAAE,CAAA;gBAC/BC,QAAU,EAAA,CAAC3E,OAAQ4E,CAAAA,GAAG,CAAC5E,OAAAA,CAAQgE,SAAS,CAACQ,EAAGE,CAAAA,EAAE,CAAGF,EAAAA,EAAAA,CAAGD,QAAQ;aAC9D,CAAA,CAAA;;AAGA,QAAA,IAAI,CAACxE,qBAAqB,GAAGiB,aAAAA,CAAciC,gBAAgB,EAAA;AAC3D,QAAA,IAAI,CAAC/C,qBAAqB,GAAGc,aAAAA,CAAcoC,gBAAgB,EAAA;QAE3D,IAAK,IAAIyB,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,IAAI,CAACzF,SAAS,CAAC2D,MAAM,EAAE8B,CAAK,EAAA,CAAA;AAC9C,YAAA,MAAMC,GAAM5D,GAAAA,eAAe,CAAC2D,CAAAA,CAAE,CAAC5B,gBAAgB,EAAA;YAC/C,IAAI,CAAC7D,SAAS,CAACyF,CAAAA,CAAE,CAACE,eAAe,GAAGD,IAAIE,KAAK,EAAA;YAC7C,IAAI,CAAC5F,SAAS,CAACyF,CAAAA,CAAE,CAACI,gBAAgB,GAAGH,IAAIE,KAAK,EAAA;YAC9C,IAAI,CAAC5F,SAAS,CAACyF,CAAAA,CAAE,CAACK,wBAAwB,GAAGJ,IAAIE,KAAK,EAAA;YACtD,IAAI,CAAC5F,SAAS,CAACyF,CAAAA,CAAE,CAACM,yBAAyB,GAAGL,IAAIE,KAAK,EAAA;YACvD,IAAI,CAAC5F,SAAS,CAACyF,CAAAA,CAAE,CAACO,mBAAmB,GAAGN,IAAIE,KAAK,EAAA;YACjD,IAAI,CAAC5F,SAAS,CAACyF,CAAAA,CAAE,CAACQ,iBAAiB,GAAGrF,QAAQsF,MAAM,EAAA;YACpD,IAAI,CAAClG,SAAS,CAACyF,CAAAA,CAAE,CAACU,iBAAiB,GAAGvF,QAAQsF,MAAM,EAAA;AACpD,YAAA,IAAI,CAAClG,SAAS,CAACyF,EAAE,CAACW,YAAY,GAAG,EAAC;AAClC,YAAA,IAAI,CAACpG,SAAS,CAACyF,CAAE,CAAA,CAACY,eAAe,GAAG,CAAA;AACpC,YAAA,IAAI,CAACrG,SAAS,CAACyF,CAAE,CAAA,CAACa,QAAQ,GAAG,CAAA;AAC/B;QAEA,IAAI,CAACjF,YAAY,GAAG,IAAA;AACtB;AAEA;;;;MAKAkF,IAAAA,CAAKC,SAAiB,EAAQ;QAC5B,IAAI,CAAC,IAAI,CAACnF,YAAY,IAAI,CAAC,IAAI,CAACJ,cAAc,EAAE;AAC9C,YAAA;AACF;;AAGA,QAAA,IAAI,IAAI,CAACM,UAAU,KAAK,MAAQ,EAAA;YAC9B,IAAI,CAACC,UAAU,IAAIgF,SAAAA;AACnB,YAAA,IAAI,IAAI,CAAChF,UAAU,IAAI,IAAI,CAACC,aAAa,EAAE;gBACzC,IAAI,CAACF,UAAU,GAAG,MAAA;gBAClB,IAAI,CAACC,UAAU,GAAG,CAAA;AACpB;AACF;QAEA,MAAMiF,UAAAA,GAAa,IAAI,CAACC,kBAAkB,EAAA;;AAG1C,QAAA,MAAMC,OAAU,GAAA,IAAI,CAAC1F,cAAc,CAAC4C,gBAAgB,EAAA;AACpD,QAAA,MAAM+C,OAAU,GAAA,IAAI,CAAC3F,cAAc,CAAC+C,gBAAgB,EAAA;QAEpD,IAAK,IAAIyB,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,IAAI,CAACzF,SAAS,CAAC2D,MAAM,EAAE8B,CAAK,EAAA,CAAA;AAC9C,YAAA,IAAI,CAACzF,SAAS,CAACyF,CAAAA,CAAE,CAACM,yBAAyB,GAAG,IAAI,CAAC/F,SAAS,CAACyF,CAAAA,CAAE,CAACK,wBAAwB,CAACF,KAAK,EAAA;AAC9F,YAAA,IAAI,CAAC5F,SAAS,CAACyF,CAAAA,CAAE,CAACK,wBAAwB,GAAG,IAAI,CAAC5E,gBAAgB,CAACuE,CAAAA,CAAE,CAAC5B,gBAAgB,EAAA;AACxF;QAEA,IAAK,IAAI4B,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,IAAI,CAACtF,YAAY,CAACwD,MAAM,EAAE8B,CAAK,EAAA,CAAA;AACjD,YAAA,MAAMoB,CAAI,GAAA,IAAI,CAAC1F,mBAAmB,CAACsE,CAAE,CAAA;AACrC,YAAA,IAAI,CAACtF,YAAY,CAACsF,CAAAA,CAAE,CAACM,yBAAyB,GAAG,IAAI,CAAC5F,YAAY,CAACsF,CAAAA,CAAE,CAACK,wBAAwB,CAACF,KAAK,EAAA;AACpG,YAAA,IAAI,CAACzF,YAAY,CAACsF,CAAAA,CAAE,CAACqB,0BAA0B,GAC7C,IAAI,CAAC3G,YAAY,CAACsF,CAAAA,CAAE,CAACsB,yBAAyB,CAACnB,KAAK,EAAA;YACtD,IAAI,CAACzF,YAAY,CAACsF,CAAAA,CAAE,CAACK,wBAAwB,GAAGe,EAAEhD,gBAAgB,EAAA;YAClE,IAAI,CAAC1D,YAAY,CAACsF,CAAAA,CAAE,CAACsB,yBAAyB,GAAGF,EAAE7C,gBAAgB,EAAA;AACnE,YAAA,IAAI,CAAC7D,YAAY,CAACsF,CAAAA,CAAE,CAACuB,YAAY,GAAGC,SAAAA,CAAUC,OAAO,CACnDL,CAAE3C,CAAAA,aAAa,EACf,EAAA,IAAI,CAAC/D,YAAY,CAACsF,CAAAA,CAAE,CAACsB,yBAAyB,EAC9C,IAAI,CAAC5G,YAAY,CAACsF,CAAAA,CAAE,CAACK,wBAAwB,EAC7CqB,mBAAmB,EAAA;AACvB;QAEA,IAAK,IAAI1B,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,IAAI,CAACpF,WAAW,CAACsD,MAAM,EAAE8B,CAAK,EAAA,CAAA;AAChD,YAAA,IAAI,CAACpF,WAAW,CAACoF,CAAAA,CAAE,CAACN,QAAQ,GAAG,IAAI,CAAC/D,kBAAkB,CAACqE,CAAAA,CAAE,CAAC5B,gBAAgB,EAAA;AAC5E;;AAGA,QAAA,MAAMuD,MAA2B,GAAA;YAC/BC,QAAU,EAAA,IAAI,CAAC/F,SAAS;YACxBgG,QAAUd,EAAAA,SAAAA;AACVe,YAAAA,QAAAA,EAAU,IAAI,CAACzH,OAAO,CAACyH,QAAQ;YAC/BC,YAAcb,EAAAA,OAAAA;YACdc,oBAAsB,EAAA,IAAI,CAAC9G,qBAAqB;AAChD+G,YAAAA,cAAAA,EAAgB,IAAI,CAAC5H,OAAO,CAAC4H,cAAc;YAC3CC,YAAcf,EAAAA,OAAAA;YACdgB,oBAAsB,EAAA,IAAI,CAAC9G,qBAAqB;AAChD+G,YAAAA,eAAAA,EAAiB,IAAI,CAAC/H,OAAO,CAAC+H,eAAe;AAC7CC,YAAAA,SAAAA,EAAW,IAAI,CAAChI,OAAO,CAACgI,SAAS;AACjCC,YAAAA,sBAAAA,EAAwB,IAAI,CAACjI,OAAO,CAACiI,sBAAsB;YAC3DC,kBAAoB,EAAA,IAAI,CAACxH,mBAAmB;AAC5CyH,YAAAA,UAAAA,EAAY,IAAI,CAACnI,OAAO,CAACmI,UAAU;AACnCC,YAAAA,qBAAAA,EAAuB,IAAI,CAACpI,OAAO,CAACoI,qBAAqB;AACzDzB,YAAAA,UAAAA;AACA0B,YAAAA,UAAAA,EAAY,IAAI,CAACrI,OAAO,CAACqI,UAAU;AACnCC,YAAAA,aAAAA,EAAe,IAAI,CAACtI,OAAO,CAACsI,aAAa;AACzCC,YAAAA,aAAAA,EAAe,IAAI,CAACvI,OAAO,CAACuI,aAAa;YACzCC,eAAiB,EAAA,IAAI,CAAC5H,gBAAgB;YACtC6H,cAAgB,EAAA,GAAA;AAChBC,YAAAA,gBAAAA,EAAkB,IAAI,CAAC1I,OAAO,CAAC0I;AACjC,SAAA;AAEA,QAAA,MAAMC,SAASC,QACbtB,CAAAA,MAAAA,EACA,IAAI,CAACrH,QAAQ,EACb,IAAI,CAACC,SAAS,EACd,IAAI,CAACC,YAAY,EACjB,IAAI,CAACC,WAAW,EAChB,IAAI,CAACC,YAAY,EACjB,IAAI,CAACC,UAAU,EACf,IAAI,CAACC,WAAW,EAChB,IAAI,CAACC,oBAAoB,EACzB,IAAI,CAACC,WAAW,CAAA;AAGlB,QAAA,IAAI,CAACE,qBAAqB,GAAGgI,MAAAA,CAAOE,oBAAoB;AACxD,QAAA,IAAI,CAACjI,gBAAgB,GAAG+H,MAAAA,CAAOH,eAAe;;QAG9C,IAAI,IAAI,CAACxI,OAAO,CAAC8I,gBAAgB,CAACC,UAAU,IAAI,CAAG,EAAA;AACjDC,YAAAA,gBAAAA,CAAiB,IAAI,CAAC/I,QAAQ,EAAE,IAAI,CAACC,SAAS,EAAE,IAAI,CAACF,OAAO,CAAC8I,gBAAgB,CAAA;AAC/E;;QAGA,MAAMG,aAAAA,GAAgB,IAAI,CAAC7H,gBAAgB,CAACgB,GAAG,CAAC,CAAC2E,CAAMA,GAAAA,CAAAA,CAAE7C,gBAAgB,EAAA,CAAA;QACzE,MAAMgF,kBAAAA,GAAqB,IAAI,CAAC9H,gBAAgB,CAACgB,GAAG,CAAC,CAAC2E,CAAMA,GAAAA,CAAAA,CAAEoC,gBAAgB,EAAA,CAAA;AAC9E,QAAA,MAAMC,OAAUC,GAAAA,WAAAA,CACd,IAAI,CAACpJ,QAAQ,EACb,IAAI,CAACC,SAAS,EACd,IAAI,CAACS,qBAAqB,EAC1BgG,YACAsC,aACAC,EAAAA,kBAAAA,CAAAA;AAGF,QAAA,IAAK,IAAIvD,CAAI,GAAA,CAAA,EAAGA,IAAIyD,OAAQvF,CAAAA,MAAM,EAAE8B,CAAK,EAAA,CAAA;YACvC,IAAI,CAACvE,gBAAgB,CAACuE,CAAE,CAAA,CAAC2D,gBAAgB,CAACF,OAAO,CAACzD,CAAE,CAAA,CAACN,QAAQ,CAAA;YAC7D,IAAI,CAACjE,gBAAgB,CAACuE,CAAE,CAAA,CAAC4D,gBAAgB,CAACH,OAAO,CAACzD,CAAE,CAAA,CAAC6D,QAAQ,CAAA;AAC/D;QAEA,IAAI,CAAC3I,qBAAqB,GAAGgG,OAAAA;QAC7B,IAAI,CAAC7F,qBAAqB,GAAG8F,OAAAA;AAC/B;AAEA;;;;AAIC,MACD2C,UAAiE,GAAA;QAC/D,MAAMR,aAAAA,GAAgB,IAAI,CAAC7H,gBAAgB,CAACgB,GAAG,CAAC,CAAC2E,CAAMA,GAAAA,CAAAA,CAAE7C,gBAAgB,EAAA,CAAA;QACzE,MAAMgF,kBAAAA,GAAqB,IAAI,CAAC9H,gBAAgB,CAACgB,GAAG,CAAC,CAAC2E,CAAMA,GAAAA,CAAAA,CAAEoC,gBAAgB,EAAA,CAAA;QAC9E,MAAMC,OAAAA,GAAUC,YACd,IAAI,CAACpJ,QAAQ,EACb,IAAI,CAACC,SAAS,EACd,IAAI,CAACS,qBAAqB,EAC1B,IAAI,CAACX,OAAO,CAAC2G,UAAU,EACvBsC,aACAC,EAAAA,kBAAAA,CAAAA;AAEF,QAAA,OAAOE,OAAQhH,CAAAA,GAAG,CAAC,CAACsH,KAAO;AAAErE,gBAAAA,QAAAA,EAAUqE,EAAErE,QAAQ;AAAEmE,gBAAAA,QAAAA,EAAUE,EAAEF;aAAS,CAAA,CAAA;AAC1E;AAEA;;;;AAIC,MACDG,IAAa,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAACxI,cAAc,EAAE;AACxB,YAAA;AACF;AACA,QAAA,IAAI,CAACN,qBAAqB,GAAG,IAAI,CAACM,cAAc,CAAC4C,gBAAgB,EAAA;AACjE,QAAA,IAAI,CAAC/C,qBAAqB,GAAG,IAAI,CAACG,cAAc,CAAC+C,gBAAgB,EAAA;AACnE;AAEA;;;;AAIC,MACD0F,KAAc,GAAA;QACZ,IAAK,IAAIjE,CAAI,GAAA,CAAA,EAAGA,CAAI,GAAA,IAAI,CAACzF,SAAS,CAAC2D,MAAM,EAAE8B,CAAK,EAAA,CAAA;AAC9C,YAAA,MAAMC,MAAM,IAAI,CAACxE,gBAAgB,CAACuE,CAAAA,CAAE,CAAC5B,gBAAgB,EAAA;YACrD,IAAI,CAAC7D,SAAS,CAACyF,CAAAA,CAAE,CAACE,eAAe,GAAGD,IAAIE,KAAK,EAAA;YAC7C,IAAI,CAAC5F,SAAS,CAACyF,CAAAA,CAAE,CAACI,gBAAgB,GAAGH,IAAIE,KAAK,EAAA;AAC9C,YAAA,IAAI,CAAC5F,SAAS,CAACyF,EAAE,CAACW,YAAY,GAAG,EAAC;AACpC;QACA,IAAI,CAAC1F,gBAAgB,GAAG,CAAA;AAC1B;AAEA;;;;MAKAiJ,YAAAA,CAAazG,KAAa,EAAQ;QAChC,IAAIA,KAAAA,GAAQ,KAAKA,KAAS,IAAA,IAAI,CAACnD,QAAQ,CAAC4D,MAAM,EAAE;AAC9C,YAAA;AACF;AACC,QAAA,IAAI,CAAC5D,QAAQ,CAACmD,KAAM,CAAA,CAAS0G,MAAM,GAAG,CAAA;AACvC,QAAA,MAAMlE,MAAM,IAAI,CAACxE,gBAAgB,CAACgC,KAAAA,CAAM,CAACW,gBAAgB,EAAA;QACzD,IAAI,CAAC7D,SAAS,CAACkD,KAAAA,CAAM,CAACyC,eAAe,GAAGD,IAAIE,KAAK,EAAA;QACjD,IAAI,CAAC5F,SAAS,CAACkD,KAAAA,CAAM,CAAC2C,gBAAgB,GAAGH,IAAIE,KAAK,EAAA;AAClD,QAAA,IAAI,CAAC5F,SAAS,CAACkD,MAAM,CAACkD,YAAY,GAAG,EAAC;AACxC;AAEA;;;;MAKAyD,QAAAA,CAAS3G,KAAa,EAAQ;QAC5B,IAAIA,KAAAA,GAAQ,KAAKA,KAAS,IAAA,IAAI,CAACnD,QAAQ,CAAC4D,MAAM,EAAE;AAC9C,YAAA;AACF;AACC,QAAA,IAAI,CAAC5D,QAAQ,CAACmD,KAAM,CAAA,CAAS0G,MAAM,GAAG,CAAA;AACvC,QAAA,IAAI,CAAC5J,SAAS,CAACkD,MAAM,CAACkD,YAAY,GAAG,EAAC;AACxC;AAEA;;;MAIA0D,YAAAA,CAAa5G,KAAa,EAAW;QACnC,IAAIA,KAAAA,GAAQ,KAAKA,KAAS,IAAA,IAAI,CAACnD,QAAQ,CAAC4D,MAAM,EAAE;YAC9C,OAAO,KAAA;AACT;AACA,QAAA,OAAO,IAAI,CAAC5D,QAAQ,CAACmD,KAAM,CAAA,CAAC0G,MAAM,IAAIG,OAAAA;AACxC;mBAGA,IAAIC,UAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAACjK,QAAQ,CAAC4D,MAAM;AAC7B;AAEA;;;;MAKAsG,MAAAA,CAAOC,OAAe,EAAQ;QAC5B,IAAI,CAAC3I,UAAU,GAAG,IAAA;QAClB,IAAI,CAACC,UAAU,GAAG,CAAA;QAClB,IAAI,CAACC,aAAa,GAAGyI,OAAAA;AACvB;AAEA;;;;MAKAC,OAAAA,CAAQD,OAAe,EAAQ;QAC7B,IAAI,CAAC3I,UAAU,GAAG,KAAA;QAClB,IAAI,CAACC,UAAU,GAAG,CAAA;QAClB,IAAI,CAACC,aAAa,GAAGyI,OAAAA;AACvB;AAEA;;;;MAKAE,YAAAA,CAAaC,IAAa,EAAQ;AAChC,QAAA,IAAI,CAACvK,OAAO,CAACgI,SAAS,GAAGuC,IAAAA;AAC3B;iFAGAC,oBAAqBpF,CAAAA,OAAgB,EAAQ;AAC3C,QAAA,IAAI,CAACpF,OAAO,CAAC0I,gBAAgB,GAAGtD,OAAAA;AAClC;AAEA;;;;MAKAqF,SAAAA,CAAUC,MAAe,EAAQ;QAC/B,IAAI,CAAClJ,SAAS,GAAGkJ,MAAAA;AACnB;AAEA;;;;;;;MAQAC,mBAAAA,CAAoBvH,KAAa,EAAEgC,OAAgB,EAAEC,QAAiB,EAAEmE,QAAoB,EAAQ;QAClG,IAAIpG,KAAAA,IAAS,KAAKA,KAAQ,GAAA,IAAI,CAAC/C,YAAY,CAACwD,MAAM,EAAE;YAClD,IAAI,CAACxD,YAAY,CAAC+C,KAAAA,CAAM,CAACgC,OAAO,GAAGA,UAAU,CAAI,GAAA,CAAA;AACjD,YAAA,IAAI,CAAC/E,YAAY,CAAC+C,KAAM,CAAA,CAAC4C,wBAAwB,GAAGX,QAAAA;AACpD,YAAA,IAAI,CAAChF,YAAY,CAAC+C,KAAM,CAAA,CAAC6D,yBAAyB,GAAGuC,QAAAA;AACvD;AACF;AAEA;;;;;;AAMC,MACDoB,mBAAmBxH,KAAa,EAAEgC,OAAgB,EAAEC,QAAiB,EAAQ;QAC3E,IAAIjC,KAAAA,IAAS,KAAKA,KAAQ,GAAA,IAAI,CAAC7C,WAAW,CAACsD,MAAM,EAAE;YACjD,IAAI,CAACtD,WAAW,CAAC6C,KAAAA,CAAM,CAACgC,OAAO,GAAGA,UAAU,CAAI,GAAA,CAAA;AAChD,YAAA,IAAI,CAAC7E,WAAW,CAAC6C,KAAM,CAAA,CAACiC,QAAQ,GAAGA,QAAAA;AACrC;AACF;IAEQuB,kBAA6B,GAAA;AACnC,QAAA,IAAI,IAAI,CAACnF,UAAU,KAAK,IAAM,EAAA;YAC5B,OAAO,GAAA,GAAMoJ,QAAQ,IAAI,CAACnJ,UAAU,GAAG,IAAI,CAACC,aAAa,CAAA;AAC3D;AACA,QAAA,IAAI,IAAI,CAACF,UAAU,KAAK,KAAO,EAAA;AAC7B,YAAA,OAAOoJ,QAAQ,IAAI,CAACnJ,UAAU,GAAG,IAAI,CAACC,aAAa,CAAA;AACrD;AACA,QAAA,OAAO,IAAI,CAAC3B,OAAO,CAAC2G,UAAU;AAChC;AAEQ5B,IAAAA,aAAAA,CACN/B,IAAc,EACdM,QAAgB,EAChBT,SAA8B,EAC9BiI,UAA6B,EACrB;AACR,QAAA,MAAMC,OAAOzH,QAAW,GAAA,CAAA,GAAIN,IAAKU,CAAAA,KAAK,GAAGJ,QAAW,GAAA,CAAA;AACpD,QAAA,MAAMjB,CAAI,GAAA,IAAI,CAACrC,OAAO,CAACgL,MAAM;AAE7B,QAAA,MAAMC,YAAYpI,SAAUqI,CAAAA,GAAG,CAAClI,IAAKI,CAAAA,KAAK,KAAK,EAAC;AAChD,QAAA,MAAM+H,QAAWnI,GAAAA,IAAAA,CAAKE,QAAQ,CAACW,MAAM,GAAG,CAAA,GAAIb,IAAKE,CAAAA,QAAQ,CAAC,CAAA,CAAE,CAACE,KAAK,GAAG,EAAC;;AAGtE,QAAA,MAAM2D,CAAI+D,GAAAA,UAAU,CAAC9H,IAAAA,CAAKI,KAAK,CAAC;QAChC,MAAMgI,YAAAA,GAAerE,EAAEsE,gBAAgB,EAAA;QACvC,MAAMC,YAAAA,GAAevE,EAAEoC,gBAAgB,EAAA;QACvC,MAAMoC,cAAAA,GAAiBxE,EAAE3C,aAAa,EAAA;;QAGtC,MAAMR,QAAAA,GAAWZ,KAAKY,QAAQ,IAAI,IAAI9C,OAAQ,CAAA,CAAA,EAAG,EAAI,EAAA,CAAA,CAAA;;AAGrD,QAAA,IAAI0K,YAAe,GAAA,CAAA;QACnB,IAAIP,SAAAA,KAAc,EAAI,EAAA;AACpB,YAAA,MAAMQ,IAAOX,GAAAA,UAAU,CAACG,SAAAA,CAAU,CAAClH,gBAAgB,EAAA;AACnD,YAAA,MAAM2H,OAAOZ,UAAU,CAAC9H,KAAKI,KAAK,CAAC,CAACW,gBAAgB,EAAA;YACpDyH,YAAe1K,GAAAA,OAAAA,CAAQ2E,QAAQ,CAACgG,IAAMC,EAAAA,IAAAA,CAAAA;AACxC;QAEA,OAAO;YACLC,MAAQV,EAAAA,SAAAA;YACRW,KAAOT,EAAAA,QAAAA;YACPU,oBAAsB,EAAA,CAAA;AACtBC,YAAAA,iBAAAA,EAAmB,EAAC;YACpBC,kBAAoB,EAAA,CAAA;YACpBjC,MAAQ9G,EAAAA,IAAAA,CAAKgJ,OAAO,GAAG,CAAI,GAAA,CAAA;AAC3BC,YAAAA,IAAAA,EAAM5J,CAAE6J,CAAAA,SAAS,CAACC,QAAQ,CAACpB,IAAAA,CAAAA;AAC3BqB,YAAAA,UAAAA,EAAYvB,OAAQxI,CAAAA,CAAAA,CAAE+J,UAAU,CAACD,QAAQ,CAACpB,IAAAA,CAAAA,CAAAA;AAC1CsB,YAAAA,QAAAA,EAAUxB,OAAQxI,CAAAA,CAAAA,CAAEgK,QAAQ,CAACF,QAAQ,CAACpB,IAAAA,CAAAA,CAAAA;AACtCuB,YAAAA,aAAAA,EAAejK,CAAEmE,CAAAA,QAAQ,CAAC2F,QAAQ,CAACpB,IAAAA,CAAAA;AACnCwB,YAAAA,iBAAAA,EAAmBlK,CAAEkK,CAAAA,iBAAiB,CAACJ,QAAQ,CAACpB,IAAAA,CAAAA;AAChDS,YAAAA,YAAAA;AACAgB,YAAAA,wBAAAA,EAA0BnK,CAAEmK,CAAAA,wBAAwB,CAACL,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AACtE0B,YAAAA,yBAAAA,EAA2BpK,CAAEoK,CAAAA,yBAAyB,CAACN,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AACxE2B,YAAAA,0BAAAA,EAA4BrK,CAAEqK,CAAAA,0BAA0B,CAACP,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AAC1E4B,YAAAA,2BAAAA,EAA6BtK,CAAEsK,CAAAA,2BAA2B,CAACR,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AAC5E6B,YAAAA,WAAAA,EAAavK,CAAEuK,CAAAA,WAAW,CAACT,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AAC5C8B,YAAAA,YAAAA,EAAcxK,CAAEwK,CAAAA,YAAY,CAACV,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AAC9C+B,YAAAA,qBAAAA,EAAuBzK,CAAEyK,CAAAA,qBAAqB,CAACX,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AAChEgC,YAAAA,sBAAAA,EAAwB1K,CAAE0K,CAAAA,sBAAsB,CAACZ,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AAClEiC,YAAAA,uBAAAA,EAAyB3K,CAAE2K,CAAAA,uBAAuB,CAACb,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AACpEkC,YAAAA,wBAAAA,EAA0B5K,CAAE4K,CAAAA,wBAAwB,CAACd,QAAQ,CAACpB,IAAQ,CAAA,GAAA,GAAA;AACtEmC,YAAAA,cAAAA,EAAgB7K,CAAE6K,CAAAA,cAAc,CAACf,QAAQ,CAACpB,IAAQA,CAAAA,GAAAA,IAAAA;AAClDxC,YAAAA,aAAAA,EAAelG,CAAEkG,CAAAA,aAAa,CAAC4D,QAAQ,CAACpB,IAAAA,CAAAA;AACxCoC,YAAAA,YAAAA,EAAc9K,CAAE8K,CAAAA,YAAY,CAAChB,QAAQ,CAACpB,IAAAA,CAAAA;YACtCqC,cAAgB,EAAA,CAAA;YAChBC,WAAa,EAAA,IAAA;AACbC,YAAAA,OAAAA,EAASxM,OAAQyM,CAAAA,KAAK,CAAC,IAAI,CAACvN,OAAO,CAACsN,OAAO,EAAEjL,CAAAA,CAAEmL,YAAY,CAACrB,QAAQ,CAACpB,IAAAA,CAAAA,CAAAA;AACrEnH,YAAAA,QAAAA;YACA6J,iBAAmBlC,EAAAA,cAAAA;YACnBmC,oBAAsBpC,EAAAA,YAAAA;YACtBqC,oBAAsBvC,EAAAA;AACxB,SAAA;AACF;IAEQpG,cAA0B,GAAA;QAChC,OAAO;AACLkB,YAAAA,mBAAAA,EAAqBpF,QAAQC,IAAI,EAAA;AACjCiF,YAAAA,wBAAAA,EAA0BlF,QAAQC,IAAI,EAAA;AACtCkF,YAAAA,yBAAAA,EAA2BnF,QAAQC,IAAI,EAAA;AACvC8E,YAAAA,eAAAA,EAAiB/E,QAAQC,IAAI,EAAA;AAC7BgF,YAAAA,gBAAAA,EAAkBjF,QAAQC,IAAI,EAAA;AAC9BoF,YAAAA,iBAAAA,EAAmBrF,QAAQsF,MAAM,EAAA;AACjCC,YAAAA,iBAAAA,EAAmBvF,QAAQsF,MAAM,EAAA;AACjCE,YAAAA,YAAAA,EAAc,EAAC;YACfC,eAAiB,EAAA,CAAA;YACjBC,QAAU,EAAA;AACZ,SAAA;AACF;AAEQrB,IAAAA,iBAAAA,CAAkB7C,SAA0B,EAAc;QAChE,MAAMsD,GAAAA,GAAMtD,UAAUyB,gBAAgB,EAAA;QACtC,MAAM6J,GAAAA,GAAMtL,UAAU4B,gBAAgB,EAAA;QACtC,OAAO;AACL2B,YAAAA,eAAAA,EAAiBD,IAAIE,KAAK,EAAA;AAC1B+H,YAAAA,gBAAAA,EAAkB/M,QAAQC,IAAI,EAAA;AAC9B+M,YAAAA,YAAAA,EAAclI,IAAIE,KAAK,EAAA;YACvBiI,YAAc,EAAA,CAAA;AACd/H,YAAAA,wBAAAA,EAA0BJ,IAAIE,KAAK,EAAA;AACnCG,YAAAA,yBAAAA,EAA2BL,IAAIE,KAAK,EAAA;AACpCmB,YAAAA,yBAAAA,EAA2B2G,IAAI9H,KAAK,EAAA;AACpCkB,YAAAA,0BAAAA,EAA4B4G,IAAI9H,KAAK,EAAA;AACrCoB,YAAAA,YAAAA,EAAcC,UAAUjG,QAAQ,EAAA;AAChC8M,YAAAA,cAAAA,EAAgBlN,QAAQC,IAAI,EAAA;AAC5BkN,YAAAA,cAAAA,EAAgBnN,QAAQC,IAAI,EAAA;YAC5BmN,MAAQ,EAAA,CAAA;YACR9I,OAAS,EAAA;AACX,SAAA;AACF;AACF;;;;"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// spcr-joint-dynamics — math adapter layer
|
|
2
|
-
// Wraps base/vector.ts (class-based) with plain-object API for backward compatibility
|
|
3
|
-
// ── Utility ──
|
|
4
|
-
function clamp(v, min, max) {
|
|
5
|
-
return v < min ? min : v > max ? max : v;
|
|
6
|
-
}
|
|
7
|
-
function clamp01(v) {
|
|
8
|
-
return v < 0 ? 0 : v > 1 ? 1 : v;
|
|
9
|
-
}
|
|
10
|
-
function smoothStep(from, to, t) {
|
|
11
|
-
const c = clamp01((t - from) / (to - from));
|
|
12
|
-
return c * c * (3 - 2 * c);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export { clamp, clamp01, smoothStep };
|
|
16
|
-
//# sourceMappingURL=math.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sources":["../../../src/animation/spring2/math.ts"],"sourcesContent":["// spcr-joint-dynamics — math adapter layer\r\n// Wraps base/vector.ts (class-based) with plain-object API for backward compatibility\r\n\r\n// ── Utility ──\r\n\r\nexport function clamp(v: number, min: number, max: number): number {\r\n return v < min ? min : v > max ? max : v;\r\n}\r\n\r\nexport function clamp01(v: number): number {\r\n return v < 0 ? 0 : v > 1 ? 1 : v;\r\n}\r\n\r\nexport function smoothStep(from: number, to: number, t: number): number {\r\n const c = clamp01((t - from) / (to - from));\r\n return c * c * (3 - 2 * c);\r\n}\r\n"],"names":["clamp","v","min","max","clamp01","smoothStep","from","to","t","c"],"mappings":"AAAA;AACA;AAEA;AAEO,SAASA,KAAMC,CAAAA,CAAS,EAAEC,GAAW,EAAEC,GAAW,EAAA;AACvD,IAAA,OAAOF,CAAIC,GAAAA,GAAAA,GAAMA,GAAMD,GAAAA,CAAAA,GAAIE,MAAMA,GAAMF,GAAAA,CAAAA;AACzC;AAEO,SAASG,QAAQH,CAAS,EAAA;AAC/B,IAAA,OAAOA,CAAI,GAAA,CAAA,GAAI,CAAIA,GAAAA,CAAAA,GAAI,IAAI,CAAIA,GAAAA,CAAAA;AACjC;AAEO,SAASI,UAAWC,CAAAA,IAAY,EAAEC,EAAU,EAAEC,CAAS,EAAA;IAC5D,MAAMC,CAAAA,GAAIL,QAAQ,CAACI,IAAIF,IAAG,KAAMC,EAAAA,GAAKD,IAAG,CAAA,CAAA;AACxC,IAAA,OAAOG,CAAIA,GAAAA,CAAAA,IAAK,CAAA,GAAI,IAAIA,CAAAA,CAAAA;AAC1B;;;;"}
|