@zephyr3d/scene 0.9.2 → 0.9.4
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/animationset.js +135 -135
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/ik/ik_chain_builder.js +68 -0
- package/dist/animation/ik/ik_chain_builder.js.map +1 -0
- package/dist/animation/ik/ik_pole_constraint.js +2 -7
- package/dist/animation/ik/ik_pole_constraint.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +146 -146
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/math.js +16 -0
- package/dist/animation/joint_dynamics/math.js.map +1 -0
- package/dist/animation/spring/spring_system.js +75 -75
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring2/constraints.js.map +1 -1
- package/dist/animation/spring2/controller.js +64 -64
- package/dist/animation/spring2/controller.js.map +1 -1
- package/dist/animation/spring2/math.js.map +1 -1
- package/dist/animation/spring2/spring_system.js +8 -8
- package/dist/animation/spring2/spring_system.js.map +1 -1
- package/dist/app/engine.js +119 -71
- package/dist/app/engine.js.map +1 -1
- package/dist/asset/assetmanager.js +296 -244
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +1 -0
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/camera/camera.js +184 -184
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +685 -38
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +290 -290
- package/dist/material/material.js.map +1 -1
- package/dist/material/msdf_text.js +180 -0
- package/dist/material/msdf_text.js.map +1 -0
- package/dist/material/msdf_text_sprite.js +64 -0
- package/dist/material/msdf_text_sprite.js.map +1 -0
- package/dist/material/pbrblueprint.js +123 -108
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/shader/helper.js +6 -3
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite_sdf.js +106 -0
- package/dist/material/sprite_sdf.js.map +1 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +38 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +1 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +10 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +1 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +127 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +1 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +263 -0
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +1 -0
- package/dist/posteffect/ssr.js +1 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/render/abuffer_oit.js +1 -0
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +3 -4
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +28 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +1 -0
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/render_queue.js +1 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +93 -93
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +3 -3
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/types.js +22 -22
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/scene/basesprite.js +1 -5
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +29 -17
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +1 -0
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +8 -9
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +96 -0
- package/dist/scene/meshdrawable.js.map +1 -0
- package/dist/scene/msdftext.js +341 -0
- package/dist/scene/msdftext.js.map +1 -0
- package/dist/scene/msdftextsprite.js +349 -0
- package/dist/scene/msdftextsprite.js.map +1 -0
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.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 +6 -0
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sdftextsprite.js +322 -0
- package/dist/scene/sdftextsprite.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/textsprite.js +120 -0
- package/dist/scene/textsprite.js.map +1 -0
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shadow/shader.js +1 -0
- package/dist/shadow/shader.js.map +1 -1
- package/dist/shapes/torus.js +90 -59
- package/dist/shapes/torus.js.map +1 -1
- package/dist/src/animation/animation.js +127 -0
- package/dist/src/animation/animation.js.map +1 -0
- package/dist/src/animation/animationset.js +255 -0
- package/dist/src/animation/animationset.js.map +1 -0
- package/dist/src/animation/animationtrack.js +34 -0
- package/dist/src/animation/animationtrack.js.map +1 -0
- package/dist/src/animation/eulerrotationtrack.js +52 -0
- package/dist/src/animation/eulerrotationtrack.js.map +1 -0
- package/dist/src/animation/morphtarget.js +93 -0
- package/dist/src/animation/morphtarget.js.map +1 -0
- package/dist/src/animation/morphtrack.js +70 -0
- package/dist/src/animation/morphtrack.js.map +1 -0
- package/dist/src/animation/proptrack.js +161 -0
- package/dist/src/animation/proptrack.js.map +1 -0
- package/dist/src/animation/rotationtrack.js +51 -0
- package/dist/src/animation/rotationtrack.js.map +1 -0
- package/dist/src/animation/scaletrack.js +50 -0
- package/dist/src/animation/scaletrack.js.map +1 -0
- package/dist/src/animation/skeleton.js +204 -0
- package/dist/src/animation/skeleton.js.map +1 -0
- package/dist/src/animation/translationtrack.js +50 -0
- package/dist/src/animation/translationtrack.js.map +1 -0
- package/dist/src/app/app.js +129 -0
- package/dist/src/app/app.js.map +1 -0
- package/dist/src/app/inputmgr.js +267 -0
- package/dist/src/app/inputmgr.js.map +1 -0
- package/dist/src/asset/assetmanager.js +404 -0
- package/dist/src/asset/assetmanager.js.map +1 -0
- package/dist/src/asset/builtin.js +337 -0
- package/dist/src/asset/builtin.js.map +1 -0
- package/dist/src/asset/loaders/dds/dds.js +470 -0
- package/dist/src/asset/loaders/dds/dds.js.map +1 -0
- package/dist/src/asset/loaders/dds/dds_loader.js +28 -0
- package/dist/src/asset/loaders/dds/dds_loader.js.map +1 -0
- package/dist/src/asset/loaders/gltf/gltf_loader.js +1265 -0
- package/dist/src/asset/loaders/gltf/gltf_loader.js.map +1 -0
- package/dist/src/asset/loaders/gltf/helpers.js +327 -0
- package/dist/src/asset/loaders/gltf/helpers.js.map +1 -0
- package/dist/src/asset/loaders/hdr/hdr.js +180 -0
- package/dist/src/asset/loaders/hdr/hdr.js.map +1 -0
- package/dist/src/asset/loaders/image/tga_Loader.js +116 -0
- package/dist/src/asset/loaders/image/tga_Loader.js.map +1 -0
- package/dist/src/asset/loaders/image/webimage_loader.js +63 -0
- package/dist/src/asset/loaders/image/webimage_loader.js.map +1 -0
- package/dist/src/asset/loaders/loader.js +45 -0
- package/dist/src/asset/loaders/loader.js.map +1 -0
- package/dist/src/asset/model.js +414 -0
- package/dist/src/asset/model.js.map +1 -0
- package/dist/src/blitter/bilateralblur.js +221 -0
- package/dist/src/blitter/bilateralblur.js.map +1 -0
- package/dist/src/blitter/blitter.js +390 -0
- package/dist/src/blitter/blitter.js.map +1 -0
- package/dist/src/blitter/box.js +118 -0
- package/dist/src/blitter/box.js.map +1 -0
- package/dist/src/blitter/copy.js +22 -0
- package/dist/src/blitter/copy.js.map +1 -0
- package/dist/src/blitter/gaussianblur.js +228 -0
- package/dist/src/blitter/gaussianblur.js.map +1 -0
- package/dist/src/camera/base.js +92 -0
- package/dist/src/camera/base.js.map +1 -0
- package/dist/src/camera/camera.js +1005 -0
- package/dist/src/camera/camera.js.map +1 -0
- package/dist/src/camera/fps.js +238 -0
- package/dist/src/camera/fps.js.map +1 -0
- package/dist/src/camera/orbit.js +245 -0
- package/dist/src/camera/orbit.js.map +1 -0
- package/dist/src/camera/orthocamera.js +167 -0
- package/dist/src/camera/orthocamera.js.map +1 -0
- package/dist/src/camera/perspectivecamera.js +141 -0
- package/dist/src/camera/perspectivecamera.js.map +1 -0
- package/dist/src/index.js +120 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/material/blinn.js +81 -0
- package/dist/src/material/blinn.js.map +1 -0
- package/dist/src/material/grassmaterial.js +113 -0
- package/dist/src/material/grassmaterial.js.map +1 -0
- package/dist/src/material/lambert.js +92 -0
- package/dist/src/material/lambert.js.map +1 -0
- package/dist/src/material/material.js +301 -0
- package/dist/src/material/material.js.map +1 -0
- package/dist/src/material/meshmaterial.js +704 -0
- package/dist/src/material/meshmaterial.js.map +1 -0
- package/dist/src/material/mixins/albedocolor.js +76 -0
- package/dist/src/material/mixins/albedocolor.js.map +1 -0
- package/dist/src/material/mixins/foliage.js +47 -0
- package/dist/src/material/mixins/foliage.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/blinnphong.js +112 -0
- package/dist/src/material/mixins/lightmodel/blinnphong.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/lambert.js +58 -0
- package/dist/src/material/mixins/lightmodel/lambert.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +178 -0
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -0
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +139 -0
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -0
- package/dist/src/material/mixins/lit.js +476 -0
- package/dist/src/material/mixins/lit.js.map +1 -0
- package/dist/src/material/mixins/pbr/common.js +918 -0
- package/dist/src/material/mixins/pbr/common.js.map +1 -0
- package/dist/src/material/mixins/texture.js +172 -0
- package/dist/src/material/mixins/texture.js.map +1 -0
- package/dist/src/material/mixins/vertexcolor.js +56 -0
- package/dist/src/material/mixins/vertexcolor.js.map +1 -0
- package/dist/src/material/particle.js +178 -0
- package/dist/src/material/particle.js.map +1 -0
- package/dist/src/material/pbrmr.js +97 -0
- package/dist/src/material/pbrmr.js.map +1 -0
- package/dist/src/material/pbrsg.js +97 -0
- package/dist/src/material/pbrsg.js.map +1 -0
- package/dist/src/material/shader/helper.js +1209 -0
- package/dist/src/material/shader/helper.js.map +1 -0
- package/dist/src/material/terrain-cm.js +606 -0
- package/dist/src/material/terrain-cm.js.map +1 -0
- package/dist/src/material/terrainmaterial.js +375 -0
- package/dist/src/material/terrainmaterial.js.map +1 -0
- package/dist/src/material/unlit.js +41 -0
- package/dist/src/material/unlit.js.map +1 -0
- package/dist/src/material/water.js +417 -0
- package/dist/src/material/water.js.map +1 -0
- package/dist/src/posteffect/bloom.js +361 -0
- package/dist/src/posteffect/bloom.js.map +1 -0
- package/dist/src/posteffect/compositor.js +226 -0
- package/dist/src/posteffect/compositor.js.map +1 -0
- package/dist/src/posteffect/fxaa.js +273 -0
- package/dist/src/posteffect/fxaa.js.map +1 -0
- package/dist/src/posteffect/grayscale.js +69 -0
- package/dist/src/posteffect/grayscale.js.map +1 -0
- package/dist/src/posteffect/motionblur.js +96 -0
- package/dist/src/posteffect/motionblur.js.map +1 -0
- package/dist/src/posteffect/posteffect.js +126 -0
- package/dist/src/posteffect/posteffect.js.map +1 -0
- package/dist/src/posteffect/sao.js +324 -0
- package/dist/src/posteffect/sao.js.map +1 -0
- package/dist/src/posteffect/ssr.js +489 -0
- package/dist/src/posteffect/ssr.js.map +1 -0
- package/dist/src/posteffect/taa.js +172 -0
- package/dist/src/posteffect/taa.js.map +1 -0
- package/dist/src/posteffect/tonemap.js +94 -0
- package/dist/src/posteffect/tonemap.js.map +1 -0
- package/dist/src/render/abuffer_oit.js +361 -0
- package/dist/src/render/abuffer_oit.js.map +1 -0
- package/dist/src/render/clipmap.js +851 -0
- package/dist/src/render/clipmap.js.map +1 -0
- package/dist/src/render/cluster_light.js +333 -0
- package/dist/src/render/cluster_light.js.map +1 -0
- package/dist/src/render/cull_visitor.js +187 -0
- package/dist/src/render/cull_visitor.js.map +1 -0
- package/dist/src/render/depthpass.js +68 -0
- package/dist/src/render/depthpass.js.map +1 -0
- package/dist/src/render/drawable_mixin.js +227 -0
- package/dist/src/render/drawable_mixin.js.map +1 -0
- package/dist/src/render/envlight.js +463 -0
- package/dist/src/render/envlight.js.map +1 -0
- package/dist/src/render/fbm_wavegenerator.js +251 -0
- package/dist/src/render/fbm_wavegenerator.js.map +1 -0
- package/dist/src/render/fft_wavegenerator.js +1006 -0
- package/dist/src/render/fft_wavegenerator.js.map +1 -0
- package/dist/src/render/fullscreenquad.js +38 -0
- package/dist/src/render/fullscreenquad.js.map +1 -0
- package/dist/src/render/gerstner_wavegenerator.js +314 -0
- package/dist/src/render/gerstner_wavegenerator.js.map +1 -0
- package/dist/src/render/globalbindgroup_allocator.js +60 -0
- package/dist/src/render/globalbindgroup_allocator.js.map +1 -0
- package/dist/src/render/hzb.js +273 -0
- package/dist/src/render/hzb.js.map +1 -0
- package/dist/src/render/lightpass.js +172 -0
- package/dist/src/render/lightpass.js.map +1 -0
- package/dist/src/render/objectcolorpass.js +51 -0
- package/dist/src/render/objectcolorpass.js.map +1 -0
- package/dist/src/render/primitive.js +364 -0
- package/dist/src/render/primitive.js.map +1 -0
- package/dist/src/render/render_queue.js +467 -0
- package/dist/src/render/render_queue.js.map +1 -0
- package/dist/src/render/renderbundle_wrapper.js +152 -0
- package/dist/src/render/renderbundle_wrapper.js.map +1 -0
- package/dist/src/render/renderer.js +455 -0
- package/dist/src/render/renderer.js.map +1 -0
- package/dist/src/render/renderpass.js +200 -0
- package/dist/src/render/renderpass.js.map +1 -0
- package/dist/src/render/shadowmap_pass.js +56 -0
- package/dist/src/render/shadowmap_pass.js.map +1 -0
- package/dist/src/render/sky.js +1103 -0
- package/dist/src/render/sky.js.map +1 -0
- package/dist/src/render/weightedblended_oit.js +168 -0
- package/dist/src/render/weightedblended_oit.js.map +1 -0
- package/dist/src/scene/batchgroup.js +162 -0
- package/dist/src/scene/batchgroup.js.map +1 -0
- package/dist/src/scene/environment.js +209 -0
- package/dist/src/scene/environment.js.map +1 -0
- package/dist/src/scene/graph_node.js +72 -0
- package/dist/src/scene/graph_node.js.map +1 -0
- package/dist/src/scene/light.js +416 -0
- package/dist/src/scene/light.js.map +1 -0
- package/dist/src/scene/mesh.js +341 -0
- package/dist/src/scene/mesh.js.map +1 -0
- package/dist/src/scene/octree.js +649 -0
- package/dist/src/scene/octree.js.map +1 -0
- package/dist/src/scene/particlesys.js +738 -0
- package/dist/src/scene/particlesys.js.map +1 -0
- package/dist/src/scene/raycast_visitor.js +103 -0
- package/dist/src/scene/raycast_visitor.js.map +1 -0
- package/dist/src/scene/scene.js +284 -0
- package/dist/src/scene/scene.js.map +1 -0
- package/dist/src/scene/scene_node.js +732 -0
- package/dist/src/scene/scene_node.js.map +1 -0
- package/dist/src/scene/terrain/grass.js +278 -0
- package/dist/src/scene/terrain/grass.js.map +1 -0
- package/dist/src/scene/terrain/heightfield.js +475 -0
- package/dist/src/scene/terrain/heightfield.js.map +1 -0
- package/dist/src/scene/terrain/patch.js +530 -0
- package/dist/src/scene/terrain/patch.js.map +1 -0
- package/dist/src/scene/terrain/quadtree.js +461 -0
- package/dist/src/scene/terrain/quadtree.js.map +1 -0
- package/dist/src/scene/terrain/terrain.js +246 -0
- package/dist/src/scene/terrain/terrain.js.map +1 -0
- package/dist/src/scene/terrain-cm/grass.js +594 -0
- package/dist/src/scene/terrain-cm/grass.js.map +1 -0
- package/dist/src/scene/terrain-cm/grassmaterial.js +159 -0
- package/dist/src/scene/terrain-cm/grassmaterial.js.map +1 -0
- package/dist/src/scene/terrain-cm/terrain-cm.js +538 -0
- package/dist/src/scene/terrain-cm/terrain-cm.js.map +1 -0
- package/dist/src/scene/water.js +374 -0
- package/dist/src/scene/water.js.map +1 -0
- package/dist/src/shaders/atmosphere.js +957 -0
- package/dist/src/shaders/atmosphere.js.map +1 -0
- package/dist/src/shaders/fog.js +112 -0
- package/dist/src/shaders/fog.js.map +1 -0
- package/dist/src/shaders/misc.js +266 -0
- package/dist/src/shaders/misc.js.map +1 -0
- package/dist/src/shaders/noise.js +222 -0
- package/dist/src/shaders/noise.js.map +1 -0
- package/dist/src/shaders/pbr.js +51 -0
- package/dist/src/shaders/pbr.js.map +1 -0
- package/dist/src/shaders/shadow.js +636 -0
- package/dist/src/shaders/shadow.js.map +1 -0
- package/dist/src/shaders/ssr.js +490 -0
- package/dist/src/shaders/ssr.js.map +1 -0
- package/dist/src/shaders/temporal.js +215 -0
- package/dist/src/shaders/temporal.js.map +1 -0
- package/dist/src/shaders/water.js +756 -0
- package/dist/src/shaders/water.js.map +1 -0
- package/dist/src/shadow/esm.js +237 -0
- package/dist/src/shadow/esm.js.map +1 -0
- package/dist/src/shadow/pcf_opt.js +181 -0
- package/dist/src/shadow/pcf_opt.js.map +1 -0
- package/dist/src/shadow/pcf_pd.js +189 -0
- package/dist/src/shadow/pcf_pd.js.map +1 -0
- package/dist/src/shadow/shader.js +37 -0
- package/dist/src/shadow/shader.js.map +1 -0
- package/dist/src/shadow/shadow_impl.js +15 -0
- package/dist/src/shadow/shadow_impl.js.map +1 -0
- package/dist/src/shadow/shadowmapper.js +790 -0
- package/dist/src/shadow/shadowmapper.js.map +1 -0
- package/dist/src/shadow/ssm.js +159 -0
- package/dist/src/shadow/ssm.js.map +1 -0
- package/dist/src/shadow/vsm.js +297 -0
- package/dist/src/shadow/vsm.js.map +1 -0
- package/dist/src/shapes/box.js +386 -0
- package/dist/src/shapes/box.js.map +1 -0
- package/dist/src/shapes/cylinder.js +125 -0
- package/dist/src/shapes/cylinder.js.map +1 -0
- package/dist/src/shapes/plane.js +88 -0
- package/dist/src/shapes/plane.js.map +1 -0
- package/dist/src/shapes/shape.js +87 -0
- package/dist/src/shapes/shape.js.map +1 -0
- package/dist/src/shapes/sphere.js +114 -0
- package/dist/src/shapes/sphere.js.map +1 -0
- package/dist/src/shapes/tetrahedron.js +188 -0
- package/dist/src/shapes/tetrahedron.js.map +1 -0
- package/dist/src/shapes/torus.js +111 -0
- package/dist/src/shapes/torus.js.map +1 -0
- package/dist/src/utility/aabbtree.js +400 -0
- package/dist/src/utility/aabbtree.js.map +1 -0
- package/dist/src/utility/bounding_volume.js +29 -0
- package/dist/src/utility/bounding_volume.js.map +1 -0
- package/dist/src/utility/debug.js +28 -0
- package/dist/src/utility/debug.js.map +1 -0
- package/dist/src/utility/draco/decoder.js +116 -0
- package/dist/src/utility/draco/decoder.js.map +1 -0
- package/dist/src/utility/misc.js +105 -0
- package/dist/src/utility/misc.js.map +1 -0
- package/dist/src/utility/panorama.js +163 -0
- package/dist/src/utility/panorama.js.map +1 -0
- package/dist/src/utility/pmrem.js +354 -0
- package/dist/src/utility/pmrem.js.map +1 -0
- package/dist/src/utility/rendermipmap.js +115 -0
- package/dist/src/utility/rendermipmap.js.map +1 -0
- package/dist/src/utility/serialization/json.js +402 -0
- package/dist/src/utility/serialization/json.js.map +1 -0
- package/dist/src/utility/serialization/manager.js +623 -0
- package/dist/src/utility/serialization/manager.js.map +1 -0
- package/dist/src/utility/serialization/scene/animation.js +248 -0
- package/dist/src/utility/serialization/scene/animation.js.map +1 -0
- package/dist/src/utility/serialization/scene/batch.js +59 -0
- package/dist/src/utility/serialization/scene/batch.js.map +1 -0
- package/dist/src/utility/serialization/scene/camera.js +790 -0
- package/dist/src/utility/serialization/scene/camera.js.map +1 -0
- package/dist/src/utility/serialization/scene/common.js +222 -0
- package/dist/src/utility/serialization/scene/common.js.map +1 -0
- package/dist/src/utility/serialization/scene/light.js +575 -0
- package/dist/src/utility/serialization/scene/light.js.map +1 -0
- package/dist/src/utility/serialization/scene/material.js +1111 -0
- package/dist/src/utility/serialization/scene/material.js.map +1 -0
- package/dist/src/utility/serialization/scene/mesh.js +148 -0
- package/dist/src/utility/serialization/scene/mesh.js.map +1 -0
- package/dist/src/utility/serialization/scene/misc.js +39 -0
- package/dist/src/utility/serialization/scene/misc.js.map +1 -0
- package/dist/src/utility/serialization/scene/node.js +451 -0
- package/dist/src/utility/serialization/scene/node.js.map +1 -0
- package/dist/src/utility/serialization/scene/particle.js +425 -0
- package/dist/src/utility/serialization/scene/particle.js.map +1 -0
- package/dist/src/utility/serialization/scene/primitive.js +692 -0
- package/dist/src/utility/serialization/scene/primitive.js.map +1 -0
- package/dist/src/utility/serialization/scene/scene.js +704 -0
- package/dist/src/utility/serialization/scene/scene.js.map +1 -0
- package/dist/src/utility/serialization/scene/terrain.js +488 -0
- package/dist/src/utility/serialization/scene/terrain.js.map +1 -0
- package/dist/src/utility/serialization/scene/water.js +465 -0
- package/dist/src/utility/serialization/scene/water.js.map +1 -0
- package/dist/src/utility/shprojector.js +297 -0
- package/dist/src/utility/shprojector.js.map +1 -0
- package/dist/src/utility/textures/ggxlut.js +213 -0
- package/dist/src/utility/textures/ggxlut.js.map +1 -0
- package/dist/src/utility/textures/gradientnoise.js +62 -0
- package/dist/src/utility/textures/gradientnoise.js.map +1 -0
- package/dist/src/utility/textures/randomnoise.js +41 -0
- package/dist/src/utility/textures/randomnoise.js.map +1 -0
- package/dist/src/values.js +162 -0
- package/dist/src/values.js.map +1 -0
- package/dist/text/font/font_asset.js +884 -0
- package/dist/text/font/font_asset.js.map +1 -0
- package/dist/text/font/sfnt_reader.js +43 -0
- package/dist/text/font/sfnt_reader.js.map +1 -0
- package/dist/text/msdf/generator.js +417 -0
- package/dist/text/msdf/generator.js.map +1 -0
- package/dist/text/msdf/shape.js +143 -0
- package/dist/text/msdf/shape.js.map +1 -0
- package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
- package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js +47 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
- package/dist/text/runtime/text_layout.js +96 -0
- package/dist/text/runtime/text_layout.js.map +1 -0
- package/dist/utility/blueprint/material/common.js +7 -0
- package/dist/utility/blueprint/material/common.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +1275 -1091
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +505 -490
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +32 -0
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/serialization/blueprint/constants.js +255 -0
- package/dist/utility/serialization/blueprint/constants.js.map +1 -0
- package/dist/utility/serialization/blueprint/material/constants.js +203 -0
- package/dist/utility/serialization/blueprint/material/constants.js.map +1 -0
- package/dist/utility/serialization/blueprint/material/texture.js +165 -0
- package/dist/utility/serialization/blueprint/material/texture.js.map +1 -0
- package/dist/utility/serialization/manager.js +55 -11
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +2 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +2 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +2 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +2 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +2 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +2 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +2 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +2 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +2 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +516 -0
- package/dist/utility/serialization/scene/text.js.map +1 -0
- package/dist/utility/serialization/scene/water.js +2 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js +4 -4
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +1 -5
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
- package/dist/animation/joint_dynamics/vrm_spring_bone.js +0 -46
- package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +0 -1
- package/dist/animation/spring/spring_bone.js +0 -240
- package/dist/animation/spring/spring_bone.js.map +0 -1
- package/dist/animation/spring/spring_bone_collider.js +0 -198
- package/dist/animation/spring/spring_bone_collider.js.map +0 -1
- package/dist/animation/spring/spring_bone_constraint.js +0 -170
- package/dist/animation/spring/spring_bone_constraint.js.map +0 -1
- package/dist/animation/spring/spring_bone_system.js +0 -328
- package/dist/animation/spring/spring_bone_system.js.map +0 -1
- package/dist/render/sky_motion_vector.js +0 -85
- package/dist/render/sky_motion_vector.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spring_bone.js","sources":["../../../src/animation/spring/spring_bone.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Spring bone for physics-based animation.\r\n *\r\n * @remarks\r\n * A spring bone simulates physics on a bone node, commonly used for:\r\n * - Skirts and dresses\r\n * - Hair strands\r\n * - Tails\r\n * - Capes and cloth\r\n *\r\n * The bone follows its parent's animation but adds secondary motion\r\n * based on physics simulation (springs, gravity, inertia).\r\n *\r\n * @public\r\n */\r\nexport class SpringBone {\r\n /** The bone node this spring controls */\r\n private _bone: SceneNode;\r\n /** Current position in world space */\r\n private _currentPosition: Vector3;\r\n /** Previous position in world space (for velocity calculation) */\r\n private _previousPosition: Vector3;\r\n /** Initial local position relative to parent */\r\n private _initialLocalPosition: Vector3;\r\n /** Initial bone length (distance from parent) */\r\n private _boneLength: number;\r\n\r\n /** Spring stiffness (0-1, higher = stiffer) */\r\n private _stiffness: number;\r\n /** Damping factor (0-1, higher = more damping) */\r\n private _damping: number;\r\n /** Mass of the bone (affects inertia) */\r\n private _mass: number;\r\n /** Gravity scale (1 = normal gravity, 0 = no gravity) */\r\n private _gravityScale: number;\r\n\r\n /** Radius for collision detection */\r\n private _radius: number;\r\n\r\n /**\r\n * Create a spring bone.\r\n *\r\n * @param bone - The bone node to control\r\n * @param stiffness - Spring stiffness (0-1, default: 0.1)\r\n * @param damping - Damping factor (0-1, default: 0.5)\r\n * @param mass - Mass of the bone (default: 1)\r\n * @param gravityScale - Gravity scale (default: 1)\r\n * @param radius - Collision radius (default: 0.05)\r\n */\r\n constructor(\r\n bone: SceneNode,\r\n stiffness = 0.1,\r\n damping = 0.5,\r\n mass = 1,\r\n gravityScale = 1,\r\n radius = 0.05\r\n ) {\r\n this._bone = bone;\r\n this._stiffness = Math.max(0, Math.min(1, stiffness));\r\n this._damping = Math.max(0, Math.min(1, damping));\r\n this._mass = Math.max(0.01, mass);\r\n this._gravityScale = gravityScale;\r\n this._radius = Math.max(0, radius);\r\n\r\n // Store initial local transform\r\n this._initialLocalPosition = bone.position.clone();\r\n this._boneLength = this._initialLocalPosition.magnitude;\r\n\r\n // Initialize positions in world space\r\n const worldPos = new Vector3();\r\n bone.worldMatrix.decompose(null, null, worldPos);\r\n this._currentPosition = worldPos.clone();\r\n this._previousPosition = worldPos.clone();\r\n }\r\n\r\n /**\r\n * Get the bone node.\r\n */\r\n get bone(): SceneNode {\r\n return this._bone;\r\n }\r\n\r\n /**\r\n * Get/set spring stiffness (0-1).\r\n */\r\n get stiffness(): number {\r\n return this._stiffness;\r\n }\r\n\r\n set stiffness(value: number) {\r\n this._stiffness = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get/set damping factor (0-1).\r\n */\r\n get damping(): number {\r\n return this._damping;\r\n }\r\n\r\n set damping(value: number) {\r\n this._damping = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Get/set mass.\r\n */\r\n get mass(): number {\r\n return this._mass;\r\n }\r\n\r\n set mass(value: number) {\r\n this._mass = Math.max(0.01, value);\r\n }\r\n\r\n /**\r\n * Get/set gravity scale.\r\n */\r\n get gravityScale(): number {\r\n return this._gravityScale;\r\n }\r\n\r\n set gravityScale(value: number) {\r\n this._gravityScale = value;\r\n }\r\n\r\n /**\r\n * Get/set collision radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Get current position in world space.\r\n */\r\n get currentPosition(): Vector3 {\r\n return this._currentPosition;\r\n }\r\n\r\n /**\r\n * Get initial local position relative to parent.\r\n */\r\n get initialLocalPosition(): Vector3 {\r\n return this._initialLocalPosition;\r\n }\r\n\r\n /**\r\n * Reset the spring bone to its initial state.\r\n */\r\n reset(): void {\r\n const worldPos = new Vector3();\r\n this._bone.worldMatrix.decompose(null, null, worldPos);\r\n this._currentPosition.set(worldPos);\r\n this._previousPosition.set(worldPos);\r\n }\r\n\r\n /**\r\n * Update spring physics.\r\n *\r\n * @param deltaTime - Time step in seconds\r\n * @param gravity - Gravity vector in world space\r\n * @param windForce - Wind force vector in world space\r\n */\r\n update(deltaTime: number, gravity: Vector3, windForce: Vector3): void {\r\n // Clamp delta time to avoid instability (1ms to 100ms)\r\n if (deltaTime <= 0.001 || deltaTime > 0.1) {\r\n return; // Skip invalid or too large time steps\r\n }\r\n\r\n // Get parent's world position\r\n const parent = this._bone.parent;\r\n if (!parent) {\r\n return; // Root bone, no spring simulation\r\n }\r\n\r\n const parentWorldPos = new Vector3();\r\n parent.worldMatrix.decompose(null, null, parentWorldPos);\r\n\r\n // Calculate velocity from previous frame\r\n const velocity = Vector3.sub(this._currentPosition, this._previousPosition, new Vector3());\r\n Vector3.scale(velocity, 1 / deltaTime, velocity);\r\n\r\n // Store current position as previous\r\n this._previousPosition.set(this._currentPosition);\r\n\r\n // Calculate forces\r\n const totalForce = new Vector3();\r\n\r\n // 1. Gravity force\r\n const gravityForce = Vector3.scale(gravity, this._gravityScale * this._mass, new Vector3());\r\n totalForce.addBy(gravityForce);\r\n\r\n // 2. Wind force\r\n totalForce.addBy(windForce);\r\n\r\n // 3. Damping force (opposes velocity)\r\n const dampingForce = Vector3.scale(velocity, -this._damping * this._mass, new Vector3());\r\n totalForce.addBy(dampingForce);\r\n\r\n // 4. Spring force (only if stretched beyond bone length)\r\n const toChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const currentLength = toChild.magnitude;\r\n\r\n if (currentLength > this._boneLength + 0.001) {\r\n // Bone is stretched, apply restoring force\r\n const stretchAmount = currentLength - this._boneLength;\r\n const direction = Vector3.scale(toChild, -1 / currentLength, new Vector3());\r\n const springForce = Vector3.scale(direction, stretchAmount * this._stiffness * 100, new Vector3());\r\n totalForce.addBy(springForce);\r\n }\r\n\r\n // Calculate acceleration (F = ma, a = F/m)\r\n const acceleration = Vector3.scale(totalForce, 1 / this._mass, new Vector3());\r\n\r\n // Update velocity\r\n velocity.addBy(Vector3.scale(acceleration, deltaTime, new Vector3()));\r\n\r\n // Apply velocity damping (additional damping to prevent oscillation)\r\n const velocityMagnitude = velocity.magnitude;\r\n if (velocityMagnitude > 0.001) {\r\n const dampingFactor = Math.max(0, 1 - this._damping * deltaTime * 10);\r\n velocity.scaleBy(dampingFactor);\r\n }\r\n\r\n // Update position\r\n this._currentPosition.addBy(Vector3.scale(velocity, deltaTime, new Vector3()));\r\n\r\n // Constrain to bone length (hard constraint)\r\n const finalToChild = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const finalLength = finalToChild.magnitude;\r\n\r\n if (finalLength > 0.000001) {\r\n const direction = Vector3.scale(finalToChild, 1 / finalLength, new Vector3());\r\n const targetPos = Vector3.add(\r\n parentWorldPos,\r\n Vector3.scale(direction, this._boneLength, new Vector3()),\r\n new Vector3()\r\n );\r\n\r\n // Soft constraint: blend toward target position\r\n // This prevents the hard snap that causes oscillation\r\n const constraintStrength = 0.5; // 0 = no constraint, 1 = hard constraint\r\n this._currentPosition.x += (targetPos.x - this._currentPosition.x) * constraintStrength;\r\n this._currentPosition.y += (targetPos.y - this._currentPosition.y) * constraintStrength;\r\n this._currentPosition.z += (targetPos.z - this._currentPosition.z) * constraintStrength;\r\n }\r\n }\r\n\r\n /**\r\n * Apply the simulated position to the bone node.\r\n *\r\n * @remarks\r\n * This converts the world space position back to local rotation.\r\n */\r\n applyToNode(): void {\r\n const parent = this._bone.parent;\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n // Get parent's world position and rotation\r\n const parentWorldPos = new Vector3();\r\n const parentWorldRot = new Quaternion();\r\n parent.worldMatrix.decompose(null, parentWorldRot, parentWorldPos);\r\n\r\n // Calculate current direction from parent to simulated position (in world space)\r\n const currentDir = Vector3.sub(this._currentPosition, parentWorldPos, new Vector3());\r\n const currentLength = currentDir.magnitude;\r\n\r\n if (currentLength < 0.000001) {\r\n return; // Too close to parent\r\n }\r\n\r\n currentDir.scaleBy(1 / currentLength);\r\n\r\n // Transform current direction to parent's local space\r\n const parentInvRot = Quaternion.conjugate(parentWorldRot, new Quaternion());\r\n const currentDirLocal = parentInvRot.transform(currentDir, new Vector3());\r\n\r\n // Original direction in local space (normalized)\r\n const originalDirLocal = Vector3.normalize(this._initialLocalPosition, new Vector3());\r\n\r\n // Calculate local rotation from original to current\r\n const localRotation = new Quaternion();\r\n this._fromToRotation(originalDirLocal, currentDirLocal, localRotation);\r\n\r\n // Apply to bone\r\n this._bone.rotation = localRotation;\r\n }\r\n\r\n /**\r\n * Calculate rotation from one direction to another.\r\n */\r\n private _fromToRotation(from: Vector3, to: Vector3, result: Quaternion): Quaternion {\r\n const dot = Vector3.dot(from, to);\r\n\r\n if (dot >= 0.999999) {\r\n return result.identity();\r\n }\r\n\r\n if (dot <= -0.999999) {\r\n let axis = Vector3.cross(Vector3.axisPX(), from, new Vector3());\r\n const lenSq = axis.x * axis.x + axis.y * axis.y + axis.z * axis.z;\r\n if (lenSq < 0.000001) {\r\n axis = Vector3.cross(Vector3.axisPY(), from, new Vector3());\r\n }\r\n axis.inplaceNormalize();\r\n return result.fromAxisAngle(axis, Math.PI);\r\n }\r\n\r\n const axis = Vector3.cross(from, to).inplaceNormalize();\r\n const angle = Math.acos(dot);\r\n return result.fromAxisAngle(axis, angle);\r\n }\r\n}\r\n\r\n"],"names":["SpringBone","bone","stiffness","damping","mass","gravityScale","radius","_bone","_stiffness","Math","max","min","_damping","_mass","_gravityScale","_radius","_initialLocalPosition","position","clone","_boneLength","magnitude","worldPos","Vector3","worldMatrix","decompose","_currentPosition","_previousPosition","value","currentPosition","initialLocalPosition","reset","set","update","deltaTime","gravity","windForce","parent","parentWorldPos","velocity","sub","scale","totalForce","gravityForce","addBy","dampingForce","toChild","currentLength","stretchAmount","direction","springForce","acceleration","velocityMagnitude","dampingFactor","scaleBy","finalToChild","finalLength","targetPos","add","constraintStrength","x","y","z","applyToNode","parentWorldRot","Quaternion","currentDir","parentInvRot","conjugate","currentDirLocal","transform","originalDirLocal","normalize","localRotation","_fromToRotation","rotation","from","to","result","dot","identity","axis","cross","axisPX","lenSq","axisPY","inplaceNormalize","fromAxisAngle","PI","angle","acos"],"mappings":"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"}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import { Vector3 } from '@zephyr3d/base';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Base class for spring bone colliders.
|
|
5
|
-
*
|
|
6
|
-
* @public
|
|
7
|
-
*/ class SpringBoneCollider {
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Sphere collider for spring bones.
|
|
11
|
-
*
|
|
12
|
-
* @public
|
|
13
|
-
*/ class SphereCollider extends SpringBoneCollider {
|
|
14
|
-
/** Center position in world space */ _center;
|
|
15
|
-
/** Sphere radius */ _radius;
|
|
16
|
-
/** Optional bone node to follow */ _bone;
|
|
17
|
-
/** Local offset from bone (if bone is set) */ _localOffset;
|
|
18
|
-
/**
|
|
19
|
-
* Create a sphere collider.
|
|
20
|
-
*
|
|
21
|
-
* @param center - Center position in world space (or local offset if bone is provided)
|
|
22
|
-
* @param radius - Sphere radius
|
|
23
|
-
* @param bone - Optional bone node to follow
|
|
24
|
-
*/ constructor(center, radius, bone = null){
|
|
25
|
-
super();
|
|
26
|
-
this._center = center.clone();
|
|
27
|
-
this._radius = Math.max(0, radius);
|
|
28
|
-
this._bone = bone;
|
|
29
|
-
this._localOffset = bone ? center.clone() : new Vector3();
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Get/set center position.
|
|
33
|
-
*/ get center() {
|
|
34
|
-
if (this._bone) {
|
|
35
|
-
// Calculate world position from bone
|
|
36
|
-
const worldPos = new Vector3();
|
|
37
|
-
const matrix = this._bone.worldMatrix;
|
|
38
|
-
const offset = this._localOffset;
|
|
39
|
-
worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
|
|
40
|
-
worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
|
|
41
|
-
worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
|
|
42
|
-
return worldPos;
|
|
43
|
-
}
|
|
44
|
-
return this._center;
|
|
45
|
-
}
|
|
46
|
-
set center(value) {
|
|
47
|
-
if (this._bone) {
|
|
48
|
-
this._localOffset.set(value);
|
|
49
|
-
} else {
|
|
50
|
-
this._center.set(value);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Get/set radius.
|
|
55
|
-
*/ get radius() {
|
|
56
|
-
return this._radius;
|
|
57
|
-
}
|
|
58
|
-
set radius(value) {
|
|
59
|
-
this._radius = Math.max(0, value);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Get/set bone node.
|
|
63
|
-
*/ get bone() {
|
|
64
|
-
return this._bone;
|
|
65
|
-
}
|
|
66
|
-
set bone(value) {
|
|
67
|
-
this._bone = value;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Test collision with a point and resolve it.
|
|
71
|
-
*/ collide(position, radius) {
|
|
72
|
-
const center = this.center;
|
|
73
|
-
const direction = Vector3.sub(position, center, new Vector3());
|
|
74
|
-
const distance = direction.magnitude;
|
|
75
|
-
const minDistance = this._radius + radius;
|
|
76
|
-
if (distance < minDistance && distance > 0.000001) {
|
|
77
|
-
// Collision detected, push the point out
|
|
78
|
-
direction.scaleBy(1 / distance);
|
|
79
|
-
const penetration = minDistance - distance;
|
|
80
|
-
position.addBy(Vector3.scale(direction, penetration, new Vector3()));
|
|
81
|
-
return true;
|
|
82
|
-
}
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Capsule collider for spring bones.
|
|
88
|
-
*
|
|
89
|
-
* @remarks
|
|
90
|
-
* A capsule is defined by two sphere centers and a radius.
|
|
91
|
-
* Useful for limbs like arms and legs.
|
|
92
|
-
*
|
|
93
|
-
* @public
|
|
94
|
-
*/ class CapsuleCollider extends SpringBoneCollider {
|
|
95
|
-
/** Start point in world space */ _start;
|
|
96
|
-
/** End point in world space */ _end;
|
|
97
|
-
/** Capsule radius */ _radius;
|
|
98
|
-
/** Optional bone node for start point */ _startBone;
|
|
99
|
-
/** Optional bone node for end point */ _endBone;
|
|
100
|
-
/** Local offset for start point */ _startOffset;
|
|
101
|
-
/** Local offset for end point */ _endOffset;
|
|
102
|
-
/**
|
|
103
|
-
* Create a capsule collider.
|
|
104
|
-
*
|
|
105
|
-
* @param start - Start point in world space (or local offset if startBone is provided)
|
|
106
|
-
* @param end - End point in world space (or local offset if endBone is provided)
|
|
107
|
-
* @param radius - Capsule radius
|
|
108
|
-
* @param startBone - Optional bone node for start point
|
|
109
|
-
* @param endBone - Optional bone node for end point
|
|
110
|
-
*/ constructor(start, end, radius, startBone = null, endBone = null){
|
|
111
|
-
super();
|
|
112
|
-
this._start = start.clone();
|
|
113
|
-
this._end = end.clone();
|
|
114
|
-
this._radius = Math.max(0, radius);
|
|
115
|
-
this._startBone = startBone;
|
|
116
|
-
this._endBone = endBone;
|
|
117
|
-
this._startOffset = startBone ? start.clone() : new Vector3();
|
|
118
|
-
this._endOffset = endBone ? end.clone() : new Vector3();
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Get start point in world space.
|
|
122
|
-
*/ get start() {
|
|
123
|
-
if (this._startBone) {
|
|
124
|
-
const worldPos = new Vector3();
|
|
125
|
-
const matrix = this._startBone.worldMatrix;
|
|
126
|
-
const offset = this._startOffset;
|
|
127
|
-
worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
|
|
128
|
-
worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
|
|
129
|
-
worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
|
|
130
|
-
return worldPos;
|
|
131
|
-
}
|
|
132
|
-
return this._start;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Get end point in world space.
|
|
136
|
-
*/ get end() {
|
|
137
|
-
if (this._endBone) {
|
|
138
|
-
const worldPos = new Vector3();
|
|
139
|
-
const matrix = this._endBone.worldMatrix;
|
|
140
|
-
const offset = this._endOffset;
|
|
141
|
-
worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;
|
|
142
|
-
worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;
|
|
143
|
-
worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;
|
|
144
|
-
return worldPos;
|
|
145
|
-
}
|
|
146
|
-
return this._end;
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Get/set radius.
|
|
150
|
-
*/ get radius() {
|
|
151
|
-
return this._radius;
|
|
152
|
-
}
|
|
153
|
-
set radius(value) {
|
|
154
|
-
this._radius = Math.max(0, value);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Test collision with a point and resolve it.
|
|
158
|
-
*/ collide(position, radius) {
|
|
159
|
-
const start = this.start;
|
|
160
|
-
const end = this.end;
|
|
161
|
-
// Calculate closest point on capsule line segment
|
|
162
|
-
const line = Vector3.sub(end, start, new Vector3());
|
|
163
|
-
const lineLength = line.magnitude;
|
|
164
|
-
if (lineLength < 0.000001) {
|
|
165
|
-
// Degenerate capsule, treat as sphere
|
|
166
|
-
const direction = Vector3.sub(position, start, new Vector3());
|
|
167
|
-
const distance = direction.magnitude;
|
|
168
|
-
const minDistance = this._radius + radius;
|
|
169
|
-
if (distance < minDistance && distance > 0.000001) {
|
|
170
|
-
direction.scaleBy(1 / distance);
|
|
171
|
-
const penetration = minDistance - distance;
|
|
172
|
-
position.addBy(Vector3.scale(direction, penetration, new Vector3()));
|
|
173
|
-
return true;
|
|
174
|
-
}
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
const lineDir = Vector3.scale(line, 1 / lineLength, new Vector3());
|
|
178
|
-
const toPoint = Vector3.sub(position, start, new Vector3());
|
|
179
|
-
const t = Math.max(0, Math.min(lineLength, Vector3.dot(toPoint, lineDir)));
|
|
180
|
-
// Closest point on line segment
|
|
181
|
-
const closestPoint = Vector3.add(start, Vector3.scale(lineDir, t, new Vector3()), new Vector3());
|
|
182
|
-
// Check distance from closest point
|
|
183
|
-
const direction = Vector3.sub(position, closestPoint, new Vector3());
|
|
184
|
-
const distance = direction.magnitude;
|
|
185
|
-
const minDistance = this._radius + radius;
|
|
186
|
-
if (distance < minDistance && distance > 0.000001) {
|
|
187
|
-
// Collision detected, push the point out
|
|
188
|
-
direction.scaleBy(1 / distance);
|
|
189
|
-
const penetration = minDistance - distance;
|
|
190
|
-
position.addBy(Vector3.scale(direction, penetration, new Vector3()));
|
|
191
|
-
return true;
|
|
192
|
-
}
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
export { CapsuleCollider, SphereCollider, SpringBoneCollider };
|
|
198
|
-
//# sourceMappingURL=spring_bone_collider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spring_bone_collider.js","sources":["../../../src/animation/spring/spring_bone_collider.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\nimport type { SceneNode } from '../../scene/scene_node';\r\n\r\n/**\r\n * Base class for spring bone colliders.\r\n *\r\n * @public\r\n */\r\nexport abstract class SpringBoneCollider {\r\n /**\r\n * Test collision with a point and resolve it.\r\n *\r\n * @param position - Point position in world space\r\n * @param radius - Point radius\r\n * @returns True if collision occurred and was resolved\r\n */\r\n abstract collide(position: Vector3, radius: number): boolean;\r\n}\r\n\r\n/**\r\n * Sphere collider for spring bones.\r\n *\r\n * @public\r\n */\r\nexport class SphereCollider extends SpringBoneCollider {\r\n /** Center position in world space */\r\n private _center: Vector3;\r\n /** Sphere radius */\r\n private _radius: number;\r\n /** Optional bone node to follow */\r\n private _bone: SceneNode | null;\r\n /** Local offset from bone (if bone is set) */\r\n private _localOffset: Vector3;\r\n\r\n /**\r\n * Create a sphere collider.\r\n *\r\n * @param center - Center position in world space (or local offset if bone is provided)\r\n * @param radius - Sphere radius\r\n * @param bone - Optional bone node to follow\r\n */\r\n constructor(center: Vector3, radius: number, bone: SceneNode | null = null) {\r\n super();\r\n this._center = center.clone();\r\n this._radius = Math.max(0, radius);\r\n this._bone = bone;\r\n this._localOffset = bone ? center.clone() : new Vector3();\r\n }\r\n\r\n /**\r\n * Get/set center position.\r\n */\r\n get center(): Vector3 {\r\n if (this._bone) {\r\n // Calculate world position from bone\r\n const worldPos = new Vector3();\r\n const matrix = this._bone.worldMatrix;\r\n const offset = this._localOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._center;\r\n }\r\n\r\n set center(value: Vector3) {\r\n if (this._bone) {\r\n this._localOffset.set(value);\r\n } else {\r\n this._center.set(value);\r\n }\r\n }\r\n\r\n /**\r\n * Get/set radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Get/set bone node.\r\n */\r\n get bone(): SceneNode | null {\r\n return this._bone;\r\n }\r\n\r\n set bone(value: SceneNode | null) {\r\n this._bone = value;\r\n }\r\n\r\n /**\r\n * Test collision with a point and resolve it.\r\n */\r\n collide(position: Vector3, radius: number): boolean {\r\n const center = this.center;\r\n const direction = Vector3.sub(position, center, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n // Collision detected, push the point out\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Capsule collider for spring bones.\r\n *\r\n * @remarks\r\n * A capsule is defined by two sphere centers and a radius.\r\n * Useful for limbs like arms and legs.\r\n *\r\n * @public\r\n */\r\nexport class CapsuleCollider extends SpringBoneCollider {\r\n /** Start point in world space */\r\n private _start: Vector3;\r\n /** End point in world space */\r\n private _end: Vector3;\r\n /** Capsule radius */\r\n private _radius: number;\r\n /** Optional bone node for start point */\r\n private _startBone: SceneNode | null;\r\n /** Optional bone node for end point */\r\n private _endBone: SceneNode | null;\r\n /** Local offset for start point */\r\n private _startOffset: Vector3;\r\n /** Local offset for end point */\r\n private _endOffset: Vector3;\r\n\r\n /**\r\n * Create a capsule collider.\r\n *\r\n * @param start - Start point in world space (or local offset if startBone is provided)\r\n * @param end - End point in world space (or local offset if endBone is provided)\r\n * @param radius - Capsule radius\r\n * @param startBone - Optional bone node for start point\r\n * @param endBone - Optional bone node for end point\r\n */\r\n constructor(\r\n start: Vector3,\r\n end: Vector3,\r\n radius: number,\r\n startBone: SceneNode | null = null,\r\n endBone: SceneNode | null = null\r\n ) {\r\n super();\r\n this._start = start.clone();\r\n this._end = end.clone();\r\n this._radius = Math.max(0, radius);\r\n this._startBone = startBone;\r\n this._endBone = endBone;\r\n this._startOffset = startBone ? start.clone() : new Vector3();\r\n this._endOffset = endBone ? end.clone() : new Vector3();\r\n }\r\n\r\n /**\r\n * Get start point in world space.\r\n */\r\n get start(): Vector3 {\r\n if (this._startBone) {\r\n const worldPos = new Vector3();\r\n const matrix = this._startBone.worldMatrix;\r\n const offset = this._startOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._start;\r\n }\r\n\r\n /**\r\n * Get end point in world space.\r\n */\r\n get end(): Vector3 {\r\n if (this._endBone) {\r\n const worldPos = new Vector3();\r\n const matrix = this._endBone.worldMatrix;\r\n const offset = this._endOffset;\r\n worldPos.x = matrix.m00 * offset.x + matrix.m01 * offset.y + matrix.m02 * offset.z + matrix.m03;\r\n worldPos.y = matrix.m10 * offset.x + matrix.m11 * offset.y + matrix.m12 * offset.z + matrix.m13;\r\n worldPos.z = matrix.m20 * offset.x + matrix.m21 * offset.y + matrix.m22 * offset.z + matrix.m23;\r\n return worldPos;\r\n }\r\n return this._end;\r\n }\r\n\r\n /**\r\n * Get/set radius.\r\n */\r\n get radius(): number {\r\n return this._radius;\r\n }\r\n\r\n set radius(value: number) {\r\n this._radius = Math.max(0, value);\r\n }\r\n\r\n /**\r\n * Test collision with a point and resolve it.\r\n */\r\n collide(position: Vector3, radius: number): boolean {\r\n const start = this.start;\r\n const end = this.end;\r\n\r\n // Calculate closest point on capsule line segment\r\n const line = Vector3.sub(end, start, new Vector3());\r\n const lineLength = line.magnitude;\r\n\r\n if (lineLength < 0.000001) {\r\n // Degenerate capsule, treat as sphere\r\n const direction = Vector3.sub(position, start, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n const lineDir = Vector3.scale(line, 1 / lineLength, new Vector3());\r\n const toPoint = Vector3.sub(position, start, new Vector3());\r\n const t = Math.max(0, Math.min(lineLength, Vector3.dot(toPoint, lineDir)));\r\n\r\n // Closest point on line segment\r\n const closestPoint = Vector3.add(start, Vector3.scale(lineDir, t, new Vector3()), new Vector3());\r\n\r\n // Check distance from closest point\r\n const direction = Vector3.sub(position, closestPoint, new Vector3());\r\n const distance = direction.magnitude;\r\n const minDistance = this._radius + radius;\r\n\r\n if (distance < minDistance && distance > 0.000001) {\r\n // Collision detected, push the point out\r\n direction.scaleBy(1 / distance);\r\n const penetration = minDistance - distance;\r\n position.addBy(Vector3.scale(direction, penetration, new Vector3()));\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["SpringBoneCollider","SphereCollider","center","radius","bone","_center","clone","_radius","Math","max","_bone","_localOffset","Vector3","worldPos","matrix","worldMatrix","offset","x","m00","m01","y","m02","z","m03","m10","m11","m12","m13","m20","m21","m22","m23","value","set","collide","position","direction","sub","distance","magnitude","minDistance","scaleBy","penetration","addBy","scale","CapsuleCollider","start","end","startBone","endBone","_start","_end","_startBone","_endBone","_startOffset","_endOffset","line","lineLength","lineDir","toPoint","t","min","dot","closestPoint","add"],"mappings":"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"}
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { Vector3 } from '@zephyr3d/base';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Base class for spring bone constraints.
|
|
5
|
-
*
|
|
6
|
-
* @remarks
|
|
7
|
-
* Constraints are applied after physics simulation to enforce
|
|
8
|
-
* additional rules between spring bones.
|
|
9
|
-
*
|
|
10
|
-
* @public
|
|
11
|
-
*/ class SpringBoneConstraint {
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Distance constraint between two spring bones.
|
|
15
|
-
*
|
|
16
|
-
* @remarks
|
|
17
|
-
* Maintains a distance range between two spring bones.
|
|
18
|
-
* Useful for preventing penetration and excessive stretching between
|
|
19
|
-
* adjacent chains (e.g., skirt panels).
|
|
20
|
-
*
|
|
21
|
-
* @public
|
|
22
|
-
*/ class DistanceConstraint extends SpringBoneConstraint {
|
|
23
|
-
/** First spring bone */ _bone1;
|
|
24
|
-
/** Second spring bone */ _bone2;
|
|
25
|
-
/** Minimum distance (prevents penetration) */ _minDistance;
|
|
26
|
-
/** Maximum distance (prevents excessive stretching) */ _maxDistance;
|
|
27
|
-
/** Constraint stiffness (0-1, how strongly to enforce) */ _stiffness;
|
|
28
|
-
/**
|
|
29
|
-
* Create a distance constraint.
|
|
30
|
-
*
|
|
31
|
-
* @param bone1 - First spring bone
|
|
32
|
-
* @param bone2 - Second spring bone
|
|
33
|
-
* @param minDistance - Minimum distance (default: 0.01)
|
|
34
|
-
* @param maxDistance - Maximum distance (default: 0.2)
|
|
35
|
-
* @param stiffness - Constraint stiffness (0-1, default: 0.5)
|
|
36
|
-
*/ constructor(bone1, bone2, minDistance = 0.01, maxDistance = 0.2, stiffness = 0.5){
|
|
37
|
-
super();
|
|
38
|
-
this._bone1 = bone1;
|
|
39
|
-
this._bone2 = bone2;
|
|
40
|
-
this._minDistance = Math.max(0, minDistance);
|
|
41
|
-
this._maxDistance = Math.max(this._minDistance, maxDistance);
|
|
42
|
-
this._stiffness = Math.max(0, Math.min(1, stiffness));
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Get/set minimum distance.
|
|
46
|
-
*/ get minDistance() {
|
|
47
|
-
return this._minDistance;
|
|
48
|
-
}
|
|
49
|
-
set minDistance(value) {
|
|
50
|
-
this._minDistance = Math.max(0, value);
|
|
51
|
-
this._maxDistance = Math.max(this._minDistance, this._maxDistance);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Get/set maximum distance.
|
|
55
|
-
*/ get maxDistance() {
|
|
56
|
-
return this._maxDistance;
|
|
57
|
-
}
|
|
58
|
-
set maxDistance(value) {
|
|
59
|
-
this._maxDistance = Math.max(this._minDistance, value);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Get/set stiffness.
|
|
63
|
-
*/ get stiffness() {
|
|
64
|
-
return this._stiffness;
|
|
65
|
-
}
|
|
66
|
-
set stiffness(value) {
|
|
67
|
-
this._stiffness = Math.max(0, Math.min(1, value));
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Apply the distance constraint.
|
|
71
|
-
*/ apply() {
|
|
72
|
-
const pos1 = this._bone1.currentPosition;
|
|
73
|
-
const pos2 = this._bone2.currentPosition;
|
|
74
|
-
// Calculate current distance
|
|
75
|
-
const direction = Vector3.sub(pos2, pos1, new Vector3());
|
|
76
|
-
const distance = direction.magnitude;
|
|
77
|
-
if (distance < 0.000001) {
|
|
78
|
-
return; // Bones are at same position
|
|
79
|
-
}
|
|
80
|
-
const directionNorm = Vector3.scale(direction, 1 / distance, new Vector3());
|
|
81
|
-
let correction = 0;
|
|
82
|
-
if (distance < this._minDistance) {
|
|
83
|
-
// Too close, push apart
|
|
84
|
-
correction = (this._minDistance - distance) * 0.5 * this._stiffness;
|
|
85
|
-
} else if (distance > this._maxDistance) {
|
|
86
|
-
// Too far, pull together
|
|
87
|
-
correction = (this._maxDistance - distance) * 0.5 * this._stiffness;
|
|
88
|
-
} else {
|
|
89
|
-
// Within range, no correction needed
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
// Apply correction to both bones (equal and opposite)
|
|
93
|
-
const offset = Vector3.scale(directionNorm, correction, new Vector3());
|
|
94
|
-
pos1.addBy(Vector3.scale(offset, -1, new Vector3()));
|
|
95
|
-
pos2.addBy(offset);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Circular constraint for skirt-like structures.
|
|
100
|
-
*
|
|
101
|
-
* @remarks
|
|
102
|
-
* Maintains distance constraints between adjacent bones in a circular arrangement.
|
|
103
|
-
* Automatically creates distance constraints between neighboring chains.
|
|
104
|
-
*
|
|
105
|
-
* @public
|
|
106
|
-
*/ class CircularConstraint extends SpringBoneConstraint {
|
|
107
|
-
/** Array of spring bone chains arranged in a circle */ _chains;
|
|
108
|
-
/** Distance constraints between adjacent chains */ _constraints;
|
|
109
|
-
/** Minimum distance between adjacent bones */ _minDistance;
|
|
110
|
-
/** Maximum distance between adjacent bones */ _maxDistance;
|
|
111
|
-
/** Constraint stiffness */ _stiffness;
|
|
112
|
-
/**
|
|
113
|
-
* Create a circular constraint.
|
|
114
|
-
*
|
|
115
|
-
* @param chains - Array of spring bone chains arranged in a circle
|
|
116
|
-
* @param minDistance - Minimum distance between adjacent bones (default: 0.05)
|
|
117
|
-
* @param maxDistance - Maximum distance between adjacent bones (default: 0.15)
|
|
118
|
-
* @param stiffness - Constraint stiffness (0-1, default: 0.5)
|
|
119
|
-
*/ constructor(chains, minDistance = 0.05, maxDistance = 0.15, stiffness = 0.5){
|
|
120
|
-
super();
|
|
121
|
-
this._chains = chains;
|
|
122
|
-
this._minDistance = minDistance;
|
|
123
|
-
this._maxDistance = maxDistance;
|
|
124
|
-
this._stiffness = stiffness;
|
|
125
|
-
this._constraints = [];
|
|
126
|
-
this._buildConstraints();
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Build distance constraints between adjacent chains.
|
|
130
|
-
*/ _buildConstraints() {
|
|
131
|
-
this._constraints = [];
|
|
132
|
-
if (this._chains.length < 2) {
|
|
133
|
-
return; // Need at least 2 chains
|
|
134
|
-
}
|
|
135
|
-
// For each level (depth in the chain)
|
|
136
|
-
const maxDepth = Math.min(...this._chains.map((chain)=>chain.length));
|
|
137
|
-
for(let depth = 0; depth < maxDepth; depth++){
|
|
138
|
-
// Connect adjacent chains
|
|
139
|
-
for(let i = 0; i < this._chains.length; i++){
|
|
140
|
-
const nextIndex = (i + 1) % this._chains.length; // Wrap around
|
|
141
|
-
const bone1 = this._chains[i][depth];
|
|
142
|
-
const bone2 = this._chains[nextIndex][depth];
|
|
143
|
-
if (bone1 && bone2) {
|
|
144
|
-
const constraint = new DistanceConstraint(bone1, bone2, this._minDistance, this._maxDistance, this._stiffness);
|
|
145
|
-
this._constraints.push(constraint);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Rebuild constraints (call after modifying chains).
|
|
152
|
-
*/ rebuild() {
|
|
153
|
-
this._buildConstraints();
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Apply all distance constraints.
|
|
157
|
-
*/ apply() {
|
|
158
|
-
for (const constraint of this._constraints){
|
|
159
|
-
constraint.apply();
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Get all distance constraints.
|
|
164
|
-
*/ get constraints() {
|
|
165
|
-
return this._constraints;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export { CircularConstraint, DistanceConstraint, SpringBoneConstraint };
|
|
170
|
-
//# sourceMappingURL=spring_bone_constraint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spring_bone_constraint.js","sources":["../../../src/animation/spring/spring_bone_constraint.ts"],"sourcesContent":["import { Vector3 } from '@zephyr3d/base';\r\nimport type { SpringBone } from './spring_bone';\r\n\r\n/**\r\n * Base class for spring bone constraints.\r\n *\r\n * @remarks\r\n * Constraints are applied after physics simulation to enforce\r\n * additional rules between spring bones.\r\n *\r\n * @public\r\n */\r\nexport abstract class SpringBoneConstraint {\r\n /**\r\n * Apply the constraint.\r\n *\r\n * @remarks\r\n * This method modifies the positions of spring bones to satisfy the constraint.\r\n */\r\n abstract apply(): void;\r\n}\r\n\r\n/**\r\n * Distance constraint between two spring bones.\r\n *\r\n * @remarks\r\n * Maintains a distance range between two spring bones.\r\n * Useful for preventing penetration and excessive stretching between\r\n * adjacent chains (e.g., skirt panels).\r\n *\r\n * @public\r\n */\r\nexport class DistanceConstraint extends SpringBoneConstraint {\r\n /** First spring bone */\r\n private _bone1: SpringBone;\r\n /** Second spring bone */\r\n private _bone2: SpringBone;\r\n /** Minimum distance (prevents penetration) */\r\n private _minDistance: number;\r\n /** Maximum distance (prevents excessive stretching) */\r\n private _maxDistance: number;\r\n /** Constraint stiffness (0-1, how strongly to enforce) */\r\n private _stiffness: number;\r\n\r\n /**\r\n * Create a distance constraint.\r\n *\r\n * @param bone1 - First spring bone\r\n * @param bone2 - Second spring bone\r\n * @param minDistance - Minimum distance (default: 0.01)\r\n * @param maxDistance - Maximum distance (default: 0.2)\r\n * @param stiffness - Constraint stiffness (0-1, default: 0.5)\r\n */\r\n constructor(\r\n bone1: SpringBone,\r\n bone2: SpringBone,\r\n minDistance = 0.01,\r\n maxDistance = 0.2,\r\n stiffness = 0.5\r\n ) {\r\n super();\r\n this._bone1 = bone1;\r\n this._bone2 = bone2;\r\n this._minDistance = Math.max(0, minDistance);\r\n this._maxDistance = Math.max(this._minDistance, maxDistance);\r\n this._stiffness = Math.max(0, Math.min(1, stiffness));\r\n }\r\n\r\n /**\r\n * Get/set minimum distance.\r\n */\r\n get minDistance(): number {\r\n return this._minDistance;\r\n }\r\n\r\n set minDistance(value: number) {\r\n this._minDistance = Math.max(0, value);\r\n this._maxDistance = Math.max(this._minDistance, this._maxDistance);\r\n }\r\n\r\n /**\r\n * Get/set maximum distance.\r\n */\r\n get maxDistance(): number {\r\n return this._maxDistance;\r\n }\r\n\r\n set maxDistance(value: number) {\r\n this._maxDistance = Math.max(this._minDistance, value);\r\n }\r\n\r\n /**\r\n * Get/set stiffness.\r\n */\r\n get stiffness(): number {\r\n return this._stiffness;\r\n }\r\n\r\n set stiffness(value: number) {\r\n this._stiffness = Math.max(0, Math.min(1, value));\r\n }\r\n\r\n /**\r\n * Apply the distance constraint.\r\n */\r\n apply(): void {\r\n const pos1 = this._bone1.currentPosition;\r\n const pos2 = this._bone2.currentPosition;\r\n\r\n // Calculate current distance\r\n const direction = Vector3.sub(pos2, pos1, new Vector3());\r\n const distance = direction.magnitude;\r\n\r\n if (distance < 0.000001) {\r\n return; // Bones are at same position\r\n }\r\n\r\n const directionNorm = Vector3.scale(direction, 1 / distance, new Vector3());\r\n\r\n let correction = 0;\r\n\r\n if (distance < this._minDistance) {\r\n // Too close, push apart\r\n correction = (this._minDistance - distance) * 0.5 * this._stiffness;\r\n } else if (distance > this._maxDistance) {\r\n // Too far, pull together\r\n correction = (this._maxDistance - distance) * 0.5 * this._stiffness;\r\n } else {\r\n // Within range, no correction needed\r\n return;\r\n }\r\n\r\n // Apply correction to both bones (equal and opposite)\r\n const offset = Vector3.scale(directionNorm, correction, new Vector3());\r\n pos1.addBy(Vector3.scale(offset, -1, new Vector3()));\r\n pos2.addBy(offset);\r\n }\r\n}\r\n\r\n/**\r\n * Circular constraint for skirt-like structures.\r\n *\r\n * @remarks\r\n * Maintains distance constraints between adjacent bones in a circular arrangement.\r\n * Automatically creates distance constraints between neighboring chains.\r\n *\r\n * @public\r\n */\r\nexport class CircularConstraint extends SpringBoneConstraint {\r\n /** Array of spring bone chains arranged in a circle */\r\n private _chains: SpringBone[][];\r\n /** Distance constraints between adjacent chains */\r\n private _constraints: DistanceConstraint[];\r\n /** Minimum distance between adjacent bones */\r\n private _minDistance: number;\r\n /** Maximum distance between adjacent bones */\r\n private _maxDistance: number;\r\n /** Constraint stiffness */\r\n private _stiffness: number;\r\n\r\n /**\r\n * Create a circular constraint.\r\n *\r\n * @param chains - Array of spring bone chains arranged in a circle\r\n * @param minDistance - Minimum distance between adjacent bones (default: 0.05)\r\n * @param maxDistance - Maximum distance between adjacent bones (default: 0.15)\r\n * @param stiffness - Constraint stiffness (0-1, default: 0.5)\r\n */\r\n constructor(\r\n chains: SpringBone[][],\r\n minDistance = 0.05,\r\n maxDistance = 0.15,\r\n stiffness = 0.5\r\n ) {\r\n super();\r\n this._chains = chains;\r\n this._minDistance = minDistance;\r\n this._maxDistance = maxDistance;\r\n this._stiffness = stiffness;\r\n this._constraints = [];\r\n\r\n this._buildConstraints();\r\n }\r\n\r\n /**\r\n * Build distance constraints between adjacent chains.\r\n */\r\n private _buildConstraints(): void {\r\n this._constraints = [];\r\n\r\n if (this._chains.length < 2) {\r\n return; // Need at least 2 chains\r\n }\r\n\r\n // For each level (depth in the chain)\r\n const maxDepth = Math.min(...this._chains.map(chain => chain.length));\r\n\r\n for (let depth = 0; depth < maxDepth; depth++) {\r\n // Connect adjacent chains\r\n for (let i = 0; i < this._chains.length; i++) {\r\n const nextIndex = (i + 1) % this._chains.length; // Wrap around\r\n\r\n const bone1 = this._chains[i][depth];\r\n const bone2 = this._chains[nextIndex][depth];\r\n\r\n if (bone1 && bone2) {\r\n const constraint = new DistanceConstraint(\r\n bone1,\r\n bone2,\r\n this._minDistance,\r\n this._maxDistance,\r\n this._stiffness\r\n );\r\n this._constraints.push(constraint);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Rebuild constraints (call after modifying chains).\r\n */\r\n rebuild(): void {\r\n this._buildConstraints();\r\n }\r\n\r\n /**\r\n * Apply all distance constraints.\r\n */\r\n apply(): void {\r\n for (const constraint of this._constraints) {\r\n constraint.apply();\r\n }\r\n }\r\n\r\n /**\r\n * Get all distance constraints.\r\n */\r\n get constraints(): readonly DistanceConstraint[] {\r\n return this._constraints;\r\n }\r\n}\r\n"],"names":["SpringBoneConstraint","DistanceConstraint","bone1","bone2","minDistance","maxDistance","stiffness","_bone1","_bone2","_minDistance","Math","max","_maxDistance","_stiffness","min","value","apply","pos1","currentPosition","pos2","direction","Vector3","sub","distance","magnitude","directionNorm","scale","correction","offset","addBy","CircularConstraint","chains","_chains","_constraints","_buildConstraints","length","maxDepth","map","chain","depth","i","nextIndex","constraint","push","rebuild","constraints"],"mappings":"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"}
|