forked from sillysecurityawards/awards-site
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cannon-es.js
1 lines (1 loc) · 121 KB
/
cannon-es.js
1
class t{constructor(){this.matrix={}}get(t,e){let{id:s}=t,{id:i}=e;if(i>s){const t=i;i=s,s=t}return`${s}-${i}`in this.matrix}set(t,e,s){let{id:i}=t,{id:o}=e;if(o>i){const t=o;o=i,i=t}s?this.matrix[`${i}-${o}`]=!0:delete this.matrix[`${i}-${o}`]}reset(){this.matrix={}}setNumObjects(t){}}class e{constructor(t){void 0===t&&(t=[0,0,0,0,0,0,0,0,0]),this.elements=t}identity(){const t=this.elements;t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1}setZero(){const t=this.elements;t[0]=0,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t[8]=0}setTrace(t){const e=this.elements;e[0]=t.x,e[4]=t.y,e[8]=t.z}getTrace(t){void 0===t&&(t=new i);const e=this.elements;return t.x=e[0],t.y=e[4],t.z=e[8],t}vmult(t,e){void 0===e&&(e=new i);const s=this.elements,o=t.x,n=t.y,r=t.z;return e.x=s[0]*o+s[1]*n+s[2]*r,e.y=s[3]*o+s[4]*n+s[5]*r,e.z=s[6]*o+s[7]*n+s[8]*r,e}smult(t){for(let e=0;e<this.elements.length;e++)this.elements[e]*=t}mmult(t,s){void 0===s&&(s=new e);const i=this.elements,o=t.elements,n=s.elements,r=i[0],a=i[1],l=i[2],h=i[3],c=i[4],d=i[5],u=i[6],p=i[7],y=i[8],v=o[0],m=o[1],g=o[2],w=o[3],f=o[4],x=o[5],b=o[6],A=o[7],B=o[8];return n[0]=r*v+a*w+l*b,n[1]=r*m+a*f+l*A,n[2]=r*g+a*x+l*B,n[3]=h*v+c*w+d*b,n[4]=h*m+c*f+d*A,n[5]=h*g+c*x+d*B,n[6]=u*v+p*w+y*b,n[7]=u*m+p*f+y*A,n[8]=u*g+p*x+y*B,s}scale(t,s){void 0===s&&(s=new e);const i=this.elements,o=s.elements;for(let e=0;3!==e;e++)o[3*e+0]=t.x*i[3*e+0],o[3*e+1]=t.y*i[3*e+1],o[3*e+2]=t.z*i[3*e+2];return s}solve(t,e){void 0===e&&(e=new i);const s=[];let o,n;for(o=0;o<12;o++)s.push(0);for(o=0;o<3;o++)for(n=0;n<3;n++)s[o+4*n]=this.elements[o+3*n];s[3]=t.x,s[7]=t.y,s[11]=t.z;let r=3;const a=r;let l;let h;do{if(o=a-r,0===s[o+4*o])for(n=o+1;n<a;n++)if(0!==s[o+4*n]){l=4;do{h=4-l,s[h+4*o]+=s[h+4*n]}while(--l);break}if(0!==s[o+4*o])for(n=o+1;n<a;n++){const t=s[o+4*n]/s[o+4*o];l=4;do{h=4-l,s[h+4*n]=h<=o?0:s[h+4*n]-s[h+4*o]*t}while(--l)}}while(--r);if(e.z=s[11]/s[10],e.y=(s[7]-s[6]*e.z)/s[5],e.x=(s[3]-s[2]*e.z-s[1]*e.y)/s[0],isNaN(e.x)||isNaN(e.y)||isNaN(e.z)||e.x===1/0||e.y===1/0||e.z===1/0)throw`Could not solve equation! Got x=[${e.toString()}], b=[${t.toString()}], A=[${this.toString()}]`;return e}e(t,e,s){if(void 0===s)return this.elements[e+3*t];this.elements[e+3*t]=s}copy(t){for(let e=0;e<t.elements.length;e++)this.elements[e]=t.elements[e];return this}toString(){let t="";for(let e=0;e<9;e++)t+=this.elements[e]+",";return t}reverse(t){void 0===t&&(t=new e);const i=s;let o,n;for(o=0;o<3;o++)for(n=0;n<3;n++)i[o+6*n]=this.elements[o+3*n];i[3]=1,i[9]=0,i[15]=0,i[4]=0,i[10]=1,i[16]=0,i[5]=0,i[11]=0,i[17]=1;let r=3;const a=r;let l;let h;do{if(o=a-r,0===i[o+6*o])for(n=o+1;n<a;n++)if(0!==i[o+6*n]){l=6;do{h=6-l,i[h+6*o]+=i[h+6*n]}while(--l);break}if(0!==i[o+6*o])for(n=o+1;n<a;n++){const t=i[o+6*n]/i[o+6*o];l=6;do{h=6-l,i[h+6*n]=h<=o?0:i[h+6*n]-i[h+6*o]*t}while(--l)}}while(--r);o=2;do{n=o-1;do{const t=i[o+6*n]/i[o+6*o];l=6;do{h=6-l,i[h+6*n]=i[h+6*n]-i[h+6*o]*t}while(--l)}while(n--)}while(--o);o=2;do{const t=1/i[o+6*o];l=6;do{h=6-l,i[h+6*o]=i[h+6*o]*t}while(--l)}while(o--);o=2;do{n=2;do{if(h=i[3+n+6*o],isNaN(h)||h===1/0)throw`Could not reverse! A=[${this.toString()}]`;t.e(o,n,h)}while(n--)}while(o--);return t}setRotationFromQuaternion(t){const e=t.x,s=t.y,i=t.z,o=t.w,n=e+e,r=s+s,a=i+i,l=e*n,h=e*r,c=e*a,d=s*r,u=s*a,p=i*a,y=o*n,v=o*r,m=o*a,g=this.elements;return g[0]=1-(d+p),g[1]=h-m,g[2]=c+v,g[3]=h+m,g[4]=1-(l+p),g[5]=u-y,g[6]=c-v,g[7]=u+y,g[8]=1-(l+d),this}transpose(t){void 0===t&&(t=new e);const s=this.elements,i=t.elements;let o;return i[0]=s[0],i[4]=s[4],i[8]=s[8],o=s[1],i[1]=s[3],i[3]=o,o=s[2],i[2]=s[6],i[6]=o,o=s[5],i[5]=s[7],i[7]=o,t}}const s=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];class i{constructor(t,e,s){void 0===t&&(t=0),void 0===e&&(e=0),void 0===s&&(s=0),this.x=t,this.y=e,this.z=s}cross(t,e){void 0===e&&(e=new i);const s=t.x,o=t.y,n=t.z,r=this.x,a=this.y,l=this.z;return e.x=a*n-l*o,e.y=l*s-r*n,e.z=r*o-a*s,e}set(t,e,s){return this.x=t,this.y=e,this.z=s,this}setZero(){this.x=this.y=this.z=0}vadd(t,e){if(!e)return new i(this.x+t.x,this.y+t.y,this.z+t.z);e.x=t.x+this.x,e.y=t.y+this.y,e.z=t.z+this.z}vsub(t,e){if(!e)return new i(this.x-t.x,this.y-t.y,this.z-t.z);e.x=this.x-t.x,e.y=this.y-t.y,e.z=this.z-t.z}crossmat(){return new e([0,-this.z,this.y,this.z,0,-this.x,-this.y,this.x,0])}normalize(){const t=this.x,e=this.y,s=this.z,i=Math.sqrt(t*t+e*e+s*s);if(i>0){const t=1/i;this.x*=t,this.y*=t,this.z*=t}else this.x=0,this.y=0,this.z=0;return i}unit(t){void 0===t&&(t=new i);const e=this.x,s=this.y,o=this.z;let n=Math.sqrt(e*e+s*s+o*o);return n>0?(n=1/n,t.x=e*n,t.y=s*n,t.z=o*n):(t.x=1,t.y=0,t.z=0),t}length(){const t=this.x,e=this.y,s=this.z;return Math.sqrt(t*t+e*e+s*s)}lengthSquared(){return this.dot(this)}distanceTo(t){const e=this.x,s=this.y,i=this.z,o=t.x,n=t.y,r=t.z;return Math.sqrt((o-e)*(o-e)+(n-s)*(n-s)+(r-i)*(r-i))}distanceSquared(t){const e=this.x,s=this.y,i=this.z,o=t.x,n=t.y,r=t.z;return(o-e)*(o-e)+(n-s)*(n-s)+(r-i)*(r-i)}scale(t,e){void 0===e&&(e=new i);const s=this.x,o=this.y,n=this.z;return e.x=t*s,e.y=t*o,e.z=t*n,e}vmul(t,e){return void 0===e&&(e=new i),e.x=t.x*this.x,e.y=t.y*this.y,e.z=t.z*this.z,e}addScaledVector(t,e,s){return void 0===s&&(s=new i),s.x=this.x+t*e.x,s.y=this.y+t*e.y,s.z=this.z+t*e.z,s}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}isZero(){return 0===this.x&&0===this.y&&0===this.z}negate(t){return void 0===t&&(t=new i),t.x=-this.x,t.y=-this.y,t.z=-this.z,t}tangents(t,e){const s=this.length();if(s>0){const i=o,r=1/s;i.set(this.x*r,this.y*r,this.z*r);const a=n;Math.abs(i.x)<.9?(a.set(1,0,0),i.cross(a,t)):(a.set(0,1,0),i.cross(a,t)),i.cross(t,e)}else t.set(1,0,0),e.set(0,1,0)}toString(){return`${this.x},${this.y},${this.z}`}toArray(){return[this.x,this.y,this.z]}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}lerp(t,e,s){const i=this.x,o=this.y,n=this.z;s.x=i+(t.x-i)*e,s.y=o+(t.y-o)*e,s.z=n+(t.z-n)*e}almostEquals(t,e){return void 0===e&&(e=1e-6),!(Math.abs(this.x-t.x)>e||Math.abs(this.y-t.y)>e||Math.abs(this.z-t.z)>e)}almostZero(t){return void 0===t&&(t=1e-6),!(Math.abs(this.x)>t||Math.abs(this.y)>t||Math.abs(this.z)>t)}isAntiparallelTo(t,e){return this.negate(r),r.almostEquals(t,e)}clone(){return new i(this.x,this.y,this.z)}}i.ZERO=new i(0,0,0),i.UNIT_X=new i(1,0,0),i.UNIT_Y=new i(0,1,0),i.UNIT_Z=new i(0,0,1);const o=new i,n=new i,r=new i;class a{constructor(t){void 0===t&&(t={}),this.lowerBound=new i,this.upperBound=new i,t.lowerBound&&this.lowerBound.copy(t.lowerBound),t.upperBound&&this.upperBound.copy(t.upperBound)}setFromPoints(t,e,s,i){const o=this.lowerBound,n=this.upperBound,r=s;o.copy(t[0]),r&&r.vmult(o,o),n.copy(o);for(let e=1;e<t.length;e++){let s=t[e];r&&(r.vmult(s,l),s=l),s.x>n.x&&(n.x=s.x),s.x<o.x&&(o.x=s.x),s.y>n.y&&(n.y=s.y),s.y<o.y&&(o.y=s.y),s.z>n.z&&(n.z=s.z),s.z<o.z&&(o.z=s.z)}return e&&(e.vadd(o,o),e.vadd(n,n)),i&&(o.x-=i,o.y-=i,o.z-=i,n.x+=i,n.y+=i,n.z+=i),this}copy(t){return this.lowerBound.copy(t.lowerBound),this.upperBound.copy(t.upperBound),this}clone(){return(new a).copy(this)}extend(t){this.lowerBound.x=Math.min(this.lowerBound.x,t.lowerBound.x),this.upperBound.x=Math.max(this.upperBound.x,t.upperBound.x),this.lowerBound.y=Math.min(this.lowerBound.y,t.lowerBound.y),this.upperBound.y=Math.max(this.upperBound.y,t.upperBound.y),this.lowerBound.z=Math.min(this.lowerBound.z,t.lowerBound.z),this.upperBound.z=Math.max(this.upperBound.z,t.upperBound.z)}overlaps(t){const e=this.lowerBound,s=this.upperBound,i=t.lowerBound,o=t.upperBound,n=i.x<=s.x&&s.x<=o.x||e.x<=o.x&&o.x<=s.x,r=i.y<=s.y&&s.y<=o.y||e.y<=o.y&&o.y<=s.y,a=i.z<=s.z&&s.z<=o.z||e.z<=o.z&&o.z<=s.z;return n&&r&&a}volume(){const t=this.lowerBound,e=this.upperBound;return(e.x-t.x)*(e.y-t.y)*(e.z-t.z)}contains(t){const e=this.lowerBound,s=this.upperBound,i=t.lowerBound,o=t.upperBound;return e.x<=i.x&&s.x>=o.x&&e.y<=i.y&&s.y>=o.y&&e.z<=i.z&&s.z>=o.z}getCorners(t,e,s,i,o,n,r,a){const l=this.lowerBound,h=this.upperBound;t.copy(l),e.set(h.x,l.y,l.z),s.set(h.x,h.y,l.z),i.set(l.x,h.y,h.z),o.set(h.x,l.y,h.z),n.set(l.x,h.y,l.z),r.set(l.x,l.y,h.z),a.copy(h)}toLocalFrame(t,e){const s=h,i=s[0],o=s[1],n=s[2],r=s[3],a=s[4],l=s[5],c=s[6],d=s[7];this.getCorners(i,o,n,r,a,l,c,d);for(let e=0;8!==e;e++){const i=s[e];t.pointToLocal(i,i)}return e.setFromPoints(s)}toWorldFrame(t,e){const s=h,i=s[0],o=s[1],n=s[2],r=s[3],a=s[4],l=s[5],c=s[6],d=s[7];this.getCorners(i,o,n,r,a,l,c,d);for(let e=0;8!==e;e++){const i=s[e];t.pointToWorld(i,i)}return e.setFromPoints(s)}overlapsRay(t){const{direction:e,from:s}=t,i=1/e.x,o=1/e.y,n=1/e.z,r=(this.lowerBound.x-s.x)*i,a=(this.upperBound.x-s.x)*i,l=(this.lowerBound.y-s.y)*o,h=(this.upperBound.y-s.y)*o,c=(this.lowerBound.z-s.z)*n,d=(this.upperBound.z-s.z)*n,u=Math.max(Math.max(Math.min(r,a),Math.min(l,h)),Math.min(c,d)),p=Math.min(Math.min(Math.max(r,a),Math.max(l,h)),Math.max(c,d));return!(p<0)&&!(u>p)}}const l=new i,h=[new i,new i,new i,new i,new i,new i,new i,new i];class c{constructor(){this.matrix=[]}get(t,e){let{index:s}=t,{index:i}=e;if(i>s){const t=i;i=s,s=t}return this.matrix[(s*(s+1)>>1)+i-1]}set(t,e,s){let{index:i}=t,{index:o}=e;if(o>i){const t=o;o=i,i=t}this.matrix[(i*(i+1)>>1)+o-1]=s?1:0}reset(){for(let t=0,e=this.matrix.length;t!==e;t++)this.matrix[t]=0}setNumObjects(t){this.matrix.length=t*(t-1)>>1}}class d{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const s=this._listeners;return void 0===s[t]&&(s[t]=[]),s[t].includes(e)||s[t].push(e),this}hasEventListener(t,e){if(void 0===this._listeners)return!1;const s=this._listeners;return!(void 0===s[t]||!s[t].includes(e))}hasAnyEventListener(t){if(void 0===this._listeners)return!1;return void 0!==this._listeners[t]}removeEventListener(t,e){if(void 0===this._listeners)return this;const s=this._listeners;if(void 0===s[t])return this;const i=s[t].indexOf(e);return-1!==i&&s[t].splice(i,1),this}dispatchEvent(t){if(void 0===this._listeners)return this;const e=this._listeners[t.type];if(void 0!==e){t.target=this;for(let s=0,i=e.length;s<i;s++)e[s].call(this,t)}return this}}class u{constructor(t,e,s,i){void 0===t&&(t=0),void 0===e&&(e=0),void 0===s&&(s=0),void 0===i&&(i=1),this.x=t,this.y=e,this.z=s,this.w=i}set(t,e,s,i){return this.x=t,this.y=e,this.z=s,this.w=i,this}toString(){return`${this.x},${this.y},${this.z},${this.w}`}toArray(){return[this.x,this.y,this.z,this.w]}setFromAxisAngle(t,e){const s=Math.sin(.5*e);return this.x=t.x*s,this.y=t.y*s,this.z=t.z*s,this.w=Math.cos(.5*e),this}toAxisAngle(t){void 0===t&&(t=new i),this.normalize();const e=2*Math.acos(this.w),s=Math.sqrt(1-this.w*this.w);return s<.001?(t.x=this.x,t.y=this.y,t.z=this.z):(t.x=this.x/s,t.y=this.y/s,t.z=this.z/s),[t,e]}setFromVectors(t,e){if(t.isAntiparallelTo(e)){const e=p,s=y;t.tangents(e,s),this.setFromAxisAngle(e,Math.PI)}else{const s=t.cross(e);this.x=s.x,this.y=s.y,this.z=s.z,this.w=Math.sqrt(t.length()**2*e.length()**2)+t.dot(e),this.normalize()}return this}mult(t,e){void 0===e&&(e=new u);const s=this.x,i=this.y,o=this.z,n=this.w,r=t.x,a=t.y,l=t.z,h=t.w;return e.x=s*h+n*r+i*l-o*a,e.y=i*h+n*a+o*r-s*l,e.z=o*h+n*l+s*a-i*r,e.w=n*h-s*r-i*a-o*l,e}inverse(t){void 0===t&&(t=new u);const e=this.x,s=this.y,i=this.z,o=this.w;this.conjugate(t);const n=1/(e*e+s*s+i*i+o*o);return t.x*=n,t.y*=n,t.z*=n,t.w*=n,t}conjugate(t){return void 0===t&&(t=new u),t.x=-this.x,t.y=-this.y,t.z=-this.z,t.w=this.w,t}normalize(){let t=Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);return 0===t?(this.x=0,this.y=0,this.z=0,this.w=0):(t=1/t,this.x*=t,this.y*=t,this.z*=t,this.w*=t),this}normalizeFast(){const t=(3-(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w))/2;return 0===t?(this.x=0,this.y=0,this.z=0,this.w=0):(this.x*=t,this.y*=t,this.z*=t,this.w*=t),this}vmult(t,e){void 0===e&&(e=new i);const s=t.x,o=t.y,n=t.z,r=this.x,a=this.y,l=this.z,h=this.w,c=h*s+a*n-l*o,d=h*o+l*s-r*n,u=h*n+r*o-a*s,p=-r*s-a*o-l*n;return e.x=c*h+p*-r+d*-l-u*-a,e.y=d*h+p*-a+u*-r-c*-l,e.z=u*h+p*-l+c*-a-d*-r,e}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w,this}toEuler(t,e){let s,i,o;void 0===e&&(e="YZX");const n=this.x,r=this.y,a=this.z,l=this.w;if("YZX"!==e)throw new Error(`Euler order ${e} not supported yet.`);{const t=n*r+a*l;if(t>.499&&(s=2*Math.atan2(n,l),i=Math.PI/2,o=0),t<-.499&&(s=-2*Math.atan2(n,l),i=-Math.PI/2,o=0),void 0===s){const e=n*n,h=r*r,c=a*a;s=Math.atan2(2*r*l-2*n*a,1-2*h-2*c),i=Math.asin(2*t),o=Math.atan2(2*n*l-2*r*a,1-2*e-2*c)}}t.y=s,t.z=i,t.x=o}setFromEuler(t,e,s,i){void 0===i&&(i="XYZ");const o=Math.cos(t/2),n=Math.cos(e/2),r=Math.cos(s/2),a=Math.sin(t/2),l=Math.sin(e/2),h=Math.sin(s/2);return"XYZ"===i?(this.x=a*n*r+o*l*h,this.y=o*l*r-a*n*h,this.z=o*n*h+a*l*r,this.w=o*n*r-a*l*h):"YXZ"===i?(this.x=a*n*r+o*l*h,this.y=o*l*r-a*n*h,this.z=o*n*h-a*l*r,this.w=o*n*r+a*l*h):"ZXY"===i?(this.x=a*n*r-o*l*h,this.y=o*l*r+a*n*h,this.z=o*n*h+a*l*r,this.w=o*n*r-a*l*h):"ZYX"===i?(this.x=a*n*r-o*l*h,this.y=o*l*r+a*n*h,this.z=o*n*h-a*l*r,this.w=o*n*r+a*l*h):"YZX"===i?(this.x=a*n*r+o*l*h,this.y=o*l*r+a*n*h,this.z=o*n*h-a*l*r,this.w=o*n*r-a*l*h):"XZY"===i&&(this.x=a*n*r-o*l*h,this.y=o*l*r-a*n*h,this.z=o*n*h+a*l*r,this.w=o*n*r+a*l*h),this}clone(){return new u(this.x,this.y,this.z,this.w)}slerp(t,e,s){void 0===s&&(s=new u);const i=this.x,o=this.y,n=this.z,r=this.w;let a,l,h,c,d,p=t.x,y=t.y,v=t.z,m=t.w;return l=i*p+o*y+n*v+r*m,l<0&&(l=-l,p=-p,y=-y,v=-v,m=-m),1-l>1e-6?(a=Math.acos(l),h=Math.sin(a),c=Math.sin((1-e)*a)/h,d=Math.sin(e*a)/h):(c=1-e,d=e),s.x=c*i+d*p,s.y=c*o+d*y,s.z=c*n+d*v,s.w=c*r+d*m,s}integrate(t,e,s,i){void 0===i&&(i=new u);const o=t.x*s.x,n=t.y*s.y,r=t.z*s.z,a=this.x,l=this.y,h=this.z,c=this.w,d=.5*e;return i.x+=d*(o*c+n*h-r*l),i.y+=d*(n*c+r*a-o*h),i.z+=d*(r*c+o*l-n*a),i.w+=d*(-o*a-n*l-r*h),i}}const p=new i,y=new i,v={SPHERE:1,PLANE:2,BOX:4,COMPOUND:8,CONVEXPOLYHEDRON:16,HEIGHTFIELD:32,PARTICLE:64,CYLINDER:128,TRIMESH:256};class m{constructor(t){void 0===t&&(t={}),this.id=m.idCounter++,this.type=t.type||0,this.boundingSphereRadius=0,this.collisionResponse=!t.collisionResponse||t.collisionResponse,this.collisionFilterGroup=void 0!==t.collisionFilterGroup?t.collisionFilterGroup:1,this.collisionFilterMask=void 0!==t.collisionFilterMask?t.collisionFilterMask:-1,this.material=t.material?t.material:null,this.body=null}updateBoundingSphereRadius(){throw`computeBoundingSphereRadius() not implemented for shape type ${this.type}`}volume(){throw`volume() not implemented for shape type ${this.type}`}calculateLocalInertia(t,e){throw`calculateLocalInertia() not implemented for shape type ${this.type}`}calculateWorldAABB(t,e,s,i){throw`calculateWorldAABB() not implemented for shape type ${this.type}`}}m.idCounter=0,m.types=v;class g{constructor(t){void 0===t&&(t={}),this.position=new i,this.quaternion=new u,t.position&&this.position.copy(t.position),t.quaternion&&this.quaternion.copy(t.quaternion)}pointToLocal(t,e){return g.pointToLocalFrame(this.position,this.quaternion,t,e)}pointToWorld(t,e){return g.pointToWorldFrame(this.position,this.quaternion,t,e)}vectorToWorldFrame(t,e){return void 0===e&&(e=new i),this.quaternion.vmult(t,e),e}static pointToLocalFrame(t,e,s,o){return void 0===o&&(o=new i),s.vsub(t,o),e.conjugate(w),w.vmult(o,o),o}static pointToWorldFrame(t,e,s,o){return void 0===o&&(o=new i),e.vmult(s,o),o.vadd(t,o),o}static vectorToWorldFrame(t,e,s){return void 0===s&&(s=new i),t.vmult(e,s),s}static vectorToLocalFrame(t,e,s,o){return void 0===o&&(o=new i),e.w*=-1,e.vmult(s,o),e.w*=-1,o}}const w=new u;class f extends m{constructor(t){void 0===t&&(t={});const{vertices:e=[],faces:s=[],normals:i=[],axes:o,boundingSphereRadius:n}=t;super({type:m.types.CONVEXPOLYHEDRON}),this.vertices=e,this.faces=s,this.faceNormals=i,0===this.faceNormals.length&&this.computeNormals(),n?this.boundingSphereRadius=n:this.updateBoundingSphereRadius(),this.worldVertices=[],this.worldVerticesNeedsUpdate=!0,this.worldFaceNormals=[],this.worldFaceNormalsNeedsUpdate=!0,this.uniqueAxes=o?o.slice():null,this.uniqueEdges=[],this.computeEdges()}computeEdges(){const t=this.faces,e=this.vertices,s=this.uniqueEdges;s.length=0;const o=new i;for(let i=0;i!==t.length;i++){const n=t[i],r=n.length;for(let t=0;t!==r;t++){const i=(t+1)%r;e[n[t]].vsub(e[n[i]],o),o.normalize();let a=!1;for(let t=0;t!==s.length;t++)if(s[t].almostEquals(o)||s[t].almostEquals(o)){a=!0;break}a||s.push(o.clone())}}}computeNormals(){this.faceNormals.length=this.faces.length;for(let t=0;t<this.faces.length;t++){for(let e=0;e<this.faces[t].length;e++)if(!this.vertices[this.faces[t][e]])throw new Error(`Vertex ${this.faces[t][e]} not found!`);const e=this.faceNormals[t]||new i;this.getFaceNormal(t,e),e.negate(e),this.faceNormals[t]=e;const s=this.vertices[this.faces[t][0]];if(e.dot(s)<0){console.error(`.faceNormals[${t}] = Vec3(${e.toString()}) looks like it points into the shape? The vertices follow. Make sure they are ordered CCW around the normal, using the right hand rule.`);for(let e=0;e<this.faces[t].length;e++)console.warn(`.vertices[${this.faces[t][e]}] = Vec3(${this.vertices[this.faces[t][e]].toString()})`)}}}getFaceNormal(t,e){const s=this.faces[t],i=this.vertices[s[0]],o=this.vertices[s[1]],n=this.vertices[s[2]];f.computeNormal(i,o,n,e)}static computeNormal(t,e,s,o){const n=new i,r=new i;e.vsub(t,r),s.vsub(e,n),n.cross(r,o),o.isZero()||o.normalize()}clipAgainstHull(t,e,s,o,n,r,a,l,h){const c=new i;let d=-1,u=-Number.MAX_VALUE;for(let t=0;t<s.faces.length;t++){c.copy(s.faceNormals[t]),n.vmult(c,c);const e=c.dot(r);e>u&&(u=e,d=t)}const p=[];for(let t=0;t<s.faces[d].length;t++){const e=s.vertices[s.faces[d][t]],r=new i;r.copy(e),n.vmult(r,r),o.vadd(r,r),p.push(r)}d>=0&&this.clipFaceAgainstHull(r,t,e,p,a,l,h)}findSeparatingAxis(t,e,s,o,n,r,a,l){const h=new i,c=new i,d=new i,u=new i,p=new i,y=new i;let v=Number.MAX_VALUE;const m=this;if(m.uniqueAxes)for(let i=0;i!==m.uniqueAxes.length;i++){s.vmult(m.uniqueAxes[i],h);const a=m.testSepAxis(h,t,e,s,o,n);if(!1===a)return!1;a<v&&(v=a,r.copy(h))}else{const i=a?a.length:m.faces.length;for(let l=0;l<i;l++){const i=a?a[l]:l;h.copy(m.faceNormals[i]),s.vmult(h,h);const c=m.testSepAxis(h,t,e,s,o,n);if(!1===c)return!1;c<v&&(v=c,r.copy(h))}}if(t.uniqueAxes)for(let i=0;i!==t.uniqueAxes.length;i++){n.vmult(t.uniqueAxes[i],c);const a=m.testSepAxis(c,t,e,s,o,n);if(!1===a)return!1;a<v&&(v=a,r.copy(c))}else{const i=l?l.length:t.faces.length;for(let a=0;a<i;a++){const i=l?l[a]:a;c.copy(t.faceNormals[i]),n.vmult(c,c);const h=m.testSepAxis(c,t,e,s,o,n);if(!1===h)return!1;h<v&&(v=h,r.copy(c))}}for(let i=0;i!==m.uniqueEdges.length;i++){s.vmult(m.uniqueEdges[i],u);for(let i=0;i!==t.uniqueEdges.length;i++)if(n.vmult(t.uniqueEdges[i],p),u.cross(p,y),!y.almostZero()){y.normalize();const i=m.testSepAxis(y,t,e,s,o,n);if(!1===i)return!1;i<v&&(v=i,r.copy(y))}}return o.vsub(e,d),d.dot(r)>0&&r.negate(r),!0}testSepAxis(t,e,s,i,o,n){f.project(this,t,s,i,x),f.project(e,t,o,n,b);const r=x[0],a=x[1],l=b[0],h=b[1];if(r<h||l<a)return!1;const c=r-h,d=l-a;return c<d?c:d}calculateLocalInertia(t,e){const s=new i,o=new i;this.computeLocalAABB(o,s);const n=s.x-o.x,r=s.y-o.y,a=s.z-o.z;e.x=1/12*t*(2*r*2*r+2*a*2*a),e.y=1/12*t*(2*n*2*n+2*a*2*a),e.z=1/12*t*(2*r*2*r+2*n*2*n)}getPlaneConstantOfFace(t){const e=this.faces[t],s=this.faceNormals[t],i=this.vertices[e[0]];return-s.dot(i)}clipFaceAgainstHull(t,e,s,o,n,r,a){const l=new i,h=new i,c=new i,d=new i,u=new i,p=new i,y=new i,v=new i,m=this,g=o,w=[];let f=-1,x=Number.MAX_VALUE;for(let e=0;e<m.faces.length;e++){l.copy(m.faceNormals[e]),s.vmult(l,l);const i=l.dot(t);i<x&&(x=i,f=e)}if(f<0)return;const b=m.faces[f];b.connectedFaces=[];for(let t=0;t<m.faces.length;t++)for(let e=0;e<m.faces[t].length;e++)-1!==b.indexOf(m.faces[t][e])&&t!==f&&-1===b.connectedFaces.indexOf(t)&&b.connectedFaces.push(t);const A=b.length;for(let t=0;t<A;t++){const i=m.vertices[b[t]],o=m.vertices[b[(t+1)%A]];i.vsub(o,h),c.copy(h),s.vmult(c,c),e.vadd(c,c),d.copy(this.faceNormals[f]),s.vmult(d,d),e.vadd(d,d),c.cross(d,u),u.negate(u),p.copy(i),s.vmult(p,p),e.vadd(p,p);const n=b.connectedFaces[t];y.copy(this.faceNormals[n]);const r=this.getPlaneConstantOfFace(n);v.copy(y),s.vmult(v,v);const a=r-v.dot(e);for(this.clipFaceAgainstPlane(g,w,v,a);g.length;)g.shift();for(;w.length;)g.push(w.shift())}y.copy(this.faceNormals[f]);const B=this.getPlaneConstantOfFace(f);v.copy(y),s.vmult(v,v);const E=B-v.dot(e);for(let t=0;t<g.length;t++){let e=v.dot(g[t])+E;if(e<=n&&(console.log(`clamped: depth=${e} to minDist=${n}`),e=n),e<=r){const s=g[t];if(e<=1e-6){const t={point:s,normal:v,depth:e};a.push(t)}}}}clipFaceAgainstPlane(t,e,s,o){let n,r;const a=t.length;if(a<2)return e;let l=t[t.length-1],h=t[0];n=s.dot(l)+o;for(let c=0;c<a;c++){if(h=t[c],r=s.dot(h)+o,n<0)if(r<0){const t=new i;t.copy(h),e.push(t)}else{const t=new i;l.lerp(h,n/(n-r),t),e.push(t)}else if(r<0){const t=new i;l.lerp(h,n/(n-r),t),e.push(t),e.push(h)}l=h,n=r}return e}computeWorldVertices(t,e){for(;this.worldVertices.length<this.vertices.length;)this.worldVertices.push(new i);const s=this.vertices,o=this.worldVertices;for(let i=0;i!==this.vertices.length;i++)e.vmult(s[i],o[i]),t.vadd(o[i],o[i]);this.worldVerticesNeedsUpdate=!1}computeLocalAABB(t,e){const s=this.vertices;t.set(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE),e.set(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE);for(let i=0;i<this.vertices.length;i++){const o=s[i];o.x<t.x?t.x=o.x:o.x>e.x&&(e.x=o.x),o.y<t.y?t.y=o.y:o.y>e.y&&(e.y=o.y),o.z<t.z?t.z=o.z:o.z>e.z&&(e.z=o.z)}}computeWorldFaceNormals(t){const e=this.faceNormals.length;for(;this.worldFaceNormals.length<e;)this.worldFaceNormals.push(new i);const s=this.faceNormals,o=this.worldFaceNormals;for(let i=0;i!==e;i++)t.vmult(s[i],o[i]);this.worldFaceNormalsNeedsUpdate=!1}updateBoundingSphereRadius(){let t=0;const e=this.vertices;for(let s=0;s!==e.length;s++){const i=e[s].lengthSquared();i>t&&(t=i)}this.boundingSphereRadius=Math.sqrt(t)}calculateWorldAABB(t,e,s,o){const n=this.vertices;let r,a,l,h,c,d,u=new i;for(let s=0;s<n.length;s++){u.copy(n[s]),e.vmult(u,u),t.vadd(u,u);const i=u;(void 0===r||i.x<r)&&(r=i.x),(void 0===h||i.x>h)&&(h=i.x),(void 0===a||i.y<a)&&(a=i.y),(void 0===c||i.y>c)&&(c=i.y),(void 0===l||i.z<l)&&(l=i.z),(void 0===d||i.z>d)&&(d=i.z)}s.set(r,a,l),o.set(h,c,d)}volume(){return 4*Math.PI*this.boundingSphereRadius/3}getAveragePointLocal(t){void 0===t&&(t=new i);const e=this.vertices;for(let s=0;s<e.length;s++)t.vadd(e[s],t);return t.scale(1/e.length,t),t}transformAllPoints(t,e){const s=this.vertices.length,i=this.vertices;if(e){for(let t=0;t<s;t++){const s=i[t];e.vmult(s,s)}for(let t=0;t<this.faceNormals.length;t++){const s=this.faceNormals[t];e.vmult(s,s)}}if(t)for(let e=0;e<s;e++){const s=i[e];s.vadd(t,s)}}pointIsInside(t){const e=this.vertices,s=this.faces,o=this.faceNormals,n=new i;this.getAveragePointLocal(n);for(let r=0;r<this.faces.length;r++){let a=o[r];const l=e[s[r][0]],h=new i;t.vsub(l,h);const c=a.dot(h),d=new i;n.vsub(l,d);const u=a.dot(d);if(c<0&&u>0||c>0&&u<0)return!1}return-1}static project(t,e,s,i,o){const n=t.vertices.length,r=A;let a=0,l=0;const h=B,c=t.vertices;h.setZero(),g.vectorToLocalFrame(s,i,e,r),g.pointToLocalFrame(s,i,h,h);const d=h.dot(r);l=a=c[0].dot(r);for(let t=1;t<n;t++){const e=c[t].dot(r);e>a&&(a=e),e<l&&(l=e)}if(l-=d,a-=d,l>a){const t=l;l=a,a=t}o[0]=a,o[1]=l}}const x=[],b=[],A=(new i,new i),B=new i;class E extends m{constructor(t){super({type:m.types.BOX}),this.halfExtents=t,this.convexPolyhedronRepresentation=null,this.updateConvexPolyhedronRepresentation(),this.updateBoundingSphereRadius()}updateConvexPolyhedronRepresentation(){const t=this.halfExtents.x,e=this.halfExtents.y,s=this.halfExtents.z,o=i,n=[new o(-t,-e,-s),new o(t,-e,-s),new o(t,e,-s),new o(-t,e,-s),new o(-t,-e,s),new o(t,-e,s),new o(t,e,s),new o(-t,e,s)],r=[new o(0,0,1),new o(0,1,0),new o(1,0,0)],a=new f({vertices:n,faces:[[3,2,1,0],[4,5,6,7],[5,4,0,1],[2,3,7,6],[0,4,7,3],[1,2,6,5]],axes:r});this.convexPolyhedronRepresentation=a,a.material=this.material}calculateLocalInertia(t,e){return void 0===e&&(e=new i),E.calculateInertia(this.halfExtents,t,e),e}static calculateInertia(t,e,s){const i=t;s.x=1/12*e*(2*i.y*2*i.y+2*i.z*2*i.z),s.y=1/12*e*(2*i.x*2*i.x+2*i.z*2*i.z),s.z=1/12*e*(2*i.y*2*i.y+2*i.x*2*i.x)}getSideNormals(t,e){const s=t,i=this.halfExtents;if(s[0].set(i.x,0,0),s[1].set(0,i.y,0),s[2].set(0,0,i.z),s[3].set(-i.x,0,0),s[4].set(0,-i.y,0),s[5].set(0,0,-i.z),void 0!==e)for(let t=0;t!==s.length;t++)e.vmult(s[t],s[t]);return s}volume(){return 8*this.halfExtents.x*this.halfExtents.y*this.halfExtents.z}updateBoundingSphereRadius(){this.boundingSphereRadius=this.halfExtents.length()}forEachWorldCorner(t,e,s){const i=this.halfExtents,o=[[i.x,i.y,i.z],[-i.x,i.y,i.z],[-i.x,-i.y,i.z],[-i.x,-i.y,-i.z],[i.x,-i.y,-i.z],[i.x,i.y,-i.z],[-i.x,i.y,-i.z],[i.x,-i.y,i.z]];for(let i=0;i<o.length;i++)z.set(o[i][0],o[i][1],o[i][2]),e.vmult(z,z),t.vadd(z,z),s(z.x,z.y,z.z)}calculateWorldAABB(t,e,s,i){const o=this.halfExtents;S[0].set(o.x,o.y,o.z),S[1].set(-o.x,o.y,o.z),S[2].set(-o.x,-o.y,o.z),S[3].set(-o.x,-o.y,-o.z),S[4].set(o.x,-o.y,-o.z),S[5].set(o.x,o.y,-o.z),S[6].set(-o.x,o.y,-o.z),S[7].set(o.x,-o.y,o.z);const n=S[0];e.vmult(n,n),t.vadd(n,n),i.copy(n),s.copy(n);for(let o=1;o<8;o++){const n=S[o];e.vmult(n,n),t.vadd(n,n);const r=n.x,a=n.y,l=n.z;r>i.x&&(i.x=r),a>i.y&&(i.y=a),l>i.z&&(i.z=l),r<s.x&&(s.x=r),a<s.y&&(s.y=a),l<s.z&&(s.z=l)}}}const z=new i,S=[new i,new i,new i,new i,new i,new i,new i,new i],C={DYNAMIC:1,STATIC:2,KINEMATIC:4},F={AWAKE:0,SLEEPY:1,SLEEPING:2};class M extends d{constructor(t){void 0===t&&(t={}),super(),this.id=M.idCounter++,this.index=-1,this.world=null,this.vlambda=new i,this.collisionFilterGroup="number"==typeof t.collisionFilterGroup?t.collisionFilterGroup:1,this.collisionFilterMask="number"==typeof t.collisionFilterMask?t.collisionFilterMask:-1,this.collisionResponse="boolean"!=typeof t.collisionResponse||t.collisionResponse,this.position=new i,this.previousPosition=new i,this.interpolatedPosition=new i,this.initPosition=new i,t.position&&(this.position.copy(t.position),this.previousPosition.copy(t.position),this.interpolatedPosition.copy(t.position),this.initPosition.copy(t.position)),this.velocity=new i,t.velocity&&this.velocity.copy(t.velocity),this.initVelocity=new i,this.force=new i;const s="number"==typeof t.mass?t.mass:0;this.mass=s,this.invMass=s>0?1/s:0,this.material=t.material||null,this.linearDamping="number"==typeof t.linearDamping?t.linearDamping:.01,this.type=s<=0?M.STATIC:M.DYNAMIC,typeof t.type==typeof M.STATIC&&(this.type=t.type),this.allowSleep=void 0===t.allowSleep||t.allowSleep,this.sleepState=M.AWAKE,this.sleepSpeedLimit=void 0!==t.sleepSpeedLimit?t.sleepSpeedLimit:.1,this.sleepTimeLimit=void 0!==t.sleepTimeLimit?t.sleepTimeLimit:1,this.timeLastSleepy=0,this.wakeUpAfterNarrowphase=!1,this.torque=new i,this.quaternion=new u,this.initQuaternion=new u,this.previousQuaternion=new u,this.interpolatedQuaternion=new u,t.quaternion&&(this.quaternion.copy(t.quaternion),this.initQuaternion.copy(t.quaternion),this.previousQuaternion.copy(t.quaternion),this.interpolatedQuaternion.copy(t.quaternion)),this.angularVelocity=new i,t.angularVelocity&&this.angularVelocity.copy(t.angularVelocity),this.initAngularVelocity=new i,this.shapes=[],this.shapeOffsets=[],this.shapeOrientations=[],this.inertia=new i,this.invInertia=new i,this.invInertiaWorld=new e,this.invMassSolve=0,this.invInertiaSolve=new i,this.invInertiaWorldSolve=new e,this.fixedRotation=void 0!==t.fixedRotation&&t.fixedRotation,this.angularDamping=void 0!==t.angularDamping?t.angularDamping:.01,this.linearFactor=new i(1,1,1),t.linearFactor&&this.linearFactor.copy(t.linearFactor),this.angularFactor=new i(1,1,1),t.angularFactor&&this.angularFactor.copy(t.angularFactor),this.aabb=new a,this.aabbNeedsUpdate=!0,this.boundingRadius=0,this.wlambda=new i,this.isTrigger=Boolean(t.isTrigger),t.shape&&this.addShape(t.shape),this.updateMassProperties()}wakeUp(){const t=this.sleepState;this.sleepState=M.AWAKE,this.wakeUpAfterNarrowphase=!1,t===M.SLEEPING&&this.dispatchEvent(M.wakeupEvent)}sleep(){this.sleepState=M.SLEEPING,this.velocity.set(0,0,0),this.angularVelocity.set(0,0,0),this.wakeUpAfterNarrowphase=!1}sleepTick(t){if(this.allowSleep){const e=this.sleepState,s=this.velocity.lengthSquared()+this.angularVelocity.lengthSquared(),i=this.sleepSpeedLimit**2;e===M.AWAKE&&s<i?(this.sleepState=M.SLEEPY,this.timeLastSleepy=t,this.dispatchEvent(M.sleepyEvent)):e===M.SLEEPY&&s>i?this.wakeUp():e===M.SLEEPY&&t-this.timeLastSleepy>this.sleepTimeLimit&&(this.sleep(),this.dispatchEvent(M.sleepEvent))}}updateSolveMassProperties(){this.sleepState===M.SLEEPING||this.type===M.KINEMATIC?(this.invMassSolve=0,this.invInertiaSolve.setZero(),this.invInertiaWorldSolve.setZero()):(this.invMassSolve=this.invMass,this.invInertiaSolve.copy(this.invInertia),this.invInertiaWorldSolve.copy(this.invInertiaWorld))}pointToLocalFrame(t,e){return void 0===e&&(e=new i),t.vsub(this.position,e),this.quaternion.conjugate().vmult(e,e),e}vectorToLocalFrame(t,e){return void 0===e&&(e=new i),this.quaternion.conjugate().vmult(t,e),e}pointToWorldFrame(t,e){return void 0===e&&(e=new i),this.quaternion.vmult(t,e),e.vadd(this.position,e),e}vectorToWorldFrame(t,e){return void 0===e&&(e=new i),this.quaternion.vmult(t,e),e}addShape(t,e,s){const o=new i,n=new u;return e&&o.copy(e),s&&n.copy(s),this.shapes.push(t),this.shapeOffsets.push(o),this.shapeOrientations.push(n),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,t.body=this,this}removeShape(t){const e=this.shapes.indexOf(t);return-1===e?(console.warn("Shape does not belong to the body"),this):(this.shapes.splice(e,1),this.shapeOffsets.splice(e,1),this.shapeOrientations.splice(e,1),this.updateMassProperties(),this.updateBoundingRadius(),this.aabbNeedsUpdate=!0,t.body=null,this)}updateBoundingRadius(){const t=this.shapes,e=this.shapeOffsets,s=t.length;let i=0;for(let o=0;o!==s;o++){const s=t[o];s.updateBoundingSphereRadius();const n=e[o].length(),r=s.boundingSphereRadius;n+r>i&&(i=n+r)}this.boundingRadius=i}updateAABB(){const t=this.shapes,e=this.shapeOffsets,s=this.shapeOrientations,i=t.length,o=R,n=I,r=this.quaternion,a=this.aabb,l=T;for(let h=0;h!==i;h++){const i=t[h];r.vmult(e[h],o),o.vadd(this.position,o),r.mult(s[h],n),i.calculateWorldAABB(o,n,l.lowerBound,l.upperBound),0===h?a.copy(l):a.extend(l)}this.aabbNeedsUpdate=!1}updateInertiaWorld(t){const e=this.invInertia;if(e.x!==e.y||e.y!==e.z||t){const t=P,s=q;t.setRotationFromQuaternion(this.quaternion),t.transpose(s),t.scale(e,t),t.mmult(s,this.invInertiaWorld)}else;}applyForce(t,e){if(void 0===e&&(e=new i),this.type!==M.DYNAMIC)return;this.sleepState===M.SLEEPING&&this.wakeUp();const s=N;e.cross(t,s),this.force.vadd(t,this.force),this.torque.vadd(s,this.torque)}applyLocalForce(t,e){if(void 0===e&&(e=new i),this.type!==M.DYNAMIC)return;const s=L,o=W;this.vectorToWorldFrame(t,s),this.vectorToWorldFrame(e,o),this.applyForce(s,o)}applyTorque(t){this.type===M.DYNAMIC&&(this.sleepState===M.SLEEPING&&this.wakeUp(),this.torque.vadd(t,this.torque))}applyImpulse(t,e){if(void 0===e&&(e=new i),this.type!==M.DYNAMIC)return;this.sleepState===M.SLEEPING&&this.wakeUp();const s=e,o=V;o.copy(t),o.scale(this.invMass,o),this.velocity.vadd(o,this.velocity);const n=j;s.cross(t,n),this.invInertiaWorld.vmult(n,n),this.angularVelocity.vadd(n,this.angularVelocity)}applyLocalImpulse(t,e){if(void 0===e&&(e=new i),this.type!==M.DYNAMIC)return;const s=O,o=k;this.vectorToWorldFrame(t,s),this.vectorToWorldFrame(e,o),this.applyImpulse(s,o)}updateMassProperties(){const t=H;this.invMass=this.mass>0?1/this.mass:0;const e=this.inertia,s=this.fixedRotation;this.updateAABB(),t.set((this.aabb.upperBound.x-this.aabb.lowerBound.x)/2,(this.aabb.upperBound.y-this.aabb.lowerBound.y)/2,(this.aabb.upperBound.z-this.aabb.lowerBound.z)/2),E.calculateInertia(t,this.mass,e),this.invInertia.set(e.x>0&&!s?1/e.x:0,e.y>0&&!s?1/e.y:0,e.z>0&&!s?1/e.z:0),this.updateInertiaWorld(!0)}getVelocityAtWorldPoint(t,e){const s=new i;return t.vsub(this.position,s),this.angularVelocity.cross(s,e),this.velocity.vadd(e,e),e}integrate(t,e,s){if(this.previousPosition.copy(this.position),this.previousQuaternion.copy(this.quaternion),this.type!==M.DYNAMIC&&this.type!==M.KINEMATIC||this.sleepState===M.SLEEPING)return;const i=this.velocity,o=this.angularVelocity,n=this.position,r=this.force,a=this.torque,l=this.quaternion,h=this.invMass,c=this.invInertiaWorld,d=this.linearFactor,u=h*t;i.x+=r.x*u*d.x,i.y+=r.y*u*d.y,i.z+=r.z*u*d.z;const p=c.elements,y=this.angularFactor,v=a.x*y.x,m=a.y*y.y,g=a.z*y.z;o.x+=t*(p[0]*v+p[1]*m+p[2]*g),o.y+=t*(p[3]*v+p[4]*m+p[5]*g),o.z+=t*(p[6]*v+p[7]*m+p[8]*g),n.x+=i.x*t,n.y+=i.y*t,n.z+=i.z*t,l.integrate(this.angularVelocity,t,this.angularFactor,l),e&&(s?l.normalizeFast():l.normalize()),this.aabbNeedsUpdate=!0,this.updateInertiaWorld()}}M.idCounter=0,M.COLLIDE_EVENT_NAME="collide",M.DYNAMIC=C.DYNAMIC,M.STATIC=C.STATIC,M.KINEMATIC=C.KINEMATIC,M.AWAKE=F.AWAKE,M.SLEEPY=F.SLEEPY,M.SLEEPING=F.SLEEPING,M.wakeupEvent={type:"wakeup"},M.sleepyEvent={type:"sleepy"},M.sleepEvent={type:"sleep"};const R=new i,I=new u,T=new a,P=new e,q=new e,N=(new e,new i),L=new i,W=new i,V=new i,j=new i,O=new i,k=new i,H=new i;class _{constructor(){this.world=null,this.useBoundingBoxes=!1,this.dirty=!0}collisionPairs(t,e,s){throw new Error("collisionPairs not implemented for this BroadPhase class!")}needBroadphaseCollision(t,e){return 0!=(t.collisionFilterGroup&e.collisionFilterMask)&&0!=(e.collisionFilterGroup&t.collisionFilterMask)&&(0==(t.type&M.STATIC)&&t.sleepState!==M.SLEEPING||0==(e.type&M.STATIC)&&e.sleepState!==M.SLEEPING)}intersectionTest(t,e,s,i){this.useBoundingBoxes?this.doBoundingBoxBroadphase(t,e,s,i):this.doBoundingSphereBroadphase(t,e,s,i)}doBoundingSphereBroadphase(t,e,s,i){const o=U;e.position.vsub(t.position,o);const n=(t.boundingRadius+e.boundingRadius)**2;o.lengthSquared()<n&&(s.push(t),i.push(e))}doBoundingBoxBroadphase(t,e,s,i){t.aabbNeedsUpdate&&t.updateAABB(),e.aabbNeedsUpdate&&e.updateAABB(),t.aabb.overlaps(e.aabb)&&(s.push(t),i.push(e))}makePairsUnique(t,e){const s=D,i=G,o=Y,n=t.length;for(let s=0;s!==n;s++)i[s]=t[s],o[s]=e[s];t.length=0,e.length=0;for(let t=0;t!==n;t++){const e=i[t].id,n=o[t].id,r=e<n?`${e},${n}`:`${n},${e}`;s[r]=t,s.keys.push(r)}for(let n=0;n!==s.keys.length;n++){const n=s.keys.pop(),r=s[n];t.push(i[r]),e.push(o[r]),delete s[n]}}setWorld(t){}static boundingSphereCheck(t,e){const s=new i;t.position.vsub(e.position,s);const o=t.shapes[0],n=e.shapes[0];return Math.pow(o.boundingSphereRadius+n.boundingSphereRadius,2)>s.lengthSquared()}aabbQuery(t,e,s){return console.warn(".aabbQuery is not implemented in this Broadphase subclass."),[]}}const U=new i;new i,new u,new i;const D={keys:[]},G=[],Y=[];new i;class X extends _{constructor(t,e,s,o,n){void 0===t&&(t=new i(100,100,100)),void 0===e&&(e=new i(-100,-100,-100)),void 0===s&&(s=10),void 0===o&&(o=10),void 0===n&&(n=10),super(),this.nx=s,this.ny=o,this.nz=n,this.aabbMin=t,this.aabbMax=e;const r=this.nx*this.ny*this.nz;if(r<=0)throw"GridBroadphase: Each dimension's n must be >0";this.bins=[],this.binLengths=[],this.bins.length=r,this.binLengths.length=r;for(let t=0;t<r;t++)this.bins[t]=[],this.binLengths[t]=0}collisionPairs(t,e,s){const i=t.bodies.length,o=t.bodies,n=this.aabbMax,r=this.aabbMin,a=this.nx,l=this.ny,h=this.nz,c=l*h,d=h,u=n.x,p=n.y,y=n.z,v=r.x,g=r.y,w=r.z,f=a/(u-v),x=l/(p-g),b=h/(y-w),A=(u-v)/a,B=(p-g)/l,E=(y-w)/h,z=.5*Math.sqrt(A*A+B*B+E*E),S=m.types,C=S.SPHERE,F=S.PLANE;S.BOX,S.COMPOUND,S.CONVEXPOLYHEDRON;const M=this.bins,R=this.binLengths,I=this.bins.length;for(let t=0;t!==I;t++)R[t]=0;const T=Math.ceil;function P(t,e,s,i,o,n,r){let u=(t-v)*f|0,p=(e-g)*x|0,y=(s-w)*b|0,m=T((i-v)*f),A=T((o-g)*x),B=T((n-w)*b);u<0?u=0:u>=a&&(u=a-1),p<0?p=0:p>=l&&(p=l-1),y<0?y=0:y>=h&&(y=h-1),m<0?m=0:m>=a&&(m=a-1),A<0?A=0:A>=l&&(A=l-1),B<0?B=0:B>=h&&(B=h-1),u*=c,p*=d,y*=1,m*=c,A*=d,B*=1;for(let t=u;t<=m;t+=c)for(let e=p;e<=A;e+=d)for(let s=y;s<=B;s+=1){const i=t+e+s;M[i][R[i]++]=r}}for(let t=0;t!==i;t++){const e=o[t],s=e.shapes[0];switch(s.type){case C:{const t=s,i=e.position.x,o=e.position.y,n=e.position.z,r=t.radius;P(i-r,o-r,n-r,i+r,o+r,n+r,e);break}case F:{const t=s;t.worldNormalNeedsUpdate&&t.computeWorldNormal(e.quaternion);const i=t.worldNormal,o=v+.5*A-e.position.x,n=g+.5*B-e.position.y,r=w+.5*E-e.position.z,u=$;u.set(o,n,r);for(let t=0,s=0;t!==a;t++,s+=c,u.y=n,u.x+=A)for(let t=0,o=0;t!==l;t++,o+=d,u.z=r,u.y+=B)for(let t=0,n=0;t!==h;t++,n+=1,u.z+=E)if(u.dot(i)<z){const t=s+o+n;M[t][R[t]++]=e}break}default:e.aabbNeedsUpdate&&e.updateAABB(),P(e.aabb.lowerBound.x,e.aabb.lowerBound.y,e.aabb.lowerBound.z,e.aabb.upperBound.x,e.aabb.upperBound.y,e.aabb.upperBound.z,e)}}for(let t=0;t!==I;t++){const i=R[t];if(i>1){const o=M[t];for(let t=0;t!==i;t++){const i=o[t];for(let n=0;n!==t;n++){const t=o[n];this.needBroadphaseCollision(i,t)&&this.intersectionTest(i,t,e,s)}}}}this.makePairsUnique(e,s)}}const $=new i;new i;class K extends _{constructor(){super()}collisionPairs(t,e,s){const i=t.bodies,o=i.length;let n,r;for(let t=0;t!==o;t++)for(let o=0;o!==t;o++)n=i[t],r=i[o],this.needBroadphaseCollision(n,r)&&this.intersectionTest(n,r,e,s)}aabbQuery(t,e,s){void 0===s&&(s=[]);for(let i=0;i<t.bodies.length;i++){const o=t.bodies[i];o.aabbNeedsUpdate&&o.updateAABB(),o.aabb.overlaps(e)&&s.push(o)}return s}}class Z{constructor(){this.rayFromWorld=new i,this.rayToWorld=new i,this.hitNormalWorld=new i,this.hitPointWorld=new i,this.hasHit=!1,this.shape=null,this.body=null,this.hitFaceIndex=-1,this.distance=-1,this.shouldStop=!1}reset(){this.rayFromWorld.setZero(),this.rayToWorld.setZero(),this.hitNormalWorld.setZero(),this.hitPointWorld.setZero(),this.hasHit=!1,this.shape=null,this.body=null,this.hitFaceIndex=-1,this.distance=-1,this.shouldStop=!1}abort(){this.shouldStop=!0}set(t,e,s,i,o,n,r){this.rayFromWorld.copy(t),this.rayToWorld.copy(e),this.hitNormalWorld.copy(s),this.hitPointWorld.copy(i),this.shape=o,this.body=n,this.distance=r}}let Q,J,tt,et,st,it,ot;const nt={CLOSEST:1,ANY:2,ALL:4};Q=m.types.SPHERE,J=m.types.PLANE,tt=m.types.BOX,et=m.types.CYLINDER,st=m.types.CONVEXPOLYHEDRON,it=m.types.HEIGHTFIELD,ot=m.types.TRIMESH;class rt{get[Q](){return this._intersectSphere}get[J](){return this._intersectPlane}get[tt](){return this._intersectBox}get[et](){return this._intersectConvex}get[st](){return this._intersectConvex}get[it](){return this._intersectHeightfield}get[ot](){return this._intersectTrimesh}constructor(t,e){void 0===t&&(t=new i),void 0===e&&(e=new i),this.from=t.clone(),this.to=e.clone(),this.direction=new i,this.precision=1e-4,this.checkCollisionResponse=!0,this.skipBackfaces=!1,this.collisionFilterMask=-1,this.collisionFilterGroup=-1,this.mode=rt.ANY,this.result=new Z,this.hasHit=!1,this.callback=t=>{}}intersectWorld(t,e){return this.mode=e.mode||rt.ANY,this.result=e.result||new Z,this.skipBackfaces=!!e.skipBackfaces,this.collisionFilterMask=void 0!==e.collisionFilterMask?e.collisionFilterMask:-1,this.collisionFilterGroup=void 0!==e.collisionFilterGroup?e.collisionFilterGroup:-1,this.checkCollisionResponse=void 0===e.checkCollisionResponse||e.checkCollisionResponse,e.from&&this.from.copy(e.from),e.to&&this.to.copy(e.to),this.callback=e.callback||(()=>{}),this.hasHit=!1,this.result.reset(),this.updateDirection(),this.getAABB(at),lt.length=0,t.broadphase.aabbQuery(t,at,lt),this.intersectBodies(lt),this.hasHit}intersectBody(t,e){e&&(this.result=e,this.updateDirection());const s=this.checkCollisionResponse;if(s&&!t.collisionResponse)return;if(0==(this.collisionFilterGroup&t.collisionFilterMask)||0==(t.collisionFilterGroup&this.collisionFilterMask))return;const i=dt,o=ut;for(let e=0,n=t.shapes.length;e<n;e++){const n=t.shapes[e];if((!s||n.collisionResponse)&&(t.quaternion.mult(t.shapeOrientations[e],o),t.quaternion.vmult(t.shapeOffsets[e],i),i.vadd(t.position,i),this.intersectShape(n,o,i,t),this.result.shouldStop))break}}intersectBodies(t,e){e&&(this.result=e,this.updateDirection());for(let e=0,s=t.length;!this.result.shouldStop&&e<s;e++)this.intersectBody(t[e])}updateDirection(){this.to.vsub(this.from,this.direction),this.direction.normalize()}intersectShape(t,e,s,i){const o=function(t,e,s){s.vsub(t,Pt);const i=Pt.dot(e);e.scale(i,qt),qt.vadd(t,qt);const o=s.distanceTo(qt);return o}(this.from,this.direction,s);if(o>t.boundingSphereRadius)return;const n=this[t.type];n&&n.call(this,t,e,s,i,t)}_intersectBox(t,e,s,i,o){return this._intersectConvex(t.convexPolyhedronRepresentation,e,s,i,o)}_intersectPlane(t,e,s,o,n){const r=this.from,a=this.to,l=this.direction,h=new i(0,0,1);e.vmult(h,h);const c=new i;r.vsub(s,c);const d=c.dot(h);a.vsub(s,c);if(d*c.dot(h)>0)return;if(r.distanceTo(a)<d)return;const u=h.dot(l);if(Math.abs(u)<this.precision)return;const p=new i,y=new i,v=new i;r.vsub(s,p);const m=-h.dot(p)/u;l.scale(m,y),r.vadd(y,v),this.reportIntersection(h,v,n,o,-1)}getAABB(t){const{lowerBound:e,upperBound:s}=t,i=this.to,o=this.from;e.x=Math.min(i.x,o.x),e.y=Math.min(i.y,o.y),e.z=Math.min(i.z,o.z),s.x=Math.max(i.x,o.x),s.y=Math.max(i.y,o.y),s.z=Math.max(i.z,o.z)}_intersectHeightfield(t,e,s,i,o){t.data,t.elementSize;const n=ft;n.from.copy(this.from),n.to.copy(this.to),g.pointToLocalFrame(s,e,n.from,n.from),g.pointToLocalFrame(s,e,n.to,n.to),n.updateDirection();const r=xt;let l,h,c,d;l=h=0,c=d=t.data.length-1;const u=new a;n.getAABB(u),t.getIndexOfPosition(u.lowerBound.x,u.lowerBound.y,r,!0),l=Math.max(l,r[0]),h=Math.max(h,r[1]),t.getIndexOfPosition(u.upperBound.x,u.upperBound.y,r,!0),c=Math.min(c,r[0]+1),d=Math.min(d,r[1]+1);for(let r=l;r<c;r++)for(let a=h;a<d;a++){if(this.result.shouldStop)return;if(t.getAabbAtIndex(r,a,u),u.overlapsRay(n)){if(t.getConvexTrianglePillar(r,a,!1),g.pointToWorldFrame(s,e,t.pillarOffset,wt),this._intersectConvex(t.pillarConvex,e,wt,i,o,gt),this.result.shouldStop)return;t.getConvexTrianglePillar(r,a,!0),g.pointToWorldFrame(s,e,t.pillarOffset,wt),this._intersectConvex(t.pillarConvex,e,wt,i,o,gt)}}}_intersectSphere(t,e,s,i,o){const n=this.from,r=this.to,a=t.radius,l=(r.x-n.x)**2+(r.y-n.y)**2+(r.z-n.z)**2,h=2*((r.x-n.x)*(n.x-s.x)+(r.y-n.y)*(n.y-s.y)+(r.z-n.z)*(n.z-s.z)),c=h**2-4*l*((n.x-s.x)**2+(n.y-s.y)**2+(n.z-s.z)**2-a**2),d=bt,u=At;if(!(c<0))if(0===c)n.lerp(r,c,d),d.vsub(s,u),u.normalize(),this.reportIntersection(u,d,o,i,-1);else{const t=(-h-Math.sqrt(c))/(2*l),e=(-h+Math.sqrt(c))/(2*l);if(t>=0&&t<=1&&(n.lerp(r,t,d),d.vsub(s,u),u.normalize(),this.reportIntersection(u,d,o,i,-1)),this.result.shouldStop)return;e>=0&&e<=1&&(n.lerp(r,e,d),d.vsub(s,u),u.normalize(),this.reportIntersection(u,d,o,i,-1))}}_intersectConvex(t,e,s,i,o,n){const r=Bt,a=Et,l=n&&n.faceList||null,h=t.faces,c=t.vertices,d=t.faceNormals,u=this.direction,p=this.from,y=this.to,v=p.distanceTo(y),m=l?l.length:h.length,g=this.result;for(let t=0;!g.shouldStop&&t<m;t++){const n=l?l[t]:t,y=h[n],m=d[n],w=e,f=s;a.copy(c[y[0]]),w.vmult(a,a),a.vadd(f,a),a.vsub(p,a),w.vmult(m,r);const x=u.dot(r);if(Math.abs(x)<this.precision)continue;const b=r.dot(a)/x;if(!(b<0)){u.scale(b,pt),pt.vadd(p,pt),yt.copy(c[y[0]]),w.vmult(yt,yt),f.vadd(yt,yt);for(let t=1;!g.shouldStop&&t<y.length-1;t++){vt.copy(c[y[t]]),mt.copy(c[y[t+1]]),w.vmult(vt,vt),w.vmult(mt,mt),f.vadd(vt,vt),f.vadd(mt,mt);const e=pt.distanceTo(p);!rt.pointInTriangle(pt,yt,vt,mt)&&!rt.pointInTriangle(pt,vt,yt,mt)||e>v||this.reportIntersection(r,pt,o,i,n)}}}}_intersectTrimesh(t,e,s,i,o,n){const r=zt,a=It,l=Tt,h=Et,c=St,d=Ct,u=Ft,p=Rt,y=Mt,v=t.indices;t.vertices;const m=this.from,w=this.to,f=this.direction;l.position.copy(s),l.quaternion.copy(e),g.vectorToLocalFrame(s,e,f,c),g.pointToLocalFrame(s,e,m,d),g.pointToLocalFrame(s,e,w,u),u.x*=t.scale.x,u.y*=t.scale.y,u.z*=t.scale.z,d.x*=t.scale.x,d.y*=t.scale.y,d.z*=t.scale.z,u.vsub(d,c),c.normalize();const x=d.distanceSquared(u);t.tree.rayQuery(this,l,a);for(let n=0,l=a.length;!this.result.shouldStop&&n!==l;n++){const l=a[n];t.getNormal(l,r),t.getVertex(v[3*l],yt),yt.vsub(d,h);const u=c.dot(r),m=r.dot(h)/u;if(m<0)continue;c.scale(m,pt),pt.vadd(d,pt),t.getVertex(v[3*l+1],vt),t.getVertex(v[3*l+2],mt);const w=pt.distanceSquared(d);!rt.pointInTriangle(pt,vt,yt,mt)&&!rt.pointInTriangle(pt,yt,vt,mt)||w>x||(g.vectorToWorldFrame(e,r,y),g.pointToWorldFrame(s,e,pt,p),this.reportIntersection(y,p,o,i,l))}a.length=0}reportIntersection(t,e,s,i,o){const n=this.from,r=this.to,a=n.distanceTo(e),l=this.result;if(!(this.skipBackfaces&&t.dot(this.direction)>0))switch(l.hitFaceIndex=void 0!==o?o:-1,this.mode){case rt.ALL:this.hasHit=!0,l.set(n,r,t,e,s,i,a),l.hasHit=!0,this.callback(l);break;case rt.CLOSEST:(a<l.distance||!l.hasHit)&&(this.hasHit=!0,l.hasHit=!0,l.set(n,r,t,e,s,i,a));break;case rt.ANY:this.hasHit=!0,l.hasHit=!0,l.set(n,r,t,e,s,i,a),l.shouldStop=!0}}static pointInTriangle(t,e,s,i){i.vsub(e,Pt),s.vsub(e,ht),t.vsub(e,ct);const o=Pt.dot(Pt),n=Pt.dot(ht),r=Pt.dot(ct),a=ht.dot(ht),l=ht.dot(ct);let h,c;return(h=a*r-n*l)>=0&&(c=o*l-n*r)>=0&&h+c<o*a-n*n}}rt.CLOSEST=nt.CLOSEST,rt.ANY=nt.ANY,rt.ALL=nt.ALL;const at=new a,lt=[],ht=new i,ct=new i,dt=new i,ut=new u,pt=new i,yt=new i,vt=new i,mt=new i;new i,new Z;const gt={faceList:[0]},wt=new i,ft=new rt,xt=[],bt=new i,At=new i,Bt=new i,Et=(new i,new i,new i),zt=new i,St=new i,Ct=new i,Ft=new i,Mt=new i,Rt=new i;new a;const It=[],Tt=new g,Pt=new i,qt=new i;class Nt extends _{static checkBounds(t,e,s){let i,o;0===s?(i=t.position.x,o=e.position.x):1===s?(i=t.position.y,o=e.position.y):2===s&&(i=t.position.z,o=e.position.z);const n=t.boundingRadius;return o-e.boundingRadius<i+n}static insertionSortX(t){for(let e=1,s=t.length;e<s;e++){const s=t[e];let i;for(i=e-1;i>=0&&!(t[i].aabb.lowerBound.x<=s.aabb.lowerBound.x);i--)t[i+1]=t[i];t[i+1]=s}return t}static insertionSortY(t){for(let e=1,s=t.length;e<s;e++){const s=t[e];let i;for(i=e-1;i>=0&&!(t[i].aabb.lowerBound.y<=s.aabb.lowerBound.y);i--)t[i+1]=t[i];t[i+1]=s}return t}static insertionSortZ(t){for(let e=1,s=t.length;e<s;e++){const s=t[e];let i;for(i=e-1;i>=0&&!(t[i].aabb.lowerBound.z<=s.aabb.lowerBound.z);i--)t[i+1]=t[i];t[i+1]=s}return t}constructor(t){super(),this.axisList=[],this.world=null,this.axisIndex=0;const e=this.axisList;this._addBodyHandler=t=>{e.push(t.body)},this._removeBodyHandler=t=>{const s=e.indexOf(t.body);-1!==s&&e.splice(s,1)},t&&this.setWorld(t)}setWorld(t){this.axisList.length=0;for(let e=0;e<t.bodies.length;e++)this.axisList.push(t.bodies[e]);t.removeEventListener("addBody",this._addBodyHandler),t.removeEventListener("removeBody",this._removeBodyHandler),t.addEventListener("addBody",this._addBodyHandler),t.addEventListener("removeBody",this._removeBodyHandler),this.world=t,this.dirty=!0}collisionPairs(t,e,s){const i=this.axisList,o=i.length,n=this.axisIndex;let r,a;for(this.dirty&&(this.sortList(),this.dirty=!1),r=0;r!==o;r++){const t=i[r];for(a=r+1;a<o;a++){const o=i[a];if(this.needBroadphaseCollision(t,o)){if(!Nt.checkBounds(t,o,n))break;this.intersectionTest(t,o,e,s)}}}}sortList(){const t=this.axisList,e=this.axisIndex,s=t.length;for(let e=0;e!==s;e++){const s=t[e];s.aabbNeedsUpdate&&s.updateAABB()}0===e?Nt.insertionSortX(t):1===e?Nt.insertionSortY(t):2===e&&Nt.insertionSortZ(t)}autoDetectAxis(){let t=0,e=0,s=0,i=0,o=0,n=0;const r=this.axisList,a=r.length,l=1/a;for(let l=0;l!==a;l++){const a=r[l],h=a.position.x;t+=h,e+=h*h;const c=a.position.y;s+=c,i+=c*c;const d=a.position.z;o+=d,n+=d*d}const h=e-t*t*l,c=i-s*s*l,d=n-o*o*l;this.axisIndex=h>c?h>d?0:2:c>d?1:2}aabbQuery(t,e,s){void 0===s&&(s=[]),this.dirty&&(this.sortList(),this.dirty=!1);const i=this.axisIndex;let o="x";1===i&&(o="y"),2===i&&(o="z");const n=this.axisList;e.lowerBound[o],e.upperBound[o];for(let t=0;t<n.length;t++){const i=n[t];i.aabbNeedsUpdate&&i.updateAABB(),i.aabb.overlaps(e)&&s.push(i)}return s}}class Lt{static defaults(t,e){void 0===t&&(t={});for(let s in e)s in t||(t[s]=e[s]);return t}}class Wt{constructor(t,e,s){void 0===s&&(s={}),s=Lt.defaults(s,{collideConnected:!0,wakeUpBodies:!0}),this.equations=[],this.bodyA=t,this.bodyB=e,this.id=Wt.idCounter++,this.collideConnected=s.collideConnected,s.wakeUpBodies&&(t&&t.wakeUp(),e&&e.wakeUp())}update(){throw new Error("method update() not implmemented in this Constraint subclass!")}enable(){const t=this.equations;for(let e=0;e<t.length;e++)t[e].enabled=!0}disable(){const t=this.equations;for(let e=0;e<t.length;e++)t[e].enabled=!1}}Wt.idCounter=0;class Vt{constructor(){this.spatial=new i,this.rotational=new i}multiplyElement(t){return t.spatial.dot(this.spatial)+t.rotational.dot(this.rotational)}multiplyVectors(t,e){return t.dot(this.spatial)+e.dot(this.rotational)}}class jt{constructor(t,e,s,i){void 0===s&&(s=-1e6),void 0===i&&(i=1e6),this.id=jt.idCounter++,this.minForce=s,this.maxForce=i,this.bi=t,this.bj=e,this.a=0,this.b=0,this.eps=0,this.jacobianElementA=new Vt,this.jacobianElementB=new Vt,this.enabled=!0,this.multiplier=0,this.setSpookParams(1e7,4,1/60)}setSpookParams(t,e,s){const i=e,o=t,n=s;this.a=4/(n*(1+4*i)),this.b=4*i/(1+4*i),this.eps=4/(n*n*o*(1+4*i))}computeB(t,e,s){const i=this.computeGW();return-this.computeGq()*t-i*e-this.computeGiMf()*s}computeGq(){const t=this.jacobianElementA,e=this.jacobianElementB,s=this.bi,i=this.bj,o=s.position,n=i.position;return t.spatial.dot(o)+e.spatial.dot(n)}computeGW(){const t=this.jacobianElementA,e=this.jacobianElementB,s=this.bi,i=this.bj,o=s.velocity,n=i.velocity,r=s.angularVelocity,a=i.angularVelocity;return t.multiplyVectors(o,r)+e.multiplyVectors(n,a)}computeGWlambda(){const t=this.jacobianElementA,e=this.jacobianElementB,s=this.bi,i=this.bj,o=s.vlambda,n=i.vlambda,r=s.wlambda,a=i.wlambda;return t.multiplyVectors(o,r)+e.multiplyVectors(n,a)}computeGiMf(){const t=this.jacobianElementA,e=this.jacobianElementB,s=this.bi,i=this.bj,o=s.force,n=s.torque,r=i.force,a=i.torque,l=s.invMassSolve,h=i.invMassSolve;return o.scale(l,Ot),r.scale(h,kt),s.invInertiaWorldSolve.vmult(n,Ht),i.invInertiaWorldSolve.vmult(a,_t),t.multiplyVectors(Ot,Ht)+e.multiplyVectors(kt,_t)}computeGiMGt(){const t=this.jacobianElementA,e=this.jacobianElementB,s=this.bi,i=this.bj,o=s.invMassSolve,n=i.invMassSolve,r=s.invInertiaWorldSolve,a=i.invInertiaWorldSolve;let l=o+n;return r.vmult(t.rotational,Ut),l+=Ut.dot(t.rotational),a.vmult(e.rotational,Ut),l+=Ut.dot(e.rotational),l}addToWlambda(t){const e=this.jacobianElementA,s=this.jacobianElementB,i=this.bi,o=this.bj,n=Dt;i.vlambda.addScaledVector(i.invMassSolve*t,e.spatial,i.vlambda),o.vlambda.addScaledVector(o.invMassSolve*t,s.spatial,o.vlambda),i.invInertiaWorldSolve.vmult(e.rotational,n),i.wlambda.addScaledVector(t,n,i.wlambda),o.invInertiaWorldSolve.vmult(s.rotational,n),o.wlambda.addScaledVector(t,n,o.wlambda)}computeC(){return this.computeGiMGt()+this.eps}}jt.idCounter=0;const Ot=new i,kt=new i,Ht=new i,_t=new i,Ut=new i,Dt=new i;class Gt extends jt{constructor(t,e,s){void 0===s&&(s=1e6),super(t,e,0,s),this.restitution=0,this.ri=new i,this.rj=new i,this.ni=new i}computeB(t){const e=this.a,s=this.b,i=this.bi,o=this.bj,n=this.ri,r=this.rj,a=Yt,l=Xt,h=i.velocity,c=i.angularVelocity;i.force,i.torque;const d=o.velocity,u=o.angularVelocity;o.force,o.torque;const p=$t,y=this.jacobianElementA,v=this.jacobianElementB,m=this.ni;n.cross(m,a),r.cross(m,l),m.negate(y.spatial),a.negate(y.rotational),v.spatial.copy(m),v.rotational.copy(l),p.copy(o.position),p.vadd(r,p),p.vsub(i.position,p),p.vsub(n,p);const g=m.dot(p),w=this.restitution+1;return-g*e-(w*d.dot(m)-w*h.dot(m)+u.dot(l)-c.dot(a))*s-t*this.computeGiMf()}getImpactVelocityAlongNormal(){const t=Kt,e=Zt,s=Qt,i=Jt,o=te;return this.bi.position.vadd(this.ri,s),this.bj.position.vadd(this.rj,i),this.bi.getVelocityAtWorldPoint(s,t),this.bj.getVelocityAtWorldPoint(i,e),t.vsub(e,o),this.ni.dot(o)}}const Yt=new i,Xt=new i,$t=new i,Kt=new i,Zt=new i,Qt=new i,Jt=new i,te=new i;class ee extends Wt{constructor(t,e,s,o,n){void 0===e&&(e=new i),void 0===o&&(o=new i),void 0===n&&(n=1e6),super(t,s),this.pivotA=e.clone(),this.pivotB=o.clone();const r=this.equationX=new Gt(t,s),a=this.equationY=new Gt(t,s),l=this.equationZ=new Gt(t,s);this.equations.push(r,a,l),r.minForce=a.minForce=l.minForce=-n,r.maxForce=a.maxForce=l.maxForce=n,r.ni.set(1,0,0),a.ni.set(0,1,0),l.ni.set(0,0,1)}update(){const t=this.bodyA,e=this.bodyB,s=this.equationX,i=this.equationY,o=this.equationZ;t.quaternion.vmult(this.pivotA,s.ri),e.quaternion.vmult(this.pivotB,s.rj),i.ri.copy(s.ri),i.rj.copy(s.rj),o.ri.copy(s.ri),o.rj.copy(s.rj)}}class se extends jt{constructor(t,e,s){void 0===s&&(s={});const o=void 0!==s.maxForce?s.maxForce:1e6;super(t,e,-o,o),this.axisA=s.axisA?s.axisA.clone():new i(1,0,0),this.axisB=s.axisB?s.axisB.clone():new i(0,1,0),this.angle=void 0!==s.angle?s.angle:0}computeB(t){const e=this.a,s=this.b,i=this.axisA,o=this.axisB,n=ie,r=oe,a=this.jacobianElementA,l=this.jacobianElementB;i.cross(o,n),o.cross(i,r),a.rotational.copy(r),l.rotational.copy(n);return-(Math.cos(this.angle)-i.dot(o))*e-this.computeGW()*s-t*this.computeGiMf()}}const ie=new i,oe=new i;class ne extends jt{constructor(t,e,s){void 0===s&&(s={});const o=void 0!==s.maxForce?s.maxForce:1e6;super(t,e,-o,o),this.axisA=s.axisA?s.axisA.clone():new i(1,0,0),this.axisB=s.axisB?s.axisB.clone():new i(0,1,0),this.maxAngle=Math.PI/2}computeB(t){const e=this.a,s=this.b,i=this.axisA,o=this.axisB,n=re,r=ae,a=this.jacobianElementA,l=this.jacobianElementB;i.cross(o,n),o.cross(i,r),a.rotational.copy(r),l.rotational.copy(n);return-(Math.cos(this.maxAngle)-i.dot(o))*e-this.computeGW()*s-t*this.computeGiMf()}}const re=new i,ae=new i;class le extends ee{constructor(t,e,s){void 0===s&&(s={});const o=void 0!==s.maxForce?s.maxForce:1e6;super(t,s.pivotA?s.pivotA.clone():new i,e,s.pivotB?s.pivotB.clone():new i,o),this.axisA=s.axisA?s.axisA.clone():new i,this.axisB=s.axisB?s.axisB.clone():new i,this.collideConnected=!!s.collideConnected,this.angle=void 0!==s.angle?s.angle:0;const n=this.coneEquation=new se(t,e,s),r=this.twistEquation=new ne(t,e,s);this.twistAngle=void 0!==s.twistAngle?s.twistAngle:0,n.maxForce=0,n.minForce=-o,r.maxForce=0,r.minForce=-o,this.equations.push(n,r)}update(){const t=this.bodyA,e=this.bodyB,s=this.coneEquation,i=this.twistEquation;super.update(),t.vectorToWorldFrame(this.axisA,s.axisA),e.vectorToWorldFrame(this.axisB,s.axisB),this.axisA.tangents(i.axisA,i.axisA),t.vectorToWorldFrame(i.axisA,i.axisA),this.axisB.tangents(i.axisB,i.axisB),e.vectorToWorldFrame(i.axisB,i.axisB),s.angle=this.angle,i.maxAngle=this.twistAngle}}new i,new i;class he extends Wt{constructor(t,e,s,i){void 0===i&&(i=1e6),super(t,e),void 0===s&&(s=t.position.distanceTo(e.position)),this.distance=s;const o=this.distanceEquation=new Gt(t,e);this.equations.push(o),o.minForce=-i,o.maxForce=i}update(){const t=this.bodyA,e=this.bodyB,s=this.distanceEquation,i=.5*this.distance,o=s.ni;e.position.vsub(t.position,o),o.normalize(),o.scale(i,s.ri),o.scale(-i,s.rj)}}class ce extends ee{constructor(t,e,s){void 0===s&&(s={});const o=void 0!==s.maxForce?s.maxForce:1e6,n=new i,r=new i,a=new i;t.position.vadd(e.position,a),a.scale(.5,a),e.pointToLocalFrame(a,r),t.pointToLocalFrame(a,n),super(t,n,e,r,o),this.xA=t.vectorToLocalFrame(i.UNIT_X),this.xB=e.vectorToLocalFrame(i.UNIT_X),this.yA=t.vectorToLocalFrame(i.UNIT_Y),this.yB=e.vectorToLocalFrame(i.UNIT_Y),this.zA=t.vectorToLocalFrame(i.UNIT_Z),this.zB=e.vectorToLocalFrame(i.UNIT_Z);const l=this.rotationalEquation1=new ne(t,e,s),h=this.rotationalEquation2=new ne(t,e,s),c=this.rotationalEquation3=new ne(t,e,s);this.equations.push(l,h,c)}update(){const t=this.bodyA,e=this.bodyB;this.motorEquation;const s=this.rotationalEquation1,i=this.rotationalEquation2,o=this.rotationalEquation3;super.update(),t.vectorToWorldFrame(this.xA,s.axisA),e.vectorToWorldFrame(this.yB,s.axisB),t.vectorToWorldFrame(this.yA,i.axisA),e.vectorToWorldFrame(this.zB,i.axisB),t.vectorToWorldFrame(this.zA,o.axisA),e.vectorToWorldFrame(this.xB,o.axisB)}}new i,new i;class de extends jt{constructor(t,e,s){void 0===s&&(s=1e6),super(t,e,-s,s),this.axisA=new i,this.axisB=new i,this.targetVelocity=0}computeB(t){this.a;const e=this.b;this.bi,this.bj;const s=this.axisA,i=this.axisB,o=this.jacobianElementA,n=this.jacobianElementB;o.rotational.copy(s),i.negate(n.rotational);return-(this.computeGW()-this.targetVelocity)*e-t*this.computeGiMf()}}class ue extends ee{constructor(t,e,s){void 0===s&&(s={});const o=void 0!==s.maxForce?s.maxForce:1e6;super(t,s.pivotA?s.pivotA.clone():new i,e,s.pivotB?s.pivotB.clone():new i,o);(this.axisA=s.axisA?s.axisA.clone():new i(1,0,0)).normalize();(this.axisB=s.axisB?s.axisB.clone():new i(1,0,0)).normalize(),this.collideConnected=!!s.collideConnected;const n=this.rotationalEquation1=new ne(t,e,s),r=this.rotationalEquation2=new ne(t,e,s),a=this.motorEquation=new de(t,e,o);a.enabled=!1,this.equations.push(n,r,a)}enableMotor(){this.motorEquation.enabled=!0}disableMotor(){this.motorEquation.enabled=!1}setMotorSpeed(t){this.motorEquation.targetVelocity=t}setMotorMaxForce(t){this.motorEquation.maxForce=t,this.motorEquation.minForce=-t}update(){const t=this.bodyA,e=this.bodyB,s=this.motorEquation,i=this.rotationalEquation1,o=this.rotationalEquation2,n=pe,r=ye,a=this.axisA,l=this.axisB;super.update(),t.quaternion.vmult(a,n),e.quaternion.vmult(l,r),n.tangents(i.axisA,o.axisA),i.axisB.copy(r),o.axisB.copy(r),this.motorEquation.enabled&&(t.quaternion.vmult(this.axisA,s.axisA),e.quaternion.vmult(this.axisB,s.axisB))}}const pe=new i,ye=new i;class ve extends jt{constructor(t,e,s){super(t,e,-s,s),this.ri=new i,this.rj=new i,this.t=new i}computeB(t){this.a;const e=this.b;this.bi,this.bj;const s=this.ri,i=this.rj,o=me,n=ge,r=this.t;s.cross(r,o),i.cross(r,n);const a=this.jacobianElementA,l=this.jacobianElementB;r.negate(a.spatial),o.negate(a.rotational),l.spatial.copy(r),l.rotational.copy(n);return-this.computeGW()*e-t*this.computeGiMf()}}const me=new i,ge=new i;class we{constructor(t,e,s){s=Lt.defaults(s,{friction:.3,restitution:.3,contactEquationStiffness:1e7,contactEquationRelaxation:3,frictionEquationStiffness:1e7,frictionEquationRelaxation:3}),this.id=we.idCounter++,this.materials=[t,e],this.friction=s.friction,this.restitution=s.restitution,this.contactEquationStiffness=s.contactEquationStiffness,this.contactEquationRelaxation=s.contactEquationRelaxation,this.frictionEquationStiffness=s.frictionEquationStiffness,this.frictionEquationRelaxation=s.frictionEquationRelaxation}}we.idCounter=0;class fe{constructor(t){void 0===t&&(t={});let e="";"string"==typeof t&&(e=t,t={}),this.name=e,this.id=fe.idCounter++,this.friction=void 0!==t.friction?t.friction:-1,this.restitution=void 0!==t.restitution?t.restitution:-1}}fe.idCounter=0;class xe{constructor(t,e,s){void 0===s&&(s={}),this.restLength="number"==typeof s.restLength?s.restLength:1,this.stiffness=s.stiffness||100,this.damping=s.damping||1,this.bodyA=t,this.bodyB=e,this.localAnchorA=new i,this.localAnchorB=new i,s.localAnchorA&&this.localAnchorA.copy(s.localAnchorA),s.localAnchorB&&this.localAnchorB.copy(s.localAnchorB),s.worldAnchorA&&this.setWorldAnchorA(s.worldAnchorA),s.worldAnchorB&&this.setWorldAnchorB(s.worldAnchorB)}setWorldAnchorA(t){this.bodyA.pointToLocalFrame(t,this.localAnchorA)}setWorldAnchorB(t){this.bodyB.pointToLocalFrame(t,this.localAnchorB)}getWorldAnchorA(t){this.bodyA.pointToWorldFrame(this.localAnchorA,t)}getWorldAnchorB(t){this.bodyB.pointToWorldFrame(this.localAnchorB,t)}applyForce(){const t=this.stiffness,e=this.damping,s=this.restLength,i=this.bodyA,o=this.bodyB,n=be,r=Ae,a=Be,l=Ee,h=Ie,c=ze,d=Se,u=Ce,p=Fe,y=Me,v=Re;this.getWorldAnchorA(c),this.getWorldAnchorB(d),c.vsub(i.position,u),d.vsub(o.position,p),d.vsub(c,n);const m=n.length();r.copy(n),r.normalize(),o.velocity.vsub(i.velocity,a),o.angularVelocity.cross(p,h),a.vadd(h,a),i.angularVelocity.cross(u,h),a.vsub(h,a),r.scale(-t*(m-s)-e*a.dot(r),l),i.force.vsub(l,i.force),o.force.vadd(l,o.force),u.cross(l,y),p.cross(l,v),i.torque.vsub(y,i.torque),o.torque.vadd(v,o.torque)}}const be=new i,Ae=new i,Be=new i,Ee=new i,ze=new i,Se=new i,Ce=new i,Fe=new i,Me=new i,Re=new i,Ie=new i;class Te{constructor(t){void 0===t&&(t={}),t=Lt.defaults(t,{chassisConnectionPointLocal:new i,chassisConnectionPointWorld:new i,directionLocal:new i,directionWorld:new i,axleLocal:new i,axleWorld:new i,suspensionRestLength:1,suspensionMaxLength:2,radius:1,suspensionStiffness:100,dampingCompression:10,dampingRelaxation:10,frictionSlip:10.5,forwardAcceleration:1,sideAcceleration:1,steering:0,rotation:0,deltaRotation:0,rollInfluence:.01,maxSuspensionForce:Number.MAX_VALUE,isFrontWheel:!0,clippedInvContactDotSuspension:1,suspensionRelativeVelocity:0,suspensionForce:0,slipInfo:0,skidInfo:0,suspensionLength:0,maxSuspensionTravel:1,useCustomSlidingRotationalSpeed:!1,customSlidingRotationalSpeed:-.1}),this.maxSuspensionTravel=t.maxSuspensionTravel,this.customSlidingRotationalSpeed=t.customSlidingRotationalSpeed,this.useCustomSlidingRotationalSpeed=t.useCustomSlidingRotationalSpeed,this.sliding=!1,this.chassisConnectionPointLocal=t.chassisConnectionPointLocal.clone(),this.chassisConnectionPointWorld=t.chassisConnectionPointWorld.clone(),this.directionLocal=t.directionLocal.clone(),this.directionWorld=t.directionWorld.clone(),this.axleLocal=t.axleLocal.clone(),this.axleWorld=t.axleWorld.clone(),this.suspensionRestLength=t.suspensionRestLength,this.suspensionMaxLength=t.suspensionMaxLength,this.radius=t.radius,this.suspensionStiffness=t.suspensionStiffness,this.dampingCompression=t.dampingCompression,this.dampingRelaxation=t.dampingRelaxation,this.frictionSlip=t.frictionSlip,this.forwardAcceleration=t.forwardAcceleration,this.sideAcceleration=t.sideAcceleration,this.steering=0,this.rotation=0,this.deltaRotation=0,this.rollInfluence=t.rollInfluence,this.maxSuspensionForce=t.maxSuspensionForce,this.engineForce=0,this.brake=0,this.isFrontWheel=t.isFrontWheel,this.clippedInvContactDotSuspension=1,this.suspensionRelativeVelocity=0,this.suspensionForce=0,this.slipInfo=0,this.skidInfo=0,this.suspensionLength=0,this.sideImpulse=0,this.forwardImpulse=0,this.raycastResult=new Z,this.worldTransform=new g,this.isInContact=!1}updateWheel(t){const e=this.raycastResult;if(this.isInContact){const s=e.hitNormalWorld.dot(e.directionWorld);e.hitPointWorld.vsub(t.position,qe),t.getVelocityAtWorldPoint(qe,Pe);const i=e.hitNormalWorld.dot(Pe);if(s>=-.1)this.suspensionRelativeVelocity=0,this.clippedInvContactDotSuspension=10;else{const t=-1/s;this.suspensionRelativeVelocity=i*t,this.clippedInvContactDotSuspension=t}}else e.suspensionLength=this.suspensionRestLength,this.suspensionRelativeVelocity=0,e.directionWorld.scale(-1,e.hitNormalWorld),this.clippedInvContactDotSuspension=1}}const Pe=new i,qe=new i;class Ne{constructor(t){this.chassisBody=t.chassisBody,this.wheelInfos=[],this.sliding=!1,this.world=null,this.indexRightAxis=void 0!==t.indexRightAxis?t.indexRightAxis:2,this.indexForwardAxis=void 0!==t.indexForwardAxis?t.indexForwardAxis:0,this.indexUpAxis=void 0!==t.indexUpAxis?t.indexUpAxis:1,this.constraints=[],this.preStepCallback=()=>{},this.currentVehicleSpeedKmHour=0,this.numWheelsOnGround=0}addWheel(t){void 0===t&&(t={});const e=new Te(t),s=this.wheelInfos.length;return this.wheelInfos.push(e),s}setSteeringValue(t,e){this.wheelInfos[e].steering=t}applyEngineForce(t,e){this.wheelInfos[e].engineForce=t}setBrake(t,e){this.wheelInfos[e].brake=t}addToWorld(t){t.addBody(this.chassisBody);const e=this;this.preStepCallback=()=>{e.updateVehicle(t.dt)},t.addEventListener("preStep",this.preStepCallback),this.world=t}getVehicleAxisWorld(t,e){e.set(0===t?1:0,1===t?1:0,2===t?1:0),this.chassisBody.vectorToWorldFrame(e,e)}updateVehicle(t){const e=this.wheelInfos,s=e.length,o=this.chassisBody;for(let t=0;t<s;t++)this.updateWheelTransform(t);this.currentVehicleSpeedKmHour=3.6*o.velocity.length();const n=new i;this.getVehicleAxisWorld(this.indexForwardAxis,n),n.dot(o.velocity)<0&&(this.currentVehicleSpeedKmHour*=-1);for(let t=0;t<s;t++)this.castRay(e[t]);this.updateSuspension(t);const r=new i,a=new i;for(let i=0;i<s;i++){const s=e[i];let n=s.suspensionForce;n>s.maxSuspensionForce&&(n=s.maxSuspensionForce),s.raycastResult.hitNormalWorld.scale(n*t,r),s.raycastResult.hitPointWorld.vsub(o.position,a),o.applyImpulse(r,a)}this.updateFriction(t);const l=new i,h=new i,c=new i;for(let i=0;i<s;i++){const s=e[i];o.getVelocityAtWorldPoint(s.chassisConnectionPointWorld,c);let n=1;if(1===this.indexUpAxis)n=-1;if(s.isInContact){this.getVehicleAxisWorld(this.indexForwardAxis,h);const e=h.dot(s.raycastResult.hitNormalWorld);s.raycastResult.hitNormalWorld.scale(e,l),h.vsub(l,h);const i=h.dot(c);s.deltaRotation=n*i*t/s.radius}!s.sliding&&s.isInContact||0===s.engineForce||!s.useCustomSlidingRotationalSpeed||(s.deltaRotation=(s.engineForce>0?1:-1)*s.customSlidingRotationalSpeed*t),Math.abs(s.brake)>Math.abs(s.engineForce)&&(s.deltaRotation=0),s.rotation+=s.deltaRotation,s.deltaRotation*=.99}}updateSuspension(t){const e=this.chassisBody.mass,s=this.wheelInfos,i=s.length;for(let t=0;t<i;t++){const i=s[t];if(i.isInContact){let t;const s=i.suspensionRestLength-i.suspensionLength;t=i.suspensionStiffness*s*i.clippedInvContactDotSuspension;const o=i.suspensionRelativeVelocity;let n;n=o<0?i.dampingCompression:i.dampingRelaxation,t-=n*o,i.suspensionForce=t*e,i.suspensionForce<0&&(i.suspensionForce=0)}else i.suspensionForce=0}}removeFromWorld(t){this.constraints,t.removeBody(this.chassisBody),t.removeEventListener("preStep",this.preStepCallback),this.world=null}castRay(t){const e=je,s=Oe;this.updateWheelTransformWorld(t);const o=this.chassisBody;let n=-1;const r=t.suspensionRestLength+t.radius;t.directionWorld.scale(r,e);const a=t.chassisConnectionPointWorld;a.vadd(e,s);const l=t.raycastResult;l.reset();const h=o.collisionResponse;o.collisionResponse=!1,this.world.rayTest(a,s,l),o.collisionResponse=h;const c=l.body;if(t.raycastResult.groundObject=0,c){n=l.distance,t.raycastResult.hitNormalWorld=l.hitNormalWorld,t.isInContact=!0;const e=l.distance;t.suspensionLength=e-t.radius;const s=t.suspensionRestLength-t.maxSuspensionTravel,r=t.suspensionRestLength+t.maxSuspensionTravel;t.suspensionLength<s&&(t.suspensionLength=s),t.suspensionLength>r&&(t.suspensionLength=r,t.raycastResult.reset());const a=t.raycastResult.hitNormalWorld.dot(t.directionWorld),h=new i;o.getVelocityAtWorldPoint(t.raycastResult.hitPointWorld,h);const c=t.raycastResult.hitNormalWorld.dot(h);if(a>=-.1)t.suspensionRelativeVelocity=0,t.clippedInvContactDotSuspension=10;else{const e=-1/a;t.suspensionRelativeVelocity=c*e,t.clippedInvContactDotSuspension=e}}else t.suspensionLength=t.suspensionRestLength+0*t.maxSuspensionTravel,t.suspensionRelativeVelocity=0,t.directionWorld.scale(-1,t.raycastResult.hitNormalWorld),t.clippedInvContactDotSuspension=1;return n}updateWheelTransformWorld(t){t.isInContact=!1;const e=this.chassisBody;e.pointToWorldFrame(t.chassisConnectionPointLocal,t.chassisConnectionPointWorld),e.vectorToWorldFrame(t.directionLocal,t.directionWorld),e.vectorToWorldFrame(t.axleLocal,t.axleWorld)}updateWheelTransform(t){const e=Le,s=We,i=Ve,o=this.wheelInfos[t];this.updateWheelTransformWorld(o),o.directionLocal.scale(-1,e),s.copy(o.axleLocal),e.cross(s,i),i.normalize(),s.normalize();const n=o.steering,r=new u;r.setFromAxisAngle(e,n);const a=new u;a.setFromAxisAngle(s,o.rotation);const l=o.worldTransform.quaternion;this.chassisBody.quaternion.mult(r,l),l.mult(a,l),l.normalize();const h=o.worldTransform.position;h.copy(o.directionWorld),h.scale(o.suspensionLength,h),h.vadd(o.chassisConnectionPointWorld,h)}getWheelTransformWorld(t){return this.wheelInfos[t].worldTransform}updateFriction(t){const e=He,s=this.wheelInfos,o=s.length,n=this.chassisBody,r=Ue,a=_e;this.numWheelsOnGround=0;for(let t=0;t<o;t++){const e=s[t];e.raycastResult.body&&this.numWheelsOnGround++,e.sideImpulse=0,e.forwardImpulse=0,r[t]||(r[t]=new i),a[t]||(a[t]=new i)}for(let t=0;t<o;t++){const i=s[t],o=i.raycastResult.body;if(o){const s=a[t];this.getWheelTransformWorld(t).vectorToWorldFrame(ke[this.indexRightAxis],s);const l=i.raycastResult.hitNormalWorld,h=s.dot(l);l.scale(h,e),s.vsub(e,s),s.normalize(),l.cross(s,r[t]),r[t].normalize(),i.sideImpulse=os(n,i.raycastResult.hitPointWorld,o,i.raycastResult.hitPointWorld,s),i.sideImpulse*=De}}this.sliding=!1;for(let e=0;e<o;e++){const i=s[e],o=i.raycastResult.body;let a=0;if(i.slipInfo=1,o){const s=0,l=i.brake?i.brake:s;a=$e(n,o,i.raycastResult.hitPointWorld,r[e],l),a+=i.engineForce*t;const h=l/a;i.slipInfo*=h}if(i.forwardImpulse=0,i.skidInfo=1,o){i.skidInfo=1;const e=i.suspensionForce*t*i.frictionSlip,s=e*e;i.forwardImpulse=a;const o=.5*i.forwardImpulse/i.forwardAcceleration,n=1*i.sideImpulse/i.sideAcceleration,r=o*o+n*n;if(i.sliding=!1,r>s){this.sliding=!0,i.sliding=!0;const t=e/Math.sqrt(r);i.skidInfo*=t}}}if(this.sliding)for(let t=0;t<o;t++){const e=s[t];0!==e.sideImpulse&&e.skidInfo<1&&(e.forwardImpulse*=e.skidInfo,e.sideImpulse*=e.skidInfo)}for(let t=0;t<o;t++){const e=s[t],o=new i;if(e.raycastResult.hitPointWorld.vsub(n.position,o),0!==e.forwardImpulse){const s=new i;r[t].scale(e.forwardImpulse,s),n.applyImpulse(s,o)}if(0!==e.sideImpulse){const s=e.raycastResult.body,r=new i;e.raycastResult.hitPointWorld.vsub(s.position,r);const l=new i;a[t].scale(e.sideImpulse,l),n.vectorToLocalFrame(o,o),o["xyz"[this.indexUpAxis]]*=e.rollInfluence,n.vectorToWorldFrame(o,o),n.applyImpulse(l,o),l.scale(-1,l),s.applyImpulse(l,r)}}}}new i,new i,new i;const Le=new i,We=new i,Ve=new i;new rt,new i;const je=new i,Oe=new i,ke=[new i(1,0,0),new i(0,1,0),new i(0,0,1)],He=new i,_e=[],Ue=[],De=1,Ge=new i,Ye=new i,Xe=new i;function $e(t,e,s,i,o){let n=0;const r=s,a=Ge,l=Ye,h=Xe;t.getVelocityAtWorldPoint(r,a),e.getVelocityAtWorldPoint(r,l),a.vsub(l,h);return n=-i.dot(h)*(1/(ts(t,s,i)+ts(e,s,i))),o<n&&(n=o),n<-o&&(n=-o),n}const Ke=new i,Ze=new i,Qe=new i,Je=new i;function ts(t,e,s){const i=Ke,o=Ze,n=Qe,r=Je;return e.vsub(t.position,i),i.cross(s,o),t.invInertiaWorld.vmult(o,r),r.cross(i,n),t.invMass+s.dot(n)}const es=new i,ss=new i,is=new i;function os(t,e,s,i,o){if(o.lengthSquared()>1.1)return 0;const n=es,r=ss,a=is;t.getVelocityAtWorldPoint(e,n),s.getVelocityAtWorldPoint(i,r),n.vsub(r,a);return-.2*o.dot(a)*(1/(t.invMass+s.invMass))}class ns extends m{constructor(t){if(super({type:m.types.SPHERE}),this.radius=void 0!==t?t:1,this.radius<0)throw new Error("The sphere radius cannot be negative.");this.updateBoundingSphereRadius()}calculateLocalInertia(t,e){void 0===e&&(e=new i);const s=2*t*this.radius*this.radius/5;return e.x=s,e.y=s,e.z=s,e}volume(){return 4*Math.PI*Math.pow(this.radius,3)/3}updateBoundingSphereRadius(){this.boundingSphereRadius=this.radius}calculateWorldAABB(t,e,s,i){const o=this.radius,n=["x","y","z"];for(let e=0;e<n.length;e++){const r=n[e];s[r]=t[r]-o,i[r]=t[r]+o}}}class rs{constructor(t){void 0===t&&(t={}),this.wheelBodies=[],this.coordinateSystem=void 0!==t.coordinateSystem?t.coordinateSystem.clone():new i(1,2,3),t.chassisBody?this.chassisBody=t.chassisBody:this.chassisBody=new M({mass:1,shape:new E(new i(5,.5,2))}),this.constraints=[],this.wheelAxes=[],this.wheelForces=[]}addWheel(t){let e;void 0===t&&(t={}),e=t.body?t.body:new M({mass:1,shape:new ns(1.2)}),this.wheelBodies.push(e),this.wheelForces.push(0);const s=void 0!==t.position?t.position.clone():new i,o=new i;this.chassisBody.pointToWorldFrame(s,o),e.position.set(o.x,o.y,o.z);const n=void 0!==t.axis?t.axis.clone():new i(0,0,1);this.wheelAxes.push(n);const r=new ue(this.chassisBody,e,{pivotA:s,axisA:n,pivotB:i.ZERO,axisB:n,collideConnected:!1});return this.constraints.push(r),this.wheelBodies.length-1}setSteeringValue(t,e){const s=this.wheelAxes[e],i=Math.cos(t),o=Math.sin(t),n=s.x,r=s.z;this.constraints[e].axisA.set(-i*n+o*r,0,o*n+i*r)}setMotorSpeed(t,e){const s=this.constraints[e];s.enableMotor(),s.motorTargetVelocity=t}disableMotor(t){this.constraints[t].disableMotor()}setWheelForce(t,e){this.wheelForces[e]=t}applyWheelForce(t,e){const s=this.wheelAxes[e],i=this.wheelBodies[e],o=i.torque;s.scale(t,as),i.vectorToWorldFrame(as,as),o.vadd(as,o)}addToWorld(t){const e=this.constraints,s=this.wheelBodies.concat([this.chassisBody]);for(let e=0;e<s.length;e++)t.addBody(s[e]);for(let s=0;s<e.length;s++)t.addConstraint(e[s]);t.addEventListener("preStep",this._update.bind(this))}_update(){const t=this.wheelForces;for(let e=0;e<t.length;e++)this.applyWheelForce(t[e],e)}removeFromWorld(t){const e=this.constraints,s=this.wheelBodies.concat([this.chassisBody]);for(let e=0;e<s.length;e++)t.removeBody(s[e]);for(let s=0;s<e.length;s++)t.removeConstraint(e[s])}getWheelSpeed(t){const e=this.wheelAxes[t],s=this.wheelBodies[t].angularVelocity;return this.chassisBody.vectorToWorldFrame(e,ls),s.dot(ls)}}const as=new i,ls=new i;class hs{constructor(){this.particles=[],this.density=1,this.smoothingRadius=1,this.speedOfSound=1,this.viscosity=.01,this.eps=1e-6,this.pressures=[],this.densities=[],this.neighbors=[]}add(t){this.particles.push(t),this.neighbors.length<this.particles.length&&this.neighbors.push([])}remove(t){const e=this.particles.indexOf(t);-1!==e&&(this.particles.splice(e,1),this.neighbors.length>this.particles.length&&this.neighbors.pop())}getNeighbors(t,e){const s=this.particles.length,i=t.id,o=this.smoothingRadius*this.smoothingRadius,n=cs;for(let r=0;r!==s;r++){const s=this.particles[r];s.position.vsub(t.position,n),i!==s.id&&n.lengthSquared()<o&&e.push(s)}}update(){const t=this.particles.length,e=ds,s=this.speedOfSound,i=this.eps;for(let i=0;i!==t;i++){const t=this.particles[i],o=this.neighbors[i];o.length=0,this.getNeighbors(t,o),o.push(this.particles[i]);const n=o.length;let r=0;for(let s=0;s!==n;s++){t.position.vsub(o[s].position,e);const i=e.length(),n=this.w(i);r+=o[s].mass*n}this.densities[i]=r,this.pressures[i]=s*s*(this.densities[i]-this.density)}const o=us,n=ps,r=ys,a=vs,l=ms;for(let e=0;e!==t;e++){const t=this.particles[e];let s,h;o.set(0,0,0),n.set(0,0,0);const c=this.neighbors[e],d=c.length;for(let u=0;u!==d;u++){const d=c[u];t.position.vsub(d.position,a);const p=a.length();s=-d.mass*(this.pressures[e]/(this.densities[e]*this.densities[e]+i)+this.pressures[u]/(this.densities[u]*this.densities[u]+i)),this.gradw(a,r),r.scale(s,r),o.vadd(r,o),d.velocity.vsub(t.velocity,l),l.scale(1/(1e-4+this.densities[e]*this.densities[u])*this.viscosity*d.mass,l),h=this.nablaw(p),l.scale(h,l),n.vadd(l,n)}n.scale(t.mass,n),o.scale(t.mass,o),t.force.vadd(n,t.force),t.force.vadd(o,t.force)}}w(t){const e=this.smoothingRadius;return 315/(64*Math.PI*e**9)*(e*e-t*t)**3}gradw(t,e){const s=t.length(),i=this.smoothingRadius;t.scale(945/(32*Math.PI*i**9)*(i*i-s*s)**2,e)}nablaw(t){const e=this.smoothingRadius;return 945/(32*Math.PI*e**9)*(e*e-t*t)*(7*t*t-3*e*e)}}const cs=new i,ds=new i,us=new i,ps=new i,ys=new i,vs=new i,ms=new i;class gs extends f{constructor(t,e,s,o){if(void 0===t&&(t=1),void 0===e&&(e=1),void 0===s&&(s=1),void 0===o&&(o=8),t<0)throw new Error("The cylinder radiusTop cannot be negative.");if(e<0)throw new Error("The cylinder radiusBottom cannot be negative.");const n=o,r=[],a=[],l=[],h=[],c=[],d=Math.cos,u=Math.sin;r.push(new i(-e*u(0),.5*-s,e*d(0))),h.push(0),r.push(new i(-t*u(0),.5*s,t*d(0))),c.push(1);for(let o=0;o<n;o++){const p=2*Math.PI/n*(o+1),y=2*Math.PI/n*(o+.5);o<n-1?(r.push(new i(-e*u(p),.5*-s,e*d(p))),h.push(2*o+2),r.push(new i(-t*u(p),.5*s,t*d(p))),c.push(2*o+3),l.push([2*o,2*o+1,2*o+3,2*o+2])):l.push([2*o,2*o+1,1,0]),(n%2==1||o<n/2)&&a.push(new i(-u(y),0,d(y)))}l.push(h),a.push(new i(0,1,0));const p=[];for(let t=0;t<c.length;t++)p.push(c[c.length-t-1]);l.push(p),super({vertices:r,faces:l,axes:a}),this.type=m.types.CYLINDER,this.radiusTop=t,this.radiusBottom=e,this.height=s,this.numSegments=o}}class ws extends m{constructor(){super({type:m.types.PARTICLE})}calculateLocalInertia(t,e){return void 0===e&&(e=new i),e.set(0,0,0),e}volume(){return 0}updateBoundingSphereRadius(){this.boundingSphereRadius=0}calculateWorldAABB(t,e,s,i){s.copy(t),i.copy(t)}}class fs extends m{constructor(){super({type:m.types.PLANE}),this.worldNormal=new i,this.worldNormalNeedsUpdate=!0,this.boundingSphereRadius=Number.MAX_VALUE}computeWorldNormal(t){const e=this.worldNormal;e.set(0,0,1),t.vmult(e,e),this.worldNormalNeedsUpdate=!1}calculateLocalInertia(t,e){return void 0===e&&(e=new i),e}volume(){return Number.MAX_VALUE}calculateWorldAABB(t,e,s,i){xs.set(0,0,1),e.vmult(xs,xs);const o=Number.MAX_VALUE;s.set(-o,-o,-o),i.set(o,o,o),1===xs.x?i.x=t.x:-1===xs.x&&(s.x=t.x),1===xs.y?i.y=t.y:-1===xs.y&&(s.y=t.y),1===xs.z?i.z=t.z:-1===xs.z&&(s.z=t.z)}updateBoundingSphereRadius(){this.boundingSphereRadius=Number.MAX_VALUE}}const xs=new i;class bs extends m{constructor(t,e){void 0===e&&(e={}),e=Lt.defaults(e,{maxValue:null,minValue:null,elementSize:1}),super({type:m.types.HEIGHTFIELD}),this.data=t,this.maxValue=e.maxValue,this.minValue=e.minValue,this.elementSize=e.elementSize,null===e.minValue&&this.updateMinValue(),null===e.maxValue&&this.updateMaxValue(),this.cacheEnabled=!0,this.pillarConvex=new f,this.pillarOffset=new i,this.updateBoundingSphereRadius(),this._cachedPillars={}}update(){this._cachedPillars={}}updateMinValue(){const t=this.data;let e=t[0][0];for(let s=0;s!==t.length;s++)for(let i=0;i!==t[s].length;i++){const o=t[s][i];o<e&&(e=o)}this.minValue=e}updateMaxValue(){const t=this.data;let e=t[0][0];for(let s=0;s!==t.length;s++)for(let i=0;i!==t[s].length;i++){const o=t[s][i];o>e&&(e=o)}this.maxValue=e}setHeightValueAtIndex(t,e,s){this.data[t][e]=s,this.clearCachedConvexTrianglePillar(t,e,!1),t>0&&(this.clearCachedConvexTrianglePillar(t-1,e,!0),this.clearCachedConvexTrianglePillar(t-1,e,!1)),e>0&&(this.clearCachedConvexTrianglePillar(t,e-1,!0),this.clearCachedConvexTrianglePillar(t,e-1,!1)),e>0&&t>0&&this.clearCachedConvexTrianglePillar(t-1,e-1,!0)}getRectMinMax(t,e,s,i,o){void 0===o&&(o=[]);const n=this.data;let r=this.minValue;for(let o=t;o<=s;o++)for(let t=e;t<=i;t++){const e=n[o][t];e>r&&(r=e)}o[0]=this.minValue,o[1]=r}getIndexOfPosition(t,e,s,i){const o=this.elementSize,n=this.data;let r=Math.floor(t/o),a=Math.floor(e/o);return s[0]=r,s[1]=a,i&&(r<0&&(r=0),a<0&&(a=0),r>=n.length-1&&(r=n.length-1),a>=n[0].length-1&&(a=n[0].length-1)),!(r<0||a<0||r>=n.length-1||a>=n[0].length-1)}getTriangleAt(t,e,s,i,o,n){const r=As;this.getIndexOfPosition(t,e,r,s);let a=r[0],l=r[1];const h=this.data;s&&(a=Math.min(h.length-2,Math.max(0,a)),l=Math.min(h[0].length-2,Math.max(0,l)));const c=this.elementSize,d=(t/c-a)**2+(e/c-l)**2>(t/c-(a+1))**2+(e/c-(l+1))**2;return this.getTriangle(a,l,d,i,o,n),d}getNormalAt(t,e,s,i){const o=Cs,n=Fs,r=Ms,a=Rs,l=Is;this.getTriangleAt(t,e,s,o,n,r),n.vsub(o,a),r.vsub(o,l),a.cross(l,i),i.normalize()}getAabbAtIndex(t,e,s){let{lowerBound:i,upperBound:o}=s;const n=this.data,r=this.elementSize;i.set(t*r,e*r,n[t][e]),o.set((t+1)*r,(e+1)*r,n[t+1][e+1])}getHeightAt(t,e,s){const i=this.data,o=Es,n=zs,r=Ss,a=As;this.getIndexOfPosition(t,e,a,s);let l=a[0],h=a[1];s&&(l=Math.min(i.length-2,Math.max(0,l)),h=Math.min(i[0].length-2,Math.max(0,h)));const c=this.getTriangleAt(t,e,s,o,n,r);!function(t,e,s,i,o,n,r,a,l){l.x=((n-a)*(t-r)+(r-o)*(e-a))/((n-a)*(s-r)+(r-o)*(i-a)),l.y=((a-i)*(t-r)+(s-r)*(e-a))/((n-a)*(s-r)+(r-o)*(i-a)),l.z=1-l.x-l.y}(t,e,o.x,o.y,n.x,n.y,r.x,r.y,Bs);const d=Bs;return c?i[l+1][h+1]*d.x+i[l][h+1]*d.y+i[l+1][h]*d.z:i[l][h]*d.x+i[l+1][h]*d.y+i[l][h+1]*d.z}getCacheConvexTrianglePillarKey(t,e,s){return`${t}_${e}_${s?1:0}`}getCachedConvexTrianglePillar(t,e,s){return this._cachedPillars[this.getCacheConvexTrianglePillarKey(t,e,s)]}setCachedConvexTrianglePillar(t,e,s,i,o){this._cachedPillars[this.getCacheConvexTrianglePillarKey(t,e,s)]={convex:i,offset:o}}clearCachedConvexTrianglePillar(t,e,s){delete this._cachedPillars[this.getCacheConvexTrianglePillarKey(t,e,s)]}getTriangle(t,e,s,i,o,n){const r=this.data,a=this.elementSize;s?(i.set((t+1)*a,(e+1)*a,r[t+1][e+1]),o.set(t*a,(e+1)*a,r[t][e+1]),n.set((t+1)*a,e*a,r[t+1][e])):(i.set(t*a,e*a,r[t][e]),o.set((t+1)*a,e*a,r[t+1][e]),n.set(t*a,(e+1)*a,r[t][e+1]))}getConvexTrianglePillar(t,e,s){let o=this.pillarConvex,n=this.pillarOffset;if(this.cacheEnabled){const r=this.getCachedConvexTrianglePillar(t,e,s);if(r)return this.pillarConvex=r.convex,void(this.pillarOffset=r.offset);o=new f,n=new i,this.pillarConvex=o,this.pillarOffset=n}const r=this.data,a=this.elementSize,l=o.faces;o.vertices.length=6;for(let t=0;t<6;t++)o.vertices[t]||(o.vertices[t]=new i);l.length=5;for(let t=0;t<5;t++)l[t]||(l[t]=[]);const h=o.vertices,c=(Math.min(r[t][e],r[t+1][e],r[t][e+1],r[t+1][e+1])-this.minValue)/2+this.minValue;s?(n.set((t+.75)*a,(e+.75)*a,c),h[0].set(.25*a,.25*a,r[t+1][e+1]-c),h[1].set(-.75*a,.25*a,r[t][e+1]-c),h[2].set(.25*a,-.75*a,r[t+1][e]-c),h[3].set(.25*a,.25*a,-Math.abs(c)-1),h[4].set(-.75*a,.25*a,-Math.abs(c)-1),h[5].set(.25*a,-.75*a,-Math.abs(c)-1),l[0][0]=0,l[0][1]=1,l[0][2]=2,l[1][0]=5,l[1][1]=4,l[1][2]=3,l[2][0]=2,l[2][1]=5,l[2][2]=3,l[2][3]=0,l[3][0]=3,l[3][1]=4,l[3][2]=1,l[3][3]=0,l[4][0]=1,l[4][1]=4,l[4][2]=5,l[4][3]=2):(n.set((t+.25)*a,(e+.25)*a,c),h[0].set(-.25*a,-.25*a,r[t][e]-c),h[1].set(.75*a,-.25*a,r[t+1][e]-c),h[2].set(-.25*a,.75*a,r[t][e+1]-c),h[3].set(-.25*a,-.25*a,-Math.abs(c)-1),h[4].set(.75*a,-.25*a,-Math.abs(c)-1),h[5].set(-.25*a,.75*a,-Math.abs(c)-1),l[0][0]=0,l[0][1]=1,l[0][2]=2,l[1][0]=5,l[1][1]=4,l[1][2]=3,l[2][0]=0,l[2][1]=2,l[2][2]=5,l[2][3]=3,l[3][0]=1,l[3][1]=0,l[3][2]=3,l[3][3]=4,l[4][0]=4,l[4][1]=5,l[4][2]=2,l[4][3]=1),o.computeNormals(),o.computeEdges(),o.updateBoundingSphereRadius(),this.setCachedConvexTrianglePillar(t,e,s,o,n)}calculateLocalInertia(t,e){return void 0===e&&(e=new i),e.set(0,0,0),e}volume(){return Number.MAX_VALUE}calculateWorldAABB(t,e,s,i){s.set(-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE),i.set(Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE)}updateBoundingSphereRadius(){const t=this.data,e=this.elementSize;this.boundingSphereRadius=new i(t.length*e,t[0].length*e,Math.max(Math.abs(this.maxValue),Math.abs(this.minValue))).length()}setHeightsFromImage(t,e){const{x:s,z:i,y:o}=e,n=document.createElement("canvas");n.width=t.width,n.height=t.height;const r=n.getContext("2d");r.drawImage(t,0,0);const a=r.getImageData(0,0,t.width,t.height),l=this.data;l.length=0,this.elementSize=Math.abs(s)/a.width;for(let t=0;t<a.height;t++){const e=[];for(let o=0;o<a.width;o++){const n=(a.data[4*(t*a.height+o)]+a.data[4*(t*a.height+o)+1]+a.data[4*(t*a.height+o)+2])/4/255*i;s<0?e.push(n):e.unshift(n)}o<0?l.unshift(e):l.push(e)}this.updateMaxValue(),this.updateMinValue(),this.update()}}const As=[],Bs=new i,Es=new i,zs=new i,Ss=new i,Cs=new i,Fs=new i,Ms=new i,Rs=new i,Is=new i;class Ts{constructor(t){void 0===t&&(t={}),this.root=t.root||null,this.aabb=t.aabb?t.aabb.clone():new a,this.data=[],this.children=[]}reset(){this.children.length=this.data.length=0}insert(t,e,s){void 0===s&&(s=0);const i=this.data;if(!this.aabb.contains(t))return!1;const o=this.children;if(s<(this.maxDepth||this.root.maxDepth)){let i=!1;o.length||(this.subdivide(),i=!0);for(let i=0;8!==i;i++)if(o[i].insert(t,e,s+1))return!0;i&&(o.length=0)}return i.push(e),!0}subdivide(){const t=this.aabb,e=t.lowerBound,s=t.upperBound,o=this.children;o.push(new Ts({aabb:new a({lowerBound:new i(0,0,0)})}),new Ts({aabb:new a({lowerBound:new i(1,0,0)})}),new Ts({aabb:new a({lowerBound:new i(1,1,0)})}),new Ts({aabb:new a({lowerBound:new i(1,1,1)})}),new Ts({aabb:new a({lowerBound:new i(0,1,1)})}),new Ts({aabb:new a({lowerBound:new i(0,0,1)})}),new Ts({aabb:new a({lowerBound:new i(1,0,1)})}),new Ts({aabb:new a({lowerBound:new i(0,1,0)})})),s.vsub(e,qs),qs.scale(.5,qs);const n=this.root||this;for(let t=0;8!==t;t++){const s=o[t];s.root=n;const i=s.aabb.lowerBound;i.x*=qs.x,i.y*=qs.y,i.z*=qs.z,i.vadd(e,i),i.vadd(qs,s.aabb.upperBound)}}aabbQuery(t,e){this.data,this.children;const s=[this];for(;s.length;){const i=s.pop();i.aabb.overlaps(t)&&Array.prototype.push.apply(e,i.data),Array.prototype.push.apply(s,i.children)}return e}rayQuery(t,e,s){return t.getAABB(Ns),Ns.toLocalFrame(e,Ns),this.aabbQuery(Ns,s),s}removeEmptyNodes(){for(let t=this.children.length-1;t>=0;t--)this.children[t].removeEmptyNodes(),this.children[t].children.length||this.children[t].data.length||this.children.splice(t,1)}}class Ps extends Ts{constructor(t,e){void 0===e&&(e={}),super({root:null,aabb:t}),this.maxDepth=void 0!==e.maxDepth?e.maxDepth:8}}const qs=new i,Ns=new a;class Ls extends m{constructor(t,e){super({type:m.types.TRIMESH}),this.vertices=new Float32Array(t),this.indices=new Int16Array(e),this.normals=new Float32Array(e.length),this.aabb=new a,this.edges=null,this.scale=new i(1,1,1),this.tree=new Ps,this.updateEdges(),this.updateNormals(),this.updateAABB(),this.updateBoundingSphereRadius(),this.updateTree()}updateTree(){const t=this.tree;t.reset(),t.aabb.copy(this.aabb);const e=this.scale;t.aabb.lowerBound.x*=1/e.x,t.aabb.lowerBound.y*=1/e.y,t.aabb.lowerBound.z*=1/e.z,t.aabb.upperBound.x*=1/e.x,t.aabb.upperBound.y*=1/e.y,t.aabb.upperBound.z*=1/e.z;const s=new a,o=new i,n=new i,r=new i,l=[o,n,r];for(let e=0;e<this.indices.length/3;e++){const i=3*e;this._getUnscaledVertex(this.indices[i],o),this._getUnscaledVertex(this.indices[i+1],n),this._getUnscaledVertex(this.indices[i+2],r),s.setFromPoints(l),t.insert(s,e)}t.removeEmptyNodes()}getTrianglesInAABB(t,e){Vs.copy(t);const s=this.scale,i=s.x,o=s.y,n=s.z,r=Vs.lowerBound,a=Vs.upperBound;return r.x/=i,r.y/=o,r.z/=n,a.x/=i,a.y/=o,a.z/=n,this.tree.aabbQuery(Vs,e)}setScale(t){const e=this.scale.x===this.scale.y&&this.scale.y===this.scale.z,s=t.x===t.y&&t.y===t.z;e&&s||this.updateNormals(),this.scale.copy(t),this.updateAABB(),this.updateBoundingSphereRadius()}updateNormals(){const t=Ws,e=this.normals;for(let s=0;s<this.indices.length/3;s++){const i=3*s,o=this.indices[i],n=this.indices[i+1],r=this.indices[i+2];this.getVertex(o,_s),this.getVertex(n,Us),this.getVertex(r,Ds),Ls.computeNormal(Us,_s,Ds,t),e[i]=t.x,e[i+1]=t.y,e[i+2]=t.z}}updateEdges(){const t={},e=(e,s)=>{t[e<s?`${e}_${s}`:`${s}_${e}`]=!0};for(let t=0;t<this.indices.length/3;t++){const s=3*t,i=this.indices[s],o=this.indices[s+1],n=this.indices[s+2];e(i,o),e(o,n),e(n,i)}const s=Object.keys(t);this.edges=new Int16Array(2*s.length);for(let t=0;t<s.length;t++){const e=s[t].split("_");this.edges[2*t]=parseInt(e[0],10),this.edges[2*t+1]=parseInt(e[1],10)}}getEdgeVertex(t,e,s){const i=this.edges[2*t+(e?1:0)];this.getVertex(i,s)}getEdgeVector(t,e){const s=js,i=Os;this.getEdgeVertex(t,0,s),this.getEdgeVertex(t,1,i),i.vsub(s,e)}static computeNormal(t,e,s,i){e.vsub(t,Hs),s.vsub(e,ks),ks.cross(Hs,i),i.isZero()||i.normalize()}getVertex(t,e){const s=this.scale;return this._getUnscaledVertex(t,e),e.x*=s.x,e.y*=s.y,e.z*=s.z,e}_getUnscaledVertex(t,e){const s=3*t,i=this.vertices;return e.set(i[s],i[s+1],i[s+2])}getWorldVertex(t,e,s,i){return this.getVertex(t,i),g.pointToWorldFrame(e,s,i,i),i}getTriangleVertices(t,e,s,i){const o=3*t;this.getVertex(this.indices[o],e),this.getVertex(this.indices[o+1],s),this.getVertex(this.indices[o+2],i)}getNormal(t,e){const s=3*t;return e.set(this.normals[s],this.normals[s+1],this.normals[s+2])}calculateLocalInertia(t,e){this.computeLocalAABB(Gs);const s=Gs.upperBound.x-Gs.lowerBound.x,i=Gs.upperBound.y-Gs.lowerBound.y,o=Gs.upperBound.z-Gs.lowerBound.z;return e.set(1/12*t*(2*i*2*i+2*o*2*o),1/12*t*(2*s*2*s+2*o*2*o),1/12*t*(2*i*2*i+2*s*2*s))}computeLocalAABB(t){const e=t.lowerBound,s=t.upperBound,i=this.vertices.length;this.vertices;const o=Ys;this.getVertex(0,o),e.copy(o),s.copy(o);for(let t=0;t!==i;t++)this.getVertex(t,o),o.x<e.x?e.x=o.x:o.x>s.x&&(s.x=o.x),o.y<e.y?e.y=o.y:o.y>s.y&&(s.y=o.y),o.z<e.z?e.z=o.z:o.z>s.z&&(s.z=o.z)}updateAABB(){this.computeLocalAABB(this.aabb)}updateBoundingSphereRadius(){let t=0;const e=this.vertices,s=new i;for(let i=0,o=e.length/3;i!==o;i++){this.getVertex(i,s);const e=s.lengthSquared();e>t&&(t=e)}this.boundingSphereRadius=Math.sqrt(t)}calculateWorldAABB(t,e,s,i){const o=Xs,n=$s;o.position=t,o.quaternion=e,this.aabb.toWorldFrame(o,n),s.copy(n.lowerBound),i.copy(n.upperBound)}volume(){return 4*Math.PI*this.boundingSphereRadius/3}static createTorus(t,e,s,i,o){void 0===t&&(t=1),void 0===e&&(e=.5),void 0===s&&(s=8),void 0===i&&(i=6),void 0===o&&(o=2*Math.PI);const n=[],r=[];for(let r=0;r<=s;r++)for(let a=0;a<=i;a++){const l=a/i*o,h=r/s*Math.PI*2,c=(t+e*Math.cos(h))*Math.cos(l),d=(t+e*Math.cos(h))*Math.sin(l),u=e*Math.sin(h);n.push(c,d,u)}for(let t=1;t<=s;t++)for(let e=1;e<=i;e++){const s=(i+1)*t+e-1,o=(i+1)*(t-1)+e-1,n=(i+1)*(t-1)+e,a=(i+1)*t+e;r.push(s,o,a),r.push(o,n,a)}return new Ls(n,r)}}const Ws=new i,Vs=new a,js=new i,Os=new i,ks=new i,Hs=new i,_s=new i,Us=new i,Ds=new i,Gs=new a,Ys=new i,Xs=new g,$s=new a;class Ks{constructor(){this.equations=[]}solve(t,e){return 0}addEquation(t){!t.enabled||t.bi.isTrigger||t.bj.isTrigger||this.equations.push(t)}removeEquation(t){const e=this.equations,s=e.indexOf(t);-1!==s&&e.splice(s,1)}removeAllEquations(){this.equations.length=0}}class Zs extends Ks{constructor(){super(),this.iterations=10,this.tolerance=1e-7}solve(t,e){let s=0;const i=this.iterations,o=this.tolerance*this.tolerance,n=this.equations,r=n.length,a=e.bodies,l=a.length,h=t;let c,d,u,p,y,v;if(0!==r)for(let t=0;t!==l;t++)a[t].updateSolveMassProperties();const m=Js,g=ti,w=Qs;m.length=r,g.length=r,w.length=r;for(let t=0;t!==r;t++){const e=n[t];w[t]=0,g[t]=e.computeB(h),m[t]=1/e.computeC()}if(0!==r){for(let t=0;t!==l;t++){const e=a[t],s=e.vlambda,i=e.wlambda;s.set(0,0,0),i.set(0,0,0)}for(s=0;s!==i;s++){p=0;for(let t=0;t!==r;t++){const e=n[t];c=g[t],d=m[t],v=w[t],y=e.computeGWlambda(),u=d*(c-y-e.eps*v),v+u<e.minForce?u=e.minForce-v:v+u>e.maxForce&&(u=e.maxForce-v),w[t]+=u,p+=u>0?u:-u,e.addToWlambda(u)}if(p*p<o)break}for(let t=0;t!==l;t++){const e=a[t],s=e.velocity,i=e.angularVelocity;e.vlambda.vmul(e.linearFactor,e.vlambda),s.vadd(e.vlambda,s),e.wlambda.vmul(e.angularFactor,e.wlambda),i.vadd(e.wlambda,i)}let t=n.length;const e=1/h;for(;t--;)n[t].multiplier=w[t]*e}return s}}const Qs=[],Js=[],ti=[];class ei extends Ks{constructor(t){for(super(),this.iterations=10,this.tolerance=1e-7,this.subsolver=t,this.nodes=[],this.nodePool=[];this.nodePool.length<128;)this.nodePool.push(this.createNode())}createNode(){return{body:null,children:[],eqs:[],visited:!1}}solve(t,e){const s=si,i=this.nodePool,o=e.bodies,n=this.equations,r=n.length,a=o.length,l=this.subsolver;for(;i.length<a;)i.push(this.createNode());s.length=a;for(let t=0;t<a;t++)s[t]=i[t];for(let t=0;t!==a;t++){const e=s[t];e.body=o[t],e.children.length=0,e.eqs.length=0,e.visited=!1}for(let t=0;t!==r;t++){const e=n[t],i=o.indexOf(e.bi),r=o.indexOf(e.bj),a=s[i],l=s[r];a.children.push(l),a.eqs.push(e),l.children.push(a),l.eqs.push(e)}let h,c=0,d=ii;l.tolerance=this.tolerance,l.iterations=this.iterations;const u=oi;for(;h=ri(s);){d.length=0,u.bodies.length=0,li(h,hi,u.bodies,d);const e=d.length;d=d.sort(ci);for(let t=0;t!==e;t++)l.addEquation(d[t]);l.solve(t,u),l.removeAllEquations(),c++}return c}}const si=[],ii=[],oi={bodies:[]},ni=M.STATIC;function ri(t){const e=t.length;for(let s=0;s!==e;s++){const e=t[s];if(!(e.visited||e.body.type&ni))return e}return!1}const ai=[];function li(t,e,s,i){for(ai.push(t),t.visited=!0,e(t,s,i);ai.length;){const t=ai.pop();let o;for(;o=ri(t.children);)o.visited=!0,e(o,s,i),ai.push(o)}}function hi(t,e,s){e.push(t.body);const i=t.eqs.length;for(let e=0;e!==i;e++){const i=t.eqs[e];s.includes(i)||s.push(i)}}function ci(t,e){return e.id-t.id}class di{constructor(){this.objects=[],this.type=Object}release(){const t=arguments.length;for(let e=0;e!==t;e++)this.objects.push(e<0||arguments.length<=e?void 0:arguments[e]);return this}get(){return 0===this.objects.length?this.constructObject():this.objects.pop()}constructObject(){throw new Error("constructObject() not implemented in this Pool subclass yet!")}resize(t){const e=this.objects;for(;e.length>t;)e.pop();for(;e.length<t;)e.push(this.constructObject());return this}}class ui extends di{constructor(){super(...arguments),this.type=i}constructObject(){return new i}}const pi={sphereSphere:m.types.SPHERE,spherePlane:m.types.SPHERE|m.types.PLANE,boxBox:m.types.BOX|m.types.BOX,sphereBox:m.types.SPHERE|m.types.BOX,planeBox:m.types.PLANE|m.types.BOX,convexConvex:m.types.CONVEXPOLYHEDRON,sphereConvex:m.types.SPHERE|m.types.CONVEXPOLYHEDRON,planeConvex:m.types.PLANE|m.types.CONVEXPOLYHEDRON,boxConvex:m.types.BOX|m.types.CONVEXPOLYHEDRON,sphereHeightfield:m.types.SPHERE|m.types.HEIGHTFIELD,boxHeightfield:m.types.BOX|m.types.HEIGHTFIELD,convexHeightfield:m.types.CONVEXPOLYHEDRON|m.types.HEIGHTFIELD,sphereParticle:m.types.PARTICLE|m.types.SPHERE,planeParticle:m.types.PLANE|m.types.PARTICLE,boxParticle:m.types.BOX|m.types.PARTICLE,convexParticle:m.types.PARTICLE|m.types.CONVEXPOLYHEDRON,cylinderCylinder:m.types.CYLINDER,sphereCylinder:m.types.SPHERE|m.types.CYLINDER,planeCylinder:m.types.PLANE|m.types.CYLINDER,boxCylinder:m.types.BOX|m.types.CYLINDER,convexCylinder:m.types.CONVEXPOLYHEDRON|m.types.CYLINDER,heightfieldCylinder:m.types.HEIGHTFIELD|m.types.CYLINDER,particleCylinder:m.types.PARTICLE|m.types.CYLINDER,sphereTrimesh:m.types.SPHERE|m.types.TRIMESH,planeTrimesh:m.types.PLANE|m.types.TRIMESH};class yi{get[pi.sphereSphere](){return this.sphereSphere}get[pi.spherePlane](){return this.spherePlane}get[pi.boxBox](){return this.boxBox}get[pi.sphereBox](){return this.sphereBox}get[pi.planeBox](){return this.planeBox}get[pi.convexConvex](){return this.convexConvex}get[pi.sphereConvex](){return this.sphereConvex}get[pi.planeConvex](){return this.planeConvex}get[pi.boxConvex](){return this.boxConvex}get[pi.sphereHeightfield](){return this.sphereHeightfield}get[pi.boxHeightfield](){return this.boxHeightfield}get[pi.convexHeightfield](){return this.convexHeightfield}get[pi.sphereParticle](){return this.sphereParticle}get[pi.planeParticle](){return this.planeParticle}get[pi.boxParticle](){return this.boxParticle}get[pi.convexParticle](){return this.convexParticle}get[pi.cylinderCylinder](){return this.convexConvex}get[pi.sphereCylinder](){return this.sphereConvex}get[pi.planeCylinder](){return this.planeConvex}get[pi.boxCylinder](){return this.boxConvex}get[pi.convexCylinder](){return this.convexConvex}get[pi.heightfieldCylinder](){return this.heightfieldCylinder}get[pi.particleCylinder](){return this.particleCylinder}get[pi.sphereTrimesh](){return this.sphereTrimesh}get[pi.planeTrimesh](){return this.planeTrimesh}constructor(t){this.contactPointPool=[],this.frictionEquationPool=[],this.result=[],this.frictionResult=[],this.v3pool=new ui,this.world=t,this.currentContactMaterial=t.defaultContactMaterial,this.enableFrictionReduction=!1}createContactEquation(t,e,s,i,o,n){let r;this.contactPointPool.length?(r=this.contactPointPool.pop(),r.bi=t,r.bj=e):r=new Gt(t,e),r.enabled=t.collisionResponse&&e.collisionResponse&&s.collisionResponse&&i.collisionResponse;const a=this.currentContactMaterial;r.restitution=a.restitution,r.setSpookParams(a.contactEquationStiffness,a.contactEquationRelaxation,this.world.dt);const l=s.material||t.material,h=i.material||e.material;return l&&h&&l.restitution>=0&&h.restitution>=0&&(r.restitution=l.restitution*h.restitution),r.si=o||s,r.sj=n||i,r}createFrictionEquationsFromContact(t,e){const s=t.bi,i=t.bj,o=t.si,n=t.sj,r=this.world,a=this.currentContactMaterial;let l=a.friction;const h=o.material||s.material,c=n.material||i.material;if(h&&c&&h.friction>=0&&c.friction>=0&&(l=h.friction*c.friction),l>0){const o=l*(r.frictionGravity||r.gravity).length();let n=s.invMass+i.invMass;n>0&&(n=1/n);const h=this.frictionEquationPool,c=h.length?h.pop():new ve(s,i,o*n),d=h.length?h.pop():new ve(s,i,o*n);return c.bi=d.bi=s,c.bj=d.bj=i,c.minForce=d.minForce=-o*n,c.maxForce=d.maxForce=o*n,c.ri.copy(t.ri),c.rj.copy(t.rj),d.ri.copy(t.ri),d.rj.copy(t.rj),t.ni.tangents(c.t,d.t),c.setSpookParams(a.frictionEquationStiffness,a.frictionEquationRelaxation,r.dt),d.setSpookParams(a.frictionEquationStiffness,a.frictionEquationRelaxation,r.dt),c.enabled=d.enabled=t.enabled,e.push(c,d),!0}return!1}createFrictionFromAverage(t){let e=this.result[this.result.length-1];if(!this.createFrictionEquationsFromContact(e,this.frictionResult)||1===t)return;const s=this.frictionResult[this.frictionResult.length-2],i=this.frictionResult[this.frictionResult.length-1];vi.setZero(),mi.setZero(),gi.setZero();const o=e.bi;e.bj;for(let s=0;s!==t;s++)e=this.result[this.result.length-1-s],e.bi!==o?(vi.vadd(e.ni,vi),mi.vadd(e.ri,mi),gi.vadd(e.rj,gi)):(vi.vsub(e.ni,vi),mi.vadd(e.rj,mi),gi.vadd(e.ri,gi));const n=1/t;mi.scale(n,s.ri),gi.scale(n,s.rj),i.ri.copy(s.ri),i.rj.copy(s.rj),vi.normalize(),vi.tangents(s.t,i.t)}getContacts(t,e,s,i,o,n,r){this.contactPointPool=o,this.frictionEquationPool=r,this.result=i,this.frictionResult=n;const a=xi,l=bi,h=wi,c=fi;for(let i=0,o=t.length;i!==o;i++){const o=t[i],n=e[i];let r=null;o.material&&n.material&&(r=s.getContactMaterial(o.material,n.material)||null);const d=o.type&M.KINEMATIC&&n.type&M.STATIC||o.type&M.STATIC&&n.type&M.KINEMATIC||o.type&M.KINEMATIC&&n.type&M.KINEMATIC;for(let t=0;t<o.shapes.length;t++){o.quaternion.mult(o.shapeOrientations[t],a),o.quaternion.vmult(o.shapeOffsets[t],h),h.vadd(o.position,h);const e=o.shapes[t];for(let t=0;t<n.shapes.length;t++){n.quaternion.mult(n.shapeOrientations[t],l),n.quaternion.vmult(n.shapeOffsets[t],c),c.vadd(n.position,c);const i=n.shapes[t];if(!(e.collisionFilterMask&i.collisionFilterGroup&&i.collisionFilterMask&e.collisionFilterGroup))continue;if(h.distanceTo(c)>e.boundingSphereRadius+i.boundingSphereRadius)continue;let u=null;e.material&&i.material&&(u=s.getContactMaterial(e.material,i.material)||null),this.currentContactMaterial=u||r||s.defaultContactMaterial;const p=this[e.type|i.type];if(p){let t=!1;t=e.type<i.type?p.call(this,e,i,h,c,a,l,o,n,e,i,d):p.call(this,i,e,c,h,l,a,n,o,e,i,d),t&&d&&(s.shapeOverlapKeeper.set(e.id,i.id),s.bodyOverlapKeeper.set(o.id,n.id))}}}}}sphereSphere(t,e,s,i,o,n,r,a,l,h,c){if(c)return s.distanceSquared(i)<(t.radius+e.radius)**2;const d=this.createContactEquation(r,a,t,e,l,h);i.vsub(s,d.ni),d.ni.normalize(),d.ri.copy(d.ni),d.rj.copy(d.ni),d.ri.scale(t.radius,d.ri),d.rj.scale(-e.radius,d.rj),d.ri.vadd(s,d.ri),d.ri.vsub(r.position,d.ri),d.rj.vadd(i,d.rj),d.rj.vsub(a.position,d.rj),this.result.push(d),this.createFrictionEquationsFromContact(d,this.frictionResult)}spherePlane(t,e,s,i,o,n,r,a,l,h,c){const d=this.createContactEquation(r,a,t,e,l,h);if(d.ni.set(0,0,1),n.vmult(d.ni,d.ni),d.ni.negate(d.ni),d.ni.normalize(),d.ni.scale(t.radius,d.ri),s.vsub(i,Oi),d.ni.scale(d.ni.dot(Oi),ki),Oi.vsub(ki,d.rj),-Oi.dot(d.ni)<=t.radius){if(c)return!0;const t=d.ri,e=d.rj;t.vadd(s,t),t.vsub(r.position,t),e.vadd(i,e),e.vsub(a.position,e),this.result.push(d),this.createFrictionEquationsFromContact(d,this.frictionResult)}}boxBox(t,e,s,i,o,n,r,a,l,h,c){return t.convexPolyhedronRepresentation.material=t.material,e.convexPolyhedronRepresentation.material=e.material,t.convexPolyhedronRepresentation.collisionResponse=t.collisionResponse,e.convexPolyhedronRepresentation.collisionResponse=e.collisionResponse,this.convexConvex(t.convexPolyhedronRepresentation,e.convexPolyhedronRepresentation,s,i,o,n,r,a,t,e,c)}sphereBox(t,e,s,i,o,n,r,a,l,h,c){const d=this.v3pool,u=Ki;s.vsub(i,Gi),e.getSideNormals(u,n);const p=t.radius;let y=!1;const v=Qi,m=Ji,g=to;let w=null,f=0,x=0,b=0,A=null;for(let t=0,e=u.length;t!==e&&!1===y;t++){const e=Yi;e.copy(u[t]);const s=e.length();e.normalize();const i=Gi.dot(e);if(i<s+p&&i>0){const o=Xi,n=$i;o.copy(u[(t+1)%3]),n.copy(u[(t+2)%3]);const r=o.length(),a=n.length();o.normalize(),n.normalize();const l=Gi.dot(o),h=Gi.dot(n);if(l<r&&l>-r&&h<a&&h>-a){const t=Math.abs(i-s-p);if((null===A||t<A)&&(A=t,x=l,b=h,w=s,v.copy(e),m.copy(o),g.copy(n),f++,c))return!0}}}if(f){y=!0;const o=this.createContactEquation(r,a,t,e,l,h);v.scale(-p,o.ri),o.ni.copy(v),o.ni.negate(o.ni),v.scale(w,v),m.scale(x,m),v.vadd(m,v),g.scale(b,g),v.vadd(g,o.rj),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),o.rj.vadd(i,o.rj),o.rj.vsub(a.position,o.rj),this.result.push(o),this.createFrictionEquationsFromContact(o,this.frictionResult)}let B=d.get();const E=Zi;for(let o=0;2!==o&&!y;o++)for(let n=0;2!==n&&!y;n++)for(let d=0;2!==d&&!y;d++)if(B.set(0,0,0),o?B.vadd(u[0],B):B.vsub(u[0],B),n?B.vadd(u[1],B):B.vsub(u[1],B),d?B.vadd(u[2],B):B.vsub(u[2],B),i.vadd(B,E),E.vsub(s,E),E.lengthSquared()<p*p){if(c)return!0;y=!0;const o=this.createContactEquation(r,a,t,e,l,h);o.ri.copy(E),o.ri.normalize(),o.ni.copy(o.ri),o.ri.scale(p,o.ri),o.rj.copy(B),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),o.rj.vadd(i,o.rj),o.rj.vsub(a.position,o.rj),this.result.push(o),this.createFrictionEquationsFromContact(o,this.frictionResult)}d.release(B),B=null;const z=d.get(),S=d.get(),C=d.get(),F=d.get(),M=d.get(),R=u.length;for(let o=0;o!==R&&!y;o++)for(let n=0;n!==R&&!y;n++)if(o%3!=n%3){u[n].cross(u[o],z),z.normalize(),u[o].vadd(u[n],S),C.copy(s),C.vsub(S,C),C.vsub(i,C);const d=C.dot(z);z.scale(d,F);let v=0;for(;v===o%3||v===n%3;)v++;M.copy(s),M.vsub(F,M),M.vsub(S,M),M.vsub(i,M);const m=Math.abs(d),g=M.length();if(m<u[v].length()&&g<p){if(c)return!0;y=!0;const o=this.createContactEquation(r,a,t,e,l,h);S.vadd(F,o.rj),o.rj.copy(o.rj),M.negate(o.ni),o.ni.normalize(),o.ri.copy(o.rj),o.ri.vadd(i,o.ri),o.ri.vsub(s,o.ri),o.ri.normalize(),o.ri.scale(p,o.ri),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),o.rj.vadd(i,o.rj),o.rj.vsub(a.position,o.rj),this.result.push(o),this.createFrictionEquationsFromContact(o,this.frictionResult)}}d.release(z,S,C,F,M)}planeBox(t,e,s,i,o,n,r,a,l,h,c){return e.convexPolyhedronRepresentation.material=e.material,e.convexPolyhedronRepresentation.collisionResponse=e.collisionResponse,e.convexPolyhedronRepresentation.id=e.id,this.planeConvex(t,e.convexPolyhedronRepresentation,s,i,o,n,r,a,t,e,c)}convexConvex(t,e,s,i,o,n,r,a,l,h,c,d,u){const p=mo;if(!(s.distanceTo(i)>t.boundingSphereRadius+e.boundingSphereRadius)&&t.findSeparatingAxis(e,s,o,i,n,p,d,u)){const d=[],u=go;t.clipAgainstHull(s,o,e,i,n,p,-100,100,d);let y=0;for(let o=0;o!==d.length;o++){if(c)return!0;const n=this.createContactEquation(r,a,t,e,l,h),v=n.ri,m=n.rj;p.negate(n.ni),d[o].normal.negate(u),u.scale(d[o].depth,u),d[o].point.vadd(u,v),m.copy(d[o].point),v.vsub(s,v),m.vsub(i,m),v.vadd(s,v),v.vsub(r.position,v),m.vadd(i,m),m.vsub(a.position,m),this.result.push(n),y++,this.enableFrictionReduction||this.createFrictionEquationsFromContact(n,this.frictionResult)}this.enableFrictionReduction&&y&&this.createFrictionFromAverage(y)}}sphereConvex(t,e,s,i,o,n,r,a,l,h,c){const d=this.v3pool;s.vsub(i,eo);const u=e.faceNormals,p=e.faces,y=e.vertices,v=t.radius;let m=!1;for(let o=0;o!==y.length;o++){const d=y[o],u=no;n.vmult(d,u),i.vadd(u,u);const p=oo;if(u.vsub(s,p),p.lengthSquared()<v*v){if(c)return!0;m=!0;const o=this.createContactEquation(r,a,t,e,l,h);return o.ri.copy(p),o.ri.normalize(),o.ni.copy(o.ri),o.ri.scale(v,o.ri),u.vsub(i,o.rj),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),o.rj.vadd(i,o.rj),o.rj.vsub(a.position,o.rj),this.result.push(o),void this.createFrictionEquationsFromContact(o,this.frictionResult)}}for(let o=0,g=p.length;o!==g&&!1===m;o++){const g=u[o],w=p[o],f=ro;n.vmult(g,f);const x=ao;n.vmult(y[w[0]],x),x.vadd(i,x);const b=lo;f.scale(-v,b),s.vadd(b,b);const A=ho;b.vsub(x,A);const B=A.dot(f),E=co;if(s.vsub(x,E),B<0&&E.dot(f)>0){const o=[];for(let t=0,e=w.length;t!==e;t++){const e=d.get();n.vmult(y[w[t]],e),i.vadd(e,e),o.push(e)}if(Di(o,f,s)){if(c)return!0;m=!0;const n=this.createContactEquation(r,a,t,e,l,h);f.scale(-v,n.ri),f.negate(n.ni);const u=d.get();f.scale(-B,u);const p=d.get();f.scale(-v,p),s.vsub(i,n.rj),n.rj.vadd(p,n.rj),n.rj.vadd(u,n.rj),n.rj.vadd(i,n.rj),n.rj.vsub(a.position,n.rj),n.ri.vadd(s,n.ri),n.ri.vsub(r.position,n.ri),d.release(u),d.release(p),this.result.push(n),this.createFrictionEquationsFromContact(n,this.frictionResult);for(let t=0,e=o.length;t!==e;t++)d.release(o[t]);return}for(let u=0;u!==w.length;u++){const p=d.get(),m=d.get();n.vmult(y[w[(u+1)%w.length]],p),n.vmult(y[w[(u+2)%w.length]],m),i.vadd(p,p),i.vadd(m,m);const g=so;m.vsub(p,g);const f=io;g.unit(f);const x=d.get(),b=d.get();s.vsub(p,b);const A=b.dot(f);f.scale(A,x),x.vadd(p,x);const B=d.get();if(x.vsub(s,B),A>0&&A*A<g.lengthSquared()&&B.lengthSquared()<v*v){if(c)return!0;const n=this.createContactEquation(r,a,t,e,l,h);x.vsub(i,n.rj),x.vsub(s,n.ni),n.ni.normalize(),n.ni.scale(v,n.ri),n.rj.vadd(i,n.rj),n.rj.vsub(a.position,n.rj),n.ri.vadd(s,n.ri),n.ri.vsub(r.position,n.ri),this.result.push(n),this.createFrictionEquationsFromContact(n,this.frictionResult);for(let t=0,e=o.length;t!==e;t++)d.release(o[t]);return d.release(p),d.release(m),d.release(x),d.release(B),void d.release(b)}d.release(p),d.release(m),d.release(x),d.release(B),d.release(b)}for(let t=0,e=o.length;t!==e;t++)d.release(o[t])}}}planeConvex(t,e,s,i,o,n,r,a,l,h,c){const d=uo,u=po;u.set(0,0,1),o.vmult(u,u);let p=0;const y=yo;for(let o=0;o!==e.vertices.length;o++){d.copy(e.vertices[o]),n.vmult(d,d),i.vadd(d,d),d.vsub(s,y);if(u.dot(y)<=0){if(c)return!0;const o=this.createContactEquation(r,a,t,e,l,h),n=vo;u.scale(u.dot(y),n),d.vsub(n,n),n.vsub(s,o.ri),o.ni.copy(u),d.vsub(i,o.rj),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),o.rj.vadd(i,o.rj),o.rj.vsub(a.position,o.rj),this.result.push(o),p++,this.enableFrictionReduction||this.createFrictionEquationsFromContact(o,this.frictionResult)}}this.enableFrictionReduction&&p&&this.createFrictionFromAverage(p)}boxConvex(t,e,s,i,o,n,r,a,l,h,c){return t.convexPolyhedronRepresentation.material=t.material,t.convexPolyhedronRepresentation.collisionResponse=t.collisionResponse,this.convexConvex(t.convexPolyhedronRepresentation,e,s,i,o,n,r,a,t,e,c)}sphereHeightfield(t,e,s,i,o,n,r,a,l,h,c){const d=e.data,u=t.radius,p=e.elementSize,y=Io,v=Ro;g.pointToLocalFrame(i,n,s,v);let m=Math.floor((v.x-u)/p)-1,w=Math.ceil((v.x+u)/p)+1,f=Math.floor((v.y-u)/p)-1,x=Math.ceil((v.y+u)/p)+1;if(w<0||x<0||m>d.length||f>d[0].length)return;m<0&&(m=0),w<0&&(w=0),f<0&&(f=0),x<0&&(x=0),m>=d.length&&(m=d.length-1),w>=d.length&&(w=d.length-1),x>=d[0].length&&(x=d[0].length-1),f>=d[0].length&&(f=d[0].length-1);const b=[];e.getRectMinMax(m,f,w,x,b);const A=b[0],B=b[1];if(v.z-u>B||v.z+u<A)return;const E=this.result;for(let l=m;l<w;l++)for(let h=f;h<x;h++){const d=E.length;let u=!1;if(e.getConvexTrianglePillar(l,h,!1),g.pointToWorldFrame(i,n,e.pillarOffset,y),s.distanceTo(y)<e.pillarConvex.boundingSphereRadius+t.boundingSphereRadius&&(u=this.sphereConvex(t,e.pillarConvex,s,y,o,n,r,a,t,e,c)),c&&u)return!0;if(e.getConvexTrianglePillar(l,h,!0),g.pointToWorldFrame(i,n,e.pillarOffset,y),s.distanceTo(y)<e.pillarConvex.boundingSphereRadius+t.boundingSphereRadius&&(u=this.sphereConvex(t,e.pillarConvex,s,y,o,n,r,a,t,e,c)),c&&u)return!0;if(E.length-d>2)return}}boxHeightfield(t,e,s,i,o,n,r,a,l,h,c){return t.convexPolyhedronRepresentation.material=t.material,t.convexPolyhedronRepresentation.collisionResponse=t.collisionResponse,this.convexHeightfield(t.convexPolyhedronRepresentation,e,s,i,o,n,r,a,t,e,c)}convexHeightfield(t,e,s,i,o,n,r,a,l,h,c){const d=e.data,u=e.elementSize,p=t.boundingSphereRadius,y=Fo,v=Mo,m=Co;g.pointToLocalFrame(i,n,s,m);let w=Math.floor((m.x-p)/u)-1,f=Math.ceil((m.x+p)/u)+1,x=Math.floor((m.y-p)/u)-1,b=Math.ceil((m.y+p)/u)+1;if(f<0||b<0||w>d.length||x>d[0].length)return;w<0&&(w=0),f<0&&(f=0),x<0&&(x=0),b<0&&(b=0),w>=d.length&&(w=d.length-1),f>=d.length&&(f=d.length-1),b>=d[0].length&&(b=d[0].length-1),x>=d[0].length&&(x=d[0].length-1);const A=[];e.getRectMinMax(w,x,f,b,A);const B=A[0],E=A[1];if(!(m.z-p>E||m.z+p<B))for(let l=w;l<f;l++)for(let h=x;h<b;h++){let d=!1;if(e.getConvexTrianglePillar(l,h,!1),g.pointToWorldFrame(i,n,e.pillarOffset,y),s.distanceTo(y)<e.pillarConvex.boundingSphereRadius+t.boundingSphereRadius&&(d=this.convexConvex(t,e.pillarConvex,s,y,o,n,r,a,null,null,c,v,null)),c&&d)return!0;if(e.getConvexTrianglePillar(l,h,!0),g.pointToWorldFrame(i,n,e.pillarOffset,y),s.distanceTo(y)<e.pillarConvex.boundingSphereRadius+t.boundingSphereRadius&&(d=this.convexConvex(t,e.pillarConvex,s,y,o,n,r,a,null,null,c,v,null)),c&&d)return!0}}sphereParticle(t,e,s,i,o,n,r,a,l,h,c){const d=bo;d.set(0,0,1),i.vsub(s,d);if(d.lengthSquared()<=t.radius*t.radius){if(c)return!0;const s=this.createContactEquation(a,r,e,t,l,h);d.normalize(),s.rj.copy(d),s.rj.scale(t.radius,s.rj),s.ni.copy(d),s.ni.negate(s.ni),s.ri.set(0,0,0),this.result.push(s),this.createFrictionEquationsFromContact(s,this.frictionResult)}}planeParticle(t,e,s,i,o,n,r,a,l,h,c){const d=wo;d.set(0,0,1),r.quaternion.vmult(d,d);const u=fo;i.vsub(r.position,u);if(d.dot(u)<=0){if(c)return!0;const s=this.createContactEquation(a,r,e,t,l,h);s.ni.copy(d),s.ni.negate(s.ni),s.ri.set(0,0,0);const o=xo;d.scale(d.dot(i),o),i.vsub(o,o),s.rj.copy(o),this.result.push(s),this.createFrictionEquationsFromContact(s,this.frictionResult)}}boxParticle(t,e,s,i,o,n,r,a,l,h,c){return t.convexPolyhedronRepresentation.material=t.material,t.convexPolyhedronRepresentation.collisionResponse=t.collisionResponse,this.convexParticle(t.convexPolyhedronRepresentation,e,s,i,o,n,r,a,t,e,c)}convexParticle(t,e,s,i,o,n,r,a,l,h,c){let d=-1;const u=Eo,p=So;let y=null;const v=Bo;if(v.copy(i),v.vsub(s,v),o.conjugate(Ao),Ao.vmult(v,v),t.pointIsInside(v)){t.worldVerticesNeedsUpdate&&t.computeWorldVertices(s,o),t.worldFaceNormalsNeedsUpdate&&t.computeWorldFaceNormals(o);for(let e=0,s=t.faces.length;e!==s;e++){const s=[t.worldVertices[t.faces[e][0]]],o=t.worldFaceNormals[e];i.vsub(s[0],zo);const n=-o.dot(zo);if(null===y||Math.abs(n)<Math.abs(y)){if(c)return!0;y=n,d=e,u.copy(o)}}if(-1!==d){const o=this.createContactEquation(a,r,e,t,l,h);u.scale(y,p),p.vadd(i,p),p.vsub(s,p),o.rj.copy(p),u.negate(o.ni),o.ri.set(0,0,0);const n=o.ri,c=o.rj;n.vadd(i,n),n.vsub(a.position,n),c.vadd(s,c),c.vsub(r.position,c),this.result.push(o),this.createFrictionEquationsFromContact(o,this.frictionResult)}else console.warn("Point found inside convex, but did not find penetrating face!")}}heightfieldCylinder(t,e,s,i,o,n,r,a,l,h,c){return this.convexHeightfield(e,t,i,s,n,o,a,r,l,h,c)}particleCylinder(t,e,s,i,o,n,r,a,l,h,c){return this.convexParticle(e,t,i,s,n,o,a,r,l,h,c)}sphereTrimesh(t,e,s,i,o,n,r,a,l,h,c){const d=Mi,u=Ri,p=Ii,y=Ti,v=Pi,m=qi,w=Vi,f=Fi,x=Si,b=ji;g.pointToLocalFrame(i,n,s,v);const A=t.radius;w.lowerBound.set(v.x-A,v.y-A,v.z-A),w.upperBound.set(v.x+A,v.y+A,v.z+A),e.getTrianglesInAABB(w,b);const B=Ci,E=t.radius*t.radius;for(let o=0;o<b.length;o++)for(let d=0;d<3;d++)if(e.getVertex(e.indices[3*b[o]+d],B),B.vsub(v,x),x.lengthSquared()<=E){if(f.copy(B),g.pointToWorldFrame(i,n,f,B),B.vsub(s,x),c)return!0;let o=this.createContactEquation(r,a,t,e,l,h);o.ni.copy(x),o.ni.normalize(),o.ri.copy(o.ni),o.ri.scale(t.radius,o.ri),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),o.rj.copy(B),o.rj.vsub(a.position,o.rj),this.result.push(o),this.createFrictionEquationsFromContact(o,this.frictionResult)}for(let o=0;o<b.length;o++)for(let w=0;w<3;w++){e.getVertex(e.indices[3*b[o]+w],d),e.getVertex(e.indices[3*b[o]+(w+1)%3],u),u.vsub(d,p),v.vsub(u,m);const f=m.dot(p);v.vsub(d,m);let x=m.dot(p);if(x>0&&f<0){v.vsub(d,m),y.copy(p),y.normalize(),x=m.dot(y),y.scale(x,m),m.vadd(d,m);if(m.distanceTo(v)<t.radius){if(c)return!0;const o=this.createContactEquation(r,a,t,e,l,h);m.vsub(v,o.ni),o.ni.normalize(),o.ni.scale(t.radius,o.ri),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),g.pointToWorldFrame(i,n,m,m),m.vsub(a.position,o.rj),g.vectorToWorldFrame(n,o.ni,o.ni),g.vectorToWorldFrame(n,o.ri,o.ri),this.result.push(o),this.createFrictionEquationsFromContact(o,this.frictionResult)}}}const z=Ni,S=Li,C=Wi,F=zi;for(let o=0,d=b.length;o!==d;o++){e.getTriangleVertices(b[o],z,S,C),e.getNormal(b[o],F),v.vsub(z,m);let d=m.dot(F);if(F.scale(d,m),v.vsub(m,m),d=m.distanceTo(v),rt.pointInTriangle(m,z,S,C)&&d<t.radius){if(c)return!0;let o=this.createContactEquation(r,a,t,e,l,h);m.vsub(v,o.ni),o.ni.normalize(),o.ni.scale(t.radius,o.ri),o.ri.vadd(s,o.ri),o.ri.vsub(r.position,o.ri),g.pointToWorldFrame(i,n,m,m),m.vsub(a.position,o.rj),g.vectorToWorldFrame(n,o.ni,o.ni),g.vectorToWorldFrame(n,o.ri,o.ri),this.result.push(o),this.createFrictionEquationsFromContact(o,this.frictionResult)}}b.length=0}planeTrimesh(t,e,s,o,n,r,a,l,h,c,d){const u=new i,p=Ai;p.set(0,0,1),n.vmult(p,p);for(let n=0;n<e.vertices.length/3;n++){e.getVertex(n,u);const y=new i;y.copy(u),g.pointToWorldFrame(o,r,y,u);const v=Bi;u.vsub(s,v);if(p.dot(v)<=0){if(d)return!0;const s=this.createContactEquation(a,l,t,e,h,c);s.ni.copy(p);const i=Ei;p.scale(v.dot(p),i),u.vsub(i,i),s.ri.copy(i),s.ri.vsub(a.position,s.ri),s.rj.copy(u),s.rj.vsub(l.position,s.rj),this.result.push(s),this.createFrictionEquationsFromContact(s,this.frictionResult)}}}}const vi=new i,mi=new i,gi=new i,wi=new i,fi=new i,xi=new u,bi=new u,Ai=new i,Bi=new i,Ei=new i,zi=new i,Si=new i;new i;const Ci=new i,Fi=new i,Mi=new i,Ri=new i,Ii=new i,Ti=new i,Pi=new i,qi=new i,Ni=new i,Li=new i,Wi=new i,Vi=new a,ji=[],Oi=new i,ki=new i,Hi=new i,_i=new i,Ui=new i;function Di(t,e,s){let i=null;const o=t.length;for(let n=0;n!==o;n++){const r=t[n],a=Hi;t[(n+1)%o].vsub(r,a);const l=_i;a.cross(e,l);const h=Ui;s.vsub(r,h);const c=l.dot(h);if(!(null===i||c>0&&!0===i||c<=0&&!1===i))return!1;null===i&&(i=c>0)}return!0}const Gi=new i,Yi=new i,Xi=new i,$i=new i,Ki=[new i,new i,new i,new i,new i,new i],Zi=new i,Qi=new i,Ji=new i,to=new i,eo=new i,so=new i,io=new i,oo=new i,no=new i,ro=new i,ao=new i,lo=new i,ho=new i,co=new i;new i,new i;const uo=new i,po=new i,yo=new i,vo=new i,mo=new i,go=new i,wo=new i,fo=new i,xo=new i,bo=new i,Ao=new u,Bo=new i;new i;const Eo=new i,zo=new i,So=new i,Co=new i,Fo=new i,Mo=[0],Ro=new i,Io=new i;class To{constructor(){this.current=[],this.previous=[]}getKey(t,e){if(e<t){const s=e;e=t,t=s}return t<<16|e}set(t,e){const s=this.getKey(t,e),i=this.current;let o=0;for(;s>i[o];)o++;if(s!==i[o]){for(let t=i.length-1;t>=o;t--)i[t+1]=i[t];i[o]=s}}tick(){const t=this.current;this.current=this.previous,this.previous=t,this.current.length=0}getDiff(t,e){const s=this.current,i=this.previous,o=s.length,n=i.length;let r=0;for(let e=0;e<o;e++){let o=!1;const n=s[e];for(;n>i[r];)r++;o=n===i[r],o||Po(t,n)}r=0;for(let t=0;t<n;t++){let o=!1;const n=i[t];for(;n>s[r];)r++;o=s[r]===n,o||Po(e,n)}}}function Po(t,e){t.push((4294901760&e)>>16,65535&e)}const qo=(t,e)=>t<e?`${t}-${e}`:`${e}-${t}`;class No{constructor(){this.data={keys:[]}}get(t,e){const s=qo(t,e);return this.data[s]}set(t,e,s){const i=qo(t,e);this.get(t,e)||this.data.keys.push(i),this.data[i]=s}delete(t,e){const s=qo(t,e),i=this.data.keys.indexOf(s);-1!==i&&this.data.keys.splice(i,1),delete this.data[s]}reset(){const t=this.data,e=t.keys;for(;e.length>0;){delete t[e.pop()]}}}class Lo extends d{constructor(t){void 0===t&&(t={}),super(),this.dt=-1,this.allowSleep=!!t.allowSleep,this.contacts=[],this.frictionEquations=[],this.quatNormalizeSkip=void 0!==t.quatNormalizeSkip?t.quatNormalizeSkip:0,this.quatNormalizeFast=void 0!==t.quatNormalizeFast&&t.quatNormalizeFast,this.time=0,this.stepnumber=0,this.default_dt=1/60,this.nextId=0,this.gravity=new i,t.gravity&&this.gravity.copy(t.gravity),t.frictionGravity&&(this.frictionGravity=new i,this.frictionGravity.copy(t.frictionGravity)),this.broadphase=void 0!==t.broadphase?t.broadphase:new K,this.bodies=[],this.hasActiveBodies=!1,this.solver=void 0!==t.solver?t.solver:new Zs,this.constraints=[],this.narrowphase=new yi(this),this.collisionMatrix=new c,this.collisionMatrixPrevious=new c,this.bodyOverlapKeeper=new To,this.shapeOverlapKeeper=new To,this.contactmaterials=[],this.contactMaterialTable=new No,this.defaultMaterial=new fe("default"),this.defaultContactMaterial=new we(this.defaultMaterial,this.defaultMaterial,{friction:.3,restitution:0}),this.doProfiling=!1,this.profile={solve:0,makeContactConstraints:0,broadphase:0,integrate:0,narrowphase:0},this.accumulator=0,this.subsystems=[],this.addBodyEvent={type:"addBody",body:null},this.removeBodyEvent={type:"removeBody",body:null},this.idToBodyMap={},this.broadphase.setWorld(this)}getContactMaterial(t,e){return this.contactMaterialTable.get(t.id,e.id)}collisionMatrixTick(){const t=this.collisionMatrixPrevious;this.collisionMatrixPrevious=this.collisionMatrix,this.collisionMatrix=t,this.collisionMatrix.reset(),this.bodyOverlapKeeper.tick(),this.shapeOverlapKeeper.tick()}addConstraint(t){this.constraints.push(t)}removeConstraint(t){const e=this.constraints.indexOf(t);-1!==e&&this.constraints.splice(e,1)}rayTest(t,e,s){s instanceof Z?this.raycastClosest(t,e,{skipBackfaces:!0},s):this.raycastAll(t,e,{skipBackfaces:!0},s)}raycastAll(t,e,s,i){return void 0===s&&(s={}),s.mode=rt.ALL,s.from=t,s.to=e,s.callback=i,Wo.intersectWorld(this,s)}raycastAny(t,e,s,i){return void 0===s&&(s={}),s.mode=rt.ANY,s.from=t,s.to=e,s.result=i,Wo.intersectWorld(this,s)}raycastClosest(t,e,s,i){return void 0===s&&(s={}),s.mode=rt.CLOSEST,s.from=t,s.to=e,s.result=i,Wo.intersectWorld(this,s)}addBody(t){this.bodies.includes(t)||(t.index=this.bodies.length,this.bodies.push(t),t.world=this,t.initPosition.copy(t.position),t.initVelocity.copy(t.velocity),t.timeLastSleepy=this.time,t instanceof M&&(t.initAngularVelocity.copy(t.angularVelocity),t.initQuaternion.copy(t.quaternion)),this.collisionMatrix.setNumObjects(this.bodies.length),this.addBodyEvent.body=t,this.idToBodyMap[t.id]=t,this.dispatchEvent(this.addBodyEvent))}removeBody(t){t.world=null;const e=this.bodies.length-1,s=this.bodies,i=s.indexOf(t);if(-1!==i){s.splice(i,1);for(let t=0;t!==s.length;t++)s[t].index=t;this.collisionMatrix.setNumObjects(e),this.removeBodyEvent.body=t,delete this.idToBodyMap[t.id],this.dispatchEvent(this.removeBodyEvent)}}getBodyById(t){return this.idToBodyMap[t]}getShapeById(t){const e=this.bodies;for(let s=0;s<e.length;s++){const i=e[s].shapes;for(let e=0;e<i.length;e++){const s=i[e];if(s.id===t)return s}}return null}addContactMaterial(t){this.contactmaterials.push(t),this.contactMaterialTable.set(t.materials[0].id,t.materials[1].id,t)}removeContactMaterial(t){const e=this.contactmaterials.indexOf(t);-1!==e&&(this.contactmaterials.splice(e,1),this.contactMaterialTable.delete(t.materials[0].id,t.materials[1].id))}fixedStep(t,e){void 0===t&&(t=1/60),void 0===e&&(e=10);const s=Vo.now()/1e3;if(this.lastCallTime){const i=s-this.lastCallTime;this.step(t,i,e)}else this.step(t,void 0,e);this.lastCallTime=s}step(t,e,s){if(void 0===s&&(s=10),void 0===e)this.internalStep(t),this.time+=t;else{this.accumulator+=e;const i=Vo.now();let o=0;for(;this.accumulator>=t&&o<s&&(this.internalStep(t),this.accumulator-=t,o++,!(Vo.now()-i>1e3*t)););this.accumulator=this.accumulator%t;const n=this.accumulator/t;for(let t=0;t!==this.bodies.length;t++){const e=this.bodies[t];e.previousPosition.lerp(e.position,n,e.interpolatedPosition),e.previousQuaternion.slerp(e.quaternion,n,e.interpolatedQuaternion),e.previousQuaternion.normalize()}this.time+=e}}internalStep(t){this.dt=t;const e=this.contacts,s=Uo,i=Do,o=this.bodies.length,n=this.bodies,r=this.solver,a=this.gravity,l=this.doProfiling,h=this.profile,c=M.DYNAMIC;let d=-1/0;const u=this.constraints,p=_o;a.length();const y=a.x,v=a.y,m=a.z;let g=0;for(l&&(d=Vo.now()),g=0;g!==o;g++){const t=n[g];if(t.type===c){const e=t.force,s=t.mass;e.x+=s*y,e.y+=s*v,e.z+=s*m}}for(let t=0,e=this.subsystems.length;t!==e;t++)this.subsystems[t].update();l&&(d=Vo.now()),s.length=0,i.length=0,this.broadphase.collisionPairs(this,s,i),l&&(h.broadphase=Vo.now()-d);let w=u.length;for(g=0;g!==w;g++){const t=u[g];if(!t.collideConnected)for(let e=s.length-1;e>=0;e-=1)(t.bodyA===s[e]&&t.bodyB===i[e]||t.bodyB===s[e]&&t.bodyA===i[e])&&(s.splice(e,1),i.splice(e,1))}this.collisionMatrixTick(),l&&(d=Vo.now());const f=Ho,x=e.length;for(g=0;g!==x;g++)f.push(e[g]);e.length=0;const b=this.frictionEquations.length;for(g=0;g!==b;g++)p.push(this.frictionEquations[g]);for(this.frictionEquations.length=0,this.narrowphase.getContacts(s,i,this,e,f,this.frictionEquations,p),l&&(h.narrowphase=Vo.now()-d),l&&(d=Vo.now()),g=0;g<this.frictionEquations.length;g++)r.addEquation(this.frictionEquations[g]);const A=e.length;for(let t=0;t!==A;t++){const s=e[t],i=s.bi,o=s.bj,n=s.si,a=s.sj;let l;if(l=i.material&&o.material&&this.getContactMaterial(i.material,o.material)||this.defaultContactMaterial,l.friction,i.material&&o.material&&(i.material.friction>=0&&o.material.friction>=0&&(i.material.friction,o.material.friction),i.material.restitution>=0&&o.material.restitution>=0&&(s.restitution=i.material.restitution*o.material.restitution)),r.addEquation(s),i.allowSleep&&i.type===M.DYNAMIC&&i.sleepState===M.SLEEPING&&o.sleepState===M.AWAKE&&o.type!==M.STATIC){o.velocity.lengthSquared()+o.angularVelocity.lengthSquared()>=2*o.sleepSpeedLimit**2&&(i.wakeUpAfterNarrowphase=!0)}if(o.allowSleep&&o.type===M.DYNAMIC&&o.sleepState===M.SLEEPING&&i.sleepState===M.AWAKE&&i.type!==M.STATIC){i.velocity.lengthSquared()+i.angularVelocity.lengthSquared()>=2*i.sleepSpeedLimit**2&&(o.wakeUpAfterNarrowphase=!0)}this.collisionMatrix.set(i,o,!0),this.collisionMatrixPrevious.get(i,o)||(ko.body=o,ko.contact=s,i.dispatchEvent(ko),ko.body=i,o.dispatchEvent(ko)),this.bodyOverlapKeeper.set(i.id,o.id),this.shapeOverlapKeeper.set(n.id,a.id)}for(this.emitContactEvents(),l&&(h.makeContactConstraints=Vo.now()-d,d=Vo.now()),g=0;g!==o;g++){const t=n[g];t.wakeUpAfterNarrowphase&&(t.wakeUp(),t.wakeUpAfterNarrowphase=!1)}for(w=u.length,g=0;g!==w;g++){const t=u[g];t.update();for(let e=0,s=t.equations.length;e!==s;e++){const s=t.equations[e];r.addEquation(s)}}r.solve(t,this),l&&(h.solve=Vo.now()-d),r.removeAllEquations();const B=Math.pow;for(g=0;g!==o;g++){const e=n[g];if(e.type&c){const s=B(1-e.linearDamping,t),i=e.velocity;i.scale(s,i);const o=e.angularVelocity;if(o){const s=B(1-e.angularDamping,t);o.scale(s,o)}}}this.dispatchEvent(Oo),l&&(d=Vo.now());const E=this.stepnumber%(this.quatNormalizeSkip+1)==0,z=this.quatNormalizeFast;for(g=0;g!==o;g++)n[g].integrate(t,E,z);this.clearForces(),this.broadphase.dirty=!0,l&&(h.integrate=Vo.now()-d),this.stepnumber+=1,this.dispatchEvent(jo);let S=!0;if(this.allowSleep)for(S=!1,g=0;g!==o;g++){const t=n[g];t.sleepTick(this.time),t.sleepState!==M.SLEEPING&&(S=!0)}this.hasActiveBodies=S}emitContactEvents(){const t=this.hasAnyEventListener("beginContact"),e=this.hasAnyEventListener("endContact");if((t||e)&&this.bodyOverlapKeeper.getDiff(Go,Yo),t){for(let t=0,e=Go.length;t<e;t+=2)Xo.bodyA=this.getBodyById(Go[t]),Xo.bodyB=this.getBodyById(Go[t+1]),this.dispatchEvent(Xo);Xo.bodyA=Xo.bodyB=null}if(e){for(let t=0,e=Yo.length;t<e;t+=2)$o.bodyA=this.getBodyById(Yo[t]),$o.bodyB=this.getBodyById(Yo[t+1]),this.dispatchEvent($o);$o.bodyA=$o.bodyB=null}Go.length=Yo.length=0;const s=this.hasAnyEventListener("beginShapeContact"),i=this.hasAnyEventListener("endShapeContact");if((s||i)&&this.shapeOverlapKeeper.getDiff(Go,Yo),s){for(let t=0,e=Go.length;t<e;t+=2){const e=this.getShapeById(Go[t]),s=this.getShapeById(Go[t+1]);Ko.shapeA=e,Ko.shapeB=s,e&&(Ko.bodyA=e.body),s&&(Ko.bodyB=s.body),this.dispatchEvent(Ko)}Ko.bodyA=Ko.bodyB=Ko.shapeA=Ko.shapeB=null}if(i){for(let t=0,e=Yo.length;t<e;t+=2){const e=this.getShapeById(Yo[t]),s=this.getShapeById(Yo[t+1]);Zo.shapeA=e,Zo.shapeB=s,e&&(Zo.bodyA=e.body),s&&(Zo.bodyB=s.body),this.dispatchEvent(Zo)}Zo.bodyA=Zo.bodyB=Zo.shapeA=Zo.shapeB=null}}clearForces(){const t=this.bodies,e=t.length;for(let s=0;s!==e;s++){const e=t[s];e.force,e.torque,e.force.set(0,0,0),e.torque.set(0,0,0)}}}new a;const Wo=new rt,Vo=globalThis.performance||{};if(!Vo.now){let t=Date.now();Vo.timing&&Vo.timing.navigationStart&&(t=Vo.timing.navigationStart),Vo.now=()=>Date.now()-t}new i;const jo={type:"postStep"},Oo={type:"preStep"},ko={type:M.COLLIDE_EVENT_NAME,body:null,contact:null},Ho=[],_o=[],Uo=[],Do=[],Go=[],Yo=[],Xo={type:"beginContact",bodyA:null,bodyB:null},$o={type:"endContact",bodyA:null,bodyB:null},Ko={type:"beginShapeContact",bodyA:null,bodyB:null,shapeA:null,shapeB:null},Zo={type:"endShapeContact",bodyA:null,bodyB:null,shapeA:null,shapeB:null};export{a as AABB,c as ArrayCollisionMatrix,F as BODY_SLEEP_STATES,C as BODY_TYPES,M as Body,E as Box,_ as Broadphase,pi as COLLISION_TYPES,le as ConeTwistConstraint,Wt as Constraint,Gt as ContactEquation,we as ContactMaterial,f as ConvexPolyhedron,gs as Cylinder,he as DistanceConstraint,jt as Equation,d as EventTarget,ve as FrictionEquation,Zs as GSSolver,X as GridBroadphase,bs as Heightfield,ue as HingeConstraint,Vt as JacobianElement,ce as LockConstraint,e as Mat3,fe as Material,K as NaiveBroadphase,yi as Narrowphase,t as ObjectCollisionMatrix,ws as Particle,fs as Plane,ee as PointToPointConstraint,di as Pool,u as Quaternion,nt as RAY_MODES,rt as Ray,Z as RaycastResult,Ne as RaycastVehicle,rs as RigidVehicle,ne as RotationalEquation,de as RotationalMotorEquation,Nt as SAPBroadphase,v as SHAPE_TYPES,hs as SPHSystem,m as Shape,Ks as Solver,ns as Sphere,ei as SplitSolver,xe as Spring,g as Transform,Ls as Trimesh,i as Vec3,ui as Vec3Pool,Te as WheelInfo,Lo as World};