UNPKG

@downpourdigital/physics

Version:

Animation physics!

2 lines (1 loc) 4.67 kB
import{vec2 as t,vec3 as s,vec4 as e,quat as i}from"gl-matrix";import{S as a,_ as r,d as h}from"./96927387.js";const c=new Float32Array(4),n=new Float32Array(4);function o(t,s,e,i,a,r){s.sub(c,e[0],i),s.scale(c,c,-a),s.scale(n,e[1],r),s.sub(t,c,n)}class l extends a{constructor(t={}){var{value:s,velocity:e,vector:i,mass:a=1,restDelta:h=5e-4}=t;super(r(t,["value","velocity","vector","mass","restDelta"])),this.v=i,this.mass=a,this.restDelta=h,this.state=[this.v.create(),this.v.create()],this.initial=this.v.create(),s&&(this.v.copy(this.state[0],s),this.v.copy(this.initial,s)),e&&this.v.copy(this.state[1],e)}computeForce(t,s){}checkResting(){return this.v.len(this.state[1])<this.restDelta}get(t){return this.v.copy(t,this.state[0]),t}read(){return this.state[0]}getVelocity(t){this.v.copy(t,this.state[1])}readVelocity(){return this.state[1]}setVelocity(t){this.v.copy(this.state[1],t)}reset(){this.resetTo(this.initial)}resetTo(t){this.v.copy(this.state[0],t),this.v.zero(this.state[1])}stop(){h.remove(this)}}const v=new Float32Array(4);class g extends l{integrate(t){const s=t/1e3;this.computeForce(v,this.state),this.v.scale(v,v,1/this.mass),this.v.scaleAndAdd(this.state[1],this.state[1],v,s),this.v.scaleAndAdd(this.state[0],this.state[0],this.state[1],s),this.isResting=this.checkResting(),this.isResting&&this.v.zero(this.state[1])}}class d extends g{constructor(t={}){var{stiffness:s=250,damping:e=15}=t,i=r(t,["stiffness","damping"]);super(i),this.stiffness=s,this.damping=e,this.target=this.v.create(),i.value&&this.v.copy(this.target,i.value)}step(t){super.step(t),this.isResting&&this.v.copy(this.state[0],this.target)}computeForce(t,s){o(t,this.v,s,this.target,this.stiffness,this.damping)}checkResting(){return this.v.len(this.state[1])<this.restDelta&&this.v.dist(this.state[0],this.target)<this.restDelta}set(t){this.v.equals(this.target,t)||(this.v.copy(this.target,t),this.isResting=!1)}resetTo(t){super.resetTo(t),this.v.copy(this.target,t)}}class p extends d{constructor(s){super(Object.assign(Object.assign({},s),{vector:t}))}}class u extends d{constructor(t){super(Object.assign(Object.assign({},t),{vector:s}))}}class y extends d{constructor(t){super(Object.assign(Object.assign({},t),{vector:e})),i.identity(this.state[0])}step(t){i.dot(this.state[0],this.target)<0&&i.set(this.target,-this.target[0],-this.target[1],-this.target[2],-this.target[3]),super.step(t),i.normalize(this.state[0],this.state[0])}}const A=new Float32Array(4),m=new Float32Array(4),F=new Float32Array(4),f=new Float32Array(4),w=[new Float32Array(4),new Float32Array(4)],b=[new Float32Array(4),new Float32Array(4)],R=[new Float32Array(4),new Float32Array(4)],j=[new Float32Array(4),new Float32Array(4)],x=[new Float32Array(4),new Float32Array(4)];class O extends l{integrate(t){const s=t/1e3;this.evaluate(w,0,[f,f]),this.evaluate(b,.5*s,w),this.evaluate(R,.5*s,b),this.evaluate(j,s,R),this.v.add(m,b[0],R[0]),this.v.scaleAndAdd(m,w[0],m,2),this.v.add(m,m,j[0]),this.v.scale(m,m,1/6),this.v.add(F,b[1],R[1]),this.v.scaleAndAdd(F,w[1],F,2),this.v.add(F,F,j[1]),this.v.scale(F,F,1/6),this.v.scaleAndAdd(this.state[1],this.state[1],F,s),this.v.scaleAndAdd(this.state[0],this.state[0],m,s),this.isResting=this.checkResting(),this.isResting&&this.v.zero(this.state[1])}evaluate(t,s,e){this.v.scaleAndAdd(x[0],this.state[0],e[0],s),this.v.scaleAndAdd(x[1],this.state[1],e[1],s),this.computeForce(A,x),this.v.copy(t[0],x[1]),this.v.scale(t[1],A,1/this.mass)}}class D extends O{constructor(t={}){var{stiffness:s=250,damping:e=15}=t,i=r(t,["stiffness","damping"]);super(i),this.stiffness=s,this.damping=e,this.target=this.v.create(),i.value&&this.v.copy(this.target,i.value)}step(t){super.step(t),this.isResting&&this.v.copy(this.state[0],this.target)}computeForce(t,s){o(t,this.v,s,this.target,this.stiffness,this.damping)}checkResting(){return this.v.len(this.state[1])<this.restDelta&&this.v.dist(this.state[0],this.target)<this.restDelta}set(t){this.v.equals(this.target,t)||(this.v.copy(this.target,t),this.isResting=!1)}resetTo(t){super.resetTo(t),this.v.copy(this.target,t)}}class T extends D{constructor(s){super(Object.assign(Object.assign({},s),{vector:t}))}}class k extends D{constructor(t){super(Object.assign(Object.assign({},t),{vector:s}))}}class z extends D{constructor(t){super(Object.assign(Object.assign({},t),{vector:e})),i.identity(this.state[0])}step(t){i.dot(this.state[0],this.target)<0&&i.set(this.target,-this.target[0],-this.target[1],-this.target[2],-this.target[3]),super.step(t),i.normalize(this.state[0],this.state[0])}}export{p as EulerSpring2D,u as EulerSpring3D,y as EulerSpringQuat,T as RK4Spring2D,k as RK4Spring3D,z as RK4SpringQuat};