UNPKG

phy-engine

Version:

JavaScript 3D Physics for three.js

1 lines 1.72 MB
const A=new Map,I={Ar:null,ArPos:{},world:null,bodyRef:null,byName:null,delta:0,ms:0,timestep:1/60,tmpStep:0,substep:1,numBreak:0,gravity:null,key:[],reflow:{ray:[],stat:{fps:0,delta:0,ms:0},point:{},velocity:{}}},g={clear:()=>{A.clear()},byName:I=>A.has(I)?A.get(I):null,add:g=>{if("ray"!==g.type&&"contact"!==g.type)switch(g.type){case"joint":I.world.addConstraint(g,!g.collision);break;case"solid":I.world.addCollisionObject(g,g.group,g.mask);break;case"terrain":I.world.addCollisionObject(g.body,g.group,g.mask);break;case"body":I.world.addRigidBody(g,g.group,g.mask)}A.set(g.name,g)},remove:g=>{if("ray"!==g.type&&"contact"!==g.type)switch(g.type){case"joint":I.world.removeConstraint(g),Ammo.destroy(g.formA),Ammo.destroy(g.formB),Ammo.destroy(g);break;case"solid":I.world.removeCollisionObject(g),Ammo.destroy(g);break;case"body":I.world.removeRigidBody(g),Ammo.destroy(g);break;case"vehicle":case"terrain":g.release()}A.delete(g.name)},getVolume:(A,I,C)=>{let B=1;switch(A){case"sphere":B=4*Math.PI*I[0]*I[0]*I[0]/3;break;case"cone":B=Math.PI*I[0]*(.5*I[1])*2;break;case"box":B=.5*I[0]*8*(.5*I[1])*(.5*I[2]);break;case"cylinder":B=Math.PI*I[0]*I[0]*(.5*I[1])*2;break;case"capsule":B=4*Math.PI*I[0]*I[0]*I[0]/3+Math.PI*I[0]*I[0]*(.5*I[1])*2;break;case"convex":case"mesh":B=g.getConvexVolume(C)}return B},getConvexVolume:A=>{let I,g=A.length/3,C=[A[0],A[1],A[2]],B=[A[0],A[1],A[2]];for(;g--;)I=3*g,A[I]<C[0]?C[0]=A[I]:A[I]>B[0]&&(B[0]=A[I]),A[I+1]<C[1]?C[1]=A[I+1]:A[I+1]>B[1]&&(B[1]=A[I+1]),A[I+2]<C[2]?C[2]=A[I+2]:A[I+2]>B[2]&&(B[2]=A[I+2]);return(B[0]-C[0])*(B[1]-C[1])*(B[2]-C[2])},malloc:(A,I)=>{var g=A.length*A.BYTES_PER_ELEMENT;return void 0===I&&(I=Ammo._malloc(g)),new Uint8Array(Ammo.HEAPU8.buffer,I,g).set(new Uint8Array(A.buffer)),I},free:A=>{A&&Ammo._free(A)},stats:()=>{},extends:()=>{Ammo.btVector3.prototype.set=function(A,I,g){return this.setValue(A,I,g),this},Ammo.btVector3.prototype.toArray=function(A,I){let g=void 0!==A;if(g||(A=[]),A[I=I||0]=this.x(),A[I+1]=this.y(),A[I+2]=this.z(),!g)return A},Ammo.btVector3.prototype.fromArray=function(A,I){return I=I||0,this.setValue(A[I],A[I+1],A[I+2]),this},Ammo.btVector3.prototype.copy=function(A){return this.setValue(A.x(),A.y(),A.z()),this},Ammo.btVector3.prototype.sub=function(A){return this.setValue(this.x()-A.x(),this.y()-A.y(),this.z()-A.z()),this},Ammo.btVector3.prototype.mul=function(){return this.x()*this.y()*this.z()},Ammo.btVector3.prototype.multiplyArray=function(A){return this.setValue(this.x()*A[0],this.y()*A[1],this.z()*A[2]),this},Ammo.btVector3.prototype.multiplyScalar=function(A){return this.setValue(this.x()*A,this.y()*A,this.z()*A),this},Ammo.btVector3.prototype.divideScalar=function(A){return this.multiplyScalar(1/A)},Ammo.btVector3.prototype.applyQuaternion=function(A){const I=this.x(),g=this.y(),C=this.z(),B=A.x(),Q=A.y(),i=A.z(),E=A.w(),o=E*I+Q*C-i*g,t=E*g+i*I-B*C,e=E*C+B*g-Q*I,D=-B*I-Q*g-i*C;return this.setValue(o*E+D*-B+t*-i-e*-Q,t*E+D*-Q+e*-B-o*-i,e*E+D*-i+o*-Q-t*-B),this},Ammo.btVector3.prototype.applyMatrix3=function(A){const I=this.x(),g=this.y(),C=this.z(),B=[];return A.getRow(0).toArray(B,0),A.getRow(1).toArray(B,3),A.getRow(2).toArray(B,6),this.setValue(B[0]*I+B[3]*g+B[6]*C,B[1]*I+B[4]*g+B[7]*C,B[2]*I+B[5]*g+B[8]*C),this},Ammo.btVector3.prototype.free=function(){},Ammo.btQuaternion.prototype.set=function(A,I,g,C){return this.setValue(A,I,g,C),this},Ammo.btQuaternion.prototype.toArray=function(A,I){let g=void 0!==A;if(g||(A=[]),A[I=I||0]=this.x(),A[I+1]=this.y(),A[I+2]=this.z(),A[I+3]=this.w(),!g)return A},Ammo.btQuaternion.prototype.fromArray=function(A,I){return I=I||0,this.setValue(A[I],A[I+1],A[I+2],A[I+3]),this},Ammo.btQuaternion.prototype.multiply=function(A){return this.multiplyQuaternions(this,A)},Ammo.btQuaternion.prototype.premultiply=function(A){return this.multiplyQuaternions(A,this)},Ammo.btQuaternion.prototype.multiplyQuaternions=function(A,I){const g=A.x(),C=A.y(),B=A.z(),Q=A.w(),i=I.x(),E=I.y(),o=I.z(),t=I.w();return this.setValue(g*t+Q*i+C*o-B*E,C*t+Q*E+B*i-g*o,B*t+Q*o+g*E-C*i,Q*t-g*i-C*E-B*o),this},Ammo.btQuaternion.prototype.fromAxisAngle=function(A,I){var g=.5*I,C=Math.sin(g);return this.setValue(A[0]*C,A[1]*C,A[2]*C,Math.cos(g)),this},Ammo.btQuaternion.prototype.fromAxis=function(A){let I=A.toArray();if(I[2]>.99999)this.setValue(0,0,0,1);else if(I[2]<-.99999)this.setValue(1,0,0,0);else{let A=[I[1],I[0],0],g=Math.acos(I[2]);this.fromAxisAngle(A,g)}return this},Ammo.btQuaternion.prototype.free=function(){},Ammo.btTransform.prototype.set=function(A,I){return this.setOrigin(A),this.setRotation(I),this},Ammo.btTransform.prototype.identity=function(){return this.setIdentity(),this},Ammo.btTransform.prototype.fromArray=function(A,I,g,C){let B=this.getOrigin();B.fromArray(A||[0,0,0],g||0),this.setOrigin(B);let Q=this.getRotation();return Q.fromArray(I||[0,0,0,1],C||0),this.setRotation(Q),this},Ammo.btTransform.prototype.toArray=function(A,I){I=I||0,this.getOrigin().toArray(A,I),this.getRotation().toArray(A,I+3)},Ammo.btTransform.prototype.getPos=function(){return this.getOrigin().toArray()},Ammo.btTransform.prototype.getQuat=function(){return this.getRotation().toArray()},Ammo.btTransform.prototype.copy=function(A){return this.setOrigin(A.getOrigin()),this.setRotation(A.getRotation()),this},Ammo.btTransform.prototype.rotationFromAxis=function(A){let I=this.getRotation();return I.fromAxis(A),this.setRotation(I),this},Ammo.btTransform.prototype.free=function(){}}},C=4e3,B=1e3,Q=4e3,i=100,E=100,o=50,t={bodyFull:14,body:8,joint:16,contact:1,ray:11,character:16,vehicle:72,solver:128};class e{constructor(){this.id=0,this.list=[],this.type="item",this.Utils=null}reset(){let A=this.list.length;for(;A--;)this.dispose(this.list[A]);this.list=[],this.id=0}byName(A){return this.Utils.byName(A)}setName(A={}){let I=void 0!==A.name?A.name:this.type+this.id++;return A.id=this.remove(I,!0),A.name=I,I}addToWorld(A,I=-1){this.Utils.add(A),-1!==I?this.list[I]=A:this.list.push(A)}remove(A,I){let g=this.byName(A);return g?this.clear(g,I):-1}clear(A,I){let g=this.list.indexOf(A);return-1===g||I?this.list[g]=null:this.list.splice(g,1),this.dispose(A),g}dispose(A){null!==A&&this.Utils.remove(A)}add(A={}){}set(A={}){}step(A,I){}}const D=Math.PI,n=D/180,s=180/D,r=Number.EPSILON,_=.5*D,p={luminousPowers:{"110000 lm (1000W)":11e4,"3500 lm (300W)":3500,"1700 lm (100W)":1700,"800 lm (60W)":800,"400 lm (40W)":400,"180 lm (25W)":180,"20 lm (4W)":20,Off:0},luminousIrradiances:{"0.0001 lx (Moonless Night)":1e-4,"0.002 lx (Night Airglow)":.002,"0.5 lx (Full Moon)":.5,"3.4 lx (City Twilight)":3.4,"50 lx (Living Room)":50,"100 lx (Very Overcast)":100,"350 lx (Office Room)":350,"400 lx (Sunrise/Sunset)":400,"1000 lx (Overcast)":1e3,"18000 lx (Daylight)":18e3,"50000 lx (Direct Sun)":5e4},exposure:A=>Math.pow(A,5),candelaToLumens:A=>4*A*Math.PI,lumensToCandela:A=>A/(4*Math.PI),todeg:s,torad:n,toFixed:(A,I=3)=>1*A.toFixed(I),toRound:(A,I=3)=>Math.trunc(A),clamp:(A,I=0,g=1)=>A=(A=A<I?I:A)>g?g:A,clampA:(A,I,g)=>Math.max(I,Math.min(g,A)),smoothstep:(A,I,g)=>A*(g=-2*(g=p.clamp(g))*g*g+3*g*g)+I*(1-g),remap:(A,I,g,C,B)=>C+(A-I)*(B-C)/(g-I),lerp:(A,I,g)=>(1-g)*A+g*I,damp:(A,I,g,C)=>p.lerp(A,I,1-Math.exp(-g*C)),nearAngle:(A,I,g=!1)=>I+Math.atan2(Math.sin(A-I),Math.cos(A-I))*(g?s:1),unwrapDeg:A=>A-360*Math.floor((A+180)/360),unwrapRad:A=>Math.atan2(Math.sin(A),Math.cos(A)),nearEquals:(A,I,g=1e-4)=>Math.abs(A-I)<=g,autoSize:(A=[1,1,1],I="box")=>{1===A.length&&(A[1]=A[0]);let g=A[0],C=A[1];return"sphere"===I&&(A=[g,g,g]),"cylinder"!==I&&"wheel"!==I&&"capsule"!==I||(A=[g,C,g]),"cone"!==I&&"pyramid"!==I||(A=[g,C,g]),2===A.length&&(A[2]=A[0]),A},shuffle:A=>A.map((A=>({value:A,sort:Math.random()}))).sort(((A,I)=>A.sort-I.sort)).map((({value:A})=>A)),randomSign:()=>Math.random()<.5?-1:1,randSpread:A=>A*(.5-Math.random()),rand:(A=0,I=1)=>A+Math.random()*(I-A),randInt:(A,I)=>A+Math.floor(Math.random()*(I-A+1)),randIntUnic:(A,I,g)=>{for(var C=[];C.length<g;){var B=p.randInt(A,I);-1===C.indexOf(B)&&C.push(B)}return C},fromTransform:(A,I,g,C=[0,0,0,1],B=!1)=>{let Q=p.composeMatrixArray(A,I),i=p.composeMatrixArray(g,C);return B&&(Q=p.invertMatrixArray(Q)),Q=p.multiplyMatrixArray(Q,i),[Q[12],Q[13],Q[14]]},fromTransformToQ:(A,I,g=!1)=>{let C=p.composeMatrixArray(A,I),B=p.decomposeFullMatrixArray(C).q;return g&&(B=p.quatInvert(B)),B},lerpTransform:(A,I,g)=>{let C=A[0],B=A[1],Q=I[0],i=I[1];return Q=p.lerpArray(C,Q,g),i=p.slerpQuatArray(B,i,g),[Q,i]},composeMatrixArray:(A,I,g=[1,1,1])=>{const C=I[0],B=I[1],Q=I[2],i=I[3],E=C+C,o=B+B,t=Q+Q,e=C*E,D=C*o,n=C*t,s=B*o,r=B*t,_=Q*t,p=i*E,S=i*o,c=i*t,y=g[0],K=g[1],a=g[2];return[(1-(s+_))*y,(D+c)*y,(n-S)*y,0,(D-c)*K,(1-(e+_))*K,(r+p)*K,0,(n+S)*a,(r-p)*a,(1-(e+s))*a,0,A[0],A[1],A[2],1]},multiplyMatrixArray:(A,I)=>{const g=A,C=I,B=[],Q=g[0],i=g[4],E=g[8],o=g[12],t=g[1],e=g[5],D=g[9],n=g[13],s=g[2],r=g[6],_=g[10],p=g[14],S=g[3],c=g[7],y=g[11],K=g[15],a=C[0],w=C[4],h=C[8],M=C[12],k=C[1],U=C[5],l=C[9],J=C[13],G=C[2],R=C[6],F=C[10],N=C[14],b=C[3],m=C[7],q=C[11],H=C[15];return B[0]=Q*a+i*k+E*G+o*b,B[4]=Q*w+i*U+E*R+o*m,B[8]=Q*h+i*l+E*F+o*q,B[12]=Q*M+i*J+E*N+o*H,B[1]=t*a+e*k+D*G+n*b,B[5]=t*w+e*U+D*R+n*m,B[9]=t*h+e*l+D*F+n*q,B[13]=t*M+e*J+D*N+n*H,B[2]=s*a+r*k+_*G+p*b,B[6]=s*w+r*U+_*R+p*m,B[10]=s*h+r*l+_*F+p*q,B[14]=s*M+r*J+_*N+p*H,B[3]=S*a+c*k+y*G+K*b,B[7]=S*w+c*U+y*R+K*m,B[11]=S*h+c*l+y*F+K*q,B[15]=S*M+c*J+y*N+K*H,B},invertMatrixArray:A=>{const I=A,g=I[0],C=I[1],B=I[2],Q=I[3],i=I[4],E=I[5],o=I[6],t=I[7],e=I[8],D=I[9],n=I[10],s=I[11],r=I[12],_=I[13],p=I[14],S=I[15],c=D*p*t-_*n*t+_*o*s-E*p*s-D*o*S+E*n*S,y=r*n*t-e*p*t-r*o*s+i*p*s+e*o*S-i*n*S,K=e*_*t-r*D*t+r*E*s-i*_*s-e*E*S+i*D*S,a=r*D*o-e*_*o-r*E*n+i*_*n+e*E*p-i*D*p,w=g*c+C*y+B*K+Q*a;if(0===w)return[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];const h=1/w;return I[0]=c*h,I[1]=(_*n*Q-D*p*Q-_*B*s+C*p*s+D*B*S-C*n*S)*h,I[2]=(E*p*Q-_*o*Q+_*B*t-C*p*t-E*B*S+C*o*S)*h,I[3]=(D*o*Q-E*n*Q-D*B*t+C*n*t+E*B*s-C*o*s)*h,I[4]=y*h,I[5]=(e*p*Q-r*n*Q+r*B*s-g*p*s-e*B*S+g*n*S)*h,I[6]=(r*o*Q-i*p*Q-r*B*t+g*p*t+i*B*S-g*o*S)*h,I[7]=(i*n*Q-e*o*Q+e*B*t-g*n*t-i*B*s+g*o*s)*h,I[8]=K*h,I[9]=(r*D*Q-e*_*Q-r*C*s+g*_*s+e*C*S-g*D*S)*h,I[10]=(i*_*Q-r*E*Q+r*C*t-g*_*t-i*C*S+g*E*S)*h,I[11]=(e*E*Q-i*D*Q-e*C*t+g*D*t+i*C*s-g*E*s)*h,I[12]=a*h,I[13]=(e*_*B-r*D*B+r*C*n-g*_*n-e*C*p+g*D*p)*h,I[14]=(r*E*B-i*_*B-r*C*o+g*_*o+i*C*p-g*E*p)*h,I[15]=(i*D*B-e*E*B+e*C*o-g*D*o-i*C*n+g*E*n)*h,I},matrixArrayDeterminant:A=>{const I=A,g=I[0],C=I[4],B=I[8],Q=I[12],i=I[1],E=I[5],o=I[9],t=I[13],e=I[2],D=I[6],n=I[10],s=I[14];return I[3]*(+Q*o*D-B*t*D-Q*E*n+C*t*n+B*E*s-C*o*s)+I[7]*(+g*o*s-g*t*n+Q*i*n-B*i*s+B*t*e-Q*o*e)+I[11]*(+g*t*D-g*E*s-Q*i*D+C*i*s+Q*E*e-C*t*e)+I[15]*(-B*E*e-g*o*D+g*E*n+B*i*D-C*i*n+C*o*e)},decomposeMatrixArray:A=>[A[12],A[13],A[14]],decomposeFullMatrixArray:A=>{const I=A;let g=p.lengthArray([I[0],I[1],I[2]]);const C=p.lengthArray([I[4],I[5],I[6]]),B=p.lengthArray([I[8],I[9],I[10]]);p.matrixArrayDeterminant(A)<0&&(g=-g);let Q=[...A];const i=1/g,E=1/C,o=1/B;Q[0]*=i,Q[1]*=i,Q[2]*=i,Q[4]*=E,Q[5]*=E,Q[6]*=E,Q[8]*=o,Q[9]*=o,Q[10]*=o;let t=p.quatFromRotationMatrix(Q);return{p:[A[12],A[13],A[14]],q:t,s:[g,C,B]}},applyTransformArray:(A,I,g,C=[1,1,1])=>{const B=p.composeMatrixArray(I,g,C),Q=A[0],i=A[1],E=A[2],o=1/(B[3]*Q+B[7]*i+B[11]*E+B[15]);return[(B[0]*Q+B[4]*i+B[8]*E+B[12])*o,(B[1]*Q+B[5]*i+B[9]*E+B[13])*o,(B[2]*Q+B[6]*i+B[10]*E+B[14])*o]},slerpQuatArray:(A,I,g)=>{if(0===g)return A;if(1===g)return I;let C=[...A];const B=A[0],Q=A[1],i=A[2],E=A[3],o=I[0],t=I[1],e=I[2],D=I[3];let n=E*D+B*o+Q*t+i*e;if(n<0?(C=[-o,-t,-e,-D],n=-n):C=[...I],n>=1)return A;const s=1-n*n;if(s<=r){const A=1-g;return C[3]=A*E+g*C[3],C[0]=A*B+g*C[0],C[1]=A*Q+g*C[1],C[2]=A*i+g*C[2],p.quatNomalize(C)}const _=Math.sqrt(s),S=Math.atan2(_,n),c=Math.sin((1-g)*S)/_,y=Math.sin(g*S)/_;return C[3]=E*c+C[3]*y,C[0]=B*c+C[0]*y,C[1]=Q*c+C[1]*y,C[2]=i*c+C[2]*y,C},toLocalQuatArray:(A=[0,0,0],I)=>{let g=p.quatFromEuler(A),C=p.quatInvert(I.quaternion.toArray());return p.quatMultiply(C,g)},quatFromRotationMatrix:A=>{let I=[0,0,0,1];const g=A,C=g[0],B=g[4],Q=g[8],i=g[1],E=g[5],o=g[9],t=g[2],e=g[6],D=g[10],n=C+E+D;if(n>0){const A=.5/Math.sqrt(n+1);I[3]=.25/A,I[0]=(e-o)*A,I[1]=(Q-t)*A,I[2]=(i-B)*A}else if(C>E&&C>D){const A=2*Math.sqrt(1+C-E-D);I[3]=(e-o)/A,I[0]=.25*A,I[1]=(B+i)/A,I[2]=(Q+t)/A}else if(E>D){const A=2*Math.sqrt(1+E-C-D);I[3]=(Q-t)/A,I[0]=(B+i)/A,I[1]=.25*A,I[2]=(o+e)/A}else{const A=2*Math.sqrt(1+D-C-E);I[3]=(i-B)/A,I[0]=(Q+t)/A,I[1]=(o+e)/A,I[2]=.25*A}return I},quatFromEuler:(A=[0,0,0],I=!0)=>{const g=Math.cos,C=Math.sin,B=I?n:1,Q=A[0]*B*.5,i=A[1]*B*.5,E=A[2]*B*.5,o=g(Q),t=g(i),e=g(E),D=C(Q),s=C(i),r=C(E);return[D*t*e+o*s*r,o*s*e-D*t*r,o*t*r+D*s*e,o*t*e-D*s*r]},quatFromAxis:(A=[0,0,0],I,g=!0)=>{const C=.5*I*(g?n:1),B=Math.sin(C);return[A[0]*B,A[1]*B,A[2]*B,Math.cos(C)]},quatNomalize:A=>{let I=p.lengthArray(A);return 0===I?[0,0,0,1]:(I=1/I,p.scaleArray(A,I,4))},quatInvert:A=>[-A[0],-A[1],-A[2],A[3]],quatMultiply:(A,I)=>{const g=A[0],C=A[1],B=A[2],Q=A[3],i=I[0],E=I[1],o=I[2],t=I[3];return[g*t+Q*i+C*o-B*E,C*t+Q*E+B*i-g*o,B*t+Q*o+g*E-C*i,Q*t-g*i-C*E-B*o]},quatToAxis:A=>{let I=2*Math.acos(A[3]);const g=Math.sqrt(1-A[3]*A[3]);return g<1e-4?[1,0,0]:[A[0]/g,A[1]/g,A[2]/g,I]},eulerFromMatrix:A=>{const I=A[0],g=A[4],C=A[8];A[1];const B=A[5],Q=A[9];A[2];const i=A[6],E=A[10];let o=[0,0,0];return o[1]=Math.asin(p.clamp(C,-1,1)),Math.abs(C)<.9999999?(o[0]=Math.atan2(-Q,E),o[2]=Math.atan2(-g,I)):(o[0]=Math.atan2(i,B),o[2]=0),o},angleTo:(A,I)=>2*Math.acos(Math.abs(p.clamp(p.dotArray(A,I),-1,1))),fixedArray:(A,I)=>{let g=A.length,C=[];for(;g--;)C[g]=p.toFixed(A[g],I);return C},getSize:A=>.001*A.byteLength+"kb",perpendicularArray:A=>{const I=Math.sqrt(A[0]*A[0]+A[1]*A[1]+A[2]*A[2]);let g=Math.acos(A[1]/I);const C=Math.atan2(A[2],A[0]);g>_?g-=_:g+=_;return[I*Math.sin(g)*Math.cos(C),I*Math.cos(g),I*Math.sin(g)*Math.sin(C)]},crossArray:(A,I)=>{const g=A[0],C=A[1],B=A[2],Q=I[0],i=I[1],E=I[2];return[C*E-B*i,B*Q-g*E,g*i-C*Q]},applyQuaternion:(A,I)=>{const g=A[0],C=A[1],B=A[2],Q=I[0],i=I[1],E=I[2],o=I[3],t=2*(i*B-E*C),e=2*(E*g-Q*B),D=2*(Q*C-i*g);return[g+o*t+i*D-E*e,C+o*e+E*t-Q*D,B+o*D+Q*e-i*t]},nullArray:(A,I,g)=>{let C=0;for(;g--;)C+=A[I+g];return C},equalArray:(A,I)=>{let g=A.length;for(;g--;)if(A[g]!==I[g])return!1;return!0},lerpArray:(A,I,g)=>{if(0===g)return A;if(1===g)return I;let C=A.length,B=[];for(;C--;)B[C]=A[C],B[C]+=(I[C]-B[C])*g;return B},zeroArray:(A,I=0,g)=>{for(g=g??A.length;g--;)A[I+g]=0;return A},lengthArray:A=>{let I=A.length,g=0;for(;I--;)g+=A[I]*A[I];return Math.sqrt(g)},dotArray:(A,I)=>{let g=A.length,C=0;for(;g--;)C+=A[g]*I[g];return C},addArray:(A,I,g)=>{g=g??A.length;let C=[];for(;g--;)C[g]=A[g]+I[g];return C},subArray:(A,I,g)=>{g=g??A.length;let C=[];for(;g--;)C[g]=A[g]-I[g];return C},mulArray:(A,I,g)=>{if(I instanceof Array){let C=[];for(g=g??A.length;g--;)C[g]=A[g]*I[g];return C}return A.map((A=>A*I))},worldscale:(A,I)=>A.map((A=>A*I)),divArray:(A,I,g)=>p.mulArray(A,1/I,g),scaleArray:(A,I,g)=>p.mulArray(A,I,g),fillArray:(A,I,g=0,C)=>{for(C=C??A.length;C--;)I[g+C]=A[C]},copyArray:(A,I)=>{},cloneArray:A=>[...A],distanceArray:(A,I=[0,0,0])=>p.lengthArray(p.subArray(A,I)),normalizeArray:A=>p.divArray(A,p.lengthArray(A)||1),normalArray:(A,I=[0,0,0])=>p.normalizeArray(p.subArray(I,A)),getCenter:(A,I)=>(A.computeBoundingBox(),A.boundingBox.getCenter(I)),getVolume:(A,I,g=null)=>{let C=1,B=I;switch(A){case"sphere":C=4*Math.PI*B[0]*B[0]*B[0]/3;break;case"cone":C=Math.PI*B[0]*(.5*B[1])*2;break;case"box":C=.5*B[0]*8*(.5*B[1])*(.5*B[2]);break;case"cylinder":C=Math.PI*B[0]*B[0]*(.5*B[1])*2;break;case"capsule":C=4*Math.PI*B[0]*B[0]*B[0]/3+Math.PI*B[0]*B[0]*(.5*B[1])*2;break;case"convex":case"mesh":C=p.getConvexVolume(g)}return C},getConvexVolume:A=>{let I,g=A.length/3,C=[0,0,0],B=[0,0,0];for(;g--;)I=3*g,A[I]<C[0]?C[0]=A[I]:A[I]>B[0]&&(B[0]=A[I]),A[I+1]<C[1]?C[1]=A[I+1]:A[I+1]>B[1]&&(B[1]=A[I+1]),A[I+2]<C[2]?C[2]=A[I+2]:A[I+2]>B[2]&&(B[2]=A[I+2]);let Q=[B[0]-C[0],B[1]-C[1],B[2]-C[2]];return.5*Q[0]*8*(.5*Q[1])*(.5*Q[2])},massFromDensity:(A,I)=>A*I,densityFromMass:(A,I)=>A/I,toNonIndexed:A=>A.index?A.clone().toNonIndexed():A,getIndex:(A,I)=>!A.index||I?null:A.index.array||null,getSameVertex:A=>{const I=A.getAttribute("position"),g=I.array,C=[],B=[],Q={};new THREE.Vector3;let i,E=0;p.getHash(A);let o,t,e=!1,D=0;for(let A=0;A<I.count;A++){E=3*A,o={x:g[E],y:g[E+1],z:g[E+2],id:A},e=!1,i=C.length;for(let I=0;I<i;I++)t=C[I],o.x===t.x&&o.y===t.y&&o.z===t.z&&(e=!0,Q[A]=t.id);e||(o.id=D++,C.push(o),B.push([o.x,o.y,o.z]))}return[B,Q]},getVertex:(A,I)=>{let g=A.attributes.position.array;return I&&A.index&&(g=(A=A.clone().toNonIndexed()).attributes.position.array),g},getNormal:A=>A.attributes.normal.array,getFaces:A=>{let I=[];if(A.index){let g=A.getIndex();for(let A=0;A<g.count;A+=3)I.push([g.getX(A),g.getX(A+1),g.getX(A+2)])}else{let g=A.getAttribute("position").count;for(let A=0;A<g;A+=3)I.push([A,A+1,A+2])}return I},getConnectedFaces:A=>{const I=[];let g,C,B,Q,i,E,o,t=A.length,e=t;for(;e--;)for(C=A[e],g=t;g--;)g!==e&&(B=A[g],Q=C.filter((A=>B.includes(A))),Q.length>1&&(o=[],i=[...C],E=i.indexOf(Q[0]),i.splice(E,1),E=i.indexOf(Q[1]),i.splice(E,1),o.push(i[0]),i=[...B],E=i.indexOf(Q[0]),i.splice(E,1),E=i.indexOf(Q[1]),i.splice(E,1),o.push(i[0]),I.push(o)));return I},reduce:A=>{},barycentric:(A,I)=>{},solve:(A,I)=>{},getHash:(A,I=1e-4)=>{I=Math.max(I,Number.EPSILON);const g={},C={},B=A.getAttribute("position"),Q=B.count,i=B.array,E=.5*I,o=Math.log10(1/I),t=Math.pow(10,o),e=E*t;let D;for(let A=0;A<Q;A++){D=3*A;let I=`${~~(i[D]*t+e)},${~~(i[D+1]*t+e)},${~~(i[D+2]*t+e)}`;g[I]?g[I].push(A):g[I]=[A]}let n=0;for(let A in g)C[n++]=g[A];return C}},S=p;class c extends e{constructor(){super(),this.Utils=g,this.type="ray",this.callback=new Ammo.ClosestRayResultCallback,this.t=new Ammo.btTransform}step(){const A=I.Ar,g=I.ArPos[this.type];I.reflow.ray=[];let C,B,Q,i,E,o=this.list.length,e=this.callback;for(;o--;)B=g+o*t.ray,C=this.list[o],A[B]=0,e.set_m_collisionObject(null),i=C.getPoint(this.t),e.get_m_rayFromWorld().fromArray(i[0]),e.get_m_rayToWorld().fromArray(i[1]),e.set_m_collisionFilterGroup(C.group),e.set_m_collisionFilterMask(C.mask),e.set_m_closestHitFraction(C.precision),I.world.rayTest(e.get_m_rayFromWorld(),e.get_m_rayToWorld(),e),e.hasHit()&&(A[B]=1,E=e.get_m_hitPointWorld().toArray(),A[B+1]=S.distanceArray(i[0],E),A[B+2]=i[0][0],A[B+3]=i[0][1],A[B+4]=i[0][2],A[B+5]=E[0],A[B+6]=E[1],A[B+7]=E[2],e.get_m_hitNormalWorld().toArray(A,B+8),Q=Ammo.castObject(e.get_m_collisionObject(),Ammo.btRigidBody).name,I.reflow.ray[o]=Q)}add(A={}){this.setName(A);let I=new y(A);this.addToWorld(I,A.id)}set(A={},I=null){null===I&&(I=this.byName(A.name)),null!==I&&(A.begin&&(I.begin=A.begin),A.end&&(I.end=A.end))}}class y{constructor(A={}){this.type="ray",this.name=A.name,this.parent=A.parent||"",this.begin=A.begin||[0,0,0],this.end=A.end||[0,0,1],this.noRotation=A.noRotation||!1,this.precision=A.precision||1,this.group=void 0!==A.group||1,this.mask=void 0!==A.mask||-1}getPoint(A){if(this.parent){const I=g.byName(this.parent);if(I){I.getMotionState().getWorldTransform(A);const g=A.getOrigin().toArray(),C=this.noRotation?[0,0,0,1]:A.getRotation().toArray();return[S.applyTransformArray(this.begin,g,C),S.applyTransformArray(this.end,g,C)]}}return[this.begin,this.end]}}class K extends e{constructor(){super(),this.Utils=g,this.type="body",this.itype="body",this.num=t[this.type],this.full=!1,this.v=new Ammo.btVector3,this.vv=new Ammo.btVector3,this.q=new Ammo.btQuaternion,this.t=new Ammo.btTransform,this.v1=new Ammo.btVector3,this.v2=new Ammo.btVector3,this.v3=new Ammo.btVector3}setFull(A){this.num=t[A?"bodyFull":"body"],this.full=A}step(){const A=I.Ar,g=I.ArPos[this.itype];let C,B,Q,i,E=this.list.length;for(;E--;)C=this.list[E],B=g+E*this.num,A[B]=C.isActive()?1:0,C.getMotionState().getWorldTransform(this.t),this.t.toArray(A,B+1),this.full?(Q=C.getLinearVelocity(),i=C.getAngularVelocity(),Q.toArray(A,B+8),i.toArray(A,B+11),1===A[B]&&(A[B]=9.8*Q.length())):C.getVelocity&&(Q=C.getLinearVelocity().toArray(),i=C.getAngularVelocity().toArray(),I.reflow.velocity[C.name]=[...Q,...i])}shape(A={}){let I,g,C,B=A.type||"box",Q=A.size||[1,1,1];switch(B){case"plane":I=new Ammo.btStaticPlaneShape(this.v.fromArray(A.dir||[0,1,0]),.001),I.setLocalScaling(this.v.fromArray([1,1,1]));break;case"box":I=new Ammo.btBoxShape(this.v.set(.5*Q[0],.5*Q[1],.5*Q[2]));break;case"particle":I=new Ammo.btSphereShape(A.pSize||.05);break;case"sphere":I=new Ammo.btSphereShape(Q[0]);break;case"cone":I=new Ammo.btConeShape(Q[0],Q[1]);break;case"cylinder":I=new Ammo.btCylinderShape(this.v.set(Q[0],.5*Q[1],Q[0]));break;case"capsule":I=new Ammo.btCapsuleShape(Q[0],Q[1]);break;case"convex":for(I=new Ammo.btConvexHullShape,g=Math.floor(A.v.length/3);g--;)C=3*g,I.addPoint(this.v.fromArray(A.v,C),!1);I.recalcLocalAabb();break;case"mesh":let B=new Ammo.btTriangleMesh(!0,!0);console.log(B);let i=!1,E=A.v,o=A.index||null,t=E.length;if(null!==o){for(t=E.length,g=0;g<t;g+=3)B.findOrAddVertex(this.v.set(E[g],E[g+1],E[g+2]),i);for(t=o.length,g=0;g<t;g+=3)B.addTriangleIndices&&B.addTriangleIndices(o[g],o[g+1],o[g+2])}else for(g=0;g<t;g+=9)B.addTriangle(this.v1.set(E[g+0],E[g+1],E[g+2]),this.v2.set(E[g+3],E[g+4],E[g+5]),this.v3.set(E[g+6],E[g+7],E[g+8]),i);"solid"!==this.type&&Ammo.btGImpactMeshShape?(I=new Ammo.btGImpactMeshShape(B),I.updateBound(),console.log(I)):I=new Ammo.btBvhTriangleMeshShape(B,!0,!0)}return I.setMargin&&I.setMargin(A.margin||1e-4),I.volume=S.getVolume(B,Q,A.v),I}add(A={}){let g=this.setName(A),C=void 0!==A.flag?A.flag:"solid"===this.type?1:0,B=void 0!==A.group?A.group:"solid"===this.type?2:1,Q=void 0!==A.mask?A.mask:-1;A.kinematic&&(C=2,B=4);let i=null;switch(A.type){case"null":Q=0,i=this.shape({type:"sphere",size:[.01]});break;case"compound":let I,g;i=new Ammo.btCompoundShape,i.volume=0;for(var E=0;E<A.shapes.length;E++)I=A.shapes[E],this.t.fromArray(I.pos,I.quat),g=this.shape(I),i.volume+=g.volume,i.addChildShape(this.t,g);break;default:A.shapeType&&(A.type=A.shapeType),i=this.shape(A)}this.t.fromArray(A.pos,A.quat),this.v.set(0,0,0);let o=0;A.mass&&A.density&&delete A.density,A.density&&(o=S.massFromDensity(A.density||0,i.volume)),A.mass&&(o=A.mass),0!==o&&i.calculateLocalInertia(o,this.v);let t=new Ammo.btDefaultMotionState(this.t),e=new Ammo.btRigidBodyConstructionInfo(o,t,i,this.v),D=new Ammo.btRigidBody(e);D.setCollisionFlags(C),Ammo.destroy(e),D.mass=o,D.g=i,D.name=g,D.type=this.type,D.isKinematic=A.kinematic||!1,D.isGhost=!1,D.breakable=A.breakable||!1,D.breakable&&I.numBreak++,D.group=B,D.mask=Q,D.first=!0,delete A.pos,delete A.quat,A.kinematic&&(A.neverSleep=!0,delete A.kinematic),this.addToWorld(D,A.id),this.set(A,D)}set(A={},g=null){null===g&&(g=this.byName(A.name)),null!==g&&(void 0!==A.getVelocity&&(g.getVelocity=A.getVelocity),void 0!==A.kinematic&&(g.setCollisionFlags(A.kinematic?2:0),g.isKinematic=A.kinematic,g.isKinematic||g.setGravity(I.gravity)),void 0!==A.flag&&(g.setCollisionFlags(A.flag),g.isKinematic=2===A.flag),A.noGravity&&g.setGravity(this.v.fromArray([0,0,0])),(A.pos||A.quat)&&(A.pos&&A.quat||g.getMotionState().getWorldTransform(this.t),A.pos||(A.pos=this.t.getPos()),A.quat||(A.quat=this.t.getQuat()),this.t.fromArray(A.pos,A.quat),g.isKinematic?g.getMotionState().setWorldTransform(this.t):g.setWorldTransform(this.t)),void 0!==A.state&&g.setActivationState(A.state),(A.activate||A.wake)&&g.activate(),void 0!==A.neverSleep&&(A.neverSleep?(g.setSleepingThresholds(0,0),g.activate()):g.setSleepingThresholds(.8,1)),A.sleep&&g.setActivationState(2),void 0!==A.friction&&g.setFriction(A.friction),void 0!==A.restitution&&g.setRestitution(A.restitution),void 0!==A.rollingFriction&&g.setRollingFriction(A.rollingFriction),A.reset&&(g.setLinearVelocity(this.v.set(0,0,0)),g.setAngularVelocity(this.v.set(0,0,0))),g.isGhost||(void 0!==A.group&&(g.getBroadphaseProxy().set_m_collisionFilterGroup(A.group),g.group=A.group),void 0!==A.mask&&(g.getBroadphaseProxy().set_m_collisionFilterMask(A.mask),g.mask=A.mask),void 0!==A.damping&&g.setDamping(.5*A.damping[0],.5*A.damping[1]),void 0!==A.sleeping&&g.setSleepingThresholds(A.sleeping[0],A.sleeping[1])),"body"===g.type&&(void 0!==A.linearVelocity&&g.setLinearVelocity(this.v.fromArray(A.linearVelocity)),void 0!==A.angularVelocity&&g.setAngularVelocity(this.v.fromArray(A.angularVelocity))),void 0!==A.linearFactor&&g.setLinearFactor(this.v.fromArray(A.linearFactor)),void 0!==A.angularFactor&&g.setAngularFactor(this.v.fromArray(A.angularFactor)),void 0!==A.anisotropic&&g.setAnisotropicFriction(A.anisotropic[0],A.anisotropic[1]),void 0!==A.massProps&&g.setMassProps(A.massProps[0],A.massProps[1]),A.bullet&&(g.setCcdMotionThreshold(1e-7),g.setCcdSweptSphereRadius(.1)),void 0!==A.ccdThreshold&&g.setCcdMotionThreshold(A.ccdThreshold),void 0!==A.ccdRadius&&g.setCcdSweptSphereRadius(A.ccdRadius),void 0!==A.selfGravity&&g.setGravity(this.v.fromArray(A.selfGravity)),void 0!==A.gravity&&g.setGravity(A.gravity?I.gravity:this.v.fromArray([0,0,0])),A.worldForce&&g.applyForce(this.v.fromArray(A.worldForce),this.v.fromArray(A.worldForce,3)),A.force&&(A.forceMode,A.forcePosition?g.applyForce(this.v.fromArray(A.forcePosition),this.v.fromArray(A.force)):g.applyForce(this.v.fromArray(A.force).divideScalar(I.substep))),A.torque&&g.applyTorque(this.v.fromArray(A.torque).divideScalar(I.substep)),A.impulse&&(g.activate(),A.impulseCenter?(g.getMotionState().getWorldTransform(this.t),this.v2.fromArray(A.impulseCenter).sub(this.t.getOrigin()),g.applyImpulse(this.v.fromArray(A.impulse).multiplyScalar(.7),this.v2)):g.applyCentralImpulse(this.v.fromArray(A.impulse))))}}class a extends e{constructor(){super(),this.Utils=g,this.type="joint",this.t=new Ammo.btTransform,this.t1=new Ammo.btTransform,this.t2=new Ammo.btTransform,this.v1=new Ammo.btVector3,this.v2=new Ammo.btVector3,this.p1=new Ammo.btVector3,this.p2=new Ammo.btVector3,this.q1=new Ammo.btQuaternion,this.q2=new Ammo.btQuaternion}step(){const A=I.Ar,g=I.ArPos[this.type];let C,B,Q=this.list.length;for(;Q--;)C=this.list[Q],B=g+Q*t.joint,C.visible&&(this.t.copy(C.B1.getWorldTransform()).op_mul(C.formA).toArray(A,B),this.t.copy(C.B2.getWorldTransform()).op_mul(C.formB).toArray(A,B+7))}add(A={}){this.v;let I=this.setName(A),g=this.byName(A.b1),C=this.byName(A.b2);g&&"vehicle"===g.type&&(g=g.body),C&&"vehicle"===C.type&&(C=C.body);let B=this.v1.fromArray(A.pos1||[0,0,0]),Q=this.v2.fromArray(A.pos2||[0,0,0]);A.quatX&&(A.quat1=S.quatMultiply(A.quat1,A.quatX),A.quat2=S.quatMultiply(A.quat2,A.quatX));let i=this.q1.fromArray(A.quat1||[0,0,0,1]),E=this.q2.fromArray(A.quat2||[0,0,0,1]),o=this.p1.fromArray(A.axis1||[0,0,1]),t=this.p2.fromArray(A.axis2||[0,0,1]);A.quat1||i.fromAxis(o).normalize(),A.quat2||E.fromAxis(t).normalize();const e=void 0!==A.useA&&A.useA,D=(new Ammo.btTransform).set(B,i),n=(new Ammo.btTransform).set(Q,E);let s,r=A.mode||"revolute";switch("d6"!==r&&"universal"!==r&&"dof"!==r||(r="generic"),"slider"!==r&&"cylindrical"!==r||(r="prismatic"),"joint_p2p"===r&&(r="spherical"),"conetwist"===r&&(r="ragdoll"),r){case"spherical":s=new Ammo.btPoint2PointConstraint(g,C,B,Q),A.strength&&s.get_m_setting().set_m_tau(A.strength),A.damping&&s.get_m_setting().set_m_damping(A.damping),A.impulse&&s.get_m_setting().set_m_impulseClamp(A.impulse);break;case"distance":A.lm&&(B.setValue(B.x()+A.lm[0],B.y(),B.z()),Q.setValue(Q.x()+A.lm[1],Q.y(),Q.z())),s=new Ammo.btPoint2PointConstraint(g,C,B,Q);break;case"hinge2":s=new Ammo.btHinge2Constraint(g,C,B,o,t);break;case"hinge":case"revolute":s=new Ammo.btHingeConstraint(g,C,D,n,e);break;case"prismatic":s=new Ammo.btSliderConstraint(g,C,D,n,e);break;case"ragdoll":s=new Ammo.btConeTwistConstraint(g,C,D,n);break;case"generic":s=new Ammo.btGeneric6DofSpringConstraint(g,C,D,n,e);break;case"fixe":s=new Ammo.btFixedConstraint(g,C,D,n);break;case"gear":s=new Ammo.btGearConstraint(g,C,o,t,A.ratio||1)}s.name=I,s.mode=r,s.type=this.type,s.B1=g,s.B2=C,s.formA=D,s.formB=n,s.visible=!1,s.collision=A.collision||!1,this.set(A,s),this.addToWorld(s,A.id)}set(A={},I=null){if(null===I&&(I=this.byName(A.name)),null===I)return;let g,C,B,Q;void 0!==A.visible&&(I.visible=A.visible),A.breaking&&I.setBreakingImpulseThreshold&&I.setBreakingImpulseThreshold(A.breaking),A.iteration&&I.setOverrideNumSolverIterations&&I.setOverrideNumSolverIterations(A.iteration);const i=["x","y","z","rx","ry","rz"];switch(I.mode){case"prismatic":A.lm&&(I.setLowerLinLimit(A.lm[0]),I.setUpperLinLimit(A.lm[1])),A.lmr&&(I.setLowerAngLimit(A.lmr[0]*n),I.setUpperAngLimit(A.lmr[1]*n)),A.motor&&(I.setTargetLinMotorVelocity(A.motor[0]),I.setMaxLinMotorForce(A.motor[1])),A.amotor&&(I.setTargetAngMotorVelocity(A.amotor[0]*n),I.setMaxAngMotorForce(A.amotor[1]));break;case"hinge":case"revolute":A.lm&&I.setLimit(A.lm[0]*n,A.lm[1]*n,A.lm[2]||.9,A.lm[3]||.3,A.lm[4]||1),A.motor&&I.enableAngularMotor(!0,A.motor[0]*n,A.motor[1]);break;case"distance":break;case"generic":if(A.motor){g=A.motor.length;let Q=!1;for(;g--;)C=A.motor[g],"rx"===C[0]?B=I.getRotationalLimitMotor(0):"ry"===C[0]?B=I.getRotationalLimitMotor(1):"rz"===C[0]?B=I.getRotationalLimitMotor(2):(B=getTranslationalLimitMotor(),Q=!0),B&&(Q||(B.set_m_enableMotor(!0),B.set_m_targetVelocity(-C[1]*n),B.set_m_maxMotorForce(C[2])))}if(A.lm){for(B=[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],g=A.lm.length;g--;)C=A.lm[g],"rx"===C[0]&&(B[0][0]=-C[2]*n,B[1][0]=-C[1]*n),"ry"===C[0]&&(B[0][1]=-C[2]*n,B[1][1]=-C[1]*n),"rz"===C[0]&&(B[0][2]=-C[2]*n,B[1][2]=-C[1]*n),"x"===C[0]&&(B[2][0]=C[1],B[3][0]=C[2]),"y"===C[0]&&(B[2][1]=C[1],B[3][1]=C[2]),"z"===C[0]&&(B[2][2]=C[1],B[3][2]=C[2]),C.length>3&&(Q=i.indexOf(C[0]),I.enableSpring(Q,0!==C[3]),I.setStiffness(Q,1/C[3]||0),I.setDamping(Q,1/C[4]||0));I.setAngularLowerLimit(this.v1.fromArray(B[0])),I.setAngularUpperLimit(this.v1.fromArray(B[1])),I.setLinearLowerLimit(this.v1.fromArray(B[2])),I.setLinearUpperLimit(this.v1.fromArray(B[3]))}}}}class w extends e{constructor(){super(),this.Utils=g,this.type="contact",this.cb=new Ammo.ConcreteContactResultCallback}step(){const A=I.Ar,g=I.ArPos[this.type];let C,B,Q,i=this.list.length;for(;i--;)Q=0,C=this.list[i],B=g+i*t.contact,this.cb.addSingleResult=function(){Q=1},null!==C.b2?I.world.contactPairTest(C.b1,C.b2,this.cb):I.world.contactTest(C.b1,this.cb),A[B]=Q}add(A={}){this.setName(A),A.b1=this.byName(A.b1),A.b2=this.byName(A.b2);let I=new h(A);this.addToWorld(I,A.id)}}class h{constructor(A={}){this.type="contact",this.name=A.name,this.b1=A.b1||null,this.b2=A.b2||null,this.ignore=A.ignore||[],this.result={hit:!1,point:[0,0,0],normal:[0,0,0],distance:0}}update(){}}class M extends e{constructor(){super(),this.type="vehicle",this.Utils=g,this.trans=new Ammo.btTransform}step(){const A=I.Ar,g=I.ArPos[this.type];let C,B=this.list.length;for(;B--;)C=g+B*t.vehicle,this.list[B].step(A,C,this.trans)}add(A){this.setName(A);let I=new k(A);this.addToWorld(I,A.id)}set(A={},I=null){null===I&&(I=this.byName(A.name)),null!==I&&I.set(A)}}class k{constructor(A){this.type="vehicle",this.name=A.name,this.enable=!1,this.numWheel=A.numWheel||4,this.wheelsPosition=A.wheelsPosition,this.radius=A.radius,this.radiusBack=A.radiusBack,this.deep=A.deep,this.deepBack=A.deepBack,this.massCenter=A.massCenter||[0,.55,1.594],this.chassisPos=A.chassisPos||[0,.83,0],this.chassis=null,this.body=null,this.steering=0,this.breaking=0,this.motor=0,this.gearRatio=[-1,0,2.3,1.8,1.3,.9,.5],this.key=[0,0,0,0,0,0,0,0],this.limitAngular=[1,1,1],this.transforms=[],this.wheelBody=[],this.wheelJoint=[],this.wheelRadius=[],this.isRay=!0,this.tr=new Ammo.btTransform,this.tmpT=new Ammo.btTransform,this.tmpV=new Ammo.btVector3,this.data={mass:A.mass||2e3,incSteering:A.incSteering||2,maxSteering:A.maxSteering||24,wMass:1,wWidth:.25,engine:1e3,acceleration:10,breaking:100,pos:[0,0,0],quat:[0,0,0,1],masscenter:[0,-.6,0],friction:.6,restitution:.1,rolling:0,autoSuspension:!1,compValue:.2,dampValue:.3,s_stiffness:A.s_stiffness||20,s_damping:A.s_damping||4.4,s_compression:A.s_compression||2.3,s_travel:A.s_travel||.4,s_force:6e3,w_friction:10.5,w_roll:.001};let I=Math.round(this.data.mass/this.numWheel);A.s_compression||(this.data.s_compression=.6*this.data.s_damping),A.s_force||(this.data.s_force=25*I),this.init(A)}init(A){this.size=A.size||[1.7,1,5];const g=this.data;let C=new Ammo.btTransform,B=new Ammo.btVector3,Q=new Ammo.btVector3,i=new Ammo.btVector3,E=new Ammo.btVector3;g.mass=void 0===A.mass?800:A.mass,g.pos=void 0===A.pos?[0,0,0]:A.pos,g.quat=void 0===A.quat?[0,0,0,1]:A.quat,this.chassisShape=A.chassisShape?I.bodyRef.shape(A.chassisShape):new Ammo.btBoxShape(B.set(.5*this.size[0],.5*this.size[1],.5*this.size[2])),B.fromArray(this.massCenter),C.setIdentity(),C.setOrigin(B);const o=new Ammo.btCompoundShape;o.addChildShape(C,this.chassisShape),this.startPose=(new Ammo.btTransform).fromArray(A.pos||[0,1,0],A.quat||[0,0,0,1]),B.setValue(0,0,0),o.calculateLocalInertia(g.mass,B);var t=new Ammo.btDefaultMotionState(this.startPose),e=new Ammo.btRigidBodyConstructionInfo(g.mass,t,o,B);this.body=new Ammo.btRigidBody(e),this.body.name=this.name,this.body.setActivationState(4),Ammo.destroy(e);const D=new Ammo.btVehicleTuning,n=new Ammo.btDefaultVehicleRaycaster(I.world);this.chassis=new Ammo.btRaycastVehicle(D,this.body,n),this.chassis.setCoordinateSystem(0,1,2);const s=this.numWheel;for(let o=0;o<s;o++){let n=o<2;if(Q.fromArray(this.wheelsPosition[o]),i.setValue(0,-1,0),E.setValue(-1,0,0),this.isRay)this.chassis.addWheel(Q,i,E,1,n?this.radius:this.radiusBack,D,n),this.chassis.setBrake(A.breaking||100,o);else{C.identity(),C.setOrigin(Q),i.setValue(g.wWidth*I.invScale,radius,radius),shape=new Ammo.btCylinderShape(i),B.setValue(0,0,0),shape.calculateLocalInertia(g.wMass,B);t=new Ammo.btDefaultMotionState(C),e=new Ammo.btRigidBodyConstructionInfo(g.wMass,t,shape,B);var r=new Ammo.btRigidBody(e);r.setFriction(1),r.setActivationState(4),I.world.addRigidBody(r,1,-1),this.wheelBody[o]=r;var _=new Ammo.btHingeConstraint(this.body,r,Q,B,i,E,!1);I.world.addConstraint(_,!1)}}this.setData(A),C.free(),B.free(),Q.free(),i.free(),E.free(),I.world.addAction(this.chassis),I.world.addRigidBody(this.body)}step(A,I,g){this.drive(),A[I]=this.chassis.getCurrentSpeedKmHour(),this.body.getMotionState().getWorldTransform(g),g.toArray(A,I+1),g=g.inverse();for(var C,B,Q=this.numWheel;Q--;)this.chassis.updateWheelTransform(Q,!0),(B=this.chassis.getWheelTransformWS(Q)).mult(g,B),C=8*(Q+1),B.toArray(A,I+C+1),0===Q&&(A[I+C]=this.chassis.getWheelInfo(0).get_m_steering()),1===Q&&(A[I+C]=this.chassis.getWheelInfo(1).get_m_steering()),2===Q&&(A[I+C]=this.steering)}set(A){A.key&&(this.key=A.key),(A.pos||A.quat)&&(this.body.getMotionState().getWorldTransform(this.tr),A.pos&&this.tr.setOrigin(this.tr.getOrigin().fromArray(A.pos)),A.quat&&this.tr.setRotation(this.tr.getRotation().fromArray(A.quat)),this.body.setWorldTransform(this.tr))}setMass(A){var I=this.tmpV;this.data.mass=A,I.setValue(0,0,0),this.body.getCollisionShape().calculateLocalInertia(this.data.mass,I),this.body.setMassProps(A,I),this.body.updateInertiaTensor(),I.free()}setPosition(){this.steering=0,this.breaking=0,this.motor=0,this.tmpT.identity().fromArray(this.data.pos.concat(this.data.quat));var A=this.tmpV.set(0,0,0);this.body.setAngularVelocity(A),this.body.setLinearVelocity(A),this.body.setWorldTransform(this.tmpT),this.chassis.resetSuspension();for(var I=this.numWheel;I--;)this.chassis.updateWheelTransform(I,!0)}drive(){if(!this.enable)return;const A=this.data,g=I.key;let C,B;if(0===g[0]?this.steering*=.9:this.steering-=A.incSteering*g[0],this.steering=S.clamp(this.steering,-A.maxSteering,A.maxSteering),0===g[1]?(this.motor=0,this.breaking=A.breaking):(this.motor-=A.acceleration*g[1],this.breaking=0),this.motor=S.clamp(this.motor,-A.engine,A.engine),this.wheelSide=this.wheelsPosition[1][0],this.wheelBase=2*this.wheelsPosition[1][2],this.numWheel>3){let A=this.wheelBase/Math.tan(this.steering*n);C=Math.atan2(this.wheelBase,this.wheelSide+A),B=Math.atan2(this.wheelBase,-this.wheelSide+A),A<0&&(C-=Math.PI,B-=Math.PI)}let Q=this.numWheel;for(;Q--;)this.numWheel<4?0===Q&&this.chassis.setSteeringValue(this.steering*n,Q):(0===Q&&this.chassis.setSteeringValue(B,Q),1===Q&&this.chassis.setSteeringValue(C,Q)),this.chassis.applyEngineForce(this.motor,Q),this.chassis.setBrake(this.breaking,Q);if(this.motor<1){var i=this.body.getAngularVelocity();i.multiplyArray(this.limitAngular),this.body.setAngularVelocity(i)}}clear(){this.body=null,this.chassis=null}setData(A){var I=this.data;for(var g in void 0!==A.mass&&A.mass!==I.mass&&this.setMass(A.mass),A)void 0!==I[g]&&(I[g]=A[g]);this.body.setFriction(I.friction),this.body.setRestitution(I.restitution),this.body.setRollingFriction(I.rolling),void 0!==A.damping&&this.body.setDamping(A.damping[0],A.damping[1]),void 0!==A.limitAngular&&(this.limitAngular=A.limitAngular);var C=new Ammo.btVector3;if(void 0!==A.linearFactor&&this.body.setLinearFactor(C.fromArray(A.linearFactor)),void 0!==A.angularFactor&&this.body.setAngularFactor(C.fromArray(A.angularFactor)),C.free(),I.autoSuspension){var B=Math.sqrt(I.s_stiffness);I.s_compression=2*I.compValue*B,I.s_damping=2*I.dampValue*B,console.log(B,I.s_damping,I.s_compression)}for(var Q,i=this.numWheel;i--;)(Q=this.chassis.getWheelInfo(i)).set_m_suspensionStiffness(I.s_stiffness),Q.set_m_wheelsDampingCompression(I.s_compression),Q.set_m_wheelsDampingRelaxation(I.s_damping),Q.set_m_maxSuspensionTravelCm(100*I.s_travel),Q.set_m_suspensionRestLength1(.5*I.s_travel),Q.set_m_maxSuspensionForce(I.s_force),Q.set_m_rollInfluence(I.w_roll),Q.set_m_frictionSlip(I.w_friction),Q.set_m_wheelsRadius(i<2?this.radius:this.radiusBack);A.reset&&this.setPosition()}get(){self.postMessage({m:"carData",o:this.data})}release(){I.world.removeAction(this.chassis),I.world.removeRigidBody(this.body),Ammo.destroy(this.chassis),Ammo.destroy(this.body)}}class U extends e{constructor(){super(),this.type="terrain",this.Utils=g}add(A){this.setName(A);let I=new l(A);this.addToWorld(I,A.id)}set(A={},I=null){null===I&&(I=this.byName(A.name)),null!==I&&I.set(A)}}class l{constructor(A){this.type="terrain",this.name=A.name,this.needUpdate=!1,this.heightField=null,this.t=new Ammo.btTransform,this.data=null,this.init(A)}init(A){const I=A.size,g=[I[0]/(A.sample[0]-1),I[2]/(A.sample[1]-1)];this.fullSample=[A.sample[0],A.sample[1]],this.setData(A),this.update();let C=void 0===A.margin?.02:A.margin,B=void 0===A.heightScale?1:A.heightScale,Q=void 0===A.upAxis?1:A.upAxis,i=new Ammo.btHeightfieldTerrainShape(A.sample[0],A.sample[1],this.data,B,2*-I[1],2*I[1],Q,"PHY_FLOAT",!1),E=new Ammo.btVector3(g[0],1,g[1]);i.setLocalScaling(E),i.setMargin(C);let o=void 0===A.mass?0:A.mass,t=void 0===A.friction?.5:A.friction,e=void 0===A.restitution?0:A.restitution,D=void 0===A.flag?1:A.flag;this.group=void 0!==A.group?A.group:2,this.mask=void 0!==A.mask?A.mask:-1,this.t.fromArray(A.pos,A.quat),E.set(0,0,0);let n=new Ammo.btDefaultMotionState(this.t),s=new Ammo.btRigidBodyConstructionInfo(o,n,i,E);s.set_m_friction(t),s.set_m_restitution(e),this.body=new Ammo.btRigidBody(s),this.body.setCollisionFlags(D)}setData(A){this.tmpData=A.heightData,this.nDataBytes=this.tmpData.length*this.tmpData.BYTES_PER_ELEMENT,this.needsUpdate=!0}update(){this.needsUpdate&&(this.malloc(),this.needsUpdate=!1,this.tmpData=null)}malloc(){null===this.data&&(this.data=Ammo._malloc(this.nDataBytes));let A=this.tmpData.length,I=0,g=0;for(;A--;)Ammo.HEAPF32[this.data+g>>2]=this.tmpData[I],I++,g+=4}release(){I.world.removeCollisionObject(this.body),Ammo.destroy(this.body),this.body=null,this.data=null,this.tmpData=null,this.dataHeap=null}set(A){A.heightData&&(this.setData(A),this.update())}}var J,G=(J="undefined"!=typeof document?document.currentScript?.src:void 0,"undefined"!=typeof __filename&&(J||=__filename),async function(A={}){var I;I="data:application/octet-stream;base64,AGFzbQEAAAABhQZZYAF/AGABfwF/YAJ/fwF/YAJ/fwBgBH9/f38AYAN/f38AYAF/AX1gA39/fwF/YAJ/fQBgBX9/f39/AGAAAGAEf39/fwF/YAN/f38BfWADf399AGAAAX9gBH9/f30AYAV/f39/fwF/YAJ/fwF9YAN/fX8AYAZ/f39/f38AYAR/f31/AGAGf39/f39/AX9gBn9/f39/fQBgA399fQBgC39/f399fX19f399AGABfQF9YAV/f39/fwF9YAp/f39/f39/f39/AGAHf39/f39/fwBgA39/fQF/YAx/f39/fX19fX1/fX8AYAJ/fQF/YAp/f39/f39/f39/AX1gBn99fX9/fwBgAn19AX9gCH9/f39/f39/AX9gBH99f30Bf2AHf39/f39/fwF/YAp/f39/f39/f39/AX9gBH9/fX0AYAZ/f399f38AYAl/f39/f39/f38AYAh/f39/f39/fwF9YAR/fX9/AGAJf39/f39/f39/AX1gAn19AX1gBX9/f31/AGAIf39/f39/f38AYAR/f39/AX1gBX9/f399AX9gBX9/f399AGAFf399f38BfWAEf319fQBgAn99AX1gAXwBfWANf39/f39/f39/f39/fwF/YAZ/fX19fX0AYAV/fX19fQBgCX9/f39/f39/fwF/YAZ/f399f38BfWAFf399f38AYAF/AXxgBH19fX0Bf2ADf39/AXxgBX19fX19AX1gDH9/f39/f39/fX99fQBgBX99f39/AX1gAnx/AXxgBn99fX1/fwBgBX9/f399AX1gC39/fX19fX9/f399AX1gBX99f39/AGADf31/AX9gAn1/AX9gB39/f39/fX8Bf2AGf39/f399AX1gCH9/f39/fX1/AGAGf39/f399AX9gCX9/f399f39/fwBgCX9/f39/f39/fQBgC39/f39/f39/f39/AX9gCH9/f399fX9/AX9gA319fQF/YAR/f31/AX9gBH1/f38Bf2ADfX9/AX9gBH9/f30Bf2AJf39/fX19f39/AX9gAX0BfwIfBQFhAWEABwFhAWIACgFhAWMAAQFhAWQABQFhAWUAPwOLEIkQBAAHAAEHAAEFLQUFAAEBAwAAEgUFGRkDAS0BCQEBAwEDGRkFDgYIBwURAAUBCAYIFAwIBgMBBQA2NhkLASUHAAMCAwAAAAkZAhUBAC4F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ZQD4CgJ5ZQC6BAJ6ZQD3CgJBZQC5BAJCZQC4BAJDZQC3BAJEZQC2BAJFZQC1BAJGZQDsAgJHZQC0BAJIZQCzBAJJZQCyBAJKZQCxBAJLZQCwBAJMZQCvBAJNZQD0AQJOZQDCAgJPZQC+AgJQZQC1AgJRZQCuBAJSZQCtBAJTZQCjAgJUZQB1AlVlAJYCAlZlAI8CAldlAIsCAlhlAIcCAlllAIYCAlplANABAl9lAIUCAiRlAIQCAmFmAIMCAmJmANACAmNmAPcBAmRmAM8CAmVmAM4CAmZmAMwCAmdmAMsCAmhmAAYCamYArAQCa2YABgJsZgDrAgJtZgAGAm5mAPYKAm9mAKsEAnBmAKoEAnFmAM8BAnJmAM0BAnNmAIgBAnRmAMwBAnVmAMoBAnZmAMkBAndmAMgBAnhmAMUBAnlmAMEBAnpmAMABAkFmAL8BAkJmAL0BAkNmALwBAkRmALsBAkVmALoBAkZmALkBAkdmALgBAkhmAIQBAklmALcBAkpmALYBAktmALUBAkxmAF0CTWYAtAECTmYAswECT2YAsgECUGYAsQECUWYArwECUmYAqgECU2YAfwJUZgAGAlVmAAYCVmYAEQJXZgD1CgJYZgD0CgJZZgD2AwJaZgDzAwJfZgB1AiRmAPIDAmFnAMoCAmJnAPEDAmNnAAYCZGcA8woCZWcA8goCZmcA2gMCZ2cAqQQCaGcA7wMCaWcA9gECamcA8wECa2cA8gECbGcA8QECbWcA8AECbmcA7wECb2cA6QMCcGcA8QoCcWcAggYCcmcA+gUCc2cA9QUCdGcA8QUCdWcApQECdmcA8AoCd2cAqQQCeGcA7woCeWcA7goCemcA7QoCQWcA7AoCQmcA6woCQ2cA6goCRGcA6QoCRWcA6AoCRmcA5woCR2cA5goCSGcA5QoCSWcA5AoCSmcA4woCS2cA4goCTGcA4QoCTWcA4AoCTmcA3woCT2cA3goCUGcA9gECUWcA8wECUmcA8gECU2cA2gMCVGcA8QECVWcA8AECVmcA7wECV2cA6QUCWGcAEQJZZwDdCgJaZwDcCgJfZwDbCgIkZwARAmFoANoKAmJoANkKAmNoANgKAmRoANcKAmVoANYKAmZoANQBAmdoANUKAmhoANQKAmloANMKAmpoANIKAmtoANEKAmxoAKUBAm1oANAKAm5oAF0Cb2gA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