@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 8.18 kB
JavaScript
import{math as i}from"../../../core/math/math.js";import{Mat4 as t}from"../../../core/math/mat4.js";import{Quat as n}from"../../../core/math/quat.js";import{Vec2 as s}from"../../../core/math/vec2.js";import{Component as a}from"../component.js";import{MOTION_LOCKED as r,MOTION_LIMITED as e,MOTION_FREE as o}from"./constants.js";const l=["angularDampingX","angularDampingY","angularDampingZ","angularEquilibriumX","angularEquilibriumY","angularEquilibriumZ","angularLimitsX","angularLimitsY","angularLimitsZ","angularMotionX","angularMotionY","angularMotionZ","angularSpringX","angularSpringY","angularSpringZ","angularStiffnessX","angularStiffnessY","angularStiffnessZ","breakForce","enableCollision","enabled","entityA","entityB","linearDampingX","linearDampingY","linearDampingZ","linearEquilibriumX","linearEquilibriumY","linearEquilibriumZ","linearLimitsX","linearLimitsY","linearLimitsZ","linearMotionX","linearMotionY","linearMotionZ","linearSpringX","linearSpringY","linearSpringZ","linearStiffnessX","linearStiffnessY","linearStiffnessZ"];class h extends a{constructor(i,t){super(i,t),this._constraint=null,this._entityA=null,this._entityB=null,this._breakForce=34e37,this._enableCollision=!0,this._linearMotionX=r,this._linearLimitsX=new s(0,0),this._linearSpringX=!1,this._linearStiffnessX=0,this._linearDampingX=1,this._linearEquilibriumX=0,this._linearMotionY=r,this._linearLimitsY=new s(0,0),this._linearSpringY=!1,this._linearStiffnessY=0,this._linearDampingY=1,this._linearEquilibriumY=0,this._linearMotionZ=r,this._linearLimitsZ=new s(0,0),this._linearSpringZ=!1,this._linearStiffnessZ=0,this._linearDampingZ=1,this._linearEquilibriumZ=0,this._angularMotionX=r,this._angularLimitsX=new s(0,0),this._angularSpringX=!1,this._angularStiffnessX=0,this._angularDampingX=1,this._angularEquilibriumX=0,this._angularMotionY=r,this._angularLimitsY=new s(0,0),this._angularSpringY=!1,this._angularStiffnessY=0,this._angularDampingY=1,this._angularEquilibriumY=0,this._angularMotionZ=r,this._angularLimitsZ=new s(0,0),this._angularSpringZ=!1,this._angularEquilibriumZ=0,this._angularDampingZ=1,this._angularStiffnessZ=0,this.on("set_enabled",this._onSetEnabled,this)}set entityA(i){this._destroyConstraint(),this._entityA=i,this._createConstraint()}get entityA(){return this._entityA}set entityB(i){this._destroyConstraint(),this._entityB=i,this._createConstraint()}get entityB(){return this._entityB}set breakForce(i){this._constraint&&this._breakForce!==i&&(this._constraint.setBreakingImpulseThreshold(i),this._breakForce=i)}get breakForce(){return this._breakForce}set enableCollision(i){this._destroyConstraint(),this._enableCollision=i,this._createConstraint()}get enableCollision(){return this._enableCollision}set angularLimitsX(i){this._angularLimitsX.equals(i)||(this._angularLimitsX.copy(i),this._updateAngularLimits())}get angularLimitsX(){return this._angularLimitsX}set angularMotionX(i){this._angularMotionX!==i&&(this._angularMotionX=i,this._updateAngularLimits())}get angularMotionX(){return this._angularMotionX}set angularLimitsY(i){this._angularLimitsY.equals(i)||(this._angularLimitsY.copy(i),this._updateAngularLimits())}get angularLimitsY(){return this._angularLimitsY}set angularMotionY(i){this._angularMotionY!==i&&(this._angularMotionY=i,this._updateAngularLimits())}get angularMotionY(){return this._angularMotionY}set angularLimitsZ(i){this._angularLimitsZ.equals(i)||(this._angularLimitsZ.copy(i),this._updateAngularLimits())}get angularLimitsZ(){return this._angularLimitsZ}set angularMotionZ(i){this._angularMotionZ!==i&&(this._angularMotionZ=i,this._updateAngularLimits())}get angularMotionZ(){return this._angularMotionZ}set linearLimitsX(i){this._linearLimitsX.equals(i)||(this._linearLimitsX.copy(i),this._updateLinearLimits())}get linearLimitsX(){return this._linearLimitsX}set linearMotionX(i){this._linearMotionX!==i&&(this._linearMotionX=i,this._updateLinearLimits())}get linearMotionX(){return this._linearMotionX}set linearLimitsY(i){this._linearLimitsY.equals(i)||(this._linearLimitsY.copy(i),this._updateLinearLimits())}get linearLimitsY(){return this._linearLimitsY}set linearMotionY(i){this._linearMotionY!==i&&(this._linearMotionY=i,this._updateLinearLimits())}get linearMotionY(){return this._linearMotionY}set linearLimitsZ(i){this._linearLimitsZ.equals(i)||(this._linearLimitsZ.copy(i),this._updateLinearLimits())}get linearLimitsZ(){return this._linearLimitsZ}set linearMotionZ(i){this._linearMotionZ!==i&&(this._linearMotionZ=i,this._updateLinearLimits())}get linearMotionZ(){return this._linearMotionZ}_convertTransform(i,t){const s=i.getTranslation(),a=new n;a.setFromMat4(i);const r=new Ammo.btVector3(s.x,s.y,s.z),e=new Ammo.btQuaternion(a.x,a.y,a.z,a.w);t.setOrigin(r),t.setRotation(e),Ammo.destroy(r),Ammo.destroy(e)}_updateAngularLimits(){const t=this._constraint;if(t){let n,s,a,r,l,h;this._angularMotionX===e?(n=this._angularLimitsX.x*i.DEG_TO_RAD,r=this._angularLimitsX.y*i.DEG_TO_RAD):this._angularMotionX===o?(n=1,r=0):n=r=0,this._angularMotionY===e?(s=this._angularLimitsY.x*i.DEG_TO_RAD,l=this._angularLimitsY.y*i.DEG_TO_RAD):this._angularMotionY===o?(s=1,l=0):s=l=0,this._angularMotionZ===e?(a=this._angularLimitsZ.x*i.DEG_TO_RAD,h=this._angularLimitsZ.y*i.DEG_TO_RAD):this._angularMotionZ===o?(a=1,h=0):a=h=0;const _=new Ammo.btVector3(n,s,a);t.setAngularLowerLimit(_),_.setValue(r,l,h),t.setAngularUpperLimit(_),Ammo.destroy(_)}}_updateLinearLimits(){const i=this._constraint;if(i){let t,n,s,a,r,l;this._linearMotionX===e?(t=this._linearLimitsX.x,a=this._linearLimitsX.y):this._linearMotionX===o?(t=1,a=0):t=a=0,this._linearMotionY===e?(n=this._linearLimitsY.x,r=this._linearLimitsY.y):this._linearMotionY===o?(n=1,r=0):n=r=0,this._linearMotionZ===e?(s=this._linearLimitsZ.x,l=this._linearLimitsZ.y):this._linearMotionZ===o?(s=1,l=0):s=l=0;const h=new Ammo.btVector3(t,n,s);i.setLinearLowerLimit(h),h.setValue(a,r,l),i.setLinearUpperLimit(h),Ammo.destroy(h)}}_createConstraint(){if(this._entityA&&this._entityA.rigidbody){this._destroyConstraint();const i=new t,n=this._entityA.rigidbody.body;n.activate();const s=this.entity.getWorldTransform(),a=this._entityA.getWorldTransform().clone().invert();i.mul2(a,s);const r=new Ammo.btTransform;if(this._convertTransform(i,r),this._entityB&&this._entityB.rigidbody){const t=this._entityB.rigidbody.body;t.activate();const a=this._entityB.getWorldTransform().clone().invert();i.mul2(a,s);const e=new Ammo.btTransform;this._convertTransform(i,e),this._constraint=new Ammo.btGeneric6DofSpringConstraint(n,t,r,e,!this._enableCollision),Ammo.destroy(e)}else this._constraint=new Ammo.btGeneric6DofSpringConstraint(n,r,!this._enableCollision);Ammo.destroy(r);const e=["X","Y","Z","X","Y","Z"];for(let i=0;i<6;i++){const t=i<3?"_linear":"_angular";this._constraint.enableSpring(i,this[`${t}Spring${e[i]}`]),this._constraint.setDamping(i,this[`${t}Damping${e[i]}`]),this._constraint.setEquilibriumPoint(i,this[`${t}Equilibrium${e[i]}`]),this._constraint.setStiffness(i,this[`${t}Stiffness${e[i]}`])}this._constraint.setBreakingImpulseThreshold(this._breakForce),this._updateLinearLimits(),this._updateAngularLimits();this.system.app.systems.rigidbody.dynamicsWorld.addConstraint(this._constraint,!this._enableCollision)}}_destroyConstraint(){if(this._constraint){this.system.app.systems.rigidbody.dynamicsWorld.removeConstraint(this._constraint),Ammo.destroy(this._constraint),this._constraint=null}}initFromData(i){for(const t of l)i.hasOwnProperty(t)&&(i[t]instanceof s?this[`_${t}`].copy(i[t]):this[`_${t}`]=i[t]);this._createConstraint()}onEnable(){this._createConstraint()}onDisable(){this._destroyConstraint()}_onSetEnabled(i,t,n){}_onBeforeRemove(){this.fire("remove")}}const _={Damping:"setDamping",Equilibrium:"setEquilibriumPoint",Spring:"enableSpring",Stiffness:"setStiffness"};["linear","angular"].forEach((i=>{["Damping","Equilibrium","Spring","Stiffness"].forEach((t=>{["X","Y","Z"].forEach((n=>{const s=i+t+n,a=`_${s}`;let r="linear"===i?0:3;"Y"===n&&(r+=1),"Z"===n&&(r+=2),Object.defineProperty(h.prototype,s,{get:function(){return this[a]},set:function(i){this[a]!==i&&(this[a]=i,this._constraint[_[t]](r,i))}})}))}))}));export{h as JointComponent};