@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 8.32 kB
JavaScript
import{Quat as t}from"../../../core/math/quat.js";import{Vec3 as i}from"../../../core/math/vec3.js";import{BODYGROUP_STATIC as s,BODYMASK_NOT_STATIC as e,BODYTYPE_STATIC as o,BODYTYPE_DYNAMIC as n,BODYTYPE_KINEMATIC as a,BODYGROUP_KINEMATIC as r,BODYMASK_ALL as l,BODYGROUP_DYNAMIC as h,BODYFLAG_KINEMATIC_OBJECT as y,BODYSTATE_DISABLE_DEACTIVATION as c,BODYSTATE_ACTIVE_TAG as _,BODYSTATE_DISABLE_SIMULATION as u}from"./constants.js";import{Component as d}from"../component.js";let m,g,p,b;const f=new t,V=new t,E=new i;class F extends d{constructor(t,n){super(t,n),this._angularDamping=0,this._angularFactor=new i(1,1,1),this._angularVelocity=new i,this._body=null,this._friction=.5,this._group=s,this._linearDamping=0,this._linearFactor=new i(1,1,1),this._linearVelocity=new i,this._mask=e,this._mass=1,this._restitution=0,this._rollingFriction=0,this._simulationEnabled=!1,this._type=o}static onLibraryLoaded(){"undefined"!=typeof Ammo&&(m=new Ammo.btTransform,g=new Ammo.btVector3,p=new Ammo.btVector3,b=new Ammo.btQuaternion)}static onAppDestroy(){Ammo.destroy(m),Ammo.destroy(g),Ammo.destroy(p),Ammo.destroy(b),m=null,g=null,p=null,b=null}set angularDamping(t){this._angularDamping!==t&&(this._angularDamping=t,this._body&&this._body.setDamping(this._linearDamping,t))}get angularDamping(){return this._angularDamping}set angularFactor(t){this._angularFactor.equals(t)||(this._angularFactor.copy(t),this._body&&this._type===n&&(g.setValue(t.x,t.y,t.z),this._body.setAngularFactor(g)))}get angularFactor(){return this._angularFactor}set angularVelocity(t){this._body&&this._type===n&&(this._body.activate(),g.setValue(t.x,t.y,t.z),this._body.setAngularVelocity(g),this._angularVelocity.copy(t))}get angularVelocity(){if(this._body&&this._type===n){const t=this._body.getAngularVelocity();this._angularVelocity.set(t.x(),t.y(),t.z())}return this._angularVelocity}set body(t){this._body!==t&&(this._body=t,t&&this._simulationEnabled&&t.activate())}get body(){return this._body}set friction(t){this._friction!==t&&(this._friction=t,this._body&&this._body.setFriction(t))}get friction(){return this._friction}set group(t){this._group!==t&&(this._group=t,this.enabled&&this.entity.enabled&&(this.disableSimulation(),this.enableSimulation()))}get group(){return this._group}set linearDamping(t){this._linearDamping!==t&&(this._linearDamping=t,this._body&&this._body.setDamping(t,this._angularDamping))}get linearDamping(){return this._linearDamping}set linearFactor(t){this._linearFactor.equals(t)||(this._linearFactor.copy(t),this._body&&this._type===n&&(g.setValue(t.x,t.y,t.z),this._body.setLinearFactor(g)))}get linearFactor(){return this._linearFactor}set linearVelocity(t){this._body&&this._type===n&&(this._body.activate(),g.setValue(t.x,t.y,t.z),this._body.setLinearVelocity(g),this._linearVelocity.copy(t))}get linearVelocity(){if(this._body&&this._type===n){const t=this._body.getLinearVelocity();this._linearVelocity.set(t.x(),t.y(),t.z())}return this._linearVelocity}set mask(t){this._mask!==t&&(this._mask=t,this.enabled&&this.entity.enabled&&(this.disableSimulation(),this.enableSimulation()))}get mask(){return this._mask}set mass(t){if(this._mass!==t&&(this._mass=t,this._body&&this._type===n)){const i=this.enabled&&this.entity.enabled;i&&this.disableSimulation(),this._body.getCollisionShape().calculateLocalInertia(t,g),this._body.setMassProps(t,g),this._body.updateInertiaTensor(),i&&this.enableSimulation()}}get mass(){return this._mass}set restitution(t){this._restitution!==t&&(this._restitution=t,this._body&&this._body.setRestitution(t))}get restitution(){return this._restitution}set rollingFriction(t){this._rollingFriction!==t&&(this._rollingFriction=t,this._body&&this._body.setRollingFriction(t))}get rollingFriction(){return this._rollingFriction}set type(t){if(this._type!==t){switch(this._type=t,this.disableSimulation(),t){case n:this._group=h,this._mask=l;break;case a:this._group=r,this._mask=l;break;default:this._group=s,this._mask=e}this.createBody()}}get type(){return this._type}createBody(){const t=this.entity;let i;if(t.collision&&(i=t.collision.shape,t.trigger&&(t.trigger.destroy(),delete t.trigger)),i){this._body&&(this.system.removeBody(this._body),this.system.destroyBody(this._body),this._body=null);const s=this._type===n?this._mass:0;this._getEntityTransform(m);const e=this.system.createBody(s,i,m);if(e.setRestitution(this._restitution),e.setFriction(this._friction),e.setRollingFriction(this._rollingFriction),e.setDamping(this._linearDamping,this._angularDamping),this._type===n){const t=this._linearFactor;g.setValue(t.x,t.y,t.z),e.setLinearFactor(g);const i=this._angularFactor;g.setValue(i.x,i.y,i.z),e.setAngularFactor(g)}else this._type===a&&(e.setCollisionFlags(e.getCollisionFlags()|y),e.setActivationState(c));e.entity=t,this.body=e,this.enabled&&t.enabled&&this.enableSimulation()}}isActive(){return!!this._body&&this._body.isActive()}activate(){this._body&&this._body.activate()}enableSimulation(){const t=this.entity;if(t.collision&&t.collision.enabled&&!this._simulationEnabled){const i=this._body;if(i){switch(this.system.addBody(i,this._group,this._mask),this._type){case n:this.system._dynamic.push(this),i.forceActivationState(_),this.syncEntityToBody();break;case a:this.system._kinematic.push(this),i.forceActivationState(c);break;case o:i.forceActivationState(_),this.syncEntityToBody()}"compound"===t.collision.type&&this.system._compounds.push(t.collision),i.activate(),this._simulationEnabled=!0}}}disableSimulation(){const t=this._body;if(t&&this._simulationEnabled){const i=this.system;let s=i._compounds.indexOf(this.entity.collision);s>-1&&i._compounds.splice(s,1),s=i._dynamic.indexOf(this),s>-1&&i._dynamic.splice(s,1),s=i._kinematic.indexOf(this),s>-1&&i._kinematic.splice(s,1),i.removeBody(t),t.forceActivationState(u),this._simulationEnabled=!1}}applyForce(t,s,e,o,n,a){const r=this._body;r&&(r.activate(),t instanceof i?g.setValue(t.x,t.y,t.z):g.setValue(t,s,e),s instanceof i?p.setValue(s.x,s.y,s.z):void 0!==o?p.setValue(o,n,a):p.setValue(0,0,0),r.applyForce(g,p))}applyTorque(t,s,e){const o=this._body;o&&(o.activate(),t instanceof i?g.setValue(t.x,t.y,t.z):g.setValue(t,s,e),o.applyTorque(g))}applyImpulse(t,s,e,o,n,a){const r=this._body;r&&(r.activate(),t instanceof i?g.setValue(t.x,t.y,t.z):g.setValue(t,s,e),s instanceof i?p.setValue(s.x,s.y,s.z):void 0!==o?p.setValue(o,n,a):p.setValue(0,0,0),r.applyImpulse(g,p))}applyTorqueImpulse(t,s,e){const o=this._body;o&&(o.activate(),t instanceof i?g.setValue(t.x,t.y,t.z):g.setValue(t,s,e),o.applyTorqueImpulse(g))}isStatic(){return this._type===o}isStaticOrKinematic(){return this._type===o||this._type===a}isKinematic(){return this._type===a}_getEntityTransform(t){const i=this.entity,s=i.collision;if(s){const t=s.getShapePosition(),i=s.getShapeRotation();g.setValue(t.x,t.y,t.z),b.setValue(i.x,i.y,i.z,i.w)}else{const t=i.getPosition(),s=i.getRotation();g.setValue(t.x,t.y,t.z),b.setValue(s.x,s.y,s.z,s.w)}t.setOrigin(g),t.setRotation(b)}syncEntityToBody(){const t=this._body;if(t){if(this._getEntityTransform(m),t.setWorldTransform(m),this._type===a){const i=t.getMotionState();i&&i.setWorldTransform(m)}t.activate()}}_updateDynamic(){const t=this._body;if(t.isActive()){const i=t.getMotionState();if(i){const t=this.entity;i.getWorldTransform(m);const s=m.getOrigin(),e=m.getRotation(),o=t.collision;if(o&&o._hasOffset){const i=o.data.linearOffset,n=o.data.angularOffset,a=V.copy(n).invert(),r=f.set(e.x(),e.y(),e.z(),e.w()).mul(a);r.transformVector(i,E),t.setPosition(s.x()-E.x,s.y()-E.y,s.z()-E.z),t.setRotation(r)}else t.setPosition(s.x(),s.y(),s.z()),t.setRotation(e.x(),e.y(),e.z(),e.w())}}}_updateKinematic(){const t=this._body.getMotionState();t&&(this._getEntityTransform(m),t.setWorldTransform(m))}teleport(s,e,o,n,a,r){s instanceof i?this.entity.setPosition(s):this.entity.setPosition(s,e,o),e instanceof t?this.entity.setRotation(e):e instanceof i?this.entity.setEulerAngles(e):void 0!==n&&this.entity.setEulerAngles(n,a,r),this.syncEntityToBody()}onEnable(){this._body||this.createBody(),this.enableSimulation()}onDisable(){this.disableSimulation()}}F.EVENT_CONTACT="contact",F.EVENT_COLLISIONSTART="collisionstart",F.EVENT_COLLISIONEND="collisionend",F.EVENT_TRIGGERENTER="triggerenter",F.EVENT_TRIGGERLEAVE="triggerleave";export{F as RigidBodyComponent};