UNPKG

gpu-curtains

Version:

gpu-curtains is a 3D WebGPU rendering engine. It can be used as a standalone 3D engine, but also includes extra classes focused on mapping 3d objects to DOM elements; It allows users to synchronize values such as position, sizing, or scale between them.

10 lines (7 loc) 434 kB
var Tu=Object.defineProperty;var u=(S,O)=>Tu(S,"name",{value:O,configurable:!0});(function(S,O){typeof exports=="object"&&typeof module<"u"?O(exports):typeof define=="function"&&define.amd?define(["exports"],O):(S=typeof globalThis<"u"?globalThis:S||self,O(S.window=S.window||{}))})(this,function(S){"use strict";const O=u(()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{const e=Math.random()*16|0;return(r==="x"?e:e&3|8).toString(16).toUpperCase()}),"generateUUID"),It=u(r=>r.replace(/(?:^\w|[A-Z]|\b\w)/g,(e,t)=>t===0?e.toLowerCase():e.toUpperCase()).replace(/\s+/g,""),"toCamelCase"),et=u(r=>{const e=It(r);return e.charAt(0).toUpperCase()+e.slice(1)},"toKebabCase");let ks=0;const L=u(r=>{ks>100||(console.warn(ks===100?"GPUCurtains: too many warnings thrown, stop logging.":r),ks++)},"throwWarning"),ae=u(r=>{throw new Error(r)},"throwError");class ce{static{u(this,"Quat")}constructor(e=new Float32Array([0,0,0,1]),t="XYZ"){this.type="Quat",this.elements=e,this.axisOrder=t}setFromArray(e=new Float32Array([0,0,0,1])){return this.elements[0]=e[0],this.elements[1]=e[1],this.elements[2]=e[2],this.elements[3]=e[3],this}setAxisOrder(e="XYZ"){switch(e=e.toUpperCase(),e){case"XYZ":case"YXZ":case"ZXY":case"ZYX":case"YZX":case"XZY":this.axisOrder=e;break;default:this.axisOrder="XYZ"}return this}copy(e=new ce){return this.elements.set(e.elements),this.axisOrder=e.axisOrder,this}clone(){return new ce().copy(this)}equals(e=new ce){return this.elements[0]===e.elements[0]&&this.elements[1]===e.elements[1]&&this.elements[2]===e.elements[2]&&this.elements[3]===e.elements[3]&&this.axisOrder===e.axisOrder}setFromVec3(e){const t=e.x*.5,i=e.y*.5,s=e.z*.5,n=Math.cos(t),a=Math.cos(i),o=Math.cos(s),h=Math.sin(t),l=Math.sin(i),d=Math.sin(s);return this.axisOrder==="XYZ"?(this.elements[0]=h*a*o+n*l*d,this.elements[1]=n*l*o-h*a*d,this.elements[2]=n*a*d+h*l*o,this.elements[3]=n*a*o-h*l*d):this.axisOrder==="YXZ"?(this.elements[0]=h*a*o+n*l*d,this.elements[1]=n*l*o-h*a*d,this.elements[2]=n*a*d-h*l*o,this.elements[3]=n*a*o+h*l*d):this.axisOrder==="ZXY"?(this.elements[0]=h*a*o-n*l*d,this.elements[1]=n*l*o+h*a*d,this.elements[2]=n*a*d+h*l*o,this.elements[3]=n*a*o-h*l*d):this.axisOrder==="ZYX"?(this.elements[0]=h*a*o-n*l*d,this.elements[1]=n*l*o+h*a*d,this.elements[2]=n*a*d-h*l*o,this.elements[3]=n*a*o+h*l*d):this.axisOrder==="YZX"?(this.elements[0]=h*a*o+n*l*d,this.elements[1]=n*l*o+h*a*d,this.elements[2]=n*a*d-h*l*o,this.elements[3]=n*a*o-h*l*d):this.axisOrder==="XZY"&&(this.elements[0]=h*a*o-n*l*d,this.elements[1]=n*l*o-h*a*d,this.elements[2]=n*a*d+h*l*o,this.elements[3]=n*a*o+h*l*d),this}setFromAxisAngle(e,t=0){const i=t/2,s=Math.sin(i);return this.elements[0]=e.x*s,this.elements[1]=e.y*s,this.elements[2]=e.z*s,this.elements[3]=Math.cos(i),this}setFromRotationMatrix(e){const t=e.elements,i=t[0],s=t[4],n=t[8],a=t[1],o=t[5],h=t[9],l=t[2],d=t[6],c=t[10],p=i+o+c;if(p>0){const f=.5/Math.sqrt(p+1);this.elements[3]=.25/f,this.elements[0]=(d-h)*f,this.elements[1]=(n-l)*f,this.elements[2]=(a-s)*f}else if(i>o&&i>c){const f=2*Math.sqrt(1+i-o-c);this.elements[3]=(d-h)/f,this.elements[0]=.25*f,this.elements[1]=(s+a)/f,this.elements[2]=(n+l)/f}else if(o>c){const f=2*Math.sqrt(1+o-i-c);this.elements[3]=(n-l)/f,this.elements[0]=(s+a)/f,this.elements[1]=.25*f,this.elements[2]=(h+d)/f}else{const f=2*Math.sqrt(1+c-i-o);this.elements[3]=(a-s)/f,this.elements[0]=(n+l)/f,this.elements[1]=(h+d)/f,this.elements[2]=.25*f}return this}lengthSq(){return this.elements[0]*this.elements[0]+this.elements[1]*this.elements[1]+this.elements[2]*this.elements[2]+this.elements[3]*this.elements[3]}length(){return Math.sqrt(this.lengthSq())}normalize(){let e=this.length();return e===0?(this.elements[0]=0,this.elements[1]=0,this.elements[2]=0,this.elements[3]=1):(e=1/e,this.elements[0]=this.elements[0]*e,this.elements[1]=this.elements[1]*e,this.elements[2]=this.elements[2]*e,this.elements[3]=this.elements[3]*e),this}slerp(e=new ce,t=0){if(t===0)return this;if(t===1)return this.copy(e);const i=this.elements[0],s=this.elements[1],n=this.elements[2],a=this.elements[3];let o=a*e.elements[3]+i*e.elements[0]+s*e.elements[1]+n*e.elements[2];if(o<0?(this.elements[3]=-e.elements[3],this.elements[0]=-e.elements[0],this.elements[1]=-e.elements[1],this.elements[2]=-e.elements[2],o=-o):this.copy(e),o>=1)return this.elements[3]=a,this.elements[0]=i,this.elements[1]=s,this.elements[2]=n,this;const h=1-o*o;if(h<=Number.EPSILON){const f=1-t;return this.elements[3]=f*a+t*this.elements[3],this.elements[0]=f*i+t*this.elements[0],this.elements[1]=f*s+t*this.elements[1],this.elements[2]=f*n+t*this.elements[2],this.normalize(),this}const l=Math.sqrt(h),d=Math.atan2(l,o),c=Math.sin((1-t)*d)/l,p=Math.sin(t*d)/l;return this.elements[3]=a*c+this.elements[3]*p,this.elements[0]=i*c+this.elements[0]*p,this.elements[1]=s*c+this.elements[1]*p,this.elements[2]=n*c+this.elements[2]*p,this}}class g{static{u(this,"Vec3")}constructor(e=0,t=e,i=e){this.type="Vec3",this._x=e,this._y=t,this._z=i}get x(){return this._x}set x(e){const t=e!==this._x;this._x=e,t&&this._onChangeCallback&&this._onChangeCallback()}get y(){return this._y}set y(e){const t=e!==this._y;this._y=e,t&&this._onChangeCallback&&this._onChangeCallback()}get z(){return this._z}set z(e){const t=e!==this._z;this._z=e,t&&this._onChangeCallback&&this._onChangeCallback()}onChange(e){return e&&(this._onChangeCallback=e),this}set(e=0,t=e,i=e){return this.x=e,this.y=t,this.z=i,this}add(e=new g){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e=0){return this.x+=e,this.y+=e,this.z+=e,this}sub(e=new g){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e=0){return this.x-=e,this.y-=e,this.z-=e,this}multiply(e=new g(1)){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e=1){return this.x*=e,this.y*=e,this.z*=e,this}divide(e=new g(1)){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e=1){return this.x/=e,this.y/=e,this.z/=e,this}copy(e=new g){return this.x=e.x,this.y=e.y,this.z=e.z,this}clone(){return new g(this.x,this.y,this.z)}max(e=new g){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}min(e=new g){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}clamp(e=new g,t=new g){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}equals(e=new g){return this.x===e.x&&this.y===e.y&&this.z===e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.lengthSq())}distance(e=new g){return Math.hypot(e.x-this.x,e.y-this.y,e.z-this.z)}normalize(){let e=this.lengthSq();return e>0&&(e=1/Math.sqrt(e)),this.x*=e,this.y*=e,this.z*=e,this}dot(e=new g){return this.x*e.x+this.y*e.y+this.z*e.z}cross(e=new g){return this.crossVectors(this,e)}crossVectors(e=new g,t=new g){const i=e.x,s=e.y,n=e.z,a=t.x,o=t.y,h=t.z;return this.x=s*h-n*o,this.y=n*a-i*h,this.z=i*o-s*a,this}lerp(e=new g,t=1){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}applyMat4(e){const t=this._x,i=this._y,s=this._z,n=e.elements;let a=n[3]*t+n[7]*i+n[11]*s+n[15];return a=a||1,this.x=(n[0]*t+n[4]*i+n[8]*s+n[12])/a,this.y=(n[1]*t+n[5]*i+n[9]*s+n[13])/a,this.z=(n[2]*t+n[6]*i+n[10]*s+n[14])/a,this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}applyQuat(e=new ce){const t=this.x,i=this.y,s=this.z,n=e.elements[0],a=e.elements[1],o=e.elements[2],h=e.elements[3],l=2*(a*s-o*i),d=2*(o*t-n*s),c=2*(n*i-a*t);return this.x=t+h*l+a*c-o*d,this.y=i+h*d+o*l-n*c,this.z=s+h*c+n*d-a*l,this}applyAxisAngle(e=new g,t=0,i=new ce){return this.applyQuat(i.setFromAxisAngle(e,t))}transformDirection(e){const t=this.x,i=this.y,s=this.z,n=e.elements;return this.x=n[0]*t+n[4]*i+n[8]*s,this.y=n[1]*t+n[5]*i+n[9]*s,this.z=n[2]*t+n[6]*i+n[10]*s,this.normalize()}project(e){return this.applyMat4(e.viewMatrix).applyMat4(e.projectionMatrix),this}unproject(e){return this.applyMat4(e.projectionMatrix.getInverse()).applyMat4(e.modelMatrix),this}}const ie=new g,Ce=new g,V=new g;class D{static{u(this,"Mat4")}constructor(e=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])){this.type="Mat4",this.elements=e}set(e,t,i,s,n,a,o,h,l,d,c,p,f,m,y,v){const x=this.elements;return x[0]=e,x[1]=t,x[2]=i,x[3]=s,x[4]=n,x[5]=a,x[6]=o,x[7]=h,x[8]=l,x[9]=d,x[10]=c,x[11]=p,x[12]=f,x[13]=m,x[14]=y,x[15]=v,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}setFromArray(e=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),t=0){for(let i=0;i<this.elements.length;i++)this.elements[i]=e[i+t];return this}copy(e=new D){const t=e.elements;return this.elements[0]=t[0],this.elements[1]=t[1],this.elements[2]=t[2],this.elements[3]=t[3],this.elements[4]=t[4],this.elements[5]=t[5],this.elements[6]=t[6],this.elements[7]=t[7],this.elements[8]=t[8],this.elements[9]=t[9],this.elements[10]=t[10],this.elements[11]=t[11],this.elements[12]=t[12],this.elements[13]=t[13],this.elements[14]=t[14],this.elements[15]=t[15],this}clone(){return new D().copy(this)}multiply(e=new D){return this.multiplyMatrices(this,e)}premultiply(e=new D){return this.multiplyMatrices(e,this)}multiplyMatrices(e=new D,t=new D){const i=e.elements,s=t.elements,n=this.elements,a=i[0],o=i[4],h=i[8],l=i[12],d=i[1],c=i[5],p=i[9],f=i[13],m=i[2],y=i[6],v=i[10],x=i[14],w=i[3],P=i[7],M=i[11],C=i[15],B=s[0],b=s[4],_=s[8],R=s[12],A=s[1],U=s[5],Y=s[9],F=s[13],Q=s[2],ee=s[6],k=s[10],j=s[14],X=s[3],te=s[7],ue=s[11],We=s[15];return n[0]=a*B+o*A+h*Q+l*X,n[4]=a*b+o*U+h*ee+l*te,n[8]=a*_+o*Y+h*k+l*ue,n[12]=a*R+o*F+h*j+l*We,n[1]=d*B+c*A+p*Q+f*X,n[5]=d*b+c*U+p*ee+f*te,n[9]=d*_+c*Y+p*k+f*ue,n[13]=d*R+c*F+p*j+f*We,n[2]=m*B+y*A+v*Q+x*X,n[6]=m*b+y*U+v*ee+x*te,n[10]=m*_+y*Y+v*k+x*ue,n[14]=m*R+y*F+v*j+x*We,n[3]=w*B+P*A+M*Q+C*X,n[7]=w*b+P*U+M*ee+C*te,n[11]=w*_+P*Y+M*k+C*ue,n[15]=w*R+P*F+M*j+C*We,this}premultiplyTranslate(e=new g){const a=e.x,o=e.y,h=e.z,l=this.elements,d=this.elements,c=l[0],p=l[4],f=l[8],m=l[12],y=l[1],v=l[5],x=l[9],w=l[13],P=l[2],M=l[6],C=l[10],B=l[14],b=l[3],_=l[7],R=l[11],A=l[15];return d[0]=1*c+a*b,d[4]=1*p+a*_,d[8]=1*f+a*R,d[12]=1*m+a*A,d[1]=1*y+o*b,d[5]=1*v+o*_,d[9]=1*x+o*R,d[13]=1*w+o*A,d[2]=1*P+h*b,d[6]=1*M+h*_,d[10]=1*C+h*R,d[14]=1*B+h*A,d[3]=1*b,d[7]=1*_,d[11]=1*R,d[15]=1*A,this}premultiplyScale(e=new g){const t=this.elements,i=this.elements,s=e.x,n=e.y,a=e.z,o=1,h=t[0],l=t[4],d=t[8],c=t[12],p=t[1],f=t[5],m=t[9],y=t[13],v=t[2],x=t[6],w=t[10],P=t[14],M=t[3],C=t[7],B=t[11],b=t[15];return i[0]=s*h,i[4]=s*l,i[8]=s*d,i[12]=s*c,i[1]=n*p,i[5]=n*f,i[9]=n*m,i[13]=n*y,i[2]=a*v,i[6]=a*x,i[10]=a*w,i[14]=a*P,i[3]=o*M,i[7]=o*C,i[11]=o*B,i[15]=o*b,this}invert(){const e=this.elements,t=e[0],i=e[1],s=e[2],n=e[3],a=e[4],o=e[5],h=e[6],l=e[7],d=e[8],c=e[9],p=e[10],f=e[11],m=e[12],y=e[13],v=e[14],x=e[15],w=c*v*l-y*p*l+y*h*f-o*v*f-c*h*x+o*p*x,P=m*p*l-d*v*l-m*h*f+a*v*f+d*h*x-a*p*x,M=d*y*l-m*c*l+m*o*f-a*y*f-d*o*x+a*c*x,C=m*c*h-d*y*h-m*o*p+a*y*p+d*o*v-a*c*v,B=t*w+i*P+s*M+n*C;if(B===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const b=1/B;return e[0]=w*b,e[1]=(y*p*n-c*v*n-y*s*f+i*v*f+c*s*x-i*p*x)*b,e[2]=(o*v*n-y*h*n+y*s*l-i*v*l-o*s*x+i*h*x)*b,e[3]=(c*h*n-o*p*n-c*s*l+i*p*l+o*s*f-i*h*f)*b,e[4]=P*b,e[5]=(d*v*n-m*p*n+m*s*f-t*v*f-d*s*x+t*p*x)*b,e[6]=(m*h*n-a*v*n-m*s*l+t*v*l+a*s*x-t*h*x)*b,e[7]=(a*p*n-d*h*n+d*s*l-t*p*l-a*s*f+t*h*f)*b,e[8]=M*b,e[9]=(m*c*n-d*y*n-m*i*f+t*y*f+d*i*x-t*c*x)*b,e[10]=(a*y*n-m*o*n+m*i*l-t*y*l-a*i*x+t*o*x)*b,e[11]=(d*o*n-a*c*n-d*i*l+t*c*l+a*i*f-t*o*f)*b,e[12]=C*b,e[13]=(d*y*s-m*c*s+m*i*p-t*y*p-d*i*v+t*c*v)*b,e[14]=(m*o*s-a*y*s-m*i*h+t*y*h+a*i*v-t*o*v)*b,e[15]=(a*c*s-d*o*s+d*i*h-t*c*h-a*i*p+t*o*p)*b,this}getInverse(){return this.clone().invert()}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}translate(e=new g){const t=this.elements;return t[12]=t[0]*e.x+t[4]*e.y+t[8]*e.z+t[12],t[13]=t[1]*e.x+t[5]*e.y+t[9]*e.z+t[13],t[14]=t[2]*e.x+t[6]*e.y+t[10]*e.z+t[14],t[15]=t[3]*e.x+t[7]*e.y+t[11]*e.z+t[15],this}getTranslation(e=new g){return e.set(this.elements[12],this.elements[13],this.elements[14])}scale(e=new g){const t=this.elements;return t[0]*=e.x,t[1]*=e.x,t[2]*=e.x,t[3]*=e.x,t[4]*=e.y,t[5]*=e.y,t[6]*=e.y,t[7]*=e.y,t[8]*=e.z,t[9]*=e.z,t[10]*=e.z,t[11]*=e.z,this}rotateFromQuaternion(e=new ce){const t=this.elements,i=e.elements[0],s=e.elements[1],n=e.elements[2],a=e.elements[3],o=i+i,h=s+s,l=n+n,d=i*o,c=i*h,p=i*l,f=s*h,m=s*l,y=n*l,v=a*o,x=a*h,w=a*l;return t[0]=1-(f+y),t[4]=c-w,t[8]=p+x,t[1]=c+w,t[5]=1-(d+y),t[9]=m-v,t[2]=p-x,t[6]=m+v,t[10]=1-(d+f),this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],i=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],s=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,i,s))}compose(e=new g,t=new ce,i=new g(1)){const s=this.elements,n=t.elements[0],a=t.elements[1],o=t.elements[2],h=t.elements[3],l=n+n,d=a+a,c=o+o,p=n*l,f=n*d,m=n*c,y=a*d,v=a*c,x=o*c,w=h*l,P=h*d,M=h*c,C=i.x,B=i.y,b=i.z;return s[0]=(1-(y+x))*C,s[1]=(f+M)*C,s[2]=(m-P)*C,s[3]=0,s[4]=(f-M)*B,s[5]=(1-(p+x))*B,s[6]=(v+w)*B,s[7]=0,s[8]=(m+P)*b,s[9]=(v-w)*b,s[10]=(1-(p+y))*b,s[11]=0,s[12]=e.x,s[13]=e.y,s[14]=e.z,s[15]=1,this}composeFromOrigin(e=new g,t=new ce,i=new g(1),s=new g){const n=this.elements,a=t.elements[0],o=t.elements[1],h=t.elements[2],l=t.elements[3],d=a+a,c=o+o,p=h+h,f=a*d,m=a*c,y=a*p,v=o*c,x=o*p,w=h*p,P=l*d,M=l*c,C=l*p,B=i.x,b=i.y,_=i.z,R=s.x,A=s.y,U=s.z,Y=(1-(v+w))*B,F=(m+C)*B,Q=(y-M)*B,ee=(m-C)*b,k=(1-(f+w))*b,j=(x+P)*b,X=(y+M)*_,te=(x-P)*_,ue=(1-(f+v))*_;return n[0]=Y,n[1]=F,n[2]=Q,n[3]=0,n[4]=ee,n[5]=k,n[6]=j,n[7]=0,n[8]=X,n[9]=te,n[10]=ue,n[11]=0,n[12]=e.x+R-(Y*R+ee*A+X*U),n[13]=e.y+A-(F*R+k*A+te*U),n[14]=e.z+U-(Q*R+j*A+ue*U),n[15]=1,this}lookAt(e=new g,t=new g,i=new g(0,1,0)){const s=this.elements;return V.copy(e).sub(t),V.lengthSq()===0&&(V.z=1),V.normalize(),ie.crossVectors(i,V),ie.lengthSq()===0&&(Math.abs(i.z)===1?V.x+=1e-4:V.z+=1e-4,V.normalize(),ie.crossVectors(i,V)),ie.normalize(),Ce.crossVectors(V,ie),s[0]=ie.x,s[1]=ie.y,s[2]=ie.z,s[3]=0,s[4]=Ce.x,s[5]=Ce.y,s[6]=Ce.z,s[7]=0,s[8]=V.x,s[9]=V.y,s[10]=V.z,s[11]=0,s[12]=e.x,s[13]=e.y,s[14]=e.z,s[15]=1,this}makeView(e=new g,t=new g,i=new g(0,1,0)){const s=this.elements;return V.copy(e).sub(t).normalize(),ie.crossVectors(i,V).normalize(),Ce.crossVectors(V,ie).normalize(),s[0]=ie.x,s[1]=Ce.x,s[2]=V.x,s[3]=0,s[4]=ie.y,s[5]=Ce.y,s[6]=V.y,s[7]=0,s[8]=ie.z,s[9]=Ce.z,s[10]=V.z,s[11]=0,s[12]=-(ie.x*e.x+ie.y*e.y+ie.z*e.z),s[13]=-(Ce.x*e.x+Ce.y*e.y+Ce.z*e.z),s[14]=-(V.x*e.x+V.y*e.y+V.z*e.z),s[15]=1,this}makeOrthographic({left:e=-1,right:t=1,bottom:i=-1,top:s=1,near:n=.1,far:a=50}){const o=this.elements;return o[0]=2/(t-e),o[1]=0,o[2]=0,o[3]=0,o[4]=0,o[5]=2/(s-i),o[6]=0,o[7]=0,o[8]=0,o[9]=0,o[10]=1/(n-a),o[11]=0,o[12]=(t+e)/(e-t),o[13]=(s+i)/(i-s),o[14]=n/(n-a),o[15]=1,this}makePerspective({fov:e=90,aspect:t=1,near:i=.1,far:s=150}){const n=i*Math.tan(Math.PI/180*.5*e),a=2*n,o=t*a,h=-.5*o,l=h+o,d=n-a,c=2*i/(l-h),p=2*i/(n-d),f=(l+h)/(l-h),m=(n+d)/(n-d),y=-s/(s-i),v=-s*i/(s-i);return this.set(c,0,0,0,0,p,0,0,f,m,y,-1,0,0,v,0),this}}let uh=0;const dh=new D;class Se{static{u(this,"Object3D")}constructor(){this._parent=null,this.children=[],this.matricesNeedUpdate=!1,this.up=new g(0,1,0),this.actualPosition=new g,Object.defineProperty(this,"object3DIndex",{value:uh++}),this.setMatrices(),this.setTransforms()}get parent(){return this._parent}set parent(e){this._parent&&e&&this._parent.object3DIndex===e.object3DIndex||(this._parent&&(this._parent.children=this._parent.children.filter(t=>t.object3DIndex!==this.object3DIndex)),e&&this.shouldUpdateWorldMatrix(),this._parent=e,this._parent?.children.push(this))}setTransforms(){this.transforms={origin:{model:new g},quaternion:new ce,rotation:new g,position:{world:new g},scale:new g(1)},this.rotation.onChange(()=>this.applyRotation()),this.position.onChange(()=>this.applyPosition()),this.scale.onChange(()=>this.applyScale()),this.transformOrigin.onChange(()=>this.applyTransformOrigin())}get rotation(){return this.transforms.rotation}set rotation(e){this.transforms.rotation=e,this.applyRotation()}get quaternion(){return this.transforms.quaternion}set quaternion(e){this.transforms.quaternion=e}get position(){return this.transforms.position.world}set position(e){this.transforms.position.world=e}get scale(){return this.transforms.scale}set scale(e){this.transforms.scale=e,this.applyScale()}get transformOrigin(){return this.transforms.origin.model}set transformOrigin(e){this.transforms.origin.model=e}applyRotation(){this.quaternion.setFromVec3(this.rotation),this.shouldUpdateModelMatrix()}applyPosition(){this.shouldUpdateModelMatrix()}applyScale(){this.shouldUpdateModelMatrix()}applyTransformOrigin(){this.shouldUpdateModelMatrix()}setMatrices(){this.matrices={model:{matrix:new D,shouldUpdate:!0,onUpdate:u(()=>this.updateModelMatrix(),"onUpdate")},world:{matrix:new D,shouldUpdate:!0,onUpdate:u(()=>this.updateWorldMatrix(),"onUpdate")}}}get modelMatrix(){return this.matrices.model.matrix}set modelMatrix(e){this.matrices.model.matrix=e,this.shouldUpdateModelMatrix()}shouldUpdateModelMatrix(){this.matrices.model.shouldUpdate=!0,this.shouldUpdateWorldMatrix()}get worldMatrix(){return this.matrices.world.matrix}set worldMatrix(e){this.matrices.world.matrix=e,this.shouldUpdateWorldMatrix()}shouldUpdateWorldMatrix(){this.matrices.world.shouldUpdate=!0}lookAt(e=new g){this.updateModelMatrix(),this.updateWorldMatrix(!0,!1),this.actualPosition.x===0&&this.actualPosition.y!==0&&this.actualPosition.z===0?this.up.set(0,0,1):this.up.set(0,1,0),this.applyLookAt(e,this.actualPosition)}applyLookAt(e,t){const i=dh.lookAt(e,t,this.up);this.quaternion.setFromRotationMatrix(i),this.shouldUpdateModelMatrix()}updateModelMatrix(){this.modelMatrix=this.modelMatrix.composeFromOrigin(this.position,this.quaternion,this.scale,this.transformOrigin),this.shouldUpdateWorldMatrix()}updateWorldMatrix(e=!1,t=!0){if(this.parent?(e&&this.parent.updateWorldMatrix(!0,!1),this.worldMatrix.multiplyMatrices(this.parent.worldMatrix,this.modelMatrix)):this.worldMatrix.copy(this.modelMatrix),this.worldMatrix.getTranslation(this.actualPosition),t)for(let i=0,s=this.children.length;i<s;i++)this.children[i].shouldUpdateWorldMatrix()}shouldUpdateMatrices(){this.matricesNeedUpdate=!!Object.values(this.matrices).find(e=>e.shouldUpdate)}updateMatrixStack(){if(this.shouldUpdateMatrices(),this.matricesNeedUpdate)for(const e in this.matrices)this.matrices[e].shouldUpdate&&(this.matrices[e].onUpdate(),this.matrices[e].shouldUpdate=!1);for(let e=0,t=this.children.length;e<t;e++)this.children[e].updateMatrixStack()}destroy(){for(let e=0,t=this.children.length;e<t;e++)this.children[e]&&(this.children[e].parent=null);this.parent=null}}const Vs=u((r,e="GPURenderer",t)=>{const i=t?`Unable to create ${t} because the ${e} is not defined: ${r}`:`The ${e} is not defined: ${r}`;ae(i)},"formatRendererError"),$=u((r,e)=>(r=r&&r.renderer||r,r&&(r.type==="GPURenderer"||r.type==="GPUCameraRenderer"||r.type==="GPUCurtainsRenderer")||Vs(r,"GPURenderer",e),r),"isRenderer"),Ge=u((r,e)=>(r=r&&r.renderer||r,r&&(r.type==="GPUCameraRenderer"||r.type==="GPUCurtainsRenderer")||Vs(r,"GPUCameraRenderer",e),r),"isCameraRenderer"),gt=u((r,e)=>(r=r&&r.renderer||r,r&&r.type==="GPUCurtainsRenderer"||Vs(r,"GPUCurtainsRenderer",e),r),"isCurtainsRenderer"),ch=u(r=>"geometry"in r&&"material"in r&&r instanceof Se?r:!1,"isProjectedMesh"),Ns=typeof GPUShaderStage<"u"?GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},_e=typeof GPUBufferUsage<"u"?GPUBufferUsage:{MAP_READ:1,MAP_WRITE:2,COPY_SRC:4,COPY_DST:8,INDEX:16,VERTEX:32,UNIFORM:64,STORAGE:128,INDIRECT:256,QUERY_RESOLVE:512},Ut=typeof GPUTextureUsage<"u"?GPUTextureUsage:{COPY_SRC:1,COPY_DST:2,TEXTURE_BINDING:4,STORAGE_BINDING:8,RENDER_ATTACHMENT:16},ph=new Map([["vertex",Ns.VERTEX],["fragment",Ns.FRAGMENT],["compute",Ns.COMPUTE]]),fh=u((r=[])=>r.reduce((e,t)=>e|ph.get(t),0),"getBindingVisibility"),mh={i32:{numElements:1,align:4,size:4,type:"i32",View:Int32Array},u32:{numElements:1,align:4,size:4,type:"u32",View:Uint32Array},f32:{numElements:1,align:4,size:4,type:"f32",View:Float32Array},f16:{numElements:1,align:2,size:2,type:"u16",View:Uint16Array},vec2f:{numElements:2,align:8,size:8,type:"f32",View:Float32Array},vec2i:{numElements:2,align:8,size:8,type:"i32",View:Int32Array},vec2u:{numElements:2,align:8,size:8,type:"u32",View:Uint32Array},vec2h:{numElements:2,align:4,size:4,type:"u16",View:Uint16Array},vec3i:{numElements:3,align:16,size:12,type:"i32",View:Int32Array},vec3u:{numElements:3,align:16,size:12,type:"u32",View:Uint32Array},vec3f:{numElements:3,align:16,size:12,type:"f32",View:Float32Array},vec3h:{numElements:3,align:8,size:6,type:"u16",View:Uint16Array},vec4i:{numElements:4,align:16,size:16,type:"i32",View:Int32Array},vec4u:{numElements:4,align:16,size:16,type:"u32",View:Uint32Array},vec4f:{numElements:4,align:16,size:16,type:"f32",View:Float32Array},vec4h:{numElements:4,align:8,size:8,type:"u16",View:Uint16Array},mat2x2f:{numElements:4,align:8,size:16,type:"f32",View:Float32Array},mat2x2h:{numElements:4,align:4,size:8,type:"u16",View:Uint16Array},mat3x2f:{numElements:6,align:8,size:24,type:"f32",View:Float32Array},mat3x2h:{numElements:6,align:4,size:12,type:"u16",View:Uint16Array},mat4x2f:{numElements:8,align:8,size:32,type:"f32",View:Float32Array},mat4x2h:{numElements:8,align:4,size:16,type:"u16",View:Uint16Array},mat2x3f:{numElements:8,align:16,size:32,pad:[3,1],type:"f32",View:Float32Array},mat2x3h:{numElements:8,align:8,size:16,pad:[3,1],type:"u16",View:Uint16Array},mat3x3f:{numElements:12,align:16,size:48,pad:[3,1],type:"f32",View:Float32Array},mat3x3h:{numElements:12,align:8,size:24,pad:[3,1],type:"u16",View:Uint16Array},mat4x3f:{numElements:16,align:16,size:64,pad:[3,1],type:"f32",View:Float32Array},mat4x3h:{numElements:16,align:8,size:32,pad:[3,1],type:"u16",View:Uint16Array},mat2x4f:{numElements:8,align:16,size:32,type:"f32",View:Float32Array},mat2x4h:{numElements:8,align:8,size:16,type:"u16",View:Uint16Array},mat3x4f:{numElements:12,align:16,size:48,pad:[3,1],type:"f32",View:Float32Array},mat3x4h:{numElements:12,align:8,size:24,pad:[3,1],type:"u16",View:Uint16Array},mat4x4f:{numElements:16,align:16,size:64,type:"f32",View:Float32Array},mat4x4h:{numElements:16,align:8,size:32,type:"u16",View:Uint16Array}},mn=u(r=>mh[r],"getBufferLayout"),zi=u(r=>(()=>{switch(r.bindingType){case"storage":return`var<${r.bindingType}, ${r.options.access}>`;case"uniform":default:return"var<uniform>"}})(),"getBindingWGSLVarType"),gh=u(r=>r.bindingType==="externalTexture"?`var ${r.name}: texture_external;`:r.bindingType==="storage"?`var ${r.name}: texture_storage_${r.options.viewDimension.replace("-","_")}<${r.options.format}, ${r.options.access}>;`:r.bindingType==="depth"?`var ${r.name}: texture_depth${r.options.multisampled?"_multisampled":""}_${r.options.viewDimension.replace("-","_")};`:`var ${r.name}: texture${r.options.multisampled?"_multisampled":""}_${r.options.viewDimension.replace("-","_")}<f32>;`,"getTextureBindingWGSLVarType"),gn=u(r=>r.bindingType==="storage"&&r.options.access==="read_write"?"storage":r.bindingType==="storage"?"read-only-storage":"uniform","getBindGroupLayoutBindingType"),yh=u(r=>(()=>{switch(r.bindingType){case"externalTexture":return{externalTexture:{}};case"storage":return{storageTexture:{format:r.options.format,viewDimension:r.options.viewDimension}};case"texture":return{texture:{multisampled:r.options.multisampled,viewDimension:r.options.viewDimension,sampleType:r.options.multisampled?"unfilterable-float":"float"}};case"depth":return{texture:{multisampled:r.options.multisampled,viewDimension:r.options.viewDimension,sampleType:"depth"}};default:return null}})(),"getBindGroupLayoutTextureBindingType"),xh=u(r=>(()=>{switch(r.bindingType){case"externalTexture":return`externalTexture,${r.visibility},`;case"storage":return`storageTexture,${r.options.format},${r.options.viewDimension},${r.visibility},`;case"texture":return`texture,${r.options.multisampled},${r.options.viewDimension},${r.options.multisampled?"unfilterable-float":"float"},${r.visibility},`;case"depth":return`depthTexture,${r.options.format},${r.options.viewDimension},${r.visibility},`;default:return`${r.visibility},`}})(),"getBindGroupLayoutTextureBindingCacheKey");class Ai{static{u(this,"Binding")}constructor({label:e="Uniform",name:t="uniform",bindingType:i="uniform",visibility:s=["vertex","fragment","compute"]}){this.label=e,this.name=It(t),this.bindingType=i,this.visibility=fh(s),this.options={label:e,name:t,bindingType:i,visibility:s},this.shouldResetBindGroup=!1,this.shouldResetBindGroupLayout=!1,this.cacheKey=`${i},${this.visibility},`}}class z{static{u(this,"Vec2")}constructor(e=0,t=e){this.type="Vec2",this._x=e,this._y=t}get x(){return this._x}set x(e){const t=e!==this._x;this._x=e,t&&this._onChangeCallback&&this._onChangeCallback()}get y(){return this._y}set y(e){const t=e!==this._y;this._y=e,t&&this._onChangeCallback&&this._onChangeCallback()}onChange(e){return e&&(this._onChangeCallback=e),this}set(e=0,t=e){return this.x=e,this.y=t,this}add(e=new z){return this.x+=e.x,this.y+=e.y,this}addScalar(e=0){return this.x+=e,this.y+=e,this}sub(e=new z){return this.x-=e.x,this.y-=e.y,this}subScalar(e=0){return this.x-=e,this.y-=e,this}multiply(e=new z(1)){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e=1){return this.x*=e,this.y*=e,this}divide(e=new z(1)){return this.x/=e.x,this.y/=e.y,this}divideScalar(e=1){return this.x/=e,this.y/=e,this}copy(e=new z){return this.x=e.x,this.y=e.y,this}clone(){return new z(this.x,this.y)}max(e=new z){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}min(e=new z){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}clamp(e=new z,t=new z){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}equals(e=new z){return this.x===e.x&&this.y===e.y}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSq())}normalize(){let e=this.x*this.x+this.y*this.y;return e>0&&(e=1/Math.sqrt(e)),this.x*=e,this.y*=e,this}dot(e=new z){return this.x*e.x+this.y*e.y}lerp(e=new z,t=1){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}}const vh=4,Li=4,K=vh*Li;class we{static{u(this,"BufferElement")}constructor({name:e,key:t,type:i="f32"}){this.name=e,this.key=t,this.type=i,this.baseType=we.getBaseType(this.type),this.bufferLayout=mn(this.baseType),this.alignment={start:{row:0,byte:0},end:{row:0,byte:0}},this.setValue=null}static getType(e){return e.replace("array","").replace("<","").replace(">","")}static getBaseType(e){return we.getType(e.replace("atomic","").replace("array","").replaceAll("<","").replaceAll(">",""))}get rowCount(){return this.alignment.end.row-this.alignment.start.row+1}get byteCount(){return Math.abs(this.endOffset-this.startOffset)+1}get paddedByteCount(){return(this.alignment.end.row+1)*K}get startOffset(){return this.getByteCountAtPosition(this.alignment.start)}get startOffsetToIndex(){return this.startOffset/Li}get endOffset(){return this.getByteCountAtPosition(this.alignment.end)}get endOffsetToIndex(){return Math.floor(this.endOffset/Li)}getPositionAtOffset(e=0){return{row:Math.floor(e/K),byte:e%K}}getByteCountAtPosition(e={row:0,byte:0}){return e.row*K+e.byte}applyOverflowToPosition(e={row:0,byte:0}){if(e.byte>K-1){const t=e.byte%K;e.row+=Math.floor(e.byte/K),e.byte=t}return e}getByteCountBetweenPositions(e={row:0,byte:0},t={row:0,byte:0}){return Math.abs(this.getByteCountAtPosition(t)-this.getByteCountAtPosition(e))}getElementAlignment(e={row:0,byte:0}){const t={start:e,end:e},{size:i,align:s}=this.bufferLayout;return e.byte%s!==0&&(e.byte+=e.byte%s),(i<=K&&e.byte+i>K||i>K&&(e.byte>K||e.byte>0))&&(e.row+=1,e.byte=0),t.end={row:e.row+Math.ceil(i/K)-1,byte:e.byte+(i%K===0?K-1:i%K-1)},t.end=this.applyOverflowToPosition(t.end),t}setAlignmentFromPosition(e={row:0,byte:0}){this.alignment=this.getElementAlignment(e)}setAlignment(e=0){this.setAlignmentFromPosition(this.getPositionAtOffset(e))}setView(e,t){this.view=new this.bufferLayout.View(e,this.startOffset,this.byteCount/this.bufferLayout.View.BYTES_PER_ELEMENT)}setValueFromNumber(e){this.view[0]=e}setValueFromVec2(e){this.view[0]=e.x??e[0]??0,this.view[1]=e.y??e[1]??0}setValueFromVec3(e){this.view[0]=e.x??e[0]??0,this.view[1]=e.y??e[1]??0,this.view[2]=e.z??e[2]??0}setValueFromMat4OrQuat(e){this.view.set(e.elements)}setValueFromMat3(e){this.setValueFromArrayWithPad(e.elements)}setValueFromArray(e){this.view.set(e)}setValueFromArrayWithPad(e){for(let t=0,i=0;t<this.view.length;t+=this.bufferLayout.pad[0]+this.bufferLayout.pad[1],i++)for(let s=0;s<this.bufferLayout.pad[0];s++)this.view[t+s]=e[t+s-i]}update(e){this.setValue||(this.setValue=(t=>{if(typeof t=="number")return this.setValueFromNumber;if(this.type==="vec2f")return this.setValueFromVec2;if(this.type==="vec3f")return this.setValueFromVec3;if(this.type==="mat3x3f")return t.elements?this.setValueFromMat3:this.setValueFromArrayWithPad;if(t.elements)return this.setValueFromMat4OrQuat;if(ArrayBuffer.isView(t)||Array.isArray(t))return this.bufferLayout.pad?this.setValueFromArrayWithPad:this.setValueFromArray;L(`${this.constructor.name}: value passed to ${this.name} cannot be used: ${t}`)})(e)),this.setValue(e)}extractDataFromBufferResult(e){return e.slice(this.startOffsetToIndex,this.endOffsetToIndex)}}class yn extends we{static{u(this,"BufferArrayElement")}constructor({name:e,key:t,type:i="f32",arrayLength:s=1}){super({name:e,key:t,type:i}),this.arrayLength=s,this.numElements=Math.ceil(this.arrayLength/this.bufferLayout.numElements)}get arrayStrideToIndex(){return this.arrayStride/Li}setAlignment(e=0){super.setAlignment(e);const t=this.getElementAlignment(this.getPositionAtOffset(this.endOffset+1));this.arrayStride=this.getByteCountBetweenPositions(this.alignment.end,t.end),this.alignment.end=this.getPositionAtOffset(this.endOffset+this.arrayStride*(this.numElements-1))}setValueFromArray(e){let t=0;const i=this.byteCount/this.bufferLayout.View.BYTES_PER_ELEMENT,s=Math.ceil(i/this.numElements);for(let n=0;n<this.numElements;n++)for(let a=0;a<this.bufferLayout.numElements;a++)this.view[a+n*s]=e[t],t++}}class Ws extends yn{static{u(this,"BufferInterleavedArrayElement")}constructor({name:e,key:t,type:i="f32",arrayLength:s=1}){super({name:e,key:t,type:i,arrayLength:s}),this.arrayStride=1,this.arrayLength=s,this.numElements=Math.ceil(this.arrayLength/this.bufferLayout.numElements)}get byteCount(){return this.bufferLayout.size*this.numElements}setAlignment(e=0,t=0){this.alignment=this.getElementAlignment(this.getPositionAtOffset(e)),this.arrayStride=t,this.alignment.end=this.getPositionAtOffset(this.endOffset+t*(this.numElements-1))}setView(e,t){this.view=new this.bufferLayout.View(this.bufferLayout.numElements*this.numElements),this.viewSetFunction=(i=>{switch(this.bufferLayout.View){case Int32Array:return i.setInt32.bind(i);case Uint16Array:return i.setUint16.bind(i);case Uint32Array:return i.setUint32.bind(i);case Float32Array:default:return i.setFloat32.bind(i)}})(t)}update(e){super.update(e);for(let t=0;t<this.numElements;t++){const i=this.view.subarray(t*this.bufferLayout.numElements,t*this.bufferLayout.numElements+this.bufferLayout.numElements),s=this.startOffset+t*this.arrayStride;i.forEach((n,a)=>{this.viewSetFunction(s+a*this.bufferLayout.View.BYTES_PER_ELEMENT,n,!0)})}}extractDataFromBufferResult(e){const t=new Float32Array(this.arrayLength);for(let i=0;i<this.numElements;i++){const s=this.startOffsetToIndex+i*this.arrayStrideToIndex;for(let n=0;n<this.bufferLayout.numElements;n++)t[i*this.bufferLayout.numElements+n]=e[s+n]}return t}}const wh=new Map([["copySrc",_e.COPY_SRC],["copyDst",_e.COPY_DST],["index",_e.INDEX],["indirect",_e.INDIRECT],["mapRead",_e.MAP_READ],["mapWrite",_e.MAP_WRITE],["queryResolve",_e.QUERY_RESOLVE],["storage",_e.STORAGE],["uniform",_e.UNIFORM],["vertex",_e.VERTEX]]),xn=u((r=[])=>r.reduce((e,t)=>e|wh.get(t),0),"getBufferUsages");class tt{static{u(this,"Buffer")}constructor({label:e="Buffer",size:t=0,usage:i=["copySrc","copyDst"],mappedAtCreation:s=!1}={}){this.type="Buffer",this.reset(),this.uuid=O(),this.consumers=new Set,this.options={label:e,size:t,usage:xn(i),mappedAtCreation:s}}reset(){this.GPUBuffer=null}set size(e){this.options.size=e}createBuffer(e,t={}){const{usage:i,...s}=t;this.options={...this.options,...s,...i!==void 0&&{usage:xn(i)}},this.setBuffer(e.createBuffer(this))}setBuffer(e){this.GPUBuffer=e}copy(e,t=!1){t&&this.destroy(),this.options=e.options,this.GPUBuffer=e.GPUBuffer,this.consumers=new Set([...this.consumers,...e.consumers])}async mapBufferAsync(){if(!this.GPUBuffer||this.GPUBuffer.mapState!=="unmapped")return new Float32Array(0);await this.GPUBuffer.mapAsync(GPUMapMode.READ);const e=new Float32Array(this.GPUBuffer.getMappedRange().slice(0));return this.GPUBuffer.unmap(),e}destroy(){this.GPUBuffer?.destroy(),this.reset(),this.consumers.clear()}}var vn=u(r=>{throw TypeError(r)},"__typeError$w"),wn=u((r,e,t)=>e.has(r)||vn("Cannot "+t),"__accessCheck$w"),bh=u((r,e,t)=>(wn(r,e,"read from private field"),t?t.call(r):e.get(r)),"__privateGet$u"),Ch=u((r,e,t)=>e.has(r)?vn("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(r):e.set(r,t),"__privateAdd$w"),Sh=u((r,e,t,i)=>(wn(r,e,"write to private field"),e.set(r,t),t),"__privateSet$t"),$i;const Mh=class Us extends Ai{static{u(this,"_BufferBinding")}constructor({label:e="Uniform",name:t="uniform",bindingType:i,visibility:s,useStruct:n=!0,access:a="read",usage:o=[],struct:h={},childrenBindings:l=[],buffer:d=null,parent:c=null,minOffset:p=256,offset:f=0}){i=i??"uniform",super({label:e,name:t,bindingType:i,visibility:s}),Ch(this,$i),this.options={...this.options,useStruct:n,access:a,usage:o,struct:h,childrenBindings:l,buffer:d,parent:c,minOffset:p,offset:f},this.cacheKey+=`${n},${a},`,this.arrayBufferSize=0,this.shouldUpdate=!1,this.useStruct=n,this.bufferElements=[],this.inputs={},this.buffer=this.options.buffer??new tt,Object.keys(h).length&&(this.setBindings(h),this.setInputsAlignment()),this.setChildrenBindings(l),(Object.keys(h).length||this.childrenBindings.length)&&(this.setBufferAttributes(),this.setWGSLFragment()),this.parent=c}static cloneStruct(e){return Object.keys(e).reduce((t,i)=>{const s=e[i];let n;return Array.isArray(s.value)||ArrayBuffer.isView(s.value)?n=new s.value.constructor(s.value.length):typeof s.value=="number"?n=0:n=new s.value.constructor,{...t,[i]:{type:s.type,value:n}}},{})}get parent(){return bh(this,$i)}set parent(e){if(e){this.parentView=new DataView(e.arrayBuffer,this.offset,this.getMinOffsetSize(this.arrayBufferSize));const t=u(s=>[...u(a=>a.bufferElements,"getBufferElements")(s),s.childrenBindings.map(a=>t(a)).flat()].flat(),"getAllBufferElements"),i=t(this);this.parentViewSetBufferEls=i.map(s=>{switch(s.bufferLayout.View){case Int32Array:return{bufferElement:s,viewSetFunction:this.parentView.setInt32.bind(this.parentView)};case Uint16Array:return{bufferElement:s,viewSetFunction:this.parentView.setUint16.bind(this.parentView)};case Uint32Array:return{bufferElement:s,viewSetFunction:this.parentView.setUint32.bind(this.parentView)};case Float32Array:default:return{bufferElement:s,viewSetFunction:this.parentView.setFloat32.bind(this.parentView)}}}),!this.parent&&this.buffer.GPUBuffer&&!this.options.buffer&&this.buffer.destroy()}else this.parentView=null,this.parentViewSetBufferEls=null;Sh(this,$i,e)}getMinOffsetSize(e){return Math.ceil(e/this.options.minOffset)*this.options.minOffset}get offset(){return this.getMinOffsetSize(this.options.offset*this.getMinOffsetSize(this.arrayBufferSize))}get resourceLayout(){return{buffer:{type:gn(this)},...this.parent&&{offset:this.offset,size:this.arrayBufferSize}}}get resourceLayoutCacheKey(){return`buffer,${gn(this)},${this.visibility},`}get resource(){return{buffer:this.parent?this.parent.buffer.GPUBuffer:this.buffer.GPUBuffer,...this.parent&&{offset:this.offset,size:this.arrayBufferSize}}}clone(e={}){let{struct:t,childrenBindings:i,parent:s,...n}=e;const{label:a,name:o,bindingType:h,visibility:l,useStruct:d,access:c,usage:p}=this.options;n={label:a,name:o,bindingType:h,visibility:l,useStruct:d,access:c,usage:p,...n};const f=new this.constructor(n);return t=t||Us.cloneStruct(this.options.struct),f.options.struct=t,f.setBindings(t),f.arrayBufferSize=this.arrayBufferSize,f.arrayBuffer=new ArrayBuffer(f.arrayBufferSize),f.arrayView=new DataView(f.arrayBuffer,0,f.arrayBuffer.byteLength),f.options.buffer||(f.buffer.size=f.arrayBuffer.byteLength),this.bufferElements.forEach(m=>{const y=new m.constructor({name:m.name,key:m.key,type:m.type,...m.arrayLength&&{arrayLength:m.arrayLength}});y.alignment=JSON.parse(JSON.stringify(m.alignment)),m.arrayStride&&(y.arrayStride=m.arrayStride),y.setView(f.arrayBuffer,f.arrayView),f.bufferElements.push(y)}),this.options.childrenBindings&&(f.options.childrenBindings=this.options.childrenBindings,f.options.childrenBindings.forEach(m=>{const y=m.count?Math.max(1,m.count):1;f.cacheKey+=`child(count:${y}):${m.binding.cacheKey}`}),f.options.childrenBindings.forEach(m=>{f.childrenBindings=[...f.childrenBindings,Array.from(Array(Math.max(1,m.count||1)).keys()).map(y=>m.binding.clone({...m.binding.options,struct:Us.cloneStruct(m.binding.options.struct)}))].flat()}),f.childrenBindings.forEach((m,y)=>{let v=this.arrayView.byteLength;for(let x=0;x<y;x++)v+=this.childrenBindings[x].arrayBuffer.byteLength;m.bufferElements.forEach((x,w)=>{x.alignment.start.row=this.childrenBindings[y].bufferElements[w].alignment.start.row,x.alignment.end.row=this.childrenBindings[y].bufferElements[w].alignment.end.row}),m.arrayView=new DataView(f.arrayBuffer,v,m.arrayBuffer.byteLength);for(const x of m.bufferElements)x.setView(f.arrayBuffer,m.arrayView)})),f.setWGSLFragment(),s&&(f.parent=s),f.shouldUpdate=f.arrayBufferSize>0,f}setBindings(e){for(const t of Object.keys(e)){const i={};for(const s in e[t])s!=="value"&&(i[s]=e[t][s]);if(i.name=t,Object.defineProperty(i,"value",{get(){return i._value},set(s){i._value=s,i.shouldUpdate=!0}}),i.value=e[t].value,i.value instanceof z||i.value instanceof g){const s=i.value._onChangeCallback;i.value._onChangeCallback=()=>{s&&s(),i.shouldUpdate=!0}}this.inputs[t]=i,this.cacheKey+=`${t},${e[t].type},`}}setChildrenBindings(e){if(this.childrenBindings=[],e&&e.length){const t=[];e.sort((i,s)=>{const n=i.count?Math.max(i.count):i.forceArray?1:0,a=s.count?Math.max(s.count):s.forceArray?1:0;return n-a}).forEach(i=>{(i.count&&i.count>1||i.forceArray)&&t.push(i.binding)}),t.length>1&&(t.shift(),L(`BufferBinding: "${this.label}" contains multiple children bindings arrays. These children bindings cannot be added to the BufferBinding: "${t.map(i=>i.label).join(", ")}"`),t.forEach(i=>{e=e.filter(s=>s.binding.name!==i.name)})),this.options.childrenBindings=e,e.forEach(i=>{const s=i.count?Math.max(1,i.count):1;this.cacheKey+=`child(count:${s}):${i.binding.cacheKey}`,this.childrenBindings=[...this.childrenBindings,Array.from(Array(s).keys()).map(n=>i.binding.clone({...i.binding.options,struct:Us.cloneStruct(i.binding.options.struct)}))].flat()})}}setInputsAlignment(){let e=Object.keys(this.inputs);const t=e.filter(i=>this.inputs[i].type.includes("array"));t.length&&(e.sort((i,s)=>{const n=Math.min(0,this.inputs[i].type.indexOf("array")),a=Math.min(0,this.inputs[s].type.indexOf("array"));return n-a}),t.length>1&&(e=e.filter(i=>!t.includes(i))));for(const i of e){const s=this.inputs[i],n={name:It(s.name??i),key:i,type:s.type},a=s.type.includes("array")&&(Array.isArray(s.value)||ArrayBuffer.isView(s.value));this.bufferElements.push(a?new yn({...n,arrayLength:s.value.length}):new we(n))}if(this.bufferElements.forEach((i,s)=>{const n=s===0?0:this.bufferElements[s-1].endOffset+1;i.setAlignment(n)}),t.length>1)if(t.map(n=>{const a=this.inputs[n],o=mn(we.getBaseType(a.type));return Math.ceil(a.value.length/o.numElements)}).every((n,a,o)=>n===o[0])){const n=t.map(h=>{const l=this.inputs[h];return new Ws({name:It(l.name??h),key:h,type:l.type,arrayLength:l.value.length})}),a=t.map(h=>{const l=this.inputs[h];return new we({name:It(l.name??h),key:h,type:we.getType(l.type)})});a.forEach((h,l)=>{l===0?this.bufferElements.length?h.setAlignmentFromPosition({row:this.bufferElements[this.bufferElements.length-1].alignment.end.row+1,byte:0}):h.setAlignment(0):h.setAlignment(a[l-1].endOffset+1)});const o=a[a.length-1].endOffset+1-a[0].startOffset;n.forEach((h,l)=>{h.setAlignment(a[l].startOffset,Math.ceil(o/K)*K)}),this.bufferElements=[...this.bufferElements,...n]}else L(`BufferBinding: "${this.label}" contains multiple array inputs that should use an interleaved array, but their sizes do not match. These inputs cannot be added to the BufferBinding: "${t.join(", ")}"`)}setBufferAttributes(){const e=this.bufferElements.length?this.bufferElements[this.bufferElements.length-1].paddedByteCount:0;this.arrayBufferSize=e,this.childrenBindings.forEach(t=>{this.arrayBufferSize+=t.arrayBufferSize}),this.arrayBuffer=new ArrayBuffer(this.arrayBufferSize),this.arrayView=new DataView(this.arrayBuffer,0,e),this.childrenBindings.forEach((t,i)=>{let s=e;for(let o=0;o<i;o++)s+=this.childrenBindings[o].arrayBuffer.byteLength;const n=this.bufferElements.length?this.bufferElements[this.bufferElements.length-1].alignment.end.row+1:0,a=i>0&&this.childrenBindings[i-1].bufferElements.length?this.childrenBindings[i-1].bufferElements[this.childrenBindings[i-1].bufferElements.length-1].alignment.end.row+1:0;t.bufferElements.forEach(o=>{const h=i===0?n+a:a;o.alignment.start.row+=h,o.alignment.end.row+=h}),t.arrayView=new DataView(this.arrayBuffer,s,t.arrayBuffer.byteLength);for(const o of t.bufferElements)o.setView(this.arrayBuffer,t.arrayView)}),this.options.buffer||(this.buffer.size=this.arrayBuffer.byteLength);for(const t of this.bufferElements)t.setView(this.arrayBuffer,this.arrayView);this.shouldUpdate=this.arrayBufferSize>0}setWGSLFragment(){if(!this.bufferElements.length&&!this.childrenBindings.length)return;const e=et(this.label);if(this.useStruct){const t={};t[e]={};const i=this.bufferElements.filter(a=>!(a instanceof Ws)),s=this.bufferElements.filter(a=>a instanceof Ws);if(s.length){const a=this.bindingType==="uniform"?`, ${s[0].numElements}`:"";if(i.length){t[`${e}Element`]={},s.forEach(l=>{t[`${e}Element`][l.name]=we.getType(l.type)}),i.forEach(l=>{t[e][l.name]=l.type});const o=this.bufferElements.find(l=>l.name==="elements")?`${this.name}Elements`:"elements";t[e][o]=`array<${e}Element${a}>`;const h=zi(this);this.wgslGroupFragment=[`${h} ${this.name}: ${e};`]}else{this.bufferElements.forEach(h=>{t[e][h.name]=we.getType(h.type)});const o=zi(this);this.wgslGroupFragment=[`${o} ${this.name}: array<${e}${a}>;`]}}else{i.forEach(o=>{const h=this.bindingType==="uniform"&&"numElements"in o?`array<${we.getType(o.type)}, ${o.numElements}>`:o.type;t[e][o.name]=h});const a=zi(this);this.wgslGroupFragment=[`${a} ${this.name}: ${e};`]}this.childrenBindings.length&&this.options.childrenBindings.forEach(a=>{t[e][a.binding.name]=a.count&&a.count>1||a.forceArray?this.bindingType==="uniform"&&a.binding.bindingType==="uniform"?`array<${et(a.binding.label)}, ${a.count}>`:`array<${et(a.binding.label)}>`:et(a.binding.label)});const n=this.childrenBindings.length?this.options.childrenBindings.map(a=>a.binding.wgslStructFragment).join(` `)+` `:"";this.wgslStructFragment=n+Object.keys(t).reverse().map(a=>`struct ${a} { ${Object.keys(t[a]).map(o=>`${o}: ${t[a][o]}`).join(`, `)} };`).join(` `)}else this.wgslStructFragment="",this.wgslGroupFragment=this.bufferElements.map(t=>`${zi(this)} ${t.name}: ${t.type};`)}shouldUpdateBinding(e=""){this.inputs[e]&&(this.inputs[e].shouldUpdate=!0)}update(){if(this.options.buffer){this.shouldUpdate=!1;return}const e=Object.values(this.inputs);for(const t of e){const i=this.bufferElements.find(s=>s.key===t.name);t.shouldUpdate&&i&&(t.onBeforeUpdate&&t.onBeforeUpdate(),i.update(t.value),this.shouldUpdate=!0,t.shouldUpdate=!1)}if(this.childrenBindings.forEach(t=>{t.update(),t.shouldUpdate&&(this.shouldUpdate=!0),t.shouldUpdate=!1}),this.shouldUpdate&&this.parent&&this.parentViewSetBufferEls){let t=0;this.parentViewSetBufferEls.forEach((i,s)=>{const{bufferElement:n,viewSetFunction:a}=i;n.view.forEach(o=>{a(t*n.view.BYTES_PER_ELEMENT,o,!0),t++})}),this.parent.shouldUpdate=!0,this.shouldUpdate=!1}}extractBufferElementDataFromBufferResult({result:e,bufferElementName:t}){const i=this.bufferElements.find(s=>s.name===t);return i?i.extractDataFromBufferResult(e):e}};$i=new WeakMap;let J=Mh;class bn extends J{static{u(this,"WritableBufferBinding")}constructor({label:e="Work",name:t="work",bindingType:i,visibility:s,useStruct:n=!0,access:a="read_write",usage:o=[],struct:h={},childrenBindings:l=[],buffer:d=null,parent:c=null,minOffset:p=256,offset:f=0,shouldCopyResult:m=!1}){i="storage",s=["compute"],super({label:e,name:t,bindingType:i,visibility:s,useStruct:n,access:a,usage:o,struct:h,childrenBindings:l,buffer:d,parent:c,minOffset:p,offset:f}),this.options={...this.options,shouldCopyResult:m},this.shouldCopyResult=m,this.cacheKey+=`${m},`,this.resultBuffer=new tt}}class kt{static{u(this,"BindGroup")}constructor(e,{label:t="BindGroup",index:i=0,bindings:s=[],uniforms:n,storages:a}={}){this.type="BindGroup",this.setRenderer(e),this.options={label:t,index:i,bindings:s,...n&&{uniforms:n},...a&&{storages:a}},this.index=i,this.uuid=O(),this.bindings=[],this.bufferBindings=[],this.uniforms={},this.storages={},s.length&&this.addBindings(s),(this.options.uniforms||this.options.storages)&&this.setInputBindings(),this.layoutCacheKey="",this.pipelineCacheKey="",this.resetEntries(),this.bindGroupLayout=null,this.bindGroup=null,this.needsPipelineFlush=!1,this.consumers=new Set,this.renderer.addBindGroup(this)}setRenderer(e){e=$(e,this.type),this.renderer=e}setIndex(e){this.index=e}addBindings(e=[]){e.forEach(t=>{this.addBinding(t)})}addBinding(e){"buffer"in e&&(e.parent?(this.renderer.deviceManager.bufferBindings.set(e.parent.cacheKey,e.parent),e.parent.buffer.consumers.add(this.uuid)):(this.renderer.deviceManager.bufferBindings.set(e.cacheKey,e),e.buffer.consumers.add(this.uuid)),"resultBuffer"in e&&e.resultBuffer.consumers.add(this.uuid),this.bufferBindings.push(e),e.bindingType==="uniform"?this.uniforms[e.name]=e.inputs:this.storages[e.name]=e.inputs),this.bindings.push(e)}destroyBufferBinding(e){"buffer"in e&&(this.renderer.removeBuffer(e.buffer),e.buffer.consumers.delete(this.uuid),e.buffer.consumers.size||e.buffer.destroy(),e.parent&&(e.parent.buffer.consumers.delete(this.uuid),e.parent.buffer.consumers.size||(this.renderer.removeBuffer(e.parent.buffer),e.parent.buffer.destroy()))),"resultBuffer"in e&&(this.renderer.removeBuffer(e.resultBuffer),e.resultBuffer.consumers.delete(this.uuid),e.resultBuffer.consumers.size||e.resultBuffer.destroy())}createInputBindings(e="uniform",t={}){let i=[...Object.keys(t).map(s=>{const n=t[s];if(!n.struct)return;const a={label:et(n.label||s),name:s,bindingType:e,visibility:n.access==="read_write"?["compute"]:n.visibility,useStruct:!0,access:n.access??"read",...n.usage&&{usage:n.usage},struct:n.struct,...n.shouldCopyResult!==void 0&&{shouldCopyResult:n.shouldCopyResult}};if(n.useStruct!==!1){let h=`${e},${n.visibility===void 0?"all":n.access==="read_write"?"compute":n.visibility},true,${n.access??"read"},`;Object.keys(n.struct).forEach(d=>{h+=`${d},${n.struct[d].type},`}),n.shouldCopyResult!==void 0&&(h+=`${n.shouldCopyResult},`);const l=this.renderer.deviceManager.bufferBindings.get(h);if(l)return l.clone(a)}const o=a.access==="read_write"?bn:J;return n.useStruct!==!1?new o(a):Object.keys(n.struct).map(h=>(a.label=et(n.label?n.label+h:s+h),a.name=s+h,a.useStruct=!1,a.struct={[h]:n.struct[h]},new o(a)))})].flat();return i=i.filter(Boolean),i.forEach(s=>{this.renderer.deviceManager.bufferBindings.set(s.cacheKey,s)}),i}setInputBindings(){this.addBindings([...this.createInputBindings("uniform",this.options.uniforms),...this.createInputBindings("storage",this.options.storages)])}get shouldCreateBindGroup(){return!this.bindGroup&&!!this.bindings.length}resetEntries(){this.entries={bindGroupLayout:[],bindGroup:[]}}createBindGroup(){this.fillEntries(),this.setBindGroupLayout(),this.setBindGroup()}resetBindGroup(){this.entries.bindGroup=[],this.pipelineCacheKey="";for(const e of this.bindings)this.addBindGroupEntry(e);this.setBindGroup()}addBindGroupEntry(e){this.entries.bindGroup.push({binding:this.entries.bindGroup.length,resource:e.resource}),this.pipelineCacheKey+=e.cacheKey}resetBindGroupLayout(){this.entries.bindGroupLayout=[],this.layoutCacheKey="";for(const e of this.bindings)this.addBindGroupLayoutEntry(e);this.setBindGroupLayout()}addBindGroupLayoutEntry(e){this.entries.bindGroupLayout.push({binding:this.entries.bindGroupLayout.length,...e.resourceLayout,visibility:e.visibility}),this.layoutCacheKey+=e.resourceLayoutCacheKey}loseContext(){this.resetEntries();for(const e of this.bufferBindings)e.buffer.reset(),e.parent&&e.parent.buffer.reset(),"resultBuffer"in e&&e.resultBuffer.reset();this.bindGroup=null,this.bindGroupLayout=null,this.needsPipelineFlush=!0}restoreContext(){this.shouldCreateBindGroup&&this.createBindGroup();for(const e of this.bufferBindings)e.shouldUpdate=!0}createBindingBuffer(e,t=null){e.buffer.createBuffer(this.renderer,{label:t||this.options.label+": "+e.bindingType+" buffer from: "+e.label,usage:["copySrc","copyDst",e.bindingType,...e.options.usage]}),"resultBuffer"in e&&e.resultBuffer.createBuffer(this.renderer,{label:this.options.label+": Result buffer from: "+e.label,size:e.arrayBuffer.byteLength,usage:["copyDst","mapRead"]}),this.renderer.deviceManager.bufferBindings.set(e.cacheKey,e)}fillEntries(){for(const e of this.bindings)e.visibility||(e.visibility=GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT|GPUShaderStage.COMPUTE),"buffer"in e&&(e.parent&&!e.parent.buffer.GPUBuffer?this.createBindingBuffer(e.parent,e.parent.options.label):!e.bu