From c99f1e951e3eae0219eae926de1a278f4aeb3547 Mon Sep 17 00:00:00 2001 From: sunag Date: Sun, 8 Dec 2024 00:47:54 -0300 Subject: [PATCH] Updated builds. --- build/three.cjs | 26 +- build/three.core.js | 26 +- build/three.core.min.js | 2 +- build/three.tsl.js | 3 +- build/three.tsl.min.js | 2 +- build/three.webgpu.js | 3352 +++++++++++++++++++++++++++++-- build/three.webgpu.min.js | 2 +- build/three.webgpu.nodes.js | 3352 +++++++++++++++++++++++++++++-- build/three.webgpu.nodes.min.js | 2 +- 9 files changed, 6492 insertions(+), 275 deletions(-) diff --git a/build/three.cjs b/build/three.cjs index 53dfdc81389d32..90ccc41a3e38d5 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -2112,6 +2112,7 @@ class Texture extends EventDispatcher { this.version = 0; this.onUpdate = null; + this.renderTarget = null; // assign texture to a render target this.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not this.pmremVersion = 0; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures) @@ -2177,6 +2178,9 @@ class Texture extends EventDispatcher { this.unpackAlignment = source.unpackAlignment; this.colorSpace = source.colorSpace; + this.renderTarget = source.renderTarget; + this.isRenderTargetTexture = source.isRenderTargetTexture; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); this.needsUpdate = true; @@ -3077,6 +3081,7 @@ class RenderTarget extends EventDispatcher { this.textures[ i ] = texture.clone(); this.textures[ i ].isRenderTargetTexture = true; + this.textures[ i ].renderTarget = this; } @@ -3086,6 +3091,7 @@ class RenderTarget extends EventDispatcher { this.resolveDepthBuffer = options.resolveDepthBuffer; this.resolveStencilBuffer = options.resolveStencilBuffer; + this._depthTexture = null; this.depthTexture = options.depthTexture; this.samples = options.samples; @@ -3104,6 +3110,21 @@ class RenderTarget extends EventDispatcher { } + set depthTexture( current ) { + + if ( this._depthTexture !== null ) this._depthTexture.renderTarget = null; + if ( current !== null ) current.renderTarget = this; + + this._depthTexture = current; + + } + + get depthTexture() { + + return this._depthTexture; + + } + setSize( width, height, depth = 1 ) { if ( this.width !== width || this.height !== height || this.depth !== depth ) { @@ -3152,6 +3173,7 @@ class RenderTarget extends EventDispatcher { this.textures[ i ] = source.textures[ i ].clone(); this.textures[ i ].isRenderTargetTexture = true; + this.textures[ i ].renderTarget = this; } @@ -32359,11 +32381,11 @@ class PropertyBinding { this.targetObject = targetObject; - if ( targetObject.needsUpdate !== undefined ) { // material + if ( targetObject.isMaterial === true ) { versioning = this.Versioning.NeedsUpdate; - } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + } else if ( targetObject.isObject3D === true ) { versioning = this.Versioning.MatrixWorldNeedsUpdate; diff --git a/build/three.core.js b/build/three.core.js index ab12d1b93c9050..2041635c5a6aca 100644 --- a/build/three.core.js +++ b/build/three.core.js @@ -2110,6 +2110,7 @@ class Texture extends EventDispatcher { this.version = 0; this.onUpdate = null; + this.renderTarget = null; // assign texture to a render target this.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not this.pmremVersion = 0; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures) @@ -2175,6 +2176,9 @@ class Texture extends EventDispatcher { this.unpackAlignment = source.unpackAlignment; this.colorSpace = source.colorSpace; + this.renderTarget = source.renderTarget; + this.isRenderTargetTexture = source.isRenderTargetTexture; + this.userData = JSON.parse( JSON.stringify( source.userData ) ); this.needsUpdate = true; @@ -3075,6 +3079,7 @@ class RenderTarget extends EventDispatcher { this.textures[ i ] = texture.clone(); this.textures[ i ].isRenderTargetTexture = true; + this.textures[ i ].renderTarget = this; } @@ -3084,6 +3089,7 @@ class RenderTarget extends EventDispatcher { this.resolveDepthBuffer = options.resolveDepthBuffer; this.resolveStencilBuffer = options.resolveStencilBuffer; + this._depthTexture = null; this.depthTexture = options.depthTexture; this.samples = options.samples; @@ -3102,6 +3108,21 @@ class RenderTarget extends EventDispatcher { } + set depthTexture( current ) { + + if ( this._depthTexture !== null ) this._depthTexture.renderTarget = null; + if ( current !== null ) current.renderTarget = this; + + this._depthTexture = current; + + } + + get depthTexture() { + + return this._depthTexture; + + } + setSize( width, height, depth = 1 ) { if ( this.width !== width || this.height !== height || this.depth !== depth ) { @@ -3150,6 +3171,7 @@ class RenderTarget extends EventDispatcher { this.textures[ i ] = source.textures[ i ].clone(); this.textures[ i ].isRenderTargetTexture = true; + this.textures[ i ].renderTarget = this; } @@ -32357,11 +32379,11 @@ class PropertyBinding { this.targetObject = targetObject; - if ( targetObject.needsUpdate !== undefined ) { // material + if ( targetObject.isMaterial === true ) { versioning = this.Versioning.NeedsUpdate; - } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform + } else if ( targetObject.isObject3D === true ) { versioning = this.Versioning.MatrixWorldNeedsUpdate; diff --git a/build/three.core.min.js b/build/three.core.min.js index 804628ca05387e..5aa9aa1c5f49e9 100644 --- a/build/three.core.min.js +++ b/build/three.core.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2024 Three.js Authors * SPDX-License-Identifier: MIT */ -const t="172dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},s={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},i=0,r=1,n=2,o=3,a=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,f=2,g=3,x=4,b=5,v=100,w=101,M=102,S=103,_=104,A=200,z=201,T=202,C=203,I=204,B=205,k=206,E=207,P=208,R=209,O=210,F=211,N=212,L=213,V=214,W=0,U=1,j=2,D=3,H=4,q=5,J=6,X=7,Y=0,Z=1,G=2,$=0,Q=1,K=2,tt=3,et=4,st=5,it=6,rt=7,nt="attached",ot="detached",at=300,ht=301,lt=302,ct=303,ut=304,dt=306,pt=1e3,mt=1001,yt=1002,ft=1003,gt=1004,xt=1004,bt=1005,vt=1005,wt=1006,Mt=1007,St=1007,_t=1008,At=1008,zt=1009,Tt=1010,Ct=1011,It=1012,Bt=1013,kt=1014,Et=1015,Pt=1016,Rt=1017,Ot=1018,Ft=1020,Nt=35902,Lt=1021,Vt=1022,Wt=1023,Ut=1024,jt=1025,Dt=1026,Ht=1027,qt=1028,Jt=1029,Xt=1030,Yt=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,se=35841,ie=35842,re=35843,ne=36196,oe=37492,ae=37496,he=37808,le=37809,ce=37810,ue=37811,de=37812,pe=37813,me=37814,ye=37815,fe=37816,ge=37817,xe=37818,be=37819,ve=37820,we=37821,Me=36492,Se=36494,_e=36495,Ae=36283,ze=36284,Te=36285,Ce=36286,Ie=2200,Be=2201,ke=2202,Ee=2300,Pe=2301,Re=2302,Oe=2400,Fe=2401,Ne=2402,Le=2500,Ve=2501,We=0,Ue=1,je=2,De=3200,He=3201,qe=3202,Je=3203,Xe=0,Ye=1,Ze="",Ge="srgb",$e="srgb-linear",Qe="linear",Ke="srgb",ts=0,es=7680,ss=7681,is=7682,rs=7683,ns=34055,os=34056,as=5386,hs=512,ls=513,cs=514,us=515,ds=516,ps=517,ms=518,ys=519,fs=512,gs=513,xs=514,bs=515,vs=516,ws=517,Ms=518,Ss=519,_s=35044,As=35048,zs=35040,Ts=35045,Cs=35049,Is=35041,Bs=35046,ks=35050,Es=35042,Ps="100",Rs="300 es",Os=2e3,Fs=2001;class Ns{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const s=this._listeners;void 0===s[t]&&(s[t]=[]),-1===s[t].indexOf(e)&&s[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const s=this._listeners;return void 0!==s[t]&&-1!==s[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const s=this._listeners[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const s=e.slice(0);for(let e=0,i=s.length;e>8&255]+Ls[t>>16&255]+Ls[t>>24&255]+"-"+Ls[255&e]+Ls[e>>8&255]+"-"+Ls[e>>16&15|64]+Ls[e>>24&255]+"-"+Ls[63&s|128]+Ls[s>>8&255]+"-"+Ls[s>>16&255]+Ls[s>>24&255]+Ls[255&i]+Ls[i>>8&255]+Ls[i>>16&255]+Ls[i>>24&255]).toLowerCase()}function Ds(t,e,s){return Math.max(e,Math.min(s,t))}function Hs(t,e){return(t%e+e)%e}function qs(t,e,s){return(1-s)*t+s*e}function Js(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Xs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Ys={DEG2RAD:Ws,RAD2DEG:Us,generateUUID:js,clamp:Ds,euclideanModulo:Hs,mapLinear:function(t,e,s,i,r){return i+(t-e)*(r-i)/(s-e)},inverseLerp:function(t,e,s){return t!==e?(s-t)/(e-t):0},lerp:qs,damp:function(t,e,s,i){return qs(t,e,1-Math.exp(-s*i))},pingpong:function(t,e=1){return e-Math.abs(Hs(t,2*e)-e)},smoothstep:function(t,e,s){return t<=e?0:t>=s?1:(t=(t-e)/(s-e))*t*(3-2*t)},smootherstep:function(t,e,s){return t<=e?0:t>=s?1:(t=(t-e)/(s-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(Vs=t);let e=Vs+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*Ws},radToDeg:function(t){return t*Us},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,s,i,r){const n=Math.cos,o=Math.sin,a=n(s/2),h=o(s/2),l=n((e+i)/2),c=o((e+i)/2),u=n((e-i)/2),d=o((e-i)/2),p=n((i-e)/2),m=o((i-e)/2);switch(r){case"XYX":t.set(a*c,h*u,h*d,a*l);break;case"YZY":t.set(h*d,a*c,h*u,a*l);break;case"ZXZ":t.set(h*u,h*d,a*c,a*l);break;case"XZX":t.set(a*c,h*m,h*p,a*l);break;case"YXY":t.set(h*p,a*c,h*m,a*l);break;case"ZYZ":t.set(h*m,h*p,a*c,a*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Xs,denormalize:Js};class Zs{constructor(t=0,e=0){Zs.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,s=this.y,i=t.elements;return this.x=i[0]*e+i[3]*s+i[6],this.y=i[1]*e+i[4]*s+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Ds(this.x,t.x,e.x),this.y=Ds(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Ds(this.x,t,e),this.y=Ds(this.y,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(Ds(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(Ds(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y;return e*e+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const s=Math.cos(e),i=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*s-n*i+t.x,this.y=r*i+n*s+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Gs{constructor(t,e,s,i,r,n,o,a,h){Gs.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,o,a,h)}set(t,e,s,i,r,n,o,a,h){const l=this.elements;return l[0]=t,l[1]=i,l[2]=o,l[3]=e,l[4]=r,l[5]=a,l[6]=s,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],this}extractBasis(t,e,s){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),s.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],o=s[3],a=s[6],h=s[1],l=s[4],c=s[7],u=s[2],d=s[5],p=s[8],m=i[0],y=i[3],f=i[6],g=i[1],x=i[4],b=i[7],v=i[2],w=i[5],M=i[8];return r[0]=n*m+o*g+a*v,r[3]=n*y+o*x+a*w,r[6]=n*f+o*b+a*M,r[1]=h*m+l*g+c*v,r[4]=h*y+l*x+c*w,r[7]=h*f+l*b+c*M,r[2]=u*m+d*g+p*v,r[5]=u*y+d*x+p*w,r[8]=u*f+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return e*n*l-e*o*h-s*r*l+s*o*a+i*r*h-i*n*a}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=l*n-o*h,u=o*a-l*r,d=h*r-n*a,p=e*c+s*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(i*h-l*s)*m,t[2]=(o*s-i*n)*m,t[3]=u*m,t[4]=(l*e-i*a)*m,t[5]=(i*r-o*e)*m,t[6]=d*m,t[7]=(s*a-h*e)*m,t[8]=(n*e-s*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,s,i,r,n,o){const a=Math.cos(r),h=Math.sin(r);return this.set(s*a,s*h,-s*(a*n+h*o)+n+t,-i*h,i*a,-i*(-h*n+a*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply($s.makeScale(t,e)),this}rotate(t){return this.premultiply($s.makeRotation(-t)),this}translate(t,e){return this.premultiply($s.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,s,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<9;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<9;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const $s=new Gs;function Qs(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Ks={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function ti(t,e){return new Ks[t](e)}function ei(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function si(){const t=ei("canvas");return t.style.display="block",t}const ii={};function ri(t){t in ii||(ii[t]=!0,console.warn(t))}function ni(t,e,s){return new Promise((function(i,r){setTimeout((function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,s);break;default:i()}}),s)}))}function oi(t){const e=t.elements;e[2]=.5*e[2]+.5*e[3],e[6]=.5*e[6]+.5*e[7],e[10]=.5*e[10]+.5*e[11],e[14]=.5*e[14]+.5*e[15]}function ai(t){const e=t.elements;-1===e[11]?(e[10]=-e[10]-1,e[14]=-e[14]):(e[10]=-e[10],e[14]=1-e[14])}const hi=(new Gs).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),li=(new Gs).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function ci(){const t={enabled:!0,workingColorSpace:$e,spaces:{},convert:function(t,e,s){return!1!==this.enabled&&e!==s&&e&&s?(this.spaces[e].transfer===Ke&&(t.r=di(t.r),t.g=di(t.g),t.b=di(t.b)),this.spaces[e].primaries!==this.spaces[s].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[s].fromXYZ)),this.spaces[s].transfer===Ke&&(t.r=pi(t.r),t.g=pi(t.g),t.b=pi(t.b)),t):t},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?Qe:this.spaces[t].transfer},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,s){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[s].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace}},e=[.64,.33,.3,.6,.15,.06],s=[.2126,.7152,.0722],i=[.3127,.329];return t.define({[$e]:{primaries:e,whitePoint:i,transfer:Qe,toXYZ:hi,fromXYZ:li,luminanceCoefficients:s,workingColorSpaceConfig:{unpackColorSpace:Ge},outputColorSpaceConfig:{drawingBufferColorSpace:Ge}},[Ge]:{primaries:e,whitePoint:i,transfer:Ke,toXYZ:hi,fromXYZ:li,luminanceCoefficients:s,outputColorSpaceConfig:{drawingBufferColorSpace:Ge}}}),t}const ui=ci();function di(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function pi(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let mi;class yi{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===mi&&(mi=ei("canvas")),mi.width=t.width,mi.height=t.height;const s=mi.getContext("2d");t instanceof ImageData?s.putImageData(t,0,0):s.drawImage(t,0,0,t.width,t.height),e=mi}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=ei("canvas");e.width=t.width,e.height=t.height;const s=e.getContext("2d");s.drawImage(t,0,0,t.width,t.height);const i=s.getImageData(0,0,t.width,t.height),r=i.data;for(let t=0;t0&&(s.userData=this.userData),e||(t.textures[this.uuid]=s),s}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==at)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case pt:t.x=t.x-Math.floor(t.x);break;case mt:t.x=t.x<0?0:1;break;case yt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case pt:t.y=t.y-Math.floor(t.y);break;case mt:t.y=t.y<0?0:1;break;case yt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}vi.DEFAULT_IMAGE=null,vi.DEFAULT_MAPPING=at,vi.DEFAULT_ANISOTROPY=1;class wi{constructor(t=0,e=0,s=0,i=1){wi.prototype.isVector4=!0,this.x=t,this.y=e,this.z=s,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,s,i){return this.x=t,this.y=e,this.z=s,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*s+n[8]*i+n[12]*r,this.y=n[1]*e+n[5]*s+n[9]*i+n[13]*r,this.z=n[2]*e+n[6]*s+n[10]*i+n[14]*r,this.w=n[3]*e+n[7]*s+n[11]*i+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,s,i,r;const n=.01,o=.1,a=t.elements,h=a[0],l=a[4],c=a[8],u=a[1],d=a[5],p=a[9],m=a[2],y=a[6],f=a[10];if(Math.abs(l-u)a&&t>g?tg?a=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const r=Math.sqrt(i),n=Math.atan2(r,e*s);t=Math.sin(t*n)/r,o=Math.sin(o*n)/r}const r=o*s;if(a=a*t+u*r,h=h*t+d*r,l=l*t+p*r,c=c*t+m*r,t===1-o){const t=1/Math.sqrt(a*a+h*h+l*l+c*c);a*=t,h*=t,l*=t,c*=t}}t[e]=a,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,s,i,r,n){const o=s[i],a=s[i+1],h=s[i+2],l=s[i+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=o*p+l*c+a*d-h*u,t[e+1]=a*p+l*u+h*c-o*d,t[e+2]=h*p+l*d+o*u-a*c,t[e+3]=l*p-o*c-a*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,s,i){return this._x=t,this._y=e,this._z=s,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const s=t._x,i=t._y,r=t._z,n=t._order,o=Math.cos,a=Math.sin,h=o(s/2),l=o(i/2),c=o(r/2),u=a(s/2),d=a(i/2),p=a(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const s=e/2,i=Math.sin(s);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(s),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,s=e[0],i=e[4],r=e[8],n=e[1],o=e[5],a=e[9],h=e[2],l=e[6],c=e[10],u=s+o+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-a)*t,this._y=(r-h)*t,this._z=(n-i)*t}else if(s>o&&s>c){const t=2*Math.sqrt(1+s-o-c);this._w=(l-a)/t,this._x=.25*t,this._y=(i+n)/t,this._z=(r+h)/t}else if(o>c){const t=2*Math.sqrt(1+o-s-c);this._w=(r-h)/t,this._x=(i+n)/t,this._y=.25*t,this._z=(a+l)/t}else{const t=2*Math.sqrt(1+c-s-o);this._w=(n-i)/t,this._x=(r+h)/t,this._y=(a+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let s=t.dot(e)+1;return sMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=s):(this._x=0,this._y=-t.z,this._z=t.y,this._w=s)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=s),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Ds(this.dot(t),-1,1)))}rotateTowards(t,e){const s=this.angleTo(t);if(0===s)return this;const i=Math.min(1,e/s);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const s=t._x,i=t._y,r=t._z,n=t._w,o=e._x,a=e._y,h=e._z,l=e._w;return this._x=s*l+n*o+i*h-r*a,this._y=i*l+n*a+r*o-s*h,this._z=r*l+n*h+s*a-i*o,this._w=n*l-s*o-i*a-r*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const s=this._x,i=this._y,r=this._z,n=this._w;let o=n*t._w+s*t._x+i*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=n,this._x=s,this._y=i,this._z=r,this;const a=1-o*o;if(a<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*s+e*this._x,this._y=t*i+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const h=Math.sqrt(a),l=Math.atan2(h,o),c=Math.sin((1-e)*l)/h,u=Math.sin(e*l)/h;return this._w=n*c+this._w*u,this._x=s*c+this._x*u,this._y=i*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,s){return this.copy(t).slerp(e,s)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),s=Math.random(),i=Math.sqrt(1-s),r=Math.sqrt(s);return this.set(i*Math.sin(t),i*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ii{constructor(t=0,e=0,s=0){Ii.prototype.isVector3=!0,this.x=t,this.y=e,this.z=s}set(t,e,s){return void 0===s&&(s=this.z),this.x=t,this.y=e,this.z=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(ki.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ki.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*s+r[6]*i,this.y=r[1]*e+r[4]*s+r[7]*i,this.z=r[2]*e+r[5]*s+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=t.elements,n=1/(r[3]*e+r[7]*s+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*s+r[8]*i+r[12])*n,this.y=(r[1]*e+r[5]*s+r[9]*i+r[13])*n,this.z=(r[2]*e+r[6]*s+r[10]*i+r[14])*n,this}applyQuaternion(t){const e=this.x,s=this.y,i=this.z,r=t.x,n=t.y,o=t.z,a=t.w,h=2*(n*i-o*s),l=2*(o*e-r*i),c=2*(r*s-n*e);return this.x=e+a*h+n*c-o*l,this.y=s+a*l+o*h-r*c,this.z=i+a*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*s+r[8]*i,this.y=r[1]*e+r[5]*s+r[9]*i,this.z=r[2]*e+r[6]*s+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Ds(this.x,t.x,e.x),this.y=Ds(this.y,t.y,e.y),this.z=Ds(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Ds(this.x,t,e),this.y=Ds(this.y,t,e),this.z=Ds(this.z,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(Ds(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this.z=t.z+(e.z-t.z)*s,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const s=t.x,i=t.y,r=t.z,n=e.x,o=e.y,a=e.z;return this.x=i*a-r*o,this.y=r*n-s*a,this.z=s*o-i*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const s=t.dot(this)/e;return this.copy(t).multiplyScalar(s)}projectOnPlane(t){return Bi.copy(this).projectOnVector(t),this.sub(Bi)}reflect(t){return this.sub(Bi.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(Ds(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y,i=this.z-t.z;return e*e+s*s+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,s){const i=Math.sin(e)*t;return this.x=i*Math.sin(s),this.y=Math.cos(e)*t,this.z=i*Math.cos(s),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,s){return this.x=t*Math.sin(e),this.y=s,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),s=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=s,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,s=Math.sqrt(1-e*e);return this.x=s*Math.cos(t),this.y=e,this.z=s*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Bi=new Ii,ki=new Ci;class Ei{constructor(t=new Ii(1/0,1/0,1/0),e=new Ii(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,s=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,Ri),Ri.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,s;return t.normal.x>0?(e=t.normal.x*this.min.x,s=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,s=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,s+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,s+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,s+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,s+=t.normal.z*this.min.z),e<=-t.constant&&s>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(ji),Di.subVectors(this.max,ji),Fi.subVectors(t.a,ji),Ni.subVectors(t.b,ji),Li.subVectors(t.c,ji),Vi.subVectors(Ni,Fi),Wi.subVectors(Li,Ni),Ui.subVectors(Fi,Li);let e=[0,-Vi.z,Vi.y,0,-Wi.z,Wi.y,0,-Ui.z,Ui.y,Vi.z,0,-Vi.x,Wi.z,0,-Wi.x,Ui.z,0,-Ui.x,-Vi.y,Vi.x,0,-Wi.y,Wi.x,0,-Ui.y,Ui.x,0];return!!Ji(e,Fi,Ni,Li,Di)&&(e=[1,0,0,0,1,0,0,0,1],!!Ji(e,Fi,Ni,Li,Di)&&(Hi.crossVectors(Vi,Wi),e=[Hi.x,Hi.y,Hi.z],Ji(e,Fi,Ni,Li,Di)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Ri).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Ri).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Pi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Pi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Pi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Pi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Pi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Pi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Pi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Pi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Pi)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Pi=[new Ii,new Ii,new Ii,new Ii,new Ii,new Ii,new Ii,new Ii],Ri=new Ii,Oi=new Ei,Fi=new Ii,Ni=new Ii,Li=new Ii,Vi=new Ii,Wi=new Ii,Ui=new Ii,ji=new Ii,Di=new Ii,Hi=new Ii,qi=new Ii;function Ji(t,e,s,i,r){for(let n=0,o=t.length-3;n<=o;n+=3){qi.fromArray(t,n);const o=r.x*Math.abs(qi.x)+r.y*Math.abs(qi.y)+r.z*Math.abs(qi.z),a=e.dot(qi),h=s.dot(qi),l=i.dot(qi);if(Math.max(-Math.max(a,h,l),Math.min(a,h,l))>o)return!1}return!0}const Xi=new Ei,Yi=new Ii,Zi=new Ii;class Gi{constructor(t=new Ii,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const s=this.center;void 0!==e?s.copy(e):Xi.setFromPoints(t).getCenter(s);let i=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Yi.subVectors(t,this.center);const e=Yi.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),s=.5*(t-this.radius);this.center.addScaledVector(Yi,s/t),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Zi.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Yi.copy(t.center).add(Zi)),this.expandByPoint(Yi.copy(t.center).sub(Zi))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const $i=new Ii,Qi=new Ii,Ki=new Ii,tr=new Ii,er=new Ii,sr=new Ii,ir=new Ii;class rr{constructor(t=new Ii,e=new Ii(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,$i)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const s=e.dot(this.direction);return s<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,s)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=$i.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):($i.copy(this.origin).addScaledVector(this.direction,e),$i.distanceToSquared(t))}distanceSqToSegment(t,e,s,i){Qi.copy(t).add(e).multiplyScalar(.5),Ki.copy(e).sub(t).normalize(),tr.copy(this.origin).sub(Qi);const r=.5*t.distanceTo(e),n=-this.direction.dot(Ki),o=tr.dot(this.direction),a=-tr.dot(Ki),h=tr.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*a-o,u=n*o-a,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*o)+u*(n*c+u+2*a)+h}else u=r,c=Math.max(0,-(n*u+o)),d=-c*c+u*(u+2*a)+h;else u=-r,c=Math.max(0,-(n*u+o)),d=-c*c+u*(u+2*a)+h;else u<=-p?(c=Math.max(0,-(-n*r+o)),u=c>0?-r:Math.min(Math.max(-r,-a),r),d=-c*c+u*(u+2*a)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-a),r),d=u*(u+2*a)+h):(c=Math.max(0,-(n*r+o)),u=c>0?r:Math.min(Math.max(-r,-a),r),d=-c*c+u*(u+2*a)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+o)),d=-c*c+u*(u+2*a)+h;return s&&s.copy(this.origin).addScaledVector(this.direction,c),i&&i.copy(Qi).addScaledVector(Ki,u),d}intersectSphere(t,e){$i.subVectors(t.center,this.origin);const s=$i.dot(this.direction),i=$i.dot($i)-s*s,r=t.radius*t.radius;if(i>r)return null;const n=Math.sqrt(r-i),o=s-n,a=s+n;return a<0?null:o<0?this.at(a,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const s=-(this.origin.dot(t.normal)+t.constant)/e;return s>=0?s:null}intersectPlane(t,e){const s=this.distanceToPlane(t);return null===s?null:this.at(s,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let s,i,r,n,o,a;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(s=(t.min.x-u.x)*h,i=(t.max.x-u.x)*h):(s=(t.max.x-u.x)*h,i=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),s>n||r>i?null:((r>s||isNaN(s))&&(s=r),(n=0?(o=(t.min.z-u.z)*c,a=(t.max.z-u.z)*c):(o=(t.max.z-u.z)*c,a=(t.min.z-u.z)*c),s>a||o>i?null:((o>s||s!=s)&&(s=o),(a=0?s:i,e)))}intersectsBox(t){return null!==this.intersectBox(t,$i)}intersectTriangle(t,e,s,i,r){er.subVectors(e,t),sr.subVectors(s,t),ir.crossVectors(er,sr);let n,o=this.direction.dot(ir);if(o>0){if(i)return null;n=1}else{if(!(o<0))return null;n=-1,o=-o}tr.subVectors(this.origin,t);const a=n*this.direction.dot(sr.crossVectors(tr,sr));if(a<0)return null;const h=n*this.direction.dot(er.cross(tr));if(h<0)return null;if(a+h>o)return null;const l=-n*tr.dot(ir);return l<0?null:this.at(l/o,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class nr{constructor(t,e,s,i,r,n,o,a,h,l,c,u,d,p,m,y){nr.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,o,a,h,l,c,u,d,p,m,y)}set(t,e,s,i,r,n,o,a,h,l,c,u,d,p,m,y){const f=this.elements;return f[0]=t,f[4]=e,f[8]=s,f[12]=i,f[1]=r,f[5]=n,f[9]=o,f[13]=a,f[2]=h,f[6]=l,f[10]=c,f[14]=u,f[3]=d,f[7]=p,f[11]=m,f[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new nr).fromArray(this.elements)}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],e[9]=s[9],e[10]=s[10],e[11]=s[11],e[12]=s[12],e[13]=s[13],e[14]=s[14],e[15]=s[15],this}copyPosition(t){const e=this.elements,s=t.elements;return e[12]=s[12],e[13]=s[13],e[14]=s[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,s){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),s.setFromMatrixColumn(this,2),this}makeBasis(t,e,s){return this.set(t.x,e.x,s.x,0,t.y,e.y,s.y,0,t.z,e.z,s.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,s=t.elements,i=1/or.setFromMatrixColumn(t,0).length(),r=1/or.setFromMatrixColumn(t,1).length(),n=1/or.setFromMatrixColumn(t,2).length();return e[0]=s[0]*i,e[1]=s[1]*i,e[2]=s[2]*i,e[3]=0,e[4]=s[4]*r,e[5]=s[5]*r,e[6]=s[6]*r,e[7]=0,e[8]=s[8]*n,e[9]=s[9]*n,e[10]=s[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,s=t.x,i=t.y,r=t.z,n=Math.cos(s),o=Math.sin(s),a=Math.cos(i),h=Math.sin(i),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,s=n*c,i=o*l,r=o*c;e[0]=a*l,e[4]=-a*c,e[8]=h,e[1]=s+i*h,e[5]=t-r*h,e[9]=-o*a,e[2]=r-t*h,e[6]=i+s*h,e[10]=n*a}else if("YXZ"===t.order){const t=a*l,s=a*c,i=h*l,r=h*c;e[0]=t+r*o,e[4]=i*o-s,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-o,e[2]=s*o-i,e[6]=r+t*o,e[10]=n*a}else if("ZXY"===t.order){const t=a*l,s=a*c,i=h*l,r=h*c;e[0]=t-r*o,e[4]=-n*c,e[8]=i+s*o,e[1]=s+i*o,e[5]=n*l,e[9]=r-t*o,e[2]=-n*h,e[6]=o,e[10]=n*a}else if("ZYX"===t.order){const t=n*l,s=n*c,i=o*l,r=o*c;e[0]=a*l,e[4]=i*h-s,e[8]=t*h+r,e[1]=a*c,e[5]=r*h+t,e[9]=s*h-i,e[2]=-h,e[6]=o*a,e[10]=n*a}else if("YZX"===t.order){const t=n*a,s=n*h,i=o*a,r=o*h;e[0]=a*l,e[4]=r-t*c,e[8]=i*c+s,e[1]=c,e[5]=n*l,e[9]=-o*l,e[2]=-h*l,e[6]=s*c+i,e[10]=t-r*c}else if("XZY"===t.order){const t=n*a,s=n*h,i=o*a,r=o*h;e[0]=a*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=s*c-i,e[2]=i*c-s,e[6]=o*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(hr,t,lr)}lookAt(t,e,s){const i=this.elements;return dr.subVectors(t,e),0===dr.lengthSq()&&(dr.z=1),dr.normalize(),cr.crossVectors(s,dr),0===cr.lengthSq()&&(1===Math.abs(s.z)?dr.x+=1e-4:dr.z+=1e-4,dr.normalize(),cr.crossVectors(s,dr)),cr.normalize(),ur.crossVectors(dr,cr),i[0]=cr.x,i[4]=ur.x,i[8]=dr.x,i[1]=cr.y,i[5]=ur.y,i[9]=dr.y,i[2]=cr.z,i[6]=ur.z,i[10]=dr.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],o=s[4],a=s[8],h=s[12],l=s[1],c=s[5],u=s[9],d=s[13],p=s[2],m=s[6],y=s[10],f=s[14],g=s[3],x=s[7],b=s[11],v=s[15],w=i[0],M=i[4],S=i[8],_=i[12],A=i[1],z=i[5],T=i[9],C=i[13],I=i[2],B=i[6],k=i[10],E=i[14],P=i[3],R=i[7],O=i[11],F=i[15];return r[0]=n*w+o*A+a*I+h*P,r[4]=n*M+o*z+a*B+h*R,r[8]=n*S+o*T+a*k+h*O,r[12]=n*_+o*C+a*E+h*F,r[1]=l*w+c*A+u*I+d*P,r[5]=l*M+c*z+u*B+d*R,r[9]=l*S+c*T+u*k+d*O,r[13]=l*_+c*C+u*E+d*F,r[2]=p*w+m*A+y*I+f*P,r[6]=p*M+m*z+y*B+f*R,r[10]=p*S+m*T+y*k+f*O,r[14]=p*_+m*C+y*E+f*F,r[3]=g*w+x*A+b*I+v*P,r[7]=g*M+x*z+b*B+v*R,r[11]=g*S+x*T+b*k+v*O,r[15]=g*_+x*C+b*E+v*F,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[4],i=t[8],r=t[12],n=t[1],o=t[5],a=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*a*c-i*h*c-r*o*u+s*h*u+i*o*d-s*a*d)+t[7]*(+e*a*d-e*h*u+r*n*u-i*n*d+i*h*l-r*a*l)+t[11]*(+e*h*c-e*o*d-r*n*c+s*n*d+r*o*l-s*h*l)+t[15]*(-i*o*l-e*a*c+e*o*u+i*n*c-s*n*u+s*a*l)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,s){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=s),this}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],f=t[15],g=c*y*h-m*u*h+m*a*d-o*y*d-c*a*f+o*u*f,x=p*u*h-l*y*h-p*a*d+n*y*d+l*a*f-n*u*f,b=l*m*h-p*c*h+p*o*d-n*m*d-l*o*f+n*c*f,v=p*c*a-l*m*a-p*o*u+n*m*u+l*o*y-n*c*y,w=e*g+s*x+i*b+r*v;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/w;return t[0]=g*M,t[1]=(m*u*r-c*y*r-m*i*d+s*y*d+c*i*f-s*u*f)*M,t[2]=(o*y*r-m*a*r+m*i*h-s*y*h-o*i*f+s*a*f)*M,t[3]=(c*a*r-o*u*r-c*i*h+s*u*h+o*i*d-s*a*d)*M,t[4]=x*M,t[5]=(l*y*r-p*u*r+p*i*d-e*y*d-l*i*f+e*u*f)*M,t[6]=(p*a*r-n*y*r-p*i*h+e*y*h+n*i*f-e*a*f)*M,t[7]=(n*u*r-l*a*r+l*i*h-e*u*h-n*i*d+e*a*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*s*d+e*m*d+l*s*f-e*c*f)*M,t[10]=(n*m*r-p*o*r+p*s*h-e*m*h-n*s*f+e*o*f)*M,t[11]=(l*o*r-n*c*r-l*s*h+e*c*h+n*s*d-e*o*d)*M,t[12]=v*M,t[13]=(l*m*i-p*c*i+p*s*u-e*m*u-l*s*y+e*c*y)*M,t[14]=(p*o*i-n*m*i-p*s*a+e*m*a+n*s*y-e*o*y)*M,t[15]=(n*c*i-l*o*i+l*s*a-e*c*a-n*s*u+e*o*u)*M,this}scale(t){const e=this.elements,s=t.x,i=t.y,r=t.z;return e[0]*=s,e[4]*=i,e[8]*=r,e[1]*=s,e[5]*=i,e[9]*=r,e[2]*=s,e[6]*=i,e[10]*=r,e[3]*=s,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],s=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,s,i))}makeTranslation(t,e,s){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,s,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),s=Math.sin(t);return this.set(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const s=Math.cos(e),i=Math.sin(e),r=1-s,n=t.x,o=t.y,a=t.z,h=r*n,l=r*o;return this.set(h*n+s,h*o-i*a,h*a+i*o,0,h*o+i*a,l*o+s,l*a-i*n,0,h*a-i*o,l*a+i*n,r*a*a+s,0,0,0,0,1),this}makeScale(t,e,s){return this.set(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1),this}makeShear(t,e,s,i,r,n){return this.set(1,s,r,0,t,1,n,0,e,i,1,0,0,0,0,1),this}compose(t,e,s){const i=this.elements,r=e._x,n=e._y,o=e._z,a=e._w,h=r+r,l=n+n,c=o+o,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,f=o*c,g=a*h,x=a*l,b=a*c,v=s.x,w=s.y,M=s.z;return i[0]=(1-(m+f))*v,i[1]=(d+b)*v,i[2]=(p-x)*v,i[3]=0,i[4]=(d-b)*w,i[5]=(1-(u+f))*w,i[6]=(y+g)*w,i[7]=0,i[8]=(p+x)*M,i[9]=(y-g)*M,i[10]=(1-(u+m))*M,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,s){const i=this.elements;let r=or.set(i[0],i[1],i[2]).length();const n=or.set(i[4],i[5],i[6]).length(),o=or.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),t.x=i[12],t.y=i[13],t.z=i[14],ar.copy(this);const a=1/r,h=1/n,l=1/o;return ar.elements[0]*=a,ar.elements[1]*=a,ar.elements[2]*=a,ar.elements[4]*=h,ar.elements[5]*=h,ar.elements[6]*=h,ar.elements[8]*=l,ar.elements[9]*=l,ar.elements[10]*=l,e.setFromRotationMatrix(ar),s.x=r,s.y=n,s.z=o,this}makePerspective(t,e,s,i,r,n,o=2e3){const a=this.elements,h=2*r/(e-t),l=2*r/(s-i),c=(e+t)/(e-t),u=(s+i)/(s-i);let d,p;if(o===Os)d=-(n+r)/(n-r),p=-2*n*r/(n-r);else{if(o!==Fs)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);d=-n/(n-r),p=-n*r/(n-r)}return a[0]=h,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=u,a[13]=0,a[2]=0,a[6]=0,a[10]=d,a[14]=p,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,s,i,r,n,o=2e3){const a=this.elements,h=1/(e-t),l=1/(s-i),c=1/(n-r),u=(e+t)*h,d=(s+i)*l;let p,m;if(o===Os)p=(n+r)*c,m=-2*c;else{if(o!==Fs)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);p=r*c,m=-1*c}return a[0]=2*h,a[4]=0,a[8]=0,a[12]=-u,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-d,a[2]=0,a[6]=0,a[10]=m,a[14]=-p,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<16;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<16;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t[e+9]=s[9],t[e+10]=s[10],t[e+11]=s[11],t[e+12]=s[12],t[e+13]=s[13],t[e+14]=s[14],t[e+15]=s[15],t}}const or=new Ii,ar=new nr,hr=new Ii(0,0,0),lr=new Ii(1,1,1),cr=new Ii,ur=new Ii,dr=new Ii,pr=new nr,mr=new Ci;class yr{constructor(t=0,e=0,s=0,i=yr.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=s,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,s,i=this._order){return this._x=t,this._y=e,this._z=s,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,s=!0){const i=t.elements,r=i[0],n=i[4],o=i[8],a=i[1],h=i[5],l=i[9],c=i[2],u=i[6],d=i[10];switch(e){case"XYZ":this._y=Math.asin(Ds(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Ds(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(a,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(Ds(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(a,r));break;case"ZYX":this._y=Math.asin(-Ds(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(a,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(Ds(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-Ds(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===s&&this._onChangeCallback(),this}setFromQuaternion(t,e,s){return pr.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pr,e,s)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return mr.setFromEuler(this),this.setFromQuaternion(mr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}yr.DEFAULT_ORDER="XYZ";class fr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.visibility=this._visibility,i.active=this._active,i.bounds=this._bounds.map((t=>({boxInitialized:t.boxInitialized,boxMin:t.box.min.toArray(),boxMax:t.box.max.toArray(),sphereInitialized:t.sphereInitialized,sphereRadius:t.sphere.radius,sphereCenter:t.sphere.center.toArray()}))),i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.geometryCount=this._geometryCount,i.matricesTexture=this._matricesTexture.toJSON(t),null!==this._colorsTexture&&(i.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(i.boundingSphere={center:i.boundingSphere.center.toArray(),radius:i.boundingSphere.radius}),null!==this.boundingBox&&(i.boundingBox={min:i.boundingBox.min.toArray(),max:i.boundingBox.max.toArray()})),this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(i.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const s=e.shapes;if(Array.isArray(s))for(let e=0,i=s.length;e0){i.children=[];for(let e=0;e0){i.animations=[];for(let e=0;e0&&(s.geometries=e),i.length>0&&(s.materials=i),r.length>0&&(s.textures=r),o.length>0&&(s.images=o),a.length>0&&(s.shapes=a),h.length>0&&(s.skeletons=h),l.length>0&&(s.animations=l),c.length>0&&(s.nodes=c)}return s.object=i,s;function n(t){const e=[];for(const s in t){const i=t[s];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,s,i,r){Pr.subVectors(i,e),Rr.subVectors(s,e),Or.subVectors(t,e);const n=Pr.dot(Pr),o=Pr.dot(Rr),a=Pr.dot(Or),h=Rr.dot(Rr),l=Rr.dot(Or),c=n*h-o*o;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*a-o*l)*u,p=(n*l-o*a)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,s,i){return null!==this.getBarycoord(t,e,s,i,Fr)&&(Fr.x>=0&&Fr.y>=0&&Fr.x+Fr.y<=1)}static getInterpolation(t,e,s,i,r,n,o,a){return null===this.getBarycoord(t,e,s,i,Fr)?(a.x=0,a.y=0,"z"in a&&(a.z=0),"w"in a&&(a.w=0),null):(a.setScalar(0),a.addScaledVector(r,Fr.x),a.addScaledVector(n,Fr.y),a.addScaledVector(o,Fr.z),a)}static getInterpolatedAttribute(t,e,s,i,r,n){return Dr.setScalar(0),Hr.setScalar(0),qr.setScalar(0),Dr.fromBufferAttribute(t,e),Hr.fromBufferAttribute(t,s),qr.fromBufferAttribute(t,i),n.setScalar(0),n.addScaledVector(Dr,r.x),n.addScaledVector(Hr,r.y),n.addScaledVector(qr,r.z),n}static isFrontFacing(t,e,s,i){return Pr.subVectors(s,e),Rr.subVectors(t,e),Pr.cross(Rr).dot(i)<0}set(t,e,s){return this.a.copy(t),this.b.copy(e),this.c.copy(s),this}setFromPointsAndIndices(t,e,s,i){return this.a.copy(t[e]),this.b.copy(t[s]),this.c.copy(t[i]),this}setFromAttributeAndIndices(t,e,s,i){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,s),this.c.fromBufferAttribute(t,i),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Pr.subVectors(this.c,this.b),Rr.subVectors(this.a,this.b),.5*Pr.cross(Rr).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Jr.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Jr.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,s,i,r){return Jr.getInterpolation(t,this.a,this.b,this.c,e,s,i,r)}containsPoint(t){return Jr.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Jr.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const s=this.a,i=this.b,r=this.c;let n,o;Nr.subVectors(i,s),Lr.subVectors(r,s),Wr.subVectors(t,s);const a=Nr.dot(Wr),h=Lr.dot(Wr);if(a<=0&&h<=0)return e.copy(s);Ur.subVectors(t,i);const l=Nr.dot(Ur),c=Lr.dot(Ur);if(l>=0&&c<=l)return e.copy(i);const u=a*c-l*h;if(u<=0&&a>=0&&l<=0)return n=a/(a-l),e.copy(s).addScaledVector(Nr,n);jr.subVectors(t,r);const d=Nr.dot(jr),p=Lr.dot(jr);if(p>=0&&d<=p)return e.copy(r);const m=d*h-a*p;if(m<=0&&h>=0&&p<=0)return o=h/(h-p),e.copy(s).addScaledVector(Lr,o);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return Vr.subVectors(r,i),o=(c-l)/(c-l+(d-p)),e.copy(i).addScaledVector(Vr,o);const f=1/(y+m+u);return n=m*f,o=u*f,e.copy(s).addScaledVector(Nr,n).addScaledVector(Lr,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Xr={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Yr={h:0,s:0,l:0},Zr={h:0,s:0,l:0};function Gr(t,e,s){return s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+6*(e-t)*(2/3-s):t}class $r{constructor(t,e,s){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,s)}set(t,e,s){if(void 0===e&&void 0===s){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,s);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Ge){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ui.toWorkingColorSpace(this,e),this}setRGB(t,e,s,i=ui.workingColorSpace){return this.r=t,this.g=e,this.b=s,ui.toWorkingColorSpace(this,i),this}setHSL(t,e,s,i=ui.workingColorSpace){if(t=Hs(t,1),e=Ds(e,0,1),s=Ds(s,0,1),0===e)this.r=this.g=this.b=s;else{const i=s<=.5?s*(1+e):s+e-s*e,r=2*s-i;this.r=Gr(r,i,t+1/3),this.g=Gr(r,i,t),this.b=Gr(r,i,t-1/3)}return ui.toWorkingColorSpace(this,i),this}setStyle(t,e=Ge){function s(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=i[1],o=i[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return s(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return s(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return s(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(t)){const s=i[1],r=s.length;if(3===r)return this.setRGB(parseInt(s.charAt(0),16)/15,parseInt(s.charAt(1),16)/15,parseInt(s.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(s,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Ge){const s=Xr[t.toLowerCase()];return void 0!==s?this.setHex(s,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=di(t.r),this.g=di(t.g),this.b=di(t.b),this}copyLinearToSRGB(t){return this.r=pi(t.r),this.g=pi(t.g),this.b=pi(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Ge){return ui.fromWorkingColorSpace(Qr.copy(this),t),65536*Math.round(Ds(255*Qr.r,0,255))+256*Math.round(Ds(255*Qr.g,0,255))+Math.round(Ds(255*Qr.b,0,255))}getHexString(t=Ge){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ui.workingColorSpace){ui.fromWorkingColorSpace(Qr.copy(this),e);const s=Qr.r,i=Qr.g,r=Qr.b,n=Math.max(s,i,r),o=Math.min(s,i,r);let a,h;const l=(o+n)/2;if(o===n)a=0,h=0;else{const t=n-o;switch(h=l<=.5?t/(n+o):t/(2-n-o),n){case s:a=(i-r)/t+(i0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const s=t[e];if(void 0===s){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const i=this[e];void 0!==i?i&&i.isColor?i.set(s):i&&i.isVector3&&s&&s.isVector3?i.copy(s):this[e]=s:console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const s={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function i(t){const e=[];for(const s in t){const i=t[s];delete i.metadata,e.push(i)}return e}if(s.uuid=this.uuid,s.type=this.type,""!==this.name&&(s.name=this.name),this.color&&this.color.isColor&&(s.color=this.color.getHex()),void 0!==this.roughness&&(s.roughness=this.roughness),void 0!==this.metalness&&(s.metalness=this.metalness),void 0!==this.sheen&&(s.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(s.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(s.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(s.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(s.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(s.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(s.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(s.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(s.shininess=this.shininess),void 0!==this.clearcoat&&(s.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(s.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(s.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(s.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(s.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,s.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.dispersion&&(s.dispersion=this.dispersion),void 0!==this.iridescence&&(s.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(s.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(s.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(s.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(s.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(s.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(s.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(s.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(s.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(s.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(s.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(s.lightMap=this.lightMap.toJSON(t).uuid,s.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(s.aoMap=this.aoMap.toJSON(t).uuid,s.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(s.bumpMap=this.bumpMap.toJSON(t).uuid,s.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(s.normalMap=this.normalMap.toJSON(t).uuid,s.normalMapType=this.normalMapType,s.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(s.displacementMap=this.displacementMap.toJSON(t).uuid,s.displacementScale=this.displacementScale,s.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(s.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(s.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(s.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(s.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(s.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(s.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(s.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(s.combine=this.combine)),void 0!==this.envMapRotation&&(s.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(s.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(s.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(s.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(s.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(s.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(s.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(s.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(s.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(s.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(s.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(s.size=this.size),null!==this.shadowSide&&(s.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(s.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(s.blending=this.blending),0!==this.side&&(s.side=this.side),!0===this.vertexColors&&(s.vertexColors=!0),this.opacity<1&&(s.opacity=this.opacity),!0===this.transparent&&(s.transparent=!0),204!==this.blendSrc&&(s.blendSrc=this.blendSrc),205!==this.blendDst&&(s.blendDst=this.blendDst),100!==this.blendEquation&&(s.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(s.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(s.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(s.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(s.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(s.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(s.depthFunc=this.depthFunc),!1===this.depthTest&&(s.depthTest=this.depthTest),!1===this.depthWrite&&(s.depthWrite=this.depthWrite),!1===this.colorWrite&&(s.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(s.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(s.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(s.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(s.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==es&&(s.stencilFail=this.stencilFail),this.stencilZFail!==es&&(s.stencilZFail=this.stencilZFail),this.stencilZPass!==es&&(s.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(s.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(s.rotation=this.rotation),!0===this.polygonOffset&&(s.polygonOffset=!0),0!==this.polygonOffsetFactor&&(s.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(s.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(s.linewidth=this.linewidth),void 0!==this.dashSize&&(s.dashSize=this.dashSize),void 0!==this.gapSize&&(s.gapSize=this.gapSize),void 0!==this.scale&&(s.scale=this.scale),!0===this.dithering&&(s.dithering=!0),this.alphaTest>0&&(s.alphaTest=this.alphaTest),!0===this.alphaHash&&(s.alphaHash=!0),!0===this.alphaToCoverage&&(s.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(s.premultipliedAlpha=!0),!0===this.forceSinglePass&&(s.forceSinglePass=!0),!0===this.wireframe&&(s.wireframe=!0),this.wireframeLinewidth>1&&(s.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(s.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(s.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(s.flatShading=!0),!1===this.visible&&(s.visible=!1),!1===this.toneMapped&&(s.toneMapped=!1),!1===this.fog&&(s.fog=!1),Object.keys(this.userData).length>0&&(s.userData=this.userData),e){const e=i(t.textures),r=i(t.images);e.length>0&&(s.textures=e),r.length>0&&(s.images=r)}return s}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let s=null;if(null!==e){const t=e.length;s=new Array(t);for(let i=0;i!==t;++i)s[i]=e[i].clone()}return this.clippingPlanes=s,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class en extends tn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new $r(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const sn=rn();function rn(){const t=new ArrayBuffer(4),e=new Float32Array(t),s=new Uint32Array(t),i=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(i[t]=0,i[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(i[t]=1024>>-e-14,i[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(i[t]=e+15<<10,i[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(i[t]=31744,i[256|t]=64512,r[t]=24,r[256|t]=24):(i[t]=31744,i[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),o=new Uint32Array(64),a=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,s=0;for(;!(8388608&e);)e<<=1,s-=8388608;e&=-8388609,s+=947912704,n[t]=e|s}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)o[t]=t<<23;o[31]=1199570944,o[32]=2147483648;for(let t=33;t<63;++t)o[t]=2147483648+(t-32<<23);o[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(a[t]=1024);return{floatView:e,uint32View:s,baseTable:i,shiftTable:r,mantissaTable:n,exponentTable:o,offsetTable:a}}function nn(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Ds(t,-65504,65504),sn.floatView[0]=t;const e=sn.uint32View[0],s=e>>23&511;return sn.baseTable[s]+((8388607&e)>>sn.shiftTable[s])}function on(t){const e=t>>10;return sn.uint32View[0]=sn.mantissaTable[sn.offsetTable[e]+(1023&t)]+sn.exponentTable[e],sn.floatView[0]}const an={toHalfFloat:nn,fromHalfFloat:on},hn=new Ii,ln=new Zs;class cn{constructor(t,e,s=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=s,this.usage=_s,this.updateRanges=[],this.gpuType=Et,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,s){t*=this.itemSize,s*=e.itemSize;for(let i=0,r=this.itemSize;ie.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Ei);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ii(-1/0,-1/0,-1/0),new Ii(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,s=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const s in e)void 0!==e[s]&&(t[s]=e[s]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const s=this.attributes;for(const e in s){const i=s[e];t.data.attributes[e]=i.toJSON(t.data)}const i={};let r=!1;for(const e in this.morphAttributes){const s=this.morphAttributes[e],n=[];for(let e=0,i=s.length;e0&&(i[e]=n,r=!0)}r&&(t.data.morphAttributes=i,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const o=this.boundingSphere;return null!==o&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const s=t.index;null!==s&&this.setIndex(s.clone(e));const i=t.attributes;for(const t in i){const s=i[t];this.setAttribute(t,s.clone(e))}const r=t.morphAttributes;for(const t in r){const s=[],i=r[t];for(let t=0,r=i.length;t0){const s=t[e[0]];if(void 0!==s){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=s.length;t(t.far-t.near)**2)return}Cn.copy(r).invert(),In.copy(t.ray).applyMatrix4(Cn),null!==s.boundingBox&&!1===In.intersectsBox(s.boundingBox)||this._computeIntersections(t,e,In)}}_computeIntersections(t,e,s){let i;const r=this.geometry,n=this.material,o=r.index,a=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==o)if(Array.isArray(n))for(let r=0,a=u.length;rs.far?null:{distance:l,point:Ln.clone(),object:t}}(t,e,s,i,En,Pn,Rn,Nn);if(c){const t=new Ii;Jr.getBarycoord(Nn,En,Pn,Rn,t),r&&(c.uv=Jr.getInterpolatedAttribute(r,a,h,l,t,new Zs)),n&&(c.uv1=Jr.getInterpolatedAttribute(n,a,h,l,t,new Zs)),o&&(c.normal=Jr.getInterpolatedAttribute(o,a,h,l,t,new Ii),c.normal.dot(i.direction)>0&&c.normal.multiplyScalar(-1));const e={a:a,b:h,c:l,normal:new Ii,materialIndex:0};Jr.getNormal(En,Pn,Rn,e.normal),c.face=e,c.barycoord=t}return c}class Un extends Tn{constructor(t=1,e=1,s=1,i=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:s,widthSegments:i,heightSegments:r,depthSegments:n};const o=this;i=Math.floor(i),r=Math.floor(r),n=Math.floor(n);const a=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,s,i,r,n,p,m,y,f,g){const x=n/y,b=p/f,v=n/2,w=p/2,M=m/2,S=y+1,_=f+1;let A=0,z=0;const T=new Ii;for(let n=0;n<_;n++){const o=n*b-w;for(let a=0;a0?1:-1,l.push(T.x,T.y,T.z),c.push(a/y),c.push(1-n/f),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const s={};for(const t in this.extensions)!0===this.extensions[t]&&(s[t]=!0);return Object.keys(s).length>0&&(e.extensions=s),e}}class Xn extends Er{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new nr,this.projectionMatrix=new nr,this.projectionMatrixInverse=new nr,this.coordinateSystem=Os}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const Yn=new Ii,Zn=new Zs,Gn=new Zs;class $n extends Xn{constructor(t=50,e=1,s=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=s,this.far=i,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*Us*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*Ws*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*Us*Math.atan(Math.tan(.5*Ws*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,s){Yn.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Yn.x,Yn.y).multiplyScalar(-t/Yn.z),Yn.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),s.set(Yn.x,Yn.y).multiplyScalar(-t/Yn.z)}getViewSize(t,e){return this.getViewBounds(t,Zn,Gn),e.subVectors(Gn,Zn)}setViewOffset(t,e,s,i,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=s,this.view.offsetY=i,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*Ws*this.fov)/this.zoom,s=2*e,i=this.aspect*s,r=-.5*i;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,o=n.fullHeight;r+=n.offsetX*i/t,e-=n.offsetY*s/o,i*=n.width/t,s*=n.height/o}const o=this.filmOffset;0!==o&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,e,e-s,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const Qn=-90;class Kn extends Er{constructor(t,e,s){super(),this.type="CubeCamera",this.renderTarget=s,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new $n(Qn,1,t,e);i.layers=this.layers,this.add(i);const r=new $n(Qn,1,t,e);r.layers=this.layers,this.add(r);const n=new $n(Qn,1,t,e);n.layers=this.layers,this.add(n);const o=new $n(Qn,1,t,e);o.layers=this.layers,this.add(o);const a=new $n(Qn,1,t,e);a.layers=this.layers,this.add(a);const h=new $n(Qn,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[s,i,r,n,o,a]=e;for(const t of e)this.remove(t);if(t===Os)s.up.set(0,1,0),s.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),a.up.set(0,1,0),a.lookAt(0,0,-1);else{if(t!==Fs)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);s.up.set(0,-1,0),s.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),a.up.set(0,-1,0),a.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:s,activeMipmapLevel:i}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,o,a,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=s.texture.generateMipmaps;s.texture.generateMipmaps=!1,t.setRenderTarget(s,0,i),t.render(e,r),t.setRenderTarget(s,1,i),t.render(e,n),t.setRenderTarget(s,2,i),t.render(e,o),t.setRenderTarget(s,3,i),t.render(e,a),t.setRenderTarget(s,4,i),t.render(e,h),s.texture.generateMipmaps=m,t.setRenderTarget(s,5,i),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,s.texture.needsPMREMUpdate=!0}}class to extends vi{constructor(t,e,s,i,r,n,o,a,h,l){super(t=void 0!==t?t:[],e=void 0!==e?e:ht,s,i,r,n,o,a,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class eo extends Si{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const s={width:t,height:t,depth:1},i=[s,s,s,s,s,s];this.texture=new to(i,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:wt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const s={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new Un(5,5,5),r=new Jn({name:"CubemapFromEquirect",uniforms:jn(s.uniforms),vertexShader:s.vertexShader,fragmentShader:s.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new Vn(i,r),o=e.minFilter;e.minFilter===_t&&(e.minFilter=wt);return new Kn(1,10,this).update(t,n),e.minFilter=o,n.geometry.dispose(),n.material.dispose(),this}clear(t,e,s,i){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,s,i);t.setRenderTarget(r)}}class so{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new $r(t),this.density=e}clone(){return new so(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class io{constructor(t,e=1,s=1e3){this.isFog=!0,this.name="",this.color=new $r(t),this.near=e,this.far=s}clone(){return new io(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class ro extends Er{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new yr,this.environmentIntensity=1,this.environmentRotation=new yr,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class no{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=_s,this.updateRanges=[],this.version=0,this.uuid=js()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,s){t*=this.stride,s*=e.stride;for(let i=0,r=this.stride;it.far||e.push({distance:a,point:co.clone(),uv:Jr.getInterpolation(co,go,xo,bo,vo,wo,Mo,new Zs),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function _o(t,e,s,i,r,n){mo.subVectors(t,s).addScalar(.5).multiply(i),void 0!==r?(yo.x=n*mo.x-r*mo.y,yo.y=r*mo.x+n*mo.y):yo.copy(mo),t.copy(e),t.x+=yo.x,t.y+=yo.y,t.applyMatrix4(fo)}const Ao=new Ii,zo=new Ii;class To extends Er{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,s=e.length;t0){let s,i;for(s=1,i=e.length;s0){Ao.setFromMatrixPosition(this.matrixWorld);const s=t.ray.origin.distanceTo(Ao);this.getObjectForDistance(s).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ao.setFromMatrixPosition(t.matrixWorld),zo.setFromMatrixPosition(this.matrixWorld);const s=Ao.distanceTo(zo)/t.zoom;let i,r;for(e[0].object.visible=!0,i=1,r=e.length;i=t))break;e[i-1].object.visible=!1,e[i].object.visible=!0}for(this._currentLevel=i-1;i1?null:e.copy(t.start).addScaledVector(s,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),s=this.distanceToPoint(t.end);return e<0&&s>0||s<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const s=e||ta.getNormalMatrix(t),i=this.coplanarPoint(Qo).applyMatrix4(t),r=this.normal.applyMatrix3(s).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const sa=new Gi,ia=new Ii;class ra{constructor(t=new ea,e=new ea,s=new ea,i=new ea,r=new ea,n=new ea){this.planes=[t,e,s,i,r,n]}set(t,e,s,i,r,n){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(s),o[3].copy(i),o[4].copy(r),o[5].copy(n),this}copy(t){const e=this.planes;for(let s=0;s<6;s++)e[s].copy(t.planes[s]);return this}setFromProjectionMatrix(t,e=2e3){const s=this.planes,i=t.elements,r=i[0],n=i[1],o=i[2],a=i[3],h=i[4],l=i[5],c=i[6],u=i[7],d=i[8],p=i[9],m=i[10],y=i[11],f=i[12],g=i[13],x=i[14],b=i[15];if(s[0].setComponents(a-r,u-h,y-d,b-f).normalize(),s[1].setComponents(a+r,u+h,y+d,b+f).normalize(),s[2].setComponents(a+n,u+l,y+p,b+g).normalize(),s[3].setComponents(a-n,u-l,y-p,b-g).normalize(),s[4].setComponents(a-o,u-c,y-m,b-x).normalize(),e===Os)s[5].setComponents(a+o,u+c,y+m,b+x).normalize();else{if(e!==Fs)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,c,m,x).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),sa.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),sa.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(sa)}intersectsSprite(t){return sa.center.set(0,0,0),sa.radius=.7071067811865476,sa.applyMatrix4(t.matrixWorld),this.intersectsSphere(sa)}intersectsSphere(t){const e=this.planes,s=t.center,i=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(s)0?t.max.x:t.min.x,ia.y=i.normal.y>0?t.max.y:t.min.y,ia.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(ia)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let s=0;s<6;s++)if(e[s].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function na(t,e){return t-e}function oa(t,e){return t.z-e.z}function aa(t,e){return e.z-t.z}class ha{constructor(){this.index=0,this.pool=[],this.list=[]}push(t,e,s,i){const r=this.pool,n=this.list;this.index>=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const o=r[this.index];n.push(o),this.index++,o.start=t,o.count=e,o.z=s,o.index=i}reset(){this.list.length=0,this.index=0}}const la=new nr,ca=new $r(1,1,1),ua=new ra,da=new Ei,pa=new Gi,ma=new Ii,ya=new Ii,fa=new Ii,ga=new ha,xa=new Vn,ba=[];function va(t,e,s=0){const i=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(i):new Uint16Array(i);e.setIndex(new cn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const s in e.attributes){if(!t.hasAttribute(s))throw new Error(`THREE.BatchedMesh: Added geometry missing "${s}". All geometries must have consistent attributes.`);const i=t.getAttribute(s),r=e.getAttribute(s);if(i.itemSize!==r.itemSize||i.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Ei);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let s=0,i=e.length;s=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let s=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(na),s=this._availableInstanceIds.shift(),this._instanceInfo[s]=e):(s=this._instanceInfo.length,this._instanceInfo.push(e));const i=this._matricesTexture;la.identity().toArray(i.image.data,16*s),i.needsUpdate=!0;const r=this._colorsTexture;return r&&(ca.toArray(r.image.data,4*s),r.needsUpdate=!0),this._visibilityChanged=!0,s}addGeometry(t,e=-1,s=-1){this._initializeGeometry(t),this._validateGeometry(t);const i={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;i.vertexStart=this._nextVertexStart,i.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(i.indexStart=this._nextIndexStart,i.reservedIndexCount=-1===s?n.count:s),-1!==i.indexStart&&i.indexStart+i.reservedIndexCount>this._maxIndexCount||i.vertexStart+i.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let o;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(na),o=this._availableGeometryIds.shift(),r[o]=i):(o=this._geometryCount,this._geometryCount++,r.push(i)),this.setGeometryAt(o,t),this._nextIndexStart=i.indexStart+i.reservedIndexCount,this._nextVertexStart=i.vertexStart+i.reservedVertexCount,o}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const s=this.geometry,i=null!==s.getIndex(),r=s.getIndex(),n=e.getIndex(),o=this._geometryInfo[t];if(i&&n.count>o.reservedIndexCount||e.attributes.position.count>o.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const a=o.vertexStart,h=o.reservedVertexCount;o.vertexCount=e.getAttribute("position").count;for(const t in s.attributes){const i=e.getAttribute(t),r=s.getAttribute(t);va(i,r,a);const n=i.itemSize;for(let t=i.count,e=h;t=e.length||!1===e[t].active)return this;const s=this._instanceInfo;for(let e=0,i=s.length;ee)).sort(((t,e)=>s[t].vertexStart-s[e].vertexStart)),r=this.geometry;for(let n=0,o=s.length;n=this._geometryCount)return null;const s=this.geometry,i=this._geometryInfo[t];if(null===i.boundingBox){const t=new Ei,e=s.index,r=s.attributes.position;for(let s=i.start,n=i.start+i.count;s=this._geometryCount)return null;const s=this.geometry,i=this._geometryInfo[t];if(null===i.boundingSphere){const e=new Gi;this.getBoundingBoxAt(t,da),da.getCenter(e.center);const r=s.index,n=s.attributes.position;let o=0;for(let t=i.start,s=i.start+i.count;tt.active));if(Math.max(...s.map((t=>t.vertexStart+t.reservedVertexCount)))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...s.map((t=>t.indexStart+t.reservedIndexCount)))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const i=this.geometry;i.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Tn,this._initializeGeometry(i));const r=this.geometry;i.index&&wa(i.index.array,r.index.array);for(const t in i.attributes)wa(i.attributes[t].array,r.attributes[t].array)}raycast(t,e){const s=this._instanceInfo,i=this._geometryInfo,r=this.matrixWorld,n=this.geometry;xa.material=this.material,xa.geometry.index=n.index,xa.geometry.attributes=n.attributes,null===xa.geometry.boundingBox&&(xa.geometry.boundingBox=new Ei),null===xa.geometry.boundingSphere&&(xa.geometry.boundingSphere=new Gi);for(let n=0,o=s.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null}))),this._instanceInfo=t._instanceInfo.map((t=>({...t}))),this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._geometryCount=t._geometryCount,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){return this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null),this}onBeforeRender(t,e,s,i,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=i.getIndex(),o=null===n?1:n.array.BYTES_PER_ELEMENT,a=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data;u&&(la.multiplyMatrices(s.projectionMatrix,s.matrixWorldInverse).multiply(this.matrixWorld),ua.setFromProjectionMatrix(la,t.coordinateSystem));let m=0;if(this.sortObjects){la.copy(this.matrixWorld).invert(),ma.setFromMatrixPosition(s.matrixWorld).applyMatrix4(la),ya.set(0,0,-1).transformDirection(s.matrixWorld).transformDirection(la);for(let t=0,e=a.length;t0){const s=t[e[0]];if(void 0!==s){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=s.length;ti)return;Ia.applyMatrix4(t.matrixWorld);const a=e.ray.origin.distanceTo(Ia);return ae.far?void 0:{distance:a,point:Ba.clone().applyMatrix4(t.matrixWorld),index:r,face:null,faceIndex:null,barycoord:null,object:t}}const Pa=new Ii,Ra=new Ii;class Oa extends ka{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,s=[];for(let t=0,i=e.count;t0){const s=t[e[0]];if(void 0!==s){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=s.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(a),point:s,index:e,face:null,faceIndex:null,barycoord:null,object:o})}}class Ha extends Er{constructor(){super(),this.isGroup=!0,this.type="Group"}}class qa extends vi{constructor(t,e,s,i,r,n,o,a,h){super(t,e,s,i,r,n,o,a,h),this.isVideoTexture=!0,this.minFilter=void 0!==n?n:wt,this.magFilter=void 0!==r?r:wt,this.generateMipmaps=!1;const l=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){l.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class Ja extends vi{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class Xa extends vi{constructor(t,e,s,i,r,n,o,a,h,l,c,u){super(null,n,o,a,h,l,i,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:s},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Ya extends Xa{constructor(t,e,s,i,r,n){super(t,e,s,r,n),this.isCompressedArrayTexture=!0,this.image.depth=i,this.wrapR=mt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class Za extends Xa{constructor(t,e,s){super(void 0,t[0].width,t[0].height,e,s,ht),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class Ga extends vi{constructor(t,e,s,i,r,n,o,a,h){super(t,e,s,i,r,n,o,a,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class $a extends vi{constructor(t,e,s,i,r,n,o,a,h,l=1026){if(l!==Dt&&l!==Ht)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===s&&l===Dt&&(s=kt),void 0===s&&l===Ht&&(s=1020),super(null,i,r,n,o,a,l,s,h),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==o?o:ft,this.minFilter=void 0!==a?a:ft,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class Qa{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const s=this.getUtoTmapping(t);return this.getPoint(s,e)}getPoints(t=5){const e=[];for(let s=0;s<=t;s++)e.push(this.getPoint(s/t));return e}getSpacedPoints(t=5){const e=[];for(let s=0;s<=t;s++)e.push(this.getPointAt(s/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let s,i=this.getPoint(0),r=0;e.push(0);for(let n=1;n<=t;n++)s=this.getPoint(n/t),r+=s.distanceTo(i),e.push(r),i=s;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const s=this.getLengths();let i=0;const r=s.length;let n;n=e||t*s[r-1];let o,a=0,h=r-1;for(;a<=h;)if(i=Math.floor(a+(h-a)/2),o=s[i]-n,o<0)a=i+1;else{if(!(o>0)){h=i;break}h=i-1}if(i=h,s[i]===n)return i/(r-1);const l=s[i];return(i+(n-l)/(s[i+1]-l))/(r-1)}getTangent(t,e){const s=1e-4;let i=t-s,r=t+s;i<0&&(i=0),r>1&&(r=1);const n=this.getPoint(i),o=this.getPoint(r),a=e||(n.isVector2?new Zs:new Ii);return a.copy(o).sub(n).normalize(),a}getTangentAt(t,e){const s=this.getUtoTmapping(t);return this.getTangent(s,e)}computeFrenetFrames(t,e){const s=new Ii,i=[],r=[],n=[],o=new Ii,a=new nr;for(let e=0;e<=t;e++){const s=e/t;i[e]=this.getTangentAt(s,new Ii)}r[0]=new Ii,n[0]=new Ii;let h=Number.MAX_VALUE;const l=Math.abs(i[0].x),c=Math.abs(i[0].y),u=Math.abs(i[0].z);l<=h&&(h=l,s.set(1,0,0)),c<=h&&(h=c,s.set(0,1,0)),u<=h&&s.set(0,0,1),o.crossVectors(i[0],s).normalize(),r[0].crossVectors(i[0],o),n[0].crossVectors(i[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),o.crossVectors(i[e-1],i[e]),o.length()>Number.EPSILON){o.normalize();const t=Math.acos(Ds(i[e-1].dot(i[e]),-1,1));r[e].applyMatrix4(a.makeRotationAxis(o,t))}n[e].crossVectors(i[e],r[e])}if(!0===e){let e=Math.acos(Ds(r[0].dot(r[t]),-1,1));e/=t,i[0].dot(o.crossVectors(r[0],r[t]))>0&&(e=-e);for(let s=1;s<=t;s++)r[s].applyMatrix4(a.makeRotationAxis(i[s],e*s)),n[s].crossVectors(i[s],r[s])}return{tangents:i,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Ka extends Qa{constructor(t=0,e=0,s=1,i=1,r=0,n=2*Math.PI,o=!1,a=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=s,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=o,this.aRotation=a}getPoint(t,e=new Zs){const s=e,i=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?o=i[(h-1)%r]:(sh.subVectors(i[0],i[1]).add(i[0]),o=sh);const c=i[h%r],u=i[(h+1)%r];if(this.closed||h+2i.length-2?i.length-1:n+1],c=i[n>i.length-3?i.length-1:n+2];return s.set(ah(o,a.x,h.x,l.x,c.x),ah(o,a.y,h.y,l.y,c.y)),s}copy(t){super.copy(t),this.points=[];for(let e=0,s=t.points.length;e=s){const t=i[r]-s,n=this.curves[r],o=n.getLength(),a=0===o?0:1-t/o;return n.getPointAt(a,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let s=0,i=this.curves.length;s1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,s=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class vh extends Tn{constructor(t=[new Zs(0,-.5),new Zs(.5,0),new Zs(0,.5)],e=12,s=0,i=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:s,phiLength:i},e=Math.floor(e),i=Ds(i,0,2*Math.PI);const r=[],n=[],o=[],a=[],h=[],l=1/e,c=new Ii,u=new Zs,d=new Ii,p=new Ii,m=new Ii;let y=0,f=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:y=t[e+1].x-t[e].x,f=t[e+1].y-t[e].y,d.x=1*f,d.y=-y,d.z=0*f,m.copy(d),d.normalize(),a.push(d.x,d.y,d.z);break;case t.length-1:a.push(m.x,m.y,m.z);break;default:y=t[e+1].x-t[e].x,f=t[e+1].y-t[e].y,d.x=1*f,d.y=-y,d.z=0*f,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),a.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=s+r*l*i,p=Math.sin(d),m=Math.cos(d);for(let s=0;s<=t.length-1;s++){c.x=t[s].x*p,c.y=t[s].y,c.z=t[s].x*m,n.push(c.x,c.y,c.z),u.x=r/e,u.y=s/(t.length-1),o.push(u.x,u.y);const i=a[3*s+0]*p,l=a[3*s+1],d=a[3*s+0]*m;h.push(i,l,d)}}for(let s=0;s0||0!==i)&&(l.push(n,o,h),x+=3),(e>0||i!==r-1)&&(l.push(o,a,h),x+=3)}h.addGroup(f,x,0),f+=x}(),!1===n&&(t>0&&g(!0),e>0&&g(!1)),this.setIndex(l),this.setAttribute("position",new bn(c,3)),this.setAttribute("normal",new bn(u,3)),this.setAttribute("uv",new bn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Sh(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class _h extends Sh{constructor(t=1,e=1,s=32,i=1,r=!1,n=0,o=2*Math.PI){super(0,t,e,s,i,r,n,o),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:s,heightSegments:i,openEnded:r,thetaStart:n,thetaLength:o}}static fromJSON(t){return new _h(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ah extends Tn{constructor(t=[],e=[],s=1,i=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:s,detail:i};const r=[],n=[];function o(t,e,s,i){const r=i+1,n=[];for(let i=0;i<=r;i++){n[i]=[];const o=t.clone().lerp(s,i/r),a=e.clone().lerp(s,i/r),h=r-i;for(let t=0;t<=h;t++)n[i][t]=0===t&&i===r?o:o.clone().lerp(a,t/h)}for(let t=0;t.9&&o<.1&&(e<.2&&(n[t+0]+=1),s<.2&&(n[t+2]+=1),i<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new bn(r,3)),this.setAttribute("normal",new bn(r.slice(),3)),this.setAttribute("uv",new bn(n,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ah(t.vertices,t.indices,t.radius,t.details)}}class zh extends Ah{constructor(t=1,e=0){const s=(1+Math.sqrt(5))/2,i=1/s;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-s,0,-i,s,0,i,-s,0,i,s,-i,-s,0,-i,s,0,i,-s,0,i,s,0,-s,0,-i,s,0,-i,-s,0,i,s,0,i],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new zh(t.radius,t.detail)}}const Th=new Ii,Ch=new Ii,Ih=new Ii,Bh=new Jr;class kh extends Tn{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const s=4,i=Math.pow(10,s),r=Math.cos(Ws*e),n=t.getIndex(),o=t.getAttribute("position"),a=n?n.count:o.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t80*s){a=l=t[0],h=c=t[1];for(let e=s;el&&(l=u),d>c&&(c=d);p=Math.max(l-a,c-h),p=0!==p?32767/p:0}return Fh(n,o,s,a,h,p,0),o};function Rh(t,e,s,i,r){let n,o;if(r===function(t,e,s,i){let r=0;for(let n=e,o=s-i;n0)for(n=e;n=e;n-=i)o=el(n,t[n],t[n+1],o);return o&&Zh(o,o.next)&&(sl(o),o=o.next),o}function Oh(t,e){if(!t)return t;e||(e=t);let s,i=t;do{if(s=!1,i.steiner||!Zh(i,i.next)&&0!==Yh(i.prev,i,i.next))i=i.next;else{if(sl(i),i=e=i.prev,i===i.next)break;s=!0}}while(s||i!==e);return e}function Fh(t,e,s,i,r,n,o){if(!t)return;!o&&n&&function(t,e,s,i){let r=t;do{0===r.z&&(r.z=Hh(r.x,r.y,e,s,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,s,i,r,n,o,a,h,l=1;do{for(s=t,t=null,n=null,o=0;s;){for(o++,i=s,a=0,e=0;e0||h>0&&i;)0!==a&&(0===h||!i||s.z<=i.z)?(r=s,s=s.nextZ,a--):(r=i,i=i.nextZ,h--),n?n.nextZ=r:t=r,r.prevZ=n,n=r;s=i}n.nextZ=null,l*=2}while(o>1)}(r)}(t,i,r,n);let a,h,l=t;for(;t.prev!==t.next;)if(a=t.prev,h=t.next,n?Lh(t,i,r,n):Nh(t))e.push(a.i/s|0),e.push(t.i/s|0),e.push(h.i/s|0),sl(t),t=h.next,l=h.next;else if((t=h)===l){o?1===o?Fh(t=Vh(Oh(t),e,s),e,s,i,r,n,2):2===o&&Wh(t,e,s,i,r,n):Fh(Oh(t),e,s,i,r,n,1);break}}function Nh(t){const e=t.prev,s=t,i=t.next;if(Yh(e,s,i)>=0)return!1;const r=e.x,n=s.x,o=i.x,a=e.y,h=s.y,l=i.y,c=rn?r>o?r:o:n>o?n:o,p=a>h?a>l?a:l:h>l?h:l;let m=i.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&Jh(r,a,n,h,o,l,m.x,m.y)&&Yh(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function Lh(t,e,s,i){const r=t.prev,n=t,o=t.next;if(Yh(r,n,o)>=0)return!1;const a=r.x,h=n.x,l=o.x,c=r.y,u=n.y,d=o.y,p=ah?a>l?a:l:h>l?h:l,f=c>u?c>d?c:d:u>d?u:d,g=Hh(p,m,e,s,i),x=Hh(y,f,e,s,i);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=g&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=f&&b!==r&&b!==o&&Jh(a,c,h,u,l,d,b.x,b.y)&&Yh(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=f&&v!==r&&v!==o&&Jh(a,c,h,u,l,d,v.x,v.y)&&Yh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=g;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=f&&b!==r&&b!==o&&Jh(a,c,h,u,l,d,b.x,b.y)&&Yh(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=f&&v!==r&&v!==o&&Jh(a,c,h,u,l,d,v.x,v.y)&&Yh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function Vh(t,e,s){let i=t;do{const r=i.prev,n=i.next.next;!Zh(r,n)&&Gh(r,i,i.next,n)&&Kh(r,n)&&Kh(n,r)&&(e.push(r.i/s|0),e.push(i.i/s|0),e.push(n.i/s|0),sl(i),sl(i.next),i=t=n),i=i.next}while(i!==t);return Oh(i)}function Wh(t,e,s,i,r,n){let o=t;do{let t=o.next.next;for(;t!==o.prev;){if(o.i!==t.i&&Xh(o,t)){let a=tl(o,t);return o=Oh(o,o.next),a=Oh(a,a.next),Fh(o,e,s,i,r,n,0),void Fh(a,e,s,i,r,n,0)}t=t.next}o=o.next}while(o!==t)}function Uh(t,e){return t.x-e.x}function jh(t,e){const s=function(t,e){let s,i=e,r=-1/0;const n=t.x,o=t.y;do{if(o<=i.y&&o>=i.next.y&&i.next.y!==i.y){const t=i.x+(o-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=n&&t>r&&(r=t,s=i.x=i.x&&i.x>=h&&n!==i.x&&Jh(os.x||i.x===s.x&&Dh(s,i)))&&(s=i,u=c)),i=i.next}while(i!==a);return s}(t,e);if(!s)return e;const i=tl(s,t);return Oh(i,i.next),Oh(s,s.next)}function Dh(t,e){return Yh(t.prev,t,e.prev)<0&&Yh(e.next,t,t.next)<0}function Hh(t,e,s,i,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-s)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-i)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function qh(t){let e=t,s=t;do{(e.x=(t-o)*(n-a)&&(t-o)*(i-a)>=(s-o)*(e-a)&&(s-o)*(n-a)>=(r-o)*(i-a)}function Xh(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let s=t;do{if(s.i!==t.i&&s.next.i!==t.i&&s.i!==e.i&&s.next.i!==e.i&&Gh(s,s.next,t,e))return!0;s=s.next}while(s!==t);return!1}(t,e)&&(Kh(t,e)&&Kh(e,t)&&function(t,e){let s=t,i=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{s.y>n!=s.next.y>n&&s.next.y!==s.y&&r<(s.next.x-s.x)*(n-s.y)/(s.next.y-s.y)+s.x&&(i=!i),s=s.next}while(s!==t);return i}(t,e)&&(Yh(t.prev,t,e.prev)||Yh(t,e.prev,e))||Zh(t,e)&&Yh(t.prev,t,t.next)>0&&Yh(e.prev,e,e.next)>0)}function Yh(t,e,s){return(e.y-t.y)*(s.x-e.x)-(e.x-t.x)*(s.y-e.y)}function Zh(t,e){return t.x===e.x&&t.y===e.y}function Gh(t,e,s,i){const r=Qh(Yh(t,e,s)),n=Qh(Yh(t,e,i)),o=Qh(Yh(s,i,t)),a=Qh(Yh(s,i,e));return r!==n&&o!==a||(!(0!==r||!$h(t,s,e))||(!(0!==n||!$h(t,i,e))||(!(0!==o||!$h(s,t,i))||!(0!==a||!$h(s,e,i)))))}function $h(t,e,s){return e.x<=Math.max(t.x,s.x)&&e.x>=Math.min(t.x,s.x)&&e.y<=Math.max(t.y,s.y)&&e.y>=Math.min(t.y,s.y)}function Qh(t){return t>0?1:t<0?-1:0}function Kh(t,e){return Yh(t.prev,t,t.next)<0?Yh(t,e,t.next)>=0&&Yh(t,t.prev,e)>=0:Yh(t,e,t.prev)<0||Yh(t,t.next,e)<0}function tl(t,e){const s=new il(t.i,t.x,t.y),i=new il(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,s.next=r,r.prev=s,i.next=s,s.prev=i,n.next=i,i.prev=n,i}function el(t,e,s,i){const r=new il(t,e,s);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function sl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function il(t,e,s){this.i=t,this.x=e,this.y=s,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class rl{static area(t){const e=t.length;let s=0;for(let i=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function ol(t,e){for(let s=0;sNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-a/u,m=e.y+o/u,y=((s.x-l/d-p)*l-(s.y+h/d-m)*h)/(o*l-a*h);i=p+o*y-t.x,r=m+a*y-t.y;const f=i*i+r*r;if(f<=2)return new Zs(i,r);n=Math.sqrt(f/2)}else{let t=!1;o>Number.EPSILON?h>Number.EPSILON&&(t=!0):o<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(a)===Math.sign(l)&&(t=!0),t?(i=-a,r=o,n=Math.sqrt(c)):(i=o,r=a,n=Math.sqrt(c/2))}return new Zs(i/n,r/n)}const k=[];for(let t=0,e=z.length,s=e-1,i=t+1;t=0;t--){const e=t/p,s=c*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const i=s;let r=s-1;r<0&&(r=t.length-1);for(let t=0,s=a+2*p;t0)&&d.push(e,r,h),(t!==s-1||a0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class zl extends tn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new $r(16777215),this.specular=new $r(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Tl extends tn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new $r(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Cl extends tn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class Il extends tn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new $r(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Bl extends tn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class kl extends tn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class El extends tn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new $r(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Pl extends Sa{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function Rl(t,e,s){return!t||!s&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)}function Ol(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Fl(t){const e=t.length,s=new Array(e);for(let t=0;t!==e;++t)s[t]=t;return s.sort((function(e,s){return t[e]-t[s]})),s}function Nl(t,e,s){const i=t.length,r=new t.constructor(i);for(let n=0,o=0;o!==i;++n){const i=s[n]*e;for(let s=0;s!==e;++s)r[o++]=t[i+s]}return r}function Ll(t,e,s,i){let r=1,n=t[0];for(;void 0!==n&&void 0===n[i];)n=t[r++];if(void 0===n)return;let o=n[i];if(void 0!==o)if(Array.isArray(o))do{o=n[i],void 0!==o&&(e.push(n.time),s.push.apply(s,o)),n=t[r++]}while(void 0!==n);else if(void 0!==o.toArray)do{o=n[i],void 0!==o&&(e.push(n.time),o.toArray(s,s.length)),n=t[r++]}while(void 0!==n);else do{o=n[i],void 0!==o&&(e.push(n.time),s.push(o)),n=t[r++]}while(void 0!==n)}const Vl={convertArray:Rl,isTypedArray:Ol,getKeyframeOrder:Fl,sortedArray:Nl,flattenJSON:Ll,subclip:function(t,e,s,i,r=30){const n=t.clone();n.name=e;const o=[];for(let t=0;t=i)){h.push(e.times[t]);for(let s=0;sn.tracks[t].times[0]&&(a=n.tracks[t].times[0]);for(let t=0;t=i.times[u]){const t=u*h+a,e=t+h-a;d=i.values.slice(t,e)}else{const t=i.createInterpolant(),e=a,s=h-a;t.evaluate(n),d=t.resultBuffer.slice(e,s)}if("quaternion"===r){(new Ci).fromArray(d).normalize().conjugate().toArray(d)}const p=o.times.length;for(let t=0;t=r)break t;{const o=e[1];t=r)break e}n=s,s=0}}for(;s>>1;te;)--n;if(++n,0!==r||n!==i){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=s.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const s=this.times,i=this.values,r=s.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const i=s[e];if("number"==typeof i&&isNaN(i)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,i),t=!1;break}if(null!==n&&n>i){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,i,n),t=!1;break}n=i}if(void 0!==i&&Ol(i))for(let e=0,s=i.length;e!==s;++e){const s=i[e];if(isNaN(s)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,s),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),s=this.getValueSize(),i=this.getInterpolation()===Re,r=t.length-1;let n=1;for(let o=1;o0){t[n]=t[r];for(let t=r*s,i=n*s,o=0;o!==s;++o)e[i+o]=e[t+o];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*s)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),s=new(0,this.constructor)(this.name,t,e);return s.createInterpolant=this.createInterpolant,s}}Hl.prototype.TimeBufferType=Float32Array,Hl.prototype.ValueBufferType=Float32Array,Hl.prototype.DefaultInterpolation=Pe;class ql extends Hl{constructor(t,e,s){super(t,e,s)}}ql.prototype.ValueTypeName="bool",ql.prototype.ValueBufferType=Array,ql.prototype.DefaultInterpolation=Ee,ql.prototype.InterpolantFactoryMethodLinear=void 0,ql.prototype.InterpolantFactoryMethodSmooth=void 0;class Jl extends Hl{}Jl.prototype.ValueTypeName="color";class Xl extends Hl{}Xl.prototype.ValueTypeName="number";class Yl extends Wl{constructor(t,e,s,i){super(t,e,s,i)}interpolate_(t,e,s,i){const r=this.resultBuffer,n=this.sampleValues,o=this.valueSize,a=(s-e)/(i-e);let h=t*o;for(let t=h+o;h!==t;h+=4)Ci.slerpFlat(r,0,n,h-o,n,h,a);return r}}class Zl extends Hl{InterpolantFactoryMethodLinear(t){return new Yl(this.times,this.values,this.getValueSize(),t)}}Zl.prototype.ValueTypeName="quaternion",Zl.prototype.InterpolantFactoryMethodSmooth=void 0;class Gl extends Hl{constructor(t,e,s){super(t,e,s)}}Gl.prototype.ValueTypeName="string",Gl.prototype.ValueBufferType=Array,Gl.prototype.DefaultInterpolation=Ee,Gl.prototype.InterpolantFactoryMethodLinear=void 0,Gl.prototype.InterpolantFactoryMethodSmooth=void 0;class $l extends Hl{}$l.prototype.ValueTypeName="vector";class Ql{constructor(t="",e=-1,s=[],i=2500){this.name=t,this.tracks=s,this.duration=e,this.blendMode=i,this.uuid=js(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],s=t.tracks,i=1/(t.fps||1);for(let t=0,r=s.length;t!==r;++t)e.push(Kl(s[t]).scale(i));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],s=t.tracks,i={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,i=s.length;t!==i;++t)e.push(Hl.toJSON(s[t]));return i}static CreateFromMorphTargetSequence(t,e,s,i){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=i[t];e||(i[t]=e=[]),e.push(s)}}const n=[];for(const t in i)n.push(this.CreateFromMorphTargetSequence(t,i[t],e,s));return n}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const s=function(t,e,s,i,r){if(0!==s.length){const n=[],o=[];Ll(s,n,o,i),0!==n.length&&r.push(new t(e,n,o))}},i=[],r=t.name||"default",n=t.fps||30,o=t.blendMode;let a=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==rc[t])return void rc[t].push({onLoad:e,onProgress:s,onError:i});rc[t]=[],rc[t].push({onLoad:e,onProgress:s,onError:i});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),o=this.mimeType,a=this.responseType;fetch(n).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const s=rc[t],i=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,o=0!==n;let a=0;const h=new ReadableStream({start(t){!function e(){i.read().then((({done:i,value:r})=>{if(i)t.close();else{a+=r.byteLength;const i=new ProgressEvent("progress",{lengthComputable:o,loaded:a,total:n});for(let t=0,e=s.length;t{t.error(e)}))}()}});return new Response(h)}throw new nc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)})).then((t=>{switch(a){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,o)));case"json":return t.json();default:if(void 0===o)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(o),s=e&&e[1]?e[1].toLowerCase():void 0,i=new TextDecoder(s);return t.arrayBuffer().then((t=>i.decode(t)))}}})).then((e=>{tc.add(t,e);const s=rc[t];delete rc[t];for(let t=0,i=s.length;t{const s=rc[t];if(void 0===s)throw this.manager.itemError(t),e;delete rc[t];for(let t=0,i=s.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class ac extends ic{constructor(t){super(t)}load(t,e,s,i){const r=this,n=new oc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(s){try{e(r.parse(JSON.parse(s)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),s,i)}parse(t){const e=[];for(let s=0;s0:i.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(i.uniforms[e]={},r.type){case"t":i.uniforms[e].value=s(r.value);break;case"c":i.uniforms[e].value=(new $r).setHex(r.value);break;case"v2":i.uniforms[e].value=(new Zs).fromArray(r.value);break;case"v3":i.uniforms[e].value=(new Ii).fromArray(r.value);break;case"v4":i.uniforms[e].value=(new wi).fromArray(r.value);break;case"m3":i.uniforms[e].value=(new Gs).fromArray(r.value);break;case"m4":i.uniforms[e].value=(new nr).fromArray(r.value);break;default:i.uniforms[e].value=r.value}}if(void 0!==t.defines&&(i.defines=t.defines),void 0!==t.vertexShader&&(i.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(i.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(i.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)i.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(i.lights=t.lights),void 0!==t.clipping&&(i.clipping=t.clipping),void 0!==t.size&&(i.size=t.size),void 0!==t.sizeAttenuation&&(i.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(i.map=s(t.map)),void 0!==t.matcap&&(i.matcap=s(t.matcap)),void 0!==t.alphaMap&&(i.alphaMap=s(t.alphaMap)),void 0!==t.bumpMap&&(i.bumpMap=s(t.bumpMap)),void 0!==t.bumpScale&&(i.bumpScale=t.bumpScale),void 0!==t.normalMap&&(i.normalMap=s(t.normalMap)),void 0!==t.normalMapType&&(i.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),i.normalScale=(new Zs).fromArray(e)}return void 0!==t.displacementMap&&(i.displacementMap=s(t.displacementMap)),void 0!==t.displacementScale&&(i.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(i.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(i.roughnessMap=s(t.roughnessMap)),void 0!==t.metalnessMap&&(i.metalnessMap=s(t.metalnessMap)),void 0!==t.emissiveMap&&(i.emissiveMap=s(t.emissiveMap)),void 0!==t.emissiveIntensity&&(i.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(i.specularMap=s(t.specularMap)),void 0!==t.specularIntensityMap&&(i.specularIntensityMap=s(t.specularIntensityMap)),void 0!==t.specularColorMap&&(i.specularColorMap=s(t.specularColorMap)),void 0!==t.envMap&&(i.envMap=s(t.envMap)),void 0!==t.envMapRotation&&i.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(i.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(i.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(i.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(i.lightMap=s(t.lightMap)),void 0!==t.lightMapIntensity&&(i.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(i.aoMap=s(t.aoMap)),void 0!==t.aoMapIntensity&&(i.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(i.gradientMap=s(t.gradientMap)),void 0!==t.clearcoatMap&&(i.clearcoatMap=s(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(i.clearcoatRoughnessMap=s(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(i.clearcoatNormalMap=s(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(i.clearcoatNormalScale=(new Zs).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(i.iridescenceMap=s(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(i.iridescenceThicknessMap=s(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(i.transmissionMap=s(t.transmissionMap)),void 0!==t.thicknessMap&&(i.thicknessMap=s(t.thicknessMap)),void 0!==t.anisotropyMap&&(i.anisotropyMap=s(t.anisotropyMap)),void 0!==t.sheenColorMap&&(i.sheenColorMap=s(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(i.sheenRoughnessMap=s(t.sheenRoughnessMap)),i}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return Pc.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Ml,SpriteMaterial:ho,RawShaderMaterial:Sl,ShaderMaterial:Jn,PointsMaterial:Na,MeshPhysicalMaterial:Al,MeshStandardMaterial:_l,MeshPhongMaterial:zl,MeshToonMaterial:Tl,MeshNormalMaterial:Cl,MeshLambertMaterial:Il,MeshDepthMaterial:Bl,MeshDistanceMaterial:kl,MeshBasicMaterial:en,MeshMatcapMaterial:El,LineDashedMaterial:Pl,LineBasicMaterial:Sa,Material:tn}[t]}}class Rc{static decodeText(t){if(console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."),"undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let s=0,i=t.length;s0){const s=new ec(e);r=new lc(s),r.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e0){i=new lc(this.manager),i.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e{const e=new Ei;e.min.fromArray(t.boxMin),e.max.fromArray(t.boxMax);const s=new Gi;return s.radius=t.sphereRadius,s.center.fromArray(t.sphereCenter),{boxInitialized:t.boxInitialized,box:e,sphereInitialized:t.sphereInitialized,sphere:s}})),n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._geometryCount=t.geometryCount,n._matricesTexture=c(t.matricesTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid));break;case"LOD":n=new To;break;case"Line":n=new ka(h(t.geometry),l(t.material));break;case"LineLoop":n=new Fa(h(t.geometry),l(t.material));break;case"LineSegments":n=new Oa(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new ja(h(t.geometry),l(t.material));break;case"Sprite":n=new So(l(t.material));break;case"Group":n=new Ha;break;case"Bone":n=new Lo;break;default:n=new Er}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const o=t.children;for(let t=0;t{e&&e(s),r.manager.itemEnd(t)})).catch((t=>{i&&i(t)})):(setTimeout((function(){e&&e(n),r.manager.itemEnd(t)}),0),n);const o={};o.credentials="anonymous"===this.crossOrigin?"same-origin":"include",o.headers=this.requestHeader;const a=fetch(t,o).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(s){return tc.add(t,s),e&&e(s),r.manager.itemEnd(t),s})).catch((function(e){i&&i(e),tc.remove(t),r.manager.itemError(t),r.manager.itemEnd(t)}));tc.add(t,a),r.manager.itemStart(t)}}let jc;class Dc{static getContext(){return void 0===jc&&(jc=new(window.AudioContext||window.webkitAudioContext)),jc}static setContext(t){jc=t}}class Hc extends ic{constructor(t){super(t)}load(t,e,s,i){const r=this,n=new oc(this.manager);function o(e){i?i(e):console.error(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(t){try{const s=t.slice(0);Dc.getContext().decodeAudioData(s,(function(t){e(t)})).catch(o)}catch(t){o(t)}}),s,i)}}const qc=new nr,Jc=new nr,Xc=new nr;class Yc{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new $n,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new $n,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,Xc.copy(t.projectionMatrix);const s=e.eyeSep/2,i=s*e.near/e.focus,r=e.near*Math.tan(Ws*e.fov*.5)/e.zoom;let n,o;Jc.elements[12]=-s,qc.elements[12]=s,n=-r*e.aspect+i,o=r*e.aspect+i,Xc.elements[0]=2*e.near/(o-n),Xc.elements[8]=(o+n)/(o-n),this.cameraL.projectionMatrix.copy(Xc),n=-r*e.aspect-i,o=r*e.aspect-i,Xc.elements[0]=2*e.near/(o-n),Xc.elements[8]=(o+n)/(o-n),this.cameraR.projectionMatrix.copy(Xc)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Jc),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(qc)}}class Zc extends $n{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t}}class Gc{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=$c(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=$c();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function $c(){return performance.now()}const Qc=new Ii,Kc=new Ci,tu=new Ii,eu=new Ii;class su extends Er{constructor(){super(),this.type="AudioListener",this.context=Dc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new Gc}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,s=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Qc,Kc,tu),eu.set(0,0,-1).applyQuaternion(Kc),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Qc.x,t),e.positionY.linearRampToValueAtTime(Qc.y,t),e.positionZ.linearRampToValueAtTime(Qc.z,t),e.forwardX.linearRampToValueAtTime(eu.x,t),e.forwardY.linearRampToValueAtTime(eu.y,t),e.forwardZ.linearRampToValueAtTime(eu.z,t),e.upX.linearRampToValueAtTime(s.x,t),e.upY.linearRampToValueAtTime(s.y,t),e.upZ.linearRampToValueAtTime(s.z,t)}else e.setPosition(Qc.x,Qc.y,Qc.z),e.setOrientation(eu.x,eu.y,eu.z,s.x,s.y,s.z)}}class iu extends Er{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(s,i,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(s[t]!==s[t+e]){o.setValue(s,i);break}}saveOriginalState(){const t=this.binding,e=this.buffer,s=this.valueSize,i=s*this._origIndex;t.getValue(e,i);for(let t=s,r=i;t!==r;++t)e[t]=e[i+t%s];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let s=t;s=.5)for(let i=0;i!==r;++i)t[e+i]=t[s+i]}_slerp(t,e,s,i){Ci.slerpFlat(t,e,t,e,t,s,i)}_slerpAdditive(t,e,s,i,r){const n=this._workIndex*r;Ci.multiplyQuaternionsFlat(t,n,t,e,t,s),Ci.slerpFlat(t,e,t,e,t,n,i)}_lerp(t,e,s,i,r){const n=1-i;for(let o=0;o!==r;++o){const r=e+o;t[r]=t[r]*n+t[s+o]*i}}_lerpAdditive(t,e,s,i,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[s+n]*i}}}const uu="\\[\\]\\.:\\/",du=new RegExp("["+uu+"]","g"),pu="[^"+uu+"]",mu="[^"+uu.replace("\\.","")+"]",yu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",pu)+/(WCOD+)?/.source.replace("WCOD",mu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",pu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",pu)+"$"),fu=["material","materials","bones","map"];class gu{constructor(t,e,s){this.path=e,this.parsedPath=s||gu.parseTrackName(e),this.node=gu.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,s){return t&&t.isAnimationObjectGroup?new gu.Composite(t,e,s):new gu(t,e,s)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(du,"")}static parseTrackName(t){const e=yu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const s={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},i=s.nodeName&&s.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){const t=s.nodeName.substring(i+1);-1!==fu.indexOf(t)&&(s.nodeName=s.nodeName.substring(0,i),s.objectName=t)}if(null===s.propertyName||0===s.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return s}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const s=t.skeleton.getBoneByName(e);if(void 0!==s)return s}if(t.children){const s=function(t){for(let i=0;i=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[a]=n,t[n]=o;for(let t=0,e=i;t!==e;++t){const e=s[t],i=e[n],r=e[h];e[h]=i,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,s=this._bindings,i=s.length;let r=this.nCachedObjects_,n=t.length;for(let o=0,a=arguments.length;o!==a;++o){const a=arguments[o].uuid,h=e[a];if(void 0!==h)if(delete e[a],h0&&(e[o.uuid]=h),t[h]=o,t.pop();for(let t=0,e=i;t!==e;++t){const e=s[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const s=this._bindingsIndicesByPath;let i=s[t];const r=this._bindings;if(void 0!==i)return r[i];const n=this._paths,o=this._parsedPaths,a=this._objects,h=a.length,l=this.nCachedObjects_,c=new Array(h);i=r.length,s[t]=i,n.push(t),o.push(e),r.push(c);for(let s=l,i=a.length;s!==i;++s){const i=a[s];c[s]=new gu(i,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,s=e[t];if(void 0!==s){const i=this._paths,r=this._parsedPaths,n=this._bindings,o=n.length-1,a=n[o];e[t[o]]=s,n[s]=a,n.pop(),r[s]=r[o],r.pop(),i[s]=i[o],i.pop()}}}class bu{constructor(t,e,s=null,i=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=s,this.blendMode=i;const r=e.tracks,n=r.length,o=new Array(n),a={endingStart:Oe,endingEnd:Oe};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);o[t]=e,e.settings=a}this._interpolantSettings=a,this._interpolants=o,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,s){if(t.fadeOut(e),this.fadeIn(e),s){const s=this._clip.duration,i=t._clip.duration,r=i/s,n=s/i;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,s){return t.crossFadeFrom(this,e,s)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,s){const i=this._mixer,r=i.time,n=this.timeScale;let o=this._timeScaleInterpolant;null===o&&(o=i._lendControlInterpolant(),this._timeScaleInterpolant=o);const a=o.parameterPositions,h=o.sampleValues;return a[0]=r,a[1]=r+s,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,s,i){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const i=(t-r)*s;i<0||0===s?e=0:(this._startTime=null,e=s*i)}e*=this._updateTimeScale(t);const n=this._updateTime(e),o=this._updateWeight(t);if(o>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===Ve)for(let s=0,i=t.length;s!==i;++s)t[s].evaluate(n),e[s].accumulateAdditive(o);else for(let s=0,r=t.length;s!==r;++s)t[s].evaluate(n),e[s].accumulate(i,o)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const s=this._weightInterpolant;if(null!==s){const i=s.evaluate(t)[0];e*=i,t>s.parameterPositions[1]&&(this.stopFading(),0===i&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const s=this._timeScaleInterpolant;if(null!==s){e*=s.evaluate(t)[0],t>s.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,s=this.loop;let i=this.time+t,r=this._loopCount;const n=2202===s;if(0===t)return-1===r||!n||1&~r?i:e-i;if(2200===s){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(i>=e)i=e;else{if(!(i<0)){this.time=i;break t}i=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),i>=e||i<0){const s=Math.floor(i/e);i-=e*s,r+=Math.abs(s);const o=this.repetitions-r;if(o<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=t>0?e:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===o){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:s})}}else this.time=i;if(n&&!(1&~r))return e-i}return i}_setEndings(t,e,s){const i=this._interpolantSettings;s?(i.endingStart=Fe,i.endingEnd=Fe):(i.endingStart=t?this.zeroSlopeAtStart?Fe:Oe:Ne,i.endingEnd=e?this.zeroSlopeAtEnd?Fe:Oe:Ne)}_scheduleFading(t,e,s){const i=this._mixer,r=i.time;let n=this._weightInterpolant;null===n&&(n=i._lendControlInterpolant(),this._weightInterpolant=n);const o=n.parameterPositions,a=n.sampleValues;return o[0]=r,a[0]=e,o[1]=r+t,a[1]=s,this}}const vu=new Float32Array(1);class wu extends Ns{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const s=t._localRoot||this._root,i=t._clip.tracks,r=i.length,n=t._propertyBindings,o=t._interpolants,a=s.uuid,h=this._bindingsByRootAndName;let l=h[a];void 0===l&&(l={},h[a]=l);for(let t=0;t!==r;++t){const r=i[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,a,h));continue}const i=e&&e._propertyBindings[t].binding.parsedPath;c=new cu(gu.create(s,h,i),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,a,h),n[t]=c}o[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,s=t._clip.uuid,i=this._actionsByClip[s];this._bindAction(t,i&&i.knownActions[0]),this._addInactiveAction(t,s,e)}const e=t._propertyBindings;for(let t=0,s=e.length;t!==s;++t){const s=e[t];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,s=e.length;t!==s;++t){const s=e[t];0==--s.useCount&&(s.restoreOriginalState(),this._takeBackBinding(s))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,s=this._nActiveActions,i=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let o=0;o!==s;++o){e[o]._update(i,t,r,n)}const o=this._bindings,a=this._nActiveBindings;for(let t=0;t!==a;++t)o[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Ru).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Fu=new Ii,Nu=new Ii;class Lu{constructor(t=new Ii,e=new Ii){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){Fu.subVectors(t,this.start),Nu.subVectors(this.end,this.start);const s=Nu.dot(Nu);let i=Nu.dot(Fu)/s;return e&&(i=Ds(i,0,1)),i}closestPointToPoint(t,e,s){const i=this.closestPointToPointParameter(t,e);return this.delta(s).multiplyScalar(i).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Vu=new Ii;class Wu extends Er{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const s=new Tn,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,s=32;t1)for(let s=0;s.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{ud.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(ud,e)}}setLength(t,e=.2*t,s=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(s,e,s),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class yd extends Oa{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],s=new Tn;s.setAttribute("position",new bn(e,3)),s.setAttribute("color",new bn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(s,new Sa({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,s){const i=new $r,r=this.geometry.attributes.color.array;return i.set(t),i.toArray(r,0),i.toArray(r,3),i.set(e),i.toArray(r,6),i.toArray(r,9),i.set(s),i.toArray(r,12),i.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class fd{constructor(){this.type="ShapePath",this.color=new $r,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new bh,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,s,i){return this.currentPath.quadraticCurveTo(t,e,s,i),this}bezierCurveTo(t,e,s,i,r,n){return this.currentPath.bezierCurveTo(t,e,s,i,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const s=e.length;let i=!1;for(let r=s-1,n=0;nNumber.EPSILON){if(h<0&&(s=e[n],a=-a,o=e[r],h=-h),t.yo.y)continue;if(t.y===s.y){if(t.x===s.x)return!0}else{const e=h*(t.x-s.x)-a*(t.y-s.y);if(0===e)return!0;if(e<0)continue;i=!i}}else{if(t.y!==s.y)continue;if(o.x<=t.x&&t.x<=s.x||s.x<=t.x&&t.x<=o.x)return!0}}return i}const s=rl.isClockWise,i=this.subPaths;if(0===i.length)return[];let r,n,o;const a=[];if(1===i.length)return n=i[0],o=new Eh,o.curves=n.curves,a.push(o),a;let h=!s(i[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,o=i.length;e1){let t=!1,s=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=s/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/s,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t},cover:function(t,e){const s=t.image&&t.image.width?t.image.width/t.image.height:1;return s>e?(t.repeat.x=e/s,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=s/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t},fill:function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t},getByteLength:xd};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{et as ACESFilmicToneMapping,v as AddEquation,G as AddOperation,Ve as AdditiveAnimationBlendMode,f as AdditiveBlending,it as AgXToneMapping,Lt as AlphaFormat,Ss as AlwaysCompare,U as AlwaysDepth,ys as AlwaysStencilFunc,Ic as AmbientLight,bu as AnimationAction,Ql as AnimationClip,ac as AnimationLoader,wu as AnimationMixer,xu as AnimationObjectGroup,Vl as AnimationUtils,th as ArcCurve,Zc as ArrayCamera,md as ArrowHelper,nt as AttachedBindMode,iu as Audio,lu as AudioAnalyser,Dc as AudioContext,su as AudioListener,Hc as AudioLoader,yd as AxesHelper,d as BackSide,De as BasicDepthPacking,a as BasicShadowMap,Ma as BatchedMesh,Lo as Bone,ql as BooleanKeyframeTrack,Ou as Box2,Ei as Box3,ld as Box3Helper,Un as BoxGeometry,hd as BoxHelper,cn as BufferAttribute,Tn as BufferGeometry,Fc as BufferGeometryLoader,Tt as ByteType,tc as Cache,Xn as Camera,nd as CameraHelper,Ga as CanvasTexture,wh as CapsuleGeometry,oh as CatmullRomCurve3,tt as CineonToneMapping,Mh as CircleGeometry,mt as ClampToEdgeWrapping,Gc as Clock,$r as Color,Jl as ColorKeyframeTrack,ui as ColorManagement,Ya as CompressedArrayTexture,Za as CompressedCubeTexture,Xa as CompressedTexture,hc as CompressedTextureLoader,_h as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,gd as Controls,Kn as CubeCamera,ht as CubeReflectionMapping,lt as CubeRefractionMapping,to as CubeTexture,cc as CubeTextureLoader,dt as CubeUVReflectionMapping,ch as CubicBezierCurve,uh as CubicBezierCurve3,Ul as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,o as CullFaceFrontBack,i as CullFaceNone,Qa as Curve,xh as CurvePath,b as CustomBlending,st as CustomToneMapping,Sh as CylinderGeometry,Eu as Cylindrical,zi as Data3DTexture,_i as DataArrayTexture,Vo as DataTexture,uc as DataTextureLoader,an as DataUtils,rs as DecrementStencilOp,os as DecrementWrapStencilOp,sc as DefaultLoadingManager,Dt as DepthFormat,Ht as DepthStencilFormat,$a as DepthTexture,ot as DetachedBindMode,Cc as DirectionalLight,sd as DirectionalLightHelper,Dl as DiscreteInterpolant,zh as DodecahedronGeometry,p as DoubleSide,k as DstAlphaFactor,P as DstColorFactor,ks as DynamicCopyUsage,As as DynamicDrawUsage,Cs as DynamicReadUsage,kh as EdgesGeometry,Ka as EllipseCurve,xs as EqualCompare,H as EqualDepth,cs as EqualStencilFunc,ct as EquirectangularReflectionMapping,ut as EquirectangularRefractionMapping,yr as Euler,Ns as EventDispatcher,al as ExtrudeGeometry,oc as FileLoader,xn as Float16BufferAttribute,bn as Float32BufferAttribute,Et as FloatType,io as Fog,so as FogExp2,Ja as FramebufferTexture,u as FrontSide,ra as Frustum,zu as GLBufferAttribute,Ps as GLSL1,Rs as GLSL3,vs as GreaterCompare,J as GreaterDepth,Ms as GreaterEqualCompare,q as GreaterEqualDepth,ms as GreaterEqualStencilFunc,ds as GreaterStencilFunc,$u as GridHelper,Ha as Group,Pt as HalfFloatType,mc as HemisphereLight,Gu as HemisphereLightHelper,ll as IcosahedronGeometry,Uc as ImageBitmapLoader,lc as ImageLoader,yi as ImageUtils,is as IncrementStencilOp,ns as IncrementWrapStencilOp,Do as InstancedBufferAttribute,Oc as InstancedBufferGeometry,Au as InstancedInterleavedBuffer,$o as InstancedMesh,mn as Int16BufferAttribute,fn as Int32BufferAttribute,un as Int8BufferAttribute,Bt as IntType,no as InterleavedBuffer,ao as InterleavedBufferAttribute,Wl as Interpolant,Ee as InterpolateDiscrete,Pe as InterpolateLinear,Re as InterpolateSmooth,as as InvertStencilOp,es as KeepStencilOp,Hl as KeyframeTrack,To as LOD,vh as LatheGeometry,fr as Layers,gs as LessCompare,j as LessDepth,bs as LessEqualCompare,D as LessEqualDepth,us as LessEqualStencilFunc,ls as LessStencilFunc,pc as Light,Ec as LightProbe,ka as Line,Lu as Line3,Sa as LineBasicMaterial,dh as LineCurve,ph as LineCurve3,Pl as LineDashedMaterial,Fa as LineLoop,Oa as LineSegments,wt as LinearFilter,jl as LinearInterpolant,At as LinearMipMapLinearFilter,St as LinearMipMapNearestFilter,_t as LinearMipmapLinearFilter,Mt as LinearMipmapNearestFilter,$e as LinearSRGBColorSpace,Q as LinearToneMapping,Qe as LinearTransfer,ic as Loader,Rc as LoaderUtils,ec as LoadingManager,Ie as LoopOnce,ke as LoopPingPong,Be as LoopRepeat,jt as LuminanceAlphaFormat,Ut as LuminanceFormat,e as MOUSE,tn as Material,Pc as MaterialLoader,Ys as MathUtils,Pu as Matrix2,Gs as Matrix3,nr as Matrix4,_ as MaxEquation,Vn as Mesh,en as MeshBasicMaterial,Bl as MeshDepthMaterial,kl as MeshDistanceMaterial,Il as MeshLambertMaterial,El as MeshMatcapMaterial,Cl as MeshNormalMaterial,zl as MeshPhongMaterial,Al as MeshPhysicalMaterial,_l as MeshStandardMaterial,Tl as MeshToonMaterial,S as MinEquation,yt as MirroredRepeatWrapping,Z as MixOperation,x as MultiplyBlending,Y as MultiplyOperation,ft as NearestFilter,vt as NearestMipMapLinearFilter,xt as NearestMipMapNearestFilter,bt as NearestMipmapLinearFilter,gt as NearestMipmapNearestFilter,rt as NeutralToneMapping,fs as NeverCompare,W as NeverDepth,hs as NeverStencilFunc,m as NoBlending,Ze as NoColorSpace,$ as NoToneMapping,Le as NormalAnimationBlendMode,y as NormalBlending,ws as NotEqualCompare,X as NotEqualDepth,ps as NotEqualStencilFunc,Xl as NumberKeyframeTrack,Er as Object3D,Nc as ObjectLoader,Ye as ObjectSpaceNormalMap,cl as OctahedronGeometry,z as OneFactor,V as OneMinusConstantAlphaFactor,N as OneMinusConstantColorFactor,E as OneMinusDstAlphaFactor,R as OneMinusDstColorFactor,B as OneMinusSrcAlphaFactor,C as OneMinusSrcColorFactor,zc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,bh as Path,$n as PerspectiveCamera,ea as Plane,ul as PlaneGeometry,cd as PlaneHelper,Ac as PointLight,Ju as PointLightHelper,ja as Points,Na as PointsMaterial,Qu as PolarGridHelper,Ah as PolyhedronGeometry,hu as PositionalAudio,gu as PropertyBinding,cu as PropertyMixer,mh as QuadraticBezierCurve,yh as QuadraticBezierCurve3,Ci as Quaternion,Zl as QuaternionKeyframeTrack,Yl as QuaternionLinearInterpolant,Us as RAD2DEG,Te as RED_GREEN_RGTC2_Format,Ae as RED_RGTC1_Format,t as REVISION,He as RGBADepthPacking,Wt as RGBAFormat,Gt as RGBAIntegerFormat,be as RGBA_ASTC_10x10_Format,fe as RGBA_ASTC_10x5_Format,ge as RGBA_ASTC_10x6_Format,xe as RGBA_ASTC_10x8_Format,ve as RGBA_ASTC_12x10_Format,we as RGBA_ASTC_12x12_Format,he as RGBA_ASTC_4x4_Format,le as RGBA_ASTC_5x4_Format,ce as RGBA_ASTC_5x5_Format,ue as RGBA_ASTC_6x5_Format,de as RGBA_ASTC_6x6_Format,pe as RGBA_ASTC_8x5_Format,me as RGBA_ASTC_8x6_Format,ye as RGBA_ASTC_8x8_Format,Me as RGBA_BPTC_Format,ae as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,ie as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,qe as RGBDepthPacking,Vt as RGBFormat,Zt as RGBIntegerFormat,Se as RGB_BPTC_SIGNED_Format,_e as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,oe as RGB_ETC2_Format,se as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Je as RGDepthPacking,Xt as RGFormat,Yt as RGIntegerFormat,Sl as RawShaderMaterial,rr as Ray,Cu as Raycaster,Bc as RectAreaLight,qt as RedFormat,Jt as RedIntegerFormat,K as ReinhardToneMapping,Mi as RenderTarget,pt as RepeatWrapping,ss as ReplaceStencilOp,M as ReverseSubtractEquation,dl as RingGeometry,Ce as SIGNED_RED_GREEN_RGTC2_Format,ze as SIGNED_RED_RGTC1_Format,Ge as SRGBColorSpace,Ke as SRGBTransfer,ro as Scene,Jn as ShaderMaterial,Ml as ShadowMaterial,Eh as Shape,pl as ShapeGeometry,fd as ShapePath,rl as ShapeUtils,Ct as ShortType,jo as Skeleton,Hu as SkeletonHelper,No as SkinnedMesh,gi as Source,Gi as Sphere,ml as SphereGeometry,ku as Spherical,kc as SphericalHarmonics3,fh as SplineCurve,vc as SpotLight,Wu as SpotLightHelper,So as Sprite,ho as SpriteMaterial,I as SrcAlphaFactor,O as SrcAlphaSaturateFactor,T as SrcColorFactor,Bs as StaticCopyUsage,_s as StaticDrawUsage,Ts as StaticReadUsage,Yc as StereoCamera,Es as StreamCopyUsage,zs as StreamDrawUsage,Is as StreamReadUsage,Gl as StringKeyframeTrack,w as SubtractEquation,g as SubtractiveBlending,s as TOUCH,Xe as TangentSpaceNormalMap,yl as TetrahedronGeometry,vi as Texture,dc as TextureLoader,bd as TextureUtils,fl as TorusGeometry,gl as TorusKnotGeometry,Jr as Triangle,je as TriangleFanDrawMode,Ue as TriangleStripDrawMode,We as TrianglesDrawMode,xl as TubeGeometry,at as UVMapping,yn as Uint16BufferAttribute,gn as Uint32BufferAttribute,dn as Uint8BufferAttribute,pn as Uint8ClampedBufferAttribute,Mu as Uniform,_u as UniformsGroup,qn as UniformsUtils,zt as UnsignedByteType,Ft as UnsignedInt248Type,Nt as UnsignedInt5999Type,kt as UnsignedIntType,Rt as UnsignedShort4444Type,Ot as UnsignedShort5551Type,It as UnsignedShortType,c as VSMShadowMap,Zs as Vector2,Ii as Vector3,wi as Vector4,$l as VectorKeyframeTrack,qa as VideoTexture,Ti as WebGL3DRenderTarget,Ai as WebGLArrayRenderTarget,Os as WebGLCoordinateSystem,eo as WebGLCubeRenderTarget,Si as WebGLRenderTarget,Fs as WebGPUCoordinateSystem,bl as WireframeGeometry,Ne as WrapAroundEnding,Oe as ZeroCurvatureEnding,A as ZeroFactor,Fe as ZeroSlopeEnding,ts as ZeroStencilOp,Qs as arrayNeedsUint32,jn as cloneUniforms,si as createCanvasElement,ei as createElementNS,xd as getByteLength,Hn as getUnlitUniformColorSpace,Dn as mergeUniforms,ni as probeAsync,oi as toNormalizedProjectionMatrix,ai as toReversedProjectionMatrix,ri as warnOnce}; +const t="172dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},s={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},i=0,r=1,n=2,o=3,a=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,f=2,g=3,x=4,b=5,v=100,w=101,M=102,S=103,_=104,A=200,T=201,z=202,C=203,I=204,B=205,k=206,E=207,P=208,R=209,O=210,F=211,N=212,L=213,V=214,W=0,j=1,U=2,D=3,H=4,q=5,J=6,X=7,Y=0,Z=1,G=2,$=0,Q=1,K=2,tt=3,et=4,st=5,it=6,rt=7,nt="attached",ot="detached",at=300,ht=301,lt=302,ct=303,ut=304,dt=306,pt=1e3,mt=1001,yt=1002,ft=1003,gt=1004,xt=1004,bt=1005,vt=1005,wt=1006,Mt=1007,St=1007,_t=1008,At=1008,Tt=1009,zt=1010,Ct=1011,It=1012,Bt=1013,kt=1014,Et=1015,Pt=1016,Rt=1017,Ot=1018,Ft=1020,Nt=35902,Lt=1021,Vt=1022,Wt=1023,jt=1024,Ut=1025,Dt=1026,Ht=1027,qt=1028,Jt=1029,Xt=1030,Yt=1031,Zt=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,se=35841,ie=35842,re=35843,ne=36196,oe=37492,ae=37496,he=37808,le=37809,ce=37810,ue=37811,de=37812,pe=37813,me=37814,ye=37815,fe=37816,ge=37817,xe=37818,be=37819,ve=37820,we=37821,Me=36492,Se=36494,_e=36495,Ae=36283,Te=36284,ze=36285,Ce=36286,Ie=2200,Be=2201,ke=2202,Ee=2300,Pe=2301,Re=2302,Oe=2400,Fe=2401,Ne=2402,Le=2500,Ve=2501,We=0,je=1,Ue=2,De=3200,He=3201,qe=3202,Je=3203,Xe=0,Ye=1,Ze="",Ge="srgb",$e="srgb-linear",Qe="linear",Ke="srgb",ts=0,es=7680,ss=7681,is=7682,rs=7683,ns=34055,os=34056,as=5386,hs=512,ls=513,cs=514,us=515,ds=516,ps=517,ms=518,ys=519,fs=512,gs=513,xs=514,bs=515,vs=516,ws=517,Ms=518,Ss=519,_s=35044,As=35048,Ts=35040,zs=35045,Cs=35049,Is=35041,Bs=35046,ks=35050,Es=35042,Ps="100",Rs="300 es",Os=2e3,Fs=2001;class Ns{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const s=this._listeners;void 0===s[t]&&(s[t]=[]),-1===s[t].indexOf(e)&&s[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const s=this._listeners;return void 0!==s[t]&&-1!==s[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const s=this._listeners[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const s=e.slice(0);for(let e=0,i=s.length;e>8&255]+Ls[t>>16&255]+Ls[t>>24&255]+"-"+Ls[255&e]+Ls[e>>8&255]+"-"+Ls[e>>16&15|64]+Ls[e>>24&255]+"-"+Ls[63&s|128]+Ls[s>>8&255]+"-"+Ls[s>>16&255]+Ls[s>>24&255]+Ls[255&i]+Ls[i>>8&255]+Ls[i>>16&255]+Ls[i>>24&255]).toLowerCase()}function Ds(t,e,s){return Math.max(e,Math.min(s,t))}function Hs(t,e){return(t%e+e)%e}function qs(t,e,s){return(1-s)*t+s*e}function Js(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function Xs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const Ys={DEG2RAD:Ws,RAD2DEG:js,generateUUID:Us,clamp:Ds,euclideanModulo:Hs,mapLinear:function(t,e,s,i,r){return i+(t-e)*(r-i)/(s-e)},inverseLerp:function(t,e,s){return t!==e?(s-t)/(e-t):0},lerp:qs,damp:function(t,e,s,i){return qs(t,e,1-Math.exp(-s*i))},pingpong:function(t,e=1){return e-Math.abs(Hs(t,2*e)-e)},smoothstep:function(t,e,s){return t<=e?0:t>=s?1:(t=(t-e)/(s-e))*t*(3-2*t)},smootherstep:function(t,e,s){return t<=e?0:t>=s?1:(t=(t-e)/(s-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(Vs=t);let e=Vs+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*Ws},radToDeg:function(t){return t*js},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,s,i,r){const n=Math.cos,o=Math.sin,a=n(s/2),h=o(s/2),l=n((e+i)/2),c=o((e+i)/2),u=n((e-i)/2),d=o((e-i)/2),p=n((i-e)/2),m=o((i-e)/2);switch(r){case"XYX":t.set(a*c,h*u,h*d,a*l);break;case"YZY":t.set(h*d,a*c,h*u,a*l);break;case"ZXZ":t.set(h*u,h*d,a*c,a*l);break;case"XZX":t.set(a*c,h*m,h*p,a*l);break;case"YXY":t.set(h*p,a*c,h*m,a*l);break;case"ZYZ":t.set(h*m,h*p,a*c,a*l);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:Xs,denormalize:Js};class Zs{constructor(t=0,e=0){Zs.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,s=this.y,i=t.elements;return this.x=i[0]*e+i[3]*s+i[6],this.y=i[1]*e+i[4]*s+i[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Ds(this.x,t.x,e.x),this.y=Ds(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Ds(this.x,t,e),this.y=Ds(this.y,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(Ds(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(Ds(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y;return e*e+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const s=Math.cos(e),i=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*s-n*i+t.x,this.y=r*i+n*s+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Gs{constructor(t,e,s,i,r,n,o,a,h){Gs.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,o,a,h)}set(t,e,s,i,r,n,o,a,h){const l=this.elements;return l[0]=t,l[1]=i,l[2]=o,l[3]=e,l[4]=r,l[5]=a,l[6]=s,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],this}extractBasis(t,e,s){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),s.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],o=s[3],a=s[6],h=s[1],l=s[4],c=s[7],u=s[2],d=s[5],p=s[8],m=i[0],y=i[3],f=i[6],g=i[1],x=i[4],b=i[7],v=i[2],w=i[5],M=i[8];return r[0]=n*m+o*g+a*v,r[3]=n*y+o*x+a*w,r[6]=n*f+o*b+a*M,r[1]=h*m+l*g+c*v,r[4]=h*y+l*x+c*w,r[7]=h*f+l*b+c*M,r[2]=u*m+d*g+p*v,r[5]=u*y+d*x+p*w,r[8]=u*f+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8];return e*n*l-e*o*h-s*r*l+s*o*a+i*r*h-i*n*a}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=l*n-o*h,u=o*a-l*r,d=h*r-n*a,p=e*c+s*u+i*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(i*h-l*s)*m,t[2]=(o*s-i*n)*m,t[3]=u*m,t[4]=(l*e-i*a)*m,t[5]=(i*r-o*e)*m,t[6]=d*m,t[7]=(s*a-h*e)*m,t[8]=(n*e-s*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,s,i,r,n,o){const a=Math.cos(r),h=Math.sin(r);return this.set(s*a,s*h,-s*(a*n+h*o)+n+t,-i*h,i*a,-i*(-h*n+a*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply($s.makeScale(t,e)),this}rotate(t){return this.premultiply($s.makeRotation(-t)),this}translate(t,e){return this.premultiply($s.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,s,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<9;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<9;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const $s=new Gs;function Qs(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Ks={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function ti(t,e){return new Ks[t](e)}function ei(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function si(){const t=ei("canvas");return t.style.display="block",t}const ii={};function ri(t){t in ii||(ii[t]=!0,console.warn(t))}function ni(t,e,s){return new Promise((function(i,r){setTimeout((function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,s);break;default:i()}}),s)}))}function oi(t){const e=t.elements;e[2]=.5*e[2]+.5*e[3],e[6]=.5*e[6]+.5*e[7],e[10]=.5*e[10]+.5*e[11],e[14]=.5*e[14]+.5*e[15]}function ai(t){const e=t.elements;-1===e[11]?(e[10]=-e[10]-1,e[14]=-e[14]):(e[10]=-e[10],e[14]=1-e[14])}const hi=(new Gs).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),li=(new Gs).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function ci(){const t={enabled:!0,workingColorSpace:$e,spaces:{},convert:function(t,e,s){return!1!==this.enabled&&e!==s&&e&&s?(this.spaces[e].transfer===Ke&&(t.r=di(t.r),t.g=di(t.g),t.b=di(t.b)),this.spaces[e].primaries!==this.spaces[s].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[s].fromXYZ)),this.spaces[s].transfer===Ke&&(t.r=pi(t.r),t.g=pi(t.g),t.b=pi(t.b)),t):t},fromWorkingColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},toWorkingColorSpace:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?Qe:this.spaces[t].transfer},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,s){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[s].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace}},e=[.64,.33,.3,.6,.15,.06],s=[.2126,.7152,.0722],i=[.3127,.329];return t.define({[$e]:{primaries:e,whitePoint:i,transfer:Qe,toXYZ:hi,fromXYZ:li,luminanceCoefficients:s,workingColorSpaceConfig:{unpackColorSpace:Ge},outputColorSpaceConfig:{drawingBufferColorSpace:Ge}},[Ge]:{primaries:e,whitePoint:i,transfer:Ke,toXYZ:hi,fromXYZ:li,luminanceCoefficients:s,outputColorSpaceConfig:{drawingBufferColorSpace:Ge}}}),t}const ui=ci();function di(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function pi(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let mi;class yi{static getDataURL(t){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{void 0===mi&&(mi=ei("canvas")),mi.width=t.width,mi.height=t.height;const s=mi.getContext("2d");t instanceof ImageData?s.putImageData(t,0,0):s.drawImage(t,0,0,t.width,t.height),e=mi}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=ei("canvas");e.width=t.width,e.height=t.height;const s=e.getContext("2d");s.drawImage(t,0,0,t.width,t.height);const i=s.getImageData(0,0,t.width,t.height),r=i.data;for(let t=0;t0&&(s.userData=this.userData),e||(t.textures[this.uuid]=s),s}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==at)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case pt:t.x=t.x-Math.floor(t.x);break;case mt:t.x=t.x<0?0:1;break;case yt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case pt:t.y=t.y-Math.floor(t.y);break;case mt:t.y=t.y<0?0:1;break;case yt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}vi.DEFAULT_IMAGE=null,vi.DEFAULT_MAPPING=at,vi.DEFAULT_ANISOTROPY=1;class wi{constructor(t=0,e=0,s=0,i=1){wi.prototype.isVector4=!0,this.x=t,this.y=e,this.z=s,this.w=i}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,s,i){return this.x=t,this.y=e,this.z=s,this.w=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*s+n[8]*i+n[12]*r,this.y=n[1]*e+n[5]*s+n[9]*i+n[13]*r,this.z=n[2]*e+n[6]*s+n[10]*i+n[14]*r,this.w=n[3]*e+n[7]*s+n[11]*i+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,s,i,r;const n=.01,o=.1,a=t.elements,h=a[0],l=a[4],c=a[8],u=a[1],d=a[5],p=a[9],m=a[2],y=a[6],f=a[10];if(Math.abs(l-u)a&&t>g?tg?a=0?1:-1,i=1-e*e;if(i>Number.EPSILON){const r=Math.sqrt(i),n=Math.atan2(r,e*s);t=Math.sin(t*n)/r,o=Math.sin(o*n)/r}const r=o*s;if(a=a*t+u*r,h=h*t+d*r,l=l*t+p*r,c=c*t+m*r,t===1-o){const t=1/Math.sqrt(a*a+h*h+l*l+c*c);a*=t,h*=t,l*=t,c*=t}}t[e]=a,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,s,i,r,n){const o=s[i],a=s[i+1],h=s[i+2],l=s[i+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=o*p+l*c+a*d-h*u,t[e+1]=a*p+l*u+h*c-o*d,t[e+2]=h*p+l*d+o*u-a*c,t[e+3]=l*p-o*c-a*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,s,i){return this._x=t,this._y=e,this._z=s,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const s=t._x,i=t._y,r=t._z,n=t._order,o=Math.cos,a=Math.sin,h=o(s/2),l=o(i/2),c=o(r/2),u=a(s/2),d=a(i/2),p=a(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const s=e/2,i=Math.sin(s);return this._x=t.x*i,this._y=t.y*i,this._z=t.z*i,this._w=Math.cos(s),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,s=e[0],i=e[4],r=e[8],n=e[1],o=e[5],a=e[9],h=e[2],l=e[6],c=e[10],u=s+o+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-a)*t,this._y=(r-h)*t,this._z=(n-i)*t}else if(s>o&&s>c){const t=2*Math.sqrt(1+s-o-c);this._w=(l-a)/t,this._x=.25*t,this._y=(i+n)/t,this._z=(r+h)/t}else if(o>c){const t=2*Math.sqrt(1+o-s-c);this._w=(r-h)/t,this._x=(i+n)/t,this._y=.25*t,this._z=(a+l)/t}else{const t=2*Math.sqrt(1+c-s-o);this._w=(n-i)/t,this._x=(r+h)/t,this._y=(a+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let s=t.dot(e)+1;return sMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=s):(this._x=0,this._y=-t.z,this._z=t.y,this._w=s)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=s),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Ds(this.dot(t),-1,1)))}rotateTowards(t,e){const s=this.angleTo(t);if(0===s)return this;const i=Math.min(1,e/s);return this.slerp(t,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const s=t._x,i=t._y,r=t._z,n=t._w,o=e._x,a=e._y,h=e._z,l=e._w;return this._x=s*l+n*o+i*h-r*a,this._y=i*l+n*a+r*o-s*h,this._z=r*l+n*h+s*a-i*o,this._w=n*l-s*o-i*a-r*h,this._onChangeCallback(),this}slerp(t,e){if(0===e)return this;if(1===e)return this.copy(t);const s=this._x,i=this._y,r=this._z,n=this._w;let o=n*t._w+s*t._x+i*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=n,this._x=s,this._y=i,this._z=r,this;const a=1-o*o;if(a<=Number.EPSILON){const t=1-e;return this._w=t*n+e*this._w,this._x=t*s+e*this._x,this._y=t*i+e*this._y,this._z=t*r+e*this._z,this.normalize(),this}const h=Math.sqrt(a),l=Math.atan2(h,o),c=Math.sin((1-e)*l)/h,u=Math.sin(e*l)/h;return this._w=n*c+this._w*u,this._x=s*c+this._x*u,this._y=i*c+this._y*u,this._z=r*c+this._z*u,this._onChangeCallback(),this}slerpQuaternions(t,e,s){return this.copy(t).slerp(e,s)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),s=Math.random(),i=Math.sqrt(1-s),r=Math.sqrt(s);return this.set(i*Math.sin(t),i*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ii{constructor(t=0,e=0,s=0){Ii.prototype.isVector3=!0,this.x=t,this.y=e,this.z=s}set(t,e,s){return void 0===s&&(s=this.z),this.x=t,this.y=e,this.z=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(ki.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(ki.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[3]*s+r[6]*i,this.y=r[1]*e+r[4]*s+r[7]*i,this.z=r[2]*e+r[5]*s+r[8]*i,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,s=this.y,i=this.z,r=t.elements,n=1/(r[3]*e+r[7]*s+r[11]*i+r[15]);return this.x=(r[0]*e+r[4]*s+r[8]*i+r[12])*n,this.y=(r[1]*e+r[5]*s+r[9]*i+r[13])*n,this.z=(r[2]*e+r[6]*s+r[10]*i+r[14])*n,this}applyQuaternion(t){const e=this.x,s=this.y,i=this.z,r=t.x,n=t.y,o=t.z,a=t.w,h=2*(n*i-o*s),l=2*(o*e-r*i),c=2*(r*s-n*e);return this.x=e+a*h+n*c-o*l,this.y=s+a*l+o*h-r*c,this.z=i+a*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,s=this.y,i=this.z,r=t.elements;return this.x=r[0]*e+r[4]*s+r[8]*i,this.y=r[1]*e+r[5]*s+r[9]*i,this.z=r[2]*e+r[6]*s+r[10]*i,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Ds(this.x,t.x,e.x),this.y=Ds(this.y,t.y,e.y),this.z=Ds(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Ds(this.x,t,e),this.y=Ds(this.y,t,e),this.z=Ds(this.z,t,e),this}clampLength(t,e){const s=this.length();return this.divideScalar(s||1).multiplyScalar(Ds(s,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,s){return this.x=t.x+(e.x-t.x)*s,this.y=t.y+(e.y-t.y)*s,this.z=t.z+(e.z-t.z)*s,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const s=t.x,i=t.y,r=t.z,n=e.x,o=e.y,a=e.z;return this.x=i*a-r*o,this.y=r*n-s*a,this.z=s*o-i*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const s=t.dot(this)/e;return this.copy(t).multiplyScalar(s)}projectOnPlane(t){return Bi.copy(this).projectOnVector(t),this.sub(Bi)}reflect(t){return this.sub(Bi.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const s=this.dot(t)/e;return Math.acos(Ds(s,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,s=this.y-t.y,i=this.z-t.z;return e*e+s*s+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,s){const i=Math.sin(e)*t;return this.x=i*Math.sin(s),this.y=Math.cos(e)*t,this.z=i*Math.cos(s),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,s){return this.x=t*Math.sin(e),this.y=s,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),s=this.setFromMatrixColumn(t,1).length(),i=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=s,this.z=i,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,s=Math.sqrt(1-e*e);return this.x=s*Math.cos(t),this.y=e,this.z=s*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Bi=new Ii,ki=new Ci;class Ei{constructor(t=new Ii(1/0,1/0,1/0),e=new Ii(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,s=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,Ri),Ri.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,s;return t.normal.x>0?(e=t.normal.x*this.min.x,s=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,s=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,s+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,s+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,s+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,s+=t.normal.z*this.min.z),e<=-t.constant&&s>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(Ui),Di.subVectors(this.max,Ui),Fi.subVectors(t.a,Ui),Ni.subVectors(t.b,Ui),Li.subVectors(t.c,Ui),Vi.subVectors(Ni,Fi),Wi.subVectors(Li,Ni),ji.subVectors(Fi,Li);let e=[0,-Vi.z,Vi.y,0,-Wi.z,Wi.y,0,-ji.z,ji.y,Vi.z,0,-Vi.x,Wi.z,0,-Wi.x,ji.z,0,-ji.x,-Vi.y,Vi.x,0,-Wi.y,Wi.x,0,-ji.y,ji.x,0];return!!Ji(e,Fi,Ni,Li,Di)&&(e=[1,0,0,0,1,0,0,0,1],!!Ji(e,Fi,Ni,Li,Di)&&(Hi.crossVectors(Vi,Wi),e=[Hi.x,Hi.y,Hi.z],Ji(e,Fi,Ni,Li,Di)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Ri).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize(Ri).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Pi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Pi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Pi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Pi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Pi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Pi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Pi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Pi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Pi)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Pi=[new Ii,new Ii,new Ii,new Ii,new Ii,new Ii,new Ii,new Ii],Ri=new Ii,Oi=new Ei,Fi=new Ii,Ni=new Ii,Li=new Ii,Vi=new Ii,Wi=new Ii,ji=new Ii,Ui=new Ii,Di=new Ii,Hi=new Ii,qi=new Ii;function Ji(t,e,s,i,r){for(let n=0,o=t.length-3;n<=o;n+=3){qi.fromArray(t,n);const o=r.x*Math.abs(qi.x)+r.y*Math.abs(qi.y)+r.z*Math.abs(qi.z),a=e.dot(qi),h=s.dot(qi),l=i.dot(qi);if(Math.max(-Math.max(a,h,l),Math.min(a,h,l))>o)return!1}return!0}const Xi=new Ei,Yi=new Ii,Zi=new Ii;class Gi{constructor(t=new Ii,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const s=this.center;void 0!==e?s.copy(e):Xi.setFromPoints(t).getCenter(s);let i=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Yi.subVectors(t,this.center);const e=Yi.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),s=.5*(t-this.radius);this.center.addScaledVector(Yi,s/t),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(Zi.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Yi.copy(t.center).add(Zi)),this.expandByPoint(Yi.copy(t.center).sub(Zi))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const $i=new Ii,Qi=new Ii,Ki=new Ii,tr=new Ii,er=new Ii,sr=new Ii,ir=new Ii;class rr{constructor(t=new Ii,e=new Ii(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,$i)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const s=e.dot(this.direction);return s<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,s)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=$i.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):($i.copy(this.origin).addScaledVector(this.direction,e),$i.distanceToSquared(t))}distanceSqToSegment(t,e,s,i){Qi.copy(t).add(e).multiplyScalar(.5),Ki.copy(e).sub(t).normalize(),tr.copy(this.origin).sub(Qi);const r=.5*t.distanceTo(e),n=-this.direction.dot(Ki),o=tr.dot(this.direction),a=-tr.dot(Ki),h=tr.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*a-o,u=n*o-a,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*o)+u*(n*c+u+2*a)+h}else u=r,c=Math.max(0,-(n*u+o)),d=-c*c+u*(u+2*a)+h;else u=-r,c=Math.max(0,-(n*u+o)),d=-c*c+u*(u+2*a)+h;else u<=-p?(c=Math.max(0,-(-n*r+o)),u=c>0?-r:Math.min(Math.max(-r,-a),r),d=-c*c+u*(u+2*a)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-a),r),d=u*(u+2*a)+h):(c=Math.max(0,-(n*r+o)),u=c>0?r:Math.min(Math.max(-r,-a),r),d=-c*c+u*(u+2*a)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+o)),d=-c*c+u*(u+2*a)+h;return s&&s.copy(this.origin).addScaledVector(this.direction,c),i&&i.copy(Qi).addScaledVector(Ki,u),d}intersectSphere(t,e){$i.subVectors(t.center,this.origin);const s=$i.dot(this.direction),i=$i.dot($i)-s*s,r=t.radius*t.radius;if(i>r)return null;const n=Math.sqrt(r-i),o=s-n,a=s+n;return a<0?null:o<0?this.at(a,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const s=-(this.origin.dot(t.normal)+t.constant)/e;return s>=0?s:null}intersectPlane(t,e){const s=this.distanceToPlane(t);return null===s?null:this.at(s,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let s,i,r,n,o,a;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(s=(t.min.x-u.x)*h,i=(t.max.x-u.x)*h):(s=(t.max.x-u.x)*h,i=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),s>n||r>i?null:((r>s||isNaN(s))&&(s=r),(n=0?(o=(t.min.z-u.z)*c,a=(t.max.z-u.z)*c):(o=(t.max.z-u.z)*c,a=(t.min.z-u.z)*c),s>a||o>i?null:((o>s||s!=s)&&(s=o),(a=0?s:i,e)))}intersectsBox(t){return null!==this.intersectBox(t,$i)}intersectTriangle(t,e,s,i,r){er.subVectors(e,t),sr.subVectors(s,t),ir.crossVectors(er,sr);let n,o=this.direction.dot(ir);if(o>0){if(i)return null;n=1}else{if(!(o<0))return null;n=-1,o=-o}tr.subVectors(this.origin,t);const a=n*this.direction.dot(sr.crossVectors(tr,sr));if(a<0)return null;const h=n*this.direction.dot(er.cross(tr));if(h<0)return null;if(a+h>o)return null;const l=-n*tr.dot(ir);return l<0?null:this.at(l/o,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class nr{constructor(t,e,s,i,r,n,o,a,h,l,c,u,d,p,m,y){nr.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,s,i,r,n,o,a,h,l,c,u,d,p,m,y)}set(t,e,s,i,r,n,o,a,h,l,c,u,d,p,m,y){const f=this.elements;return f[0]=t,f[4]=e,f[8]=s,f[12]=i,f[1]=r,f[5]=n,f[9]=o,f[13]=a,f[2]=h,f[6]=l,f[10]=c,f[14]=u,f[3]=d,f[7]=p,f[11]=m,f[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new nr).fromArray(this.elements)}copy(t){const e=this.elements,s=t.elements;return e[0]=s[0],e[1]=s[1],e[2]=s[2],e[3]=s[3],e[4]=s[4],e[5]=s[5],e[6]=s[6],e[7]=s[7],e[8]=s[8],e[9]=s[9],e[10]=s[10],e[11]=s[11],e[12]=s[12],e[13]=s[13],e[14]=s[14],e[15]=s[15],this}copyPosition(t){const e=this.elements,s=t.elements;return e[12]=s[12],e[13]=s[13],e[14]=s[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,s){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),s.setFromMatrixColumn(this,2),this}makeBasis(t,e,s){return this.set(t.x,e.x,s.x,0,t.y,e.y,s.y,0,t.z,e.z,s.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,s=t.elements,i=1/or.setFromMatrixColumn(t,0).length(),r=1/or.setFromMatrixColumn(t,1).length(),n=1/or.setFromMatrixColumn(t,2).length();return e[0]=s[0]*i,e[1]=s[1]*i,e[2]=s[2]*i,e[3]=0,e[4]=s[4]*r,e[5]=s[5]*r,e[6]=s[6]*r,e[7]=0,e[8]=s[8]*n,e[9]=s[9]*n,e[10]=s[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,s=t.x,i=t.y,r=t.z,n=Math.cos(s),o=Math.sin(s),a=Math.cos(i),h=Math.sin(i),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,s=n*c,i=o*l,r=o*c;e[0]=a*l,e[4]=-a*c,e[8]=h,e[1]=s+i*h,e[5]=t-r*h,e[9]=-o*a,e[2]=r-t*h,e[6]=i+s*h,e[10]=n*a}else if("YXZ"===t.order){const t=a*l,s=a*c,i=h*l,r=h*c;e[0]=t+r*o,e[4]=i*o-s,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-o,e[2]=s*o-i,e[6]=r+t*o,e[10]=n*a}else if("ZXY"===t.order){const t=a*l,s=a*c,i=h*l,r=h*c;e[0]=t-r*o,e[4]=-n*c,e[8]=i+s*o,e[1]=s+i*o,e[5]=n*l,e[9]=r-t*o,e[2]=-n*h,e[6]=o,e[10]=n*a}else if("ZYX"===t.order){const t=n*l,s=n*c,i=o*l,r=o*c;e[0]=a*l,e[4]=i*h-s,e[8]=t*h+r,e[1]=a*c,e[5]=r*h+t,e[9]=s*h-i,e[2]=-h,e[6]=o*a,e[10]=n*a}else if("YZX"===t.order){const t=n*a,s=n*h,i=o*a,r=o*h;e[0]=a*l,e[4]=r-t*c,e[8]=i*c+s,e[1]=c,e[5]=n*l,e[9]=-o*l,e[2]=-h*l,e[6]=s*c+i,e[10]=t-r*c}else if("XZY"===t.order){const t=n*a,s=n*h,i=o*a,r=o*h;e[0]=a*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=s*c-i,e[2]=i*c-s,e[6]=o*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(hr,t,lr)}lookAt(t,e,s){const i=this.elements;return dr.subVectors(t,e),0===dr.lengthSq()&&(dr.z=1),dr.normalize(),cr.crossVectors(s,dr),0===cr.lengthSq()&&(1===Math.abs(s.z)?dr.x+=1e-4:dr.z+=1e-4,dr.normalize(),cr.crossVectors(s,dr)),cr.normalize(),ur.crossVectors(dr,cr),i[0]=cr.x,i[4]=ur.x,i[8]=dr.x,i[1]=cr.y,i[5]=ur.y,i[9]=dr.y,i[2]=cr.z,i[6]=ur.z,i[10]=dr.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const s=t.elements,i=e.elements,r=this.elements,n=s[0],o=s[4],a=s[8],h=s[12],l=s[1],c=s[5],u=s[9],d=s[13],p=s[2],m=s[6],y=s[10],f=s[14],g=s[3],x=s[7],b=s[11],v=s[15],w=i[0],M=i[4],S=i[8],_=i[12],A=i[1],T=i[5],z=i[9],C=i[13],I=i[2],B=i[6],k=i[10],E=i[14],P=i[3],R=i[7],O=i[11],F=i[15];return r[0]=n*w+o*A+a*I+h*P,r[4]=n*M+o*T+a*B+h*R,r[8]=n*S+o*z+a*k+h*O,r[12]=n*_+o*C+a*E+h*F,r[1]=l*w+c*A+u*I+d*P,r[5]=l*M+c*T+u*B+d*R,r[9]=l*S+c*z+u*k+d*O,r[13]=l*_+c*C+u*E+d*F,r[2]=p*w+m*A+y*I+f*P,r[6]=p*M+m*T+y*B+f*R,r[10]=p*S+m*z+y*k+f*O,r[14]=p*_+m*C+y*E+f*F,r[3]=g*w+x*A+b*I+v*P,r[7]=g*M+x*T+b*B+v*R,r[11]=g*S+x*z+b*k+v*O,r[15]=g*_+x*C+b*E+v*F,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],s=t[4],i=t[8],r=t[12],n=t[1],o=t[5],a=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14];return t[3]*(+r*a*c-i*h*c-r*o*u+s*h*u+i*o*d-s*a*d)+t[7]*(+e*a*d-e*h*u+r*n*u-i*n*d+i*h*l-r*a*l)+t[11]*(+e*h*c-e*o*d-r*n*c+s*n*d+r*o*l-s*h*l)+t[15]*(-i*o*l-e*a*c+e*o*u+i*n*c-s*n*u+s*a*l)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,s){const i=this.elements;return t.isVector3?(i[12]=t.x,i[13]=t.y,i[14]=t.z):(i[12]=t,i[13]=e,i[14]=s),this}invert(){const t=this.elements,e=t[0],s=t[1],i=t[2],r=t[3],n=t[4],o=t[5],a=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],f=t[15],g=c*y*h-m*u*h+m*a*d-o*y*d-c*a*f+o*u*f,x=p*u*h-l*y*h-p*a*d+n*y*d+l*a*f-n*u*f,b=l*m*h-p*c*h+p*o*d-n*m*d-l*o*f+n*c*f,v=p*c*a-l*m*a-p*o*u+n*m*u+l*o*y-n*c*y,w=e*g+s*x+i*b+r*v;if(0===w)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const M=1/w;return t[0]=g*M,t[1]=(m*u*r-c*y*r-m*i*d+s*y*d+c*i*f-s*u*f)*M,t[2]=(o*y*r-m*a*r+m*i*h-s*y*h-o*i*f+s*a*f)*M,t[3]=(c*a*r-o*u*r-c*i*h+s*u*h+o*i*d-s*a*d)*M,t[4]=x*M,t[5]=(l*y*r-p*u*r+p*i*d-e*y*d-l*i*f+e*u*f)*M,t[6]=(p*a*r-n*y*r-p*i*h+e*y*h+n*i*f-e*a*f)*M,t[7]=(n*u*r-l*a*r+l*i*h-e*u*h-n*i*d+e*a*d)*M,t[8]=b*M,t[9]=(p*c*r-l*m*r-p*s*d+e*m*d+l*s*f-e*c*f)*M,t[10]=(n*m*r-p*o*r+p*s*h-e*m*h-n*s*f+e*o*f)*M,t[11]=(l*o*r-n*c*r-l*s*h+e*c*h+n*s*d-e*o*d)*M,t[12]=v*M,t[13]=(l*m*i-p*c*i+p*s*u-e*m*u-l*s*y+e*c*y)*M,t[14]=(p*o*i-n*m*i-p*s*a+e*m*a+n*s*y-e*o*y)*M,t[15]=(n*c*i-l*o*i+l*s*a-e*c*a-n*s*u+e*o*u)*M,this}scale(t){const e=this.elements,s=t.x,i=t.y,r=t.z;return e[0]*=s,e[4]*=i,e[8]*=r,e[1]*=s,e[5]*=i,e[9]*=r,e[2]*=s,e[6]*=i,e[10]*=r,e[3]*=s,e[7]*=i,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],s=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],i=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,s,i))}makeTranslation(t,e,s){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,s,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),s=Math.sin(t);return this.set(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),s=Math.sin(t);return this.set(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const s=Math.cos(e),i=Math.sin(e),r=1-s,n=t.x,o=t.y,a=t.z,h=r*n,l=r*o;return this.set(h*n+s,h*o-i*a,h*a+i*o,0,h*o+i*a,l*o+s,l*a-i*n,0,h*a-i*o,l*a+i*n,r*a*a+s,0,0,0,0,1),this}makeScale(t,e,s){return this.set(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1),this}makeShear(t,e,s,i,r,n){return this.set(1,s,r,0,t,1,n,0,e,i,1,0,0,0,0,1),this}compose(t,e,s){const i=this.elements,r=e._x,n=e._y,o=e._z,a=e._w,h=r+r,l=n+n,c=o+o,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,f=o*c,g=a*h,x=a*l,b=a*c,v=s.x,w=s.y,M=s.z;return i[0]=(1-(m+f))*v,i[1]=(d+b)*v,i[2]=(p-x)*v,i[3]=0,i[4]=(d-b)*w,i[5]=(1-(u+f))*w,i[6]=(y+g)*w,i[7]=0,i[8]=(p+x)*M,i[9]=(y-g)*M,i[10]=(1-(u+m))*M,i[11]=0,i[12]=t.x,i[13]=t.y,i[14]=t.z,i[15]=1,this}decompose(t,e,s){const i=this.elements;let r=or.set(i[0],i[1],i[2]).length();const n=or.set(i[4],i[5],i[6]).length(),o=or.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),t.x=i[12],t.y=i[13],t.z=i[14],ar.copy(this);const a=1/r,h=1/n,l=1/o;return ar.elements[0]*=a,ar.elements[1]*=a,ar.elements[2]*=a,ar.elements[4]*=h,ar.elements[5]*=h,ar.elements[6]*=h,ar.elements[8]*=l,ar.elements[9]*=l,ar.elements[10]*=l,e.setFromRotationMatrix(ar),s.x=r,s.y=n,s.z=o,this}makePerspective(t,e,s,i,r,n,o=2e3){const a=this.elements,h=2*r/(e-t),l=2*r/(s-i),c=(e+t)/(e-t),u=(s+i)/(s-i);let d,p;if(o===Os)d=-(n+r)/(n-r),p=-2*n*r/(n-r);else{if(o!==Fs)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);d=-n/(n-r),p=-n*r/(n-r)}return a[0]=h,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=l,a[9]=u,a[13]=0,a[2]=0,a[6]=0,a[10]=d,a[14]=p,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(t,e,s,i,r,n,o=2e3){const a=this.elements,h=1/(e-t),l=1/(s-i),c=1/(n-r),u=(e+t)*h,d=(s+i)*l;let p,m;if(o===Os)p=(n+r)*c,m=-2*c;else{if(o!==Fs)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);p=r*c,m=-1*c}return a[0]=2*h,a[4]=0,a[8]=0,a[12]=-u,a[1]=0,a[5]=2*l,a[9]=0,a[13]=-d,a[2]=0,a[6]=0,a[10]=m,a[14]=-p,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(t){const e=this.elements,s=t.elements;for(let t=0;t<16;t++)if(e[t]!==s[t])return!1;return!0}fromArray(t,e=0){for(let s=0;s<16;s++)this.elements[s]=t[s+e];return this}toArray(t=[],e=0){const s=this.elements;return t[e]=s[0],t[e+1]=s[1],t[e+2]=s[2],t[e+3]=s[3],t[e+4]=s[4],t[e+5]=s[5],t[e+6]=s[6],t[e+7]=s[7],t[e+8]=s[8],t[e+9]=s[9],t[e+10]=s[10],t[e+11]=s[11],t[e+12]=s[12],t[e+13]=s[13],t[e+14]=s[14],t[e+15]=s[15],t}}const or=new Ii,ar=new nr,hr=new Ii(0,0,0),lr=new Ii(1,1,1),cr=new Ii,ur=new Ii,dr=new Ii,pr=new nr,mr=new Ci;class yr{constructor(t=0,e=0,s=0,i=yr.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=s,this._order=i}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,s,i=this._order){return this._x=t,this._y=e,this._z=s,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,s=!0){const i=t.elements,r=i[0],n=i[4],o=i[8],a=i[1],h=i[5],l=i[9],c=i[2],u=i[6],d=i[10];switch(e){case"XYZ":this._y=Math.asin(Ds(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Ds(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(o,d),this._z=Math.atan2(a,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(Ds(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(a,r));break;case"ZYX":this._y=Math.asin(-Ds(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(a,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(Ds(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(o,d));break;case"XZY":this._z=Math.asin(-Ds(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===s&&this._onChangeCallback(),this}setFromQuaternion(t,e,s){return pr.makeRotationFromQuaternion(t),this.setFromRotationMatrix(pr,e,s)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return mr.setFromEuler(this),this.setFromQuaternion(mr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}yr.DEFAULT_ORDER="XYZ";class fr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),!1===this.matrixAutoUpdate&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.visibility=this._visibility,i.active=this._active,i.bounds=this._bounds.map((t=>({boxInitialized:t.boxInitialized,boxMin:t.box.min.toArray(),boxMax:t.box.max.toArray(),sphereInitialized:t.sphereInitialized,sphereRadius:t.sphere.radius,sphereCenter:t.sphere.center.toArray()}))),i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.geometryCount=this._geometryCount,i.matricesTexture=this._matricesTexture.toJSON(t),null!==this._colorsTexture&&(i.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(i.boundingSphere={center:i.boundingSphere.center.toArray(),radius:i.boundingSphere.radius}),null!==this.boundingBox&&(i.boundingBox={min:i.boundingBox.min.toArray(),max:i.boundingBox.max.toArray()})),this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(i.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const s=e.shapes;if(Array.isArray(s))for(let e=0,i=s.length;e0){i.children=[];for(let e=0;e0){i.animations=[];for(let e=0;e0&&(s.geometries=e),i.length>0&&(s.materials=i),r.length>0&&(s.textures=r),o.length>0&&(s.images=o),a.length>0&&(s.shapes=a),h.length>0&&(s.skeletons=h),l.length>0&&(s.animations=l),c.length>0&&(s.nodes=c)}return s.object=i,s;function n(t){const e=[];for(const s in t){const i=t[s];delete i.metadata,e.push(i)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(t,e,s,i,r){Pr.subVectors(i,e),Rr.subVectors(s,e),Or.subVectors(t,e);const n=Pr.dot(Pr),o=Pr.dot(Rr),a=Pr.dot(Or),h=Rr.dot(Rr),l=Rr.dot(Or),c=n*h-o*o;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*a-o*l)*u,p=(n*l-o*a)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,s,i){return null!==this.getBarycoord(t,e,s,i,Fr)&&(Fr.x>=0&&Fr.y>=0&&Fr.x+Fr.y<=1)}static getInterpolation(t,e,s,i,r,n,o,a){return null===this.getBarycoord(t,e,s,i,Fr)?(a.x=0,a.y=0,"z"in a&&(a.z=0),"w"in a&&(a.w=0),null):(a.setScalar(0),a.addScaledVector(r,Fr.x),a.addScaledVector(n,Fr.y),a.addScaledVector(o,Fr.z),a)}static getInterpolatedAttribute(t,e,s,i,r,n){return Dr.setScalar(0),Hr.setScalar(0),qr.setScalar(0),Dr.fromBufferAttribute(t,e),Hr.fromBufferAttribute(t,s),qr.fromBufferAttribute(t,i),n.setScalar(0),n.addScaledVector(Dr,r.x),n.addScaledVector(Hr,r.y),n.addScaledVector(qr,r.z),n}static isFrontFacing(t,e,s,i){return Pr.subVectors(s,e),Rr.subVectors(t,e),Pr.cross(Rr).dot(i)<0}set(t,e,s){return this.a.copy(t),this.b.copy(e),this.c.copy(s),this}setFromPointsAndIndices(t,e,s,i){return this.a.copy(t[e]),this.b.copy(t[s]),this.c.copy(t[i]),this}setFromAttributeAndIndices(t,e,s,i){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,s),this.c.fromBufferAttribute(t,i),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Pr.subVectors(this.c,this.b),Rr.subVectors(this.a,this.b),.5*Pr.cross(Rr).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Jr.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Jr.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,s,i,r){return Jr.getInterpolation(t,this.a,this.b,this.c,e,s,i,r)}containsPoint(t){return Jr.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Jr.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const s=this.a,i=this.b,r=this.c;let n,o;Nr.subVectors(i,s),Lr.subVectors(r,s),Wr.subVectors(t,s);const a=Nr.dot(Wr),h=Lr.dot(Wr);if(a<=0&&h<=0)return e.copy(s);jr.subVectors(t,i);const l=Nr.dot(jr),c=Lr.dot(jr);if(l>=0&&c<=l)return e.copy(i);const u=a*c-l*h;if(u<=0&&a>=0&&l<=0)return n=a/(a-l),e.copy(s).addScaledVector(Nr,n);Ur.subVectors(t,r);const d=Nr.dot(Ur),p=Lr.dot(Ur);if(p>=0&&d<=p)return e.copy(r);const m=d*h-a*p;if(m<=0&&h>=0&&p<=0)return o=h/(h-p),e.copy(s).addScaledVector(Lr,o);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return Vr.subVectors(r,i),o=(c-l)/(c-l+(d-p)),e.copy(i).addScaledVector(Vr,o);const f=1/(y+m+u);return n=m*f,o=u*f,e.copy(s).addScaledVector(Nr,n).addScaledVector(Lr,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const Xr={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Yr={h:0,s:0,l:0},Zr={h:0,s:0,l:0};function Gr(t,e,s){return s<0&&(s+=1),s>1&&(s-=1),s<1/6?t+6*(e-t)*s:s<.5?e:s<2/3?t+6*(e-t)*(2/3-s):t}class $r{constructor(t,e,s){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,s)}set(t,e,s){if(void 0===e&&void 0===s){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,s);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Ge){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ui.toWorkingColorSpace(this,e),this}setRGB(t,e,s,i=ui.workingColorSpace){return this.r=t,this.g=e,this.b=s,ui.toWorkingColorSpace(this,i),this}setHSL(t,e,s,i=ui.workingColorSpace){if(t=Hs(t,1),e=Ds(e,0,1),s=Ds(s,0,1),0===e)this.r=this.g=this.b=s;else{const i=s<=.5?s*(1+e):s+e-s*e,r=2*s-i;this.r=Gr(r,i,t+1/3),this.g=Gr(r,i,t),this.b=Gr(r,i,t-1/3)}return ui.toWorkingColorSpace(this,i),this}setStyle(t,e=Ge){function s(e){void 0!==e&&parseFloat(e)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=i[1],o=i[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return s(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return s(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return s(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(t)){const s=i[1],r=s.length;if(3===r)return this.setRGB(parseInt(s.charAt(0),16)/15,parseInt(s.charAt(1),16)/15,parseInt(s.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(s,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Ge){const s=Xr[t.toLowerCase()];return void 0!==s?this.setHex(s,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=di(t.r),this.g=di(t.g),this.b=di(t.b),this}copyLinearToSRGB(t){return this.r=pi(t.r),this.g=pi(t.g),this.b=pi(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Ge){return ui.fromWorkingColorSpace(Qr.copy(this),t),65536*Math.round(Ds(255*Qr.r,0,255))+256*Math.round(Ds(255*Qr.g,0,255))+Math.round(Ds(255*Qr.b,0,255))}getHexString(t=Ge){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ui.workingColorSpace){ui.fromWorkingColorSpace(Qr.copy(this),e);const s=Qr.r,i=Qr.g,r=Qr.b,n=Math.max(s,i,r),o=Math.min(s,i,r);let a,h;const l=(o+n)/2;if(o===n)a=0,h=0;else{const t=n-o;switch(h=l<=.5?t/(n+o):t/(2-n-o),n){case s:a=(i-r)/t+(i0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const s=t[e];if(void 0===s){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const i=this[e];void 0!==i?i&&i.isColor?i.set(s):i&&i.isVector3&&s&&s.isVector3?i.copy(s):this[e]=s:console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const s={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};function i(t){const e=[];for(const s in t){const i=t[s];delete i.metadata,e.push(i)}return e}if(s.uuid=this.uuid,s.type=this.type,""!==this.name&&(s.name=this.name),this.color&&this.color.isColor&&(s.color=this.color.getHex()),void 0!==this.roughness&&(s.roughness=this.roughness),void 0!==this.metalness&&(s.metalness=this.metalness),void 0!==this.sheen&&(s.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(s.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(s.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(s.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(s.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(s.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(s.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(s.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(s.shininess=this.shininess),void 0!==this.clearcoat&&(s.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(s.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(s.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(s.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(s.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,s.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),void 0!==this.dispersion&&(s.dispersion=this.dispersion),void 0!==this.iridescence&&(s.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(s.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(s.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(s.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(s.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(s.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(s.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(s.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(s.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(s.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(s.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(s.lightMap=this.lightMap.toJSON(t).uuid,s.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(s.aoMap=this.aoMap.toJSON(t).uuid,s.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(s.bumpMap=this.bumpMap.toJSON(t).uuid,s.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(s.normalMap=this.normalMap.toJSON(t).uuid,s.normalMapType=this.normalMapType,s.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(s.displacementMap=this.displacementMap.toJSON(t).uuid,s.displacementScale=this.displacementScale,s.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(s.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(s.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(s.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(s.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(s.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(s.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(s.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(s.combine=this.combine)),void 0!==this.envMapRotation&&(s.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(s.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(s.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(s.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(s.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(s.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(s.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(s.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(s.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(s.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(s.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(s.size=this.size),null!==this.shadowSide&&(s.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(s.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(s.blending=this.blending),0!==this.side&&(s.side=this.side),!0===this.vertexColors&&(s.vertexColors=!0),this.opacity<1&&(s.opacity=this.opacity),!0===this.transparent&&(s.transparent=!0),204!==this.blendSrc&&(s.blendSrc=this.blendSrc),205!==this.blendDst&&(s.blendDst=this.blendDst),100!==this.blendEquation&&(s.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(s.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(s.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(s.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(s.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(s.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(s.depthFunc=this.depthFunc),!1===this.depthTest&&(s.depthTest=this.depthTest),!1===this.depthWrite&&(s.depthWrite=this.depthWrite),!1===this.colorWrite&&(s.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(s.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(s.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(s.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(s.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==es&&(s.stencilFail=this.stencilFail),this.stencilZFail!==es&&(s.stencilZFail=this.stencilZFail),this.stencilZPass!==es&&(s.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(s.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(s.rotation=this.rotation),!0===this.polygonOffset&&(s.polygonOffset=!0),0!==this.polygonOffsetFactor&&(s.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(s.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(s.linewidth=this.linewidth),void 0!==this.dashSize&&(s.dashSize=this.dashSize),void 0!==this.gapSize&&(s.gapSize=this.gapSize),void 0!==this.scale&&(s.scale=this.scale),!0===this.dithering&&(s.dithering=!0),this.alphaTest>0&&(s.alphaTest=this.alphaTest),!0===this.alphaHash&&(s.alphaHash=!0),!0===this.alphaToCoverage&&(s.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(s.premultipliedAlpha=!0),!0===this.forceSinglePass&&(s.forceSinglePass=!0),!0===this.wireframe&&(s.wireframe=!0),this.wireframeLinewidth>1&&(s.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(s.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(s.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(s.flatShading=!0),!1===this.visible&&(s.visible=!1),!1===this.toneMapped&&(s.toneMapped=!1),!1===this.fog&&(s.fog=!1),Object.keys(this.userData).length>0&&(s.userData=this.userData),e){const e=i(t.textures),r=i(t.images);e.length>0&&(s.textures=e),r.length>0&&(s.images=r)}return s}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let s=null;if(null!==e){const t=e.length;s=new Array(t);for(let i=0;i!==t;++i)s[i]=e[i].clone()}return this.clippingPlanes=s,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class en extends tn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new $r(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const sn=rn();function rn(){const t=new ArrayBuffer(4),e=new Float32Array(t),s=new Uint32Array(t),i=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(i[t]=0,i[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(i[t]=1024>>-e-14,i[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(i[t]=e+15<<10,i[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(i[t]=31744,i[256|t]=64512,r[t]=24,r[256|t]=24):(i[t]=31744,i[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),o=new Uint32Array(64),a=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,s=0;for(;!(8388608&e);)e<<=1,s-=8388608;e&=-8388609,s+=947912704,n[t]=e|s}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)o[t]=t<<23;o[31]=1199570944,o[32]=2147483648;for(let t=33;t<63;++t)o[t]=2147483648+(t-32<<23);o[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(a[t]=1024);return{floatView:e,uint32View:s,baseTable:i,shiftTable:r,mantissaTable:n,exponentTable:o,offsetTable:a}}function nn(t){Math.abs(t)>65504&&console.warn("THREE.DataUtils.toHalfFloat(): Value out of range."),t=Ds(t,-65504,65504),sn.floatView[0]=t;const e=sn.uint32View[0],s=e>>23&511;return sn.baseTable[s]+((8388607&e)>>sn.shiftTable[s])}function on(t){const e=t>>10;return sn.uint32View[0]=sn.mantissaTable[sn.offsetTable[e]+(1023&t)]+sn.exponentTable[e],sn.floatView[0]}const an={toHalfFloat:nn,fromHalfFloat:on},hn=new Ii,ln=new Zs;class cn{constructor(t,e,s=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=s,this.usage=_s,this.updateRanges=[],this.gpuType=Et,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,s){t*=this.itemSize,s*=e.itemSize;for(let i=0,r=this.itemSize;ie.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Ei);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ii(-1/0,-1/0,-1/0),new Ii(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,s=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const s in e)void 0!==e[s]&&(t[s]=e[s]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const s=this.attributes;for(const e in s){const i=s[e];t.data.attributes[e]=i.toJSON(t.data)}const i={};let r=!1;for(const e in this.morphAttributes){const s=this.morphAttributes[e],n=[];for(let e=0,i=s.length;e0&&(i[e]=n,r=!0)}r&&(t.data.morphAttributes=i,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const o=this.boundingSphere;return null!==o&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const s=t.index;null!==s&&this.setIndex(s.clone(e));const i=t.attributes;for(const t in i){const s=i[t];this.setAttribute(t,s.clone(e))}const r=t.morphAttributes;for(const t in r){const s=[],i=r[t];for(let t=0,r=i.length;t0){const s=t[e[0]];if(void 0!==s){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=s.length;t(t.far-t.near)**2)return}Cn.copy(r).invert(),In.copy(t.ray).applyMatrix4(Cn),null!==s.boundingBox&&!1===In.intersectsBox(s.boundingBox)||this._computeIntersections(t,e,In)}}_computeIntersections(t,e,s){let i;const r=this.geometry,n=this.material,o=r.index,a=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==o)if(Array.isArray(n))for(let r=0,a=u.length;rs.far?null:{distance:l,point:Ln.clone(),object:t}}(t,e,s,i,En,Pn,Rn,Nn);if(c){const t=new Ii;Jr.getBarycoord(Nn,En,Pn,Rn,t),r&&(c.uv=Jr.getInterpolatedAttribute(r,a,h,l,t,new Zs)),n&&(c.uv1=Jr.getInterpolatedAttribute(n,a,h,l,t,new Zs)),o&&(c.normal=Jr.getInterpolatedAttribute(o,a,h,l,t,new Ii),c.normal.dot(i.direction)>0&&c.normal.multiplyScalar(-1));const e={a:a,b:h,c:l,normal:new Ii,materialIndex:0};Jr.getNormal(En,Pn,Rn,e.normal),c.face=e,c.barycoord=t}return c}class jn extends zn{constructor(t=1,e=1,s=1,i=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:s,widthSegments:i,heightSegments:r,depthSegments:n};const o=this;i=Math.floor(i),r=Math.floor(r),n=Math.floor(n);const a=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,s,i,r,n,p,m,y,f,g){const x=n/y,b=p/f,v=n/2,w=p/2,M=m/2,S=y+1,_=f+1;let A=0,T=0;const z=new Ii;for(let n=0;n<_;n++){const o=n*b-w;for(let a=0;a0?1:-1,l.push(z.x,z.y,z.z),c.push(a/y),c.push(1-n/f),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const s={};for(const t in this.extensions)!0===this.extensions[t]&&(s[t]=!0);return Object.keys(s).length>0&&(e.extensions=s),e}}class Xn extends Er{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new nr,this.projectionMatrix=new nr,this.projectionMatrixInverse=new nr,this.coordinateSystem=Os}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const Yn=new Ii,Zn=new Zs,Gn=new Zs;class $n extends Xn{constructor(t=50,e=1,s=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=s,this.far=i,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*js*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*Ws*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*js*Math.atan(Math.tan(.5*Ws*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,s){Yn.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Yn.x,Yn.y).multiplyScalar(-t/Yn.z),Yn.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),s.set(Yn.x,Yn.y).multiplyScalar(-t/Yn.z)}getViewSize(t,e){return this.getViewBounds(t,Zn,Gn),e.subVectors(Gn,Zn)}setViewOffset(t,e,s,i,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=s,this.view.offsetY=i,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*Ws*this.fov)/this.zoom,s=2*e,i=this.aspect*s,r=-.5*i;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,o=n.fullHeight;r+=n.offsetX*i/t,e-=n.offsetY*s/o,i*=n.width/t,s*=n.height/o}const o=this.filmOffset;0!==o&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,e,e-s,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const Qn=-90;class Kn extends Er{constructor(t,e,s){super(),this.type="CubeCamera",this.renderTarget=s,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new $n(Qn,1,t,e);i.layers=this.layers,this.add(i);const r=new $n(Qn,1,t,e);r.layers=this.layers,this.add(r);const n=new $n(Qn,1,t,e);n.layers=this.layers,this.add(n);const o=new $n(Qn,1,t,e);o.layers=this.layers,this.add(o);const a=new $n(Qn,1,t,e);a.layers=this.layers,this.add(a);const h=new $n(Qn,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[s,i,r,n,o,a]=e;for(const t of e)this.remove(t);if(t===Os)s.up.set(0,1,0),s.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),a.up.set(0,1,0),a.lookAt(0,0,-1);else{if(t!==Fs)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);s.up.set(0,-1,0),s.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),a.up.set(0,-1,0),a.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:s,activeMipmapLevel:i}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,o,a,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=s.texture.generateMipmaps;s.texture.generateMipmaps=!1,t.setRenderTarget(s,0,i),t.render(e,r),t.setRenderTarget(s,1,i),t.render(e,n),t.setRenderTarget(s,2,i),t.render(e,o),t.setRenderTarget(s,3,i),t.render(e,a),t.setRenderTarget(s,4,i),t.render(e,h),s.texture.generateMipmaps=m,t.setRenderTarget(s,5,i),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,s.texture.needsPMREMUpdate=!0}}class to extends vi{constructor(t,e,s,i,r,n,o,a,h,l){super(t=void 0!==t?t:[],e=void 0!==e?e:ht,s,i,r,n,o,a,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class eo extends Si{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const s={width:t,height:t,depth:1},i=[s,s,s,s,s,s];this.texture=new to(i,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==e.generateMipmaps&&e.generateMipmaps,this.texture.minFilter=void 0!==e.minFilter?e.minFilter:wt}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const s={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},i=new jn(5,5,5),r=new Jn({name:"CubemapFromEquirect",uniforms:Un(s.uniforms),vertexShader:s.vertexShader,fragmentShader:s.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new Vn(i,r),o=e.minFilter;e.minFilter===_t&&(e.minFilter=wt);return new Kn(1,10,this).update(t,n),e.minFilter=o,n.geometry.dispose(),n.material.dispose(),this}clear(t,e,s,i){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,s,i);t.setRenderTarget(r)}}class so{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new $r(t),this.density=e}clone(){return new so(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class io{constructor(t,e=1,s=1e3){this.isFog=!0,this.name="",this.color=new $r(t),this.near=e,this.far=s}clone(){return new io(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class ro extends Er{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new yr,this.environmentIntensity=1,this.environmentRotation=new yr,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class no{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=_s,this.updateRanges=[],this.version=0,this.uuid=Us()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,s){t*=this.stride,s*=e.stride;for(let i=0,r=this.stride;it.far||e.push({distance:a,point:co.clone(),uv:Jr.getInterpolation(co,go,xo,bo,vo,wo,Mo,new Zs),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function _o(t,e,s,i,r,n){mo.subVectors(t,s).addScalar(.5).multiply(i),void 0!==r?(yo.x=n*mo.x-r*mo.y,yo.y=r*mo.x+n*mo.y):yo.copy(mo),t.copy(e),t.x+=yo.x,t.y+=yo.y,t.applyMatrix4(fo)}const Ao=new Ii,To=new Ii;class zo extends Er{constructor(){super(),this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]},isLOD:{value:!0}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,s=e.length;t0){let s,i;for(s=1,i=e.length;s0){Ao.setFromMatrixPosition(this.matrixWorld);const s=t.ray.origin.distanceTo(Ao);this.getObjectForDistance(s).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ao.setFromMatrixPosition(t.matrixWorld),To.setFromMatrixPosition(this.matrixWorld);const s=Ao.distanceTo(To)/t.zoom;let i,r;for(e[0].object.visible=!0,i=1,r=e.length;i=t))break;e[i-1].object.visible=!1,e[i].object.visible=!0}for(this._currentLevel=i-1;i1?null:e.copy(t.start).addScaledVector(s,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),s=this.distanceToPoint(t.end);return e<0&&s>0||s<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const s=e||ta.getNormalMatrix(t),i=this.coplanarPoint(Qo).applyMatrix4(t),r=this.normal.applyMatrix3(s).normalize();return this.constant=-i.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const sa=new Gi,ia=new Ii;class ra{constructor(t=new ea,e=new ea,s=new ea,i=new ea,r=new ea,n=new ea){this.planes=[t,e,s,i,r,n]}set(t,e,s,i,r,n){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(s),o[3].copy(i),o[4].copy(r),o[5].copy(n),this}copy(t){const e=this.planes;for(let s=0;s<6;s++)e[s].copy(t.planes[s]);return this}setFromProjectionMatrix(t,e=2e3){const s=this.planes,i=t.elements,r=i[0],n=i[1],o=i[2],a=i[3],h=i[4],l=i[5],c=i[6],u=i[7],d=i[8],p=i[9],m=i[10],y=i[11],f=i[12],g=i[13],x=i[14],b=i[15];if(s[0].setComponents(a-r,u-h,y-d,b-f).normalize(),s[1].setComponents(a+r,u+h,y+d,b+f).normalize(),s[2].setComponents(a+n,u+l,y+p,b+g).normalize(),s[3].setComponents(a-n,u-l,y-p,b-g).normalize(),s[4].setComponents(a-o,u-c,y-m,b-x).normalize(),e===Os)s[5].setComponents(a+o,u+c,y+m,b+x).normalize();else{if(e!==Fs)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,c,m,x).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),sa.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),sa.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(sa)}intersectsSprite(t){return sa.center.set(0,0,0),sa.radius=.7071067811865476,sa.applyMatrix4(t.matrixWorld),this.intersectsSphere(sa)}intersectsSphere(t){const e=this.planes,s=t.center,i=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(s)0?t.max.x:t.min.x,ia.y=i.normal.y>0?t.max.y:t.min.y,ia.z=i.normal.z>0?t.max.z:t.min.z,i.distanceToPoint(ia)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let s=0;s<6;s++)if(e[s].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function na(t,e){return t-e}function oa(t,e){return t.z-e.z}function aa(t,e){return e.z-t.z}class ha{constructor(){this.index=0,this.pool=[],this.list=[]}push(t,e,s,i){const r=this.pool,n=this.list;this.index>=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const o=r[this.index];n.push(o),this.index++,o.start=t,o.count=e,o.z=s,o.index=i}reset(){this.list.length=0,this.index=0}}const la=new nr,ca=new $r(1,1,1),ua=new ra,da=new Ei,pa=new Gi,ma=new Ii,ya=new Ii,fa=new Ii,ga=new ha,xa=new Vn,ba=[];function va(t,e,s=0){const i=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(i):new Uint16Array(i);e.setIndex(new cn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const s in e.attributes){if(!t.hasAttribute(s))throw new Error(`THREE.BatchedMesh: Added geometry missing "${s}". All geometries must have consistent attributes.`);const i=t.getAttribute(s),r=e.getAttribute(s);if(i.itemSize!==r.itemSize||i.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Ei);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let s=0,i=e.length;s=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let s=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(na),s=this._availableInstanceIds.shift(),this._instanceInfo[s]=e):(s=this._instanceInfo.length,this._instanceInfo.push(e));const i=this._matricesTexture;la.identity().toArray(i.image.data,16*s),i.needsUpdate=!0;const r=this._colorsTexture;return r&&(ca.toArray(r.image.data,4*s),r.needsUpdate=!0),this._visibilityChanged=!0,s}addGeometry(t,e=-1,s=-1){this._initializeGeometry(t),this._validateGeometry(t);const i={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;i.vertexStart=this._nextVertexStart,i.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(i.indexStart=this._nextIndexStart,i.reservedIndexCount=-1===s?n.count:s),-1!==i.indexStart&&i.indexStart+i.reservedIndexCount>this._maxIndexCount||i.vertexStart+i.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let o;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(na),o=this._availableGeometryIds.shift(),r[o]=i):(o=this._geometryCount,this._geometryCount++,r.push(i)),this.setGeometryAt(o,t),this._nextIndexStart=i.indexStart+i.reservedIndexCount,this._nextVertexStart=i.vertexStart+i.reservedVertexCount,o}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const s=this.geometry,i=null!==s.getIndex(),r=s.getIndex(),n=e.getIndex(),o=this._geometryInfo[t];if(i&&n.count>o.reservedIndexCount||e.attributes.position.count>o.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const a=o.vertexStart,h=o.reservedVertexCount;o.vertexCount=e.getAttribute("position").count;for(const t in s.attributes){const i=e.getAttribute(t),r=s.getAttribute(t);va(i,r,a);const n=i.itemSize;for(let t=i.count,e=h;t=e.length||!1===e[t].active)return this;const s=this._instanceInfo;for(let e=0,i=s.length;ee)).sort(((t,e)=>s[t].vertexStart-s[e].vertexStart)),r=this.geometry;for(let n=0,o=s.length;n=this._geometryCount)return null;const s=this.geometry,i=this._geometryInfo[t];if(null===i.boundingBox){const t=new Ei,e=s.index,r=s.attributes.position;for(let s=i.start,n=i.start+i.count;s=this._geometryCount)return null;const s=this.geometry,i=this._geometryInfo[t];if(null===i.boundingSphere){const e=new Gi;this.getBoundingBoxAt(t,da),da.getCenter(e.center);const r=s.index,n=s.attributes.position;let o=0;for(let t=i.start,s=i.start+i.count;tt.active));if(Math.max(...s.map((t=>t.vertexStart+t.reservedVertexCount)))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...s.map((t=>t.indexStart+t.reservedIndexCount)))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const i=this.geometry;i.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new zn,this._initializeGeometry(i));const r=this.geometry;i.index&&wa(i.index.array,r.index.array);for(const t in i.attributes)wa(i.attributes[t].array,r.attributes[t].array)}raycast(t,e){const s=this._instanceInfo,i=this._geometryInfo,r=this.matrixWorld,n=this.geometry;xa.material=this.material,xa.geometry.index=n.index,xa.geometry.attributes=n.attributes,null===xa.geometry.boundingBox&&(xa.geometry.boundingBox=new Ei),null===xa.geometry.boundingSphere&&(xa.geometry.boundingSphere=new Gi);for(let n=0,o=s.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null}))),this._instanceInfo=t._instanceInfo.map((t=>({...t}))),this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._geometryCount=t._geometryCount,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){return this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null),this}onBeforeRender(t,e,s,i,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=i.getIndex(),o=null===n?1:n.array.BYTES_PER_ELEMENT,a=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data;u&&(la.multiplyMatrices(s.projectionMatrix,s.matrixWorldInverse).multiply(this.matrixWorld),ua.setFromProjectionMatrix(la,t.coordinateSystem));let m=0;if(this.sortObjects){la.copy(this.matrixWorld).invert(),ma.setFromMatrixPosition(s.matrixWorld).applyMatrix4(la),ya.set(0,0,-1).transformDirection(s.matrixWorld).transformDirection(la);for(let t=0,e=a.length;t0){const s=t[e[0]];if(void 0!==s){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=s.length;ti)return;Ia.applyMatrix4(t.matrixWorld);const a=e.ray.origin.distanceTo(Ia);return ae.far?void 0:{distance:a,point:Ba.clone().applyMatrix4(t.matrixWorld),index:r,face:null,faceIndex:null,barycoord:null,object:t}}const Pa=new Ii,Ra=new Ii;class Oa extends ka{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,s=[];for(let t=0,i=e.count;t0){const s=t[e[0]];if(void 0!==s){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=s.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(a),point:s,index:e,face:null,faceIndex:null,barycoord:null,object:o})}}class Ha extends Er{constructor(){super(),this.isGroup=!0,this.type="Group"}}class qa extends vi{constructor(t,e,s,i,r,n,o,a,h){super(t,e,s,i,r,n,o,a,h),this.isVideoTexture=!0,this.minFilter=void 0!==n?n:wt,this.magFilter=void 0!==r?r:wt,this.generateMipmaps=!1;const l=this;"requestVideoFrameCallback"in t&&t.requestVideoFrameCallback((function e(){l.needsUpdate=!0,t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}class Ja extends vi{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class Xa extends vi{constructor(t,e,s,i,r,n,o,a,h,l,c,u){super(null,n,o,a,h,l,i,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:s},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class Ya extends Xa{constructor(t,e,s,i,r,n){super(t,e,s,r,n),this.isCompressedArrayTexture=!0,this.image.depth=i,this.wrapR=mt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class Za extends Xa{constructor(t,e,s){super(void 0,t[0].width,t[0].height,e,s,ht),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class Ga extends vi{constructor(t,e,s,i,r,n,o,a,h){super(t,e,s,i,r,n,o,a,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class $a extends vi{constructor(t,e,s,i,r,n,o,a,h,l=1026){if(l!==Dt&&l!==Ht)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===s&&l===Dt&&(s=kt),void 0===s&&l===Ht&&(s=1020),super(null,i,r,n,o,a,l,s,h),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=void 0!==o?o:ft,this.minFilter=void 0!==a?a:ft,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class Qa{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(t,e){const s=this.getUtoTmapping(t);return this.getPoint(s,e)}getPoints(t=5){const e=[];for(let s=0;s<=t;s++)e.push(this.getPoint(s/t));return e}getSpacedPoints(t=5){const e=[];for(let s=0;s<=t;s++)e.push(this.getPointAt(s/t));return e}getLength(){const t=this.getLengths();return t[t.length-1]}getLengths(t=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===t+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const e=[];let s,i=this.getPoint(0),r=0;e.push(0);for(let n=1;n<=t;n++)s=this.getPoint(n/t),r+=s.distanceTo(i),e.push(r),i=s;return this.cacheArcLengths=e,e}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(t,e){const s=this.getLengths();let i=0;const r=s.length;let n;n=e||t*s[r-1];let o,a=0,h=r-1;for(;a<=h;)if(i=Math.floor(a+(h-a)/2),o=s[i]-n,o<0)a=i+1;else{if(!(o>0)){h=i;break}h=i-1}if(i=h,s[i]===n)return i/(r-1);const l=s[i];return(i+(n-l)/(s[i+1]-l))/(r-1)}getTangent(t,e){const s=1e-4;let i=t-s,r=t+s;i<0&&(i=0),r>1&&(r=1);const n=this.getPoint(i),o=this.getPoint(r),a=e||(n.isVector2?new Zs:new Ii);return a.copy(o).sub(n).normalize(),a}getTangentAt(t,e){const s=this.getUtoTmapping(t);return this.getTangent(s,e)}computeFrenetFrames(t,e){const s=new Ii,i=[],r=[],n=[],o=new Ii,a=new nr;for(let e=0;e<=t;e++){const s=e/t;i[e]=this.getTangentAt(s,new Ii)}r[0]=new Ii,n[0]=new Ii;let h=Number.MAX_VALUE;const l=Math.abs(i[0].x),c=Math.abs(i[0].y),u=Math.abs(i[0].z);l<=h&&(h=l,s.set(1,0,0)),c<=h&&(h=c,s.set(0,1,0)),u<=h&&s.set(0,0,1),o.crossVectors(i[0],s).normalize(),r[0].crossVectors(i[0],o),n[0].crossVectors(i[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),o.crossVectors(i[e-1],i[e]),o.length()>Number.EPSILON){o.normalize();const t=Math.acos(Ds(i[e-1].dot(i[e]),-1,1));r[e].applyMatrix4(a.makeRotationAxis(o,t))}n[e].crossVectors(i[e],r[e])}if(!0===e){let e=Math.acos(Ds(r[0].dot(r[t]),-1,1));e/=t,i[0].dot(o.crossVectors(r[0],r[t]))>0&&(e=-e);for(let s=1;s<=t;s++)r[s].applyMatrix4(a.makeRotationAxis(i[s],e*s)),n[s].crossVectors(i[s],r[s])}return{tangents:i,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.6,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Ka extends Qa{constructor(t=0,e=0,s=1,i=1,r=0,n=2*Math.PI,o=!1,a=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=s,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=o,this.aRotation=a}getPoint(t,e=new Zs){const s=e,i=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?o=i[(h-1)%r]:(sh.subVectors(i[0],i[1]).add(i[0]),o=sh);const c=i[h%r],u=i[(h+1)%r];if(this.closed||h+2i.length-2?i.length-1:n+1],c=i[n>i.length-3?i.length-1:n+2];return s.set(ah(o,a.x,h.x,l.x,c.x),ah(o,a.y,h.y,l.y,c.y)),s}copy(t){super.copy(t),this.points=[];for(let e=0,s=t.points.length;e=s){const t=i[r]-s,n=this.curves[r],o=n.getLength(),a=0===o?0:1-t/o;return n.getPointAt(a,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let s=0,i=this.curves.length;s1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,s=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class vh extends zn{constructor(t=[new Zs(0,-.5),new Zs(.5,0),new Zs(0,.5)],e=12,s=0,i=2*Math.PI){super(),this.type="LatheGeometry",this.parameters={points:t,segments:e,phiStart:s,phiLength:i},e=Math.floor(e),i=Ds(i,0,2*Math.PI);const r=[],n=[],o=[],a=[],h=[],l=1/e,c=new Ii,u=new Zs,d=new Ii,p=new Ii,m=new Ii;let y=0,f=0;for(let e=0;e<=t.length-1;e++)switch(e){case 0:y=t[e+1].x-t[e].x,f=t[e+1].y-t[e].y,d.x=1*f,d.y=-y,d.z=0*f,m.copy(d),d.normalize(),a.push(d.x,d.y,d.z);break;case t.length-1:a.push(m.x,m.y,m.z);break;default:y=t[e+1].x-t[e].x,f=t[e+1].y-t[e].y,d.x=1*f,d.y=-y,d.z=0*f,p.copy(d),d.x+=m.x,d.y+=m.y,d.z+=m.z,d.normalize(),a.push(d.x,d.y,d.z),m.copy(p)}for(let r=0;r<=e;r++){const d=s+r*l*i,p=Math.sin(d),m=Math.cos(d);for(let s=0;s<=t.length-1;s++){c.x=t[s].x*p,c.y=t[s].y,c.z=t[s].x*m,n.push(c.x,c.y,c.z),u.x=r/e,u.y=s/(t.length-1),o.push(u.x,u.y);const i=a[3*s+0]*p,l=a[3*s+1],d=a[3*s+0]*m;h.push(i,l,d)}}for(let s=0;s0||0!==i)&&(l.push(n,o,h),x+=3),(e>0||i!==r-1)&&(l.push(o,a,h),x+=3)}h.addGroup(f,x,0),f+=x}(),!1===n&&(t>0&&g(!0),e>0&&g(!1)),this.setIndex(l),this.setAttribute("position",new bn(c,3)),this.setAttribute("normal",new bn(u,3)),this.setAttribute("uv",new bn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Sh(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class _h extends Sh{constructor(t=1,e=1,s=32,i=1,r=!1,n=0,o=2*Math.PI){super(0,t,e,s,i,r,n,o),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:s,heightSegments:i,openEnded:r,thetaStart:n,thetaLength:o}}static fromJSON(t){return new _h(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ah extends zn{constructor(t=[],e=[],s=1,i=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:s,detail:i};const r=[],n=[];function o(t,e,s,i){const r=i+1,n=[];for(let i=0;i<=r;i++){n[i]=[];const o=t.clone().lerp(s,i/r),a=e.clone().lerp(s,i/r),h=r-i;for(let t=0;t<=h;t++)n[i][t]=0===t&&i===r?o:o.clone().lerp(a,t/h)}for(let t=0;t.9&&o<.1&&(e<.2&&(n[t+0]+=1),s<.2&&(n[t+2]+=1),i<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new bn(r,3)),this.setAttribute("normal",new bn(r.slice(),3)),this.setAttribute("uv",new bn(n,2)),0===i?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ah(t.vertices,t.indices,t.radius,t.details)}}class Th extends Ah{constructor(t=1,e=0){const s=(1+Math.sqrt(5))/2,i=1/s;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-i,-s,0,-i,s,0,i,-s,0,i,s,-i,-s,0,-i,s,0,i,-s,0,i,s,0,-s,0,-i,s,0,-i,-s,0,i,s,0,i],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new Th(t.radius,t.detail)}}const zh=new Ii,Ch=new Ii,Ih=new Ii,Bh=new Jr;class kh extends zn{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const s=4,i=Math.pow(10,s),r=Math.cos(Ws*e),n=t.getIndex(),o=t.getAttribute("position"),a=n?n.count:o.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t80*s){a=l=t[0],h=c=t[1];for(let e=s;el&&(l=u),d>c&&(c=d);p=Math.max(l-a,c-h),p=0!==p?32767/p:0}return Fh(n,o,s,a,h,p,0),o};function Rh(t,e,s,i,r){let n,o;if(r===function(t,e,s,i){let r=0;for(let n=e,o=s-i;n0)for(n=e;n=e;n-=i)o=el(n,t[n],t[n+1],o);return o&&Zh(o,o.next)&&(sl(o),o=o.next),o}function Oh(t,e){if(!t)return t;e||(e=t);let s,i=t;do{if(s=!1,i.steiner||!Zh(i,i.next)&&0!==Yh(i.prev,i,i.next))i=i.next;else{if(sl(i),i=e=i.prev,i===i.next)break;s=!0}}while(s||i!==e);return e}function Fh(t,e,s,i,r,n,o){if(!t)return;!o&&n&&function(t,e,s,i){let r=t;do{0===r.z&&(r.z=Hh(r.x,r.y,e,s,i)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,s,i,r,n,o,a,h,l=1;do{for(s=t,t=null,n=null,o=0;s;){for(o++,i=s,a=0,e=0;e0||h>0&&i;)0!==a&&(0===h||!i||s.z<=i.z)?(r=s,s=s.nextZ,a--):(r=i,i=i.nextZ,h--),n?n.nextZ=r:t=r,r.prevZ=n,n=r;s=i}n.nextZ=null,l*=2}while(o>1)}(r)}(t,i,r,n);let a,h,l=t;for(;t.prev!==t.next;)if(a=t.prev,h=t.next,n?Lh(t,i,r,n):Nh(t))e.push(a.i/s|0),e.push(t.i/s|0),e.push(h.i/s|0),sl(t),t=h.next,l=h.next;else if((t=h)===l){o?1===o?Fh(t=Vh(Oh(t),e,s),e,s,i,r,n,2):2===o&&Wh(t,e,s,i,r,n):Fh(Oh(t),e,s,i,r,n,1);break}}function Nh(t){const e=t.prev,s=t,i=t.next;if(Yh(e,s,i)>=0)return!1;const r=e.x,n=s.x,o=i.x,a=e.y,h=s.y,l=i.y,c=rn?r>o?r:o:n>o?n:o,p=a>h?a>l?a:l:h>l?h:l;let m=i.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&Jh(r,a,n,h,o,l,m.x,m.y)&&Yh(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function Lh(t,e,s,i){const r=t.prev,n=t,o=t.next;if(Yh(r,n,o)>=0)return!1;const a=r.x,h=n.x,l=o.x,c=r.y,u=n.y,d=o.y,p=ah?a>l?a:l:h>l?h:l,f=c>u?c>d?c:d:u>d?u:d,g=Hh(p,m,e,s,i),x=Hh(y,f,e,s,i);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=g&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=f&&b!==r&&b!==o&&Jh(a,c,h,u,l,d,b.x,b.y)&&Yh(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=f&&v!==r&&v!==o&&Jh(a,c,h,u,l,d,v.x,v.y)&&Yh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=g;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=f&&b!==r&&b!==o&&Jh(a,c,h,u,l,d,b.x,b.y)&&Yh(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=f&&v!==r&&v!==o&&Jh(a,c,h,u,l,d,v.x,v.y)&&Yh(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function Vh(t,e,s){let i=t;do{const r=i.prev,n=i.next.next;!Zh(r,n)&&Gh(r,i,i.next,n)&&Kh(r,n)&&Kh(n,r)&&(e.push(r.i/s|0),e.push(i.i/s|0),e.push(n.i/s|0),sl(i),sl(i.next),i=t=n),i=i.next}while(i!==t);return Oh(i)}function Wh(t,e,s,i,r,n){let o=t;do{let t=o.next.next;for(;t!==o.prev;){if(o.i!==t.i&&Xh(o,t)){let a=tl(o,t);return o=Oh(o,o.next),a=Oh(a,a.next),Fh(o,e,s,i,r,n,0),void Fh(a,e,s,i,r,n,0)}t=t.next}o=o.next}while(o!==t)}function jh(t,e){return t.x-e.x}function Uh(t,e){const s=function(t,e){let s,i=e,r=-1/0;const n=t.x,o=t.y;do{if(o<=i.y&&o>=i.next.y&&i.next.y!==i.y){const t=i.x+(o-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=n&&t>r&&(r=t,s=i.x=i.x&&i.x>=h&&n!==i.x&&Jh(os.x||i.x===s.x&&Dh(s,i)))&&(s=i,u=c)),i=i.next}while(i!==a);return s}(t,e);if(!s)return e;const i=tl(s,t);return Oh(i,i.next),Oh(s,s.next)}function Dh(t,e){return Yh(t.prev,t,e.prev)<0&&Yh(e.next,t,t.next)<0}function Hh(t,e,s,i,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-s)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-i)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function qh(t){let e=t,s=t;do{(e.x=(t-o)*(n-a)&&(t-o)*(i-a)>=(s-o)*(e-a)&&(s-o)*(n-a)>=(r-o)*(i-a)}function Xh(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let s=t;do{if(s.i!==t.i&&s.next.i!==t.i&&s.i!==e.i&&s.next.i!==e.i&&Gh(s,s.next,t,e))return!0;s=s.next}while(s!==t);return!1}(t,e)&&(Kh(t,e)&&Kh(e,t)&&function(t,e){let s=t,i=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{s.y>n!=s.next.y>n&&s.next.y!==s.y&&r<(s.next.x-s.x)*(n-s.y)/(s.next.y-s.y)+s.x&&(i=!i),s=s.next}while(s!==t);return i}(t,e)&&(Yh(t.prev,t,e.prev)||Yh(t,e.prev,e))||Zh(t,e)&&Yh(t.prev,t,t.next)>0&&Yh(e.prev,e,e.next)>0)}function Yh(t,e,s){return(e.y-t.y)*(s.x-e.x)-(e.x-t.x)*(s.y-e.y)}function Zh(t,e){return t.x===e.x&&t.y===e.y}function Gh(t,e,s,i){const r=Qh(Yh(t,e,s)),n=Qh(Yh(t,e,i)),o=Qh(Yh(s,i,t)),a=Qh(Yh(s,i,e));return r!==n&&o!==a||(!(0!==r||!$h(t,s,e))||(!(0!==n||!$h(t,i,e))||(!(0!==o||!$h(s,t,i))||!(0!==a||!$h(s,e,i)))))}function $h(t,e,s){return e.x<=Math.max(t.x,s.x)&&e.x>=Math.min(t.x,s.x)&&e.y<=Math.max(t.y,s.y)&&e.y>=Math.min(t.y,s.y)}function Qh(t){return t>0?1:t<0?-1:0}function Kh(t,e){return Yh(t.prev,t,t.next)<0?Yh(t,e,t.next)>=0&&Yh(t,t.prev,e)>=0:Yh(t,e,t.prev)<0||Yh(t,t.next,e)<0}function tl(t,e){const s=new il(t.i,t.x,t.y),i=new il(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,s.next=r,r.prev=s,i.next=s,s.prev=i,n.next=i,i.prev=n,i}function el(t,e,s,i){const r=new il(t,e,s);return i?(r.next=i.next,r.prev=i,i.next.prev=r,i.next=r):(r.prev=r,r.next=r),r}function sl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function il(t,e,s){this.i=t,this.x=e,this.y=s,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}class rl{static area(t){const e=t.length;let s=0;for(let i=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function ol(t,e){for(let s=0;sNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-a/u,m=e.y+o/u,y=((s.x-l/d-p)*l-(s.y+h/d-m)*h)/(o*l-a*h);i=p+o*y-t.x,r=m+a*y-t.y;const f=i*i+r*r;if(f<=2)return new Zs(i,r);n=Math.sqrt(f/2)}else{let t=!1;o>Number.EPSILON?h>Number.EPSILON&&(t=!0):o<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(a)===Math.sign(l)&&(t=!0),t?(i=-a,r=o,n=Math.sqrt(c)):(i=o,r=a,n=Math.sqrt(c/2))}return new Zs(i/n,r/n)}const k=[];for(let t=0,e=T.length,s=e-1,i=t+1;t=0;t--){const e=t/p,s=c*Math.cos(e*Math.PI/2),i=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=T.length;t=0;){const i=s;let r=s-1;r<0&&(r=t.length-1);for(let t=0,s=a+2*p;t0)&&d.push(e,r,h),(t!==s-1||a0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class Tl extends tn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new $r(16777215),this.specular=new $r(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class zl extends tn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new $r(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class Cl extends tn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class Il extends tn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new $r(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new $r(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new yr,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Bl extends tn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class kl extends tn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class El extends tn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new $r(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new Zs(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.flatShading=t.flatShading,this.fog=t.fog,this}}class Pl extends Sa{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function Rl(t,e,s){return!t||!s&&t.constructor===e?t:"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t)}function Ol(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Fl(t){const e=t.length,s=new Array(e);for(let t=0;t!==e;++t)s[t]=t;return s.sort((function(e,s){return t[e]-t[s]})),s}function Nl(t,e,s){const i=t.length,r=new t.constructor(i);for(let n=0,o=0;o!==i;++n){const i=s[n]*e;for(let s=0;s!==e;++s)r[o++]=t[i+s]}return r}function Ll(t,e,s,i){let r=1,n=t[0];for(;void 0!==n&&void 0===n[i];)n=t[r++];if(void 0===n)return;let o=n[i];if(void 0!==o)if(Array.isArray(o))do{o=n[i],void 0!==o&&(e.push(n.time),s.push.apply(s,o)),n=t[r++]}while(void 0!==n);else if(void 0!==o.toArray)do{o=n[i],void 0!==o&&(e.push(n.time),o.toArray(s,s.length)),n=t[r++]}while(void 0!==n);else do{o=n[i],void 0!==o&&(e.push(n.time),s.push(o)),n=t[r++]}while(void 0!==n)}const Vl={convertArray:Rl,isTypedArray:Ol,getKeyframeOrder:Fl,sortedArray:Nl,flattenJSON:Ll,subclip:function(t,e,s,i,r=30){const n=t.clone();n.name=e;const o=[];for(let t=0;t=i)){h.push(e.times[t]);for(let s=0;sn.tracks[t].times[0]&&(a=n.tracks[t].times[0]);for(let t=0;t=i.times[u]){const t=u*h+a,e=t+h-a;d=i.values.slice(t,e)}else{const t=i.createInterpolant(),e=a,s=h-a;t.evaluate(n),d=t.resultBuffer.slice(e,s)}if("quaternion"===r){(new Ci).fromArray(d).normalize().conjugate().toArray(d)}const p=o.times.length;for(let t=0;t=r)break t;{const o=e[1];t=r)break e}n=s,s=0}}for(;s>>1;te;)--n;if(++n,0!==r||n!==i){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=s.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),t=!1);const s=this.times,i=this.values,r=s.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const i=s[e];if("number"==typeof i&&isNaN(i)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,e,i),t=!1;break}if(null!==n&&n>i){console.error("THREE.KeyframeTrack: Out of order keys.",this,e,i,n),t=!1;break}n=i}if(void 0!==i&&Ol(i))for(let e=0,s=i.length;e!==s;++e){const s=i[e];if(isNaN(s)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,e,s),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),s=this.getValueSize(),i=this.getInterpolation()===Re,r=t.length-1;let n=1;for(let o=1;o0){t[n]=t[r];for(let t=r*s,i=n*s,o=0;o!==s;++o)e[i+o]=e[t+o];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*s)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),s=new(0,this.constructor)(this.name,t,e);return s.createInterpolant=this.createInterpolant,s}}Hl.prototype.TimeBufferType=Float32Array,Hl.prototype.ValueBufferType=Float32Array,Hl.prototype.DefaultInterpolation=Pe;class ql extends Hl{constructor(t,e,s){super(t,e,s)}}ql.prototype.ValueTypeName="bool",ql.prototype.ValueBufferType=Array,ql.prototype.DefaultInterpolation=Ee,ql.prototype.InterpolantFactoryMethodLinear=void 0,ql.prototype.InterpolantFactoryMethodSmooth=void 0;class Jl extends Hl{}Jl.prototype.ValueTypeName="color";class Xl extends Hl{}Xl.prototype.ValueTypeName="number";class Yl extends Wl{constructor(t,e,s,i){super(t,e,s,i)}interpolate_(t,e,s,i){const r=this.resultBuffer,n=this.sampleValues,o=this.valueSize,a=(s-e)/(i-e);let h=t*o;for(let t=h+o;h!==t;h+=4)Ci.slerpFlat(r,0,n,h-o,n,h,a);return r}}class Zl extends Hl{InterpolantFactoryMethodLinear(t){return new Yl(this.times,this.values,this.getValueSize(),t)}}Zl.prototype.ValueTypeName="quaternion",Zl.prototype.InterpolantFactoryMethodSmooth=void 0;class Gl extends Hl{constructor(t,e,s){super(t,e,s)}}Gl.prototype.ValueTypeName="string",Gl.prototype.ValueBufferType=Array,Gl.prototype.DefaultInterpolation=Ee,Gl.prototype.InterpolantFactoryMethodLinear=void 0,Gl.prototype.InterpolantFactoryMethodSmooth=void 0;class $l extends Hl{}$l.prototype.ValueTypeName="vector";class Ql{constructor(t="",e=-1,s=[],i=2500){this.name=t,this.tracks=s,this.duration=e,this.blendMode=i,this.uuid=Us(),this.duration<0&&this.resetDuration()}static parse(t){const e=[],s=t.tracks,i=1/(t.fps||1);for(let t=0,r=s.length;t!==r;++t)e.push(Kl(s[t]).scale(i));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r}static toJSON(t){const e=[],s=t.tracks,i={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode};for(let t=0,i=s.length;t!==i;++t)e.push(Hl.toJSON(s[t]));return i}static CreateFromMorphTargetSequence(t,e,s,i){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=i[t];e||(i[t]=e=[]),e.push(s)}}const n=[];for(const t in i)n.push(this.CreateFromMorphTargetSequence(t,i[t],e,s));return n}static parseAnimation(t,e){if(!t)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const s=function(t,e,s,i,r){if(0!==s.length){const n=[],o=[];Ll(s,n,o,i),0!==n.length&&r.push(new t(e,n,o))}},i=[],r=t.name||"default",n=t.fps||30,o=t.blendMode;let a=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)}),0),r;if(void 0!==rc[t])return void rc[t].push({onLoad:e,onProgress:s,onError:i});rc[t]=[],rc[t].push({onLoad:e,onProgress:s,onError:i});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"}),o=this.mimeType,a=this.responseType;fetch(n).then((e=>{if(200===e.status||0===e.status){if(0===e.status&&console.warn("THREE.FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const s=rc[t],i=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,o=0!==n;let a=0;const h=new ReadableStream({start(t){!function e(){i.read().then((({done:i,value:r})=>{if(i)t.close();else{a+=r.byteLength;const i=new ProgressEvent("progress",{lengthComputable:o,loaded:a,total:n});for(let t=0,e=s.length;t{t.error(e)}))}()}});return new Response(h)}throw new nc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)})).then((t=>{switch(a){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((t=>(new DOMParser).parseFromString(t,o)));case"json":return t.json();default:if(void 0===o)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(o),s=e&&e[1]?e[1].toLowerCase():void 0,i=new TextDecoder(s);return t.arrayBuffer().then((t=>i.decode(t)))}}})).then((e=>{tc.add(t,e);const s=rc[t];delete rc[t];for(let t=0,i=s.length;t{const s=rc[t];if(void 0===s)throw this.manager.itemError(t),e;delete rc[t];for(let t=0,i=s.length;t{this.manager.itemEnd(t)})),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}}class ac extends ic{constructor(t){super(t)}load(t,e,s,i){const r=this,n=new oc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(s){try{e(r.parse(JSON.parse(s)))}catch(e){i?i(e):console.error(e),r.manager.itemError(t)}}),s,i)}parse(t){const e=[];for(let s=0;s0:i.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(i.uniforms[e]={},r.type){case"t":i.uniforms[e].value=s(r.value);break;case"c":i.uniforms[e].value=(new $r).setHex(r.value);break;case"v2":i.uniforms[e].value=(new Zs).fromArray(r.value);break;case"v3":i.uniforms[e].value=(new Ii).fromArray(r.value);break;case"v4":i.uniforms[e].value=(new wi).fromArray(r.value);break;case"m3":i.uniforms[e].value=(new Gs).fromArray(r.value);break;case"m4":i.uniforms[e].value=(new nr).fromArray(r.value);break;default:i.uniforms[e].value=r.value}}if(void 0!==t.defines&&(i.defines=t.defines),void 0!==t.vertexShader&&(i.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(i.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(i.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)i.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(i.lights=t.lights),void 0!==t.clipping&&(i.clipping=t.clipping),void 0!==t.size&&(i.size=t.size),void 0!==t.sizeAttenuation&&(i.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(i.map=s(t.map)),void 0!==t.matcap&&(i.matcap=s(t.matcap)),void 0!==t.alphaMap&&(i.alphaMap=s(t.alphaMap)),void 0!==t.bumpMap&&(i.bumpMap=s(t.bumpMap)),void 0!==t.bumpScale&&(i.bumpScale=t.bumpScale),void 0!==t.normalMap&&(i.normalMap=s(t.normalMap)),void 0!==t.normalMapType&&(i.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),i.normalScale=(new Zs).fromArray(e)}return void 0!==t.displacementMap&&(i.displacementMap=s(t.displacementMap)),void 0!==t.displacementScale&&(i.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(i.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(i.roughnessMap=s(t.roughnessMap)),void 0!==t.metalnessMap&&(i.metalnessMap=s(t.metalnessMap)),void 0!==t.emissiveMap&&(i.emissiveMap=s(t.emissiveMap)),void 0!==t.emissiveIntensity&&(i.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(i.specularMap=s(t.specularMap)),void 0!==t.specularIntensityMap&&(i.specularIntensityMap=s(t.specularIntensityMap)),void 0!==t.specularColorMap&&(i.specularColorMap=s(t.specularColorMap)),void 0!==t.envMap&&(i.envMap=s(t.envMap)),void 0!==t.envMapRotation&&i.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(i.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(i.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(i.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(i.lightMap=s(t.lightMap)),void 0!==t.lightMapIntensity&&(i.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(i.aoMap=s(t.aoMap)),void 0!==t.aoMapIntensity&&(i.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(i.gradientMap=s(t.gradientMap)),void 0!==t.clearcoatMap&&(i.clearcoatMap=s(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(i.clearcoatRoughnessMap=s(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(i.clearcoatNormalMap=s(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(i.clearcoatNormalScale=(new Zs).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(i.iridescenceMap=s(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(i.iridescenceThicknessMap=s(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(i.transmissionMap=s(t.transmissionMap)),void 0!==t.thicknessMap&&(i.thicknessMap=s(t.thicknessMap)),void 0!==t.anisotropyMap&&(i.anisotropyMap=s(t.anisotropyMap)),void 0!==t.sheenColorMap&&(i.sheenColorMap=s(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(i.sheenRoughnessMap=s(t.sheenRoughnessMap)),i}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return Pc.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Ml,SpriteMaterial:ho,RawShaderMaterial:Sl,ShaderMaterial:Jn,PointsMaterial:Na,MeshPhysicalMaterial:Al,MeshStandardMaterial:_l,MeshPhongMaterial:Tl,MeshToonMaterial:zl,MeshNormalMaterial:Cl,MeshLambertMaterial:Il,MeshDepthMaterial:Bl,MeshDistanceMaterial:kl,MeshBasicMaterial:en,MeshMatcapMaterial:El,LineDashedMaterial:Pl,LineBasicMaterial:Sa,Material:tn}[t]}}class Rc{static decodeText(t){if(console.warn("THREE.LoaderUtils: decodeText() has been deprecated with r165 and will be removed with r175. Use TextDecoder instead."),"undefined"!=typeof TextDecoder)return(new TextDecoder).decode(t);let e="";for(let s=0,i=t.length;s0){const s=new ec(e);r=new lc(s),r.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e0){i=new lc(this.manager),i.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e{const e=new Ei;e.min.fromArray(t.boxMin),e.max.fromArray(t.boxMax);const s=new Gi;return s.radius=t.sphereRadius,s.center.fromArray(t.sphereCenter),{boxInitialized:t.boxInitialized,box:e,sphereInitialized:t.sphereInitialized,sphere:s}})),n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._geometryCount=t.geometryCount,n._matricesTexture=c(t.matricesTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid));break;case"LOD":n=new zo;break;case"Line":n=new ka(h(t.geometry),l(t.material));break;case"LineLoop":n=new Fa(h(t.geometry),l(t.material));break;case"LineSegments":n=new Oa(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new Ua(h(t.geometry),l(t.material));break;case"Sprite":n=new So(l(t.material));break;case"Group":n=new Ha;break;case"Bone":n=new Lo;break;default:n=new Er}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const o=t.children;for(let t=0;t{e&&e(s),r.manager.itemEnd(t)})).catch((t=>{i&&i(t)})):(setTimeout((function(){e&&e(n),r.manager.itemEnd(t)}),0),n);const o={};o.credentials="anonymous"===this.crossOrigin?"same-origin":"include",o.headers=this.requestHeader;const a=fetch(t,o).then((function(t){return t.blob()})).then((function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(s){return tc.add(t,s),e&&e(s),r.manager.itemEnd(t),s})).catch((function(e){i&&i(e),tc.remove(t),r.manager.itemError(t),r.manager.itemEnd(t)}));tc.add(t,a),r.manager.itemStart(t)}}let Uc;class Dc{static getContext(){return void 0===Uc&&(Uc=new(window.AudioContext||window.webkitAudioContext)),Uc}static setContext(t){Uc=t}}class Hc extends ic{constructor(t){super(t)}load(t,e,s,i){const r=this,n=new oc(this.manager);function o(e){i?i(e):console.error(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,(function(t){try{const s=t.slice(0);Dc.getContext().decodeAudioData(s,(function(t){e(t)})).catch(o)}catch(t){o(t)}}),s,i)}}const qc=new nr,Jc=new nr,Xc=new nr;class Yc{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new $n,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new $n,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,Xc.copy(t.projectionMatrix);const s=e.eyeSep/2,i=s*e.near/e.focus,r=e.near*Math.tan(Ws*e.fov*.5)/e.zoom;let n,o;Jc.elements[12]=-s,qc.elements[12]=s,n=-r*e.aspect+i,o=r*e.aspect+i,Xc.elements[0]=2*e.near/(o-n),Xc.elements[8]=(o+n)/(o-n),this.cameraL.projectionMatrix.copy(Xc),n=-r*e.aspect-i,o=r*e.aspect-i,Xc.elements[0]=2*e.near/(o-n),Xc.elements[8]=(o+n)/(o-n),this.cameraR.projectionMatrix.copy(Xc)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(Jc),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(qc)}}class Zc extends $n{constructor(t=[]){super(),this.isArrayCamera=!0,this.cameras=t}}class Gc{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=$c(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=$c();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}function $c(){return performance.now()}const Qc=new Ii,Kc=new Ci,tu=new Ii,eu=new Ii;class su extends Er{constructor(){super(),this.type="AudioListener",this.context=Dc.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new Gc}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener,s=this.up;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Qc,Kc,tu),eu.set(0,0,-1).applyQuaternion(Kc),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Qc.x,t),e.positionY.linearRampToValueAtTime(Qc.y,t),e.positionZ.linearRampToValueAtTime(Qc.z,t),e.forwardX.linearRampToValueAtTime(eu.x,t),e.forwardY.linearRampToValueAtTime(eu.y,t),e.forwardZ.linearRampToValueAtTime(eu.z,t),e.upX.linearRampToValueAtTime(s.x,t),e.upY.linearRampToValueAtTime(s.y,t),e.upZ.linearRampToValueAtTime(s.z,t)}else e.setPosition(Qc.x,Qc.y,Qc.z),e.setOrientation(eu.x,eu.y,eu.z,s.x,s.y,s.z)}}class iu extends Er{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(s,i,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(s[t]!==s[t+e]){o.setValue(s,i);break}}saveOriginalState(){const t=this.binding,e=this.buffer,s=this.valueSize,i=s*this._origIndex;t.getValue(e,i);for(let t=s,r=i;t!==r;++t)e[t]=e[i+t%s];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let s=t;s=.5)for(let i=0;i!==r;++i)t[e+i]=t[s+i]}_slerp(t,e,s,i){Ci.slerpFlat(t,e,t,e,t,s,i)}_slerpAdditive(t,e,s,i,r){const n=this._workIndex*r;Ci.multiplyQuaternionsFlat(t,n,t,e,t,s),Ci.slerpFlat(t,e,t,e,t,n,i)}_lerp(t,e,s,i,r){const n=1-i;for(let o=0;o!==r;++o){const r=e+o;t[r]=t[r]*n+t[s+o]*i}}_lerpAdditive(t,e,s,i,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[s+n]*i}}}const uu="\\[\\]\\.:\\/",du=new RegExp("["+uu+"]","g"),pu="[^"+uu+"]",mu="[^"+uu.replace("\\.","")+"]",yu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",pu)+/(WCOD+)?/.source.replace("WCOD",mu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",pu)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",pu)+"$"),fu=["material","materials","bones","map"];class gu{constructor(t,e,s){this.path=e,this.parsedPath=s||gu.parseTrackName(e),this.node=gu.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,s){return t&&t.isAnimationObjectGroup?new gu.Composite(t,e,s):new gu(t,e,s)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(du,"")}static parseTrackName(t){const e=yu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const s={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},i=s.nodeName&&s.nodeName.lastIndexOf(".");if(void 0!==i&&-1!==i){const t=s.nodeName.substring(i+1);-1!==fu.indexOf(t)&&(s.nodeName=s.nodeName.substring(0,i),s.objectName=t)}if(null===s.propertyName||0===s.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return s}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const s=t.skeleton.getBoneByName(e);if(void 0!==s)return s}if(t.children){const s=function(t){for(let i=0;i=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[a]=n,t[n]=o;for(let t=0,e=i;t!==e;++t){const e=s[t],i=e[n],r=e[h];e[h]=i,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,s=this._bindings,i=s.length;let r=this.nCachedObjects_,n=t.length;for(let o=0,a=arguments.length;o!==a;++o){const a=arguments[o].uuid,h=e[a];if(void 0!==h)if(delete e[a],h0&&(e[o.uuid]=h),t[h]=o,t.pop();for(let t=0,e=i;t!==e;++t){const e=s[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const s=this._bindingsIndicesByPath;let i=s[t];const r=this._bindings;if(void 0!==i)return r[i];const n=this._paths,o=this._parsedPaths,a=this._objects,h=a.length,l=this.nCachedObjects_,c=new Array(h);i=r.length,s[t]=i,n.push(t),o.push(e),r.push(c);for(let s=l,i=a.length;s!==i;++s){const i=a[s];c[s]=new gu(i,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,s=e[t];if(void 0!==s){const i=this._paths,r=this._parsedPaths,n=this._bindings,o=n.length-1,a=n[o];e[t[o]]=s,n[s]=a,n.pop(),r[s]=r[o],r.pop(),i[s]=i[o],i.pop()}}}class bu{constructor(t,e,s=null,i=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=s,this.blendMode=i;const r=e.tracks,n=r.length,o=new Array(n),a={endingStart:Oe,endingEnd:Oe};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);o[t]=e,e.settings=a}this._interpolantSettings=a,this._interpolants=o,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,s){if(t.fadeOut(e),this.fadeIn(e),s){const s=this._clip.duration,i=t._clip.duration,r=i/s,n=s/i;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,s){return t.crossFadeFrom(this,e,s)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,s){const i=this._mixer,r=i.time,n=this.timeScale;let o=this._timeScaleInterpolant;null===o&&(o=i._lendControlInterpolant(),this._timeScaleInterpolant=o);const a=o.parameterPositions,h=o.sampleValues;return a[0]=r,a[1]=r+s,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,s,i){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const i=(t-r)*s;i<0||0===s?e=0:(this._startTime=null,e=s*i)}e*=this._updateTimeScale(t);const n=this._updateTime(e),o=this._updateWeight(t);if(o>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===Ve)for(let s=0,i=t.length;s!==i;++s)t[s].evaluate(n),e[s].accumulateAdditive(o);else for(let s=0,r=t.length;s!==r;++s)t[s].evaluate(n),e[s].accumulate(i,o)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const s=this._weightInterpolant;if(null!==s){const i=s.evaluate(t)[0];e*=i,t>s.parameterPositions[1]&&(this.stopFading(),0===i&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const s=this._timeScaleInterpolant;if(null!==s){e*=s.evaluate(t)[0],t>s.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,s=this.loop;let i=this.time+t,r=this._loopCount;const n=2202===s;if(0===t)return-1===r||!n||1&~r?i:e-i;if(2200===s){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(i>=e)i=e;else{if(!(i<0)){this.time=i;break t}i=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),i>=e||i<0){const s=Math.floor(i/e);i-=e*s,r+=Math.abs(s);const o=this.repetitions-r;if(o<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,i=t>0?e:0,this.time=i,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===o){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=i,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:s})}}else this.time=i;if(n&&!(1&~r))return e-i}return i}_setEndings(t,e,s){const i=this._interpolantSettings;s?(i.endingStart=Fe,i.endingEnd=Fe):(i.endingStart=t?this.zeroSlopeAtStart?Fe:Oe:Ne,i.endingEnd=e?this.zeroSlopeAtEnd?Fe:Oe:Ne)}_scheduleFading(t,e,s){const i=this._mixer,r=i.time;let n=this._weightInterpolant;null===n&&(n=i._lendControlInterpolant(),this._weightInterpolant=n);const o=n.parameterPositions,a=n.sampleValues;return o[0]=r,a[0]=e,o[1]=r+t,a[1]=s,this}}const vu=new Float32Array(1);class wu extends Ns{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(t,e){const s=t._localRoot||this._root,i=t._clip.tracks,r=i.length,n=t._propertyBindings,o=t._interpolants,a=s.uuid,h=this._bindingsByRootAndName;let l=h[a];void 0===l&&(l={},h[a]=l);for(let t=0;t!==r;++t){const r=i[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,a,h));continue}const i=e&&e._propertyBindings[t].binding.parsedPath;c=new cu(gu.create(s,h,i),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,a,h),n[t]=c}o[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,s=t._clip.uuid,i=this._actionsByClip[s];this._bindAction(t,i&&i.knownActions[0]),this._addInactiveAction(t,s,e)}const e=t._propertyBindings;for(let t=0,s=e.length;t!==s;++t){const s=e[t];0==s.useCount++&&(this._lendBinding(s),s.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,s=e.length;t!==s;++t){const s=e[t];0==--s.useCount&&(s.restoreOriginalState(),this._takeBackBinding(s))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,s=this._nActiveActions,i=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let o=0;o!==s;++o){e[o]._update(i,t,r,n)}const o=this._bindings,a=this._nActiveBindings;for(let t=0;t!==a;++t)o[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,Ru).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const Fu=new Ii,Nu=new Ii;class Lu{constructor(t=new Ii,e=new Ii){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){Fu.subVectors(t,this.start),Nu.subVectors(this.end,this.start);const s=Nu.dot(Nu);let i=Nu.dot(Fu)/s;return e&&(i=Ds(i,0,1)),i}closestPointToPoint(t,e,s){const i=this.closestPointToPointParameter(t,e);return this.delta(s).multiplyScalar(i).add(this.start)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const Vu=new Ii;class Wu extends Er{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const s=new zn,i=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,s=32;t1)for(let s=0;s.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{ud.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(ud,e)}}setLength(t,e=.2*t,s=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(s,e,s),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class yd extends Oa{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],s=new zn;s.setAttribute("position",new bn(e,3)),s.setAttribute("color",new bn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(s,new Sa({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,s){const i=new $r,r=this.geometry.attributes.color.array;return i.set(t),i.toArray(r,0),i.toArray(r,3),i.set(e),i.toArray(r,6),i.toArray(r,9),i.set(s),i.toArray(r,12),i.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class fd{constructor(){this.type="ShapePath",this.color=new $r,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new bh,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,s,i){return this.currentPath.quadraticCurveTo(t,e,s,i),this}bezierCurveTo(t,e,s,i,r,n){return this.currentPath.bezierCurveTo(t,e,s,i,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const s=e.length;let i=!1;for(let r=s-1,n=0;nNumber.EPSILON){if(h<0&&(s=e[n],a=-a,o=e[r],h=-h),t.yo.y)continue;if(t.y===s.y){if(t.x===s.x)return!0}else{const e=h*(t.x-s.x)-a*(t.y-s.y);if(0===e)return!0;if(e<0)continue;i=!i}}else{if(t.y!==s.y)continue;if(o.x<=t.x&&t.x<=s.x||s.x<=t.x&&t.x<=o.x)return!0}}return i}const s=rl.isClockWise,i=this.subPaths;if(0===i.length)return[];let r,n,o;const a=[];if(1===i.length)return n=i[0],o=new Eh,o.curves=n.curves,a.push(o),a;let h=!s(i[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,o=i.length;e1){let t=!1,s=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=s/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/s,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t},cover:function(t,e){const s=t.image&&t.image.width?t.image.width/t.image.height:1;return s>e?(t.repeat.x=e/s,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=s/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t},fill:function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t},getByteLength:xd};"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{et as ACESFilmicToneMapping,v as AddEquation,G as AddOperation,Ve as AdditiveAnimationBlendMode,f as AdditiveBlending,it as AgXToneMapping,Lt as AlphaFormat,Ss as AlwaysCompare,j as AlwaysDepth,ys as AlwaysStencilFunc,Ic as AmbientLight,bu as AnimationAction,Ql as AnimationClip,ac as AnimationLoader,wu as AnimationMixer,xu as AnimationObjectGroup,Vl as AnimationUtils,th as ArcCurve,Zc as ArrayCamera,md as ArrowHelper,nt as AttachedBindMode,iu as Audio,lu as AudioAnalyser,Dc as AudioContext,su as AudioListener,Hc as AudioLoader,yd as AxesHelper,d as BackSide,De as BasicDepthPacking,a as BasicShadowMap,Ma as BatchedMesh,Lo as Bone,ql as BooleanKeyframeTrack,Ou as Box2,Ei as Box3,ld as Box3Helper,jn as BoxGeometry,hd as BoxHelper,cn as BufferAttribute,zn as BufferGeometry,Fc as BufferGeometryLoader,zt as ByteType,tc as Cache,Xn as Camera,nd as CameraHelper,Ga as CanvasTexture,wh as CapsuleGeometry,oh as CatmullRomCurve3,tt as CineonToneMapping,Mh as CircleGeometry,mt as ClampToEdgeWrapping,Gc as Clock,$r as Color,Jl as ColorKeyframeTrack,ui as ColorManagement,Ya as CompressedArrayTexture,Za as CompressedCubeTexture,Xa as CompressedTexture,hc as CompressedTextureLoader,_h as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,gd as Controls,Kn as CubeCamera,ht as CubeReflectionMapping,lt as CubeRefractionMapping,to as CubeTexture,cc as CubeTextureLoader,dt as CubeUVReflectionMapping,ch as CubicBezierCurve,uh as CubicBezierCurve3,jl as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,o as CullFaceFrontBack,i as CullFaceNone,Qa as Curve,xh as CurvePath,b as CustomBlending,st as CustomToneMapping,Sh as CylinderGeometry,Eu as Cylindrical,Ti as Data3DTexture,_i as DataArrayTexture,Vo as DataTexture,uc as DataTextureLoader,an as DataUtils,rs as DecrementStencilOp,os as DecrementWrapStencilOp,sc as DefaultLoadingManager,Dt as DepthFormat,Ht as DepthStencilFormat,$a as DepthTexture,ot as DetachedBindMode,Cc as DirectionalLight,sd as DirectionalLightHelper,Dl as DiscreteInterpolant,Th as DodecahedronGeometry,p as DoubleSide,k as DstAlphaFactor,P as DstColorFactor,ks as DynamicCopyUsage,As as DynamicDrawUsage,Cs as DynamicReadUsage,kh as EdgesGeometry,Ka as EllipseCurve,xs as EqualCompare,H as EqualDepth,cs as EqualStencilFunc,ct as EquirectangularReflectionMapping,ut as EquirectangularRefractionMapping,yr as Euler,Ns as EventDispatcher,al as ExtrudeGeometry,oc as FileLoader,xn as Float16BufferAttribute,bn as Float32BufferAttribute,Et as FloatType,io as Fog,so as FogExp2,Ja as FramebufferTexture,u as FrontSide,ra as Frustum,Tu as GLBufferAttribute,Ps as GLSL1,Rs as GLSL3,vs as GreaterCompare,J as GreaterDepth,Ms as GreaterEqualCompare,q as GreaterEqualDepth,ms as GreaterEqualStencilFunc,ds as GreaterStencilFunc,$u as GridHelper,Ha as Group,Pt as HalfFloatType,mc as HemisphereLight,Gu as HemisphereLightHelper,ll as IcosahedronGeometry,jc as ImageBitmapLoader,lc as ImageLoader,yi as ImageUtils,is as IncrementStencilOp,ns as IncrementWrapStencilOp,Do as InstancedBufferAttribute,Oc as InstancedBufferGeometry,Au as InstancedInterleavedBuffer,$o as InstancedMesh,mn as Int16BufferAttribute,fn as Int32BufferAttribute,un as Int8BufferAttribute,Bt as IntType,no as InterleavedBuffer,ao as InterleavedBufferAttribute,Wl as Interpolant,Ee as InterpolateDiscrete,Pe as InterpolateLinear,Re as InterpolateSmooth,as as InvertStencilOp,es as KeepStencilOp,Hl as KeyframeTrack,zo as LOD,vh as LatheGeometry,fr as Layers,gs as LessCompare,U as LessDepth,bs as LessEqualCompare,D as LessEqualDepth,us as LessEqualStencilFunc,ls as LessStencilFunc,pc as Light,Ec as LightProbe,ka as Line,Lu as Line3,Sa as LineBasicMaterial,dh as LineCurve,ph as LineCurve3,Pl as LineDashedMaterial,Fa as LineLoop,Oa as LineSegments,wt as LinearFilter,Ul as LinearInterpolant,At as LinearMipMapLinearFilter,St as LinearMipMapNearestFilter,_t as LinearMipmapLinearFilter,Mt as LinearMipmapNearestFilter,$e as LinearSRGBColorSpace,Q as LinearToneMapping,Qe as LinearTransfer,ic as Loader,Rc as LoaderUtils,ec as LoadingManager,Ie as LoopOnce,ke as LoopPingPong,Be as LoopRepeat,Ut as LuminanceAlphaFormat,jt as LuminanceFormat,e as MOUSE,tn as Material,Pc as MaterialLoader,Ys as MathUtils,Pu as Matrix2,Gs as Matrix3,nr as Matrix4,_ as MaxEquation,Vn as Mesh,en as MeshBasicMaterial,Bl as MeshDepthMaterial,kl as MeshDistanceMaterial,Il as MeshLambertMaterial,El as MeshMatcapMaterial,Cl as MeshNormalMaterial,Tl as MeshPhongMaterial,Al as MeshPhysicalMaterial,_l as MeshStandardMaterial,zl as MeshToonMaterial,S as MinEquation,yt as MirroredRepeatWrapping,Z as MixOperation,x as MultiplyBlending,Y as MultiplyOperation,ft as NearestFilter,vt as NearestMipMapLinearFilter,xt as NearestMipMapNearestFilter,bt as NearestMipmapLinearFilter,gt as NearestMipmapNearestFilter,rt as NeutralToneMapping,fs as NeverCompare,W as NeverDepth,hs as NeverStencilFunc,m as NoBlending,Ze as NoColorSpace,$ as NoToneMapping,Le as NormalAnimationBlendMode,y as NormalBlending,ws as NotEqualCompare,X as NotEqualDepth,ps as NotEqualStencilFunc,Xl as NumberKeyframeTrack,Er as Object3D,Nc as ObjectLoader,Ye as ObjectSpaceNormalMap,cl as OctahedronGeometry,T as OneFactor,V as OneMinusConstantAlphaFactor,N as OneMinusConstantColorFactor,E as OneMinusDstAlphaFactor,R as OneMinusDstColorFactor,B as OneMinusSrcAlphaFactor,C as OneMinusSrcColorFactor,Tc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,bh as Path,$n as PerspectiveCamera,ea as Plane,ul as PlaneGeometry,cd as PlaneHelper,Ac as PointLight,Ju as PointLightHelper,Ua as Points,Na as PointsMaterial,Qu as PolarGridHelper,Ah as PolyhedronGeometry,hu as PositionalAudio,gu as PropertyBinding,cu as PropertyMixer,mh as QuadraticBezierCurve,yh as QuadraticBezierCurve3,Ci as Quaternion,Zl as QuaternionKeyframeTrack,Yl as QuaternionLinearInterpolant,js as RAD2DEG,ze as RED_GREEN_RGTC2_Format,Ae as RED_RGTC1_Format,t as REVISION,He as RGBADepthPacking,Wt as RGBAFormat,Gt as RGBAIntegerFormat,be as RGBA_ASTC_10x10_Format,fe as RGBA_ASTC_10x5_Format,ge as RGBA_ASTC_10x6_Format,xe as RGBA_ASTC_10x8_Format,ve as RGBA_ASTC_12x10_Format,we as RGBA_ASTC_12x12_Format,he as RGBA_ASTC_4x4_Format,le as RGBA_ASTC_5x4_Format,ce as RGBA_ASTC_5x5_Format,ue as RGBA_ASTC_6x5_Format,de as RGBA_ASTC_6x6_Format,pe as RGBA_ASTC_8x5_Format,me as RGBA_ASTC_8x6_Format,ye as RGBA_ASTC_8x8_Format,Me as RGBA_BPTC_Format,ae as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,ie as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,qe as RGBDepthPacking,Vt as RGBFormat,Zt as RGBIntegerFormat,Se as RGB_BPTC_SIGNED_Format,_e as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,oe as RGB_ETC2_Format,se as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Je as RGDepthPacking,Xt as RGFormat,Yt as RGIntegerFormat,Sl as RawShaderMaterial,rr as Ray,Cu as Raycaster,Bc as RectAreaLight,qt as RedFormat,Jt as RedIntegerFormat,K as ReinhardToneMapping,Mi as RenderTarget,pt as RepeatWrapping,ss as ReplaceStencilOp,M as ReverseSubtractEquation,dl as RingGeometry,Ce as SIGNED_RED_GREEN_RGTC2_Format,Te as SIGNED_RED_RGTC1_Format,Ge as SRGBColorSpace,Ke as SRGBTransfer,ro as Scene,Jn as ShaderMaterial,Ml as ShadowMaterial,Eh as Shape,pl as ShapeGeometry,fd as ShapePath,rl as ShapeUtils,Ct as ShortType,Uo as Skeleton,Hu as SkeletonHelper,No as SkinnedMesh,gi as Source,Gi as Sphere,ml as SphereGeometry,ku as Spherical,kc as SphericalHarmonics3,fh as SplineCurve,vc as SpotLight,Wu as SpotLightHelper,So as Sprite,ho as SpriteMaterial,I as SrcAlphaFactor,O as SrcAlphaSaturateFactor,z as SrcColorFactor,Bs as StaticCopyUsage,_s as StaticDrawUsage,zs as StaticReadUsage,Yc as StereoCamera,Es as StreamCopyUsage,Ts as StreamDrawUsage,Is as StreamReadUsage,Gl as StringKeyframeTrack,w as SubtractEquation,g as SubtractiveBlending,s as TOUCH,Xe as TangentSpaceNormalMap,yl as TetrahedronGeometry,vi as Texture,dc as TextureLoader,bd as TextureUtils,fl as TorusGeometry,gl as TorusKnotGeometry,Jr as Triangle,Ue as TriangleFanDrawMode,je as TriangleStripDrawMode,We as TrianglesDrawMode,xl as TubeGeometry,at as UVMapping,yn as Uint16BufferAttribute,gn as Uint32BufferAttribute,dn as Uint8BufferAttribute,pn as Uint8ClampedBufferAttribute,Mu as Uniform,_u as UniformsGroup,qn as UniformsUtils,Tt as UnsignedByteType,Ft as UnsignedInt248Type,Nt as UnsignedInt5999Type,kt as UnsignedIntType,Rt as UnsignedShort4444Type,Ot as UnsignedShort5551Type,It as UnsignedShortType,c as VSMShadowMap,Zs as Vector2,Ii as Vector3,wi as Vector4,$l as VectorKeyframeTrack,qa as VideoTexture,zi as WebGL3DRenderTarget,Ai as WebGLArrayRenderTarget,Os as WebGLCoordinateSystem,eo as WebGLCubeRenderTarget,Si as WebGLRenderTarget,Fs as WebGPUCoordinateSystem,bl as WireframeGeometry,Ne as WrapAroundEnding,Oe as ZeroCurvatureEnding,A as ZeroFactor,Fe as ZeroSlopeEnding,ts as ZeroStencilOp,Qs as arrayNeedsUint32,Un as cloneUniforms,si as createCanvasElement,ei as createElementNS,xd as getByteLength,Hn as getUnlitUniformColorSpace,Dn as mergeUniforms,ni as probeAsync,oi as toNormalizedProjectionMatrix,ai as toReversedProjectionMatrix,ri as warnOnce}; diff --git a/build/three.tsl.js b/build/three.tsl.js index b2b17410ead665..2fbbf3bc3c1b13 100644 --- a/build/three.tsl.js +++ b/build/three.tsl.js @@ -412,6 +412,7 @@ const select = TSL.select; const setCurrentStack = TSL.setCurrentStack; const shaderStages = TSL.shaderStages; const shadow = TSL.shadow; +const shadowWorldPosition = TSL.shadowWorldPosition; const sharedUniformGroup = TSL.sharedUniformGroup; const sheen = TSL.sheen; const sheenRoughness = TSL.sheenRoughness; @@ -530,4 +531,4 @@ const workgroupId = TSL.workgroupId; const workingToColorSpace = TSL.workingToColorSpace; const xor = TSL.xor; -export { BRDF_GGX, BRDF_Lambert, BasicShadowFilter, Break, Continue, DFGApprox, D_GGX, Discard, EPSILON, F_Schlick, Fn, INFINITY, If, Loop, NodeAccess, NodeShaderStage, NodeType, NodeUpdateType, PCFShadowFilter, PCFSoftShadowFilter, PI, PI2, Return, Schlick_to_F0, ScriptableNodeResources, ShaderNode, TBNViewMatrix, VSMShadowFilter, V_GGX_SmithCorrelated, abs, acesFilmicToneMapping, acos, add, addMethodChaining, addNodeElement, agxToneMapping, all, alphaT, and, anisotropy, anisotropyB, anisotropyT, any, append, arrayBuffer, asin, assign, atan, atan2, atomicAdd, atomicAnd, atomicFunc, atomicMax, atomicMin, atomicOr, atomicStore, atomicSub, atomicXor, attenuationColor, attenuationDistance, attribute, attributeArray, backgroundBlurriness, backgroundIntensity, backgroundRotation, batch, billboarding, bitAnd, bitNot, bitOr, bitXor, bitangentGeometry, bitangentLocal, bitangentView, bitangentWorld, bitcast, blendBurn, blendColor, blendDodge, blendOverlay, blendScreen, blur, bool, buffer, bufferAttribute, bumpMap, burn, bvec2, bvec3, bvec4, bypass, cache, call, cameraFar, cameraNear, cameraNormalMatrix, cameraPosition, cameraProjectionMatrix, cameraProjectionMatrixInverse, cameraViewMatrix, cameraWorldMatrix, cbrt, cdl, ceil, checker, cineonToneMapping, clamp, clearcoat, clearcoatRoughness, code, color, colorSpaceToWorking, colorToDirection, compute, cond, context, convert, convertColorSpace, convertToTexture, cos, cross, cubeTexture, dFdx, dFdy, dashSize, defaultBuildStages, defaultShaderStages, defined, degrees, deltaTime, densityFog, depth, depthPass, difference, diffuseColor, directPointLight, directionToColor, dispersion, distance, div, dodge, dot, drawIndex, dynamicBufferAttribute, element, emissive, equal, equals, equirectUV, exp, exp2, expression, faceDirection, faceForward, float, floor, fog, fract, frameGroup, frameId, frontFacing, fwidth, gain, gapSize, getConstNodeType, getCurrentStack, getDirection, getDistanceAttenuation, getGeometryRoughness, getNormalFromDepth, getParallaxCorrectNormal, getRoughness, getScreenPosition, getShIrradianceAt, getTextureIndex, getViewPosition, glsl, glslFn, grayscale, greaterThan, greaterThanEqual, hash, highPrecisionModelNormalViewMatrix, highPrecisionModelViewMatrix, hue, instance, instanceIndex, instancedArray, instancedBufferAttribute, instancedDynamicBufferAttribute, instancedMesh, int, inverseSqrt, invocationLocalIndex, invocationSubgroupIndex, ior, iridescence, iridescenceIOR, iridescenceThickness, ivec2, ivec3, ivec4, js, label, length, lengthSq, lessThan, lessThanEqual, lightPosition, lightTargetDirection, lightTargetPosition, lightViewPosition, lightingContext, lights, linearDepth, linearToneMapping, localId, log, log2, logarithmicDepthToViewZ, loop, luminance, mat2, mat3, mat4, matcapUV, materialAOMap, materialAlphaTest, materialAnisotropy, materialAnisotropyVector, materialAttenuationColor, materialAttenuationDistance, materialClearcoat, materialClearcoatNormal, materialClearcoatRoughness, materialColor, materialDispersion, materialEmissive, materialIOR, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialLightMap, materialLineDashOffset, materialLineDashSize, materialLineGapSize, materialLineScale, materialLineWidth, materialMetalness, materialNormal, materialOpacity, materialPointWidth, materialReference, materialReflectivity, materialRefractionRatio, materialRotation, materialRoughness, materialSheen, materialSheenRoughness, materialShininess, materialSpecular, materialSpecularColor, materialSpecularIntensity, materialSpecularStrength, materialThickness, materialTransmission, max, maxMipLevel, metalness, min, mix, mixElement, mod, modInt, modelDirection, modelNormalMatrix, modelPosition, modelScale, modelViewMatrix, modelViewPosition, modelViewProjection, modelWorldMatrix, modelWorldMatrixInverse, morphReference, mrt, mul, mx_aastep, mx_cell_noise_float, mx_contrast, mx_fractal_noise_float, mx_fractal_noise_vec2, mx_fractal_noise_vec3, mx_fractal_noise_vec4, mx_hsvtorgb, mx_noise_float, mx_noise_vec3, mx_noise_vec4, mx_ramplr, mx_ramptb, mx_rgbtohsv, mx_safepower, mx_splitlr, mx_splittb, mx_srgb_texture_to_lin_rec709, mx_transform_uv, mx_worley_noise_float, mx_worley_noise_vec2, mx_worley_noise_vec3, negate, neutralToneMapping, nodeArray, nodeImmutable, nodeObject, nodeObjects, nodeProxy, normalFlat, normalGeometry, normalLocal, normalMap, normalView, normalWorld, normalize, not, notEqual, numWorkgroups, objectDirection, objectGroup, objectPosition, objectScale, objectViewPosition, objectWorldMatrix, oneMinus, or, orthographicDepthToViewZ, oscSawtooth, oscSine, oscSquare, oscTriangle, output, outputStruct, overlay, overloadingFn, parabola, parallaxDirection, parallaxUV, parameter, pass, passTexture, pcurve, perspectiveDepthToViewZ, pmremTexture, pointUV, pointWidth, positionGeometry, positionLocal, positionPrevious, positionView, positionViewDirection, positionWorld, positionWorldDirection, posterize, pow, pow2, pow3, pow4, property, radians, rand, range, rangeFog, reciprocal, reference, referenceBuffer, reflect, reflectVector, reflectView, reflector, refract, refractVector, refractView, reinhardToneMapping, remainder, remap, remapClamp, renderGroup, renderOutput, rendererReference, rotate, rotateUV, roughness, round, rtt, sRGBTransferEOTF, sRGBTransferOETF, sampler, saturate, saturation, screen, screenCoordinate, screenSize, screenUV, scriptable, scriptableValue, select, setCurrentStack, shaderStages, shadow, sharedUniformGroup, sheen, sheenRoughness, shiftLeft, shiftRight, shininess, sign, sin, sinc, skinning, skinningReference, smoothstep, smoothstepElement, specularColor, specularF90, spherizeUV, split, spritesheetUV, sqrt, stack, step, storage, storageBarrier, storageObject, storageTexture, string, sub, subgroupIndex, subgroupSize, tan, tangentGeometry, tangentLocal, tangentView, tangentWorld, temp, texture, texture3D, textureBarrier, textureBicubic, textureCubeUV, textureLoad, textureSize, textureStore, thickness, threshold, time, timerDelta, timerGlobal, timerLocal, toOutputColorSpace, toWorkingColorSpace, toneMapping, toneMappingExposure, toonOutlinePass, transformDirection, transformNormal, transformNormalToView, transformedBentNormalView, transformedBitangentView, transformedBitangentWorld, transformedClearcoatNormalView, transformedNormalView, transformedNormalWorld, transformedTangentView, transformedTangentWorld, transmission, transpose, tri, tri3, triNoise3D, triplanarTexture, triplanarTextures, trunc, tslFn, uint, uniform, uniformArray, uniformGroup, uniforms, userData, uv, uvec2, uvec3, uvec4, varying, varyingProperty, vec2, vec3, vec4, vectorComponents, velocity, vertexColor, vertexIndex, vibrance, viewZToLogarithmicDepth, viewZToOrthographicDepth, viewZToPerspectiveDepth, viewport, viewportBottomLeft, viewportCoordinate, viewportDepthTexture, viewportLinearDepth, viewportMipTexture, viewportResolution, viewportSafeUV, viewportSharedTexture, viewportSize, viewportTexture, viewportTopLeft, viewportUV, wgsl, wgslFn, workgroupArray, workgroupBarrier, workgroupId, workingToColorSpace, xor }; +export { BRDF_GGX, BRDF_Lambert, BasicShadowFilter, Break, Continue, DFGApprox, D_GGX, Discard, EPSILON, F_Schlick, Fn, INFINITY, If, Loop, NodeAccess, NodeShaderStage, NodeType, NodeUpdateType, PCFShadowFilter, PCFSoftShadowFilter, PI, PI2, Return, Schlick_to_F0, ScriptableNodeResources, ShaderNode, TBNViewMatrix, VSMShadowFilter, V_GGX_SmithCorrelated, abs, acesFilmicToneMapping, acos, add, addMethodChaining, addNodeElement, agxToneMapping, all, alphaT, and, anisotropy, anisotropyB, anisotropyT, any, append, arrayBuffer, asin, assign, atan, atan2, atomicAdd, atomicAnd, atomicFunc, atomicMax, atomicMin, atomicOr, atomicStore, atomicSub, atomicXor, attenuationColor, attenuationDistance, attribute, attributeArray, backgroundBlurriness, backgroundIntensity, backgroundRotation, batch, billboarding, bitAnd, bitNot, bitOr, bitXor, bitangentGeometry, bitangentLocal, bitangentView, bitangentWorld, bitcast, blendBurn, blendColor, blendDodge, blendOverlay, blendScreen, blur, bool, buffer, bufferAttribute, bumpMap, burn, bvec2, bvec3, bvec4, bypass, cache, call, cameraFar, cameraNear, cameraNormalMatrix, cameraPosition, cameraProjectionMatrix, cameraProjectionMatrixInverse, cameraViewMatrix, cameraWorldMatrix, cbrt, cdl, ceil, checker, cineonToneMapping, clamp, clearcoat, clearcoatRoughness, code, color, colorSpaceToWorking, colorToDirection, compute, cond, context, convert, convertColorSpace, convertToTexture, cos, cross, cubeTexture, dFdx, dFdy, dashSize, defaultBuildStages, defaultShaderStages, defined, degrees, deltaTime, densityFog, depth, depthPass, difference, diffuseColor, directPointLight, directionToColor, dispersion, distance, div, dodge, dot, drawIndex, dynamicBufferAttribute, element, emissive, equal, equals, equirectUV, exp, exp2, expression, faceDirection, faceForward, float, floor, fog, fract, frameGroup, frameId, frontFacing, fwidth, gain, gapSize, getConstNodeType, getCurrentStack, getDirection, getDistanceAttenuation, getGeometryRoughness, getNormalFromDepth, getParallaxCorrectNormal, getRoughness, getScreenPosition, getShIrradianceAt, getTextureIndex, getViewPosition, glsl, glslFn, grayscale, greaterThan, greaterThanEqual, hash, highPrecisionModelNormalViewMatrix, highPrecisionModelViewMatrix, hue, instance, instanceIndex, instancedArray, instancedBufferAttribute, instancedDynamicBufferAttribute, instancedMesh, int, inverseSqrt, invocationLocalIndex, invocationSubgroupIndex, ior, iridescence, iridescenceIOR, iridescenceThickness, ivec2, ivec3, ivec4, js, label, length, lengthSq, lessThan, lessThanEqual, lightPosition, lightTargetDirection, lightTargetPosition, lightViewPosition, lightingContext, lights, linearDepth, linearToneMapping, localId, log, log2, logarithmicDepthToViewZ, loop, luminance, mat2, mat3, mat4, matcapUV, materialAOMap, materialAlphaTest, materialAnisotropy, materialAnisotropyVector, materialAttenuationColor, materialAttenuationDistance, materialClearcoat, materialClearcoatNormal, materialClearcoatRoughness, materialColor, materialDispersion, materialEmissive, materialIOR, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialLightMap, materialLineDashOffset, materialLineDashSize, materialLineGapSize, materialLineScale, materialLineWidth, materialMetalness, materialNormal, materialOpacity, materialPointWidth, materialReference, materialReflectivity, materialRefractionRatio, materialRotation, materialRoughness, materialSheen, materialSheenRoughness, materialShininess, materialSpecular, materialSpecularColor, materialSpecularIntensity, materialSpecularStrength, materialThickness, materialTransmission, max, maxMipLevel, metalness, min, mix, mixElement, mod, modInt, modelDirection, modelNormalMatrix, modelPosition, modelScale, modelViewMatrix, modelViewPosition, modelViewProjection, modelWorldMatrix, modelWorldMatrixInverse, morphReference, mrt, mul, mx_aastep, mx_cell_noise_float, mx_contrast, mx_fractal_noise_float, mx_fractal_noise_vec2, mx_fractal_noise_vec3, mx_fractal_noise_vec4, mx_hsvtorgb, mx_noise_float, mx_noise_vec3, mx_noise_vec4, mx_ramplr, mx_ramptb, mx_rgbtohsv, mx_safepower, mx_splitlr, mx_splittb, mx_srgb_texture_to_lin_rec709, mx_transform_uv, mx_worley_noise_float, mx_worley_noise_vec2, mx_worley_noise_vec3, negate, neutralToneMapping, nodeArray, nodeImmutable, nodeObject, nodeObjects, nodeProxy, normalFlat, normalGeometry, normalLocal, normalMap, normalView, normalWorld, normalize, not, notEqual, numWorkgroups, objectDirection, objectGroup, objectPosition, objectScale, objectViewPosition, objectWorldMatrix, oneMinus, or, orthographicDepthToViewZ, oscSawtooth, oscSine, oscSquare, oscTriangle, output, outputStruct, overlay, overloadingFn, parabola, parallaxDirection, parallaxUV, parameter, pass, passTexture, pcurve, perspectiveDepthToViewZ, pmremTexture, pointUV, pointWidth, positionGeometry, positionLocal, positionPrevious, positionView, positionViewDirection, positionWorld, positionWorldDirection, posterize, pow, pow2, pow3, pow4, property, radians, rand, range, rangeFog, reciprocal, reference, referenceBuffer, reflect, reflectVector, reflectView, reflector, refract, refractVector, refractView, reinhardToneMapping, remainder, remap, remapClamp, renderGroup, renderOutput, rendererReference, rotate, rotateUV, roughness, round, rtt, sRGBTransferEOTF, sRGBTransferOETF, sampler, saturate, saturation, screen, screenCoordinate, screenSize, screenUV, scriptable, scriptableValue, select, setCurrentStack, shaderStages, shadow, shadowWorldPosition, sharedUniformGroup, sheen, sheenRoughness, shiftLeft, shiftRight, shininess, sign, sin, sinc, skinning, skinningReference, smoothstep, smoothstepElement, specularColor, specularF90, spherizeUV, split, spritesheetUV, sqrt, stack, step, storage, storageBarrier, storageObject, storageTexture, string, sub, subgroupIndex, subgroupSize, tan, tangentGeometry, tangentLocal, tangentView, tangentWorld, temp, texture, texture3D, textureBarrier, textureBicubic, textureCubeUV, textureLoad, textureSize, textureStore, thickness, threshold, time, timerDelta, timerGlobal, timerLocal, toOutputColorSpace, toWorkingColorSpace, toneMapping, toneMappingExposure, toonOutlinePass, transformDirection, transformNormal, transformNormalToView, transformedBentNormalView, transformedBitangentView, transformedBitangentWorld, transformedClearcoatNormalView, transformedNormalView, transformedNormalWorld, transformedTangentView, transformedTangentWorld, transmission, transpose, tri, tri3, triNoise3D, triplanarTexture, triplanarTextures, trunc, tslFn, uint, uniform, uniformArray, uniformGroup, uniforms, userData, uv, uvec2, uvec3, uvec4, varying, varyingProperty, vec2, vec3, vec4, vectorComponents, velocity, vertexColor, vertexIndex, vibrance, viewZToLogarithmicDepth, viewZToOrthographicDepth, viewZToPerspectiveDepth, viewport, viewportBottomLeft, viewportCoordinate, viewportDepthTexture, viewportLinearDepth, viewportMipTexture, viewportResolution, viewportSafeUV, viewportSharedTexture, viewportSize, viewportTexture, viewportTopLeft, viewportUV, wgsl, wgslFn, workgroupArray, workgroupBarrier, workgroupId, workingToColorSpace, xor }; diff --git a/build/three.tsl.min.js b/build/three.tsl.min.js index 98babdba90649d..da459594fe08c6 100644 --- a/build/three.tsl.min.js +++ b/build/three.tsl.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2024 Three.js Authors * SPDX-License-Identifier: MIT */ -import{TSL as e}from"three/webgpu";const t=e.BRDF_GGX,r=e.BRDF_Lambert,a=e.BasicShadowFilter,o=e.Break,i=e.Continue,n=e.DFGApprox,s=e.D_GGX,l=e.Discard,c=e.EPSILON,m=e.F_Schlick,p=e.Fn,d=e.INFINITY,u=e.If,g=e.Loop,h=e.NodeShaderStage,f=e.NodeType,x=e.NodeUpdateType,b=e.NodeAccess,v=e.PCFShadowFilter,w=e.PCFSoftShadowFilter,S=e.PI,T=e.PI2,_=e.Return,V=e.Schlick_to_F0,y=e.ScriptableNodeResources,D=e.ShaderNode,M=e.TBNViewMatrix,C=e.VSMShadowFilter,F=e.V_GGX_SmithCorrelated,I=e.abs,P=e.acesFilmicToneMapping,N=e.acos,R=e.add,B=e.addMethodChaining,k=e.addNodeElement,L=e.agxToneMapping,A=e.all,G=e.alphaT,O=e.and,W=e.anisotropy,j=e.anisotropyB,U=e.anisotropyT,z=e.any,E=e.append,q=e.arrayBuffer,Z=e.asin,X=e.assign,Y=e.atan,H=e.atan2,J=e.atomicAdd,K=e.atomicAnd,Q=e.atomicFunc,$=e.atomicMax,ee=e.atomicMin,te=e.atomicOr,re=e.atomicStore,ae=e.atomicSub,oe=e.atomicXor,ie=e.attenuationColor,ne=e.attenuationDistance,se=e.attribute,le=e.attributeArray,ce=e.backgroundBlurriness,me=e.backgroundIntensity,pe=e.backgroundRotation,de=e.batch,ue=e.billboarding,ge=e.bitAnd,he=e.bitNot,fe=e.bitOr,xe=e.bitXor,be=e.bitangentGeometry,ve=e.bitangentLocal,we=e.bitangentView,Se=e.bitangentWorld,Te=e.bitcast,_e=e.blendBurn,Ve=e.blendColor,ye=e.blendDodge,De=e.blendOverlay,Me=e.blendScreen,Ce=e.blur,Fe=e.bool,Ie=e.buffer,Pe=e.bufferAttribute,Ne=e.bumpMap,Re=e.burn,Be=e.bvec2,ke=e.bvec3,Le=e.bvec4,Ae=e.bypass,Ge=e.cache,Oe=e.call,We=e.cameraFar,je=e.cameraNear,Ue=e.cameraNormalMatrix,ze=e.cameraPosition,Ee=e.cameraProjectionMatrix,qe=e.cameraProjectionMatrixInverse,Ze=e.cameraViewMatrix,Xe=e.cameraWorldMatrix,Ye=e.cbrt,He=e.cdl,Je=e.ceil,Ke=e.checker,Qe=e.cineonToneMapping,$e=e.clamp,et=e.clearcoat,tt=e.clearcoatRoughness,rt=e.code,at=e.color,ot=e.colorSpaceToWorking,it=e.colorToDirection,nt=e.compute,st=e.cond,lt=e.context,ct=e.convert,mt=e.convertColorSpace,pt=e.convertToTexture,dt=e.cos,ut=e.cross,gt=e.cubeTexture,ht=e.dFdx,ft=e.dFdy,xt=e.dashSize,bt=e.defaultBuildStages,vt=e.defaultShaderStages,wt=e.defined,St=e.degrees,Tt=e.deltaTime,_t=e.densityFog,Vt=e.depth,yt=e.depthPass,Dt=e.difference,Mt=e.diffuseColor,Ct=e.directPointLight,Ft=e.directionToColor,It=e.dispersion,Pt=e.distance,Nt=e.div,Rt=e.dodge,Bt=e.dot,kt=e.drawIndex,Lt=e.dynamicBufferAttribute,At=e.element,Gt=e.emissive,Ot=e.equal,Wt=e.equals,jt=e.equirectUV,Ut=e.exp,zt=e.exp2,Et=e.expression,qt=e.faceDirection,Zt=e.faceForward,Xt=e.float,Yt=e.floor,Ht=e.fog,Jt=e.fract,Kt=e.frameGroup,Qt=e.frameId,$t=e.frontFacing,er=e.fwidth,tr=e.gain,rr=e.gapSize,ar=e.getConstNodeType,or=e.getCurrentStack,ir=e.getDirection,nr=e.getDistanceAttenuation,sr=e.getGeometryRoughness,lr=e.getNormalFromDepth,cr=e.getParallaxCorrectNormal,mr=e.getRoughness,pr=e.getScreenPosition,dr=e.getShIrradianceAt,ur=e.getTextureIndex,gr=e.getViewPosition,hr=e.glsl,fr=e.glslFn,xr=e.grayscale,br=e.greaterThan,vr=e.greaterThanEqual,wr=e.hash,Sr=e.highPrecisionModelNormalViewMatrix,Tr=e.highPrecisionModelViewMatrix,_r=e.hue,Vr=e.instance,yr=e.instanceIndex,Dr=e.instancedArray,Mr=e.instancedBufferAttribute,Cr=e.instancedDynamicBufferAttribute,Fr=e.instancedMesh,Ir=e.int,Pr=e.inverseSqrt,Nr=e.invocationLocalIndex,Rr=e.invocationSubgroupIndex,Br=e.ior,kr=e.iridescence,Lr=e.iridescenceIOR,Ar=e.iridescenceThickness,Gr=e.ivec2,Or=e.ivec3,Wr=e.ivec4,jr=e.js,Ur=e.label,zr=e.length,Er=e.lengthSq,qr=e.lessThan,Zr=e.lessThanEqual,Xr=e.lightPosition,Yr=e.lightTargetDirection,Hr=e.lightTargetPosition,Jr=e.lightViewPosition,Kr=e.lightingContext,Qr=e.lights,$r=e.linearDepth,ea=e.linearToneMapping,ta=e.localId,ra=e.log,aa=e.log2,oa=e.logarithmicDepthToViewZ,ia=e.loop,na=e.luminance,sa=e.mat2,la=e.mat3,ca=e.mat4,ma=e.matcapUV,pa=e.materialAOMap,da=e.materialAlphaTest,ua=e.materialAnisotropy,ga=e.materialAnisotropyVector,ha=e.materialAttenuationColor,fa=e.materialAttenuationDistance,xa=e.materialClearcoat,ba=e.materialClearcoatNormal,va=e.materialClearcoatRoughness,wa=e.materialColor,Sa=e.materialDispersion,Ta=e.materialEmissive,_a=e.materialIOR,Va=e.materialIridescence,ya=e.materialIridescenceIOR,Da=e.materialIridescenceThickness,Ma=e.materialLightMap,Ca=e.materialLineDashOffset,Fa=e.materialLineDashSize,Ia=e.materialLineGapSize,Pa=e.materialLineScale,Na=e.materialLineWidth,Ra=e.materialMetalness,Ba=e.materialNormal,ka=e.materialOpacity,La=e.materialPointWidth,Aa=e.materialReference,Ga=e.materialReflectivity,Oa=e.materialRefractionRatio,Wa=e.materialRotation,ja=e.materialRoughness,Ua=e.materialSheen,za=e.materialSheenRoughness,Ea=e.materialShininess,qa=e.materialSpecular,Za=e.materialSpecularColor,Xa=e.materialSpecularIntensity,Ya=e.materialSpecularStrength,Ha=e.materialThickness,Ja=e.materialTransmission,Ka=e.max,Qa=e.maxMipLevel,$a=e.metalness,eo=e.min,to=e.mix,ro=e.mixElement,ao=e.mod,oo=e.modInt,io=e.modelDirection,no=e.modelNormalMatrix,so=e.modelPosition,lo=e.modelScale,co=e.modelViewMatrix,mo=e.modelViewPosition,po=e.modelViewProjection,uo=e.modelWorldMatrix,go=e.modelWorldMatrixInverse,ho=e.morphReference,fo=e.mrt,xo=e.mul,bo=e.mx_aastep,vo=e.mx_cell_noise_float,wo=e.mx_contrast,So=e.mx_fractal_noise_float,To=e.mx_fractal_noise_vec2,_o=e.mx_fractal_noise_vec3,Vo=e.mx_fractal_noise_vec4,yo=e.mx_hsvtorgb,Do=e.mx_noise_float,Mo=e.mx_noise_vec3,Co=e.mx_noise_vec4,Fo=e.mx_ramplr,Io=e.mx_ramptb,Po=e.mx_rgbtohsv,No=e.mx_safepower,Ro=e.mx_splitlr,Bo=e.mx_splittb,ko=e.mx_srgb_texture_to_lin_rec709,Lo=e.mx_transform_uv,Ao=e.mx_worley_noise_float,Go=e.mx_worley_noise_vec2,Oo=e.mx_worley_noise_vec3,Wo=e.negate,jo=e.neutralToneMapping,Uo=e.nodeArray,zo=e.nodeImmutable,Eo=e.nodeObject,qo=e.nodeObjects,Zo=e.nodeProxy,Xo=e.normalFlat,Yo=e.normalGeometry,Ho=e.normalLocal,Jo=e.normalMap,Ko=e.normalView,Qo=e.normalWorld,$o=e.normalize,ei=e.not,ti=e.notEqual,ri=e.numWorkgroups,ai=e.objectDirection,oi=e.objectGroup,ii=e.objectPosition,ni=e.objectScale,si=e.objectViewPosition,li=e.objectWorldMatrix,ci=e.oneMinus,mi=e.or,pi=e.orthographicDepthToViewZ,di=e.oscSawtooth,ui=e.oscSine,gi=e.oscSquare,hi=e.oscTriangle,fi=e.output,xi=e.outputStruct,bi=e.overlay,vi=e.overloadingFn,wi=e.parabola,Si=e.parallaxDirection,Ti=e.parallaxUV,_i=e.parameter,Vi=e.pass,yi=e.passTexture,Di=e.pcurve,Mi=e.perspectiveDepthToViewZ,Ci=e.pmremTexture,Fi=e.pointUV,Ii=e.pointWidth,Pi=e.positionGeometry,Ni=e.positionLocal,Ri=e.positionPrevious,Bi=e.positionView,ki=e.positionViewDirection,Li=e.positionWorld,Ai=e.positionWorldDirection,Gi=e.posterize,Oi=e.pow,Wi=e.pow2,ji=e.pow3,Ui=e.pow4,zi=e.property,Ei=e.radians,qi=e.rand,Zi=e.range,Xi=e.rangeFog,Yi=e.reciprocal,Hi=e.reference,Ji=e.referenceBuffer,Ki=e.reflect,Qi=e.reflectVector,$i=e.reflectView,en=e.reflector,tn=e.refract,rn=e.refractVector,an=e.refractView,on=e.reinhardToneMapping,nn=e.remainder,sn=e.remap,ln=e.remapClamp,cn=e.renderGroup,mn=e.renderOutput,pn=e.rendererReference,dn=e.rotate,un=e.rotateUV,gn=e.roughness,hn=e.round,fn=e.rtt,xn=e.sRGBTransferEOTF,bn=e.sRGBTransferOETF,vn=e.sampler,wn=e.saturate,Sn=e.saturation,Tn=e.screen,_n=e.screenCoordinate,Vn=e.screenSize,yn=e.screenUV,Dn=e.scriptable,Mn=e.scriptableValue,Cn=e.select,Fn=e.setCurrentStack,In=e.shaderStages,Pn=e.shadow,Nn=e.sharedUniformGroup,Rn=e.sheen,Bn=e.sheenRoughness,kn=e.shiftLeft,Ln=e.shiftRight,An=e.shininess,Gn=e.sign,On=e.sin,Wn=e.sinc,jn=e.skinning,Un=e.skinningReference,zn=e.smoothstep,En=e.smoothstepElement,qn=e.specularColor,Zn=e.specularF90,Xn=e.spherizeUV,Yn=e.split,Hn=e.spritesheetUV,Jn=e.sqrt,Kn=e.stack,Qn=e.step,$n=e.storage,es=e.storageBarrier,ts=e.storageObject,rs=e.storageTexture,as=e.string,os=e.sub,is=e.subgroupIndex,ns=e.subgroupSize,ss=e.tan,ls=e.tangentGeometry,cs=e.tangentLocal,ms=e.tangentView,ps=e.tangentWorld,ds=e.temp,us=e.texture,gs=e.texture3D,hs=e.textureBarrier,fs=e.textureBicubic,xs=e.textureCubeUV,bs=e.textureLoad,vs=e.textureSize,ws=e.textureStore,Ss=e.thickness,Ts=e.threshold,_s=e.time,Vs=e.timerDelta,ys=e.timerGlobal,Ds=e.timerLocal,Ms=e.toOutputColorSpace,Cs=e.toWorkingColorSpace,Fs=e.toneMapping,Is=e.toneMappingExposure,Ps=e.toonOutlinePass,Ns=e.transformDirection,Rs=e.transformNormal,Bs=e.transformNormalToView,ks=e.transformedBentNormalView,Ls=e.transformedBitangentView,As=e.transformedBitangentWorld,Gs=e.transformedClearcoatNormalView,Os=e.transformedNormalView,Ws=e.transformedNormalWorld,js=e.transformedTangentView,Us=e.transformedTangentWorld,zs=e.transmission,Es=e.transpose,qs=e.tri,Zs=e.tri3,Xs=e.triNoise3D,Ys=e.triplanarTexture,Hs=e.triplanarTextures,Js=e.trunc,Ks=e.tslFn,Qs=e.uint,$s=e.uniform,el=e.uniformArray,tl=e.uniformGroup,rl=e.uniforms,al=e.userData,ol=e.uv,il=e.uvec2,nl=e.uvec3,sl=e.uvec4,ll=e.varying,cl=e.varyingProperty,ml=e.vec2,pl=e.vec3,dl=e.vec4,ul=e.vectorComponents,gl=e.velocity,hl=e.vertexColor,fl=e.vertexIndex,xl=e.vibrance,bl=e.viewZToLogarithmicDepth,vl=e.viewZToOrthographicDepth,wl=e.viewZToPerspectiveDepth,Sl=e.viewport,Tl=e.viewportBottomLeft,_l=e.viewportCoordinate,Vl=e.viewportDepthTexture,yl=e.viewportLinearDepth,Dl=e.viewportMipTexture,Ml=e.viewportResolution,Cl=e.viewportSafeUV,Fl=e.viewportSharedTexture,Il=e.viewportSize,Pl=e.viewportTexture,Nl=e.viewportTopLeft,Rl=e.viewportUV,Bl=e.wgsl,kl=e.wgslFn,Ll=e.workgroupArray,Al=e.workgroupBarrier,Gl=e.workgroupId,Ol=e.workingToColorSpace,Wl=e.xor;export{t as BRDF_GGX,r as BRDF_Lambert,a as BasicShadowFilter,o as Break,i as Continue,n as DFGApprox,s as D_GGX,l as Discard,c as EPSILON,m as F_Schlick,p as Fn,d as INFINITY,u as If,g as Loop,b as NodeAccess,h as NodeShaderStage,f as NodeType,x as NodeUpdateType,v as PCFShadowFilter,w as PCFSoftShadowFilter,S as PI,T as PI2,_ as Return,V as Schlick_to_F0,y as ScriptableNodeResources,D as ShaderNode,M as TBNViewMatrix,C as VSMShadowFilter,F as V_GGX_SmithCorrelated,I as abs,P as acesFilmicToneMapping,N as acos,R as add,B as addMethodChaining,k as addNodeElement,L as agxToneMapping,A as all,G as alphaT,O as and,W as anisotropy,j as anisotropyB,U as anisotropyT,z as any,E as append,q as arrayBuffer,Z as asin,X as assign,Y as atan,H as atan2,J as atomicAdd,K as atomicAnd,Q as atomicFunc,$ as atomicMax,ee as atomicMin,te as atomicOr,re as atomicStore,ae as atomicSub,oe as atomicXor,ie as attenuationColor,ne as attenuationDistance,se as attribute,le as attributeArray,ce as backgroundBlurriness,me as backgroundIntensity,pe as backgroundRotation,de as batch,ue as billboarding,ge as bitAnd,he as bitNot,fe as bitOr,xe as bitXor,be as bitangentGeometry,ve as bitangentLocal,we as bitangentView,Se as bitangentWorld,Te as bitcast,_e as blendBurn,Ve as blendColor,ye as blendDodge,De as blendOverlay,Me as blendScreen,Ce as blur,Fe as bool,Ie as buffer,Pe as bufferAttribute,Ne as bumpMap,Re as burn,Be as bvec2,ke as bvec3,Le as bvec4,Ae as bypass,Ge as cache,Oe as call,We as cameraFar,je as cameraNear,Ue as cameraNormalMatrix,ze as cameraPosition,Ee as cameraProjectionMatrix,qe as cameraProjectionMatrixInverse,Ze as cameraViewMatrix,Xe as cameraWorldMatrix,Ye as cbrt,He as cdl,Je as ceil,Ke as checker,Qe as cineonToneMapping,$e as clamp,et as clearcoat,tt as clearcoatRoughness,rt as code,at as color,ot as colorSpaceToWorking,it as colorToDirection,nt as compute,st as cond,lt as context,ct as convert,mt as convertColorSpace,pt as convertToTexture,dt as cos,ut as cross,gt as cubeTexture,ht as dFdx,ft as dFdy,xt as dashSize,bt as defaultBuildStages,vt as defaultShaderStages,wt as defined,St as degrees,Tt as deltaTime,_t as densityFog,Vt as depth,yt as depthPass,Dt as difference,Mt as diffuseColor,Ct as directPointLight,Ft as directionToColor,It as dispersion,Pt as distance,Nt as div,Rt as dodge,Bt as dot,kt as drawIndex,Lt as dynamicBufferAttribute,At as element,Gt as emissive,Ot as equal,Wt as equals,jt as equirectUV,Ut as exp,zt as exp2,Et as expression,qt as faceDirection,Zt as faceForward,Xt as float,Yt as floor,Ht as fog,Jt as fract,Kt as frameGroup,Qt as frameId,$t as frontFacing,er as fwidth,tr as gain,rr as gapSize,ar as getConstNodeType,or as getCurrentStack,ir as getDirection,nr as getDistanceAttenuation,sr as getGeometryRoughness,lr as getNormalFromDepth,cr as getParallaxCorrectNormal,mr as getRoughness,pr as getScreenPosition,dr as getShIrradianceAt,ur as getTextureIndex,gr as getViewPosition,hr as glsl,fr as glslFn,xr as grayscale,br as greaterThan,vr as greaterThanEqual,wr as hash,Sr as highPrecisionModelNormalViewMatrix,Tr as highPrecisionModelViewMatrix,_r as hue,Vr as instance,yr as instanceIndex,Dr as instancedArray,Mr as instancedBufferAttribute,Cr as instancedDynamicBufferAttribute,Fr as instancedMesh,Ir as int,Pr as inverseSqrt,Nr as invocationLocalIndex,Rr as invocationSubgroupIndex,Br as ior,kr as iridescence,Lr as iridescenceIOR,Ar as iridescenceThickness,Gr as ivec2,Or as ivec3,Wr as ivec4,jr as js,Ur as label,zr as length,Er as lengthSq,qr as lessThan,Zr as lessThanEqual,Xr as lightPosition,Yr as lightTargetDirection,Hr as lightTargetPosition,Jr as lightViewPosition,Kr as lightingContext,Qr as lights,$r as linearDepth,ea as linearToneMapping,ta as localId,ra as log,aa as log2,oa as logarithmicDepthToViewZ,ia as loop,na as luminance,sa as mat2,la as mat3,ca as mat4,ma as matcapUV,pa as materialAOMap,da as materialAlphaTest,ua as materialAnisotropy,ga as materialAnisotropyVector,ha as materialAttenuationColor,fa as materialAttenuationDistance,xa as materialClearcoat,ba as materialClearcoatNormal,va as materialClearcoatRoughness,wa as materialColor,Sa as materialDispersion,Ta as materialEmissive,_a as materialIOR,Va as materialIridescence,ya as materialIridescenceIOR,Da as materialIridescenceThickness,Ma as materialLightMap,Ca as materialLineDashOffset,Fa as materialLineDashSize,Ia as materialLineGapSize,Pa as materialLineScale,Na as materialLineWidth,Ra as materialMetalness,Ba as materialNormal,ka as materialOpacity,La as materialPointWidth,Aa as materialReference,Ga as materialReflectivity,Oa as materialRefractionRatio,Wa as materialRotation,ja as materialRoughness,Ua as materialSheen,za as materialSheenRoughness,Ea as materialShininess,qa as materialSpecular,Za as materialSpecularColor,Xa as materialSpecularIntensity,Ya as materialSpecularStrength,Ha as materialThickness,Ja as materialTransmission,Ka as max,Qa as maxMipLevel,$a as metalness,eo as min,to as mix,ro as mixElement,ao as mod,oo as modInt,io as modelDirection,no as modelNormalMatrix,so as modelPosition,lo as modelScale,co as modelViewMatrix,mo as modelViewPosition,po as modelViewProjection,uo as modelWorldMatrix,go as modelWorldMatrixInverse,ho as morphReference,fo as mrt,xo as mul,bo as mx_aastep,vo as mx_cell_noise_float,wo as mx_contrast,So as mx_fractal_noise_float,To as mx_fractal_noise_vec2,_o as mx_fractal_noise_vec3,Vo as mx_fractal_noise_vec4,yo as mx_hsvtorgb,Do as mx_noise_float,Mo as mx_noise_vec3,Co as mx_noise_vec4,Fo as mx_ramplr,Io as mx_ramptb,Po as mx_rgbtohsv,No as mx_safepower,Ro as mx_splitlr,Bo as mx_splittb,ko as mx_srgb_texture_to_lin_rec709,Lo as mx_transform_uv,Ao as mx_worley_noise_float,Go as mx_worley_noise_vec2,Oo as mx_worley_noise_vec3,Wo as negate,jo as neutralToneMapping,Uo as nodeArray,zo as nodeImmutable,Eo as nodeObject,qo as nodeObjects,Zo as nodeProxy,Xo as normalFlat,Yo as normalGeometry,Ho as normalLocal,Jo as normalMap,Ko as normalView,Qo as normalWorld,$o as normalize,ei as not,ti as notEqual,ri as numWorkgroups,ai as objectDirection,oi as objectGroup,ii as objectPosition,ni as objectScale,si as objectViewPosition,li as objectWorldMatrix,ci as oneMinus,mi as or,pi as orthographicDepthToViewZ,di as oscSawtooth,ui as oscSine,gi as oscSquare,hi as oscTriangle,fi as output,xi as outputStruct,bi as overlay,vi as overloadingFn,wi as parabola,Si as parallaxDirection,Ti as parallaxUV,_i as parameter,Vi as pass,yi as passTexture,Di as pcurve,Mi as perspectiveDepthToViewZ,Ci as pmremTexture,Fi as pointUV,Ii as pointWidth,Pi as positionGeometry,Ni as positionLocal,Ri as positionPrevious,Bi as positionView,ki as positionViewDirection,Li as positionWorld,Ai as positionWorldDirection,Gi as posterize,Oi as pow,Wi as pow2,ji as pow3,Ui as pow4,zi as property,Ei as radians,qi as rand,Zi as range,Xi as rangeFog,Yi as reciprocal,Hi as reference,Ji as referenceBuffer,Ki as reflect,Qi as reflectVector,$i as reflectView,en as reflector,tn as refract,rn as refractVector,an as refractView,on as reinhardToneMapping,nn as remainder,sn as remap,ln as remapClamp,cn as renderGroup,mn as renderOutput,pn as rendererReference,dn as rotate,un as rotateUV,gn as roughness,hn as round,fn as rtt,xn as sRGBTransferEOTF,bn as sRGBTransferOETF,vn as sampler,wn as saturate,Sn as saturation,Tn as screen,_n as screenCoordinate,Vn as screenSize,yn as screenUV,Dn as scriptable,Mn as scriptableValue,Cn as select,Fn as setCurrentStack,In as shaderStages,Pn as shadow,Nn as sharedUniformGroup,Rn as sheen,Bn as sheenRoughness,kn as shiftLeft,Ln as shiftRight,An as shininess,Gn as sign,On as sin,Wn as sinc,jn as skinning,Un as skinningReference,zn as smoothstep,En as smoothstepElement,qn as specularColor,Zn as specularF90,Xn as spherizeUV,Yn as split,Hn as spritesheetUV,Jn as sqrt,Kn as stack,Qn as step,$n as storage,es as storageBarrier,ts as storageObject,rs as storageTexture,as as string,os as sub,is as subgroupIndex,ns as subgroupSize,ss as tan,ls as tangentGeometry,cs as tangentLocal,ms as tangentView,ps as tangentWorld,ds as temp,us as texture,gs as texture3D,hs as textureBarrier,fs as textureBicubic,xs as textureCubeUV,bs as textureLoad,vs as textureSize,ws as textureStore,Ss as thickness,Ts as threshold,_s as time,Vs as timerDelta,ys as timerGlobal,Ds as timerLocal,Ms as toOutputColorSpace,Cs as toWorkingColorSpace,Fs as toneMapping,Is as toneMappingExposure,Ps as toonOutlinePass,Ns as transformDirection,Rs as transformNormal,Bs as transformNormalToView,ks as transformedBentNormalView,Ls as transformedBitangentView,As as transformedBitangentWorld,Gs as transformedClearcoatNormalView,Os as transformedNormalView,Ws as transformedNormalWorld,js as transformedTangentView,Us as transformedTangentWorld,zs as transmission,Es as transpose,qs as tri,Zs as tri3,Xs as triNoise3D,Ys as triplanarTexture,Hs as triplanarTextures,Js as trunc,Ks as tslFn,Qs as uint,$s as uniform,el as uniformArray,tl as uniformGroup,rl as uniforms,al as userData,ol as uv,il as uvec2,nl as uvec3,sl as uvec4,ll as varying,cl as varyingProperty,ml as vec2,pl as vec3,dl as vec4,ul as vectorComponents,gl as velocity,hl as vertexColor,fl as vertexIndex,xl as vibrance,bl as viewZToLogarithmicDepth,vl as viewZToOrthographicDepth,wl as viewZToPerspectiveDepth,Sl as viewport,Tl as viewportBottomLeft,_l as viewportCoordinate,Vl as viewportDepthTexture,yl as viewportLinearDepth,Dl as viewportMipTexture,Ml as viewportResolution,Cl as viewportSafeUV,Fl as viewportSharedTexture,Il as viewportSize,Pl as viewportTexture,Nl as viewportTopLeft,Rl as viewportUV,Bl as wgsl,kl as wgslFn,Ll as workgroupArray,Al as workgroupBarrier,Gl as workgroupId,Ol as workingToColorSpace,Wl as xor}; +import{TSL as e}from"three/webgpu";const t=e.BRDF_GGX,r=e.BRDF_Lambert,a=e.BasicShadowFilter,o=e.Break,i=e.Continue,n=e.DFGApprox,s=e.D_GGX,l=e.Discard,c=e.EPSILON,m=e.F_Schlick,p=e.Fn,d=e.INFINITY,u=e.If,g=e.Loop,h=e.NodeShaderStage,f=e.NodeType,x=e.NodeUpdateType,b=e.NodeAccess,w=e.PCFShadowFilter,v=e.PCFSoftShadowFilter,S=e.PI,T=e.PI2,_=e.Return,V=e.Schlick_to_F0,y=e.ScriptableNodeResources,D=e.ShaderNode,M=e.TBNViewMatrix,C=e.VSMShadowFilter,F=e.V_GGX_SmithCorrelated,I=e.abs,P=e.acesFilmicToneMapping,N=e.acos,R=e.add,B=e.addMethodChaining,k=e.addNodeElement,L=e.agxToneMapping,A=e.all,G=e.alphaT,O=e.and,W=e.anisotropy,j=e.anisotropyB,U=e.anisotropyT,z=e.any,E=e.append,q=e.arrayBuffer,Z=e.asin,X=e.assign,Y=e.atan,H=e.atan2,J=e.atomicAdd,K=e.atomicAnd,Q=e.atomicFunc,$=e.atomicMax,ee=e.atomicMin,te=e.atomicOr,re=e.atomicStore,ae=e.atomicSub,oe=e.atomicXor,ie=e.attenuationColor,ne=e.attenuationDistance,se=e.attribute,le=e.attributeArray,ce=e.backgroundBlurriness,me=e.backgroundIntensity,pe=e.backgroundRotation,de=e.batch,ue=e.billboarding,ge=e.bitAnd,he=e.bitNot,fe=e.bitOr,xe=e.bitXor,be=e.bitangentGeometry,we=e.bitangentLocal,ve=e.bitangentView,Se=e.bitangentWorld,Te=e.bitcast,_e=e.blendBurn,Ve=e.blendColor,ye=e.blendDodge,De=e.blendOverlay,Me=e.blendScreen,Ce=e.blur,Fe=e.bool,Ie=e.buffer,Pe=e.bufferAttribute,Ne=e.bumpMap,Re=e.burn,Be=e.bvec2,ke=e.bvec3,Le=e.bvec4,Ae=e.bypass,Ge=e.cache,Oe=e.call,We=e.cameraFar,je=e.cameraNear,Ue=e.cameraNormalMatrix,ze=e.cameraPosition,Ee=e.cameraProjectionMatrix,qe=e.cameraProjectionMatrixInverse,Ze=e.cameraViewMatrix,Xe=e.cameraWorldMatrix,Ye=e.cbrt,He=e.cdl,Je=e.ceil,Ke=e.checker,Qe=e.cineonToneMapping,$e=e.clamp,et=e.clearcoat,tt=e.clearcoatRoughness,rt=e.code,at=e.color,ot=e.colorSpaceToWorking,it=e.colorToDirection,nt=e.compute,st=e.cond,lt=e.context,ct=e.convert,mt=e.convertColorSpace,pt=e.convertToTexture,dt=e.cos,ut=e.cross,gt=e.cubeTexture,ht=e.dFdx,ft=e.dFdy,xt=e.dashSize,bt=e.defaultBuildStages,wt=e.defaultShaderStages,vt=e.defined,St=e.degrees,Tt=e.deltaTime,_t=e.densityFog,Vt=e.depth,yt=e.depthPass,Dt=e.difference,Mt=e.diffuseColor,Ct=e.directPointLight,Ft=e.directionToColor,It=e.dispersion,Pt=e.distance,Nt=e.div,Rt=e.dodge,Bt=e.dot,kt=e.drawIndex,Lt=e.dynamicBufferAttribute,At=e.element,Gt=e.emissive,Ot=e.equal,Wt=e.equals,jt=e.equirectUV,Ut=e.exp,zt=e.exp2,Et=e.expression,qt=e.faceDirection,Zt=e.faceForward,Xt=e.float,Yt=e.floor,Ht=e.fog,Jt=e.fract,Kt=e.frameGroup,Qt=e.frameId,$t=e.frontFacing,er=e.fwidth,tr=e.gain,rr=e.gapSize,ar=e.getConstNodeType,or=e.getCurrentStack,ir=e.getDirection,nr=e.getDistanceAttenuation,sr=e.getGeometryRoughness,lr=e.getNormalFromDepth,cr=e.getParallaxCorrectNormal,mr=e.getRoughness,pr=e.getScreenPosition,dr=e.getShIrradianceAt,ur=e.getTextureIndex,gr=e.getViewPosition,hr=e.glsl,fr=e.glslFn,xr=e.grayscale,br=e.greaterThan,wr=e.greaterThanEqual,vr=e.hash,Sr=e.highPrecisionModelNormalViewMatrix,Tr=e.highPrecisionModelViewMatrix,_r=e.hue,Vr=e.instance,yr=e.instanceIndex,Dr=e.instancedArray,Mr=e.instancedBufferAttribute,Cr=e.instancedDynamicBufferAttribute,Fr=e.instancedMesh,Ir=e.int,Pr=e.inverseSqrt,Nr=e.invocationLocalIndex,Rr=e.invocationSubgroupIndex,Br=e.ior,kr=e.iridescence,Lr=e.iridescenceIOR,Ar=e.iridescenceThickness,Gr=e.ivec2,Or=e.ivec3,Wr=e.ivec4,jr=e.js,Ur=e.label,zr=e.length,Er=e.lengthSq,qr=e.lessThan,Zr=e.lessThanEqual,Xr=e.lightPosition,Yr=e.lightTargetDirection,Hr=e.lightTargetPosition,Jr=e.lightViewPosition,Kr=e.lightingContext,Qr=e.lights,$r=e.linearDepth,ea=e.linearToneMapping,ta=e.localId,ra=e.log,aa=e.log2,oa=e.logarithmicDepthToViewZ,ia=e.loop,na=e.luminance,sa=e.mat2,la=e.mat3,ca=e.mat4,ma=e.matcapUV,pa=e.materialAOMap,da=e.materialAlphaTest,ua=e.materialAnisotropy,ga=e.materialAnisotropyVector,ha=e.materialAttenuationColor,fa=e.materialAttenuationDistance,xa=e.materialClearcoat,ba=e.materialClearcoatNormal,wa=e.materialClearcoatRoughness,va=e.materialColor,Sa=e.materialDispersion,Ta=e.materialEmissive,_a=e.materialIOR,Va=e.materialIridescence,ya=e.materialIridescenceIOR,Da=e.materialIridescenceThickness,Ma=e.materialLightMap,Ca=e.materialLineDashOffset,Fa=e.materialLineDashSize,Ia=e.materialLineGapSize,Pa=e.materialLineScale,Na=e.materialLineWidth,Ra=e.materialMetalness,Ba=e.materialNormal,ka=e.materialOpacity,La=e.materialPointWidth,Aa=e.materialReference,Ga=e.materialReflectivity,Oa=e.materialRefractionRatio,Wa=e.materialRotation,ja=e.materialRoughness,Ua=e.materialSheen,za=e.materialSheenRoughness,Ea=e.materialShininess,qa=e.materialSpecular,Za=e.materialSpecularColor,Xa=e.materialSpecularIntensity,Ya=e.materialSpecularStrength,Ha=e.materialThickness,Ja=e.materialTransmission,Ka=e.max,Qa=e.maxMipLevel,$a=e.metalness,eo=e.min,to=e.mix,ro=e.mixElement,ao=e.mod,oo=e.modInt,io=e.modelDirection,no=e.modelNormalMatrix,so=e.modelPosition,lo=e.modelScale,co=e.modelViewMatrix,mo=e.modelViewPosition,po=e.modelViewProjection,uo=e.modelWorldMatrix,go=e.modelWorldMatrixInverse,ho=e.morphReference,fo=e.mrt,xo=e.mul,bo=e.mx_aastep,wo=e.mx_cell_noise_float,vo=e.mx_contrast,So=e.mx_fractal_noise_float,To=e.mx_fractal_noise_vec2,_o=e.mx_fractal_noise_vec3,Vo=e.mx_fractal_noise_vec4,yo=e.mx_hsvtorgb,Do=e.mx_noise_float,Mo=e.mx_noise_vec3,Co=e.mx_noise_vec4,Fo=e.mx_ramplr,Io=e.mx_ramptb,Po=e.mx_rgbtohsv,No=e.mx_safepower,Ro=e.mx_splitlr,Bo=e.mx_splittb,ko=e.mx_srgb_texture_to_lin_rec709,Lo=e.mx_transform_uv,Ao=e.mx_worley_noise_float,Go=e.mx_worley_noise_vec2,Oo=e.mx_worley_noise_vec3,Wo=e.negate,jo=e.neutralToneMapping,Uo=e.nodeArray,zo=e.nodeImmutable,Eo=e.nodeObject,qo=e.nodeObjects,Zo=e.nodeProxy,Xo=e.normalFlat,Yo=e.normalGeometry,Ho=e.normalLocal,Jo=e.normalMap,Ko=e.normalView,Qo=e.normalWorld,$o=e.normalize,ei=e.not,ti=e.notEqual,ri=e.numWorkgroups,ai=e.objectDirection,oi=e.objectGroup,ii=e.objectPosition,ni=e.objectScale,si=e.objectViewPosition,li=e.objectWorldMatrix,ci=e.oneMinus,mi=e.or,pi=e.orthographicDepthToViewZ,di=e.oscSawtooth,ui=e.oscSine,gi=e.oscSquare,hi=e.oscTriangle,fi=e.output,xi=e.outputStruct,bi=e.overlay,wi=e.overloadingFn,vi=e.parabola,Si=e.parallaxDirection,Ti=e.parallaxUV,_i=e.parameter,Vi=e.pass,yi=e.passTexture,Di=e.pcurve,Mi=e.perspectiveDepthToViewZ,Ci=e.pmremTexture,Fi=e.pointUV,Ii=e.pointWidth,Pi=e.positionGeometry,Ni=e.positionLocal,Ri=e.positionPrevious,Bi=e.positionView,ki=e.positionViewDirection,Li=e.positionWorld,Ai=e.positionWorldDirection,Gi=e.posterize,Oi=e.pow,Wi=e.pow2,ji=e.pow3,Ui=e.pow4,zi=e.property,Ei=e.radians,qi=e.rand,Zi=e.range,Xi=e.rangeFog,Yi=e.reciprocal,Hi=e.reference,Ji=e.referenceBuffer,Ki=e.reflect,Qi=e.reflectVector,$i=e.reflectView,en=e.reflector,tn=e.refract,rn=e.refractVector,an=e.refractView,on=e.reinhardToneMapping,nn=e.remainder,sn=e.remap,ln=e.remapClamp,cn=e.renderGroup,mn=e.renderOutput,pn=e.rendererReference,dn=e.rotate,un=e.rotateUV,gn=e.roughness,hn=e.round,fn=e.rtt,xn=e.sRGBTransferEOTF,bn=e.sRGBTransferOETF,wn=e.sampler,vn=e.saturate,Sn=e.saturation,Tn=e.screen,_n=e.screenCoordinate,Vn=e.screenSize,yn=e.screenUV,Dn=e.scriptable,Mn=e.scriptableValue,Cn=e.select,Fn=e.setCurrentStack,In=e.shaderStages,Pn=e.shadow,Nn=e.shadowWorldPosition,Rn=e.sharedUniformGroup,Bn=e.sheen,kn=e.sheenRoughness,Ln=e.shiftLeft,An=e.shiftRight,Gn=e.shininess,On=e.sign,Wn=e.sin,jn=e.sinc,Un=e.skinning,zn=e.skinningReference,En=e.smoothstep,qn=e.smoothstepElement,Zn=e.specularColor,Xn=e.specularF90,Yn=e.spherizeUV,Hn=e.split,Jn=e.spritesheetUV,Kn=e.sqrt,Qn=e.stack,$n=e.step,es=e.storage,ts=e.storageBarrier,rs=e.storageObject,as=e.storageTexture,os=e.string,is=e.sub,ns=e.subgroupIndex,ss=e.subgroupSize,ls=e.tan,cs=e.tangentGeometry,ms=e.tangentLocal,ps=e.tangentView,ds=e.tangentWorld,us=e.temp,gs=e.texture,hs=e.texture3D,fs=e.textureBarrier,xs=e.textureBicubic,bs=e.textureCubeUV,ws=e.textureLoad,vs=e.textureSize,Ss=e.textureStore,Ts=e.thickness,_s=e.threshold,Vs=e.time,ys=e.timerDelta,Ds=e.timerGlobal,Ms=e.timerLocal,Cs=e.toOutputColorSpace,Fs=e.toWorkingColorSpace,Is=e.toneMapping,Ps=e.toneMappingExposure,Ns=e.toonOutlinePass,Rs=e.transformDirection,Bs=e.transformNormal,ks=e.transformNormalToView,Ls=e.transformedBentNormalView,As=e.transformedBitangentView,Gs=e.transformedBitangentWorld,Os=e.transformedClearcoatNormalView,Ws=e.transformedNormalView,js=e.transformedNormalWorld,Us=e.transformedTangentView,zs=e.transformedTangentWorld,Es=e.transmission,qs=e.transpose,Zs=e.tri,Xs=e.tri3,Ys=e.triNoise3D,Hs=e.triplanarTexture,Js=e.triplanarTextures,Ks=e.trunc,Qs=e.tslFn,$s=e.uint,el=e.uniform,tl=e.uniformArray,rl=e.uniformGroup,al=e.uniforms,ol=e.userData,il=e.uv,nl=e.uvec2,sl=e.uvec3,ll=e.uvec4,cl=e.varying,ml=e.varyingProperty,pl=e.vec2,dl=e.vec3,ul=e.vec4,gl=e.vectorComponents,hl=e.velocity,fl=e.vertexColor,xl=e.vertexIndex,bl=e.vibrance,wl=e.viewZToLogarithmicDepth,vl=e.viewZToOrthographicDepth,Sl=e.viewZToPerspectiveDepth,Tl=e.viewport,_l=e.viewportBottomLeft,Vl=e.viewportCoordinate,yl=e.viewportDepthTexture,Dl=e.viewportLinearDepth,Ml=e.viewportMipTexture,Cl=e.viewportResolution,Fl=e.viewportSafeUV,Il=e.viewportSharedTexture,Pl=e.viewportSize,Nl=e.viewportTexture,Rl=e.viewportTopLeft,Bl=e.viewportUV,kl=e.wgsl,Ll=e.wgslFn,Al=e.workgroupArray,Gl=e.workgroupBarrier,Ol=e.workgroupId,Wl=e.workingToColorSpace,jl=e.xor;export{t as BRDF_GGX,r as BRDF_Lambert,a as BasicShadowFilter,o as Break,i as Continue,n as DFGApprox,s as D_GGX,l as Discard,c as EPSILON,m as F_Schlick,p as Fn,d as INFINITY,u as If,g as Loop,b as NodeAccess,h as NodeShaderStage,f as NodeType,x as NodeUpdateType,w as PCFShadowFilter,v as PCFSoftShadowFilter,S as PI,T as PI2,_ as Return,V as Schlick_to_F0,y as ScriptableNodeResources,D as ShaderNode,M as TBNViewMatrix,C as VSMShadowFilter,F as V_GGX_SmithCorrelated,I as abs,P as acesFilmicToneMapping,N as acos,R as add,B as addMethodChaining,k as addNodeElement,L as agxToneMapping,A as all,G as alphaT,O as and,W as anisotropy,j as anisotropyB,U as anisotropyT,z as any,E as append,q as arrayBuffer,Z as asin,X as assign,Y as atan,H as atan2,J as atomicAdd,K as atomicAnd,Q as atomicFunc,$ as atomicMax,ee as atomicMin,te as atomicOr,re as atomicStore,ae as atomicSub,oe as atomicXor,ie as attenuationColor,ne as attenuationDistance,se as attribute,le as attributeArray,ce as backgroundBlurriness,me as backgroundIntensity,pe as backgroundRotation,de as batch,ue as billboarding,ge as bitAnd,he as bitNot,fe as bitOr,xe as bitXor,be as bitangentGeometry,we as bitangentLocal,ve as bitangentView,Se as bitangentWorld,Te as bitcast,_e as blendBurn,Ve as blendColor,ye as blendDodge,De as blendOverlay,Me as blendScreen,Ce as blur,Fe as bool,Ie as buffer,Pe as bufferAttribute,Ne as bumpMap,Re as burn,Be as bvec2,ke as bvec3,Le as bvec4,Ae as bypass,Ge as cache,Oe as call,We as cameraFar,je as cameraNear,Ue as cameraNormalMatrix,ze as cameraPosition,Ee as cameraProjectionMatrix,qe as cameraProjectionMatrixInverse,Ze as cameraViewMatrix,Xe as cameraWorldMatrix,Ye as cbrt,He as cdl,Je as ceil,Ke as checker,Qe as cineonToneMapping,$e as clamp,et as clearcoat,tt as clearcoatRoughness,rt as code,at as color,ot as colorSpaceToWorking,it as colorToDirection,nt as compute,st as cond,lt as context,ct as convert,mt as convertColorSpace,pt as convertToTexture,dt as cos,ut as cross,gt as cubeTexture,ht as dFdx,ft as dFdy,xt as dashSize,bt as defaultBuildStages,wt as defaultShaderStages,vt as defined,St as degrees,Tt as deltaTime,_t as densityFog,Vt as depth,yt as depthPass,Dt as difference,Mt as diffuseColor,Ct as directPointLight,Ft as directionToColor,It as dispersion,Pt as distance,Nt as div,Rt as dodge,Bt as dot,kt as drawIndex,Lt as dynamicBufferAttribute,At as element,Gt as emissive,Ot as equal,Wt as equals,jt as equirectUV,Ut as exp,zt as exp2,Et as expression,qt as faceDirection,Zt as faceForward,Xt as float,Yt as floor,Ht as fog,Jt as fract,Kt as frameGroup,Qt as frameId,$t as frontFacing,er as fwidth,tr as gain,rr as gapSize,ar as getConstNodeType,or as getCurrentStack,ir as getDirection,nr as getDistanceAttenuation,sr as getGeometryRoughness,lr as getNormalFromDepth,cr as getParallaxCorrectNormal,mr as getRoughness,pr as getScreenPosition,dr as getShIrradianceAt,ur as getTextureIndex,gr as getViewPosition,hr as glsl,fr as glslFn,xr as grayscale,br as greaterThan,wr as greaterThanEqual,vr as hash,Sr as highPrecisionModelNormalViewMatrix,Tr as highPrecisionModelViewMatrix,_r as hue,Vr as instance,yr as instanceIndex,Dr as instancedArray,Mr as instancedBufferAttribute,Cr as instancedDynamicBufferAttribute,Fr as instancedMesh,Ir as int,Pr as inverseSqrt,Nr as invocationLocalIndex,Rr as invocationSubgroupIndex,Br as ior,kr as iridescence,Lr as iridescenceIOR,Ar as iridescenceThickness,Gr as ivec2,Or as ivec3,Wr as ivec4,jr as js,Ur as label,zr as length,Er as lengthSq,qr as lessThan,Zr as lessThanEqual,Xr as lightPosition,Yr as lightTargetDirection,Hr as lightTargetPosition,Jr as lightViewPosition,Kr as lightingContext,Qr as lights,$r as linearDepth,ea as linearToneMapping,ta as localId,ra as log,aa as log2,oa as logarithmicDepthToViewZ,ia as loop,na as luminance,sa as mat2,la as mat3,ca as mat4,ma as matcapUV,pa as materialAOMap,da as materialAlphaTest,ua as materialAnisotropy,ga as materialAnisotropyVector,ha as materialAttenuationColor,fa as materialAttenuationDistance,xa as materialClearcoat,ba as materialClearcoatNormal,wa as materialClearcoatRoughness,va as materialColor,Sa as materialDispersion,Ta as materialEmissive,_a as materialIOR,Va as materialIridescence,ya as materialIridescenceIOR,Da as materialIridescenceThickness,Ma as materialLightMap,Ca as materialLineDashOffset,Fa as materialLineDashSize,Ia as materialLineGapSize,Pa as materialLineScale,Na as materialLineWidth,Ra as materialMetalness,Ba as materialNormal,ka as materialOpacity,La as materialPointWidth,Aa as materialReference,Ga as materialReflectivity,Oa as materialRefractionRatio,Wa as materialRotation,ja as materialRoughness,Ua as materialSheen,za as materialSheenRoughness,Ea as materialShininess,qa as materialSpecular,Za as materialSpecularColor,Xa as materialSpecularIntensity,Ya as materialSpecularStrength,Ha as materialThickness,Ja as materialTransmission,Ka as max,Qa as maxMipLevel,$a as metalness,eo as min,to as mix,ro as mixElement,ao as mod,oo as modInt,io as modelDirection,no as modelNormalMatrix,so as modelPosition,lo as modelScale,co as modelViewMatrix,mo as modelViewPosition,po as modelViewProjection,uo as modelWorldMatrix,go as modelWorldMatrixInverse,ho as morphReference,fo as mrt,xo as mul,bo as mx_aastep,wo as mx_cell_noise_float,vo as mx_contrast,So as mx_fractal_noise_float,To as mx_fractal_noise_vec2,_o as mx_fractal_noise_vec3,Vo as mx_fractal_noise_vec4,yo as mx_hsvtorgb,Do as mx_noise_float,Mo as mx_noise_vec3,Co as mx_noise_vec4,Fo as mx_ramplr,Io as mx_ramptb,Po as mx_rgbtohsv,No as mx_safepower,Ro as mx_splitlr,Bo as mx_splittb,ko as mx_srgb_texture_to_lin_rec709,Lo as mx_transform_uv,Ao as mx_worley_noise_float,Go as mx_worley_noise_vec2,Oo as mx_worley_noise_vec3,Wo as negate,jo as neutralToneMapping,Uo as nodeArray,zo as nodeImmutable,Eo as nodeObject,qo as nodeObjects,Zo as nodeProxy,Xo as normalFlat,Yo as normalGeometry,Ho as normalLocal,Jo as normalMap,Ko as normalView,Qo as normalWorld,$o as normalize,ei as not,ti as notEqual,ri as numWorkgroups,ai as objectDirection,oi as objectGroup,ii as objectPosition,ni as objectScale,si as objectViewPosition,li as objectWorldMatrix,ci as oneMinus,mi as or,pi as orthographicDepthToViewZ,di as oscSawtooth,ui as oscSine,gi as oscSquare,hi as oscTriangle,fi as output,xi as outputStruct,bi as overlay,wi as overloadingFn,vi as parabola,Si as parallaxDirection,Ti as parallaxUV,_i as parameter,Vi as pass,yi as passTexture,Di as pcurve,Mi as perspectiveDepthToViewZ,Ci as pmremTexture,Fi as pointUV,Ii as pointWidth,Pi as positionGeometry,Ni as positionLocal,Ri as positionPrevious,Bi as positionView,ki as positionViewDirection,Li as positionWorld,Ai as positionWorldDirection,Gi as posterize,Oi as pow,Wi as pow2,ji as pow3,Ui as pow4,zi as property,Ei as radians,qi as rand,Zi as range,Xi as rangeFog,Yi as reciprocal,Hi as reference,Ji as referenceBuffer,Ki as reflect,Qi as reflectVector,$i as reflectView,en as reflector,tn as refract,rn as refractVector,an as refractView,on as reinhardToneMapping,nn as remainder,sn as remap,ln as remapClamp,cn as renderGroup,mn as renderOutput,pn as rendererReference,dn as rotate,un as rotateUV,gn as roughness,hn as round,fn as rtt,xn as sRGBTransferEOTF,bn as sRGBTransferOETF,wn as sampler,vn as saturate,Sn as saturation,Tn as screen,_n as screenCoordinate,Vn as screenSize,yn as screenUV,Dn as scriptable,Mn as scriptableValue,Cn as select,Fn as setCurrentStack,In as shaderStages,Pn as shadow,Nn as shadowWorldPosition,Rn as sharedUniformGroup,Bn as sheen,kn as sheenRoughness,Ln as shiftLeft,An as shiftRight,Gn as shininess,On as sign,Wn as sin,jn as sinc,Un as skinning,zn as skinningReference,En as smoothstep,qn as smoothstepElement,Zn as specularColor,Xn as specularF90,Yn as spherizeUV,Hn as split,Jn as spritesheetUV,Kn as sqrt,Qn as stack,$n as step,es as storage,ts as storageBarrier,rs as storageObject,as as storageTexture,os as string,is as sub,ns as subgroupIndex,ss as subgroupSize,ls as tan,cs as tangentGeometry,ms as tangentLocal,ps as tangentView,ds as tangentWorld,us as temp,gs as texture,hs as texture3D,fs as textureBarrier,xs as textureBicubic,bs as textureCubeUV,ws as textureLoad,vs as textureSize,Ss as textureStore,Ts as thickness,_s as threshold,Vs as time,ys as timerDelta,Ds as timerGlobal,Ms as timerLocal,Cs as toOutputColorSpace,Fs as toWorkingColorSpace,Is as toneMapping,Ps as toneMappingExposure,Ns as toonOutlinePass,Rs as transformDirection,Bs as transformNormal,ks as transformNormalToView,Ls as transformedBentNormalView,As as transformedBitangentView,Gs as transformedBitangentWorld,Os as transformedClearcoatNormalView,Ws as transformedNormalView,js as transformedNormalWorld,Us as transformedTangentView,zs as transformedTangentWorld,Es as transmission,qs as transpose,Zs as tri,Xs as tri3,Ys as triNoise3D,Hs as triplanarTexture,Js as triplanarTextures,Ks as trunc,Qs as tslFn,$s as uint,el as uniform,tl as uniformArray,rl as uniformGroup,al as uniforms,ol as userData,il as uv,nl as uvec2,sl as uvec3,ll as uvec4,cl as varying,ml as varyingProperty,pl as vec2,dl as vec3,ul as vec4,gl as vectorComponents,hl as velocity,fl as vertexColor,xl as vertexIndex,bl as vibrance,wl as viewZToLogarithmicDepth,vl as viewZToOrthographicDepth,Sl as viewZToPerspectiveDepth,Tl as viewport,_l as viewportBottomLeft,Vl as viewportCoordinate,yl as viewportDepthTexture,Dl as viewportLinearDepth,Ml as viewportMipTexture,Cl as viewportResolution,Fl as viewportSafeUV,Il as viewportSharedTexture,Pl as viewportSize,Nl as viewportTexture,Rl as viewportTopLeft,Bl as viewportUV,kl as wgsl,Ll as wgslFn,Al as workgroupArray,Gl as workgroupBarrier,Ol as workgroupId,Wl as workingToColorSpace,jl as xor}; diff --git a/build/three.webgpu.js b/build/three.webgpu.js index 545c9ef91484d1..e64078eb4a1ca9 100644 --- a/build/three.webgpu.js +++ b/build/three.webgpu.js @@ -1184,7 +1184,7 @@ class Node extends EventDispatcher { if ( force === true || this._cacheKey === null ) { - this._cacheKey = getCacheKey$1( this, force ); + this._cacheKey = hash$1( getCacheKey$1( this, force ), this.customCacheKey() ); this._cacheKeyVersion = this.version; } @@ -1193,6 +1193,18 @@ class Node extends EventDispatcher { } + /** + * Generate a custom cache key for this node. + * + * @return {Number} The cache key of the node. + * @default 0 + */ + customCacheKey() { + + return 0; + + } + /** * Returns the references to this node which is by default `this`. * @@ -1333,7 +1345,7 @@ class Node extends EventDispatcher { /** * Represents the analyze stage which is the second step of the build process, see {@link Node#build} method. - * This stage anaylzes the node hierarchy and ensures descendent nodes are built. + * This stage analyzes the node hierarchy and ensures descendent nodes are built. * * @param {NodeBuilder} builder - The current node builder. */ @@ -1386,6 +1398,7 @@ class Node extends EventDispatcher { * The {@link Node#updateBeforeType} property defines how often the update is executed. * * @param {NodeFrame} frame - A reference to the current node frame. + * @return {Boolean?} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching). */ updateBefore( /*frame*/ ) { @@ -1398,6 +1411,7 @@ class Node extends EventDispatcher { * The {@link Node#updateAfterType} property defines how often the update is executed. * * @param {NodeFrame} frame - A reference to the current node frame. + * @return {Boolean?} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching). */ updateAfter( /*frame*/ ) { @@ -1410,6 +1424,7 @@ class Node extends EventDispatcher { * The {@link Node#updateType} property defines how often the update is executed. * * @param {NodeFrame} frame - A reference to the current node frame. + * @return {Boolean?} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching). */ update( /*frame*/ ) { @@ -1703,25 +1718,61 @@ class Node extends EventDispatcher { } -class ArrayElementNode extends Node { +/** + * Base class for representing element access on an array-like + * node data structures. + * + * @augments Node + */ +class ArrayElementNode extends Node { // @TODO: If extending from TempNode it breaks webgpu_compute static get type() { return 'ArrayElementNode'; - } // @TODO: If extending from TempNode it breaks webgpu_compute + } + /** + * Constructs array element node. + * + * @param {Node} node - The array-like node. + * @param {Node} indexNode - The index node that defines the element access. + */ constructor( node, indexNode ) { super(); + /** + * The array-like node. + * + * @type {Node} + */ this.node = node; + + /** + * The index node that defines the element access. + * + * @type {Node} + */ this.indexNode = indexNode; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isArrayElementNode = true; } + /** + * This method is overwritten since the node type is inferred from the array-like node. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { return this.node.getElementType( builder ); @@ -1739,6 +1790,13 @@ class ArrayElementNode extends Node { } +/** + * This module is part of the TSL core and usually not used in app level code. + * It represents a convert operation during the shader generation process + * meaning it converts the data type of a node to a target data type. + * + * @augments Node + */ class ConvertNode extends Node { static get type() { @@ -1747,15 +1805,39 @@ class ConvertNode extends Node { } + /** + * Constructs a new convert node. + * + * @param {Node} node - The node which type should be converted. + * @param {String} convertTo - The target node type. Multiple types can be defined by separating them with a `|` sign. + */ constructor( node, convertTo ) { super(); + /** + * The node which type should be converted. + * + * @type {Node} + */ this.node = node; + + /** + * The target node type. Multiple types can be defined by separating them with a `|` sign. + * + * @type {String} + */ this.convertTo = convertTo; } + /** + * This method is overwritten since the implementation tries to infer the best + * matching type from the {@link ConvertNode#convertTo} property. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { const requestType = this.node.getNodeType( builder ); @@ -1889,6 +1971,13 @@ class TempNode extends Node { } +/** + * This module is part of the TSL core and usually not used in app level code. + * It represents a join operation during the shader generation process. + * For example in can compose/join two single floats into a `vec2` type. + * + * @augments TempNode + */ class JoinNode extends TempNode { static get type() { @@ -1897,14 +1986,32 @@ class JoinNode extends TempNode { } + /** + * Constructs a new join node. + * + * @param {Array} nodes - An array of nodes that should be joined. + * @param {String?} [nodeType=null] - The node type. + */ constructor( nodes = [], nodeType = null ) { super( nodeType ); + /** + * An array of nodes that should be joined. + * + * @type {Array} + */ this.nodes = nodes; } + /** + * This method is overwritten since the node type must be inferred from the + * joined data length if not explicitly defined. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { if ( this.nodeType !== null ) { @@ -1950,8 +2057,19 @@ class JoinNode extends TempNode { } -const stringVectorComponents = vectorComponents.join( '' ); +const _stringVectorComponents = vectorComponents.join( '' ); +/** + * This module is part of the TSL core and usually not used in app level code. + * `SplitNode` represents a property access operation which means it is + * used to implement any `.xyzw`, `.rgba` and `stpq` usage on node objects. + * For example: + * ```js + * const redValue = color.r; + * ``` + * + * @augments Node + */ class SplitNode extends Node { static get type() { @@ -1960,17 +2078,46 @@ class SplitNode extends Node { } + /** + * Constructs a new split node. + * + * @param {Node} node - The node that should be accessed. + * @param {String} [components='x'] - The components that should be accessed. + */ constructor( node, components = 'x' ) { super(); + /** + * The node that should be accessed. + * + * @type {Node} + */ this.node = node; + + /** + * The components that should be accessed. + * + * @type {Node} + */ this.components = components; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isSplitNode = true; } + /** + * Returns the vector length which is computed based on the requested components. + * + * @return {Number} The vector length. + */ getVectorLength() { let vectorLength = this.components.length; @@ -1985,12 +2132,24 @@ class SplitNode extends Node { } + /** + * Returns the component type of the node's type. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The component type. + */ getComponentType( builder ) { return builder.getComponentType( this.node.getNodeType( builder ) ); } + /** + * This method is overwritten since the node type is inferred from requested components. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { return builder.getTypeFromLength( this.components.length, this.getComponentType( builder ) ); @@ -2020,7 +2179,7 @@ class SplitNode extends Node { const nodeSnippet = node.build( builder, type ); - if ( this.components.length === nodeTypeLength && this.components === stringVectorComponents.slice( 0, this.components.length ) ) { + if ( this.components.length === nodeTypeLength && this.components === _stringVectorComponents.slice( 0, this.components.length ) ) { // unnecessary swizzle @@ -2062,6 +2221,17 @@ class SplitNode extends Node { } +/** + * This module is part of the TSL core and usually not used in app level code. + * `SetNode` represents a set operation which means it is used to implement any + * `setXYZW()`, `setRGBA()` and `setSTPQ()` method invocations on node objects. + * For example: + * ```js + * materialLine.colorNode = color( 0, 0, 0 ).setR( float( 1 ) ); + * ``` + * + * @augments TempNode + */ class SetNode extends TempNode { static get type() { @@ -2070,16 +2240,46 @@ class SetNode extends TempNode { } + /** + * Constructs a new set node. + * + * @param {Node} sourceNode - The node that should be updated. + * @param {String} components - The components that should be updated. + * @param {Node} targetNode - The value node. + */ constructor( sourceNode, components, targetNode ) { super(); + /** + * The node that should be updated. + * + * @type {Node} + */ this.sourceNode = sourceNode; + + /** + * The components that should be updated. + * + * @type {String} + */ this.components = components; + + /** + * The value node. + * + * @type {Node} + */ this.targetNode = targetNode; } + /** + * This method is overwritten since the node type is inferred from {@link SetNode#sourceNode}. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { return this.sourceNode.getNodeType( builder ); @@ -2091,7 +2291,9 @@ class SetNode extends TempNode { const { sourceNode, components, targetNode } = this; const sourceType = this.getNodeType( builder ); - const targetType = builder.getTypeFromLength( components.length, targetNode.getNodeType( builder ) ); + + const componentType = builder.getComponentType( targetNode.getNodeType( builder ) ); + const targetType = builder.getTypeFromLength( components.length, componentType ); const targetSnippet = targetNode.build( builder, targetType ); const sourceSnippet = sourceNode.build( builder, sourceType ); @@ -2123,6 +2325,21 @@ class SetNode extends TempNode { } +/** + * This module is part of the TSL core and usually not used in app level code. + * It represents a flip operation during the shader generation process + * meaning it flips normalized values with the following formula: + * ``` + * x = 1 - x; + * ``` + * `FlipNode` is internally used to implement any `flipXYZW()`, `flipRGBA()` and + * `flipSTPQ()` method invocations on node objects. For example: + * ```js + * uvNode = uvNode.flipY(); + * ``` + * + * @augments TempNode + */ class FlipNode extends TempNode { static get type() { @@ -2131,15 +2348,38 @@ class FlipNode extends TempNode { } + /** + * Constructs a new flip node. + * + * @param {Node} sourceNode - The node which component(s) should be flipped. + * @param {String} components - The components that should be flipped e.g. `'x'` or `'xy'`. + */ constructor( sourceNode, components ) { super(); + /** + * The node which component(s) should be flipped. + * + * @type {Node} + */ this.sourceNode = sourceNode; + + /** + * The components that should be flipped e.g. `'x'` or `'xy'`. + * + * @type {String} + */ this.components = components; } + /** + * This method is overwritten since the node type is inferred from the source node. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { return this.sourceNode.getNodeType( builder ); @@ -3278,6 +3518,18 @@ const uniform = ( arg1, arg2 ) => { }; +/** + * This class represents a shader property. It can be used on + * to explicitly define a property and assign a value to it. + * + * ```js + * const threshold = property( 'float', 'threshold' ).assign( THRESHOLD ); + *``` + * `PropertyNode` is used by the engine to predefined common material properties + * for TSL code. + * + * @augments Node + */ class PropertyNode extends Node { static get type() { @@ -3286,13 +3538,41 @@ class PropertyNode extends Node { } + /** + * Constructs a new property node. + * + * @param {String} nodeType - The type of the node. + * @param {String?} [name=null] - The name of the property in the shader. + * @param {Boolean} [varying=false] - Whether this property is a varying or not. + */ constructor( nodeType, name = null, varying = false ) { super( nodeType ); + /** + * The name of the property in the shader. If no name is defined, + * the node system auto-generates one. + * + * @type {String?} + * @default null + */ this.name = name; + + /** + * Whether this property is a varying or not. + * + * @type {Boolean} + * @default false + */ this.varying = varying; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isPropertyNode = true; } @@ -3303,6 +3583,12 @@ class PropertyNode extends Node { } + /** + * The method is overwritten so it always returns `true`. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {Boolean} Whether this node is global or not. + */ isGlobal( /*builder*/ ) { return true; @@ -4655,7 +4941,7 @@ addMethodChaining( 'context', context ); addMethodChaining( 'label', label ); /** - * Class for representing shader variables as nodes. Variables are create from + * Class for representing shader variables as nodes. Variables are created from * existing nodes like the following: * * ```js @@ -4699,7 +4985,7 @@ class VarNode extends Node { this.name = name; /** - * `VarNonde` sets this property to `true` by default. + * `VarNode` sets this property to `true` by default. * * @type {Boolean} * @default true @@ -4821,9 +5107,10 @@ class VaryingNode extends Node { /** * The method is overwritten so it always returns `true`. * + * @param {NodeBuilder} builder - The current node builder. * @return {Boolean} Whether this node is global or not. */ - isGlobal() { + isGlobal( /*builder*/ ) { return true; @@ -4913,6 +5200,15 @@ const varying = /*@__PURE__*/ nodeProxy( VaryingNode ); addMethodChaining( 'varying', varying ); +/** @module ColorSpaceFunctions **/ + +/** + * Converts the given color value from sRGB to linear-sRGB color space. + * + * @method + * @param {vec3} color - The sRGB color. + * @return {vec3} The linear-sRGB color. + */ const sRGBTransferEOTF = /*@__PURE__*/ Fn( ( [ color ] ) => { const a = color.mul( 0.9478672986 ).add( 0.0521327014 ).pow( 2.4 ); @@ -4931,6 +5227,13 @@ const sRGBTransferEOTF = /*@__PURE__*/ Fn( ( [ color ] ) => { ] } ); +/** + * Converts the given color value from linear-sRGB to sRGB color space. + * + * @method + * @param {vec3} color - The linear-sRGB color. + * @return {vec3} The sRGB color. + */ const sRGBTransferOETF = /*@__PURE__*/ Fn( ( [ color ] ) => { const a = color.pow( 0.41666 ).mul( 1.055 ).sub( 0.055 ); @@ -4952,6 +5255,12 @@ const sRGBTransferOETF = /*@__PURE__*/ Fn( ( [ color ] ) => { const WORKING_COLOR_SPACE = 'WorkingColorSpace'; const OUTPUT_COLOR_SPACE = 'OutputColorSpace'; +/** + * This node represents a color space conversion. Meaning it converts + * a color value from a source to a target color space. + * + * @augments TempNode + */ class ColorSpaceNode extends TempNode { static get type() { @@ -4960,16 +5269,49 @@ class ColorSpaceNode extends TempNode { } + /** + * Constructs a new color space node. + * + * @param {Node} colorNode - Represents the color to convert. + * @param {String} source - The source color space. + * @param {String} target - The target color space. + */ constructor( colorNode, source, target ) { super( 'vec4' ); + /** + * Represents the color to convert. + * + * @type {Node} + */ this.colorNode = colorNode; + + /** + * The source color space. + * + * @type {Node} + */ this.source = source; + + /** + * The target color space. + * + * @type {Node} + */ this.target = target; } + /** + * This method resolves the constants `WORKING_COLOR_SPACE` and + * `OUTPUT_COLOR_SPACE` based on the current configuration of the + * color management and renderer. + * + * @param {NodeBuilder} builder - The current node builder. + * @param {String} colorSpace - The color space to resolve. + * @return {String} The resolved color space. + */ resolveColorSpace( builder, colorSpace ) { if ( colorSpace === WORKING_COLOR_SPACE ) { @@ -5235,6 +5577,11 @@ class RendererReferenceNode extends ReferenceBaseNode { const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) ); +/** + * This node represents a tone mapping operation. + * + * @augments TempNode + */ class ToneMappingNode extends TempNode { static get type() { @@ -5243,20 +5590,51 @@ class ToneMappingNode extends TempNode { } + /** + * Constructs a new tone mapping node. + * + * @param {Number} toneMapping - The tone mapping type. + * @param {Node} exposureNode - The tone mapping exposure. + * @param {Node} [colorNode=null] - The color node to process. + */ constructor( toneMapping, exposureNode = toneMappingExposure, colorNode = null ) { super( 'vec3' ); + /** + * The tone mapping type. + * + * @type {Number} + */ this.toneMapping = toneMapping; + /** + * The tone mapping exposure. + * + * @type {Node} + * @default null + */ this.exposureNode = exposureNode; + + /** + * Represents the color to process. + * + * @type {Node} + * @default null + */ this.colorNode = colorNode; } - getCacheKey() { + /** + * Overwrites the default `customCacheKey()` implementation by including the tone + * mapping type into the cache key. + * + * @return {Number} The hash. + */ + customCacheKey() { - return hash$1( super.getCacheKey(), this.toneMapping ); + return hash$1( this.toneMapping ); } @@ -5700,6 +6078,13 @@ const bypass = /*@__PURE__*/ nodeProxy( BypassNode ); addMethodChaining( 'bypass', bypass ); +/** + * This node allows to remap a node value from one range into another. E.g a value of + * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`. + * `RemapNode` takes care of that and converts the original value of `0.4` to `0.5`. + * + * @augments Node + */ class RemapNode extends Node { static get type() { @@ -5708,16 +6093,63 @@ class RemapNode extends Node { } + /** + * Constructs a new remap node. + * + * @param {Node} node - The node that should be remapped. + * @param {Node} inLowNode - The source or current lower bound of the range. + * @param {Node} inLowNode - The source or current upper bound of the range. + * @param {Node} [outLowNode=float(0)] - The target lower bound of the range. + * @param {Node} [outHighNode=float(1)] - The target upper bound of the range. + */ constructor( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) { super(); + /** + * The node that should be remapped. + * + * @type {Node} + */ this.node = node; + + /** + * The source or current lower bound of the range. + * + * @type {Node} + */ this.inLowNode = inLowNode; + + /** + * The source or current upper bound of the range. + * + * @type {Node} + */ this.inHighNode = inHighNode; + + /** + * The target lower bound of the range. + * + * @type {Node} + * @default float(0) + */ this.outLowNode = outLowNode; + + /** + * The target upper bound of the range. + * + * @type {Node} + * @default float(1) + */ this.outHighNode = outHighNode; + /** + * Whether the node value should be clamped before + * remapping it to the target range. + * + * @type {Boolean} + * @default true + */ this.doClamp = true; } @@ -5797,11 +6229,50 @@ class ExpressionNode extends Node { const expression = /*@__PURE__*/ nodeProxy( ExpressionNode ); +/** @module Discard **/ + +/** + * Represents a `discard` shader operation in TSL. + * + * @method + * @param {ConditionalNode?} conditional - An optional conditional node. It allows to decide whether the discard should be executed or not. + * @return {Node} The `discard` expression. + */ const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).append(); + +/** + * Represents a `return` shader operation in TSL. + * + * @method + * @return {ExpressionNode} The `return` expression. + */ const Return = () => expression( 'return' ).append(); addMethodChaining( 'discard', Discard ); +/** + * Normally, tone mapping and color conversion happens automatically + * before outputting pixel too the default (screen) framebuffer. In certain + * post processing setups this happens to late because certain effects + * require e.g. sRGB input. For such scenarios, `RenderOutputNode` can be used + * to apply tone mapping and color space conversion at an arbitrary point + * in the effect chain. + * + * When applying tone mapping and color space conversion manually with this node, + * you have to set {@link PostProcessing#outputColorTransform} to `false`. + * + * ```js + * const postProcessing = new PostProcessing( renderer ); + * postProcessing.outputColorTransform = false; + * + * const scenePass = pass( scene, camera ); + * const outputPass = renderOutput( scenePass ); + * + * postProcessing.outputNode = outputPass; + * ``` + * + * @augments TempNode + */ class RenderOutputNode extends TempNode { static get type() { @@ -5810,15 +6281,46 @@ class RenderOutputNode extends TempNode { } + /** + * Constructs a new render output node. + * + * @param {Node} colorNode - The color node to process. + * @param {String} toneMapping - The tone mapping type. + * @param {String} outputColorSpace - The output color space. + */ constructor( colorNode, toneMapping, outputColorSpace ) { super( 'vec4' ); + /** + * The color node to process. + * + * @type {Node} + */ this.colorNode = colorNode; + + /** + * The tone mapping type. + * + * @type {Number?} + */ this.toneMapping = toneMapping; + + /** + * The output color space. + * + * @type {String?} + */ this.outputColorSpace = outputColorSpace; - this.isRenderOutput = true; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isRenderOutputNode = true; } @@ -6053,6 +6555,16 @@ class TextureSizeNode extends Node { const textureSize = /*@__PURE__*/ nodeProxy( TextureSizeNode ); +/** + * A special type of uniform node that computes the + * maximum mipmap level for a given texture node. + * + * ```js + * const level = maxMipLevel( textureNode ); + * ``` + * + * @augments UniformNode + */ class MaxMipLevelNode extends UniformNode { static get type() { @@ -6061,22 +6573,52 @@ class MaxMipLevelNode extends UniformNode { } + /** + * Constructs a new max mip level node. + * + * @param {TextureNode} node - The texture node to compute the max mip level for. + */ constructor( textureNode ) { super( 0 ); + /** + * The texture node to compute the max mip level for. + * + * @private + * @type {TextureNode} + */ this._textureNode = textureNode; + /** + * The `updateType` is set to `NodeUpdateType.FRAME` since the node updates + * the texture once per frame in its {@link MaxMipLevelNode#update} method. + * + * @type {String} + * @default 'frame' + */ this.updateType = NodeUpdateType.FRAME; } + /** + * The texture node to compute the max mip level for. + * + * @readonly + * @type {TextureNode} + */ get textureNode() { return this._textureNode; } + /** + * The texture. + * + * @readonly + * @type {Texture} + */ get texture() { return this._textureNode.value; @@ -6409,7 +6951,15 @@ class TextureNode extends UniformNode { // @TODO: Move to TSL - uv( uvNode ) { + uv( uvNode ) { // @deprecated, r172 + + console.warn( 'THREE.TextureNode: .uv() has been renamed. Use .sample() instead.' ); + + return this.sample( uvNode ); + + } + + sample( uvNode ) { const textureNode = this.clone(); textureNode.uvNode = nodeObject( uvNode ); @@ -6748,6 +7298,11 @@ const positionWorldDirection = /*@__PURE__*/ positionLocal.transformDirection( m const positionView = /*@__PURE__*/ modelViewMatrix.mul( positionLocal ).xyz.varying( 'v_positionView' ); const positionViewDirection = /*@__PURE__*/ positionView.negate().varying( 'v_positionViewDirection' ).normalize().toVar( 'positionViewDirection' ); +/** + * This node can be used to evaluate whether a primitive is front or back facing. + * + * @augments Node + */ class FrontFacingNode extends Node { static get type() { @@ -6756,10 +7311,20 @@ class FrontFacingNode extends Node { } + /** + * Constructs a new front facing node. + */ constructor() { super( 'bool' ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFrontFacingNode = true; } @@ -7003,8 +7568,9 @@ class UniformArrayElementNode extends ArrayElementNode { const snippet = super.generate( builder ); const type = this.getNodeType(); + const paddedType = this.node.getPaddedType(); - return builder.format( snippet, 'vec4', type ); + return builder.format( snippet, paddedType, type ); } @@ -7020,13 +7586,11 @@ class UniformArrayNode extends BufferNode { constructor( value, elementType = null ) { - super( null, 'vec4' ); + super( null ); this.array = value; - this.elementType = elementType; - - this._elementType = null; - this._elementLength = 0; + this.elementType = elementType === null ? getValueType( value[ 0 ] ) : elementType; + this.paddedType = this.getPaddedType(); this.updateType = NodeUpdateType.RENDER; @@ -7034,15 +7598,43 @@ class UniformArrayNode extends BufferNode { } + getNodeType() { + + return this.paddedType; + + } + getElementType() { - return this.elementType || this._elementType; + return this.elementType; } - getElementLength() { + getPaddedType() { + + const elementType = this.elementType; + + let paddedType = 'vec4'; + + if ( elementType === 'mat2' ) { + + paddedType = 'mat2'; + + } else if ( /mat/.test( elementType ) === true ) { + + paddedType = 'mat4'; + + } else if ( elementType.charAt( 0 ) === 'i' ) { - return this._elementLength; + paddedType = 'ivec4'; + + } else if ( elementType.charAt( 0 ) === 'u' ) { + + paddedType = 'uvec4'; + + } + + return paddedType; } @@ -7050,10 +7642,9 @@ class UniformArrayNode extends BufferNode { const { array, value } = this; - const elementLength = this.getElementLength(); - const elementType = this.getElementType(); + const elementType = this.elementType; - if ( elementLength === 1 ) { + if ( elementType === 'float' || elementType === 'int' || elementType === 'uint' ) { for ( let i = 0; i < array.length; i ++ ) { @@ -7077,6 +7668,58 @@ class UniformArrayNode extends BufferNode { } + } else if ( elementType === 'mat2' ) { + + for ( let i = 0; i < array.length; i ++ ) { + + const index = i * 4; + const matrix = array[ i ]; + + value[ index ] = matrix.elements[ 0 ]; + value[ index + 1 ] = matrix.elements[ 1 ]; + value[ index + 2 ] = matrix.elements[ 2 ]; + value[ index + 3 ] = matrix.elements[ 3 ]; + + } + + } else if ( elementType === 'mat3' ) { + + for ( let i = 0; i < array.length; i ++ ) { + + const index = i * 16; + const matrix = array[ i ]; + + value[ index ] = matrix.elements[ 0 ]; + value[ index + 1 ] = matrix.elements[ 1 ]; + value[ index + 2 ] = matrix.elements[ 2 ]; + + value[ index + 4 ] = matrix.elements[ 3 ]; + value[ index + 5 ] = matrix.elements[ 4 ]; + value[ index + 6 ] = matrix.elements[ 5 ]; + + value[ index + 8 ] = matrix.elements[ 6 ]; + value[ index + 9 ] = matrix.elements[ 7 ]; + value[ index + 10 ] = matrix.elements[ 8 ]; + + value[ index + 15 ] = 1; + + } + + } else if ( elementType === 'mat4' ) { + + for ( let i = 0; i < array.length; i ++ ) { + + const index = i * 16; + const matrix = array[ i ]; + + for ( let i = 0; i < matrix.elements.length; i ++ ) { + + value[ index + i ] = matrix.elements[ i ]; + + } + + } + } else { for ( let i = 0; i < array.length; i ++ ) { @@ -7098,18 +7741,19 @@ class UniformArrayNode extends BufferNode { setup( builder ) { const length = this.array.length; - - this._elementType = this.elementType === null ? getValueType( this.array[ 0 ] ) : this.elementType; - this._elementLength = builder.getTypeLength( this._elementType ); + const elementType = this.elementType; let arrayType = Float32Array; - if ( this._elementType.charAt( 0 ) === 'i' ) arrayType = Int32Array; - else if ( this._elementType.charAt( 0 ) === 'u' ) arrayType = Uint32Array; + const paddedType = this.paddedType; + const paddedElementLength = builder.getTypeLength( paddedType ); - this.value = new arrayType( length * 4 ); + if ( elementType.charAt( 0 ) === 'i' ) arrayType = Int32Array; + if ( elementType.charAt( 0 ) === 'u' ) arrayType = Uint32Array; + + this.value = new arrayType( length * paddedElementLength ); this.bufferCount = length; - this.bufferType = builder.changeComponentType( 'vec4', builder.getComponentType( this._elementType ) ); + this.bufferType = paddedType; return super.setup( builder ); @@ -7444,6 +8088,15 @@ const perturbNormal2Arb = /*@__PURE__*/ Fn( ( inputs ) => { } ); +/** + * This class can be used for applying normals maps to materials. + * + * ```js + * material.normalNode = normalMap( texture( normalTex ) ); + * ``` + * + * @augments TempNode + */ class NormalMapNode extends TempNode { static get type() { @@ -7452,13 +8105,37 @@ class NormalMapNode extends TempNode { } + /** + * Constructs a new normal map node. + * + * @param {Node} textureNode - Represents the normal map data. + * @param {Node?} [scaleNode=null] - Controls the intensity of the effect. + */ constructor( node, scaleNode = null ) { super( 'vec3' ); + /** + * Represents the normal map data. + * + * @type {Node} + */ this.node = node; + + /** + * Controls the intensity of the effect. + * + * @type {Node?} + * @default null + */ this.scaleNode = scaleNode; + /** + * The normal map type. + * + * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)} + * @default TangentSpaceNormalMap + */ this.normalMapType = TangentSpaceNormalMap; } @@ -7549,6 +8226,15 @@ const perturbNormalArb = Fn( ( inputs ) => { } ); +/** + * This class can be used for applying bump maps to materials. + * + * ```js + * material.normalNode = bumpMap( texture( bumpTex ) ); + * ``` + * + * @augments TempNode + */ class BumpMapNode extends TempNode { static get type() { @@ -7557,11 +8243,29 @@ class BumpMapNode extends TempNode { } + /** + * Constructs a new bump map node. + * + * @param {Node} textureNode - Represents the bump map data. + * @param {Node?} [scaleNode=null] - Controls the intensity of the bump effect. + */ constructor( textureNode, scaleNode = null ) { super( 'vec3' ); + /** + * Represents the bump map data. + * + * @type {Node} + */ this.textureNode = textureNode; + + /** + * Controls the intensity of the bump effect. + * + * @type {Node?} + * @default null + */ this.scaleNode = scaleNode; } @@ -8609,6 +9313,32 @@ class SkinningNode extends Node { const skinning = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh ) ); const skinningReference = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh, true ) ); +/** + * This module offers a variety of ways to implement loops in TSL. In it's basic form it's: + * ```js + * Loop( count, ( { i } ) => { + * + * } ); + * ``` + * However, it is also possible to define a start and end ranges, data types and loop conditions: + * ```js + * Loop( { start: int( 0 ), end: int( 10 ), type: 'int', condition: '<' }, ( { i } ) => { + * + * } ); + *``` + * Nested loops can be definde in a compacted form: + * ```js + * Loop( 10, 5, ( { i, j } ) => { + * + * } ); + * ``` + * Loops that should run backwards can be defined like so: + * ```js + * Loop( { start: 10 }, () => {} ); + * ``` + * The module also provides `Break()` and `Continue()` TSL expression for loop control. + * @augments Node + */ class LoopNode extends Node { static get type() { @@ -8617,6 +9347,11 @@ class LoopNode extends Node { } + /** + * Constructs a new loop node. + * + * @param {Array} params - Depending on the loop type, array holds different parameterization values for the loop. + */ constructor( params = [] ) { super(); @@ -8625,12 +9360,25 @@ class LoopNode extends Node { } + /** + * Returns a loop variable name based on an index. The pattern is + * `0` = `i`, `1`= `j`, `2`= `k` and so on. + * + * @param {Number} index - The index. + * @return {String} The loop variable name. + */ getVarName( index ) { return String.fromCharCode( 'i'.charCodeAt() + index ); } + /** + * Returns properties about this node. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {Object} The node properties. + */ getProperties( builder ) { const properties = builder.getNodeProperties( this ); @@ -8663,6 +9411,12 @@ class LoopNode extends Node { } + /** + * This method is overwritten since the node type is inferred based on the loop configuration. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { const { returnsNode } = this.getProperties( builder ); @@ -9197,6 +9951,13 @@ class IrradianceNode extends LightingNode { let screenSizeVec, viewportVec; +/** + * This node provides a collection of screen related metrics. + * Depending on {@link ScreenNode#scope}, the nodes can represent + * resolution or viewport data as well as fragment or uv coordinates. + * + * @augments Node + */ class ScreenNode extends Node { static get type() { @@ -9205,16 +9966,43 @@ class ScreenNode extends Node { } + /** + * Constructs a new screen node. + * + * @param {('coordinate'|'viewport'|'size'|'uv')} scope - The node's scope. + */ constructor( scope ) { super(); + /** + * The node represents different metric depending on which scope is selected. + * + * - `ScreenNode.COORDINATE`: Window-relative coordinates of the current fragment according to WebGPU standards. + * - `ScreenNode.VIEWPORT`: The current viewport defined as a four-dimensional vector. + * - `ScreenNode.SIZE`: The dimensions of the current bound framebuffer. + * - `ScreenNode.UV`: Normalized screen coordinates. + * + * @type {('coordinate'|'viewport'|'size'|'uv')} + */ this.scope = scope; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isViewportNode = true; } + /** + * This method is overwritten since the node type depends on the selected scope. + * + * @return {('vec2'|'vec4')} The node type. + */ getNodeType() { if ( this.scope === ScreenNode.VIEWPORT ) return 'vec4'; @@ -9222,6 +10010,11 @@ class ScreenNode extends Node { } + /** + * This method is overwritten since the node's update type depends on the selected scope. + * + * @return {NodeUpdateType} The update type. + */ getUpdateType() { let updateType = NodeUpdateType.NONE; @@ -9238,6 +10031,13 @@ class ScreenNode extends Node { } + /** + * `ScreenNode` implements {@link Node#update} to retrieve viewport and size information + * from the current renderer. + * + * @param {NodeFrame} frame - A reference to the current node frame. + * @return {Boolean?} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching). + */ update( { renderer } ) { const renderTarget = renderer.getRenderTarget(); @@ -9369,6 +10169,15 @@ const viewportBottomLeft = /*@__PURE__*/ ( Fn( () => { // @deprecated, r168 const _size$4 = /*@__PURE__*/ new Vector2(); +/** + * A special type of texture node which represents the data of the current viewport + * as a texture. The module extracts data from the current bound framebuffer with + * a copy operation so no extra render pass is required to produce the texture data + * (which is good for performance). `ViewportTextureNode` can be used as an input for a + * variety of effects like refractive or transmissive materials. + * + * @augments TextureNode + */ class ViewportTextureNode extends TextureNode { static get type() { @@ -9377,6 +10186,13 @@ class ViewportTextureNode extends TextureNode { } + /** + * Constructs a new viewport texture node. + * + * @param {Node} [uvNode=screenUV] - The uv node. + * @param {Node?} [levelNode=null] - The level node. + * @param {Texture?} [framebufferTexture=null] - A framebuffer texture holding the viewport data. If not provided, a framebuffer texture is created automatically. + */ constructor( uvNode = screenUV, levelNode = null, framebufferTexture = null ) { if ( framebufferTexture === null ) { @@ -9388,10 +10204,30 @@ class ViewportTextureNode extends TextureNode { super( framebufferTexture, uvNode, levelNode ); + /** + * Whether to generate mipmaps or not. + * + * @type {Boolean} + * @default false + */ this.generateMipmaps = false; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isOutputTextureNode = true; + /** + * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the + * scene once per frame in its {@link ViewportTextureNode#updateBefore} method. + * + * @type {String} + * @default 'frame' + */ this.updateBeforeType = NodeUpdateType.FRAME; } @@ -9440,6 +10276,13 @@ const viewportMipTexture = /*@__PURE__*/ nodeProxy( ViewportTextureNode, null, n let sharedDepthbuffer = null; +/** + * Represents the depth of the current viewport as a texture. This module + * can be used in combination with viewport texture to achieve effects + * that require depth evaluation. + * + * @augments ViewportTextureNode + */ class ViewportDepthTextureNode extends ViewportTextureNode { static get type() { @@ -9448,6 +10291,12 @@ class ViewportDepthTextureNode extends ViewportTextureNode { } + /** + * Constructs a new viewport shared texture node. + * + * @param {Node} [uvNode=screenUV] - The uv node. + * @param {Node?} [levelNode=null] - The level node. + */ constructor( uvNode = screenUV, levelNode = null ) { if ( sharedDepthbuffer === null ) { @@ -9464,6 +10313,13 @@ class ViewportDepthTextureNode extends ViewportTextureNode { const viewportDepthTexture = /*@__PURE__*/ nodeProxy( ViewportDepthTextureNode ); +/** + * This node offers a collection of features in context of the depth logic in the fragment shader. + * Depending on {@link ViewportDepthNode#scope}, it can be used to define a depth value for the current + * fragment or for depth evaluation purposes. + * + * @augments Node + */ class ViewportDepthNode extends Node { static get type() { @@ -9472,13 +10328,44 @@ class ViewportDepthNode extends Node { } + /** + * Constructs a new viewport depth node. + * + * @param {('depth'|'depthBase'|'linearDepth')} scope - The node's scope. + * @param {Node?} [valueNode=null] - The value node. + */ constructor( scope, valueNode = null ) { super( 'float' ); + /** + * The node behaves differently depending on which scope is selected. + * + * - `ViewportDepthNode.DEPTH_BASE`: Allows to define a value for the current fragment's depth. + * - `ViewportDepthNode.DEPTH`: Represents the depth value for the current fragment (`valueNode` is ignored). + * - `ViewportDepthNode.LINEAR_DEPTH`: Represents the linear (orthographic) depth value of the current fragment. + * If a `valueNode` is set, the scope can be used to convert perspective depth data to linear data. + * + * @type {('depth'|'depthBase'|'linearDepth')} + */ this.scope = scope; + + /** + * Can be used to define a custom depth value. + * The property is ignored in the `ViewportDepthNode.DEPTH` scope. + * + * @type {Node} + * @default null + */ this.valueNode = valueNode; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isViewportDepthNode = true; } @@ -10795,6 +11682,13 @@ class LineDashedNodeMaterial extends NodeMaterial { let _sharedFramebuffer = null; +/** + * `ViewportTextureNode` creates an internal texture for each node instance. This module + * shares a texture across all instances of `ViewportSharedTextureNode`. It should + * be the first choice when using data of the default/screen framebuffer for performance reasons. + * + * @augments ViewportTextureNode + */ class ViewportSharedTextureNode extends ViewportTextureNode { static get type() { @@ -10803,6 +11697,12 @@ class ViewportSharedTextureNode extends ViewportTextureNode { } + /** + * Constructs a new viewport shared texture node. + * + * @param {Node} [uvNode=screenUV] - The uv node. + * @param {Node?} [levelNode=null] - The level node. + */ constructor( uvNode = screenUV, levelNode = null ) { if ( _sharedFramebuffer === null ) { @@ -11263,7 +12163,24 @@ class Line2NodeMaterial extends NodeMaterial { } +/** @module Packing **/ + +/** + * Packs a direction vector into a color value. + * + * @method + * @param {Node} node - The direction to pack. + * @return {Node} The color. + */ const directionToColor = ( node ) => nodeObject( node ).mul( 0.5 ).add( 0.5 ); + +/** + * Unpacks a color value into a direction vector. + * + * @method + * @param {Node} color - The color to unpack. + * @return {Node} The direction. + */ const colorToDirection = ( node ) => nodeObject( node ).mul( 2.0 ).sub( 1 ); const _defaultValues$a = /*@__PURE__*/ new MeshNormalMaterial(); @@ -11300,6 +12217,17 @@ class MeshNormalNodeMaterial extends NodeMaterial { } +/** + * Can be used to compute texture coordinates for projecting an + * equirectangular texture onto a mesh for using it as the scene's + * background. + * + * ```js + * scene.backgroundNode = texture( equirectTexture, equirectUV() ); + * ``` + * + * @augments TempNode + */ class EquirectUVNode extends TempNode { static get type() { @@ -11308,10 +12236,20 @@ class EquirectUVNode extends TempNode { } + /** + * Constructs a new equirect uv node. + * + * @param {Node} [dirNode=positionWorldDirection] - A direction vector for sampling why is by default `positionWorldDirection`. + */ constructor( dirNode = positionWorldDirection ) { super( 'vec2' ); + /** + * A direction vector for sampling why is by default `positionWorldDirection`. + * + * @type {Node} + */ this.dirNode = dirNode; } @@ -11397,6 +12335,12 @@ class CubeRenderTarget extends WebGLCubeRenderTarget { const _cache$1 = new WeakMap(); +/** + * This node can be used to automatically convert environment maps in the + * equirectangular format into the cube map format. + * + * @augments TempNode + */ class CubeMapNode extends TempNode { static get type() { @@ -11405,20 +12349,59 @@ class CubeMapNode extends TempNode { } + /** + * Constructs a new cube map node. + * + * @param {Node} envNode - The node representing the environment map. + */ constructor( envNode ) { super( 'vec3' ); + /** + * The node representing the environment map. + * + * @type {Node} + */ this.envNode = envNode; + /** + * A reference to the internal cube texture. + * + * @private + * @type {CubeTexture} + * @default null + */ this._cubeTexture = null; + + /** + * A reference to the internal cube texture node. + * + * @private + * @type {CubeTextureNode} + */ this._cubeTextureNode = cubeTexture(); const defaultTexture = new CubeTexture(); defaultTexture.isRenderTargetTexture = true; + /** + * A default cube texture that acts as a placeholder. + * It is used when the conversion from equirectangular to cube + * map has not finished yet for a given texture. + * + * @private + * @type {CubeTexture} + */ this._defaultTexture = defaultTexture; + /** + * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates + * the texture once per render in its {@link CubeMapNode#updateBefore} method. + * + * @type {String} + * @default 'render' + */ this.updateBeforeType = NodeUpdateType.RENDER; } @@ -11504,6 +12487,14 @@ class CubeMapNode extends TempNode { } +/** + * Returns true if the given equirectangular image has been fully loaded + * and is ready for further processing. + * + * @private + * @param {Image} image - The equirectangular image to check. + * @return {Boolean} Whether the image is ready or not. + */ function isEquirectangularMapReady$1( image ) { if ( image === null || image === undefined ) return false; @@ -11512,6 +12503,14 @@ function isEquirectangularMapReady$1( image ) { } +/** + * This function is executed when `dispose()` is called on the equirectangular + * texture. In this case, the generated cube map with its render target + * is deleted as well. + * + * @private + * @param {Object} event - The event object. + */ function onTextureDispose( event ) { const texture = event.target; @@ -11530,6 +12529,14 @@ function onTextureDispose( event ) { } +/** + * This function makes sure the generated cube map uses the correct + * texture mapping that corresponds to the equirectangular original. + * + * @private + * @param {Texture} texture - The cube texture. + * @param {Number} mapping - The original texture mapping. + */ function mapTextureMapping( texture, mapping ) { if ( mapping === EquirectangularReflectionMapping ) { @@ -11612,6 +12619,7 @@ class LightingModel { * This method is intended for setting up lighting model and context data * which are later used in the evaluation process. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11622,6 +12630,7 @@ class LightingModel { * This method is intended for executing final tasks like final updates * to the outgoing light. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11632,6 +12641,7 @@ class LightingModel { * This method is intended for implementing the direct light term and * executed during the build process of directional, point and spot light nodes. * + * @abstract * @param {Object} input - The input data. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11642,6 +12652,7 @@ class LightingModel { * This method is intended for implementing the direct light term for * rect area light nodes. * + * @abstract * @param {Object} input - The input data. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11651,6 +12662,7 @@ class LightingModel { /** * This method is intended for implementing the indirect light term. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11662,6 +12674,7 @@ class LightingModel { * Unlike other methods, this method must be called manually by the lighting * model in its indirect term. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11670,14 +12683,31 @@ class LightingModel { } +/** + * Represents the lighting model for unlit materials. The only light contribution + * is baked indirect lighting modulated with ambient occlusion and the material's + * diffuse color. Environment mapping is supported. Used in {@link MeshBasicNodeMaterial}. + * + * @augments LightingModel + */ class BasicLightingModel extends LightingModel { + /** + * Constructs a new basic lighting model. + */ constructor() { super(); } + /** + * Implements the baked indirect lighting with its modulation. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( context, stack, builder ) { const ambientOcclusion = context.ambientOcclusion; @@ -11706,6 +12736,13 @@ class BasicLightingModel extends LightingModel { } + /** + * Implements the environment mapping. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ finish( context, stack, builder ) { const material = builder.material; @@ -11848,16 +12885,42 @@ const BRDF_BlinnPhong = /*@__PURE__*/ Fn( ( { lightDirection } ) => { } ); +/** + * Represents the lighting model for a phong material. Used in {@link MeshPhongNodeMaterial}. + * + * @augments LightingModel + */ class PhongLightingModel extends BasicLightingModel { + /** + * Constructs a new phong lighting model. + * + * @param {Boolean} [specular=true] - Whether specular is supported or not. + */ constructor( specular = true ) { super(); + /** + * Whether specular is supported or not. Set this to `false` if you are + * lookking for a Lambert-like material meaning a material for non-shiny + * surfaces, without specular highlights. + * + * @type {Boolean} + * @default true + */ this.specular = specular; } + /** + * Implements the direct lighting. The specular portion is optional an can be controlled + * with the {@link PhongLightingModel#specular} flag. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ direct( { lightDirection, lightColor, reflectedLight } ) { const dotNL = transformedNormalView.dot( lightDirection ).clamp(); @@ -11873,6 +12936,13 @@ class PhongLightingModel extends BasicLightingModel { } + /** + * Implements the indirect lighting. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( { ambientOcclusion, irradiance, reflectedLight } ) { reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) ); @@ -12432,8 +13502,8 @@ const bicubic = ( textureNode, texelSize, lod ) => { const p2 = vec2( iuv.x.add( h0x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy ); const p3 = vec2( iuv.x.add( h1x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy ); - const a = g0( fuv.y ).mul( add( g0x.mul( textureNode.uv( p0 ).level( lod ) ), g1x.mul( textureNode.uv( p1 ).level( lod ) ) ) ); - const b = g1( fuv.y ).mul( add( g0x.mul( textureNode.uv( p2 ).level( lod ) ), g1x.mul( textureNode.uv( p3 ).level( lod ) ) ) ); + const a = g0( fuv.y ).mul( add( g0x.mul( textureNode.sample( p0 ).level( lod ) ), g1x.mul( textureNode.sample( p1 ).level( lod ) ) ) ); + const b = g1( fuv.y ).mul( add( g0x.mul( textureNode.sample( p2 ).level( lod ) ), g1x.mul( textureNode.sample( p3 ).level( lod ) ) ) ); return a.add( b ); @@ -12505,7 +13575,7 @@ const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ], const vTexture = material.side == BackSide ? viewportBackSideTexture : viewportFrontSideTexture; - const transmissionSample = vTexture.uv( fragCoord ); + const transmissionSample = vTexture.sample( fragCoord ); //const transmissionSample = viewportMipTexture( fragCoord ); const lod = log2( screenSize.x ).mul( applyIorToRoughness( roughness, ior ) ); @@ -12771,31 +13841,140 @@ const IBLSheenBRDF = /*@__PURE__*/ Fn( ( { normal, viewDir, roughness } ) => { const clearcoatF0 = vec3( 0.04 ); const clearcoatF90 = float( 1 ); -// +/** + * Represents the lighting model for a PBR material. + * + * @augments LightingModel + */ class PhysicalLightingModel extends LightingModel { + /** + * Constructs a new physical lighting model. + * + * @param {Boolean} [clearcoat=false] - Whether clearcoat is supported or not. + * @param {Boolean} [sheen=false] - Whether sheen is supported or not. + * @param {Boolean} [iridescence=false] - Whether iridescence is supported or not. + * @param {Boolean} [anisotropy=false] - Whether anisotropy is supported or not. + * @param {Boolean} [transmission=false] - Whether transmission is supported or not. + * @param {Boolean} [dispersion=false] - Whether dispersion is supported or not. + */ constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false ) { super(); + /** + * Whether clearcoat is supported or not. + * + * @type {Boolean} + * @default false + */ this.clearcoat = clearcoat; + + /** + * Whether sheen is supported or not. + * + * @type {Boolean} + * @default false + */ this.sheen = sheen; + + /** + * Whether iridescence is supported or not. + * + * @type {Boolean} + * @default false + */ this.iridescence = iridescence; + + /** + * Whether anisotropy is supported or not. + * + * @type {Boolean} + * @default false + */ this.anisotropy = anisotropy; + + /** + * Whether transmission is supported or not. + * + * @type {Boolean} + * @default false + */ this.transmission = transmission; + + /** + * Whether dispersion is supported or not. + * + * @type {Boolean} + * @default false + */ this.dispersion = dispersion; + /** + * The clear coat radiance. + * + * @type {Node?} + * @default null + */ this.clearcoatRadiance = null; + + /** + * The clear coat specular direct. + * + * @type {Node?} + * @default null + */ this.clearcoatSpecularDirect = null; + + /** + * The clear coat specular indirect. + * + * @type {Node?} + * @default null + */ this.clearcoatSpecularIndirect = null; + + /** + * The sheen specular direct. + * + * @type {Node?} + * @default null + */ this.sheenSpecularDirect = null; + + /** + * The sheen specular indirect. + * + * @type {Node?} + * @default null + */ this.sheenSpecularIndirect = null; + + /** + * The iridescence Fresnel. + * + * @type {Node?} + * @default null + */ this.iridescenceFresnel = null; + + /** + * The iridescence F0. + * + * @type {Node?} + * @default null + */ this.iridescenceF0 = null; } + /** + * Depending on what features are requested, the method prepares certain node variables + * which are later used for lighting computations. + * + * @param {ContextNode} input - The current node context. + */ start( context ) { if ( this.clearcoat === true ) { @@ -12886,6 +14065,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the direct light. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ direct( { lightDirection, lightColor, reflectedLight } ) { const dotNL = transformedNormalView.dot( lightDirection ).clamp(); @@ -12912,6 +14098,14 @@ class PhysicalLightingModel extends LightingModel { } + /** + * This method is intended for implementing the direct light term for + * rect area light nodes. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ directRectArea( { lightColor, lightPosition, halfWidth, halfHeight, reflectedLight, ltc_1, ltc_2 } ) { const p0 = lightPosition.add( halfWidth ).sub( halfHeight ); // counterclockwise; light shines in local neg z direction @@ -12925,8 +14119,8 @@ class PhysicalLightingModel extends LightingModel { const uv = LTC_Uv( { N, V, roughness } ); - const t1 = ltc_1.uv( uv ).toVar(); - const t2 = ltc_2.uv( uv ).toVar(); + const t1 = ltc_1.sample( uv ).toVar(); + const t2 = ltc_2.sample( uv ).toVar(); const mInv = mat3( vec3( t1.x, 0, t1.y ), @@ -12944,6 +14138,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the indirect lighting. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( context, stack, builder ) { this.indirectDiffuse( context, stack, builder ); @@ -12952,12 +14153,26 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the indirect diffuse term. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirectDiffuse( { irradiance, reflectedLight } ) { reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) ); } + /** + * Implements the indirect specular term. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirectSpecular( { radiance, iblIrradiance, reflectedLight } ) { if ( this.sheen === true ) { @@ -13007,6 +14222,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the ambient occlusion term. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ ambientOcclusion( { ambientOcclusion, reflectedLight } ) { const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV @@ -13033,6 +14255,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Used for final lighting accumulations depending on the requested features. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ finish( context ) { const { outgoingLight } = context; @@ -13299,7 +14528,7 @@ const bilinearCubeUV = /*@__PURE__*/ Fn( ( [ envMap, direction_immutable, mipInt uv.x.mulAssign( CUBEUV_TEXEL_WIDTH ); uv.y.mulAssign( CUBEUV_TEXEL_HEIGHT ); - return envMap.uv( uv ).grad( vec2(), vec2() ); // disable anisotropic filtering + return envMap.sample( uv ).grad( vec2(), vec2() ); // disable anisotropic filtering } ); @@ -14138,8 +15367,21 @@ const getGradientIrradiance = /*@__PURE__*/ Fn( ( { normal, lightDirection, buil } ); +/** + * Represents the lighting model for a toon material. Used in {@link MeshToonNodeMaterial}. + * + * @augments LightingModel + */ class ToonLightingModel extends LightingModel { + /** + * Implements the direct lighting. Instead of using a conventional smooth irradiance, the irradiance is + * reduced to a small number of discrete shades to create a comic-like, flat look. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ direct( { lightDirection, lightColor, reflectedLight }, stack, builder ) { const irradiance = getGradientIrradiance( { normal: normalGeometry, lightDirection, builder } ).mul( lightColor ); @@ -14148,6 +15390,13 @@ class ToonLightingModel extends LightingModel { } + /** + * Implements the indirect lighting. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( { ambientOcclusion, irradiance, reflectedLight } ) { reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) ); @@ -14190,6 +15439,12 @@ class MeshToonNodeMaterial extends NodeMaterial { } +/** + * Can be used to compute texture coordinates for projecting a + * matcap onto a mesh. Used by {@link MeshMatcapNodeMaterial}. + * + * @augments TempNode + */ class MatcapUVNode extends TempNode { static get type() { @@ -14198,6 +15453,9 @@ class MatcapUVNode extends TempNode { } + /** + * Constructs a new matcap uv node. + */ constructor() { super( 'vec2' ); @@ -14300,6 +15558,11 @@ class PointsNodeMaterial extends NodeMaterial { } +/** + * Applies a rotation to the given position node. + * + * @augments TempNode + */ class RotateNode extends TempNode { static get type() { @@ -14308,15 +15571,40 @@ class RotateNode extends TempNode { } + /** + * Constructs a new rotate node. + * + * @param {Node} positionNode - The position node. + * @param {Node} rotationNode - Represents the rotation that is applied to the position node. Depending + * on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value. + */ constructor( positionNode, rotationNode ) { super(); + /** + * The position node. + * + * @type {Node} + */ this.positionNode = positionNode; + + /** + * Represents the rotation that is applied to the position node. + * Depending on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value. + * + * @type {Node} + */ this.rotationNode = rotationNode; } + /** + * The type of the {@link RotateNode#positionNode} defines the node's type. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node's type. + */ getNodeType( builder ) { return this.positionNode.getNodeType( builder ); @@ -14478,22 +15766,45 @@ class SpriteNodeMaterial extends NodeMaterial { } +/** + * Represents lighting model for a shadow material. Used in {@link ShadowNodeMaterial}. + * + * @augments LightingModel + */ class ShadowMaskModel extends LightingModel { + /** + * Constructs a new shadow mask model. + */ constructor() { super(); + /** + * The shadow mask node. + * + * @type {Node} + */ this.shadowNode = float( 1 ).toVar( 'shadowMask' ); } + /** + * Only used to save the shadow mask. + * + * @param {Object} input - The input data. + */ direct( { shadowMask } ) { this.shadowNode.mulAssign( shadowMask ); } + /** + * Uses the shadow mask to produce the final color. + * + * @param {ContextNode} input - The current node context. + */ finish( context ) { diffuseColor.a.mulAssign( this.shadowNode.oneMinus() ); @@ -14570,9 +15881,9 @@ const normal = Fn( ( { texture, uv } ) => { const step = 0.01; - const x = texture.uv( uv.add( vec3( - step, 0.0, 0.0 ) ) ).r.sub( texture.uv( uv.add( vec3( step, 0.0, 0.0 ) ) ).r ); - const y = texture.uv( uv.add( vec3( 0.0, - step, 0.0 ) ) ).r.sub( texture.uv( uv.add( vec3( 0.0, step, 0.0 ) ) ).r ); - const z = texture.uv( uv.add( vec3( 0.0, 0.0, - step ) ) ).r.sub( texture.uv( uv.add( vec3( 0.0, 0.0, step ) ) ).r ); + const x = texture.sample( uv.add( vec3( - step, 0.0, 0.0 ) ) ).r.sub( texture.sample( uv.add( vec3( step, 0.0, 0.0 ) ) ).r ); + const y = texture.sample( uv.add( vec3( 0.0, - step, 0.0 ) ) ).r.sub( texture.sample( uv.add( vec3( 0.0, step, 0.0 ) ) ).r ); + const z = texture.sample( uv.add( vec3( 0.0, 0.0, - step ) ) ).r.sub( texture.sample( uv.add( vec3( 0.0, 0.0, step ) ) ).r ); ret.assign( vec3( x, y, z ) ); @@ -14701,7 +16012,7 @@ class VolumeNodeMaterial extends NodeMaterial { Loop( { type: 'float', start: bounds.x, end: bounds.y, update: '+= delta' }, () => { - const d = property( 'float', 'd' ).assign( map.uv( p.add( 0.5 ) ).r ); + const d = property( 'float', 'd' ).assign( map.sample( p.add( 0.5 ) ).r ); if ( this.testNode !== null ) { @@ -17279,6 +18590,11 @@ class Color4 extends Color { } +/** + * Special version of {@link PropertyNode} which is used for parameters. + * + * @augments PropertyNode + */ class ParameterNode extends PropertyNode { static get type() { @@ -17287,10 +18603,23 @@ class ParameterNode extends PropertyNode { } + /** + * Constructs a new parameter node. + * + * @param {String} nodeType - The type of the node. + * @param {String?} [name=null] - The name of the parameter in the shader. + */ constructor( nodeType, name = null ) { super( nodeType, name ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isParameterNode = true; } @@ -17311,6 +18640,12 @@ class ParameterNode extends PropertyNode { const parameter = ( type, name ) => nodeObject( new ParameterNode( type, name ) ); +/** + * Stack is a helper for Nodes that need to produce stack-based code instead of continuous flow. + * They are usually needed in cases like `If`, `Else`. + * + * @augments Node + */ class StackNode extends Node { static get type() { @@ -17319,17 +18654,54 @@ class StackNode extends Node { } + /** + * Constructs a new stack node. + * + * @param {StackNode?} [parent=null] - The parent stack node. + */ constructor( parent = null ) { super(); + /** + * List of nodes. + * + * @type {Array} + */ this.nodes = []; + + /** + * The output node. + * + * @type {Node?} + * @default null + */ this.outputNode = null; + /** + * The parent stack node. + * + * @type {StackNode} + * @default null + */ this.parent = parent; + /** + * The current conditional node. + * + * @private + * @type {ConditionalNode} + * @default null + */ this._currentCond = null; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isStackNode = true; } @@ -17340,6 +18712,12 @@ class StackNode extends Node { } + /** + * Adds a node to this stack. + * + * @param {Node} node - The node to add. + * @return {StackNode} A reference to this stack node. + */ add( node ) { this.nodes.push( node ); @@ -17348,6 +18726,13 @@ class StackNode extends Node { } + /** + * Represent an `if` statement in TSL. + * + * @param {Node} boolNode - Represents the condition. + * @param {Function} method - TSL code which is executed if the condition evaluates to `true`. + * @return {StackNode} A reference to this stack node. + */ If( boolNode, method ) { const methodNode = new ShaderNode( method ); @@ -17357,6 +18742,13 @@ class StackNode extends Node { } + /** + * Represent an `elseif` statement in TSL. + * + * @param {Node} boolNode - Represents the condition. + * @param {Function} method - TSL code which is executed if the condition evaluates to `true`. + * @return {StackNode} A reference to this stack node. + */ ElseIf( boolNode, method ) { const methodNode = new ShaderNode( method ); @@ -17369,6 +18761,12 @@ class StackNode extends Node { } + /** + * Represent an `else` statement in TSL. + * + * @param {Function} method - TSL code which is executed in the `else` case. + * @return {StackNode} A reference to this stack node. + */ Else( method ) { this._currentCond.elseNode = new ShaderNode( method ); @@ -17809,8 +19207,27 @@ const overloadingBaseFn = /*@__PURE__*/ nodeProxy( FunctionOverloadingNode ); const overloadingFn = ( functionNodes ) => ( ...params ) => overloadingBaseFn( functionNodes, ...params ); +/** @module Timer **/ + +/** + * Represents the elapsed time in seconds. + * + * @type {UniformNode} + */ const time = /*@__PURE__*/ uniform( 0 ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.time ); + +/** + * Represents the delta time in seconds. + * + * @type {UniformNode} + */ const deltaTime = /*@__PURE__*/ uniform( 0 ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.deltaTime ); + +/** + * Represents the current frame ID. + * + * @type {UniformNode} + */ const frameId = /*@__PURE__*/ uniform( 0, 'uint' ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.frameId ); // Deprecated @@ -17836,17 +19253,70 @@ const timerDelta = ( timeScale = 1 ) => { // @deprecated, r170 }; +/** @module Oscillators **/ + +/** + * Generates a sine wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscSine = ( t = time ) => t.add( 0.75 ).mul( Math.PI * 2 ).sin().mul( 0.5 ).add( 0.5 ); + +/** + * Generates a square wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscSquare = ( t = time ) => t.fract().round(); + +/** + * Generates a triangle wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscTriangle = ( t = time ) => t.add( 0.5 ).fract().mul( 2 ).sub( 1 ).abs(); + +/** + * Generates a sawtooth wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscSawtooth = ( t = time ) => t.fract(); +/** @module UVUtils **/ + +/** + * Rotates the given uv coordinates around a center point + * + * @method + * @param {Node} uv - The uv coordinates. + * @param {Node} rotation - The rotation defined in radians. + * @param {Node} center - The center of rotation + * @return {Node} The rotated uv coordinates. + */ const rotateUV = /*@__PURE__*/ Fn( ( [ uv, rotation, center = vec2( 0.5 ) ] ) => { return rotate( uv.sub( center ), rotation ).add( center ); } ); +/** + * Applies a spherical warping effect to the given uv coordinates. + * + * @method + * @param {Node} uv - The uv coordinates. + * @param {Node} strength - The strength of the effect. + * @param {Node} center - The center point + * @return {Node} The updated uv coordinates. + */ const spherizeUV = /*@__PURE__*/ Fn( ( [ uv, strength, center = vec2( 0.5 ) ] ) => { const delta = uv.sub( center ); @@ -17858,6 +19328,23 @@ const spherizeUV = /*@__PURE__*/ Fn( ( [ uv, strength, center = vec2( 0.5 ) ] ) } ); +/** @module SpriteUtils **/ + +/** + * This can be used to achieve a billboarding behavior for flat meshes. That means they are + * oriented always towards the camera. + * + * ```js + * material.vertexNode = billboarding(); + * ``` + * + * @method + * @param {Object} config - The configuration object. + * @param {Node?} [config.position=null] - Can be used to define the vertex positions in world space. + * @param {Boolean} [config.horizontal=true] - Whether to follow the camera rotation horizontally or not. + * @param {Boolean} [config.vertical=false] - Whether to follow the camera rotation vertically or not. + * @return {Node} The updated vertex position in clip space. + */ const billboarding = /*@__PURE__*/ Fn( ( { position = null, horizontal = true, vertical = false } ) => { let worldMatrix; @@ -17901,6 +19388,19 @@ const billboarding = /*@__PURE__*/ Fn( ( { position = null, horizontal = true, v } ); +/** @module ViewportUtils **/ + +/** + * A special version of a screen uv function that involves a depth comparison + * when computing the final uvs. The function mitigates visual erros when + * using viewport texture nodes for refraction purposes. Without this function + * objects in front of a refractive surface might appear on the refractive surface + * which is incorrect. + * + * @method + * @param {Node?} uv - Optional uv coordinates. By default `screenUV` is used. + * @return {Node} The update uv coordinates. + */ const viewportSafeUV = /*@__PURE__*/ Fn( ( [ uv = null ] ) => { const depth = linearDepth(); @@ -17911,6 +19411,17 @@ const viewportSafeUV = /*@__PURE__*/ Fn( ( [ uv = null ] ) => { } ); +/** + * Can be used to compute texture coordinates for animated sprite sheets. + * + * ```js + * const uvNode = spritesheetUV( vec2( 6, 6 ), uv(), time.mul( animationSpeed ) ); + * + * material.colorNode = texture( spriteSheet, uvNode ); + * ``` + * + * @augments Node + */ class SpriteSheetUVNode extends Node { static get type() { @@ -17919,12 +19430,36 @@ class SpriteSheetUVNode extends Node { } + /** + * Constructs a new sprite sheet uv node. + * + * @param {Node} countNode - The node that defines the number of sprites in the x and y direction (e.g 6x6). + * @param {Node} [uvNode=uv()] - The uv node. + * @param {Node} [frameNode=float()] - The node that defines the current frame/sprite. + */ constructor( countNode, uvNode = uv(), frameNode = float( 0 ) ) { super( 'vec2' ); + /** + * The node that defines the number of sprites in the x and y direction (e.g 6x6). + * + * @type {Node} + */ this.countNode = countNode; + + /** + * The uv node. + * + * @type {Node} + */ this.uvNode = uvNode; + + /** + * The node that defines the current frame/sprite. + * + * @type {Node} + */ this.frameNode = frameNode; } @@ -17951,6 +19486,15 @@ class SpriteSheetUVNode extends Node { const spritesheetUV = /*@__PURE__*/ nodeProxy( SpriteSheetUVNode ); +/** + * Can be used for triplanar texture mapping. + * + * ```js + * material.colorNode = triplanarTexture( texture( diffuseMap ) ); + * ``` + * + * @augments Node + */ class TriplanarTexturesNode extends Node { static get type() { @@ -17959,17 +19503,65 @@ class TriplanarTexturesNode extends Node { } + /** + * Constructs a new triplanar textures node. + * + * @param {Node} textureXNode - First texture node. + * @param {Node?} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead. + * @param {Node?} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead. + * @param {Node?} [scaleNode=float(1)] - The scale node. + * @param {Node?} [positionNode=positionLocal] - Vertex positions in local space. + * @param {Node?} [normalNode=normalLocal] - Normals in local space. + */ constructor( textureXNode, textureYNode = null, textureZNode = null, scaleNode = float( 1 ), positionNode = positionLocal, normalNode = normalLocal ) { super( 'vec4' ); + /** + * First texture node. + * + * @type {Node} + */ this.textureXNode = textureXNode; + + /** + * Second texture node. When not set, the shader will sample from `textureXNode` instead. + * + * @type {Node} + * @default null + */ this.textureYNode = textureYNode; + + /** + * Third texture node. When not set, the shader will sample from `textureXNode` instead. + * + * @type {Node} + * @default null + */ this.textureZNode = textureZNode; + /** + * The scale node. + * + * @type {Node} + * @default float(1) + */ this.scaleNode = scaleNode; + /** + * Vertex positions in local space. + * + * @type {Node} + * @default positionLocal + */ this.positionNode = positionNode; + + /** + * Normals in local space. + * + * @type {Node} + * @default normalLocal + */ this.normalNode = normalNode; } @@ -18028,6 +19620,19 @@ _defaultRT.depthTexture = new DepthTexture( 1, 1 ); let _inReflector = false; +/** + * This node can be used to implement mirror-like flat reflective surfaces. + * + * ```js + * const groundReflector = reflector(); + * material.colorNode = groundReflector; + * + * const plane = new Mesh( geometry, material ); + * plane.add( groundReflector.target ); + * ``` + * + * @augments TextureNode + */ class ReflectorNode extends TextureNode { static get type() { @@ -18036,29 +19641,70 @@ class ReflectorNode extends TextureNode { } + /** + * Constructs a new reflector node. + * + * @param {Object} [parameters={}] - An object holding configuration parameters. + * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to. + * @param {Number} [parameters.resolution=1] - The resolution scale. + * @param {Boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not. + * @param {Boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not. + * @param {Boolean} [parameters.depth=false] - Whether depth data should be generated or not. + */ constructor( parameters = {} ) { super( parameters.defaultTexture || _defaultRT.texture, _defaultUV ); + /** + * A reference to the internal reflector base node which holds the actual implementation. + * + * @private + * @type {Node?} + * @default null + */ this._reflectorBaseNode = parameters.reflector || new ReflectorBaseNode( this, parameters ); + + /** + * A reference to the internal depth node. + * + * @private + * @type {Node?} + * @default null + */ this._depthNode = null; this.setUpdateMatrix( false ); } + /** + * A reference to the internal reflector node. + * + * @type {Node} + */ get reflector() { return this._reflectorBaseNode; } + /** + * A reference to 3D object the reflector is linked to. + * + * @type {Object3D} + */ get target() { return this._reflectorBaseNode.target; } + /** + * Returns a node representing the mirror's depth. That can be used + * to implement more advanced reflection effects like distance attenuation. + * + * @return {Node} The depth node. + */ getDepthNode() { if ( this._depthNode === null ) { @@ -18100,7 +19746,15 @@ class ReflectorNode extends TextureNode { } - +/** + * Holds the actual implementation of the reflector. + * + * TOOD: Explain why `ReflectorBaseNode`. Originally the entire logic was implemented + * in `ReflectorNode`, see #29619. + * + * @private + * @augments Node + */ class ReflectorBaseNode extends Node { static get type() { @@ -18109,6 +19763,17 @@ class ReflectorBaseNode extends Node { } + /** + * Constructs a new reflector base node. + * + * @param {TextureNode} textureNode - Represents the rendered reflections as a texture node. + * @param {Object} [parameters={}] - An object holding configuration parameters. + * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to. + * @param {Number} [parameters.resolution=1] - The resolution scale. + * @param {Boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not. + * @param {Boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not. + * @param {Boolean} [parameters.depth=false] - Whether depth data should be generated or not. + */ constructor( textureNode, parameters = {} ) { super(); @@ -18121,23 +19786,85 @@ class ReflectorBaseNode extends Node { depth = false } = parameters; - // - + /** + * Represents the rendered reflections as a texture node. + * + * @type {TextureNode} + */ this.textureNode = textureNode; + /** + * The 3D object the reflector is linked to. + * + * @type {Object3D} + * @default {new Object3D()} + */ this.target = target; + + /** + * The resolution scale. + * + * @type {Number} + * @default {1} + */ this.resolution = resolution; + + /** + * Whether mipmaps should be generated or not. + * + * @type {Boolean} + * @default {false} + */ this.generateMipmaps = generateMipmaps; + + /** + * Whether reflectors can render other reflector nodes or not. + * + * @type {Boolean} + * @default {true} + */ this.bounces = bounces; + + /** + * Whether depth data should be generated or not. + * + * @type {Boolean} + * @default {false} + */ this.depth = depth; + /** + * The `updateBeforeType` is set to `NodeUpdateType.RENDER` when {@link ReflectorBaseNode#bounces} + * is `true`. Otherwise it's `NodeUpdateType.FRAME`. + * + * @type {String} + * @default 'render' + */ this.updateBeforeType = bounces ? NodeUpdateType.RENDER : NodeUpdateType.FRAME; + /** + * Weak map for managing virtual cameras. + * + * @type {WeakMap} + */ this.virtualCameras = new WeakMap(); + + /** + * Weak map for managing render targets. + * + * @type {WeakMap} + */ this.renderTargets = new WeakMap(); } + /** + * Updates the resolution of the internal render target. + * + * @private + * @param {RenderTarget} renderTarget - The render target to resize. + * @param {Renderer} renderer - The renderer that is used to determine the new size. + */ _updateResolution( renderTarget, renderer ) { const resolution = this.resolution; @@ -18156,6 +19883,13 @@ class ReflectorBaseNode extends Node { } + /** + * Returns a virtual camera for the given camera. The virutal camera is used to + * render the scene from the reflector's view so correct reflections can be produced. + * + * @param {Camera} camera - The scene's camera. + * @return {Camera} The corresponding virtual camera. + */ getVirtualCamera( camera ) { let virtualCamera = this.virtualCameras.get( camera ); @@ -18172,6 +19906,13 @@ class ReflectorBaseNode extends Node { } + /** + * Returns a render target for the given camera. The reflections are rendered + * into this render target. + * + * @param {Camera} camera - The scene's camera. + * @return {RenderTarget} The render target. + */ getRenderTarget( camera ) { let renderTarget = this.renderTargets.get( camera ); @@ -18370,6 +20111,14 @@ class QuadMesh extends Mesh { const _size$1 = /*@__PURE__*/ new Vector2(); +/** + * `RTTNode` takes another node and uses it with a `QuadMesh` to render into a texture (RTT). + * This module is especially relevant in context of post processing where certain nodes require + * texture input for their effects. With the helper function `convertToTexture()` which is based + * on this module, the node system can automatically ensure texture input if required. + * + * @augments Node + */ class RTTNode extends TextureNode { static get type() { @@ -18378,30 +20127,110 @@ class RTTNode extends TextureNode { } + /** + * Constructs a new RTT node. + * + * @param {Node} node - The node to render a texture with. + * @param {Number?} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized. + * @param {Number?} [height=null] - The height of the internal render target. + * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target. + */ constructor( node, width = null, height = null, options = { type: HalfFloatType } ) { const renderTarget = new RenderTarget( width, height, options ); super( renderTarget.texture, uv() ); + /** + * The node to render a texture with. + * + * @type {Node} + */ this.node = node; + + /** + * The width of the internal render target. + * If not width is applied, the render target is automatically resized. + * + * @type {Number?} + * @default null + */ this.width = width; + + /** + * The height of the internal render target. + * + * @type {Number?} + * @default null + */ this.height = height; + /** + * The pixel ratio + * + * @type {Number} + * @default 1 + */ + this.pixelRatio = 1; + + /** + * The render target + * + * @type {RenderTarget} + */ this.renderTarget = renderTarget; + /** + * Whether the texture requires an update or not. + * + * @type {Boolean} + * @default true + */ this.textureNeedsUpdate = true; - this.autoUpdate = true; - this.updateMap = new WeakMap(); + /** + * Whether the texture should automatically be updated or not. + * + * @type {Boolean} + * @default true + */ + this.autoUpdate = true; + /** + * The node which is used with the quad mesh for RTT. + * + * @private + * @type {Node} + * @default null + */ this._rttNode = null; + + /** + * The internal quad mesh for RTT. + * + * @private + * @type {QuadMesh} + */ this._quadMesh = new QuadMesh( new NodeMaterial() ); + /** + * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates + * the texture once per render in its {@link RTTNode#updateBefore} method. + * + * @type {String} + * @default 'render' + */ this.updateBeforeType = NodeUpdateType.RENDER; } + /** + * Whether the internal render target should automatically be resized or not. + * + * @type {Boolean} + * @readonly + * @default true + */ get autoSize() { return this.width === null; @@ -18418,6 +20247,12 @@ class RTTNode extends TextureNode { } + /** + * Sets the size of the internal render target + * + * @param {Number} width - The width to set. + * @param {Number} height - The width to set. + */ setSize( width, height ) { this.width = width; @@ -18432,6 +20267,11 @@ class RTTNode extends TextureNode { } + /** + * Sets the pixel ratio. This will also resize the render target. + * + * @param {Number} pixelRatio - The pixel ratio to set. + */ setPixelRatio( pixelRatio ) { this.pixelRatio = pixelRatio; @@ -18504,10 +20344,10 @@ const convertToTexture = ( node, ...params ) => { * depth value and the camera's inverse projection matrix. * * @method - * @param {vec2} screenPosition - The fragment's screen position expressed as uv coordinates. - * @param {float} depth - The fragment's depth value. - * @param {mat4} projectionMatrixInverse - The camera's inverse projection matrix. - * @return {vec3} The fragments position in view space. + * @param {Node} screenPosition - The fragment's screen position expressed as uv coordinates. + * @param {Node} depth - The fragment's depth value. + * @param {Node} projectionMatrixInverse - The camera's inverse projection matrix. + * @return {Node} The fragments position in view space. */ const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, projectionMatrixInverse ], builder ) => { @@ -18535,9 +20375,9 @@ const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, projectionM * and the camera's projection matrix * * @method - * @param {vec3} viewPosition - The fragments position in view space. - * @param {mat4} projectionMatrix - The camera's projection matrix. - * @return {vec2} The fragment's screen position expressed as uv coordinates. + * @param {Node} viewPosition - The fragments position in view space. + * @param {Node} projectionMatrix - The camera's projection matrix. + * @return {Node} The fragment's screen position expressed as uv coordinates. */ const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionMatrix ] ) => { @@ -18552,10 +20392,10 @@ const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionMatrix ] * target is available or if flat surface normals are required. * * @method - * @param {vec2} uv - The texture coordinate. + * @param {Node} uv - The texture coordinate. * @param {DepthTexture} depthTexture - The depth texture. - * @param {mat4} projectionMatrixInverse - The camera's inverse projection matrix. - * @return {vec3} The computed normal vector. + * @param {Node} projectionMatrixInverse - The camera's inverse projection matrix. + * @return {Node} The computed normal vector. */ const getNormalFromDepth = /*@__PURE__*/ Fn( ( [ uv, depthTexture, projectionMatrixInverse ] ) => { @@ -18615,6 +20455,17 @@ class StorageBufferAttribute extends BufferAttribute { } +/** + * This class enables element access on instances of {@link StorageBufferNode}. + * In most cases, it is indirectly used when accessing elements with the + * {@link StorageBufferNode#element} method. + * + * ```js + * const position = positionStorage.element( instanceIndex ); + * ``` + * + * @augments ArrayElementNode + */ class StorageArrayElementNode extends ArrayElementNode { static get type() { @@ -18623,14 +20474,32 @@ class StorageArrayElementNode extends ArrayElementNode { } + /** + * Constructs storage buffer element node. + * + * @param {StorageBufferNode} node - The storage buffer node. + * @param {Node} indexNode - The index node that defines the element access. + */ constructor( storageBufferNode, indexNode ) { super( storageBufferNode, indexNode ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isStorageArrayElementNode = true; } + /** + * The storage buffer node. + * + * @type {StorageBufferNode} + */ set storageBufferNode( value ) { this.node = value; @@ -19446,18 +21315,43 @@ const overlay = ( ...params ) => { // @deprecated, r171 /** @module ColorAdjustment **/ +/** + * Computes a grayscale value for the given RGB color value. + * + * @method + * @param {vec3} color - The color value to compute the grayscale for. + * @return {vec3} The grayscale color. + */ const grayscale = /*@__PURE__*/ Fn( ( [ color ] ) => { return luminance( color.rgb ); } ); +/** + * Super-saturates or desaturates the given RGB color. + * + * @method + * @param {vec3} color - The input color. + * @param {float} [adjustment=1] - Specifies the amount of the conversion. A value under `1` desaturates the color, a value over `1` super-saturates it. + * @return {vec3} The saturated color. + */ const saturation = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { return adjustment.mix( luminance( color.rgb ), color.rgb ); } ); +/** + * Selectively enhance the intensity of less saturated RGB colors. Can result + * in a more natural and visually appealing image with enhanced color depth + * compared to {@link ColorAdjustment#saturation}. + * + * @method + * @param {vec3} color - The input color. + * @param {float} [adjustment=1] - Controls the intensity of the vibrance effect. + * @return {vec3} The updated color. + */ const vibrance = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { const average = add( color.r, color.g, color.b ).div( 3.0 ); @@ -19469,6 +21363,14 @@ const vibrance = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { } ); +/** + * Updates the hue component of the given RGB color while preserving its luminance and saturation. + * + * @method + * @param {vec3} color - The input color. + * @param {float} [adjustment=1] - Defines the degree of hue rotation in radians. A positive value rotates the hue clockwise, while a negative value rotates it counterclockwise. + * @return {vec3} The updated color. + */ const hue = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { const k = vec3( 0.57735, 0.57735, 0.57735 ); @@ -19479,13 +21381,19 @@ const hue = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { } ); +/** + * Computes the luminance for the given RGB color value. + * + * @method + * @param {vec3} color - The color value to compute the luminance for. + * @param {vec3?} luminanceCoefficients - The luminance coefficients. By default predefined values of the current working color space are used. + * @return {vec3} The luminance. + */ const luminance = ( color, luminanceCoefficients = vec3( ColorManagement.getLuminanceCoefficients( new Vector3() ) ) ) => dot( color, luminanceCoefficients ); -const threshold = ( color, threshold ) => mix( vec3( 0.0 ), color, luminance( color ).sub( threshold ).max( 0 ) ); - /** * Color Decision List (CDL) v1.2 * @@ -19536,6 +21444,12 @@ const cdl = /*@__PURE__*/ Fn( ( [ } ); +/** + * Represents a posterize effect which reduces the number of colors + * in an image, resulting in a more blocky and stylized appearance. + * + * @augments TempNode + */ class PosterizeNode extends TempNode { static get type() { @@ -19544,11 +21458,28 @@ class PosterizeNode extends TempNode { } + /** + * Constructs a new posterize node. + * + * @param {Node} sourceNode - The input color. + * @param {Node} stepsNode - Controls the intensity of the posterization effect. A lower number results in a more blocky appearance. + */ constructor( sourceNode, stepsNode ) { super(); + /** + * The input color. + * + * @type {Node} + */ this.sourceNode = sourceNode; + + /** + * Controls the intensity of the posterization effect. A lower number results in a more blocky appearance. + * + * @type {Node} + */ this.stepsNode = stepsNode; } @@ -19567,6 +21498,12 @@ const posterize = /*@__PURE__*/ nodeProxy( PosterizeNode ); const _size = /*@__PURE__*/ new Vector2(); +/** + * Represents the texture of a pass node. + * + * @augments TextureNode + * @private + */ class PassTextureNode extends TextureNode { static get type() { @@ -19575,10 +21512,21 @@ class PassTextureNode extends TextureNode { } + /** + * Constructs a new pass texture node. + * + * @param {PassNode} passNode - The pass node. + * @param {Texture} texture - The output texture. + */ constructor( passNode, texture ) { super( texture ); + /** + * A reference to the pass node. + * + * @type {PassNode} + */ this.passNode = passNode; this.setUpdateMatrix( false ); @@ -19601,6 +21549,13 @@ class PassTextureNode extends TextureNode { } +/** + * An extension of `PassTextureNode` which allows to manage more than one + * internal texture. Relevant for the `getPreviousTexture()` related API. + * + * @augments PassTextureNode + * @private + */ class PassMultipleTextureNode extends PassTextureNode { static get type() { @@ -19609,15 +21564,40 @@ class PassMultipleTextureNode extends PassTextureNode { } + /** + * Constructs a new pass texture node. + * + * @param {PassNode} passNode - The pass node. + * @param {String} textureName - The output texture name. + * @param {Boolean} [previousTexture=false] - Whether previous frame data should be used or not. + */ constructor( passNode, textureName, previousTexture = false ) { + // null is passed to the super call since this class does not + // use an external texture for rendering pass data into. Instead + // the texture is managed by the pass node itself + super( passNode, null ); + /** + * The output texture name. + * + * @type {String} + */ this.textureName = textureName; + + /** + * Whether previous frame data should be used or not. + * + * @type {Boolean} + */ this.previousTexture = previousTexture; } + /** + * Updates the texture reference of this node. + */ updateTexture() { this.value = this.previousTexture ? this.passNode.getPreviousTexture( this.textureName ) : this.passNode.getTexture( this.textureName ); @@ -19640,6 +21620,21 @@ class PassMultipleTextureNode extends PassTextureNode { } +/** + * Represents a render pass (sometimes called beauty pass) in context of post processing. + * This pass produces a render for the given scene and camera and can provide multiple outputs + * via MRT for further processing. + * + * ```js + * const postProcessing = new PostProcessing( renderer ); + * + * const scenePass = pass( scene, camera ); + * + * postProcessing.outputNode = scenePass; + * ``` + * + * @augments TempNode + */ class PassNode extends TempNode { static get type() { @@ -19648,17 +21643,69 @@ class PassNode extends TempNode { } + /** + * Constructs a new pass node. + * + * @param {('color'|'depth')} scope - The scope of the pass. The scope determines whether the node outputs color or depth. + * @param {Scene} scene - A reference to the scene. + * @param {Camera} camera - A reference to the camera. + * @param {Object} options - Options for the internal render target. + */ constructor( scope, scene, camera, options = {} ) { super( 'vec4' ); + /** + * The scope of the pass. The scope determines whether the node outputs color or depth. + * + * @type {('color'|'depth')} + */ this.scope = scope; + + /** + * A reference to the scene. + * + * @type {Scene} + */ this.scene = scene; + + /** + * A reference to the camera. + * + * @type {camera} + */ this.camera = camera; + + /** + * Options for the internal render target. + * + * @type {Object} + */ this.options = options; + /** + * The pass's pixel ratio. Will be kept automatically kept in sync with the renderer's pixel ratio. + * + * @private + * @type {Number} + * @default 1 + */ this._pixelRatio = 1; + + /** + * The pass's pixel width. Will be kept automatically kept in sync with the renderer's width. + * @private + * @type {Number} + * @default 1 + */ this._width = 1; + + /** + * The pass's pixel height. Will be kept automatically kept in sync with the renderer's height. + * @private + * @type {Number} + * @default 1 + */ this._height = 1; const depthTexture = new DepthTexture(); @@ -19670,31 +21717,117 @@ class PassNode extends TempNode { renderTarget.texture.name = 'output'; renderTarget.depthTexture = depthTexture; + /** + * The pass's render target. + * + * @type {RenderTarget} + */ this.renderTarget = renderTarget; - this.updateBeforeType = NodeUpdateType.FRAME; - + /** + * A dictionary holding the internal result textures. + * + * @private + * @type {Object} + */ this._textures = { output: renderTarget.texture, depth: depthTexture }; + /** + * A dictionary holding the internal texture nodes. + * + * @private + * @type {Object} + */ this._textureNodes = {}; + + /** + * A dictionary holding the internal depth nodes. + * + * @private + * @type {Object} + */ this._linearDepthNodes = {}; + + /** + * A dictionary holding the internal viewZ nodes. + * + * @private + * @type {Object} + */ this._viewZNodes = {}; + /** + * A dictionary holding the texture data of the previous frame. + * Used for computing velocity/motion vectors. + * + * @private + * @type {Object} + */ this._previousTextures = {}; + + /** + * A dictionary holding the texture nodes of the previous frame. + * Used for computing velocity/motion vectors. + * + * @private + * @type {Object} + */ this._previousTextureNodes = {}; + /** + * The `near` property of the camera as a uniform. + * + * @private + * @type {UniformNode} + */ this._cameraNear = uniform( 0 ); + + /** + * The `far` property of the camera as a uniform. + * + * @private + * @type {UniformNode} + */ this._cameraFar = uniform( 0 ); + /** + * A MRT node configuring the MRT settings. + * + * @private + * @type {MRTNode?} + * @default null + */ this._mrt = null; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isPassNode = true; + /** + * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the + * scene once per frame in its {@link PassNode#updateBefore} method. + * + * @type {String} + * @default 'frame' + */ + this.updateBeforeType = NodeUpdateType.FRAME; + } + /** + * Sets the given MRT node to setup MRT for this pass. + * + * @param {MRTNode} mrt - The MRT object. + * @return {PassNode} A reference to this pass. + */ setMRT( mrt ) { this._mrt = mrt; @@ -19703,18 +21836,34 @@ class PassNode extends TempNode { } + /** + * Returns the current MRT node. + * + * @return {MRTNode} The current MRT node. + */ getMRT() { return this._mrt; } + /** + * The method is overwritten so it always returns `true`. + * + * @return {Boolean} Whether this node is global or not. + */ isGlobal() { return true; } + /** + * Returns the texture for the given output name. + * + * @param {String} name - The output name to get the texture for. + * @return {Texture} The texture. + */ getTexture( name ) { let texture = this._textures[ name ]; @@ -19724,7 +21873,6 @@ class PassNode extends TempNode { const refTexture = this.renderTarget.texture; texture = refTexture.clone(); - texture.isRenderTargetTexture = true; texture.name = name; this._textures[ name ] = texture; @@ -19737,6 +21885,12 @@ class PassNode extends TempNode { } + /** + * Returns the texture holding the data of the previous frame for the given output name. + * + * @param {String} name - The output name to get the texture for. + * @return {Texture} The texture holding the data of the previous frame. + */ getPreviousTexture( name ) { let texture = this._previousTextures[ name ]; @@ -19744,7 +21898,6 @@ class PassNode extends TempNode { if ( texture === undefined ) { texture = this.getTexture( name ).clone(); - texture.isRenderTargetTexture = true; this._previousTextures[ name ] = texture; @@ -19754,6 +21907,11 @@ class PassNode extends TempNode { } + /** + * Switches current and previous textures for the given output name. + * + * @param {String} name - The output name. + */ toggleTexture( name ) { const prevTexture = this._previousTextures[ name ]; @@ -19775,6 +21933,12 @@ class PassNode extends TempNode { } + /** + * Returns the texture node for the given output name. + * + * @param {String} [name='output'] - The output name to get the texture node for. + * @return {TextureNode} The texture node. + */ getTextureNode( name = 'output' ) { let textureNode = this._textureNodes[ name ]; @@ -19791,6 +21955,12 @@ class PassNode extends TempNode { } + /** + * Returns the previous texture node for the given output name. + * + * @param {String} [name='output'] - The output name to get the previous texture node for. + * @return {TextureNode} The previous texture node. + */ getPreviousTextureNode( name = 'output' ) { let textureNode = this._previousTextureNodes[ name ]; @@ -19809,6 +21979,12 @@ class PassNode extends TempNode { } + /** + * Returns a viewZ node of this pass. + * + * @param {String} [name='depth'] - The output name to get the viewZ node for. In most cases the default `'depth'` can be used however the parameter exists for custom depth outputs. + * @return {Node} The viewZ node. + */ getViewZNode( name = 'depth' ) { let viewZNode = this._viewZNodes[ name ]; @@ -19826,6 +22002,12 @@ class PassNode extends TempNode { } + /** + * Returns a linear depth node of this pass. + * + * @param {String} [name='depth'] - The output name to get the linear depth node for. In most cases the default `'depth'` can be used however the parameter exists for custom depth outputs. + * @return {Node} The linear depth node. + */ getLinearDepthNode( name = 'depth' ) { let linearDepthNode = this._linearDepthNodes[ name ]; @@ -19857,8 +22039,6 @@ class PassNode extends TempNode { } - this.renderTarget.depthTexture.isMultisampleRenderTargetTexture = this.renderTarget.samples > 1; - return this.scope === PassNode.COLOR ? this.getTextureNode() : this.getLinearDepthNode(); } @@ -19896,6 +22076,12 @@ class PassNode extends TempNode { } + /** + * Sets the size of the pass's render target. Honors the pixel ratio. + * + * @param {Number} width - The width to set. + * @param {Number} height - The height to set. + */ setSize( width, height ) { this._width = width; @@ -19908,6 +22094,11 @@ class PassNode extends TempNode { } + /** + * Sets the pixel ratio the pass's render target and updates the size. + * + * @param {Number} pixelRatio - The pixel ratio to set. + */ setPixelRatio( pixelRatio ) { this._pixelRatio = pixelRatio; @@ -19916,6 +22107,9 @@ class PassNode extends TempNode { } + /** + * Frees internal resources. Should be called when the node is no longer in use. + */ dispose() { this.renderTarget.dispose(); @@ -19932,6 +22126,20 @@ const pass = ( scene, camera, options ) => nodeObject( new PassNode( PassNode.CO const passTexture = ( pass, texture ) => nodeObject( new PassTextureNode( pass, texture ) ); const depthPass = ( scene, camera ) => nodeObject( new PassNode( PassNode.DEPTH, scene, camera ) ); +/** + * Represents a render pass for producing a toon outline effect on compatible objects. + * Only 3D objects with materials of type `MeshToonMaterial` and `MeshToonNodeMaterial` + * will receive the outline. + * + * ```js + * const postProcessing = new PostProcessing( renderer ); + * + * const scenePass = toonOutlinePass( scene, camera ); + * + * postProcessing.outputNode = scenePass; + * ``` + * @augments PassNode + */ class ToonOutlinePassNode extends PassNode { static get type() { @@ -19940,14 +22148,46 @@ class ToonOutlinePassNode extends PassNode { } + /** + * Constructs a new outline pass node. + * + * @param {Scene} scene - A reference to the scene. + * @param {Camera} camera - A reference to the camera. + * @param {Node} colorNode - Defines the outline's color. + * @param {Node} thicknessNode - Defines the outline's thickness. + * @param {Node} alphaNode - Defines the outline's alpha. + */ constructor( scene, camera, colorNode, thicknessNode, alphaNode ) { super( PassNode.COLOR, scene, camera ); + /** + * Defines the outline's color. + * + * @type {Node} + */ this.colorNode = colorNode; + + /** + * Defines the outline's thickness. + * + * @type {Node} + */ this.thicknessNode = thicknessNode; + + /** + * Defines the outline's alpha. + * + * @type {Node} + */ this.alphaNode = alphaNode; + /** + * An internal material cache. + * + * @private + * @type {WeakMap} + */ this._materialCache = new WeakMap(); } @@ -19985,6 +22225,12 @@ class ToonOutlinePassNode extends PassNode { } + /** + * Creates the material used for outline rendering. + * + * @private + * @return {NodeMaterial} The outline material. + */ _createMaterial() { const material = new NodeMaterial(); @@ -20012,6 +22258,14 @@ class ToonOutlinePassNode extends PassNode { } + /** + * For the given toon material, this method returns a correspoding + * outline material. + * + * @private + * @param {(MeshToonMaterial|MeshToonNodeMaterial)} originalMaterial - The toon material. + * @return {NodeMaterial} The outline material. + */ _getOutlineMaterial( originalMaterial ) { let outlineMaterial = this._materialCache.get( originalMaterial ); @@ -20032,8 +22286,16 @@ class ToonOutlinePassNode extends PassNode { const toonOutlinePass = ( scene, camera, color = new Color( 0, 0, 0 ), thickness = 0.003, alpha = 1 ) => nodeObject( new ToonOutlinePassNode( scene, camera, nodeObject( color ), nodeObject( thickness ), nodeObject( alpha ) ) ); -// exposure only +/** @module ToneMappingFunctions **/ +/** + * Linear tone mapping, exposure only. + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const linearToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { return color.mul( exposure ).clamp(); @@ -20047,8 +22309,16 @@ const linearToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { ] } ); -// source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf - +/** + * Reinhard tone mapping. + * + * Reference: {@link https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const reinhardToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { color = color.mul( exposure ); @@ -20064,8 +22334,16 @@ const reinhardToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { ] } ); -// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/ - +/** + * Cineon tone mapping. + * + * Reference: {@link http://filmicworlds.com/blog/filmic-tonemapping-operators/} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const cineonToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { // filmic operator by Jim Hejl and Richard Burgess-Dawson @@ -20097,8 +22375,16 @@ const RRTAndODTFit = /*@__PURE__*/ Fn( ( [ color ] ) => { } ); -// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs - +/** + * ACESFilmic tone mapping. + * + * Reference: {@link https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const acesFilmicToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT @@ -20149,6 +22435,14 @@ const agxDefaultContrastApprox = /*@__PURE__*/ Fn( ( [ x_immutable ] ) => { } ); +/** + * AgX tone mapping. + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const agxToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { const colortone = vec3( color ).toVar(); @@ -20180,8 +22474,16 @@ const agxToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { ] } ); -// https://modelviewer.dev/examples/tone-mapping - +/** + * Neutral tone mapping. + * + * Reference: {@link https://modelviewer.dev/examples/tone-mapping} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const neutralToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { const StartCompression = float( 0.8 - 0.04 ); @@ -21177,6 +23479,12 @@ class ScriptableNode extends Node { const scriptable = /*@__PURE__*/ nodeProxy( ScriptableNode ); +/** + * This class can be used to configure a fog for the scene. + * Nodes of this type are assigned to `Scene.fogNode`. + * + * @augments Node + */ class FogNode extends Node { static get type() { @@ -21185,17 +23493,52 @@ class FogNode extends Node { } + /** + * Constructs a new fog node. + * + * @param {Node} colorNode - Defines the color of the fog. + * @param {Node} factorNode - Defines how the fog is factored in the scene. + */ constructor( colorNode, factorNode ) { super( 'float' ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFogNode = true; + /** + * Defines the color of the fog. + * + * @type {Node?} + */ this.colorNode = colorNode; + + /** + * Defines how the fog is factored in the scene. + * + * @type {Node?} + */ this.factorNode = factorNode; } + /** + * Returns a node that represents the `z` coordinate in view space + * for the current fragment. It's a different representation of the + * default depth value. + * + * This value can be part of a computation that defines how the fog + * density increases when moving away from the camera. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {Node} The viewZ node. + */ getViewZNode( builder ) { let viewZ; @@ -21222,6 +23565,12 @@ class FogNode extends Node { const fog = /*@__PURE__*/ nodeProxy( FogNode ); +/** + * Represents a range fog. The fog is smoothly interpolated + * between a range defined via near and far values. + * + * @augments FogNode + */ class FogRangeNode extends FogNode { static get type() { @@ -21230,13 +23579,38 @@ class FogRangeNode extends FogNode { } + /** + * Constructs a new range node. + * + * @param {Node} colorNode - Defines the color of the fog. + * @param {Node} nearNode - Defines the near value. + * @param {Node} farNode - Defines the far value. + */ constructor( colorNode, nearNode, farNode ) { - super( colorNode ); + super( colorNode, null ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFogRangeNode = true; + /** + * Defines the near value. + * + * @type {Node} + */ this.nearNode = nearNode; + + /** + * Defines the far value. + * + * @type {Node} + */ this.farNode = farNode; } @@ -21253,6 +23627,13 @@ class FogRangeNode extends FogNode { const rangeFog = /*@__PURE__*/ nodeProxy( FogRangeNode ); +/** + * Represents an exponential squared fog. This type of fog gives + * a clear view near the camera and a faster than exponentially + * densening fog farther from the camera. + * + * @augments FogNode + */ class FogExp2Node extends FogNode { static get type() { @@ -21261,12 +23642,30 @@ class FogExp2Node extends FogNode { } + /** + * Constructs a new exponential squared fog node. + * + * @param {Node} colorNode - Defines the color of the fog. + * @param {Node} densityNode - Defines the fog density. + */ constructor( colorNode, densityNode ) { - super( colorNode ); + super( colorNode, null ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFogExp2Node = true; + /** + * Defines the fog density. + * + * @type {Node} + */ this.densityNode = densityNode; } @@ -21837,6 +24236,26 @@ class LightsNode extends Node { } + /** + * Overwrites the default `customCacheKey()` implementation by including the + * light IDs into the cache key. + * + * @return {Number} The hash. + */ + customCacheKey() { + + const lightIDs = []; + + for ( let i = 0; i < lights.length; i ++ ) { + + lightIDs.push( lights[ i ].id ); + + } + + return hashArray( lightIDs ); + + } + getHash( builder ) { if ( this._lightNodesHash === null ) { @@ -22045,9 +24464,44 @@ class LightsNode extends Node { const lights = ( lights = [] ) => nodeObject( new LightsNode() ).setLights( lights ); -const shadowMaterialLib = /*@__PURE__*/ new WeakMap(); +class ShadowBaseNode extends Node { + + static get type() { + + return 'ShadowBaseNode'; + + } + + constructor( light ) { + + super(); + + this.light = light; + this.updateBeforeType = NodeUpdateType.RENDER; + + this.isShadowBaseNode = true; + + } + + setupShadowPosition( { material } ) { + + // Use assign inside an Fn() + + shadowWorldPosition.assign( material.shadowPositionNode || positionWorld ); + + } + + dispose() { + + this.updateBeforeType = NodeUpdateType.NONE; + + } + +} + const shadowWorldPosition = /*@__PURE__*/ vec3().toVar( 'shadowWorldPosition' ); +const shadowMaterialLib = /*@__PURE__*/ new WeakMap(); const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => { let dist = positionWorld.sub( position ).length(); @@ -22201,7 +24655,7 @@ const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord } ) => { const occlusion = float( 1 ).toVar(); - const distribution = texture( depthTexture ).uv( shadowCoord.xy ).rg; + const distribution = texture( depthTexture ).sample( shadowCoord.xy ).rg; const hardShadow = step( shadowCoord.z, distribution.x ); @@ -22231,7 +24685,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass const uvOffset = uvStart.add( float( i ).mul( uvStride ) ); - const depth = shadowPass.uv( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) ).x; + const depth = shadowPass.sample( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) ).x; mean.addAssign( depth ); squaredMean.addAssign( depth.mul( depth ) ); @@ -22257,7 +24711,7 @@ const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPas const uvOffset = uvStart.add( float( i ).mul( uvStride ) ); - const distribution = shadowPass.uv( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) ); + const distribution = shadowPass.sample( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) ); mean.addAssign( distribution.x ); squaredMean.addAssign( add( distribution.y.mul( distribution.y ), distribution.x.mul( distribution.x ) ) ); @@ -22277,7 +24731,7 @@ const _shadowFilterLib = [ BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilt const _quadMesh$1 = /*@__PURE__*/ new QuadMesh(); -class ShadowNode extends Node { +class ShadowNode extends ShadowBaseNode { static get type() { @@ -22287,9 +24741,8 @@ class ShadowNode extends Node { constructor( light, shadow = null ) { - super(); + super( light ); - this.light = light; this.shadow = shadow || light.shadow; this.shadowMap = null; @@ -22300,7 +24753,6 @@ class ShadowNode extends Node { this.vsmMaterialVertical = null; this.vsmMaterialHorizontal = null; - this.updateBeforeType = NodeUpdateType.RENDER; this._node = null; this.isShadowNode = true; @@ -22452,12 +24904,12 @@ class ShadowNode extends Node { if ( builder.renderer.shadowMap.enabled === false ) return; - return Fn( ( { material } ) => { - - shadowWorldPosition.assign( material.shadowPositionNode || positionWorld ); + return Fn( () => { let node = this._node; + this.setupShadowPosition( builder ); + if ( node === null ) { this._node = node = this.setupShadow( builder ); @@ -22515,11 +24967,15 @@ class ShadowNode extends Node { renderer.setMRT( null ); - renderer.setRenderObjectFunction( ( object, ...params ) => { + renderer.setRenderObjectFunction( ( object, scene, _camera, geometry, material, group, ...params ) => { if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) { - renderer.renderObject( object, ...params ); + object.onBeforeShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group ); + + renderer.renderObject( object, scene, _camera, geometry, material, group, ...params ); + + object.onAfterShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group ); } @@ -22589,7 +25045,7 @@ class ShadowNode extends Node { } - this.updateBeforeType = NodeUpdateType.NONE; + super.dispose(); } @@ -22645,9 +25101,15 @@ class AnalyticLightNode extends LightingNode { } - getCacheKey() { + /** + * Overwrites the default `customCacheKey()` implementation by including the + * light.id and light.castShadow into the cache key. + * + * @return {Number} The hash. + */ + customCacheKey() { - return hash$1( super.getCacheKey(), this.light.id, this.light.castShadow ? 1 : 0 ); + return hash$1( this.light.id, this.light.castShadow ? 1 : 0 ); } @@ -23065,6 +25527,15 @@ class PointLightNode extends AnalyticLightNode { } +/** @module Procedural **/ + +/** + * Creates a 2x2 checkerboard pattern that can be used as procedural texture data. + * + * @method + * @param {Node} uv - The uv coordinates. + * @return {Node} The result data. + */ const checker = /*@__PURE__*/ Fn( ( [ coord = uv() ] ) => { const uv = coord.mul( 2.0 ); @@ -25100,7 +27571,6 @@ var TSL = /*#__PURE__*/Object.freeze({ textureSize: textureSize, textureStore: textureStore, thickness: thickness, - threshold: threshold, time: time, timerDelta: timerDelta, timerGlobal: timerGlobal, @@ -26994,6 +29464,7 @@ class NodeBuilder { * The scene the 3D object belongs to. * * @type {Scene?} + * @default null */ this.scene = null; @@ -27001,29 +29472,125 @@ class NodeBuilder { * The camera the 3D object is rendered with. * * @type {Camera?} + * @default null */ this.camera = null; + /** + * A list of all nodes the builder is processing + * for this 3D object. + * + * @type {Array} + */ this.nodes = []; + + /** + * A list of all sequential nodes. + * + * @type {Array} + */ this.sequentialNodes = []; + + /** + * A list of all nodes which {@link Node#update} method should be executed. + * + * @type {Array} + */ this.updateNodes = []; + + /** + * A list of all nodes which {@link Node#updateBefore} method should be executed. + * + * @type {Array} + */ this.updateBeforeNodes = []; + + /** + * A list of all nodes which {@link Node#updateAfter} method should be executed. + * + * @type {Array} + */ this.updateAfterNodes = []; + + /** + * A dictionary that assigns each node to a unique hash. + * + * @type {Object} + */ this.hashNodes = {}; + /** + * A reference to a node material observer. + * + * @type {NodeMaterialObserver?} + * @default null + */ this.monitor = null; + /** + * A reference to the current lights node. + * + * @type {LightsNode?} + * @default null + */ this.lightsNode = null; + + /** + * A reference to the current environment node. + * + * @type {Node?} + * @default null + */ this.environmentNode = null; + + /** + * A reference to the current fog node. + * + * @type {FogNode?} + * @default null + */ this.fogNode = null; + /** + * The current clipping context. + * + * @type {ClippingContext?} + */ this.clippingContext = null; + /** + * The generated vertex shader. + * + * @type {String?} + */ this.vertexShader = null; + + /** + * The generated fragment shader. + * + * @type {String?} + */ this.fragmentShader = null; + + /** + * The generated compute shader. + * + * @type {String?} + */ this.computeShader = null; + /** + * Nodes used in the primary flow of code generation. + * + * @type {Object>} + */ this.flowNodes = { vertex: [], fragment: [], compute: [] }; + + /** + * Nodes code from `.flowNodes`. + * + * @type {Object} + */ this.flowCode = { vertex: '', fragment: '', compute: '' }; /** @@ -27041,8 +29608,26 @@ class NodeBuilder { * @type {Object} */ this.structs = { vertex: [], fragment: [], compute: [], index: 0 }; + + /** + * This dictionary holds the bindings for each shader stage. + * + * @type {Object} + */ this.bindings = { vertex: {}, fragment: {}, compute: {} }; + + /** + * This dictionary maintains the binding indices per bind group. + * + * @type {Object} + */ this.bindingsIndexes = {}; + + /** + * Reference to the array of bind groups. + * + * @type {Array?} + */ this.bindGroups = null; /** @@ -27083,19 +29668,80 @@ class NodeBuilder { * @type {Object>} */ this.vars = {}; + + /** + * Current code flow. + * All code generated in this stack will be stored in `.flow`. + * + * @type {{code: String}} + */ this.flow = { code: '' }; + + /** + * A chain of nodes. + * Used to check recursive calls in node-graph. + * + * @type {Array} + */ this.chaining = []; + + /** + * The current stack. + * This reflects the current process in the code block hierarchy, + * it is useful to know if the current process is inside a conditional for example. + * + * @type {StackNode} + */ this.stack = stack(); + + /** + * List of stack nodes. + * The current stack hierarchy is stored in an array. + * + * @type {Array} + */ this.stacks = []; + + /** + * A tab value. Used for shader string generation. + * + * @type {String} + * @default '\t' + */ this.tab = '\t'; + /** + * Reference to the current function node. + * + * @type {FunctionNode?} + * @default null + */ this.currentFunctionNode = null; + /** + * The builder's context. + * + * @type {Object} + */ this.context = { material: this.material }; + /** + * The builder's cache. + * + * @type {NodeCache} + */ this.cache = new NodeCache(); + + /** + * Since the {@link NodeBuilder#cache} might be temporarily + * overwritten by other caches, this member retains the reference + * to the builder's own cache. + * + * @type {NodeCache} + * @default this.cache + */ this.globalCache = this.cache; this.flowsData = new WeakMap(); @@ -27103,7 +29749,7 @@ class NodeBuilder { /** * The current shader stage. * - * @type {('vertex'|'fragment'|'compute')?} + * @type {('vertex'|'fragment'|'compute'|'any')?} */ this.shaderStage = null; @@ -27114,6 +29760,12 @@ class NodeBuilder { */ this.buildStage = null; + /** + * Whether comparison in shader code are generated with methods or not. + * + * @type {Boolean} + * @default false + */ this.useComparisonMethod = false; } @@ -27193,6 +29845,14 @@ class NodeBuilder { } + /** + * Returns a bind group for the given group name and binding. + * + * @private + * @param {String} groupName - The group name. + * @param {Array} bindings - List of bindings. + * @return {BindGroup} The bind group + */ _getBindGroup( groupName, bindings ) { const bindGroupsCache = this.getBindGroupsCache(); @@ -27237,6 +29897,13 @@ class NodeBuilder { } + /** + * Returns an array of node uniform groups for the given group name and shader stage. + * + * @param {String} groupName - The group name. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. + * @return {Array} The array of node uniform groups. + */ getBindGroupArray( groupName, shaderStage ) { const bindings = this.bindings[ shaderStage ]; @@ -27259,6 +29926,11 @@ class NodeBuilder { } + /** + * Returns a list bindings of all shader stages separated by groups. + * + * @return {Array} The list of bindings. + */ getBindings() { let bindingsGroups = this.bindGroups; @@ -27301,6 +29973,9 @@ class NodeBuilder { } + /** + * Sorts the bind groups and updates {@link NodeBuilder#bindingsIndexes}. + */ sortBindingGroups() { const bindingsGroups = this.getBindings(); @@ -27318,12 +29993,24 @@ class NodeBuilder { } + /** + * The builder maintains each node in a hash-based dictionary. + * This method sets the given node (value) with the given hash (key) into this dictionary. + * + * @param {Node} node - The node to add. + * @param {Number} hash - The hash of the node. + */ setHashNode( node, hash ) { this.hashNodes[ hash ] = node; } + /** + * Adds a node to this builder. + * + * @param {Node} node - The node to add. + */ addNode( node ) { if ( this.nodes.includes( node ) === false ) { @@ -27336,6 +30023,12 @@ class NodeBuilder { } + /** + * It is used to add Nodes that will be used as FRAME and RENDER events, + * and need to follow a certain sequence in the calls to work correctly. + * + * @param {Node} node - The node to add. + */ addSequentialNode( node ) { if ( this.sequentialNodes.includes( node ) === false ) { @@ -27346,6 +30039,9 @@ class NodeBuilder { } + /** + * Checks the update types of nodes + */ buildUpdateNodes() { for ( const node of this.nodes ) { @@ -27381,12 +30077,24 @@ class NodeBuilder { } + /** + * A reference the current node which is the + * last node in the chain of nodes. + * + * @type {Node} + */ get currentNode() { return this.chaining[ this.chaining.length - 1 ]; } + /** + * Whether the given texture is filtered or not. + * + * @param {Texture} texture - The texture to check. + * @return {Boolean} Whether the given texture is filtered or not. + */ isFilteredTexture( texture ) { return ( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter || @@ -27394,6 +30102,12 @@ class NodeBuilder { } + /** + * Adds the given node to the internal node chain. + * This is used to check recursive calls in node-graph. + * + * @param {Node} node - The node to add. + */ addChain( node ) { /* @@ -27408,6 +30122,11 @@ class NodeBuilder { } + /** + * Removes the given node from the internal node chain. + * + * @param {Node} node - The node to remove. + */ removeChain( node ) { const lastChain = this.chaining.pop(); @@ -27420,18 +30139,40 @@ class NodeBuilder { } + /** + * Returns the native shader method name for a given generic name. E.g. + * the method name `textureDimensions` matches the WGSL name but must be + * resolved to `textureSize` in GLSL. + * + * @abstract + * @param {String} name - The method name to resolve. + * @return {String} The resolved method name. + */ getMethod( method ) { return method; } + /** + * Returns a node for the given hash, see {@link NodeBuilder#setHashNode}. + * + * @param {Number} hash - The hash of the node. + * @return {Node} The found node. + */ getNodeFromHash( hash ) { return this.hashNodes[ hash ]; } + /** + * Adds the Node to a target flow so that it can generate code in the 'generate' process. + * + * @param {('vertex'|'fragment'|'compute')} shaderStage - The shader stage. + * @param {Node} node - The node to add. + * @return {Node} The node. + */ addFlow( shaderStage, node ) { this.flowNodes[ shaderStage ].push( node ); @@ -27440,18 +30181,34 @@ class NodeBuilder { } + /** + * Sets builder's context. + * + * @param {Object} context - The context to set. + */ setContext( context ) { this.context = context; } + /** + * Returns the builder's current context. + * + * @return {Object} The builder's current context. + */ getContext() { return this.context; } + /** + * Gets a context used in shader construction that can be shared across different materials. + * This is necessary since the renderer cache can reuse shaders generated in one material and use them in another. + * + * @return {Object} The builder's current context without material. + */ getSharedContext() { ({ ...this.context }); @@ -27460,18 +30217,35 @@ class NodeBuilder { } + /** + * Sets builder's cache. + * + * @param {NodeCache} cache - The cache to set. + */ setCache( cache ) { this.cache = cache; } + /** + * Returns the builder's current cache. + * + * @return {NodeCache} The builder's current cache. + */ getCache() { return this.cache; } + /** + * Returns a cache for the given node. + * + * @param {Node} Node - The node. + * @param {Boolean} [parent=true] - Whether this node refers to a shared parent cache or not. + * @return {NodeCache} The cache. + */ getCacheFromNode( node, parent = true ) { const data = this.getDataFromNode( node ); @@ -27481,48 +30255,99 @@ class NodeBuilder { } + /** + * Whether the requested feature is available or not. + * + * @abstract + * @param {String} name - The requested feature. + * @return {Boolean} Whether the requested feature is supported or not. + */ isAvailable( /*name*/ ) { return false; } + /** + * Returns the vertexIndex input variable as a native shader string. + * + * @abstract + * @return {String} The instanceIndex shader string. + */ getVertexIndex() { console.warn( 'Abstract function.' ); } + /** + * Returns the instanceIndex input variable as a native shader string. + * + * @abstract + * @return {String} The instanceIndex shader string. + */ getInstanceIndex() { console.warn( 'Abstract function.' ); } + /** + * Returns the drawIndex input variable as a native shader string. + * Only relevant for WebGL and its `WEBGL_multi_draw` extension. + * + * @abstract + * @return {String} The drawIndex shader string. + */ getDrawIndex() { console.warn( 'Abstract function.' ); } + /** + * Returns the frontFacing input variable as a native shader string. + * + * @abstract + * @return {String} The frontFacing shader string. + */ getFrontFacing() { console.warn( 'Abstract function.' ); } + /** + * Returns the fragCoord input variable as a native shader string. + * + * @abstract + * @return {String} The fragCoord shader string. + */ getFragCoord() { console.warn( 'Abstract function.' ); } + /** + * Whether to flip texture data along its vertical axis or not. WebGL needs + * this method evaluate to `true`, WebGPU to `false`. + * + * @abstract + * @return {Boolean} Whether to flip texture data along its vertical axis or not. + */ isFlipY() { return false; } + /** + * Calling this method increases the usage count for the given node by one. + * + * @param {Node} Node - The node to increase the usage count for. + * @return {Number} The updated usage count. + */ increaseUsage( node ) { const nodeData = this.getDataFromNode( node ); @@ -27532,18 +30357,44 @@ class NodeBuilder { } + /** + * Generates a texture sample shader string for the given texture data. + * + * @abstract + * @param {Texture} texture - The texture. + * @param {String} textureProperty - The texture property name. + * @param {String} uvSnippet - Snippet defining the texture coordinates. + * @return {String} The generated shader string. + */ generateTexture( /* texture, textureProperty, uvSnippet */ ) { console.warn( 'Abstract function.' ); } + /** + * Generates a texture LOD shader string for the given texture data. + * + * @abstract + * @param {Texture} texture - The texture. + * @param {String} textureProperty - The texture property name. + * @param {String} uvSnippet - Snippet defining the texture coordinates. + * @param {String} levelSnippet - Snippet defining the mip level. + * @return {String} The generated shader string. + */ generateTextureLod( /* texture, textureProperty, uvSnippet, levelSnippet */ ) { console.warn( 'Abstract function.' ); } + /** + * Generates the shader string for the given type and value. + * + * @param {String} type - The type. + * @param {Any?} [value=null] - The value. + * @return {String} The generated value as a shader string. + */ generateConst( type, value = null ) { if ( value === null ) { @@ -27659,7 +30510,7 @@ class NodeBuilder { * Returns for the given node and shader stage the property name for the shader. * * @param {Node} node - The node. - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The property name. */ getPropertyName( node/*, shaderStage*/ ) { @@ -27718,7 +30569,7 @@ class NodeBuilder { } /** - * Returns the component type of a given texutre. + * Returns the component type of a given texture. * * @param {Texture} texture - The texture. * @return {String} The component type. @@ -27915,6 +30766,11 @@ class NodeBuilder { } + /** + * Adds a stack node to the internal stack. + * + * @return {StackNode} The added stack node. + */ addStack() { this.stack = stack( this.stack ); @@ -27926,6 +30782,11 @@ class NodeBuilder { } + /** + * Removes the last stack node from the internal stack. + * + * @return {StackNode} The removed stack node. + */ removeStack() { const lastStack = this.stack; @@ -27937,6 +30798,15 @@ class NodeBuilder { } + /** + * The builder maintains (cached) data for each node during the building process. This method + * can be used to get these data for a specific shader stage and cache. + * + * @param {Node} node - The node to get the data for. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @param {NodeCache?} cache - An optional cache. + * @return {Object} The node data. + */ getDataFromNode( node, shaderStage = this.shaderStage, cache = null ) { cache = cache === null ? ( node.isGlobal( this ) ? this.globalCache : this.cache ) : cache; @@ -27957,6 +30827,13 @@ class NodeBuilder { } + /** + * Returns the properties for the given node and shader stage. + * + * @param {Node} node - The node to get the properties for. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage='any'] - The shader stage. + * @return {Object} The node properties. + */ getNodeProperties( node, shaderStage = 'any' ) { const nodeData = this.getDataFromNode( node, shaderStage ); @@ -27965,6 +30842,13 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeAttribute} for the given buffer attribute node. + * + * @param {BufferAttributeNode} node - The buffer attribute node. + * @param {String} type - The node type. + * @return {NodeAttribute} The node attribute. + */ getBufferAttributeFromNode( node, type ) { const nodeData = this.getDataFromNode( node ); @@ -27987,6 +30871,14 @@ class NodeBuilder { } + /** + * Returns an instance of {@link StructTypeNode} for the given output struct node. + * + * @param {OutputStructNode} node - The output struct node. + * @param {Array} types - The output struct types. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @return {StructTypeNode} The struct type attribute. + */ getStructTypeFromNode( node, types, shaderStage = this.shaderStage ) { const nodeData = this.getDataFromNode( node, shaderStage ); @@ -28009,6 +30901,15 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeUniform} for the given uniform node. + * + * @param {UniformNode} node - The uniform node. + * @param {String} type - The uniform type. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @param {String?} name - The name of the uniform. + * @return {NodeUniform} The node uniform. + */ getUniformFromNode( node, type, shaderStage = this.shaderStage, name = null ) { const nodeData = this.getDataFromNode( node, shaderStage, this.globalCache ); @@ -28031,6 +30932,15 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeVar} for the given variable node. + * + * @param {VarNode} node - The variable node. + * @param {String?} name - The variable's name. + * @param {String} [type=node.getNodeType( this )] - The variable's type. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @return {NodeVar} The node variable. + */ getVarFromNode( node, name = null, type = node.getNodeType( this ), shaderStage = this.shaderStage ) { const nodeData = this.getDataFromNode( node, shaderStage ); @@ -28055,6 +30965,14 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeVarying} for the given varying node. + * + * @param {(VaryingNode|PropertyNode)} node - The varying node. + * @param {String?} name - The varying's name. + * @param {String} [type=node.getNodeType( this )] - The varying's type. + * @return {NodeVar} The node varying. + */ getVaryingFromNode( node, name = null, type = node.getNodeType( this ) ) { const nodeData = this.getDataFromNode( node, 'any' ); @@ -28080,6 +30998,14 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeCode} for the given code node. + * + * @param {CodeNode} node - The code node. + * @param {String} type - The node type. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @return {NodeCode} The node code. + */ getCodeFromNode( node, type, shaderStage = this.shaderStage ) { const nodeData = this.getDataFromNode( node ); @@ -28103,6 +31029,15 @@ class NodeBuilder { } + /** + * Adds a code flow based on the code-block hierarchy. + + * This is used so that code-blocks like If,Else create their variables locally if the Node + * is only used inside one of these conditionals in the current shader stage. + * + * @param {Node} node - The node to add. + * @param {Node} nodeBlock - Node-based code-block. Usually 'ConditionalNode'. + */ addFlowCodeHierarchy( node, nodeBlock ) { const { flowCodes, flowCodeBlock } = this.getDataFromNode( node ); @@ -28135,6 +31070,13 @@ class NodeBuilder { } + /** + * Add a inline-code to the current flow code-block. + * + * @param {Node} node - The node to add. + * @param {String} code - The code to add. + * @param {Node} nodeBlock - Current ConditionalNode + */ addLineFlowCodeBlock( node, code, nodeBlock ) { const nodeData = this.getDataFromNode( node ); @@ -28146,6 +31088,13 @@ class NodeBuilder { } + /** + * Add a inline-code to the current flow. + * + * @param {String} code - The code to add. + * @param {Node?} [node= null] - Optional Node, can help the system understand if the Node is part of a code-block. + * @return {NodeBuilder} A reference to this node builder. + */ addLineFlowCode( code, node = null ) { if ( code === '' ) return this; @@ -28170,6 +31119,12 @@ class NodeBuilder { } + /** + * Adds a code to the current code flow. + * + * @param {String} code - Shader code. + * @return {NodeBuilder} A reference to this node builder. + */ addFlowCode( code ) { this.flow.code += code; @@ -28178,6 +31133,12 @@ class NodeBuilder { } + /** + * Add tab in the code that will be generated so that other snippets respect the current tabulation. + * Typically used in codes with If,Else. + * + * @return {NodeBuilder} A reference to this node builder. + */ addFlowTab() { this.tab += '\t'; @@ -28186,6 +31147,11 @@ class NodeBuilder { } + /** + * Removes a tab. + * + * @return {NodeBuilder} A reference to this node builder. + */ removeFlowTab() { this.tab = this.tab.slice( 0, - 1 ); @@ -28194,12 +31160,25 @@ class NodeBuilder { } + /** + * Gets the current flow data based on a Node. + * + * @param {Node} node - Node that the flow was started. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. + * @return {Object} The flow data. + */ getFlowData( node/*, shaderStage*/ ) { return this.flowsData.get( node ); } + /** + * Executes the node flow based on a root node to generate the final shader code. + * + * @param {Node} node - The node to execute. + * @return {Object} The code flow. + */ flowNode( node ) { const output = node.getNodeType( this ); @@ -28212,6 +31191,13 @@ class NodeBuilder { } + /** + * Returns the native shader operator name for a given generic name. + * It is a similar type of method like {@link NodeBuilder#getMethod}. + * + * @param {ShaderNodeInternal} shaderNode - The shader node to build the function node with. + * @return {FunctionNode} The build function node. + */ buildFunctionNode( shaderNode ) { const fn = new FunctionNode(); @@ -28228,6 +31214,12 @@ class NodeBuilder { } + /** + * Generates a code flow based on a TSL function: Fn(). + * + * @param {ShaderNodeInternal} node - A function code will be generated based on the input. + * @return {Object} + */ flowShaderNode( shaderNode ) { const layout = shaderNode.layout; @@ -28266,6 +31258,13 @@ class NodeBuilder { } + /** + * Runs the node flow through all the steps of creation, 'setup', 'analyze', 'generate'. + * + * @param {Node} node - The node to execute. + * @param {String?} output - Expected output type. For example 'vec3'. + * @return {Object} + */ flowStagesNode( node, output = null ) { const previousFlow = this.flow; @@ -28304,12 +31303,27 @@ class NodeBuilder { } - getFunctionOperator() { + /** + * Returns the native shader operator name for a given generic name. + * It is a similar type of method like {@link NodeBuilder#getMethod}. + * + * @abstract + * @param {String} op - The operator name to resolve. + * @return {String} The resolved operator name. + */ + getFunctionOperator( /* op */ ) { return null; } + /** + * Generates a code flow based on a child Node. + * + * @param {Node} node - The node to execute. + * @param {String?} output - Expected output type. For example 'vec3'. + * @return {Object} The code flow. + */ flowChildNode( node, output = null ) { const previousFlow = this.flow; @@ -28328,6 +31342,18 @@ class NodeBuilder { } + /** + * Executes a flow of code in a different stage. + * + * Some nodes like `varying()` have the ability to compute code in vertex-stage and + * return the value in fragment-stage even if it is being executed in an input fragment. + * + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. + * @param {Node} node - The node to execute. + * @param {String?} output - Expected output type. For example 'vec3'. + * @param {String?} propertyName - The property name to assign the result. + * @return {Object} + */ flowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) { const previousShaderStage = this.shaderStage; @@ -28365,7 +31391,7 @@ class NodeBuilder { * Returns the attribute definitions as a shader string for the given shader stage. * * @abstract - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The attribute code section. */ getAttributes( /*shaderStage*/ ) { @@ -28378,7 +31404,7 @@ class NodeBuilder { * Returns the varying definitions as a shader string for the given shader stage. * * @abstract - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The varying code section. */ getVaryings( /*shaderStage*/ ) { @@ -28403,7 +31429,7 @@ class NodeBuilder { /** * Returns the variable definitions as a shader string for the given shader stage. * - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The variable code section. */ getVars( shaderStage ) { @@ -28430,7 +31456,7 @@ class NodeBuilder { * Returns the uniform definitions as a shader string for the given shader stage. * * @abstract - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The uniform code section. */ getUniforms( /*shaderStage*/ ) { @@ -28442,7 +31468,7 @@ class NodeBuilder { /** * Returns the native code definitions as a shader string for the given shader stage. * - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The native code section. */ getCodes( shaderStage ) { @@ -28465,6 +31491,11 @@ class NodeBuilder { } + /** + * Returns the hash of this node builder. + * + * @return {String} The hash. + */ getHash() { return this.vertexShader + this.fragmentShader + this.computeShader; @@ -28474,7 +31505,7 @@ class NodeBuilder { /** * Sets the current shader stage. * - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The shader stage to set. + * @param {('vertex'|'fragment'|'compute'|'any')?} shaderStage - The shader stage to set. */ setShaderStage( shaderStage ) { @@ -28485,7 +31516,7 @@ class NodeBuilder { /** * Returns the current shader stage. * - * @return {('vertex'|'fragment'|'compute')?} The current shader stage. + * @return {('vertex'|'fragment'|'compute'|'any')?} The current shader stage. */ getShaderStage() { @@ -28605,6 +31636,13 @@ class NodeBuilder { } + /** + * Returns a uniform representation which is later used for UBO generation and rendering. + * + * @param {NodeUniform} uniformNode - The uniform node. + * @param {String} type - The requested type. + * @return {Uniform} The uniform. + */ getNodeUniform( uniformNode, type ) { if ( type === 'float' || type === 'int' || type === 'uint' ) return new NumberNodeUniform( uniformNode ); @@ -28619,12 +31657,16 @@ class NodeBuilder { } - createNodeMaterial( type = 'NodeMaterial' ) { // @deprecated, r168 - - throw new Error( `THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${ type }() instead.` ); - - } - + /** + * Formats the given shader snippet from a given type into another one. E.g. + * this method might be used to convert a simple float string `"1.0"` into a + * `vec3` representation: `"vec3( 1.0 )"`. + * + * @param {String} snippet - The shader snippet. + * @param {String} fromType - The source type. + * @param {String} toType - The target type. + * @return {String} The updated shader string. + */ format( snippet, fromType, toType ) { fromType = this.getVectorType( fromType ); @@ -28716,6 +31758,14 @@ class NodeBuilder { } + // deprecated + + createNodeMaterial( type = 'NodeMaterial' ) { // @deprecated, r168 + + throw new Error( `THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${ type }() instead.` ); + + } + } /** @@ -29031,7 +32081,7 @@ class NodeFunctionInput { * * @param {String} type - The input type. * @param {String} name - The input name. - * @param {Number?} [count=null] - TODO (only relevant for GLSL). + * @param {Number?} [count=null] - If the input is an Array, count will be the length. * @param {('in'|'out'|'inout')} [qualifier=''] - The parameter qualifier (only relevant for GLSL). * @param {Boolean} [isConst=false] - Whether the input uses a const qualifier or not (only relevant for GLSL). */ @@ -29052,7 +32102,7 @@ class NodeFunctionInput { this.name = name; /** - * TODO (only relevant for GLSL). + * If the input is an Array, count will be the length. * * @type {Number?} * @default null @@ -39147,11 +42197,7 @@ class WebGPUTextureUtils { textureData.format = format; - let sampleCount = options.sampleCount !== undefined ? options.sampleCount : 1; - - sampleCount = backend.utils.getSampleCount( sampleCount ); - - const primarySampleCount = texture.isRenderTargetTexture && ! texture.isMultisampleRenderTargetTexture ? 1 : sampleCount; + const { samples, primarySamples, isMSAA } = backend.utils.getTextureSampleData( texture ); let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC; @@ -39175,7 +42221,7 @@ class WebGPUTextureUtils { depthOrArrayLayers: depth, }, mipLevelCount: levels, - sampleCount: primarySampleCount, + sampleCount: primarySamples, dimension: dimension, format: format, usage: usage @@ -39209,12 +42255,12 @@ class WebGPUTextureUtils { } - if ( texture.isRenderTargetTexture && sampleCount > 1 && ! texture.isMultisampleRenderTargetTexture ) { + if ( isMSAA ) { const msaaTextureDescriptorGPU = Object.assign( {}, textureDescriptorGPU ); msaaTextureDescriptorGPU.label = msaaTextureDescriptorGPU.label + '-msaa'; - msaaTextureDescriptorGPU.sampleCount = sampleCount; + msaaTextureDescriptorGPU.sampleCount = samples; textureData.msaaTexture = backend.device.createTexture( msaaTextureDescriptorGPU ); @@ -39337,7 +42383,7 @@ class WebGPUTextureUtils { depthTexture.image.width = width; depthTexture.image.height = height; - this.createTexture( depthTexture, { sampleCount: backend.utils.getSampleCount( backend.renderer.samples ), width, height } ); + this.createTexture( depthTexture, { width, height } ); return backend.get( depthTexture ).texture; @@ -40632,7 +43678,7 @@ class WGSLNodeBuilder extends NodeBuilder { _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) { - if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false ) { return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`; @@ -40720,7 +43766,9 @@ class WGSLNodeBuilder extends NodeBuilder { let textureDimensionsParams; - if ( texture.isMultisampleRenderTargetTexture === true ) { + const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture ); + + if ( primarySamples > 1 ) { textureDimensionsParams = textureProperty; @@ -40797,7 +43845,7 @@ class WGSLNodeBuilder extends NodeBuilder { return this.getComponentTypeFromTexture( texture ) !== 'float' || ( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) || ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) || - texture.isMultisampleRenderTargetTexture === true; + this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1; } @@ -40999,7 +44047,7 @@ class WGSLNodeBuilder extends NodeBuilder { texture.store = node.isStorageTextureNode === true; texture.setVisibility( gpuShaderStageLib[ shaderStage ] ); - if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( node.value ) === false && texture.store === false ) { const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node, group ); sampler.setVisibility( gpuShaderStageLib[ shaderStage ] ); @@ -41511,7 +44559,7 @@ ${ flowData.code } const texture = uniform.node.value; - if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) { if ( this.isSampleCompare( texture ) ) { @@ -41529,7 +44577,9 @@ ${ flowData.code } let multisampled = ''; - if ( texture.isMultisampleRenderTargetTexture === true ) { + const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture ); + + if ( primarySamples > 1 ) { multisampled = '_multisampled'; @@ -41949,6 +44999,36 @@ class WebGPUUtils { } + getTextureSampleData( texture ) { + + let samples; + + if ( texture.isFramebufferTexture ) { + + samples = 1; + + } else if ( texture.isDepthTexture && ! texture.renderTarget ) { + + const renderer = this.backend.renderer; + const renderTarget = renderer.getRenderTarget(); + + samples = renderTarget ? renderTarget.samples : renderer.samples; + + } else if ( texture.renderTarget ) { + + samples = texture.renderTarget.samples; + + } + + samples = samples || 1; + + const isMSAA = samples > 1 && texture.renderTarget !== null && ( texture.isDepthTexture !== true && texture.isFramebufferTexture !== true ); + const primarySamples = isMSAA ? 1 : samples; + + return { samples, primarySamples, isMSAA }; + + } + getCurrentColorFormat( renderContext ) { let format; @@ -42462,10 +45542,18 @@ class WebGPUBindingUtils { const texture = {}; // GPUTextureBindingLayout - if ( binding.texture.isMultisampleRenderTargetTexture === true ) { + const { primarySamples } = backend.utils.getTextureSampleData( binding.texture ); + + if ( primarySamples > 1 ) { texture.multisampled = true; + if ( ! binding.texture.isDepthTexture ) { + + texture.sampleType = GPUTextureSampleType.UnfilterableFloat; + + } + } if ( binding.texture.isDepthTexture ) { @@ -44582,8 +47670,6 @@ class WebGPUBackend extends Backend { const { resultBuffer } = renderContextData.currentTimestampQueryBuffers; - await this.device.queue.onSubmittedWorkDone(); - if ( resultBuffer.mapState === 'unmapped' ) { resultBuffer.mapAsync( GPUMapMode.READ ).then( () => { @@ -45559,4 +48645,4 @@ class ClippingGroup extends Group { } -export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayElementNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FogExp2Node, FogNode, FogRangeNode, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, InstancedPointsNodeMaterial, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, ModelViewProjectionNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PostProcessingUtils, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, shaderStages, vectorComponents }; +export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayElementNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FogExp2Node, FogNode, FogRangeNode, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, InstancedPointsNodeMaterial, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, ModelViewProjectionNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PostProcessingUtils, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, shaderStages, vectorComponents }; diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index dd66d68121bcb9..989d04aeff63b4 100644 --- a/build/three.webgpu.min.js +++ b/build/three.webgpu.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2024 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix3 as i,Matrix4 as n,EventDispatcher as o,MathUtils as a,ColorManagement as u,SRGBTransfer as l,NoToneMapping as d,StaticDrawUsage as c,InterleavedBuffer as h,DynamicDrawUsage as p,InterleavedBufferAttribute as g,NoColorSpace as m,UnsignedIntType as f,IntType as y,WebGLCoordinateSystem as b,BackSide as x,CubeReflectionMapping as T,CubeRefractionMapping as _,WebGPUCoordinateSystem as v,TangentSpaceNormalMap as N,ObjectSpaceNormalMap as S,InstancedInterleavedBuffer as A,InstancedBufferAttribute as R,DataArrayTexture as C,FloatType as E,FramebufferTexture as w,LinearMipmapLinearFilter as M,DepthTexture as B,Material as U,NormalBlending as F,PointsMaterial as P,LineBasicMaterial as I,LineDashedMaterial as L,NoBlending as D,MeshNormalMaterial as V,WebGLCubeRenderTarget as O,BoxGeometry as G,Mesh as k,Scene as z,LinearFilter as $,CubeCamera as W,CubeTexture as H,EquirectangularReflectionMapping as j,EquirectangularRefractionMapping as q,AddOperation as K,MixOperation as X,MultiplyOperation as Y,MeshBasicMaterial as Q,MeshLambertMaterial as Z,MeshPhongMaterial as J,Texture as ee,MeshStandardMaterial as te,MeshPhysicalMaterial as re,MeshToonMaterial as se,MeshMatcapMaterial as ie,SpriteMaterial as ne,ShadowMaterial as oe,Uint32BufferAttribute as ae,Uint16BufferAttribute as ue,DoubleSide as le,DepthStencilFormat as de,DepthFormat as ce,UnsignedInt248Type as he,UnsignedByteType as pe,RenderTarget as ge,Plane as me,Object3D as fe,HalfFloatType as ye,LinearMipMapLinearFilter as be,OrthographicCamera as xe,BufferGeometry as Te,Float32BufferAttribute as _e,BufferAttribute as ve,UVMapping as Ne,Euler as Se,LinearSRGBColorSpace as Ae,LessCompare as Re,VSMShadowMap as Ce,RGFormat as Ee,BasicShadowMap as we,SphereGeometry as Me,CubeUVReflectionMapping as Be,PerspectiveCamera as Ue,RGBAFormat as Fe,LinearMipmapNearestFilter as Pe,NearestMipmapLinearFilter as Ie,Float16BufferAttribute as Le,REVISION as De,SRGBColorSpace as Ve,PCFShadowMap as Oe,FrontSide as Ge,Frustum as ke,DataTexture as ze,RedIntegerFormat as $e,RedFormat as We,RGIntegerFormat as He,RGBIntegerFormat as je,RGBFormat as qe,RGBAIntegerFormat as Ke,UnsignedShortType as Xe,ByteType as Ye,ShortType as Qe,createCanvasElement as Ze,AddEquation as Je,SubtractEquation as et,ReverseSubtractEquation as tt,ZeroFactor as rt,OneFactor as st,SrcColorFactor as it,SrcAlphaFactor as nt,SrcAlphaSaturateFactor as ot,DstColorFactor as at,DstAlphaFactor as ut,OneMinusSrcColorFactor as lt,OneMinusSrcAlphaFactor as dt,OneMinusDstColorFactor as ct,OneMinusDstAlphaFactor as ht,CullFaceNone as pt,CullFaceBack as gt,CullFaceFront as mt,CustomBlending as ft,MultiplyBlending as yt,SubtractiveBlending as bt,AdditiveBlending as xt,NotEqualDepth as Tt,GreaterDepth as _t,GreaterEqualDepth as vt,EqualDepth as Nt,LessEqualDepth as St,LessDepth as At,AlwaysDepth as Rt,NeverDepth as Ct,UnsignedShort4444Type as Et,UnsignedShort5551Type as wt,UnsignedInt5999Type as Mt,AlphaFormat as Bt,LuminanceFormat as Ut,LuminanceAlphaFormat as Ft,RGB_S3TC_DXT1_Format as Pt,RGBA_S3TC_DXT1_Format as It,RGBA_S3TC_DXT3_Format as Lt,RGBA_S3TC_DXT5_Format as Dt,RGB_PVRTC_4BPPV1_Format as Vt,RGB_PVRTC_2BPPV1_Format as Ot,RGBA_PVRTC_4BPPV1_Format as Gt,RGBA_PVRTC_2BPPV1_Format as kt,RGB_ETC1_Format as zt,RGB_ETC2_Format as $t,RGBA_ETC2_EAC_Format as Wt,RGBA_ASTC_4x4_Format as Ht,RGBA_ASTC_5x4_Format as jt,RGBA_ASTC_5x5_Format as qt,RGBA_ASTC_6x5_Format as Kt,RGBA_ASTC_6x6_Format as Xt,RGBA_ASTC_8x5_Format as Yt,RGBA_ASTC_8x6_Format as Qt,RGBA_ASTC_8x8_Format as Zt,RGBA_ASTC_10x5_Format as Jt,RGBA_ASTC_10x6_Format as er,RGBA_ASTC_10x8_Format as tr,RGBA_ASTC_10x10_Format as rr,RGBA_ASTC_12x10_Format as sr,RGBA_ASTC_12x12_Format as ir,RGBA_BPTC_Format as nr,RED_RGTC1_Format as or,SIGNED_RED_RGTC1_Format as ar,RED_GREEN_RGTC2_Format as ur,SIGNED_RED_GREEN_RGTC2_Format as lr,RepeatWrapping as dr,ClampToEdgeWrapping as cr,MirroredRepeatWrapping as hr,NearestFilter as pr,NearestMipmapNearestFilter as gr,NeverCompare as mr,AlwaysCompare as fr,LessEqualCompare as yr,EqualCompare as br,GreaterEqualCompare as xr,GreaterCompare as Tr,NotEqualCompare as _r,warnOnce as vr,NotEqualStencilFunc as Nr,GreaterStencilFunc as Sr,GreaterEqualStencilFunc as Ar,EqualStencilFunc as Rr,LessEqualStencilFunc as Cr,LessStencilFunc as Er,AlwaysStencilFunc as wr,NeverStencilFunc as Mr,DecrementWrapStencilOp as Br,IncrementWrapStencilOp as Ur,DecrementStencilOp as Fr,IncrementStencilOp as Pr,InvertStencilOp as Ir,ReplaceStencilOp as Lr,ZeroStencilOp as Dr,KeepStencilOp as Vr,MaxEquation as Or,MinEquation as Gr,SpotLight as kr,PointLight as zr,DirectionalLight as $r,RectAreaLight as Wr,AmbientLight as Hr,HemisphereLight as jr,LightProbe as qr,LinearToneMapping as Kr,ReinhardToneMapping as Xr,CineonToneMapping as Yr,ACESFilmicToneMapping as Qr,AgXToneMapping as Zr,NeutralToneMapping as Jr,Group as es,Loader as ts,FileLoader as rs,MaterialLoader as ss,ObjectLoader as is}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrayCamera,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,CylinderGeometry,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LinearTransfer,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Matrix2,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneGeometry,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ns=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveMap","envMap","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"];class os{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ns,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const us=e=>as(e),ls=e=>as(e),ds=(...e)=>as(e);function cs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of hs(e))r.push(r,as(s.slice(0,-4)),i.getCacheKey(t));return as(r)}function*hs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Ts=Object.freeze({__proto__:null,arrayBufferToBase64:bs,base64ToArrayBuffer:xs,getCacheKey:cs,getLengthFromType:ms,getNodeChildren:hs,getTypeFromLength:gs,getValueFromType:ys,getValueType:fs,hash:ds,hashArray:ls,hashString:us});const _s={VERTEX:"vertex",FRAGMENT:"fragment"},vs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ns={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Ss={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},As=["fragment","vertex"],Rs=["setup","analyze","generate"],Cs=[...As,"compute"],Es=["x","y","z","w"];let ws=0;class Ms extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=vs.NONE,this.updateBeforeType=vs.NONE,this.updateAfterType=vs.NONE,this.uuid=a.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ws++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,vs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,vs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,vs.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of hs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=cs(this,e),this._cacheKeyVersion=this.version),this._cacheKey}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){e.stack.nodes.length;t.initialized=!0,t.outputNode=this.setup(e),null!==t.outputNode&&e.stack.nodes.length;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return hs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Bs extends Ms{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Us extends Ms{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Fs extends Ms{static get type(){return"TempNode"}constructor(e){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Ps extends Fs{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const Is=Es.join("");class Ls extends Ms{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(Es.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const o=r.build(e,n);i=this.components.length===s&&this.components===Is.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ds extends Fs{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getTypeFromLength(r.length,s.getNodeType(e)),o=s.build(e,n),a=t.build(e,i),u=e.getTypeLength(i),l=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Hs=e=>Ws(e).split("").sort().join(""),js={setup(e,t){const r=t.shift();return e(yi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ks.assign(r,...e),r);if(zs.has(t)){const s=zs.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&zs.has(t.slice(0,t.length-6))){const s=zs.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Ws(t),fi(new Ls(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Hs(t.slice(3).toLowerCase()),r=>fi(new Ds(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Hs(t.slice(4).toLowerCase()),()=>fi(new Vs(fi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),fi(new Ls(e,t));if(!0===/^\d+$/.test(t))return fi(new Bs(r,new Gs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},qs=new WeakMap,Ks=new WeakMap,Xs=function(e,t=null){for(const r in e)e[r]=fi(e[r],t);return e},Ys=function(e,t=null){const r=e.length;for(let s=0;sfi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...bi(t))):null!==r?(r=fi(r),(...s)=>i(new e(t,...bi(s),r))):(...r)=>i(new e(t,...bi(r)))},Zs=function(e,...t){return fi(new e(...bi(t)))};class Js extends Ms{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=Ks.get(e.constructor);void 0===s&&(s=new WeakMap,Ks.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=fi(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=fi(n.call(r))}else{const s=t.jsFunc,n=null!==r?s(r,e):s(e);i=fi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ei extends Ms{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return yi(e),fi(new Js(this,e))}setup(){return this.call()}}const ti=[!1,!0],ri=[0,1,2,3],si=[-1,-2],ii=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],ni=new Map;for(const e of ti)ni.set(e,new Gs(e));const oi=new Map;for(const e of ri)oi.set(e,new Gs(e,"uint"));const ai=new Map([...oi].map((e=>new Gs(e.value,"int"))));for(const e of si)ai.set(e,new Gs(e,"int"));const ui=new Map([...ai].map((e=>new Gs(e.value))));for(const e of ii)ui.set(e,new Gs(e));for(const e of ii)ui.set(-e,new Gs(-e));const li={bool:ni,uint:oi,ints:ai,float:ui},di=new Map([...ni,...ui]),ci=(e,t)=>di.has(e)?di.get(e):!0===e.isNode?e:new Gs(e,t),hi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[ys(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return fi(t.get(r[0]));if(1===r.length){const t=ci(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?fi(t):fi(new Us(t,e))}const s=r.map((e=>ci(e)));return fi(new Ps(s,e))}},pi=e=>"object"==typeof e&&null!==e?e.value:e,gi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function mi(e,t){return new Proxy(new ei(e,t),js)}const fi=(e,t=null)=>function(e,t=null){const r=fs(e);if("node"===r){let t=qs.get(e);return void 0===t&&(t=new Proxy(e,js),qs.set(e,t),qs.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?fi(ci(e,t)):"shader"===r?_i(e):e}(e,t),yi=(e,t=null)=>new Xs(e,t),bi=(e,t=null)=>new Ys(e,t),xi=(...e)=>new Qs(...e),Ti=(...e)=>new Zs(...e),_i=(e,t)=>{const r=new mi(e,t),s=(...e)=>{let t;return yi(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};$s("toGlobal",(e=>(e.global=!0,e)));const vi=e=>{ks=e},Ni=()=>ks,Si=(...e)=>ks.If(...e);function Ai(e){return ks&&ks.add(e),e}$s("append",Ai);const Ri=new hi("color"),Ci=new hi("float",li.float),Ei=new hi("int",li.ints),wi=new hi("uint",li.uint),Mi=new hi("bool",li.bool),Bi=new hi("vec2"),Ui=new hi("ivec2"),Fi=new hi("uvec2"),Pi=new hi("bvec2"),Ii=new hi("vec3"),Li=new hi("ivec3"),Di=new hi("uvec3"),Vi=new hi("bvec3"),Oi=new hi("vec4"),Gi=new hi("ivec4"),ki=new hi("uvec4"),zi=new hi("bvec4"),$i=new hi("mat2"),Wi=new hi("mat3"),Hi=new hi("mat4");$s("toColor",Ri),$s("toFloat",Ci),$s("toInt",Ei),$s("toUint",wi),$s("toBool",Mi),$s("toVec2",Bi),$s("toIVec2",Ui),$s("toUVec2",Fi),$s("toBVec2",Pi),$s("toVec3",Ii),$s("toIVec3",Li),$s("toUVec3",Di),$s("toBVec3",Vi),$s("toVec4",Oi),$s("toIVec4",Gi),$s("toUVec4",ki),$s("toBVec4",zi),$s("toMat2",$i),$s("toMat3",Wi),$s("toMat4",Hi);const ji=xi(Bs),qi=(e,t)=>fi(new Us(fi(e),t));$s("element",ji),$s("convert",qi);class Ki extends Ms{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Xi=e=>new Ki(e),Yi=(e,t=0)=>new Ki(e,!0,t),Qi=Yi("frame"),Zi=Yi("render"),Ji=Xi("object");class en extends Os{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Ji}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const tn=(e,t)=>{const r=gi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return fi(new en(s,r))};class rn extends Ms{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const sn=(e,t)=>fi(new rn(e,t)),nn=(e,t)=>fi(new rn(e,t,!0)),on=Ti(rn,"vec4","DiffuseColor"),an=Ti(rn,"vec3","EmissiveColor"),un=Ti(rn,"float","Roughness"),ln=Ti(rn,"float","Metalness"),dn=Ti(rn,"float","Clearcoat"),cn=Ti(rn,"float","ClearcoatRoughness"),hn=Ti(rn,"vec3","Sheen"),pn=Ti(rn,"float","SheenRoughness"),gn=Ti(rn,"float","Iridescence"),mn=Ti(rn,"float","IridescenceIOR"),fn=Ti(rn,"float","IridescenceThickness"),yn=Ti(rn,"float","AlphaT"),bn=Ti(rn,"float","Anisotropy"),xn=Ti(rn,"vec3","AnisotropyT"),Tn=Ti(rn,"vec3","AnisotropyB"),_n=Ti(rn,"color","SpecularColor"),vn=Ti(rn,"float","SpecularF90"),Nn=Ti(rn,"float","Shininess"),Sn=Ti(rn,"vec4","Output"),An=Ti(rn,"float","dashSize"),Rn=Ti(rn,"float","gapSize"),Cn=Ti(rn,"float","pointWidth"),En=Ti(rn,"float","IOR"),wn=Ti(rn,"float","Transmission"),Mn=Ti(rn,"float","Thickness"),Bn=Ti(rn,"float","AttenuationDistance"),Un=Ti(rn,"color","AttenuationColor"),Fn=Ti(rn,"float","Dispersion");class Pn extends Fs{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return Es.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?bi(t):yi(t[0]),fi(new Ln(fi(e),t)));$s("call",Dn);class Vn extends Fs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Vn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}return"float"===n&&e.isMatrix(o)?o:e.isMatrix(n)&&e.isVector(o)?e.getVectorFromMatrix(n):e.isVector(n)&&e.isMatrix(o)?e.getVectorFromMatrix(o):e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)&&e.isVector(a)?a=e.getVectorFromMatrix(o):o=e.isVector(o)&&e.isMatrix(a)?e.getVectorFromMatrix(a):a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const On=xi(Vn,"+"),Gn=xi(Vn,"-"),kn=xi(Vn,"*"),zn=xi(Vn,"/"),$n=xi(Vn,"%"),Wn=xi(Vn,"=="),Hn=xi(Vn,"!="),jn=xi(Vn,"<"),qn=xi(Vn,">"),Kn=xi(Vn,"<="),Xn=xi(Vn,">="),Yn=xi(Vn,"&&"),Qn=xi(Vn,"||"),Zn=xi(Vn,"!"),Jn=xi(Vn,"^^"),eo=xi(Vn,"&"),to=xi(Vn,"~"),ro=xi(Vn,"|"),so=xi(Vn,"^"),io=xi(Vn,"<<"),no=xi(Vn,">>");$s("add",On),$s("sub",Gn),$s("mul",kn),$s("div",zn),$s("modInt",$n),$s("equal",Wn),$s("notEqual",Hn),$s("lessThan",jn),$s("greaterThan",qn),$s("lessThanEqual",Kn),$s("greaterThanEqual",Xn),$s("and",Yn),$s("or",Qn),$s("not",Zn),$s("xor",Jn),$s("bitAnd",eo),$s("bitNot",to),$s("bitOr",ro),$s("bitXor",so),$s("shiftLeft",io),$s("shiftRight",no);const oo=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),$n(...e));$s("remainder",oo);class ao extends Fs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===ao.LENGTH||t===ao.DISTANCE||t===ao.DOT?"float":t===ao.CROSS?"vec3":t===ao.ALL?"bool":t===ao.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===ao.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,u=!0===e.renderer.isWebGLRenderer;if(r===ao.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=Oi(Ii(s),0):r=Oi(Ii(r),0);const i=kn(r,s).xyz;return Ro(i).build(e,t)}if(r===ao.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===ao.ONE_MINUS)return Gn(1,n).build(e,t);if(r===ao.RECIPROCAL)return zn(1,n).build(e,t);if(r===ao.DIFFERENCE)return Po(Gn(n,o)).build(e,t);{const l=[];return r===ao.CROSS||r===ao.MOD?l.push(n.build(e,s),o.build(e,s)):u&&r===ao.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):u&&(r===ao.MIN||r===ao.MAX)||r===ao.MOD?l.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===ao.REFRACT?l.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===ao.MIX?l.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(l.push(n.build(e,i)),null!==o&&l.push(o.build(e,i)),null!==a&&l.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ao.ALL="all",ao.ANY="any",ao.EQUALS="equals",ao.RADIANS="radians",ao.DEGREES="degrees",ao.EXP="exp",ao.EXP2="exp2",ao.LOG="log",ao.LOG2="log2",ao.SQRT="sqrt",ao.INVERSE_SQRT="inversesqrt",ao.FLOOR="floor",ao.CEIL="ceil",ao.NORMALIZE="normalize",ao.FRACT="fract",ao.SIN="sin",ao.COS="cos",ao.TAN="tan",ao.ASIN="asin",ao.ACOS="acos",ao.ATAN="atan",ao.ABS="abs",ao.SIGN="sign",ao.LENGTH="length",ao.NEGATE="negate",ao.ONE_MINUS="oneMinus",ao.DFDX="dFdx",ao.DFDY="dFdy",ao.ROUND="round",ao.RECIPROCAL="reciprocal",ao.TRUNC="trunc",ao.FWIDTH="fwidth",ao.BITCAST="bitcast",ao.TRANSPOSE="transpose",ao.ATAN2="atan2",ao.MIN="min",ao.MAX="max",ao.MOD="mod",ao.STEP="step",ao.REFLECT="reflect",ao.DISTANCE="distance",ao.DIFFERENCE="difference",ao.DOT="dot",ao.CROSS="cross",ao.POW="pow",ao.TRANSFORM_DIRECTION="transformDirection",ao.MIX="mix",ao.CLAMP="clamp",ao.REFRACT="refract",ao.SMOOTHSTEP="smoothstep",ao.FACEFORWARD="faceforward";const uo=Ci(1e-6),lo=Ci(1e6),co=Ci(Math.PI),ho=Ci(2*Math.PI),po=xi(ao,ao.ALL),go=xi(ao,ao.ANY),mo=xi(ao,ao.EQUALS),fo=xi(ao,ao.RADIANS),yo=xi(ao,ao.DEGREES),bo=xi(ao,ao.EXP),xo=xi(ao,ao.EXP2),To=xi(ao,ao.LOG),_o=xi(ao,ao.LOG2),vo=xi(ao,ao.SQRT),No=xi(ao,ao.INVERSE_SQRT),So=xi(ao,ao.FLOOR),Ao=xi(ao,ao.CEIL),Ro=xi(ao,ao.NORMALIZE),Co=xi(ao,ao.FRACT),Eo=xi(ao,ao.SIN),wo=xi(ao,ao.COS),Mo=xi(ao,ao.TAN),Bo=xi(ao,ao.ASIN),Uo=xi(ao,ao.ACOS),Fo=xi(ao,ao.ATAN),Po=xi(ao,ao.ABS),Io=xi(ao,ao.SIGN),Lo=xi(ao,ao.LENGTH),Do=xi(ao,ao.NEGATE),Vo=xi(ao,ao.ONE_MINUS),Oo=xi(ao,ao.DFDX),Go=xi(ao,ao.DFDY),ko=xi(ao,ao.ROUND),zo=xi(ao,ao.RECIPROCAL),$o=xi(ao,ao.TRUNC),Wo=xi(ao,ao.FWIDTH),Ho=xi(ao,ao.BITCAST),jo=xi(ao,ao.TRANSPOSE),qo=xi(ao,ao.ATAN2),Ko=xi(ao,ao.MIN),Xo=xi(ao,ao.MAX),Yo=xi(ao,ao.MOD),Qo=xi(ao,ao.STEP),Zo=xi(ao,ao.REFLECT),Jo=xi(ao,ao.DISTANCE),ea=xi(ao,ao.DIFFERENCE),ta=xi(ao,ao.DOT),ra=xi(ao,ao.CROSS),sa=xi(ao,ao.POW),ia=xi(ao,ao.POW,2),na=xi(ao,ao.POW,3),oa=xi(ao,ao.POW,4),aa=xi(ao,ao.TRANSFORM_DIRECTION),ua=e=>kn(Io(e),sa(Po(e),1/3)),la=e=>ta(e,e),da=xi(ao,ao.MIX),ca=(e,t=0,r=1)=>fi(new ao(ao.CLAMP,fi(e),fi(t),fi(r))),ha=e=>ca(e),pa=xi(ao,ao.REFRACT),ga=xi(ao,ao.SMOOTHSTEP),ma=xi(ao,ao.FACEFORWARD),fa=_i((([e])=>{const t=ta(e.xy,Bi(12.9898,78.233)),r=Yo(t,co);return Co(Eo(r).mul(43758.5453))})),ya=(e,t,r)=>da(t,r,e),ba=(e,t,r)=>ga(t,r,e);$s("all",po),$s("any",go),$s("equals",mo),$s("radians",fo),$s("degrees",yo),$s("exp",bo),$s("exp2",xo),$s("log",To),$s("log2",_o),$s("sqrt",vo),$s("inverseSqrt",No),$s("floor",So),$s("ceil",Ao),$s("normalize",Ro),$s("fract",Co),$s("sin",Eo),$s("cos",wo),$s("tan",Mo),$s("asin",Bo),$s("acos",Uo),$s("atan",Fo),$s("abs",Po),$s("sign",Io),$s("length",Lo),$s("lengthSq",la),$s("negate",Do),$s("oneMinus",Vo),$s("dFdx",Oo),$s("dFdy",Go),$s("round",ko),$s("reciprocal",zo),$s("trunc",$o),$s("fwidth",Wo),$s("atan2",qo),$s("min",Ko),$s("max",Xo),$s("mod",Yo),$s("step",Qo),$s("reflect",Zo),$s("distance",Jo),$s("dot",ta),$s("cross",ra),$s("pow",sa),$s("pow2",ia),$s("pow3",na),$s("pow4",oa),$s("transformDirection",aa),$s("mix",ya),$s("clamp",ca),$s("refract",pa),$s("smoothstep",ba),$s("faceForward",ma),$s("difference",ea),$s("saturate",ha),$s("cbrt",ua),$s("transpose",jo),$s("rand",fa);class xa extends Ms{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const t=this.ifNode.getNodeType(e);if(null!==this.elseNode){const r=this.elseNode.getNodeType(e);if(e.getTypeLength(r)>e.getTypeLength(t))return r}return t}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:o}=e.getNodeProperties(this),a="void"!==t,u=a?sn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const Ta=xi(xa);$s("select",Ta);const _a=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),Ta(...e));$s("cond",_a);class va extends Ms{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Na=xi(va),Sa=(e,t)=>Na(e,{label:t});$s("context",Na),$s("label",Sa);class Aa extends Ms{static get type(){return"VarNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r}=this,s=e.getVarFromNode(this,r,e.getVectorType(this.getNodeType(e))),i=e.getPropertyName(s),n=t.build(e,s.type);return e.addLineFlowCode(`${i} = ${n}`,this),i}}const Ra=xi(Aa);$s("toVar",((...e)=>Ra(...e).append()));const Ca=e=>(console.warn('TSL: "temp" is deprecated. Use ".toVar()" instead.'),Ra(e));$s("temp",Ca);class Ea extends Ms{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e);if(void 0===t.propertyName){const s=this.getNodeType(e),i=e.getPropertyName(r,_s.VERTEX);e.flowNodeFromShaderStage(_s.VERTEX,this.node,s,i),t.propertyName=i}return e.getPropertyName(r)}}const wa=xi(Ea);$s("varying",wa);const Ma=_i((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return da(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ba=_i((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return da(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ua="WorkingColorSpace",Fa="OutputColorSpace";class Pa extends Fs{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ua?u.workingColorSpace:t===Fa?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let n=t;return!1!==u.enabled&&r!==s&&r&&s?(u.getTransfer(r)===l&&(n=Oi(Ma(n.rgb),n.a)),u.getPrimaries(r)!==u.getPrimaries(s)&&(n=Oi(Wi(u._getMatrix(new i,r,s)).mul(n.rgb),n.a)),u.getTransfer(s)===l&&(n=Oi(Ba(n.rgb),n.a)),n):n}}const Ia=e=>fi(new Pa(fi(e),Ua,Fa)),La=e=>fi(new Pa(fi(e),Fa,Ua)),Da=(e,t)=>fi(new Pa(fi(e),Ua,t)),Va=(e,t)=>fi(new Pa(fi(e),t,Ua));$s("toOutputColorSpace",Ia),$s("toWorkingColorSpace",La),$s("workingToColorSpace",Da),$s("colorSpaceToWorking",Va);let Oa=class extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class Ga extends Ms{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=vs.OBJECT}setGroup(e){return this.group=e,this}element(e){return fi(new Oa(this,fi(e)))}setNodeType(e){const t=tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new ka(e,t,r));class $a extends Fs{static get type(){return"ToneMappingNode"}constructor(e,t=Ha,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}getCacheKey(){return ds(super.getCacheKey(),this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===d)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Oi(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Wa=(e,t,r)=>fi(new $a(e,fi(t),fi(r))),Ha=za("toneMappingExposure","float");$s("toneMapping",((e,t,r)=>Wa(t,r,e)));class ja extends Os{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=c,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new h(r,i),a=new g(o,s,n);o.setUsage(this.usage),this.attribute=a,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=wa(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const qa=(e,t,r,s)=>fi(new ja(e,t,r,s)),Ka=(e,t,r,s)=>qa(e,t,r,s).setUsage(p),Xa=(e,t,r,s)=>qa(e,t,r,s).setInstanced(!0),Ya=(e,t,r,s)=>Ka(e,t,r,s).setInstanced(!0);$s("toAttribute",(e=>qa(e.value)));class Qa extends Ms{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.updateBeforeType=vs.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;efi(new Qa(fi(e),t,r));$s("compute",Za);class Ja extends Ms{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){return this.node.getNodeType(e)}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const eu=(e,...t)=>fi(new Ja(fi(e),...t));$s("cache",eu);class tu extends Ms{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ru=xi(tu);$s("bypass",ru);class su extends Ms{static get type(){return"RemapNode"}constructor(e,t,r,s=Ci(0),i=Ci(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const iu=xi(su,null,null,{doClamp:!1}),nu=xi(su);$s("remap",iu),$s("remapClamp",nu);class ou extends Ms{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(`( ${s} )`,r,t);e.addLineFlowCode(s,this)}}const au=xi(ou),uu=e=>(e?Ta(e,au("discard")):au("discard")).append();$s("discard",uu);class lu extends Fs{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutput=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||d,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||m;return r!==d&&(t=t.toneMapping(r)),s!==m&&s!==u.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const du=(e,t=null,r=null)=>fi(new lu(fi(e),t,r));$s("renderOutput",du);class cu extends Ms{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return wa(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const hu=(e,t)=>fi(new cu(e,t)),pu=e=>hu("uv"+(e>0?e:""),"vec2");class gu extends Ms{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const mu=xi(gu);class fu extends en{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=vs.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const yu=xi(fu);class bu extends en{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=vs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===f?"uvec4":this.value.type===y?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return pu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=tn(this.value.matrix)),this._matrixUniform.mul(Ii(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?vs.FRAME:vs.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Ei(mu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;let r=this.uvNode;null!==r&&!0!==e.context.forceUVContext||!e.context.getUV||(r=e.context.getUV(this)),r||(r=this.getDefaultUV()),!0===this.updateMatrix&&(r=this.getTransformedUV(r)),r=this.setupUV(e,r);let s=this.levelNode;null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),t.uvNode=r,t.levelNode=s,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=e.getNodeProperties(this),s=this.value;if(!s||!0!==s.isTexture)throw new Error("TextureNode: Need a three.js texture.");const i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:s,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=r,c=this.generateUV(e,t),h=s?s.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${b}`,this),n.snippet=b,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(s)&&(a=Va(au(a,u),s.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){const t=this.clone();return t.uvNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}blur(e){const t=this.clone();return t.biasNode=fi(e).mul(yu(t)),t.referenceNode=this.getSelf(),fi(t)}level(e){const t=this.clone();return t.levelNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}size(e){return mu(this,e)}bias(e){const t=this.clone();return t.biasNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}compare(e){const t=this.clone();return t.compareNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}grad(e,t){const r=this.clone();return r.gradNode=[fi(e),fi(t)],r.referenceNode=this.getSelf(),fi(r)}depth(e){const t=this.clone();return t.depthNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const xu=xi(bu),Tu=(...e)=>xu(...e).setSampler(!1),_u=tn("float").label("cameraNear").setGroup(Zi).onRenderUpdate((({camera:e})=>e.near)),vu=tn("float").label("cameraFar").setGroup(Zi).onRenderUpdate((({camera:e})=>e.far)),Nu=tn("mat4").label("cameraProjectionMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrix)),Su=tn("mat4").label("cameraProjectionMatrixInverse").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),Au=tn("mat4").label("cameraViewMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorldInverse)),Ru=tn("mat4").label("cameraWorldMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorld)),Cu=tn("mat3").label("cameraNormalMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.normalMatrix)),Eu=tn(new r).label("cameraPosition").setGroup(Zi).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class wu extends Ms{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=vs.OBJECT,this._uniformNode=new en(null)}getNodeType(){const e=this.scope;return e===wu.WORLD_MATRIX?"mat4":e===wu.POSITION||e===wu.VIEW_POSITION||e===wu.DIRECTION||e===wu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===wu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===wu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===wu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===wu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===wu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===wu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==wu.POSITION&&t!==wu.VIEW_POSITION&&t!==wu.DIRECTION&&t!==wu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}wu.WORLD_MATRIX="worldMatrix",wu.POSITION="position",wu.SCALE="scale",wu.VIEW_POSITION="viewPosition",wu.DIRECTION="direction";const Mu=xi(wu,wu.DIRECTION),Bu=xi(wu,wu.WORLD_MATRIX),Uu=xi(wu,wu.POSITION),Fu=xi(wu,wu.SCALE),Pu=xi(wu,wu.VIEW_POSITION);class Iu extends wu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Lu=Ti(Iu,Iu.DIRECTION),Du=Ti(Iu,Iu.WORLD_MATRIX),Vu=Ti(Iu,Iu.POSITION),Ou=Ti(Iu,Iu.SCALE),Gu=Ti(Iu,Iu.VIEW_POSITION),ku=tn(new i).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),zu=tn(new n).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),$u=Au.mul(Du).toVar("modelViewMatrix"),Wu=_i((e=>(e.context.isHighPrecisionModelViewMatrix=!0,tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highPrecisionModelViewMatrix"),Hu=_i((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highPrecisionModelNormalMatrix"),ju=hu("position","vec3"),qu=ju.varying("positionLocal"),Ku=ju.varying("positionPrevious"),Xu=Du.mul(qu).xyz.varying("v_positionWorld"),Yu=qu.transformDirection(Du).varying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),Qu=$u.mul(qu).xyz.varying("v_positionView"),Zu=Qu.negate().varying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Ju extends Ms{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===b&&r.side===x?"false":e.getFrontFacing()}}const el=Ti(Ju),tl=Ci(el).mul(2).sub(1),rl=hu("normal","vec3"),sl=_i((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),Ii(0,1,0)):rl),"vec3").once()().toVar("normalLocal"),il=Qu.dFdx().cross(Qu.dFdy()).normalize().toVar("normalFlat"),nl=_i((e=>{let t;return t=!0===e.material.flatShading?il:wa(cl(sl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),ol=wa(nl.transformDirection(Au),"v_normalWorld").normalize().toVar("normalWorld"),al=_i((e=>e.context.setupNormal()),"vec3").once()().mul(tl).toVar("transformedNormalView"),ul=al.transformDirection(Au).toVar("transformedNormalWorld"),ll=_i((e=>e.context.setupClearcoatNormal()),"vec3").once()().mul(tl).toVar("transformedClearcoatNormalView"),dl=_i((([e,t=Du])=>{const r=Wi(t),s=e.div(Ii(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),cl=_i((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=ku.mul(e);return Au.transformDirection(s)})),hl=tn(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),pl=Zu.negate().reflect(al),gl=Zu.negate().refract(al,hl),ml=pl.transformDirection(Au).toVar("reflectVector"),fl=gl.transformDirection(Au).toVar("reflectVector");class yl extends bu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===T?ml:e.mapping===_?fl:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Ii(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==v&&r.isRenderTargetTexture?t:Ii(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const bl=xi(yl);class xl extends en{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Tl=(e,t,r)=>fi(new xl(e,t,r));class _l extends Bs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType();return e.format(t,"vec4",r)}}class vl extends xl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null,"vec4"),this.array=e,this.elementType=t,this._elementType=null,this._elementLength=0,this.updateType=vs.RENDER,this.isArrayBufferNode=!0}getElementType(){return this.elementType||this._elementType}getElementLength(){return this._elementLength}update(){const{array:e,value:t}=this,r=this.getElementLength(),s=this.getElementType();if(1===r)for(let r=0;rfi(new vl(e,t));class Sl extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Al extends Ms{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=vs.OBJECT}element(e){return fi(new Sl(this,fi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Tl(null,e,this.count):Array.isArray(this.getValueFromReference())?Nl(null,e):"texture"===e?xu(null):"cubeTexture"===e?bl(null):tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new Al(e,t,r)),Cl=(e,t,r,s)=>fi(new Al(e,t,s,r));class El extends Al{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const wl=(e,t,r)=>fi(new El(e,t,r)),Ml=_i((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),hu("tangent","vec4"))))(),Bl=Ml.xyz.toVar("tangentLocal"),Ul=$u.mul(Oi(Bl,0)).xyz.varying("v_tangentView").normalize().toVar("tangentView"),Fl=Ul.transformDirection(Au).varying("v_tangentWorld").normalize().toVar("tangentWorld"),Pl=Ul.toVar("transformedTangentView"),Il=Pl.transformDirection(Au).normalize().toVar("transformedTangentWorld"),Ll=e=>e.mul(Ml.w).xyz,Dl=wa(Ll(rl.cross(Ml)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Vl=wa(Ll(sl.cross(Bl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Ol=wa(Ll(nl.cross(Ul)),"v_bitangentView").normalize().toVar("bitangentView"),Gl=wa(Ll(ol.cross(Fl)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kl=Ll(al.cross(Pl)).normalize().toVar("transformedBitangentView"),zl=kl.transformDirection(Au).normalize().toVar("transformedBitangentWorld"),$l=Wi(Ul,Ol,nl),Wl=Zu.mul($l),Hl=(()=>{let e=Tn.cross(Zu);return e=e.cross(Tn).normalize(),e=da(e,al,bn.mul(un.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),jl=_i((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=tl.mul(g.inverseSqrt());return On(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class ql extends Fs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=N}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Ii(s.xy.mul(r),s.z));let i=null;if(t===S)i=cl(s);else if(t===N){i=!0===e.hasGeometryAttribute("tangent")?$l.mul(s).normalize():jl({eye_pos:Qu,surf_norm:nl,mapN:s,uv:pu()})}return i}}const Kl=xi(ql),Xl=_i((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||pu()),forceUVContext:!0}),s=Ci(r((e=>e)));return Bi(Ci(r((e=>e.add(e.dFdx())))).sub(s),Ci(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Yl=_i((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(tl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class Ql extends Fs{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Xl({textureNode:this.textureNode,bumpScale:e});return Yl({surf_pos:Qu,surf_norm:nl,dHdxy:t})}}const Zl=xi(Ql),Jl=new Map;class ed extends Ms{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Jl.get(e);return void 0===r&&(r=wl(e,t),Jl.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===ed.COLOR){const e=void 0!==t.color?this.getColor(r):Ii();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===ed.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===ed.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Ci(1);else if(r===ed.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularMap?e.mul(this.getTexture(r).a):e}else if(r===ed.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===ed.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===ed.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===ed.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===ed.NORMAL)t.normalMap?(s=Kl(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Zl(this.getTexture("bump").r,this.getFloat("bumpScale")):nl;else if(r===ed.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kl(this.getTexture(r),this.getCache(r+"Scale","vec2")):nl;else if(r===ed.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===ed.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===ed.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=$i(Vd.x,Vd.y,Vd.y.negate(),Vd.x).mul(e.rg.mul(2).sub(Bi(1)).normalize().mul(e.b))}else s=Vd;else if(r===ed.IRIDESCENCE_THICKNESS){const e=Rl("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Rl("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===ed.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===ed.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===ed.IOR)s=this.getFloat(r);else if(r===ed.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===ed.AO_MAP)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}ed.ALPHA_TEST="alphaTest",ed.COLOR="color",ed.OPACITY="opacity",ed.SHININESS="shininess",ed.SPECULAR="specular",ed.SPECULAR_STRENGTH="specularStrength",ed.SPECULAR_INTENSITY="specularIntensity",ed.SPECULAR_COLOR="specularColor",ed.REFLECTIVITY="reflectivity",ed.ROUGHNESS="roughness",ed.METALNESS="metalness",ed.NORMAL="normal",ed.CLEARCOAT="clearcoat",ed.CLEARCOAT_ROUGHNESS="clearcoatRoughness",ed.CLEARCOAT_NORMAL="clearcoatNormal",ed.EMISSIVE="emissive",ed.ROTATION="rotation",ed.SHEEN="sheen",ed.SHEEN_ROUGHNESS="sheenRoughness",ed.ANISOTROPY="anisotropy",ed.IRIDESCENCE="iridescence",ed.IRIDESCENCE_IOR="iridescenceIOR",ed.IRIDESCENCE_THICKNESS="iridescenceThickness",ed.IOR="ior",ed.TRANSMISSION="transmission",ed.THICKNESS="thickness",ed.ATTENUATION_DISTANCE="attenuationDistance",ed.ATTENUATION_COLOR="attenuationColor",ed.LINE_SCALE="scale",ed.LINE_DASH_SIZE="dashSize",ed.LINE_GAP_SIZE="gapSize",ed.LINE_WIDTH="linewidth",ed.LINE_DASH_OFFSET="dashOffset",ed.POINT_WIDTH="pointWidth",ed.DISPERSION="dispersion",ed.LIGHT_MAP="light",ed.AO_MAP="ao";const td=Ti(ed,ed.ALPHA_TEST),rd=Ti(ed,ed.COLOR),sd=Ti(ed,ed.SHININESS),id=Ti(ed,ed.EMISSIVE),nd=Ti(ed,ed.OPACITY),od=Ti(ed,ed.SPECULAR),ad=Ti(ed,ed.SPECULAR_INTENSITY),ud=Ti(ed,ed.SPECULAR_COLOR),ld=Ti(ed,ed.SPECULAR_STRENGTH),dd=Ti(ed,ed.REFLECTIVITY),cd=Ti(ed,ed.ROUGHNESS),hd=Ti(ed,ed.METALNESS),pd=Ti(ed,ed.NORMAL).context({getUV:null}),gd=Ti(ed,ed.CLEARCOAT),md=Ti(ed,ed.CLEARCOAT_ROUGHNESS),fd=Ti(ed,ed.CLEARCOAT_NORMAL).context({getUV:null}),yd=Ti(ed,ed.ROTATION),bd=Ti(ed,ed.SHEEN),xd=Ti(ed,ed.SHEEN_ROUGHNESS),Td=Ti(ed,ed.ANISOTROPY),_d=Ti(ed,ed.IRIDESCENCE),vd=Ti(ed,ed.IRIDESCENCE_IOR),Nd=Ti(ed,ed.IRIDESCENCE_THICKNESS),Sd=Ti(ed,ed.TRANSMISSION),Ad=Ti(ed,ed.THICKNESS),Rd=Ti(ed,ed.IOR),Cd=Ti(ed,ed.ATTENUATION_DISTANCE),Ed=Ti(ed,ed.ATTENUATION_COLOR),wd=Ti(ed,ed.LINE_SCALE),Md=Ti(ed,ed.LINE_DASH_SIZE),Bd=Ti(ed,ed.LINE_GAP_SIZE),Ud=Ti(ed,ed.LINE_WIDTH),Fd=Ti(ed,ed.LINE_DASH_OFFSET),Pd=Ti(ed,ed.POINT_WIDTH),Id=Ti(ed,ed.DISPERSION),Ld=Ti(ed,ed.LIGHT_MAP),Dd=Ti(ed,ed.AO_MAP),Vd=tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}));class Od extends Fs{static get type(){return"ModelViewProjectionNode"}constructor(e=null){super("vec4"),this.positionNode=e}setup(e){if("fragment"===e.shaderStage)return wa(e.context.mvp);const t=this.positionNode||qu,r=e.renderer.nodes.modelViewMatrix||$u;return Nu.mul(r).mul(t)}}const Gd=xi(Od);class kd extends Ms{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===kd.VERTEX)s=e.getVertexIndex();else if(r===kd.INSTANCE)s=e.getInstanceIndex();else if(r===kd.DRAW)s=e.getDrawIndex();else if(r===kd.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===kd.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==kd.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=wa(this).build(e,t)}return i}}kd.VERTEX="vertex",kd.INSTANCE="instance",kd.SUBGROUP="subgroup",kd.INVOCATION_LOCAL="invocationLocal",kd.INVOCATION_SUBGROUP="invocationSubgroup",kd.DRAW="draw";const zd=Ti(kd,kd.VERTEX),$d=Ti(kd,kd.INSTANCE),Wd=Ti(kd,kd.SUBGROUP),Hd=Ti(kd,kd.INVOCATION_SUBGROUP),jd=Ti(kd,kd.INVOCATION_LOCAL),qd=Ti(kd,kd.DRAW);class Kd extends Ms{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=vs.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Tl(r.array,"mat4",Math.max(t,1)).element($d);else{const e=new A(r.array,16,1);this.buffer=e;const t=r.usage===p?Ya:Xa,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Hi(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new R(s.array,3),t=s.usage===p?Ya:Xa;this.bufferColor=e,n=Ii(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(qu).xyz;if(qu.assign(o),e.hasGeometryAttribute("normal")){const e=dl(sl,i);sl.assign(e)}null!==this.instanceColorNode&&nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==p&&null!=this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==p&&null!=this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Xd=xi(Kd);class Yd extends Kd{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instanceMesh=e}}const Qd=xi(Yd);class Zd extends Ms{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=$d:this.batchingIdNode=qd);const t=_i((([e])=>{const t=mu(Tu(this.batchMesh._indirectTexture),0),r=Ei(e).modInt(Ei(t)),s=Ei(e).div(Ei(t));return Tu(this.batchMesh._indirectTexture,Ui(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Ei(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mu(Tu(s),0),n=Ci(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Ei(i)),u=Hi(Tu(s,Ui(o,a)),Tu(s,Ui(o.add(1),a)),Tu(s,Ui(o.add(2),a)),Tu(s,Ui(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=_i((([e])=>{const t=mu(Tu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Tu(l,Ui(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);nn("vec3","vBatchColor").assign(t)}const d=Wi(u);qu.assign(u.mul(qu));const c=sl.div(Ii(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;sl.assign(h),e.hasGeometryAttribute("tangent")&&Bl.mulAssign(d)}}const Jd=xi(Zd),ec=new WeakMap;class tc extends Ms{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=vs.OBJECT,this.skinIndexNode=hu("skinIndex","uvec4"),this.skinWeightNode=hu("skinWeight","vec4"),t?(r=Rl("bindMatrix","mat4"),s=Rl("bindMatrixInverse","mat4"),i=Cl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=tn(e.bindMatrix,"mat4"),s=tn(e.bindMatrixInverse,"mat4"),i=Tl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=qu){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=On(o.mul(s.x).mul(d),a.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=sl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=On(s.x.mul(o),s.y.mul(a),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Cl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ku)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")}setup(e){this.needsPreviousBoneMatrices(e)&&Ku.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(qu.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();sl.assign(t),e.hasGeometryAttribute("tangent")&&Bl.assign(t)}}generate(e,t){if("void"!==t)return qu.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;ec.get(t)!==e.frameId&&(ec.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const rc=e=>fi(new tc(e,!0));class sc extends Ms{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt()+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tfi(new sc(bi(e,"int"))).append(),nc=()=>au("break").append(),oc=new WeakMap,ac=new s,uc=_i((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Ei(zd).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Tu(e,Ui(u,a)).depth(i).mul(t)}));class lc extends Ms{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=tn(1),this.updateType=vs.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,o=void 0!==n?n.length:0,{texture:a,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,o=void 0!==n?n.length:0;let a=oc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*o),f=new C(m,h,p,o);f.type=E,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Ci(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Tu(this.mesh.morphTexture,Ui(Ei(e).add(1),Ei($d))).r):t.assign(Rl("morphTargetInfluences","float").element(e).toVar()),!0===s&&qu.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(0)})),!0===i&&sl.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(1)}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const dc=xi(lc);class cc extends Ms{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}generate(){console.warn("Abstract function.")}}class hc extends cc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class pc extends va{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Ii().toVar("directDiffuse"),directSpecular:Ii().toVar("directSpecular"),indirectDiffuse:Ii().toVar("indirectDiffuse"),indirectSpecular:Ii().toVar("indirectSpecular")};return{radiance:Ii().toVar("radiance"),irradiance:Ii().toVar("irradiance"),iblIrradiance:Ii().toVar("iblIrradiance"),ambientOcclusion:Ci(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const gc=xi(pc);class mc extends cc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let fc,yc;class bc extends Ms{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===bc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=vs.NONE;return this.scope!==bc.SIZE&&this.scope!==bc.VIEWPORT||(e=vs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===bc.VIEWPORT?null!==t?yc.copy(t.viewport):(e.getViewport(yc),yc.multiplyScalar(e.getPixelRatio())):null!==t?(fc.width=t.width,fc.height=t.height):e.getDrawingBufferSize(fc)}setup(){const e=this.scope;let r=null;return r=e===bc.SIZE?tn(fc||(fc=new t)):e===bc.VIEWPORT?tn(yc||(yc=new s)):Bi(_c.div(Tc)),r}generate(e){if(this.scope===bc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Tc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}bc.COORDINATE="coordinate",bc.VIEWPORT="viewport",bc.SIZE="size",bc.UV="uv";const xc=Ti(bc,bc.UV),Tc=Ti(bc,bc.SIZE),_c=Ti(bc,bc.COORDINATE),vc=Ti(bc,bc.VIEWPORT),Nc=vc.zw,Sc=_c.sub(vc.xy),Ac=Sc.div(Nc),Rc=_i((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Tc)),"vec2").once()(),Cc=_i((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),xc)),"vec2").once()(),Ec=_i((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),xc.flipY())),"vec2").once()(),wc=new t;class Mc extends bu{static get type(){return"ViewportTextureNode"}constructor(e=xc,t=null,r=null){null===r&&((r=new w).minFilter=M),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=vs.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(wc);const r=this.value;r.image.width===wc.width&&r.image.height===wc.height||(r.image.width=wc.width,r.image.height=wc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Bc=xi(Mc),Uc=xi(Mc,null,null,{generateMipmaps:!0});let Fc=null;class Pc extends Mc{static get type(){return"ViewportDepthTextureNode"}constructor(e=xc,t=null){null===Fc&&(Fc=new B),super(e,t,Fc)}}const Ic=xi(Pc);class Lc extends Ms{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Lc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Lc.DEPTH_BASE)null!==r&&(s=kc().assign(r));else if(t===Lc.DEPTH)s=e.isPerspectiveCamera?Vc(Qu.z,_u,vu):Dc(Qu.z,_u,vu);else if(t===Lc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Oc(r,_u,vu);s=Dc(e,_u,vu)}else s=r;else s=Dc(Qu.z,_u,vu);return s}}Lc.DEPTH_BASE="depthBase",Lc.DEPTH="depth",Lc.LINEAR_DEPTH="linearDepth";const Dc=(e,t,r)=>e.add(t).div(t.sub(r)),Vc=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Oc=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Gc=(e,t,r)=>{t=t.max(1e-6).toVar();const s=_o(e.negate().div(t)),i=_o(r.div(t));return s.div(i)},kc=xi(Lc,Lc.DEPTH_BASE),zc=Ti(Lc,Lc.DEPTH),$c=xi(Lc,Lc.LINEAR_DEPTH),Wc=$c(Ic());zc.assign=e=>kc(e);const Hc=xi(class extends Ms{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class jc extends Ms{static get type(){return"ClippingNode"}constructor(e=jc.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===jc.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===jc.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return _i((()=>{const r=Ci().toVar("distanceToPlane"),s=Ci().toVar("distanceToGradient"),i=Ci(1).toVar("clipOpacity"),n=t.length;if(!this.hardwareClipping&&n>0){const e=Nl(t);ic(n,(({i:t})=>{const n=e.element(t);r.assign(Qu.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ga(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Nl(e),n=Ci(1).toVar("intersectionClipOpacity");ic(o,(({i:e})=>{const i=t.element(e);r.assign(Qu.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ga(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}on.a.mulAssign(i),on.a.equal(0).discard()}))()}setupDefault(e,t){return _i((()=>{const r=t.length;if(!this.hardwareClipping&&r>0){const e=Nl(t);ic(r,(({i:t})=>{const r=e.element(t);Qu.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Nl(e),r=Mi(!0).toVar("clipped");ic(s,(({i:e})=>{const s=t.element(e);r.assign(Qu.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),_i((()=>{const s=Nl(e),i=Hc(t.getClipDistance());ic(r,(({i:e})=>{const t=s.element(e),r=Qu.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}jc.ALPHA_TO_COVERAGE="alphaToCoverage",jc.DEFAULT="default",jc.HARDWARE="hardware";const qc=_i((([e])=>Co(kn(1e4,Eo(kn(17,e.x).add(kn(.1,e.y)))).mul(On(.1,Po(Eo(kn(13,e.y).add(e.x)))))))),Kc=_i((([e])=>qc(Bi(qc(e.xy),e.z)))),Xc=_i((([e])=>{const t=Xo(Lo(Oo(e.xyz)),Lo(Go(e.xyz))),r=Ci(1).div(Ci(.05).mul(t)).toVar("pixScale"),s=Bi(xo(So(_o(r))),xo(Ao(_o(r)))),i=Bi(Kc(So(s.x.mul(e.xyz))),Kc(So(s.y.mul(e.xyz)))),n=Co(_o(r)),o=On(kn(n.oneMinus(),i.x),kn(n,i.y)),a=Ko(n,n.oneMinus()),u=Ii(o.mul(o).div(kn(2,a).mul(Gn(1,a))),o.sub(kn(.5,a)).div(Gn(1,a)),Gn(1,Gn(1,o).mul(Gn(1,o)).div(kn(2,a).mul(Gn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return ca(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Yc extends U{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.forceSinglePass=!1,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+cs(this)}build(e){this.setup(e)}setupObserver(e){return new os(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e);const t=e.renderer,r=t.getRenderTarget();let s;e.addStack(),e.stack.outputNode=this.vertexNode||this.setupPosition(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const i=this.setupClipping(e);if(!0===this.depthWrite&&(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const n=this.setupLighting(e);null!==i&&e.stack.add(i);const o=Oi(n,on.a).max(0);if(s=this.setupOutput(e,o),Sn.assign(s),null!==this.outputNode&&(s=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(s=e,null!==r&&(s=e.merge(r))):null!==r&&(s=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Oi(t)),s=this.setupOutput(e,t)}e.stack.outputNode=s,e.addFlow("fragment",e.removeStack()),e.monitor=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=fi(new jc(jc.ALPHA_TO_COVERAGE)):e.stack.add(fi(new jc))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(fi(new jc(jc.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Gc(Qu.z,_u,vu):Dc(Qu.z,_u,vu))}null!==s&&zc.assign(s).append()}setupPosition(e){const{object:t}=e,r=t.geometry;if(e.addStack(),(r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&dc(t).append(),!0===t.isSkinnedMesh&&rc(t).append(),this.displacementMap){const e=wl("displacementMap","texture"),t=wl("displacementScale","float"),r=wl("displacementBias","float");qu.addAssign(sl.normalize().mul(e.x.mul(t).add(r)))}t.isBatchedMesh&&Jd(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Qd(t).append(),null!==this.positionNode&&qu.assign(this.positionNode),this.setupHardwareClipping(e);const s=Gd();return e.context.vertex=e.removeStack(),e.context.mvp=s,s}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?Oi(this.colorNode):rd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=Oi(r.xyz.mul(hu("color","vec3")),r.a)),e.instanceColor){r=nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=nn("vec3","vBatchColor").mul(r)}on.assign(r);const s=this.opacityNode?Ci(this.opacityNode):nd;if(on.a.assign(on.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Ci(this.alphaTestNode):td;on.a.lessThanEqual(e).discard()}!0===this.alphaHash&&on.a.lessThan(Xc(qu)).discard(),!1===this.transparent&&this.blending===F&&!1===this.alphaToCoverage&&on.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Ii(0):on.rgb}setupNormal(){return this.normalNode?Ii(this.normalNode):pd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?wl("envMap","cubeTexture"):wl("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new mc(Ld)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Dd;t.push(new hc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=gc(n,t,r,s)}else null!==r&&(o=Ii(null!==s?da(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(an.assign(Ii(i||id)),o=o.add(an)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(t=Oi(r.mix(t.rgb,r.colorNode),t.a))}return t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=U.prototype.toJSON.call(this,e),s=hs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Qc=new P;class Zc extends Yc{static get type(){return"InstancedPointsNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.pointWidth=1,this.pointColorNode=null,this.pointWidthNode=null,this.setDefaultValues(Qc),this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor;this.vertexNode=_i((()=>{const e=hu("instancePosition").xyz,t=Oi($u.mul(Oi(e,1))),r=vc.z.div(vc.w),s=Nu.mul(t),i=ju.xy.toVar();return i.mulAssign(this.pointWidthNode?this.pointWidthNode:Pd),i.assign(i.div(vc.z)),i.y.assign(i.y.mul(r)),i.assign(i.mul(s.w)),s.addAssign(Oi(i,0,0)),s}))(),this.fragmentNode=_i((()=>{const s=Ci(1).toVar(),i=la(pu().mul(2).sub(1));if(t&&e.samples>1){const e=Ci(i.fwidth()).toVar();s.assign(ga(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();let n;if(this.pointColorNode)n=this.pointColorNode;else if(r){n=hu("instanceColor").mul(rd)}else n=rd;return s.mulAssign(nd),Oi(n,s)}))()}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const Jc=new I;class eh extends Yc{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.lights=!1,this.setDefaultValues(Jc),this.setValues(e)}}const th=new L;class rh extends Yc{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.lights=!1,this.setDefaultValues(th),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Ci(this.offsetNodeNode):Fd,t=this.dashScaleNode?Ci(this.dashScaleNode):wd,r=this.dashSizeNode?Ci(this.dashSizeNode):Md,s=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(r),Rn.assign(s);const i=wa(hu("lineDistance").mul(t));(e?i.add(e):i).mod(An.add(Rn)).greaterThan(An).discard()}}let sh=null;class ih extends Mc{static get type(){return"ViewportSharedTextureNode"}constructor(e=xc,t=null){null===sh&&(sh=new w),super(e,t,sh)}updateReference(){return this}}const nh=xi(ih),oh=new L;class ah extends Yc{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.lights=!1,this.setDefaultValues(oh),this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.useDash=e.dashed,this.useWorldUnits=!1,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=D,this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor,s=this.dashed,i=this.worldUnits,n=_i((({start:e,end:t})=>{const r=Nu.element(2).element(2),s=Nu.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Oi(da(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=_i((()=>{const e=hu("instanceStart"),t=hu("instanceEnd"),r=Oi($u.mul(Oi(e,1))).toVar("start"),o=Oi($u.mul(Oi(t,1))).toVar("end");if(s){const e=this.dashScaleNode?Ci(this.dashScaleNode):wd,t=this.offsetNode?Ci(this.offsetNodeNode):Fd,r=hu("instanceDistanceStart"),s=hu("instanceDistanceEnd");let i=ju.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),nn("float","lineDistance").assign(i)}i&&(nn("vec3","worldStart").assign(r.xyz),nn("vec3","worldEnd").assign(o.xyz));const a=vc.z.div(vc.w),u=Nu.element(2).element(3).equal(-1);Si(u,(()=>{Si(r.z.lessThan(0).and(o.z.greaterThan(0)),(()=>{o.assign(n({start:r,end:o}))})).ElseIf(o.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(n({start:o,end:r}))}))}));const l=Nu.mul(r),d=Nu.mul(o),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(a)),p.assign(p.normalize());const g=Oi().toVar();if(i){const e=o.xyz.sub(r.xyz).normalize(),t=da(r.xyz,o.xyz,.5).normalize(),i=e.cross(t).normalize(),n=e.cross(i),a=nn("vec4","worldPos");a.assign(ju.y.lessThan(.5).select(r,o));const u=Ud.mul(.5);a.addAssign(Oi(ju.x.lessThan(0).select(i.mul(u),i.mul(u).negate()),0)),s||(a.addAssign(Oi(ju.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(Oi(n.mul(u),0)),Si(ju.y.greaterThan(1).or(ju.y.lessThan(0)),(()=>{a.subAssign(Oi(n.mul(2).mul(u),0))}))),g.assign(Nu.mul(a));const l=Ii().toVar();l.assign(ju.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Bi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(ju.x.lessThan(0).select(e.negate(),e)),Si(ju.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(ju.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(Ud)),e.assign(e.div(vc.w)),g.assign(ju.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Oi(e,0,0)))}return g}))();const o=_i((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Bi(h,p)}));if(this.colorNode=_i((()=>{const n=pu();if(s){const e=this.dashSizeNode?Ci(this.dashSizeNode):Md,t=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(e),Rn.assign(t);const r=nn("float","lineDistance");n.y.lessThan(-1).or(n.y.greaterThan(1)).discard(),r.mod(An.add(Rn)).greaterThan(An).discard()}const a=Ci(1).toVar("alpha");if(i){const r=nn("vec3","worldStart"),i=nn("vec3","worldEnd"),n=nn("vec4","worldPos").xyz.normalize().mul(1e5),u=i.sub(r),l=o({p1:r,p2:i,p3:Ii(0,0,0),p4:n}),d=r.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Ud);if(!s)if(t&&e.samples>1){const e=h.fwidth();a.assign(ga(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(t&&e.samples>1){const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1)),r=e.mul(e).add(t.mul(t)),s=Ci(r.fwidth()).toVar("dlen");Si(n.y.abs().greaterThan(1),(()=>{a.assign(ga(s.oneMinus(),s.add(1),r).oneMinus())}))}else Si(n.y.abs().greaterThan(1),(()=>{const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1));e.mul(e).add(t.mul(t)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(r){const e=hu("instanceColorStart"),t=hu("instanceColorEnd");u=ju.y.lessThan(.5).select(e,t).mul(rd)}else u=rd;return Oi(u,a)}))(),this.transparent){const e=this.opacityNode?Ci(this.opacityNode):nd;this.outputNode=Oi(this.colorNode.rgb.mul(e).add(nh().rgb.mul(e.oneMinus())),this.colorNode.a)}}get worldUnits(){return this.useWorldUnits}set worldUnits(e){this.useWorldUnits!==e&&(this.useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this.useDash}set dashed(e){this.useDash!==e&&(this.useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const uh=e=>fi(e).mul(.5).add(.5),lh=new V;class dh extends Yc{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(lh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Ci(this.opacityNode):nd;on.assign(Oi(uh(al),e))}}class ch extends Fs{static get type(){return"EquirectUVNode"}constructor(e=Yu){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan2(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Bi(t,r)}}const hh=xi(ch);class ph extends O{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new G(5,5,5),n=hh(Yu),o=new Yc;o.colorNode=xu(t,n,0),o.side=x,o.blending=D;const a=new k(i,o),u=new z;u.add(a),t.minFilter===M&&(t.minFilter=$);const l=new W(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const gh=new WeakMap;class mh extends Fs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=bl();const t=new H;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=vs.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===j||r===q){if(gh.has(e)){const t=gh.get(e);yh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ph(r.height);s.fromEquirectangularTexture(t,e),yh(s.texture,e.mapping),this._cubeTexture=s.texture,gh.set(e,s.texture),e.addEventListener("dispose",fh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function fh(e){const t=e.target;t.removeEventListener("dispose",fh);const r=gh.get(t);void 0!==r&&(gh.delete(t),r.dispose())}function yh(e,t){t===j?e.mapping=T:t===q&&(e.mapping=_)}const bh=xi(mh);class xh extends cc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=bh(this.envNode)}}class Th extends cc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Ci(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class _h{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class vh extends _h{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(Oi(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(Oi(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(on.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case Y:i.rgb.assign(da(i.rgb,i.rgb.mul(n.rgb),ld.mul(dd)));break;case X:i.rgb.assign(da(i.rgb,n.rgb,ld.mul(dd)));break;case K:i.rgb.addAssign(n.rgb.mul(ld.mul(dd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Nh=new Q;class Sh extends Yc{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Nh),this.setValues(e)}setupNormal(){return nl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Th(Ld)),t}setupOutgoingLight(){return on.rgb}setupLightingModel(){return new vh}}const Ah=_i((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),Rh=_i((e=>e.diffuseColor.mul(1/Math.PI))),Ch=_i((({dotNH:e})=>Nn.mul(Ci(.5)).add(1).mul(Ci(1/Math.PI)).mul(e.pow(Nn)))),Eh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(t).clamp(),s=Zu.dot(t).clamp(),i=Ah({f0:_n,f90:1,dotVH:s}),n=Ci(.25),o=Ch({dotNH:r});return i.mul(n).mul(o)}));class wh extends vh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Eh({lightDirection:e})).mul(ld))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const Mh=new Z;class Bh extends Yc{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Mh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh(!1)}}const Uh=new J;class Fh extends Yc{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Uh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh}setupVariants(){const e=(this.shininessNode?Ci(this.shininessNode):sd).max(1e-4);Nn.assign(e);const t=this.specularNode||od;_n.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ph=_i((e=>{if(!1===e.geometry.hasAttribute("normal"))return Ci(0);const t=nl.dFdx().abs().max(nl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Ih=_i((e=>{const{roughness:t}=e,r=Ph();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Lh=_i((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return zn(.5,i.add(n).max(uo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Dh=_i((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul(Ii(e.mul(r),t.mul(s),o).length()),l=o.mul(Ii(e.mul(i),t.mul(n),a).length());return zn(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Vh=_i((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Oh=Ci(1/Math.PI),Gh=_i((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=Ii(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Oh.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),kh=_i((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||al,l=i.pow2(),d=t.add(Zu).normalize(),c=u.dot(t).clamp(),h=u.dot(Zu).clamp(),p=u.dot(d).clamp(),g=Zu.dot(d).clamp();let m,f,y=Ah({f0:r,f90:s,dotVH:g});if(pi(o)&&(y=gn.mix(y,n)),pi(a)){const e=xn.dot(t),r=xn.dot(Zu),s=xn.dot(d),i=Tn.dot(t),n=Tn.dot(Zu),o=Tn.dot(d);m=Dh({alphaT:yn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Gh({alphaT:yn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=Lh({alpha:l,dotNL:c,dotNV:h}),f=Vh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),zh=_i((({roughness:e,dotNV:t})=>{const r=Oi(-1,-.0275,-.572,.022),s=Oi(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Bi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),$h=_i((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=zh({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Wh=_i((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Ii(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),Hh=_i((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Ci(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Ci(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),jh=_i((({dotNV:e,dotNL:t})=>Ci(1).div(Ci(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),qh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(e).clamp(),s=al.dot(Zu).clamp(),i=al.dot(t).clamp(),n=Hh({roughness:pn,dotNH:i}),o=jh({dotNV:s,dotNL:r});return hn.mul(n).mul(o)})),Kh=_i((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Bi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Xh=_i((({f:e})=>{const t=e.length();return Xo(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Yh=_i((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),o=i.div(n),a=r.greaterThan(0).select(o,Xo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Qh=_i((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=Ii().toVar();return Si(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Wi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=Ii(0).toVar();f.addAssign(Yh({v1:h,v2:p})),f.addAssign(Yh({v1:p,v2:g})),f.addAssign(Yh({v1:g,v2:m})),f.addAssign(Yh({v1:m,v2:h})),c.assign(Ii(Xh({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Zh=1/6,Jh=e=>kn(Zh,kn(e,kn(e,e.negate().add(3)).sub(3)).add(1)),ep=e=>kn(Zh,kn(e,kn(e,kn(3,e).sub(6))).add(4)),tp=e=>kn(Zh,kn(e,kn(e,kn(-3,e).add(3)).add(3)).add(1)),rp=e=>kn(Zh,sa(e,3)),sp=e=>Jh(e).add(ep(e)),ip=e=>tp(e).add(rp(e)),np=e=>On(-1,ep(e).div(Jh(e).add(ep(e)))),op=e=>On(1,rp(e).div(tp(e).add(rp(e)))),ap=(e,t,r)=>{const s=e.uvNode,i=kn(s,t.zw).add(.5),n=So(i),o=Co(i),a=sp(o.x),u=ip(o.x),l=np(o.x),d=op(o.x),c=np(o.y),h=op(o.y),p=Bi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Bi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Bi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Bi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=sp(o.y).mul(On(a.mul(e.uv(p).level(r)),u.mul(e.uv(g).level(r)))),b=ip(o.y).mul(On(a.mul(e.uv(m).level(r)),u.mul(e.uv(f).level(r))));return y.add(b)},up=_i((([e,t=Ci(3)])=>{const r=Bi(e.size(Ei(t))),s=Bi(e.size(Ei(t.add(1)))),i=zn(1,r),n=zn(1,s),o=ap(e,Oi(i,r),So(t)),a=ap(e,Oi(n,s),Ao(t));return Co(t).mix(o,a)})),lp=_i((([e,t,r,s,i])=>{const n=Ii(pa(t.negate(),Ro(e),zn(1,s))),o=Ii(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return Ro(n).mul(r.mul(o))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),dp=_i((([e,t])=>e.mul(ca(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),cp=Uc(),hp=Uc(),pp=_i((([e,t,r],{material:s})=>{const i=(s.side==x?cp:hp).uv(e),n=_o(Tc.x).mul(dp(t,r));return up(i,n)})),gp=_i((([e,t,r])=>(Si(r.notEqual(0),(()=>{const s=To(t).negate().div(r);return bo(s.negate().mul(e))})),Ii(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),mp=_i((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Oi().toVar(),f=Ii().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Ii(d.sub(i),d,d.add(i));ic({start:0,end:3},(({i:i})=>{const d=n.element(i),g=lp(e,t,c,d,a),y=o.add(g),b=l.mul(u.mul(Oi(y,1))),x=Bi(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Bi(x.x,x.y.oneMinus()));const T=pp(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(gp(Lo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=lp(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(Oi(n,1))),y=Bi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Bi(y.x,y.y.oneMinus())),m=pp(y,r,d),f=s.mul(gp(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Ii($h({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Oi(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),fp=Wi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),yp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),bp=_i((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=da(e,t,ga(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Si(o.lessThan(0),(()=>Ii(1)));const a=o.sqrt(),u=yp(n,e),l=Ah({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Ci(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Ii(1).add(t).div(Ii(1).sub(t))})(i.clamp(0,.9999)),g=yp(p,n.toVec3()),m=Ah({f0:g,f90:1,dotVH:a}),f=Ii(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,a,2),b=Ii(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Ii(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return ic({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Ii(54856e-17,44201e-17,52481e-17),i=Ii(1681e3,1795300,2208400),n=Ii(43278e5,93046e5,66121e5),o=Ci(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=Ii(a.x.add(o),a.y,a.z).div(1.0685e-7),fp.mul(a)})(Ci(e).mul(y),Ci(e).mul(b)).mul(2);v.addAssign(N.mul(t))})),v.max(Ii(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),xp=_i((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Ta(r.lessThan(.25),Ci(-339.2).mul(i).add(Ci(161.4).mul(r)).sub(25.9),Ci(-8.48).mul(i).add(Ci(14.3).mul(r)).sub(9.95)),o=Ta(r.lessThan(.25),Ci(44).mul(i).sub(Ci(23.7).mul(r)).add(3.26),Ci(1.97).mul(i).sub(Ci(3.27).mul(r)).add(.72));return Ta(r.lessThan(.25),0,Ci(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Tp=Ii(.04),_p=Ci(1);class vp extends _h{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Ii().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Ii().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Ii().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Ii().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Ii().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=al.dot(Zu).clamp();this.iridescenceFresnel=bp({outsideIOR:Ci(1),eta2:mn,cosTheta1:e,thinFilmThickness:fn,baseF0:_n}),this.iridescenceF0=Wh({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Xu,r=Eu.sub(Xu).normalize(),s=ul;e.backdrop=mp(s,r,un,on,_n,vn,t,Du,Au,Nu,En,Mn,Un,Bn,this.dispersion?Fn:null),e.backdropAlpha=wn,on.a.mulAssign(da(1,e.backdrop.a,wn))}}computeMultiscattering(e,t,r){const s=al.dot(Zu).clamp(),i=zh({roughness:un,dotNV:s}),n=(this.iridescenceF0?gn.mix(_n,this.iridescenceF0):_n).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=_n.add(_n.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(qh({lightDirection:e}))),!0===this.clearcoat){const r=ll.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(kh({lightDirection:e,f0:Tp,f90:_p,roughness:cn,normalView:ll})))}r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),r.directSpecular.addAssign(s.mul(kh({lightDirection:e,f0:_n,f90:1,roughness:un,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=al,h=Zu,p=Qu.toVar(),g=Kh({N:c,V:h,roughness:un}),m=n.uv(g).toVar(),f=o.uv(g).toVar(),y=Wi(Ii(m.x,0,m.y),Ii(0,1,0),Ii(m.z,0,m.w)).toVar(),b=_n.mul(f.x).add(_n.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Qh({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(on).mul(Qh({N:c,V:h,P:p,mInv:Wi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Rh({diffuseColor:on})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(hn,xp({normal:al,viewDir:Zu,roughness:pn}))),!0===this.clearcoat){const e=ll.dot(Zu).clamp(),t=$h({dotNV:e,specularColor:Tp,specularF90:_p,roughness:cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=Ii().toVar("singleScattering"),i=Ii().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,vn);const o=s.add(i),a=on.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=al.dot(Zu).clamp().add(e),s=un.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ll.dot(Zu).clamp(),r=Ah({dotVH:e,f0:Tp,f90:_p}),s=t.mul(dn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(dn));t.assign(s)}if(!0===this.sheen){const e=hn.r.max(hn.g).max(hn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Np=Ci(1),Sp=Ci(-2),Ap=Ci(.8),Rp=Ci(-1),Cp=Ci(.4),Ep=Ci(2),wp=Ci(.305),Mp=Ci(3),Bp=Ci(.21),Up=Ci(4),Fp=Ci(4),Pp=Ci(16),Ip=_i((([e])=>{const t=Ii(Po(e)).toVar(),r=Ci(-1).toVar();return Si(t.x.greaterThan(t.z),(()=>{Si(t.x.greaterThan(t.y),(()=>{r.assign(Ta(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})).Else((()=>{Si(t.z.greaterThan(t.y),(()=>{r.assign(Ta(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Lp=_i((([e,t])=>{const r=Bi().toVar();return Si(t.equal(0),(()=>{r.assign(Bi(e.z,e.y).div(Po(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Bi(e.x.negate(),e.z.negate()).div(Po(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Bi(e.x.negate(),e.y).div(Po(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Bi(e.z.negate(),e.y).div(Po(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Bi(e.x.negate(),e.z).div(Po(e.y)))})).Else((()=>{r.assign(Bi(e.x,e.y).div(Po(e.z)))})),kn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Dp=_i((([e])=>{const t=Ci(0).toVar();return Si(e.greaterThanEqual(Ap),(()=>{t.assign(Np.sub(e).mul(Rp.sub(Sp)).div(Np.sub(Ap)).add(Sp))})).ElseIf(e.greaterThanEqual(Cp),(()=>{t.assign(Ap.sub(e).mul(Ep.sub(Rp)).div(Ap.sub(Cp)).add(Rp))})).ElseIf(e.greaterThanEqual(wp),(()=>{t.assign(Cp.sub(e).mul(Mp.sub(Ep)).div(Cp.sub(wp)).add(Ep))})).ElseIf(e.greaterThanEqual(Bp),(()=>{t.assign(wp.sub(e).mul(Up.sub(Mp)).div(wp.sub(Bp)).add(Mp))})).Else((()=>{t.assign(Ci(-2).mul(_o(kn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Vp=_i((([e,t])=>{const r=e.toVar();r.assign(kn(2,r).sub(1));const s=Ii(r,1).toVar();return Si(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Op=_i((([e,t,r,s,i,n])=>{const o=Ci(r),a=Ii(t),u=ca(Dp(o),Sp,n),l=Co(u),d=So(u),c=Ii(Gp(e,a,d,s,i,n)).toVar();return Si(l.notEqual(0),(()=>{const t=Ii(Gp(e,a,d.add(1),s,i,n)).toVar();c.assign(da(c,t,l))})),c})),Gp=_i((([e,t,r,s,i,n])=>{const o=Ci(r).toVar(),a=Ii(t),u=Ci(Ip(a)).toVar(),l=Ci(Xo(Fp.sub(o),0)).toVar();o.assign(Xo(o,Fp));const d=Ci(xo(o)).toVar(),c=Bi(Lp(a,u).mul(d.sub(2)).add(1)).toVar();return Si(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(kn(3,Pp))),c.y.addAssign(kn(4,xo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.uv(c).grad(Bi(),Bi())})),kp=_i((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=wo(s),l=r.mul(u).add(i.cross(r).mul(Eo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Gp(e,l,t,n,o,a)})),zp=_i((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Ii(Ta(t,r,ra(r,s))).toVar();Si(po(h.equals(Ii(0))),(()=>{h.assign(Ii(s.z,0,s.x.negate()))})),h.assign(Ro(h));const p=Ii().toVar();return p.addAssign(i.element(Ei(0)).mul(kp({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),ic({start:Ei(1),end:e},(({i:e})=>{Si(e.greaterThanEqual(n),(()=>{nc()}));const t=Ci(o.mul(Ci(e))).toVar();p.addAssign(i.element(e).mul(kp({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(kp({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),Oi(p,1)}));let $p=null;const Wp=new WeakMap;function Hp(e){let t=Wp.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=$p.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,Wp.set(e,t)}return t.texture}class jp extends Fs{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new ee;s.isRenderTargetTexture=!0,this._texture=xu(s),this._width=tn(0),this._height=tn(0),this._maxMip=tn(0),this.updateBeforeType=vs.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:Hp(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===$p&&($p=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===b&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=Ii(t.x.negate(),t.yz));let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Op(this._texture,t,s,this._width,this._height,this._maxMip)}}const qp=xi(jp),Kp=new WeakMap;class Xp extends cc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Kp.get(e);void 0===s&&(s=qp(e),Kp.set(e,s)),r=s}const s=t.envMap?Rl("envMapIntensity","float",e.material):Rl("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?Hl:al,n=r.context(Yp(un,i)).mul(s),o=r.context(Qp(ul)).mul(Math.PI).mul(s),a=eu(n),u=eu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(Yp(cn,ll)).mul(s),t=eu(e);l.addAssign(t)}}}const Yp=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Zu.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(Au)),r),getTextureLevel:()=>e}},Qp=e=>({getUV:()=>e,getTextureLevel:()=>Ci(1)}),Zp=new te;class Jp extends Yc{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Zp),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Xp(t):null}setupLightingModel(){return new vp}setupSpecular(){const e=da(Ii(.04),on.rgb,ln);_n.assign(e),vn.assign(1)}setupVariants(){const e=this.metalnessNode?Ci(this.metalnessNode):hd;ln.assign(e);let t=this.roughnessNode?Ci(this.roughnessNode):cd;t=Ih({roughness:t}),un.assign(t),this.setupSpecular(),on.assign(Oi(on.rgb.mul(e.oneMinus()),on.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const eg=new re;class tg extends Jp{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(eg),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Ci(this.iorNode):Rd;En.assign(e),_n.assign(da(Ko(ia(En.sub(1).div(En.add(1))).mul(ud),Ii(1)).mul(ad),on.rgb,ln)),vn.assign(da(ad,1,ln))}setupLightingModel(){return new vp(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Ci(this.clearcoatNode):gd,t=this.clearcoatRoughnessNode?Ci(this.clearcoatRoughnessNode):md;dn.assign(e),cn.assign(Ih({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Ii(this.sheenNode):bd,t=this.sheenRoughnessNode?Ci(this.sheenRoughnessNode):xd;hn.assign(e),pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Ci(this.iridescenceNode):_d,t=this.iridescenceIORNode?Ci(this.iridescenceIORNode):vd,r=this.iridescenceThicknessNode?Ci(this.iridescenceThicknessNode):Nd;gn.assign(e),mn.assign(t),fn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Bi(this.anisotropyNode):Td).toVar();bn.assign(e.length()),Si(bn.equal(0),(()=>{e.assign(Bi(1,0))})).Else((()=>{e.divAssign(Bi(bn)),bn.assign(bn.saturate())})),yn.assign(bn.pow2().mix(un.pow2(),1)),xn.assign($l[0].mul(e.x).add($l[1].mul(e.y))),Tn.assign($l[1].mul(e.x).sub($l[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Ci(this.transmissionNode):Sd,t=this.thicknessNode?Ci(this.thicknessNode):Ad,r=this.attenuationDistanceNode?Ci(this.attenuationDistanceNode):Cd,s=this.attenuationColorNode?Ii(this.attenuationColorNode):Ed;if(wn.assign(e),Mn.assign(t),Bn.assign(r),Un.assign(s),this.useDispersion){const e=this.dispersionNode?Ci(this.dispersionNode):Id;Fn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Ii(this.clearcoatNormalNode):fd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class rg extends vp{constructor(e,t,r,s){super(e,t,r),this.useSSS=s}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(al.mul(o)).normalize(),h=Ci(Zu.dot(c.negate()).saturate().pow(l).mul(d)),p=Ii(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class sg extends tg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Ci(.1),this.thicknessAmbientNode=Ci(0),this.thicknessAttenuationNode=Ci(.1),this.thicknessPowerNode=Ci(2),this.thicknessScaleNode=Ci(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new rg(this.useClearcoat,this.useSheen,this.useIridescence,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const ig=_i((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Bi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=wl("gradientMap","texture").context({getUV:()=>i});return Ii(e.r)}{const e=i.fwidth().mul(.5);return da(Ii(.7),Ii(1),ga(Ci(.7).sub(e.x),Ci(.7).add(e.x),i.x))}}));class ng extends _h{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=ig({normal:rl,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Rh({diffuseColor:on.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const og=new se;class ag extends Yc{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(og),this.setValues(e)}setupLightingModel(){return new ng}}class ug extends Fs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Ii(Zu.z,0,Zu.x.negate()).normalize(),t=Zu.cross(e);return Bi(e.dot(al),t.dot(al)).mul(.495).add(.5)}}const lg=Ti(ug),dg=new ie;class cg extends Yc{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(dg),this.setValues(e)}setupVariants(e){const t=lg;let r;r=e.material.matcap?wl("matcap","texture").context({getUV:()=>t}):Ii(da(.2,.8,t.y)),on.rgb.mulAssign(r.rgb)}}const hg=new P;class pg extends Yc{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.isPointsNodeMaterial=!0,this.lights=!1,this.transparent=!0,this.sizeNode=null,this.setDefaultValues(hg),this.setValues(e)}copy(e){return this.sizeNode=e.sizeNode,super.copy(e)}}class gg extends Fs{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return $i(e,s,s.negate(),e).mul(r)}{const e=t,s=Hi(Oi(1,0,0,0),Oi(0,wo(e.x),Eo(e.x).negate(),0),Oi(0,Eo(e.x),wo(e.x),0),Oi(0,0,0,1)),i=Hi(Oi(wo(e.y),0,Eo(e.y),0),Oi(0,1,0,0),Oi(Eo(e.y).negate(),0,wo(e.y),0),Oi(0,0,0,1)),n=Hi(Oi(wo(e.z),Eo(e.z).negate(),0,0),Oi(Eo(e.z),wo(e.z),0,0),Oi(0,0,1,0),Oi(0,0,0,1));return s.mul(i).mul(n).mul(Oi(r,1)).xyz}}}const mg=xi(gg),fg=new ne;class yg extends Yc{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this.lights=!1,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(fg),this.setValues(e)}setupPosition({object:e,camera:t,context:r}){const s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=qu;let u=$u.mul(Ii(i||0)),l=Bi(Du[0].xyz.length(),Du[1].xyz.length());if(null!==o&&(l=l.mul(o)),!s)if(t.isPerspectiveCamera)l=l.mul(u.z.negate());else{const e=Ci(2).div(Nu.element(1).element(1));l=l.mul(e.mul(2))}let d=a.xy;if(e.center&&!0===e.center.isVector2){const e=((e,t,r)=>fi(new Ga(e,t,r)))("center","vec2");d=d.sub(e.sub(.5))}d=d.mul(l);const c=Ci(n||yd),h=mg(d,c);u=Oi(u.xy.add(h),u.zw);const p=Nu.mul(u);return r.vertex=a,p}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}class bg extends _h{constructor(){super(),this.shadowNode=Ci(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){on.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(on.rgb)}}const xg=new oe;class Tg extends Yc{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(xg),this.setValues(e)}setupLightingModel(){return new bg}}const _g=_i((({texture:e,uv:t})=>{const r=1e-4,s=Ii().toVar();return Si(t.x.lessThan(r),(()=>{s.assign(Ii(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Ii(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Ii(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Ii(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Ii(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Ii(0,0,-1))})).Else((()=>{const r=.01,i=e.uv(t.add(Ii(-.01,0,0))).r.sub(e.uv(t.add(Ii(r,0,0))).r),n=e.uv(t.add(Ii(0,-.01,0))).r.sub(e.uv(t.add(Ii(0,r,0))).r),o=e.uv(t.add(Ii(0,0,-.01))).r.sub(e.uv(t.add(Ii(0,0,r))).r);s.assign(Ii(i,n,o))})),s.normalize()}));class vg extends bu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Ii(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){return t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return _g({texture:this,uv:e})}}const Ng=xi(vg);class Sg extends Yc{static get type(){return"VolumeNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.isVolumeNodeMaterial=!0,this.testNode=null,this.setValues(e)}setup(e){const t=Ng(this.map,null,0),r=_i((({orig:e,dir:t})=>{const r=Ii(-.5),s=Ii(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=Ko(n,o),u=Xo(n,o),l=Xo(a.x,Xo(a.y,a.z)),d=Ko(u.x,Ko(u.y,u.z));return Bi(l,d)}));this.fragmentNode=_i((()=>{const e=wa(Ii(zu.mul(Oi(Eu,1)))),s=wa(ju.sub(e)).normalize(),i=Bi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Bi(Xo(i.x,0),i.y));const n=Ii(e.add(i.x.mul(s))).toVar(),o=Ii(s.abs().reciprocal()).toVar(),a=Ci(Ko(o.x,Ko(o.y,o.z))).toVar("delta");a.divAssign(wl("steps","float"));const u=Oi(wl("base","color"),0).toVar();return ic({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=sn("float","d").assign(t.uv(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),nc()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),Oi(u)}))(),super.setup(e)}}class Ag{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}setAnimationLoop(e){this._animationLoop=e}setContext(e){this._context=e}dispose(){this.stop()}}class Rg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().monitor)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;a?p=o.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}return e.index&&(t+="index,"),t}getMaterialCacheKey(){const{object:e,material:t}=this;let r=t.customProgramCacheKey();for(const e of function(e){const t=Object.keys(e);let r=Object.getPrototypeOf(e);for(;r;){const e=Object.getOwnPropertyDescriptors(r);for(const r in e)if(void 0!==e[r]){const s=e[r];s&&"function"==typeof s.get&&t.push(r)}r=Object.getPrototypeOf(r)}return t}(t)){if(/^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test(e))continue;const s=t[e];let i;if(null!==s){const e=typeof s;"number"===e?i=0!==s?"1":"0":"object"===e?(i="{",s.isTexture&&(i+=s.mapping),i+="}"):i=String(s)}else i=String(s);r+=i+","}return r+=this.clippingContextCacheKey+",",e.geometry&&(r+=this.getGeometryCacheKey()),e.skeleton&&(r+=e.skeleton.bones.length+","),e.morphTargetInfluences&&(r+=e.morphTargetInfluences.length+","),e.isBatchedMesh&&(r+=e._matricesTexture.uuid+",",null!==e._colorsTexture&&(r+=e._colorsTexture.uuid+",")),e.count>1&&(r+=e.uuid+","),r+=e.receiveShadow+",",us(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=this._nodes.getCacheKey(this.scene,this.lightsNode);return this.object.receiveShadow&&(e+=1),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const wg=[];class Mg{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,o,a){const u=this.getChainMap(a);wg[0]=e,wg[1]=t,wg[2]=n,wg[3]=i;let l=u.get(wg);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set(wg,l)):(l.updateClipping(o),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,o,a)):l.version=t.version)),l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Rg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new Eg(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Bg{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Ug=1,Fg=2,Pg=3,Ig=4,Lg=16;class Dg extends Bg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ug?this.backend.createAttribute(e):t===Fg?this.backend.createIndexAttribute(e):t===Pg?this.backend.createStorageAttribute(e):t===Ig&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ae:ue)(t,1);return i.version=Vg(e),i}class Gg extends Bg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Pg):this.updateAttribute(e,Ug);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Fg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ig)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Og(t),e.set(t,r)):r.version!==Vg(t)&&(this.attributes.delete(r),r=Og(t),e.set(t,r)),s=r}return s}}class kg{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.compute={calls:0,frameCalls:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}updateTimestamp(e,t){0===this[e].timestampCalls&&(this[e].timestamp=0),this[e].timestamp+=t,this[e].timestampCalls++,this[e].timestampCalls>=this[e].previousFrameCalls&&(this[e].timestampCalls=0)}reset(){const e=this.render.frameCalls;this.render.previousFrameCalls=e;const t=this.compute.frameCalls;this.compute.previousFrameCalls=t,this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class zg{constructor(e){this.cacheKey=e,this.usedTimes=0}}class $g extends zg{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Wg extends zg{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Hg=0;class jg{constructor(e,t,r=null,s=null){this.id=Hg++,this.code=e,this.stage=t,this.transforms=r,this.attributes=s,this.usedTimes=0}}class qg extends Bg{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new jg(n.computeShader,"compute",n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState();let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new jg(n.vertexShader,"vertex"),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let a=this.programs.fragment.get(n.fragmentShader);void 0===a&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),a=new jg(n.fragmentShader,"fragment"),this.programs.fragment.set(n.fragmentShader,a),r.createProgram(a));const u=this._getRenderCacheKey(e,o,a);let l=this.caches.get(u);void 0===l?(i&&0===i.usedTimes&&this._releasePipeline(i),l=this._getRenderPipeline(e,o,a,u,t)):e.pipeline=l,l.usedTimes++,o.usedTimes++,a.usedTimes++,s.pipeline=l}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Wg(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new $g(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Kg extends Bg{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ig:Pg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function Xg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Yg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Qg(e){return(e.transmission>0||e.transmissionNode)&&e.side===le&&!1===e.forceSinglePass}class Zg{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Xg),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Yg),this.transparent.length>1&&this.transparent.sort(t||Yg)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new B,l.format=e.stencilBuffer?de:ce,l.type=e.stencilBuffer?he:f,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=im){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===j||t===q||t===T||t===_}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class om extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class am extends rn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class um extends Ms{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new mi(t);return this._currentCond=Ta(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new mi(t),s=Ta(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new mi(e),this}build(e,...t){const r=Ni();vi(this);for(const t of this.nodes)t.build(e,"void");return vi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const lm=xi(um);class dm extends Ms{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),fm=(e,t)=>sa(kn(4,e.mul(Gn(1,e))),t),ym=_i((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),bm=_i((([e])=>Ii(ym(e.z.add(ym(e.y.mul(1)))),ym(e.z.add(ym(e.x.mul(1)))),ym(e.y.add(ym(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),xm=_i((([e,t,r])=>{const s=Ii(e).toVar(),i=Ci(1.4).toVar(),n=Ci(0).toVar(),o=Ii(s).toVar();return ic({start:Ci(0),end:Ci(3),type:"float",condition:"<="},(()=>{const e=Ii(bm(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Ci(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Ci(ym(s.z.add(ym(s.x.add(ym(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"p",type:"vec3"},{name:"spd",type:"float"},{name:"time",type:"float"}]});class Tm extends Ms{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const _m=xi(Tm),vm=e=>(...t)=>_m(e,...t),Nm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.time)),Sm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.deltaTime)),Am=tn(0,"uint").setGroup(Zi).onRenderUpdate((e=>e.frameId)),Rm=_i((([e,t,r=Bi(.5)])=>mg(e.sub(r),t).add(r))),Cm=_i((([e,t,r=Bi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Em=_i((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Du.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Du;const i=Au.mul(s);return pi(t)&&(i[0][0]=Du[0].length(),i[0][1]=0,i[0][2]=0),pi(r)&&(i[1][0]=0,i[1][1]=Du[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,Nu.mul(i).mul(qu)})),wm=_i((([e=null])=>{const t=$c();return $c(Ic(e)).sub(t).lessThan(0).select(xc,e)}));class Mm extends Ms{static get type(){return"SpriteSheetUVNode"}constructor(e,t=pu(),r=Ci(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Bi(o,a);return t.add(l).mul(u)}}const Bm=xi(Mm);class Um extends Ms{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Ci(1),i=qu,n=sl){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot(Ii(1)));const a=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=xu(d,a).mul(o.x),g=xu(c,u).mul(o.y),m=xu(h,l).mul(o.z);return On(p,g,m)}}const Fm=xi(Um),Pm=new me,Im=new r,Lm=new r,Dm=new r,Vm=new n,Om=new r(0,0,-1),Gm=new s,km=new r,zm=new r,$m=new s,Wm=new t,Hm=new ge,jm=xc.flipX();Hm.depthTexture=new B(1,1);let qm=!1;class Km extends bu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Hm.texture,jm),this._reflectorBaseNode=e.reflector||new Xm(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=fi(new Km({defaultTexture:Hm.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class Xm extends Ms{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new fe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?vs.RENDER:vs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Wm),e.setSize(Math.round(Wm.width*r),Math.round(Wm.height*r))}setup(e){return this._updateResolution(Hm,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ge(0,0,{type:ye}),!0===this.generateMipmaps&&(t.texture.minFilter=be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new B),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&qm)return;qm=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(Wm),this._updateResolution(a,s),Lm.setFromMatrixPosition(n.matrixWorld),Dm.setFromMatrixPosition(r.matrixWorld),Vm.extractRotation(n.matrixWorld),Im.set(0,0,1),Im.applyMatrix4(Vm),km.subVectors(Lm,Dm),km.dot(Im)>0)return;km.reflect(Im).negate(),km.add(Lm),Vm.extractRotation(r.matrixWorld),Om.set(0,0,-1),Om.applyMatrix4(Vm),Om.add(Dm),zm.subVectors(Lm,Om),zm.reflect(Im).negate(),zm.add(Lm),o.coordinateSystem=r.coordinateSystem,o.position.copy(km),o.up.set(0,1,0),o.up.applyMatrix4(Vm),o.up.reflect(Im),o.lookAt(zm),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Pm.setFromNormalAndCoplanarPoint(Im,Lm),Pm.applyMatrix4(o.matrixWorldInverse),Gm.set(Pm.normal.x,Pm.normal.y,Pm.normal.z,Pm.constant);const u=o.projectionMatrix;$m.x=(Math.sign(Gm.x)+u.elements[8])/u.elements[0],$m.y=(Math.sign(Gm.y)+u.elements[9])/u.elements[5],$m.z=-1,$m.w=(1+u.elements[10])/u.elements[14],Gm.multiplyScalar(1/Gm.dot($m));u.elements[2]=Gm.x,u.elements[6]=Gm.y,u.elements[10]=s.coordinateSystem===v?Gm.z-0:Gm.z+1-0,u.elements[14]=Gm.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const l=s.getRenderTarget(),d=s.getMRT();s.setMRT(null),s.setRenderTarget(a),s.render(t,o),s.setMRT(d),s.setRenderTarget(l),i.visible=!0,qm=!1}}const Ym=new xe(-1,1,1,-1,0,1);class Qm extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new _e([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new _e(t,2))}}const Zm=new Qm;class Jm extends k{constructor(e=null){super(Zm,e),this.camera=Ym,this.isQuadMesh=!0}renderAsync(e){return e.renderAsync(this,Ym)}render(e){e.render(this,Ym)}}const ef=new t;class tf extends bu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ye}){const i=new ge(t,r,s);super(i.texture,pu()),this.node=e,this.width=t,this.height=r,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this.updateMap=new WeakMap,this._rttNode=null,this._quadMesh=new Jm(new Yc),this.updateBeforeType=vs.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(ef);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new bu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const rf=(e,...t)=>fi(new tf(fi(e),...t)),sf=_i((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===v?(e=Bi(e.x,e.y.oneMinus()).mul(2).sub(1),i=Oi(Ii(e,t),1)):i=Oi(Ii(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Oi(r.mul(i));return n.xyz.div(n.w)})),nf=_i((([e,t])=>{const r=t.mul(Oi(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Bi(s.x,s.y.oneMinus())})),of=_i((([e,t,r])=>{const s=mu(Tu(t)),i=Ui(e.mul(s)).toVar(),n=Tu(t,i).toVar(),o=Tu(t,i.sub(Ui(2,0))).toVar(),a=Tu(t,i.sub(Ui(1,0))).toVar(),u=Tu(t,i.add(Ui(1,0))).toVar(),l=Tu(t,i.add(Ui(2,0))).toVar(),d=Tu(t,i.add(Ui(0,2))).toVar(),c=Tu(t,i.add(Ui(0,1))).toVar(),h=Tu(t,i.sub(Ui(0,1))).toVar(),p=Tu(t,i.sub(Ui(0,2))).toVar(),g=Po(Gn(Ci(2).mul(a).sub(o),n)).toVar(),m=Po(Gn(Ci(2).mul(u).sub(l),n)).toVar(),f=Po(Gn(Ci(2).mul(c).sub(d),n)).toVar(),y=Po(Gn(Ci(2).mul(h).sub(p),n)).toVar(),b=sf(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(sf(e.sub(Bi(Ci(1).div(s.x),0)),a,r)),b.negate().add(sf(e.add(Bi(Ci(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(sf(e.add(Bi(0,Ci(1).div(s.y))),c,r)),b.negate().add(sf(e.sub(Bi(0,Ci(1).div(s.y))),h,r)));return Ro(ra(x,T))}));class af extends R{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageInstancedBufferAttribute=!0}}class uf extends ve{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageBufferAttribute=!0}}class lf extends Bs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const df=xi(lf);class cf extends xl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=gs(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Ss.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this.bufferCount=r,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return df(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=qa(this.value),this._varying=wa(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const hf=(e,t,r)=>fi(new cf(e,t,r));class pf extends cu{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class gf extends Ms{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const mf=Ti(gf),ff=new Se,yf=new n;class bf extends Ms{static get type(){return"SceneNode"}constructor(e=bf.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===bf.BACKGROUND_BLURRINESS?s=Rl("backgroundBlurriness","float",r):t===bf.BACKGROUND_INTENSITY?s=Rl("backgroundIntensity","float",r):t===bf.BACKGROUND_ROTATION?s=tn("mat4").label("backgroundRotation").setGroup(Zi).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Ne?(ff.copy(r.backgroundRotation),ff.x*=-1,ff.y*=-1,ff.z*=-1,yf.makeRotationFromEuler(ff)):yf.identity(),yf})):console.error("THREE.SceneNode: Unknown scope:",t),s}}bf.BACKGROUND_BLURRINESS="backgroundBlurriness",bf.BACKGROUND_INTENSITY="backgroundIntensity",bf.BACKGROUND_ROTATION="backgroundRotation";const xf=Ti(bf,bf.BACKGROUND_BLURRINESS),Tf=Ti(bf,bf.BACKGROUND_INTENSITY),_f=Ti(bf,bf.BACKGROUND_ROTATION);class vf extends bu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Ss.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Ss.READ_WRITE)}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}toWriteOnly(){return this.setAccess(Ss.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const Nf=xi(vf);class Sf extends Al{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const Af=new WeakMap;class Rf extends Fs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=vs.OBJECT,this.updateAfterType=vs.OBJECT,this.previousModelWorldMatrix=tn(new n),this.previousProjectionMatrix=tn(new n).setGroup(Zi),this.previousCameraViewMatrix=tn(new n)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ef(r);this.previousModelWorldMatrix.value.copy(s);const i=Cf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new n,i.previousCameraViewMatrix=new n,i.currentProjectionMatrix=new n,i.currentCameraViewMatrix=new n,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Ef(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?Nu:tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul($u).mul(qu),s=this.previousProjectionMatrix.mul(t).mul(Ku),i=r.xy.div(r.w),n=s.xy.div(s.w);return Gn(i,n)}}function Cf(e){let t=Af.get(e);return void 0===t&&(t={},Af.set(e,t)),t}function Ef(e,t=0){const r=Cf(e);let s=r[t];return void 0===s&&(r[t]=s=new n),s}const wf=Ti(Rf),Mf=_i((([e,t])=>Ko(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Bf=_i((([e,t])=>Ko(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Uf=_i((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ff=_i((([e,t])=>da(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Qo(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Pf=_i((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Oi(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),If=_i((([e])=>Of(e.rgb))),Lf=_i((([e,t=Ci(1)])=>t.mix(Of(e.rgb),e.rgb))),Df=_i((([e,t=Ci(1)])=>{const r=On(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return da(e.rgb,s,i)})),Vf=_i((([e,t=Ci(1)])=>{const r=Ii(.57735,.57735,.57735),s=t.cos();return Ii(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(ta(r,e.rgb).mul(s.oneMinus())))))})),Of=(e,t=Ii(u.getLuminanceCoefficients(new r)))=>ta(e,t),Gf=_i((([e,t=Ii(1),s=Ii(0),i=Ii(1),n=Ci(1),o=Ii(u.getLuminanceCoefficients(new r,Ae))])=>{const a=e.rgb.dot(Ii(o)),l=Xo(e.rgb.mul(t).add(s),0).toVar(),d=l.pow(i).toVar();return Si(l.r.greaterThan(0),(()=>{l.r.assign(d.r)})),Si(l.g.greaterThan(0),(()=>{l.g.assign(d.g)})),Si(l.b.greaterThan(0),(()=>{l.b.assign(d.b)})),l.assign(a.add(l.sub(a).mul(n))),Oi(l.rgb,e.a)}));class kf extends Fs{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const zf=xi(kf),$f=new t;class Wf extends bu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Hf extends Wf{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class jf extends Fs{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new B;i.isRenderTargetTexture=!0,i.name="depth";const n=new ge(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ye,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.updateBeforeType=vs.FRAME,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=tn(0),this._cameraFar=tn(0),this._mrt=null,this.isPassNode=!0}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.isRenderTargetTexture=!0,t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),t.isRenderTargetTexture=!0,this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=fi(new Hf(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=fi(new Hf(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Oc(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Dc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.renderTarget.depthTexture.isMultisampleRenderTargetTexture=this.renderTarget.samples>1,this.scope===jf.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize($f);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}jf.COLOR="color",jf.DEPTH="depth";class qf extends jf{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(jf.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Yc;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=x;const t=sl.negate(),r=Nu.mul($u),s=Ci(1),i=r.mul(Oi(qu,1)),n=r.mul(Oi(qu.add(t),1)),o=Ro(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Oi(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Kf=_i((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Xf=_i((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Yf=_i((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Qf=_i((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),Zf=_i((([e,t])=>{const r=Wi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Wi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Qf(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Jf=Wi(Ii(1.6605,-.1246,-.0182),Ii(-.5876,1.1329,-.1006),Ii(-.0728,-.0083,1.1187)),ey=Wi(Ii(.6274,.0691,.0164),Ii(.3293,.9195,.088),Ii(.0433,.0113,.8956)),ty=_i((([e])=>{const t=Ii(e).toVar(),r=Ii(t.mul(t)).toVar(),s=Ii(r.mul(r)).toVar();return Ci(15.5).mul(s.mul(r)).sub(kn(40.14,s.mul(t))).add(kn(31.96,s).sub(kn(6.868,r.mul(t))).add(kn(.4298,r).add(kn(.1191,t).sub(.00232))))})),ry=_i((([e,t])=>{const r=Ii(e).toVar(),s=Wi(Ii(.856627153315983,.137318972929847,.11189821299995),Ii(.0951212405381588,.761241990602591,.0767994186031903),Ii(.0482516061458583,.101439036467562,.811302368396859)),i=Wi(Ii(1.1271005818144368,-.1413297634984383,-.14132976349843826),Ii(-.11060664309660323,1.157823702216272,-.11060664309660294),Ii(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Ci(-12.47393),o=Ci(4.026069);return r.mulAssign(t),r.assign(ey.mul(r)),r.assign(s.mul(r)),r.assign(Xo(r,1e-10)),r.assign(_o(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(ca(r,0,1)),r.assign(ty(r)),r.assign(i.mul(r)),r.assign(sa(Xo(Ii(0),r),Ii(2.2))),r.assign(Jf.mul(r)),r.assign(ca(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),sy=_i((([e,t])=>{const r=Ci(.76),s=Ci(.15);e=e.mul(t);const i=Ko(e.r,Ko(e.g,e.b)),n=Ta(i.lessThan(.08),i.sub(kn(6.25,i.mul(i))),.04);e.subAssign(n);const o=Xo(e.r,Xo(e.g,e.b));Si(o.lessThan(r),(()=>e));const a=Gn(1,r),u=Gn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=Gn(1,zn(1,s.mul(o.sub(u)).add(1)));return da(e,Ii(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class iy extends Ms{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const ny=xi(iy);class oy extends iy{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const ay=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class uy extends Ms{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Ci()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=bs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const ly=xi(uy);class dy extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class cy{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const hy=new dy;class py extends Ms{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new dy,this._output=ly(),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=ly(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=ly(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new cy(this),t=hy.get("THREE"),r=hy.get("TSL"),s=this.getMethod(this.codeNode),i=[e,this._local,hy,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Ci()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return ls(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const gy=xi(py);class my extends Ms{static get type(){return"FogNode"}constructor(e,t){super("float"),this.isFogNode=!0,this.colorNode=e,this.factorNode=t}getViewZNode(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Qu.z).negate()}setup(){return this.factorNode}}const fy=xi(my);class yy extends my{static get type(){return"FogRangeNode"}constructor(e,t,r){super(e),this.isFogRangeNode=!0,this.nearNode=t,this.farNode=r}setup(e){const t=this.getViewZNode(e);return ga(this.nearNode,this.farNode,t)}}const by=xi(yy);class xy extends my{static get type(){return"FogExp2Node"}constructor(e,t){super(e),this.isFogExp2Node=!0,this.densityNode=t}setup(e){const t=this.getViewZNode(e),r=this.densityNode;return r.mul(r,t,t).negate().exp().oneMinus()}}const Ty=xi(xy);let _y=null,vy=null;class Ny extends Ms{static get type(){return"RangeNode"}constructor(e=Ci(),t=Ci()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(fs(this.minNode.value)),r=e.getTypeLength(fs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(fs(i)),u=e.getTypeLength(fs(n));_y=_y||new s,vy=vy||new s,_y.setScalar(0),vy.setScalar(0),1===o?_y.setScalar(i):i.isColor?_y.set(i.r,i.g,i.b):_y.set(i.x,i.y,i.z||0,i.w||0),1===u?vy.setScalar(n):n.isColor?vy.set(n.r,n.g,n.b):vy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;efi(new Ay(e,t)),Cy=Ry("numWorkgroups","uvec3"),Ey=Ry("workgroupId","uvec3"),wy=Ry("localId","uvec3"),My=Ry("subgroupSize","uint");const By=xi(class extends Ms{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Uy extends Bs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class Fy extends Ms{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.scope=e}label(e){return this.name=e,this}getHash(){return this.uuid}setScope(e){return this.scope=e,this}getInputType(){return`${this.scope}Array`}element(e){return fi(new Uy(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Py extends Fs{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Py.ATOMIC_LOAD="atomicLoad",Py.ATOMIC_STORE="atomicStore",Py.ATOMIC_ADD="atomicAdd",Py.ATOMIC_SUB="atomicSub",Py.ATOMIC_MAX="atomicMax",Py.ATOMIC_MIN="atomicMin",Py.ATOMIC_AND="atomicAnd",Py.ATOMIC_OR="atomicOr",Py.ATOMIC_XOR="atomicXor";const Iy=xi(Py),Ly=(e,t,r,s)=>{const i=Iy(e,t,r,s);return i.append(),i};let Dy;function Vy(e){Dy=Dy||new WeakMap;let t=Dy.get(e);return void 0===t&&Dy.set(e,t={}),t}function Oy(e){const t=Vy(e);return t.shadowMatrix||(t.shadowMatrix=tn("mat4").setGroup(Zi).onRenderUpdate((()=>(e.shadow.updateMatrices(e),e.shadow.matrix))))}function Gy(e){const t=Vy(e);if(void 0===t.projectionUV){const r=Oy(e).mul(Xu);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function ky(e){const t=Vy(e);return t.position||(t.position=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function zy(e){const t=Vy(e);return t.targetPosition||(t.targetPosition=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function $y(e){const t=Vy(e);return t.viewPosition||(t.viewPosition=tn(new r).setGroup(Zi).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Wy=e=>Au.transformDirection(ky(e).sub(zy(e))),Hy=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},jy=new WeakMap;class qy extends Ms{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Ii().toVar("totalDiffuse"),this.totalSpecularNode=Ii().toVar("totalSpecular"),this.outgoingLightNode=Ii().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}getHash(e){if(null===this._lightNodesHash){null===this._lightNodes&&this.setupLightsNode(e);const t=[];for(const e of this._lightNodes)t.push(e.getSelf().getHash());this._lightNodesHash="lights-"+t.join(",")}return this._lightNodesHash}analyze(e){const t=e.getDataFromNode(this);for(const r of t.nodes)r.build(e)}setupLightsNode(e){const t=[],r=this._lightNodes,s=(e=>e.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(fi(e));else{let s=null;if(null!==r&&(s=Hy(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;jy.has(e)?s=jy.get(e):(s=fi(new r(e)),jy.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=Ii(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}const Ky=new WeakMap,Xy=Ii().toVar("shadowWorldPosition"),Yy=_i((([e,t,r])=>{let s=Xu.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Qy=e=>{let t=Ky.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Rl("near","float",t).setGroup(Zi),s=Rl("far","float",t).setGroup(Zi),i=Uu(e);return Yy(i,r,s)})(e):null;t=new Yc,t.colorNode=Oi(0,0,0,1),t.depthNode=r,t.isShadowNodeMaterial=!0,t.blending=D,t.name="ShadowMaterial",Ky.set(e,t)}return t},Zy=_i((({depthTexture:e,shadowCoord:t})=>xu(e,t.xy).compare(t.z))),Jy=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Rl("radius","float",r).setGroup(Zi),o=Bi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return On(s(t.xy.add(Bi(a,u)),t.z),s(t.xy.add(Bi(0,u)),t.z),s(t.xy.add(Bi(l,u)),t.z),s(t.xy.add(Bi(c,h)),t.z),s(t.xy.add(Bi(0,h)),t.z),s(t.xy.add(Bi(p,h)),t.z),s(t.xy.add(Bi(a,0)),t.z),s(t.xy.add(Bi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Bi(p,0)),t.z),s(t.xy.add(Bi(l,0)),t.z),s(t.xy.add(Bi(c,g)),t.z),s(t.xy.add(Bi(0,g)),t.z),s(t.xy.add(Bi(p,g)),t.z),s(t.xy.add(Bi(a,d)),t.z),s(t.xy.add(Bi(0,d)),t.z),s(t.xy.add(Bi(l,d)),t.z)).mul(1/17)})),eb=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Bi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Co(u.mul(i).add(.5));return u.subAssign(l.mul(n)),On(s(u,t.z),s(u.add(Bi(o,0)),t.z),s(u.add(Bi(0,a)),t.z),s(u.add(n),t.z),da(s(u.add(Bi(o.negate(),0)),t.z),s(u.add(Bi(o.mul(2),0)),t.z),l.x),da(s(u.add(Bi(o.negate(),a)),t.z),s(u.add(Bi(o.mul(2),a)),t.z),l.x),da(s(u.add(Bi(0,a.negate())),t.z),s(u.add(Bi(0,a.mul(2))),t.z),l.y),da(s(u.add(Bi(o,a.negate())),t.z),s(u.add(Bi(o,a.mul(2))),t.z),l.y),da(da(s(u.add(Bi(o.negate(),a.negate())),t.z),s(u.add(Bi(o.mul(2),a.negate())),t.z),l.x),da(s(u.add(Bi(o.negate(),a.mul(2))),t.z),s(u.add(Bi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),tb=_i((({depthTexture:e,shadowCoord:t})=>{const r=Ci(1).toVar(),s=xu(e).uv(t.xy).rg,i=Qo(t.z,s.x);return Si(i.notEqual(Ci(1)),(()=>{const e=t.z.sub(s.x),n=Xo(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=ca(Gn(o,.3).div(.95-.3)),r.assign(ca(Xo(i,o)))})),r})),rb=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.uv(On(_c.xy,Bi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),sb=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.uv(On(_c.xy,Bi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(On(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),ib=[Zy,Jy,eb,tb],nb=new Jm;class ob extends Ms{static get type(){return"ShadowNode"}constructor(e,t=null){super(),this.light=e,this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this.updateBeforeType=vs.RENDER,this._node=null,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(o,Ci(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Rl("bias","float",r).setGroup(Zi);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===v&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=Rl("near","float",r.camera).setGroup(Zi),s=Rl("far","float",r.camera).setGroup(Zi);n=Gc(e.negate(),t,s)}return o=Ii(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return ib[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new B(s.mapSize.width,s.mapSize.height);n.compareFunction=Re;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===Ce){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye});const t=xu(n),r=xu(this.vsmShadowMapVertical.texture),i=Rl("blurSamples","float",s).setGroup(Zi),o=Rl("radius","float",s).setGroup(Zi),a=Rl("mapSize","vec2",s).setGroup(Zi);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Yc);u.fragmentNode=rb({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Yc),u.fragmentNode=sb({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=Rl("intensity","float",s).setGroup(Zi),u=Rl("normalBias","float",s).setGroup(Zi),l=Oy(r).mul(Xy.add(ul.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ce?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=xu(o.texture,d),m=da(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return _i((({material:t})=>{Xy.assign(t.shadowPositionNode||Xu);let r=this._node;return null===r&&(this._node=r=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r}))()}renderShadow(e){const{shadow:t,shadowMap:r}=this,{renderer:s,scene:i}=e;r.setSize(t.mapSize.width,t.mapSize.height),s.render(i,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=n.overrideMaterial;n.overrideMaterial=Qy(r),s.camera.layers.mask=o.layers.mask;const d=i.getRenderTarget(),c=i.getRenderObjectFunction(),h=i.getMRT();i.setMRT(null),i.setRenderObjectFunction(((e,...t)=>{(!0===e.castShadow||e.receiveShadow&&a===Ce)&&i.renderObject(e,...t)})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(c),!0!==r.isPointLight&&a===Ce&&this.vsmPass(i),i.setRenderTarget(d),i.setMRT(h),n.overrideMaterial=l}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),nb.material=this.vsmMaterialVertical,nb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),nb.material=this.vsmMaterialHorizontal,nb.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),this.updateBeforeType=vs.NONE}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const ab=(e,t)=>fi(new ob(e,t));class ub extends cc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||tn(this.color).setGroup(Zi),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=vs.FRAME}getCacheKey(){return ds(super.getCacheKey(),this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return ab(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?fi(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const lb=_i((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),db=new e,cb=_i((([e,t])=>{const r=e.toVar(),s=Po(r),i=zn(1,Xo(s.x,Xo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Bi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Si(s.z.greaterThanEqual(o),(()=>{Si(r.z.greaterThan(0),(()=>{n.x.assign(Gn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=Io(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=Io(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Bi(.125,.25).mul(n).add(Bi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),hb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>xu(e,cb(t,s.y)).compare(r))),pb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Rl("radius","float",i).setGroup(Zi),o=Bi(-1,1).mul(n).mul(s.y);return xu(e,cb(t.add(o.xyy),s.y)).compare(r).add(xu(e,cb(t.add(o.yyy),s.y)).compare(r)).add(xu(e,cb(t.add(o.xyx),s.y)).compare(r)).add(xu(e,cb(t.add(o.yyx),s.y)).compare(r)).add(xu(e,cb(t,s.y)).compare(r)).add(xu(e,cb(t.add(o.xxy),s.y)).compare(r)).add(xu(e,cb(t.add(o.yxy),s.y)).compare(r)).add(xu(e,cb(t.add(o.xxx),s.y)).compare(r)).add(xu(e,cb(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),gb=_i((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.near)),a=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.far)),u=Rl("bias","float",s).setGroup(Zi),l=tn(s.mapSize).setGroup(Zi),d=Ci(1).toVar();return Si(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Bi(1).div(l.mul(Bi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),mb=new s,fb=new t,yb=new t;class bb extends ob{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===we?hb:pb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return gb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();yb.copy(t.mapSize),yb.multiply(o),r.setSize(yb.width,yb.height),fb.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(db),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(Qu),a=o.normalize(),u=o.length(),l=lb({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class Tb extends ub{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>fi(new bb(e,t)))(this.light)}setup(e){super.setup(e),xb({color:this.colorNode,lightViewPosition:$y(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const _b=_i((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),vb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Mi(e).toVar();return Ta(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Nb=_i((([e,t])=>{const r=Mi(t).toVar(),s=Ci(e).toVar();return Ta(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Sb=_i((([e])=>{const t=Ci(e).toVar();return Ei(So(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),Ab=_i((([e,t])=>{const r=Ci(e).toVar();return t.assign(Sb(r)),r.sub(Ci(t))})),Rb=vm([_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ci(s).toVar(),l=Ci(r).toVar(),d=Ci(t).toVar(),c=Ci(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ii(s).toVar(),l=Ii(r).toVar(),d=Ii(t).toVar(),c=Ii(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),Cb=vm([_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ci(a).toVar(),m=Ci(o).toVar(),f=Ci(n).toVar(),y=Ci(i).toVar(),b=Ci(s).toVar(),x=Ci(r).toVar(),T=Ci(t).toVar(),_=Ci(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ii(a).toVar(),m=Ii(o).toVar(),f=Ii(n).toVar(),y=Ii(i).toVar(),b=Ii(s).toVar(),x=Ii(r).toVar(),T=Ii(t).toVar(),_=Ii(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Eb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=wi(e).toVar(),o=wi(n.bitAnd(wi(7))).toVar(),a=Ci(vb(o.lessThan(wi(4)),i,s)).toVar(),u=Ci(kn(2,vb(o.lessThan(wi(4)),s,i))).toVar();return Nb(a,Mi(o.bitAnd(wi(1)))).add(Nb(u,Mi(o.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),wb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=wi(e).toVar(),u=wi(a.bitAnd(wi(15))).toVar(),l=Ci(vb(u.lessThan(wi(8)),o,n)).toVar(),d=Ci(vb(u.lessThan(wi(4)),n,vb(u.equal(wi(12)).or(u.equal(wi(14))),o,i))).toVar();return Nb(l,Mi(u.bitAnd(wi(1)))).add(Nb(d,Mi(u.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Mb=vm([Eb,wb]),Bb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Di(e).toVar();return Ii(Mb(n.x,i,s),Mb(n.y,i,s),Mb(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Ub=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=Di(e).toVar();return Ii(Mb(a.x,o,n,i),Mb(a.y,o,n,i),Mb(a.z,o,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Fb=vm([Bb,Ub]),Pb=_i((([e])=>{const t=Ci(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Ib=_i((([e])=>{const t=Ci(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Lb=vm([Pb,_i((([e])=>{const t=Ii(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Db=vm([Ib,_i((([e])=>{const t=Ii(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Vb=_i((([e,t])=>{const r=Ei(t).toVar(),s=wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Ei(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Ob=_i((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Vb(r,Ei(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Vb(e,Ei(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Vb(t,Ei(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Vb(r,Ei(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Vb(e,Ei(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Vb(t,Ei(4))),t.addAssign(e)})),Gb=_i((([e,t,r])=>{const s=wi(r).toVar(),i=wi(t).toVar(),n=wi(e).toVar();return s.bitXorAssign(i),s.subAssign(Vb(i,Ei(14))),n.bitXorAssign(s),n.subAssign(Vb(s,Ei(11))),i.bitXorAssign(n),i.subAssign(Vb(n,Ei(25))),s.bitXorAssign(i),s.subAssign(Vb(i,Ei(16))),n.bitXorAssign(s),n.subAssign(Vb(s,Ei(4))),i.bitXorAssign(n),i.subAssign(Vb(n,Ei(14))),s.bitXorAssign(i),s.subAssign(Vb(i,Ei(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),kb=_i((([e])=>{const t=wi(e).toVar();return Ci(t).div(Ci(wi(Ei(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),zb=_i((([e])=>{const t=Ci(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),$b=vm([_i((([e])=>{const t=Ei(e).toVar(),r=wi(wi(1)).toVar(),s=wi(wi(Ei(3735928559)).add(r.shiftLeft(wi(2))).add(wi(13))).toVar();return Gb(s.add(wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi(wi(2)).toVar(),n=wi().toVar(),o=wi().toVar(),a=wi().toVar();return n.assign(o.assign(a.assign(wi(Ei(3735928559)).add(i.shiftLeft(wi(2))).add(wi(13))))),n.addAssign(wi(s)),o.addAssign(wi(r)),Gb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi(wi(3)).toVar(),a=wi().toVar(),u=wi().toVar(),l=wi().toVar();return a.assign(u.assign(l.assign(wi(Ei(3735928559)).add(o.shiftLeft(wi(2))).add(wi(13))))),a.addAssign(wi(n)),u.addAssign(wi(i)),l.addAssign(wi(s)),Gb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),_i((([e,t,r,s])=>{const i=Ei(s).toVar(),n=Ei(r).toVar(),o=Ei(t).toVar(),a=Ei(e).toVar(),u=wi(wi(4)).toVar(),l=wi().toVar(),d=wi().toVar(),c=wi().toVar();return l.assign(d.assign(c.assign(wi(Ei(3735928559)).add(u.shiftLeft(wi(2))).add(wi(13))))),l.addAssign(wi(a)),d.addAssign(wi(o)),c.addAssign(wi(n)),Ob(l,d,c),l.addAssign(wi(i)),Gb(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),_i((([e,t,r,s,i])=>{const n=Ei(i).toVar(),o=Ei(s).toVar(),a=Ei(r).toVar(),u=Ei(t).toVar(),l=Ei(e).toVar(),d=wi(wi(5)).toVar(),c=wi().toVar(),h=wi().toVar(),p=wi().toVar();return c.assign(h.assign(p.assign(wi(Ei(3735928559)).add(d.shiftLeft(wi(2))).add(wi(13))))),c.addAssign(wi(l)),h.addAssign(wi(u)),p.addAssign(wi(a)),Ob(c,h,p),c.addAssign(wi(o)),h.addAssign(wi(n)),Gb(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Wb=vm([_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi($b(s,r)).toVar(),n=Di().toVar();return n.x.assign(i.bitAnd(Ei(255))),n.y.assign(i.shiftRight(Ei(8)).bitAnd(Ei(255))),n.z.assign(i.shiftRight(Ei(16)).bitAnd(Ei(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi($b(n,i,s)).toVar(),a=Di().toVar();return a.x.assign(o.bitAnd(Ei(255))),a.y.assign(o.shiftRight(Ei(8)).bitAnd(Ei(255))),a.z.assign(o.shiftRight(Ei(16)).bitAnd(Ei(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Hb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Ab(t.x,r)).toVar(),n=Ci(Ab(t.y,s)).toVar(),o=Ci(zb(i)).toVar(),a=Ci(zb(n)).toVar(),u=Ci(Rb(Mb($b(r,s),i,n),Mb($b(r.add(Ei(1)),s),i.sub(1),n),Mb($b(r,s.add(Ei(1))),i,n.sub(1)),Mb($b(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Lb(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Ab(t.x,r)).toVar(),o=Ci(Ab(t.y,s)).toVar(),a=Ci(Ab(t.z,i)).toVar(),u=Ci(zb(n)).toVar(),l=Ci(zb(o)).toVar(),d=Ci(zb(a)).toVar(),c=Ci(Cb(Mb($b(r,s,i),n,o,a),Mb($b(r.add(Ei(1)),s,i),n.sub(1),o,a),Mb($b(r,s.add(Ei(1)),i),n,o.sub(1),a),Mb($b(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Mb($b(r,s,i.add(Ei(1))),n,o,a.sub(1)),Mb($b(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Mb($b(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Mb($b(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Db(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),jb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Ab(t.x,r)).toVar(),n=Ci(Ab(t.y,s)).toVar(),o=Ci(zb(i)).toVar(),a=Ci(zb(n)).toVar(),u=Ii(Rb(Fb(Wb(r,s),i,n),Fb(Wb(r.add(Ei(1)),s),i.sub(1),n),Fb(Wb(r,s.add(Ei(1))),i,n.sub(1)),Fb(Wb(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Lb(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Ab(t.x,r)).toVar(),o=Ci(Ab(t.y,s)).toVar(),a=Ci(Ab(t.z,i)).toVar(),u=Ci(zb(n)).toVar(),l=Ci(zb(o)).toVar(),d=Ci(zb(a)).toVar(),c=Ii(Cb(Fb(Wb(r,s,i),n,o,a),Fb(Wb(r.add(Ei(1)),s,i),n.sub(1),o,a),Fb(Wb(r,s.add(Ei(1)),i),n,o.sub(1),a),Fb(Wb(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Fb(Wb(r,s,i.add(Ei(1))),n,o,a.sub(1)),Fb(Wb(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Fb(Wb(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Fb(Wb(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Db(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),qb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Sb(t)).toVar();return kb($b(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar();return kb($b(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar();return kb($b(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar(),n=Ei(Sb(t.w)).toVar();return kb($b(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Kb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Sb(t)).toVar();return Ii(kb($b(r,Ei(0))),kb($b(r,Ei(1))),kb($b(r,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar();return Ii(kb($b(r,s,Ei(0))),kb($b(r,s,Ei(1))),kb($b(r,s,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar();return Ii(kb($b(r,s,i,Ei(0))),kb($b(r,s,i,Ei(1))),kb($b(r,s,i,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar(),n=Ei(Sb(t.w)).toVar();return Ii(kb($b(r,s,i,n,Ei(0))),kb($b(r,s,i,n,Ei(1))),kb($b(r,s,i,n,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Xb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ci(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(Hb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Yb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(jb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Qb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar();return Bi(Xb(a,o,n,i),Xb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Zb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(Yb(a,o,n,i)).toVar(),l=Ci(Xb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i)).toVar();return Oi(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Jb=vm([_i((([e,t,r,s,i,n,o])=>{const a=Ei(o).toVar(),u=Ci(n).toVar(),l=Ei(i).toVar(),d=Ei(s).toVar(),c=Ei(r).toVar(),h=Ei(t).toVar(),p=Bi(e).toVar(),g=Ii(Kb(Bi(h.add(d),c.add(l)))).toVar(),m=Bi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Bi(Bi(Ci(h),Ci(c)).add(m)).toVar(),y=Bi(f.sub(p)).toVar();return Si(a.equal(Ei(2)),(()=>Po(y.x).add(Po(y.y)))),Si(a.equal(Ei(3)),(()=>Xo(Po(y.x),Po(y.y)))),ta(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),_i((([e,t,r,s,i,n,o,a,u])=>{const l=Ei(u).toVar(),d=Ci(a).toVar(),c=Ei(o).toVar(),h=Ei(n).toVar(),p=Ei(i).toVar(),g=Ei(s).toVar(),m=Ei(r).toVar(),f=Ei(t).toVar(),y=Ii(e).toVar(),b=Ii(Kb(Ii(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Ii(Ii(Ci(f),Ci(m),Ci(g)).add(b)).toVar(),T=Ii(x.sub(y)).toVar();return Si(l.equal(Ei(2)),(()=>Po(T.x).add(Po(T.y)).add(Po(T.z)))),Si(l.equal(Ei(3)),(()=>Xo(Xo(Po(T.x),Po(T.y)),Po(T.z)))),ta(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ex=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Ab(n.x,o),Ab(n.y,a)).toVar(),l=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(Jb(u,e,t,o,a,i,s)).toVar();l.assign(Ko(l,r))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),tx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Ab(n.x,o),Ab(n.y,a)).toVar(),l=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(Jb(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),rx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Ab(n.x,o),Ab(n.y,a)).toVar(),l=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(Jb(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),sx=vm([ex,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Ab(n.x,o),Ab(n.y,a),Ab(n.z,u)).toVar(),d=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(Jb(l,e,t,r,o,a,u,i,s)).toVar();d.assign(Ko(d,n))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ix=vm([tx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Ab(n.x,o),Ab(n.y,a),Ab(n.z,u)).toVar(),d=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(Jb(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),nx=vm([rx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Ab(n.x,o),Ab(n.y,a),Ab(n.z,u)).toVar(),d=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(Jb(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ox=_i((([e])=>{const t=e.y,r=e.z,s=Ii().toVar();return Si(t.lessThan(1e-4),(()=>{s.assign(Ii(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(So(i)).mul(6).toVar();const n=Ei($o(i)),o=i.sub(Ci(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Si(n.equal(Ei(0)),(()=>{s.assign(Ii(r,l,a))})).ElseIf(n.equal(Ei(1)),(()=>{s.assign(Ii(u,r,a))})).ElseIf(n.equal(Ei(2)),(()=>{s.assign(Ii(a,r,l))})).ElseIf(n.equal(Ei(3)),(()=>{s.assign(Ii(a,u,r))})).ElseIf(n.equal(Ei(4)),(()=>{s.assign(Ii(l,a,r))})).Else((()=>{s.assign(Ii(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),ax=_i((([e])=>{const t=Ii(e).toVar(),r=Ci(t.x).toVar(),s=Ci(t.y).toVar(),i=Ci(t.z).toVar(),n=Ci(Ko(r,Ko(s,i))).toVar(),o=Ci(Xo(r,Xo(s,i))).toVar(),a=Ci(o.sub(n)).toVar(),u=Ci().toVar(),l=Ci().toVar(),d=Ci().toVar();return d.assign(o),Si(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Si(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Si(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(On(2,i.sub(r).div(a)))})).Else((()=>{u.assign(On(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Si(u.lessThan(0),(()=>{u.addAssign(1)}))})),Ii(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),ux=_i((([e])=>{const t=Ii(e).toVar(),r=Vi(qn(t,Ii(.04045))).toVar(),s=Ii(t.div(12.92)).toVar(),i=Ii(sa(Xo(t.add(Ii(.055)),Ii(0)).div(1.055),Ii(2.4))).toVar();return da(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),lx=(e,t)=>{e=Ci(e),t=Ci(t);const r=Bi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ga(e.sub(r),e.add(r),t)},dx=(e,t,r,s)=>da(e,t,r[s].clamp()),cx=(e,t,r,s,i)=>da(e,t,lx(r,s[i])),hx=_i((([e,t,r])=>{const s=Ro(e).toVar("nDir"),i=Gn(Ci(.5).mul(t.sub(r)),Xu).div(s).toVar("rbmax"),n=Gn(Ci(-.5).mul(t.sub(r)),Xu).div(s).toVar("rbmin"),o=Ii().toVar("rbminmax");o.x=s.x.greaterThan(Ci(0)).select(i.x,n.x),o.y=s.y.greaterThan(Ci(0)).select(i.y,n.y),o.z=s.z.greaterThan(Ci(0)).select(i.z,n.z);const a=Ko(Ko(o.x,o.y),o.z).toVar("correction");return Xu.add(s.mul(a)).toVar("boxIntersection").sub(r)})),px=_i((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(kn(r,r).sub(kn(s,s)))),n}));var gx=Object.freeze({__proto__:null,BRDF_GGX:kh,BRDF_Lambert:Rh,BasicShadowFilter:Zy,Break:nc,Continue:()=>au("continue").append(),DFGApprox:zh,D_GGX:Vh,Discard:uu,EPSILON:uo,F_Schlick:Ah,Fn:_i,INFINITY:lo,If:Si,Loop:ic,NodeAccess:Ss,NodeShaderStage:_s,NodeType:Ns,NodeUpdateType:vs,PCFShadowFilter:Jy,PCFSoftShadowFilter:eb,PI:co,PI2:ho,Return:()=>au("return").append(),Schlick_to_F0:Wh,ScriptableNodeResources:hy,ShaderNode:mi,TBNViewMatrix:$l,VSMShadowFilter:tb,V_GGX_SmithCorrelated:Lh,abs:Po,acesFilmicToneMapping:Zf,acos:Uo,add:On,addMethodChaining:$s,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:ry,all:po,alphaT:yn,and:Yn,anisotropy:bn,anisotropyB:Tn,anisotropyT:xn,any:go,append:Ai,arrayBuffer:e=>fi(new Gs(e,"ArrayBuffer")),asin:Bo,assign:In,atan:Fo,atan2:qo,atomicAdd:(e,t,r=null)=>Ly(Py.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Ly(Py.ATOMIC_AND,e,t,r),atomicFunc:Ly,atomicMax:(e,t,r=null)=>Ly(Py.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Ly(Py.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Ly(Py.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Ly(Py.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Ly(Py.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Ly(Py.ATOMIC_XOR,e,t,r),attenuationColor:Un,attenuationDistance:Bn,attribute:hu,attributeArray:(e,t="float")=>{const r=ms(t),s=new uf(e,r);return hf(s,t,e)},backgroundBlurriness:xf,backgroundIntensity:Tf,backgroundRotation:_f,batch:Jd,billboarding:Em,bitAnd:eo,bitNot:to,bitOr:ro,bitXor:so,bitangentGeometry:Dl,bitangentLocal:Vl,bitangentView:Ol,bitangentWorld:Gl,bitcast:Ho,blendBurn:Mf,blendColor:Pf,blendDodge:Bf,blendOverlay:Ff,blendScreen:Uf,blur:zp,bool:Mi,buffer:Tl,bufferAttribute:qa,bumpMap:Zl,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Mf(e)),bvec2:Pi,bvec3:Vi,bvec4:zi,bypass:ru,cache:eu,call:Dn,cameraFar:vu,cameraNear:_u,cameraNormalMatrix:Cu,cameraPosition:Eu,cameraProjectionMatrix:Nu,cameraProjectionMatrixInverse:Su,cameraViewMatrix:Au,cameraWorldMatrix:Ru,cbrt:ua,cdl:Gf,ceil:Ao,checker:_b,cineonToneMapping:Yf,clamp:ca,clearcoat:dn,clearcoatRoughness:cn,code:ny,color:Ri,colorSpaceToWorking:Va,colorToDirection:e=>fi(e).mul(2).sub(1),compute:Za,cond:_a,context:Na,convert:qi,convertColorSpace:(e,t,r)=>fi(new Pa(fi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():rf(e,...t),cos:wo,cross:ra,cubeTexture:bl,dFdx:Oo,dFdy:Go,dashSize:An,defaultBuildStages:Rs,defaultShaderStages:As,defined:pi,degrees:yo,deltaTime:Sm,densityFog:Ty,depth:zc,depthPass:(e,t)=>fi(new jf(jf.DEPTH,e,t)),difference:ea,diffuseColor:on,directPointLight:xb,directionToColor:uh,dispersion:Fn,distance:Jo,div:zn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Bf(e)),dot:ta,drawIndex:qd,dynamicBufferAttribute:Ka,element:ji,emissive:an,equal:Wn,equals:mo,equirectUV:hh,exp:bo,exp2:xo,expression:au,faceDirection:tl,faceForward:ma,float:Ci,floor:So,fog:fy,fract:Co,frameGroup:Qi,frameId:Am,frontFacing:el,fwidth:Wo,gain:(e,t)=>e.lessThan(.5)?fm(e.mul(2),t).div(2):Gn(1,fm(kn(Gn(1,e),2),t).div(2)),gapSize:Rn,getConstNodeType:gi,getCurrentStack:Ni,getDirection:Vp,getDistanceAttenuation:lb,getGeometryRoughness:Ph,getNormalFromDepth:of,getParallaxCorrectNormal:hx,getRoughness:Ih,getScreenPosition:nf,getShIrradianceAt:px,getTextureIndex:hm,getViewPosition:sf,glsl:(e,t)=>ny(e,t,"glsl"),glslFn:(e,t)=>ay(e,t,"glsl"),grayscale:If,greaterThan:qn,greaterThanEqual:Xn,hash:mm,highPrecisionModelNormalViewMatrix:Hu,highPrecisionModelViewMatrix:Wu,hue:Vf,instance:Xd,instanceIndex:$d,instancedArray:(e,t="float")=>{const r=ms(t),s=new af(e,r);return hf(s,t,e)},instancedBufferAttribute:Xa,instancedDynamicBufferAttribute:Ya,instancedMesh:Qd,int:Ei,inverseSqrt:No,invocationLocalIndex:jd,invocationSubgroupIndex:Hd,ior:En,iridescence:gn,iridescenceIOR:mn,iridescenceThickness:fn,ivec2:Ui,ivec3:Li,ivec4:Gi,js:(e,t)=>ny(e,t,"js"),label:Sa,length:Lo,lengthSq:la,lessThan:jn,lessThanEqual:Kn,lightPosition:ky,lightProjectionUV:Gy,lightShadowMatrix:Oy,lightTargetDirection:Wy,lightTargetPosition:zy,lightViewPosition:$y,lightingContext:gc,lights:(e=[])=>fi(new qy).setLights(e),linearDepth:$c,linearToneMapping:Kf,localId:wy,log:To,log2:_o,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(To(r.div(t)));return Ci(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),ic(...e)),luminance:Of,mat2:$i,mat3:Wi,mat4:Hi,matcapUV:lg,materialAOMap:Dd,materialAlphaTest:td,materialAnisotropy:Td,materialAnisotropyVector:Vd,materialAttenuationColor:Ed,materialAttenuationDistance:Cd,materialClearcoat:gd,materialClearcoatNormal:fd,materialClearcoatRoughness:md,materialColor:rd,materialDispersion:Id,materialEmissive:id,materialIOR:Rd,materialIridescence:_d,materialIridescenceIOR:vd,materialIridescenceThickness:Nd,materialLightMap:Ld,materialLineDashOffset:Fd,materialLineDashSize:Md,materialLineGapSize:Bd,materialLineScale:wd,materialLineWidth:Ud,materialMetalness:hd,materialNormal:pd,materialOpacity:nd,materialPointWidth:Pd,materialReference:wl,materialReflectivity:dd,materialRefractionRatio:hl,materialRotation:yd,materialRoughness:cd,materialSheen:bd,materialSheenRoughness:xd,materialShininess:sd,materialSpecular:od,materialSpecularColor:ud,materialSpecularIntensity:ad,materialSpecularStrength:ld,materialThickness:Ad,materialTransmission:Sd,max:Xo,maxMipLevel:yu,metalness:ln,min:Ko,mix:da,mixElement:ya,mod:Yo,modInt:$n,modelDirection:Lu,modelNormalMatrix:ku,modelPosition:Vu,modelScale:Ou,modelViewMatrix:$u,modelViewPosition:Gu,modelViewProjection:Gd,modelWorldMatrix:Du,modelWorldMatrixInverse:zu,morphReference:dc,mrt:gm,mul:kn,mx_aastep:lx,mx_cell_noise_float:(e=pu())=>qb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Ci(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=pu(),t=3,r=2,s=.5,i=1)=>Xb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec2:(e=pu(),t=3,r=2,s=.5,i=1)=>Qb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec3:(e=pu(),t=3,r=2,s=.5,i=1)=>Yb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec4:(e=pu(),t=3,r=2,s=.5,i=1)=>Zb(e,Ei(t),r,s).mul(i),mx_hsvtorgb:ox,mx_noise_float:(e=pu(),t=1,r=0)=>Hb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=pu(),t=1,r=0)=>jb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=pu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Oi(jb(e),Hb(e.add(Bi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=pu())=>dx(e,t,r,"x"),mx_ramptb:(e,t,r=pu())=>dx(e,t,r,"y"),mx_rgbtohsv:ax,mx_safepower:(e,t=1)=>(e=Ci(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=pu())=>cx(e,t,r,s,"x"),mx_splittb:(e,t,r,s=pu())=>cx(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:ux,mx_transform_uv:(e=1,t=0,r=pu())=>r.mul(e).add(t),mx_worley_noise_float:(e=pu(),t=1)=>sx(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec2:(e=pu(),t=1)=>ix(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec3:(e=pu(),t=1)=>nx(e.convert("vec2|vec3"),t,Ei(1)),negate:Do,neutralToneMapping:sy,nodeArray:bi,nodeImmutable:Ti,nodeObject:fi,nodeObjects:yi,nodeProxy:xi,normalFlat:il,normalGeometry:rl,normalLocal:sl,normalMap:Kl,normalView:nl,normalWorld:ol,normalize:Ro,not:Zn,notEqual:Hn,numWorkgroups:Cy,objectDirection:Mu,objectGroup:Ji,objectPosition:Uu,objectScale:Fu,objectViewPosition:Pu,objectWorldMatrix:Bu,oneMinus:Vo,or:Qn,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Nm)=>e.fract(),oscSine:(e=Nm)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Nm)=>e.fract().round(),oscTriangle:(e=Nm)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Sn,outputStruct:cm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Ff(e)),overloadingFn:vm,parabola:fm,parallaxDirection:Wl,parallaxUV:(e,t)=>e.sub(Wl.mul(t)),parameter:(e,t)=>fi(new am(e,t)),pass:(e,t,r)=>fi(new jf(jf.COLOR,e,t,r)),passTexture:(e,t)=>fi(new Wf(e,t)),pcurve:(e,t,r)=>sa(zn(sa(e,t),On(sa(e,t),sa(Gn(1,e),r))),1/t),perspectiveDepthToViewZ:Oc,pmremTexture:qp,pointUV:mf,pointWidth:Cn,positionGeometry:ju,positionLocal:qu,positionPrevious:Ku,positionView:Qu,positionViewDirection:Zu,positionWorld:Xu,positionWorldDirection:Yu,posterize:zf,pow:sa,pow2:ia,pow3:na,pow4:oa,property:sn,radians:fo,rand:fa,range:Sy,rangeFog:by,reciprocal:zo,reference:Rl,referenceBuffer:Cl,reflect:Zo,reflectVector:ml,reflectView:pl,reflector:e=>fi(new Km(e)),refract:pa,refractVector:fl,refractView:gl,reinhardToneMapping:Xf,remainder:oo,remap:iu,remapClamp:nu,renderGroup:Zi,renderOutput:du,rendererReference:za,rotate:mg,rotateUV:Rm,roughness:un,round:ko,rtt:rf,sRGBTransferEOTF:Ma,sRGBTransferOETF:Ba,sampler:e=>(!0===e.isNode?e:xu(e)).convert("sampler"),saturate:ha,saturation:Lf,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Uf(e)),screenCoordinate:_c,screenSize:Tc,screenUV:xc,scriptable:gy,scriptableValue:ly,select:Ta,setCurrentStack:vi,shaderStages:Cs,shadow:ab,sharedUniformGroup:Yi,sheen:hn,sheenRoughness:pn,shiftLeft:io,shiftRight:no,shininess:Nn,sign:Io,sin:Eo,sinc:(e,t)=>Eo(co.mul(t.mul(e).sub(1))).div(co.mul(t.mul(e).sub(1))),skinning:e=>fi(new tc(e)),skinningReference:rc,smoothstep:ga,smoothstepElement:ba,specularColor:_n,specularF90:vn,spherizeUV:Cm,split:(e,t)=>fi(new Ls(fi(e),t)),spritesheetUV:Bm,sqrt:vo,stack:lm,step:Qo,storage:hf,storageBarrier:()=>By("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),hf(e,t,r).setPBO(!0)),storageTexture:Nf,string:(e="")=>fi(new Gs(e,"string")),sub:Gn,subgroupIndex:Wd,subgroupSize:My,tan:Mo,tangentGeometry:Ml,tangentLocal:Bl,tangentView:Ul,tangentWorld:Fl,temp:Ca,texture:xu,texture3D:Ng,textureBarrier:()=>By("texture").append(),textureBicubic:up,textureCubeUV:Op,textureLoad:Tu,textureSize:mu,textureStore:(e,t,r)=>{const s=Nf(e,t,r);return null!==r&&s.append(),s},thickness:Mn,threshold:(e,t)=>da(Ii(0),e,Of(e).sub(t).max(0)),time:Nm,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Sm.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Nm.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Nm.mul(e)),toOutputColorSpace:Ia,toWorkingColorSpace:La,toneMapping:Wa,toneMappingExposure:Ha,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>fi(new qf(t,r,fi(s),fi(i),fi(n))),transformDirection:aa,transformNormal:dl,transformNormalToView:cl,transformedBentNormalView:Hl,transformedBitangentView:kl,transformedBitangentWorld:zl,transformedClearcoatNormalView:ll,transformedNormalView:al,transformedNormalWorld:ul,transformedTangentView:Pl,transformedTangentWorld:Il,transmission:wn,transpose:jo,tri:ym,tri3:bm,triNoise3D:xm,triplanarTexture:(...e)=>Fm(...e),triplanarTextures:Fm,trunc:$o,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),_i(...e)),uint:wi,uniform:tn,uniformArray:Nl,uniformGroup:Xi,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),fi(new vl(e,t))),userData:(e,t,r)=>fi(new Sf(e,t,r)),uv:pu,uvec2:Fi,uvec3:Di,uvec4:ki,varying:wa,varyingProperty:nn,vec2:Bi,vec3:Ii,vec4:Oi,vectorComponents:Es,velocity:wf,vertexColor:(...e)=>fi(new pf(...e)),vertexIndex:zd,vibrance:Df,viewZToLogarithmicDepth:Gc,viewZToOrthographicDepth:Dc,viewZToPerspectiveDepth:Vc,viewport:vc,viewportBottomLeft:Ec,viewportCoordinate:Sc,viewportDepthTexture:Ic,viewportLinearDepth:Wc,viewportMipTexture:Uc,viewportResolution:Rc,viewportSafeUV:wm,viewportSharedTexture:nh,viewportSize:Nc,viewportTexture:Bc,viewportTopLeft:Cc,viewportUV:Ac,wgsl:(e,t)=>ny(e,t,"wgsl"),wgslFn:(e,t)=>ay(e,t,"wgsl"),workgroupArray:(e,t)=>fi(new Fy("Workgroup",e,t)),workgroupBarrier:()=>By("workgroup").append(),workgroupId:Ey,workingToColorSpace:Da,xor:Jn});const mx=new om;class fx extends Bg{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(mx,Ae),mx.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(mx,Ae),mx.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;mx.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Na(Oi(n).mul(Tf),{getUV:()=>_f.mul(ol),getTextureLevel:()=>xf});let t=Gd();t=t.setZ(t.w);const s=new Yc;s.name="Background.material",s.side=x,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new k(new Me(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=Oi(n).mul(Tf),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);if(!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=mx.r,e.g=mx.g,e.b=mx.b,e.a=mx.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let yx=0;class bx{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=yx++}}class xx{constructor(e,t,r,s,i,n,o,a,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=o,this.updateAfterNodes=a,this.monitor=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new bx(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Tx{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class _x{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class vx{constructor(e,t){this.isNodeVar=!0,this.name=e,this.type=t}}class Nx extends vx{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Sx{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let Ax=0;class Rx{constructor(e=null){this.id=Ax++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class Cx extends Ms{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class Ex{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class wx extends Ex{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class Mx extends Ex{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class Bx extends Ex{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class Ux extends Ex{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class Fx extends Ex{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class Px extends Ex{constructor(e,t=new i){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class Ix extends Ex{constructor(e,t=new n){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class Lx extends wx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Dx extends Mx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Vx extends Bx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Ox extends Ux{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Gx extends Fx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class kx extends Px{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class zx extends Ix{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const $x=[.125,.215,.35,.446,.526,.582],Wx=20,Hx=new xe(-1,1,1,-1,0,1),jx=new Ue(90,1),qx=new e;let Kx=null,Xx=0,Yx=0;const Qx=(1+Math.sqrt(5))/2,Zx=1/Qx,Jx=[new r(-Qx,Zx,0),new r(Qx,Zx,0),new r(-Zx,0,Qx),new r(Zx,0,Qx),new r(0,Qx,-Zx),new r(0,Qx,Zx),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],eT=[3,1,5,0,4,2],tT=Vp(pu(),hu("faceIndex")).normalize(),rT=Ii(tT.x,tT.y.negate(),tT.z);class sT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}Kx=this._renderer.getRenderTarget(),Xx=this._renderer.getActiveCubeFace(),Yx=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=aT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=uT(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===T||e.mapping===_?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=$x[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=eT[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new Te;_.setAttribute("position",new ve(b,m)),_.setAttribute("uv",new ve(x,f)),_.setAttribute("faceIndex",new ve(T,y)),t.push(_),i.push(new k(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Nl(new Array(Wx).fill(0)),n=tn(new r(0,1,0)),o=tn(0),a=Ci(Wx),u=tn(0),l=tn(1),d=xu(null),c=tn(0),h=Ci(1/t),p=Ci(1/s),g=Ci(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:rT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=oT("blur");return f.uniforms=m,f.fragmentNode=zp({...m,latitudinal:u.equal(1)}),f}(i,e,t)}return i}async _compileMaterial(e){const t=new k(this._lodPlanes[0],e);await this._renderer.compile(t,Hx)}_sceneToCubeUV(e,t,r,s){const i=jx;i.near=t,i.far=r;const n=[-1,1,-1,-1,-1,-1],o=[1,1,1,-1,-1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(qx),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Q({name:"PMREM.Background",side:x,depthWrite:!1,depthTest:!1});l=new k(new G,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(qx),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;nT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===T||e.mapping===_;s?null===this._cubemapMaterial&&(this._cubemapMaterial=aT(e)):null===this._equirectMaterial&&(this._equirectMaterial=uT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;nT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,Hx)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tWx&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),a.setRenderTarget(t),a.render(l,Hx)}}function iT(e,t,r){const s=new ge(e,t,r);return s.texture.mapping=Be,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function nT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function oT(e){const t=new Yc;return t.depthTest=!1,t.depthWrite=!1,t.blending=D,t.name=`PMREM_${e}`,t}function aT(e){const t=oT("cubemap");return t.fragmentNode=bl(e,rT),t}function uT(e){const t=oT("equirect");return t.fragmentNode=xu(e,hh(rT),0),t}const lT=new WeakMap,dT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),cT=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class hT{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.monitor=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=lm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new Rx,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=lT.get(this.renderer);return void 0===e&&(e=new Rg,lT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ge(e,t,r)}createCubeRenderTarget(e,t){return new ph(e,t)}createPMREMGenerator(){return new sT(this.renderer)}includes(e){return this.nodes.includes(e)}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new bx(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new bx(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Cs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${cT(n.r)}, ${cT(n.g)}, ${cT(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new Tx(e,t);return r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===y)return"int";if(t===f)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;const r=gs(e);return("float"===t?"":t[0])+r}getTypeFromArray(e){return dT.get(e.constructor)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof Le||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=lm(this.stack),this.stacks.push(Ni()||this.stack),vi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,vi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Tx("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new Cx("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const o=this.uniforms.index++;n=new _x(s||"nodeUniform"+o,t,e),this.uniforms[r].push(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage){const i=this.getDataFromNode(e,s);let n=i.variable;if(void 0===n){const e=this.vars[s]||(this.vars[s]=[]);null===t&&(t="nodeVar"+e.length),n=new vx(t,r),e.push(n),i.variable=n}return n}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Nx(t,r),e.push(i),s.varying=i}return i}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new Sx("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}buildFunctionNode(e){const t=new oy,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new am(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new Rx,this.stack=lm();for(const r of Rs)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t){return`${this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Yc),e.build(this)}else this.addFlow("compute",e);for(const e of Rs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Cs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new Lx(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new Dx(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new Vx(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new Ox(e);if("color"===t)return new Gx(e);if("mat3"===t)return new kx(e);if("mat4"===t)return new zx(e);throw new Error(`Uniform "${t}" not declared.`)}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}(${e}[0].xyz, ${e}[1].xyz, ${e}[2].xyz)`:9===s&&4===i?`${this.getType(r)}(${e}[0].xy, ${e}[1].xy)`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${De} - Node System\n`}}class pT{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class gT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}gT.isNodeFunctionInput=!0;class mT extends ub{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=Wy(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const fT=new n,yT=new n;let bT=null;class xT extends ub{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=tn(new r).setGroup(Zi),this.halfWidth=tn(new r).setGroup(Zi),this.updateType=vs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;yT.identity(),fT.copy(t.matrixWorld),fT.premultiply(r),yT.extractRotation(fT),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(yT),this.halfHeight.value.applyMatrix4(yT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=xu(bT.LTC_FLOAT_1),r=xu(bT.LTC_FLOAT_2)):(t=xu(bT.LTC_HALF_1),r=xu(bT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=$y(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){bT=e}}class TT extends ub{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=tn(0).setGroup(Zi),this.penumbraCosNode=tn(0).setGroup(Zi),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return ga(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=$y(n).sub(Qu),a=o.normalize(),u=a.dot(Wy(n)),l=this.getSpotAttenuation(u),d=o.length(),c=lb({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=Gy(n),t=xu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class _T extends TT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=xu(t,Bi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class vT extends ub{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class NT extends ub{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ky(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=tn(new e).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=nl.dot(s).mul(.5).add(.5),n=da(r,t,i);e.context.irradiance.addAssign(n)}}class ST extends ub{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Nl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=px(ol,this.lightProbe);e.context.irradiance.addAssign(t)}}class AT{parseFunction(){console.warn("Abstract function.")}}class RT{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}RT.isNodeFunction=!0;const CT=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ET=/[a-z_0-9]+/gi,wT="#pragma main";class MT extends RT{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(wT),r=-1!==t?e.slice(t+12):e,s=r.match(CT);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=ET.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){let s=null;if(!0===r.isCubeTexture||r.mapping===j||r.mapping===q||r.mapping===Be)if(e.backgroundBlurriness>0||r.mapping===Be)s=qp(r);else{let e;e=!0===r.isCubeTexture?bl(r):xu(r),s=bh(e)}else!0===r.isTexture?s=xu(r,xc.flipY()).setUpdateMatrix(!0):!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r);t.backgroundNode=s,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){let e=null;if(r.isFogExp2){const t=Rl("color","color",r).setGroup(Zi),s=Rl("density","float",r).setGroup(Zi);e=Ty(t,s)}else if(r.isFog){const t=Rl("color","color",r).setGroup(Zi),s=Rl("near","float",r).setGroup(Zi),i=Rl("far","float",r).setGroup(Zi);e=by(t,s,i)}else console.error("WebGPUNodes: Unsupported fog configuration.",r);t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){let e=null;!0===r.isCubeTexture?e=bl(r):!0===r.isTexture?e=xu(r):console.error("Nodes: Unsupported environment configuration.",r),t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return UT.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=xu(e,xc).renderOutput(t.toneMapping,t.currentColorSpace);return UT.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new pT,this.nodeBuilderCache=new Map}}const PT=new me;class IT{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",null===e?(this.intersectionPlanes=[],this.unionPlanes=[],this.viewNormalMatrix=new i,this.clippingGroupContexts=new WeakMap,this.shadowPass=!1):(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix),this.parentVersion=null}projectPlanes(e,t,r){const s=e.length;for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new FT(this,r),this._animation=new Ag(this._nodes,this.info),this._attributes=new Dg(r),this._background=new fx(this,this._nodes),this._geometries=new Gg(this._attributes,this.info),this._textures=new nm(this,r,this.info),this._pipelines=new qg(r,this._nodes),this._bindings=new Kg(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Mg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Jg(this.lighting),this._bundles=new DT,this._renderContexts=new sm,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:kT;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new IT),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._nodes.updateScene(u),this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init();const r=this._renderScene(e,t);await this.backend.resolveTimestampAsync(r,"render")}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=x,p.viewport=!1===p.viewportValue.equals($T),p.scissorValue.copy(f).multiplyScalar(y).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals($T),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new IT),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),HT.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),WT.setFromProjectionMatrix(HT,g);const T=this._renderLists.get(e,t);if(T.begin(),this._projectObject(e,t,0,T,p.clippingContext),T.finish(),!0===this.sortObjects&&T.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=T.occlusionQueryCount,this._nodes.updateScene(u),this._background.update(u,T,p),this.backend.beginRender(p);const{bundles:_,lightsNode:v,transparentDoublePass:N,transparent:S,opaque:A}=T;if(_.length>0&&this._renderBundles(_,u,v),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,v),!0===this.transparent&&S.length>0&&this._renderTransparents(S,N,t,u,v),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}return u.onAfterRender(this,e,t,h),p}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s&&(this._textures.updateRenderTarget(s),i=this._textures.get(s)),this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}clearColorAsync(){return this.clearAsync(!0,!1,!1)}clearDepthAsync(){return this.clearAsync(!1,!0,!1)}clearStencilAsync(){return this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget?d:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget?Ae:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this.isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e),await this.backend.resolveTimestampAsync(e,"compute")}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){if(!1===this._initialized)return console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),!1;this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=jT.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=jT.copy(t).floor()}else t=jT.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||WT.intersectsSprite(e)){!0===this.sortObjects&&jT.setFromMatrixPosition(e.matrixWorld).applyMatrix4(HT);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,jT.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||WT.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),jT.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(HT)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=x;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Ge;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=le}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=u_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==y){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=l_[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}l_[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new i_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new n_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new o_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new ZT(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new t_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let h_=null,p_=null,g_=null;class m_{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null}async init(e){this.renderer=e}begin(){}finish(){}draw(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}createRenderPipeline(){}createComputePipeline(){}destroyPipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}createDefaultTexture(){}createTexture(){}copyTextureToBuffer(){}createAttribute(){}createIndexAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}resolveTimestampAsync(){}hasFeatureAsync(){}hasFeature(){}getInstanceCount(e){const{object:t,geometry:r}=e;return r.isInstancedBufferGeometry?r.instanceCount:t.count>1?t.count:1}getDrawingBufferSize(){return h_=h_||new t,this.renderer.getDrawingBufferSize(h_)}getScissor(){return p_=p_||new s,this.renderer.getScissor(p_)}setScissorTest(){}getClearColor(){const e=this.renderer;return g_=g_||new om,e.getClearColor(g_),g_.getRGB(g_,this.renderer.currentColorSpace),g_}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ze(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${De} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let f_=0;class y_{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class b_{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===y,id:f_++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new y_(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let S_,A_,R_,C_=!1;class E_{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===C_&&(this._init(this.gl),C_=!0)}_init(e){S_={[dr]:e.REPEAT,[cr]:e.CLAMP_TO_EDGE,[hr]:e.MIRRORED_REPEAT},A_={[pr]:e.NEAREST,[gr]:e.NEAREST_MIPMAP_NEAREST,[Ie]:e.NEAREST_MIPMAP_LINEAR,[$]:e.LINEAR,[Pe]:e.LINEAR_MIPMAP_NEAREST,[M]:e.LINEAR_MIPMAP_LINEAR},R_={[mr]:e.NEVER,[fr]:e.ALWAYS,[Re]:e.LESS,[yr]:e.LEQUAL,[br]:e.EQUAL,[xr]:e.GEQUAL,[Tr]:e.GREATER,[_r]:e.NOTEQUAL}}filterFallback(e){const{gl:t}=this;return e===pr||e===gr||e===Ie?t.NEAREST:t.LINEAR}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,S_[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,S_[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,S_[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,A_[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===$&&n?M:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,A_[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,R_[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===pr)return;if(t.minFilter!==Ie&&t.minFilter!==M)return;if(t.type===E&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:o,glType:a}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,o,a,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.gerDrawingBufferSize().y;if(d){const r=0!==o||0!==a;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class w_{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class M_{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const B_={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class U_{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;s0)){const e=t.queryQueue.shift();this.initTimestampQuery(e)}}async resolveTimestampAsync(e,t="render"){if(!this.disjoint||!this.trackTimestamp)return;const r=this.get(e);r.gpuQueries||(r.gpuQueries=[]);for(let e=0;e0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t0&&e.add(s[t]),r[t]=null,i.deleteQuery(n),o++))}o1?f.renderInstances(x,y,b):f.render(x,y),a.bindVertexArray(null)}needsRenderUpdate(){return!1}getRenderCacheKey(){return""}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}createSampler(){}destroySampler(){}createNodeBuilder(e,t){return new c_(e,t)}createProgram(e){const t=this.gl,{stage:r,code:s}=e,i="fragment"===r?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);t.shaderSource(i,s),t.compileShader(i),this.set(e,{shaderGPU:i})}destroyProgram(){console.warn("Abstract class.")}createRenderPipeline(e,t){const r=this.gl,s=e.pipeline,{fragmentProgram:i,vertexProgram:n}=s,o=r.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU;if(r.attachShader(o,a),r.attachShader(o,u),r.linkProgram(o),this.set(s,{programGPU:o,fragmentShader:a,vertexShader:u}),null!==t&&this.parallel){const i=new Promise((t=>{const i=this.parallel,n=()=>{r.getProgramParameter(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eB_[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===d){const s=[];d=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,d);const i=[],l=e.textures;for(let r=0;r,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:V_,stripIndexFormat:tv},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:V_,stripIndexFormat:tv},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Kv,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Kv,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:X_,storeOp:q_,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Kv,baseArrayLayer:r});const o=[];for(let a=1;a1&&!e.isMultisampleRenderTargetTexture){const e=Object.assign({},p);e.label=e.label+"-msaa",e.sampleCount=d,s.msaaTexture=r.device.createTexture(e)}s.initialized=!0,s.textureDescriptorGPU=p}destroyTexture(e){const t=this.backend,r=t.get(e);void 0!==r.texture&&r.texture.destroy(),void 0!==r.msaaTexture&&r.msaaTexture.destroy(),t.delete(e)}destroySampler(e){delete this.backend.get(e).sampler}generateMipmaps(e){const t=this.backend.get(e);if(e.isCubeTexture)for(let e=0;e<6;e++)this._generateMipmaps(t.texture,t.textureDescriptorGPU,e);else{const r=e.image.depth||1;for(let e=0;e1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,pN=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,gN={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class mN extends RT{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(hN);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=pN.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class fN extends AT{parseFunction(e){return new mN(e)}}const yN="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},bN={[Ss.READ_ONLY]:"read",[Ss.WRITE_ONLY]:"write",[Ss.READ_WRITE]:"read_write"},xN={[dr]:"repeat",[cr]:"clamp",[hr]:"mirror"},TN={vertex:yN?yN.VERTEX:1,fragment:yN?yN.FRAGMENT:2,compute:yN?yN.COMPUTE:4},_N={instance:!0,swizzleAssign:!1,storageBuffer:!0},vN={"^^":"tsl_xor"},NN={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},SN={},AN={tsl_xor:new iy("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new iy("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new iy("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new iy("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new iy("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new iy("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new iy("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new iy("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new iy("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new iy("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new iy("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new iy("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new iy("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},RN={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(AN.pow_float=new iy("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),AN.pow_vec2=new iy("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[AN.pow_float]),AN.pow_vec3=new iy("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[AN.pow_float]),AN.pow_vec4=new iy("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[AN.pow_float]),RN.pow_float="tsl_pow_float",RN.pow_vec2="tsl_pow_vec2",RN.pow_vec3="tsl_pow_vec3",RN.pow_vec4="tsl_pow_vec4");let CN="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(CN+="diagnostic( off, derivative_uniformity );\n");class EN extends hT{constructor(e,t){super(e,t,new fN),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==m}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"===n&&!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateWrapFunction(e){const t=`tsl_coord_${xN[e.wrapS]}S_${xN[e.wrapT]}T`;let r=SN[t];if(void 0===r){const s=[];let i=`fn ${t}( coord : vec2f ) -> vec2f {\n\n\treturn vec2f(\n`;const n=(e,t)=>{e===dr?(s.push(AN.repeatWrapping_float),i+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===cr?(s.push(AN.clampWrapping_float),i+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===hr?(s.push(AN.mirrorWrapping_float),i+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(i+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};n(e.wrapS,"x"),i+=",\n",n(e.wrapT,"y"),i+="\n\t);\n\n}\n",SN[t]=r=new iy(i,s)}return r.build(this),t}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n;n=!0===e.isMultisampleRenderTargetTexture?t:`${t}, u32( ${r} )`,i=new Aa(new ou(`textureDimensions( ${n} )`,"uvec2")),s.dimensionsSnippet[r]=i}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=`vec2u( ${this.generateWrapFunction(e)}( ${r} ) * vec2f( ${this.generateTextureDimension(e,t,i)} ) )`;return this.generateTextureLoad(e,t,n,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===E||!1===this.isSampleCompare(e)&&e.minFilter===pr&&e.magFilter===pr||!0===e.isMultisampleRenderTargetTexture}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=vN[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Ss.READ_ONLY:e.access}getStorageAccess(e,t){return bN[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new i_(i.name,i.node,o,a):"cubeTexture"===t?n=new n_(i.name,i.node,o,a):"texture3D"===t&&(n=new o_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(TN[r]),"fragment"===r&&!1===this.isUnfilterable(e.value)&&!1===n.store){const e=new sN(`${i.name}_sampler`,i.node,o);e.setVisibility(TN[r]),u.push(e,n),s=[e,n]}else u.push(n),s=[n]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?ZT:oN)(e,o);i.setVisibility(TN[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new t_(a,o),n.setVisibility(TN[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","id","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}getVar(e,t){return`var ${t} : ${this.getType(e)}`}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${cN(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],o=n.outputNode,a=void 0!==o&&!0===o.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n\t`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return NN[e]||e}isAvailable(e){let t=_N[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),_N[e]=t),t}_getWGSLMethod(e){return void 0!==AN[e]&&this._include(e),RN[e]}_include(e){const t=AN[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${CN}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = id.x + id.y * numWorkgroups.x * u32(${t}) + id.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class wN{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=rv.Depth24PlusStencil8:e.depth&&(t=rv.Depth24Plus),t}getTextureFormatGPU(e){return this.backend.get(e).format}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?P_:e.isLineSegments||e.isMesh&&!0===t.wireframe?I_:e.isLine?L_:e.isMesh?D_:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){return navigator.userAgent.includes("Quest")?rv.BGRA8Unorm:navigator.gpu.getPreferredCanvasFormat()}}const MN=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),BN=new Map([[Le,["float16"]]]),UN=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class FN{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const o=s.device;let a=r.array;if(!1===e.normalized&&(a.constructor===Int16Array||a.constructor===Uint16Array)){const e=new Uint32Array(a.length);for(let t=0;t0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=Zv;let n;n=t.isSampledCubeTexture?Yv:t.isSampledTexture3D?Qv:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Xv:Kv,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class IN{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==D&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===ft){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:_v},r={srcFactor:i,dstFactor:n,operation:_v}};if(e.premultipliedAlpha)switch(s){case F:i(lv,pv,lv,pv);break;case xt:i(lv,lv,lv,lv);break;case bt:i(uv,cv,uv,lv);break;case yt:i(uv,dv,uv,hv)}else switch(s){case F:i(hv,pv,lv,pv);break;case xt:i(hv,lv,hv,lv);break;case bt:i(uv,cv,uv,lv);break;case yt:i(uv,dv,uv,dv)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case rt:t=uv;break;case st:t=lv;break;case it:t=dv;break;case lt:t=cv;break;case nt:t=hv;break;case dt:t=pv;break;case at:t=gv;break;case ct:t=mv;break;case ut:t=fv;break;case ht:t=yv;break;case ot:t=bv;break;case 211:t=xv;break;case 212:t=Tv;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Mr:t=O_;break;case wr:t=j_;break;case Er:t=G_;break;case Cr:t=z_;break;case Rr:t=k_;break;case Ar:t=H_;break;case Sr:t=$_;break;case Nr:t=W_;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Vr:t=Ev;break;case Dr:t=wv;break;case Lr:t=Mv;break;case Ir:t=Bv;break;case Pr:t=Uv;break;case Fr:t=Fv;break;case Ur:t=Pv;break;case Br:t=Iv;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Je:t=_v;break;case et:t=vv;break;case tt:t=Nv;break;case Gr:t=Sv;break;case Or:t=Av;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?ev:tv),r.side){case Ge:s.frontFace=Y_,s.cullMode=J_;break;case x:s.frontFace=Y_,s.cullMode=Z_;break;case le:s.frontFace=Y_,s.cullMode=Q_;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?Cv:Rv}_getDepthCompare(e){let t;if(!1===e.depthTest)t=j_;else{const r=e.depthFunc;switch(r){case Ct:t=O_;break;case Rt:t=j_;break;case At:t=G_;break;case St:t=z_;break;case Nt:t=k_;break;case vt:t=H_;break;case _t:t=$_;break;case Tt:t=W_;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class LN extends m_{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new wN(this),this.attributeUtils=new FN(this),this.bindingUtils=new PN(this),this.pipelineUtils=new IN(this),this.textureUtils=new dN(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(tN),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(tN.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return v}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e){const t=e.renderTarget,r=this.get(t);let s=r.descriptors;if(void 0===s||r.width!==t.width||r.height!==t.height||r.activeMipmapLevel!==t.activeMipmapLevel||r.samples!==t.samples){s={},r.descriptors=s;const e=()=>{t.removeEventListener("dispose",e),this.delete(t)};t.addEventListener("dispose",e)}const i=e.getCacheKey();let n=s[i];if(void 0===n){const o=e.textures,a=[];for(let t=0;t0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.prepareTimestampBuffer(e,t.encoder),this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.prepareTimestampBuffer(e,t.cmdEncoderGPU),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e1?0:r;l.drawIndexed(t[r],s,e[r]/n,0,o)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}}needsRenderUpdate(e){const t=this.get(e),{object:r,material:s}=e,i=this.utils,n=i.getSampleCountRenderContext(e.context),o=i.getCurrentColorSpace(e.context),a=i.getCurrentColorFormat(e.context),u=i.getCurrentDepthStencilFormat(e.context),l=i.getPrimitiveTopology(r,s);let d=!1;return t.material===s&&t.materialVersion===s.version&&t.transparent===s.transparent&&t.blending===s.blending&&t.premultipliedAlpha===s.premultipliedAlpha&&t.blendSrc===s.blendSrc&&t.blendDst===s.blendDst&&t.blendEquation===s.blendEquation&&t.blendSrcAlpha===s.blendSrcAlpha&&t.blendDstAlpha===s.blendDstAlpha&&t.blendEquationAlpha===s.blendEquationAlpha&&t.colorWrite===s.colorWrite&&t.depthWrite===s.depthWrite&&t.depthTest===s.depthTest&&t.depthFunc===s.depthFunc&&t.stencilWrite===s.stencilWrite&&t.stencilFunc===s.stencilFunc&&t.stencilFail===s.stencilFail&&t.stencilZFail===s.stencilZFail&&t.stencilZPass===s.stencilZPass&&t.stencilFuncMask===s.stencilFuncMask&&t.stencilWriteMask===s.stencilWriteMask&&t.side===s.side&&t.alphaToCoverage===s.alphaToCoverage&&t.sampleCount===n&&t.colorSpace===o&&t.colorFormat===a&&t.depthStencilFormat===u&&t.primitiveTopology===l&&t.clippingContextCacheKey===e.clippingContextCacheKey||(t.material=s,t.materialVersion=s.version,t.transparent=s.transparent,t.blending=s.blending,t.premultipliedAlpha=s.premultipliedAlpha,t.blendSrc=s.blendSrc,t.blendDst=s.blendDst,t.blendEquation=s.blendEquation,t.blendSrcAlpha=s.blendSrcAlpha,t.blendDstAlpha=s.blendDstAlpha,t.blendEquationAlpha=s.blendEquationAlpha,t.colorWrite=s.colorWrite,t.depthWrite=s.depthWrite,t.depthTest=s.depthTest,t.depthFunc=s.depthFunc,t.stencilWrite=s.stencilWrite,t.stencilFunc=s.stencilFunc,t.stencilFail=s.stencilFail,t.stencilZFail=s.stencilZFail,t.stencilZPass=s.stencilZPass,t.stencilFuncMask=s.stencilFuncMask,t.stencilWriteMask=s.stencilWriteMask,t.side=s.side,t.alphaToCoverage=s.alphaToCoverage,t.sampleCount=n,t.colorSpace=o,t.colorFormat=a,t.depthStencilFormat=u,t.primitiveTopology=l,t.clippingContextCacheKey=e.clippingContextCacheKey,d=!0),d}getRenderCacheKey(e){const{object:t,material:r}=e,s=this.utils,i=e.context;return[r.transparent,r.blending,r.premultipliedAlpha,r.blendSrc,r.blendDst,r.blendEquation,r.blendSrcAlpha,r.blendDstAlpha,r.blendEquationAlpha,r.colorWrite,r.depthWrite,r.depthTest,r.depthFunc,r.stencilWrite,r.stencilFunc,r.stencilFail,r.stencilZFail,r.stencilZPass,r.stencilFuncMask,r.stencilWriteMask,r.side,s.getSampleCountRenderContext(i),s.getCurrentColorSpace(i),s.getCurrentColorFormat(i),s.getCurrentDepthStencilFormat(i),s.getPrimitiveTopology(t,r),e.getGeometryCacheKey(),e.clippingContextCacheKey].join()}createSampler(e){this.textureUtils.createSampler(e)}destroySampler(e){this.textureUtils.destroySampler(e)}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}initTimestampQuery(e,t){if(!this.trackTimestamp)return;const r=this.get(e);if(!r.timeStampQuerySet){const s=e.isComputeNode?"compute":"render",i=this.device.createQuerySet({type:"timestamp",count:2,label:`timestamp_${s}_${e.id}`}),n={querySet:i,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};Object.assign(t,{timestampWrites:n}),r.timeStampQuerySet=i}}prepareTimestampBuffer(e,t){if(!this.trackTimestamp)return;const r=this.get(e),s=2*BigInt64Array.BYTES_PER_ELEMENT;void 0===r.currentTimestampQueryBuffers&&(r.currentTimestampQueryBuffers={resolveBuffer:this.device.createBuffer({label:"timestamp resolve buffer",size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),resultBuffer:this.device.createBuffer({label:"timestamp result buffer",size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});const{resolveBuffer:i,resultBuffer:n}=r.currentTimestampQueryBuffers;t.resolveQuerySet(r.timeStampQuerySet,0,2,i,0),"unmapped"===n.mapState&&t.copyBufferToBuffer(i,0,n,0,s)}async resolveTimestampAsync(e,t="render"){if(!this.trackTimestamp)return;const r=this.get(e);if(void 0===r.currentTimestampQueryBuffers)return;const{resultBuffer:s}=r.currentTimestampQueryBuffers;await this.device.queue.onSubmittedWorkDone(),"unmapped"===s.mapState&&s.mapAsync(GPUMapMode.READ).then((()=>{const e=new BigUint64Array(s.getMappedRange()),r=Number(e[1]-e[0])/1e6;this.renderer.info.updateTimestamp(t,r),s.unmap()}))}createNodeBuilder(e,t){return new EN(e,t)}createProgram(e){this.get(e).module={module:this.device.createShaderModule({code:e.code,label:e.stage}),entryPoint:"main"}}destroyProgram(e){this.delete(e)}createRenderPipeline(e,t){this.pipelineUtils.createRenderPipeline(e,t)}createComputePipeline(e,t){this.pipelineUtils.createComputePipeline(e,t)}beginBundle(e){const t=this.get(e);t._currentPass=t.currentPass,t._currentSets=t.currentSets,t.currentSets={attributes:{},bindingGroups:[],pipeline:null,index:null},t.currentPass=this.pipelineUtils.createBundleEncoder(e)}finishBundle(e,t){const r=this.get(e),s=r.currentPass.finish();this.get(t).bundleGPU=s,r.currentSets=r._currentSets,r.currentPass=r._currentPass}addBundle(e,t){this.get(e).renderBundles.push(this.get(t).bundleGPU)}createBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBinding(e){this.bindingUtils.updateBinding(e)}createIndexAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.INDEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createIndirectStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.INDIRECT|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}updateAttribute(e){this.attributeUtils.updateAttribute(e)}destroyAttribute(e){this.attributeUtils.destroyAttribute(e)}updateSize(){this.colorBuffer=this.textureUtils.getColorBuffer(),this.defaultRenderPassdescriptor=null}getMaxAnisotropy(){return 16}hasFeature(e){return this.device.features.has(e)}copyTextureToTexture(e,t,r=null,s=null,i=0){let n=0,o=0,a=0,u=0,l=0,d=0,c=e.image.width,h=e.image.height;null!==r&&(u=r.x,l=r.y,d=r.z||0,c=r.width,h=r.height),null!==s&&(n=s.x,o=s.y,a=s.z||0);const p=this.device.createCommandEncoder({label:"copyTextureToTexture_"+e.id+"_"+t.id}),g=this.get(e).texture,m=this.get(t).texture;p.copyTextureToTexture({texture:g,mipLevel:i,origin:{x:u,y:l,z:d}},{texture:m,mipLevel:i,origin:{x:n,y:o,z:a}},[c,h,1]),this.device.queue.submit([p.finish()])}copyFramebufferToTexture(e,t,r){const s=this.get(t);let i=null;i=t.renderTarget?e.isDepthTexture?this.get(t.depthTexture).texture:this.get(t.textures[0]).texture:e.isDepthTexture?this.textureUtils.getDepthBuffer(t.depth,t.stencil):this.context.getCurrentTexture();const n=this.get(e).texture;if(i.format!==n.format)return void console.error("WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.",i.format,n.format);let o;if(s.currentPass?(s.currentPass.end(),o=s.encoder):o=this.device.createCommandEncoder({label:"copyFramebufferToTexture_"+e.id}),o.copyTextureToTexture({texture:i,origin:[r.x,r.y,0]},{texture:n},[r.z,r.w]),e.generateMipmaps&&this.textureUtils.generateMipmaps(e),s.currentPass){const{descriptor:e}=s;for(let t=0;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new F_(e)));super(new t(e),e),this.library=new VN,this.isWebGPURenderer=!0}}class GN extends es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}const kN=new Yc,zN=new Jm(kN);class $N{constructor(e,t=Oi(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0,kN.name="PostProcessing"}render(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,zN.render(e),e.toneMapping=t,e.outputColorSpace=r}update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;zN.material.fragmentNode=!0===this.outputColorTransform?du(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),zN.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,await zN.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}function WN(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function HN(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function jN(e,t,r={}){return(r=WN(e,r)).background=t.background,r.backgroundNode=t.backgroundNode,r.overrideMaterial=t.overrideMaterial,r}var qN=Object.freeze({__proto__:null,resetRendererAndSceneState:function(e,t,r){return r=jN(e,t,r),t.background=null,t.backgroundNode=null,t.overrideMaterial=null,r},resetRendererState:function(e,t){return t=WN(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t},restoreRendererAndSceneState:function(e,t,r){HN(e,r),t.background=r.background,t.backgroundNode=r.backgroundNode,t.overrideMaterial=r.overrideMaterial},restoreRendererState:HN,saveRendererAndSceneState:jN,saveRendererState:WN});class KN extends ee{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=$,this.minFilter=$,this.isStorageTexture=!0}}class XN extends uf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class YN extends ts{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new rs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Ci()):fi(new this.nodes[e])}}class QN extends ss{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class ZN extends is{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new YN;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new QN;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const us=e=>as(e),ls=e=>as(e),ds=(...e)=>as(e);function cs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of hs(e))r.push(r,as(s.slice(0,-4)),i.getCacheKey(t));return as(r)}function*hs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Ts=Object.freeze({__proto__:null,arrayBufferToBase64:bs,base64ToArrayBuffer:xs,getCacheKey:cs,getLengthFromType:ms,getNodeChildren:hs,getTypeFromLength:gs,getValueFromType:ys,getValueType:fs,hash:ds,hashArray:ls,hashString:us});const _s={VERTEX:"vertex",FRAGMENT:"fragment"},vs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ns={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Ss={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},As=["fragment","vertex"],Rs=["setup","analyze","generate"],Cs=[...As,"compute"],Es=["x","y","z","w"];let ws=0;class Ms extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=vs.NONE,this.updateBeforeType=vs.NONE,this.updateAfterType=vs.NONE,this.uuid=a.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ws++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,vs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,vs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,vs.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of hs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=ds(cs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){e.stack.nodes.length;t.initialized=!0,t.outputNode=this.setup(e),null!==t.outputNode&&e.stack.nodes.length;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return hs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Bs extends Ms{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Us extends Ms{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Fs extends Ms{static get type(){return"TempNode"}constructor(e){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Ps extends Fs{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const Is=Es.join("");class Ls extends Ms{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(Es.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const o=r.build(e,n);i=this.components.length===s&&this.components===Is.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ds extends Fs{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),o=e.getTypeFromLength(r.length,n),a=s.build(e,o),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Ws=e=>Hs(e).split("").sort().join(""),js={setup(e,t){const r=t.shift();return e(yi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ks.assign(r,...e),r);if(zs.has(t)){const s=zs.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&zs.has(t.slice(0,t.length-6))){const s=zs.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Hs(t),fi(new Ls(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Ws(t.slice(3).toLowerCase()),r=>fi(new Ds(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Ws(t.slice(4).toLowerCase()),()=>fi(new Vs(fi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),fi(new Ls(e,t));if(!0===/^\d+$/.test(t))return fi(new Bs(r,new Gs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},qs=new WeakMap,Ks=new WeakMap,Xs=function(e,t=null){for(const r in e)e[r]=fi(e[r],t);return e},Ys=function(e,t=null){const r=e.length;for(let s=0;sfi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...bi(t))):null!==r?(r=fi(r),(...s)=>i(new e(t,...bi(s),r))):(...r)=>i(new e(t,...bi(r)))},Zs=function(e,...t){return fi(new e(...bi(t)))};class Js extends Ms{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=Ks.get(e.constructor);void 0===s&&(s=new WeakMap,Ks.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=fi(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=fi(n.call(r))}else{const s=t.jsFunc,n=null!==r?s(r,e):s(e);i=fi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ei extends Ms{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return yi(e),fi(new Js(this,e))}setup(){return this.call()}}const ti=[!1,!0],ri=[0,1,2,3],si=[-1,-2],ii=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],ni=new Map;for(const e of ti)ni.set(e,new Gs(e));const oi=new Map;for(const e of ri)oi.set(e,new Gs(e,"uint"));const ai=new Map([...oi].map((e=>new Gs(e.value,"int"))));for(const e of si)ai.set(e,new Gs(e,"int"));const ui=new Map([...ai].map((e=>new Gs(e.value))));for(const e of ii)ui.set(e,new Gs(e));for(const e of ii)ui.set(-e,new Gs(-e));const li={bool:ni,uint:oi,ints:ai,float:ui},di=new Map([...ni,...ui]),ci=(e,t)=>di.has(e)?di.get(e):!0===e.isNode?e:new Gs(e,t),hi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[ys(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return fi(t.get(r[0]));if(1===r.length){const t=ci(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?fi(t):fi(new Us(t,e))}const s=r.map((e=>ci(e)));return fi(new Ps(s,e))}},pi=e=>"object"==typeof e&&null!==e?e.value:e,gi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function mi(e,t){return new Proxy(new ei(e,t),js)}const fi=(e,t=null)=>function(e,t=null){const r=fs(e);if("node"===r){let t=qs.get(e);return void 0===t&&(t=new Proxy(e,js),qs.set(e,t),qs.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?fi(ci(e,t)):"shader"===r?_i(e):e}(e,t),yi=(e,t=null)=>new Xs(e,t),bi=(e,t=null)=>new Ys(e,t),xi=(...e)=>new Qs(...e),Ti=(...e)=>new Zs(...e),_i=(e,t)=>{const r=new mi(e,t),s=(...e)=>{let t;return yi(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};$s("toGlobal",(e=>(e.global=!0,e)));const vi=e=>{ks=e},Ni=()=>ks,Si=(...e)=>ks.If(...e);function Ai(e){return ks&&ks.add(e),e}$s("append",Ai);const Ri=new hi("color"),Ci=new hi("float",li.float),Ei=new hi("int",li.ints),wi=new hi("uint",li.uint),Mi=new hi("bool",li.bool),Bi=new hi("vec2"),Ui=new hi("ivec2"),Fi=new hi("uvec2"),Pi=new hi("bvec2"),Ii=new hi("vec3"),Li=new hi("ivec3"),Di=new hi("uvec3"),Vi=new hi("bvec3"),Oi=new hi("vec4"),Gi=new hi("ivec4"),ki=new hi("uvec4"),zi=new hi("bvec4"),$i=new hi("mat2"),Hi=new hi("mat3"),Wi=new hi("mat4");$s("toColor",Ri),$s("toFloat",Ci),$s("toInt",Ei),$s("toUint",wi),$s("toBool",Mi),$s("toVec2",Bi),$s("toIVec2",Ui),$s("toUVec2",Fi),$s("toBVec2",Pi),$s("toVec3",Ii),$s("toIVec3",Li),$s("toUVec3",Di),$s("toBVec3",Vi),$s("toVec4",Oi),$s("toIVec4",Gi),$s("toUVec4",ki),$s("toBVec4",zi),$s("toMat2",$i),$s("toMat3",Hi),$s("toMat4",Wi);const ji=xi(Bs),qi=(e,t)=>fi(new Us(fi(e),t));$s("element",ji),$s("convert",qi);class Ki extends Ms{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Xi=e=>new Ki(e),Yi=(e,t=0)=>new Ki(e,!0,t),Qi=Yi("frame"),Zi=Yi("render"),Ji=Xi("object");class en extends Os{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Ji}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const tn=(e,t)=>{const r=gi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return fi(new en(s,r))};class rn extends Ms{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const sn=(e,t)=>fi(new rn(e,t)),nn=(e,t)=>fi(new rn(e,t,!0)),on=Ti(rn,"vec4","DiffuseColor"),an=Ti(rn,"vec3","EmissiveColor"),un=Ti(rn,"float","Roughness"),ln=Ti(rn,"float","Metalness"),dn=Ti(rn,"float","Clearcoat"),cn=Ti(rn,"float","ClearcoatRoughness"),hn=Ti(rn,"vec3","Sheen"),pn=Ti(rn,"float","SheenRoughness"),gn=Ti(rn,"float","Iridescence"),mn=Ti(rn,"float","IridescenceIOR"),fn=Ti(rn,"float","IridescenceThickness"),yn=Ti(rn,"float","AlphaT"),bn=Ti(rn,"float","Anisotropy"),xn=Ti(rn,"vec3","AnisotropyT"),Tn=Ti(rn,"vec3","AnisotropyB"),_n=Ti(rn,"color","SpecularColor"),vn=Ti(rn,"float","SpecularF90"),Nn=Ti(rn,"float","Shininess"),Sn=Ti(rn,"vec4","Output"),An=Ti(rn,"float","dashSize"),Rn=Ti(rn,"float","gapSize"),Cn=Ti(rn,"float","pointWidth"),En=Ti(rn,"float","IOR"),wn=Ti(rn,"float","Transmission"),Mn=Ti(rn,"float","Thickness"),Bn=Ti(rn,"float","AttenuationDistance"),Un=Ti(rn,"color","AttenuationColor"),Fn=Ti(rn,"float","Dispersion");class Pn extends Fs{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return Es.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?bi(t):yi(t[0]),fi(new Ln(fi(e),t)));$s("call",Dn);class Vn extends Fs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Vn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}return"float"===n&&e.isMatrix(o)?o:e.isMatrix(n)&&e.isVector(o)?e.getVectorFromMatrix(n):e.isVector(n)&&e.isMatrix(o)?e.getVectorFromMatrix(o):e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)&&e.isVector(a)?a=e.getVectorFromMatrix(o):o=e.isVector(o)&&e.isMatrix(a)?e.getVectorFromMatrix(a):a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const On=xi(Vn,"+"),Gn=xi(Vn,"-"),kn=xi(Vn,"*"),zn=xi(Vn,"/"),$n=xi(Vn,"%"),Hn=xi(Vn,"=="),Wn=xi(Vn,"!="),jn=xi(Vn,"<"),qn=xi(Vn,">"),Kn=xi(Vn,"<="),Xn=xi(Vn,">="),Yn=xi(Vn,"&&"),Qn=xi(Vn,"||"),Zn=xi(Vn,"!"),Jn=xi(Vn,"^^"),eo=xi(Vn,"&"),to=xi(Vn,"~"),ro=xi(Vn,"|"),so=xi(Vn,"^"),io=xi(Vn,"<<"),no=xi(Vn,">>");$s("add",On),$s("sub",Gn),$s("mul",kn),$s("div",zn),$s("modInt",$n),$s("equal",Hn),$s("notEqual",Wn),$s("lessThan",jn),$s("greaterThan",qn),$s("lessThanEqual",Kn),$s("greaterThanEqual",Xn),$s("and",Yn),$s("or",Qn),$s("not",Zn),$s("xor",Jn),$s("bitAnd",eo),$s("bitNot",to),$s("bitOr",ro),$s("bitXor",so),$s("shiftLeft",io),$s("shiftRight",no);const oo=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),$n(...e));$s("remainder",oo);class ao extends Fs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===ao.LENGTH||t===ao.DISTANCE||t===ao.DOT?"float":t===ao.CROSS?"vec3":t===ao.ALL?"bool":t===ao.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===ao.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,u=!0===e.renderer.isWebGLRenderer;if(r===ao.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=Oi(Ii(s),0):r=Oi(Ii(r),0);const i=kn(r,s).xyz;return Ro(i).build(e,t)}if(r===ao.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===ao.ONE_MINUS)return Gn(1,n).build(e,t);if(r===ao.RECIPROCAL)return zn(1,n).build(e,t);if(r===ao.DIFFERENCE)return Po(Gn(n,o)).build(e,t);{const l=[];return r===ao.CROSS||r===ao.MOD?l.push(n.build(e,s),o.build(e,s)):u&&r===ao.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):u&&(r===ao.MIN||r===ao.MAX)||r===ao.MOD?l.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===ao.REFRACT?l.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===ao.MIX?l.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(l.push(n.build(e,i)),null!==o&&l.push(o.build(e,i)),null!==a&&l.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ao.ALL="all",ao.ANY="any",ao.EQUALS="equals",ao.RADIANS="radians",ao.DEGREES="degrees",ao.EXP="exp",ao.EXP2="exp2",ao.LOG="log",ao.LOG2="log2",ao.SQRT="sqrt",ao.INVERSE_SQRT="inversesqrt",ao.FLOOR="floor",ao.CEIL="ceil",ao.NORMALIZE="normalize",ao.FRACT="fract",ao.SIN="sin",ao.COS="cos",ao.TAN="tan",ao.ASIN="asin",ao.ACOS="acos",ao.ATAN="atan",ao.ABS="abs",ao.SIGN="sign",ao.LENGTH="length",ao.NEGATE="negate",ao.ONE_MINUS="oneMinus",ao.DFDX="dFdx",ao.DFDY="dFdy",ao.ROUND="round",ao.RECIPROCAL="reciprocal",ao.TRUNC="trunc",ao.FWIDTH="fwidth",ao.BITCAST="bitcast",ao.TRANSPOSE="transpose",ao.ATAN2="atan2",ao.MIN="min",ao.MAX="max",ao.MOD="mod",ao.STEP="step",ao.REFLECT="reflect",ao.DISTANCE="distance",ao.DIFFERENCE="difference",ao.DOT="dot",ao.CROSS="cross",ao.POW="pow",ao.TRANSFORM_DIRECTION="transformDirection",ao.MIX="mix",ao.CLAMP="clamp",ao.REFRACT="refract",ao.SMOOTHSTEP="smoothstep",ao.FACEFORWARD="faceforward";const uo=Ci(1e-6),lo=Ci(1e6),co=Ci(Math.PI),ho=Ci(2*Math.PI),po=xi(ao,ao.ALL),go=xi(ao,ao.ANY),mo=xi(ao,ao.EQUALS),fo=xi(ao,ao.RADIANS),yo=xi(ao,ao.DEGREES),bo=xi(ao,ao.EXP),xo=xi(ao,ao.EXP2),To=xi(ao,ao.LOG),_o=xi(ao,ao.LOG2),vo=xi(ao,ao.SQRT),No=xi(ao,ao.INVERSE_SQRT),So=xi(ao,ao.FLOOR),Ao=xi(ao,ao.CEIL),Ro=xi(ao,ao.NORMALIZE),Co=xi(ao,ao.FRACT),Eo=xi(ao,ao.SIN),wo=xi(ao,ao.COS),Mo=xi(ao,ao.TAN),Bo=xi(ao,ao.ASIN),Uo=xi(ao,ao.ACOS),Fo=xi(ao,ao.ATAN),Po=xi(ao,ao.ABS),Io=xi(ao,ao.SIGN),Lo=xi(ao,ao.LENGTH),Do=xi(ao,ao.NEGATE),Vo=xi(ao,ao.ONE_MINUS),Oo=xi(ao,ao.DFDX),Go=xi(ao,ao.DFDY),ko=xi(ao,ao.ROUND),zo=xi(ao,ao.RECIPROCAL),$o=xi(ao,ao.TRUNC),Ho=xi(ao,ao.FWIDTH),Wo=xi(ao,ao.BITCAST),jo=xi(ao,ao.TRANSPOSE),qo=xi(ao,ao.ATAN2),Ko=xi(ao,ao.MIN),Xo=xi(ao,ao.MAX),Yo=xi(ao,ao.MOD),Qo=xi(ao,ao.STEP),Zo=xi(ao,ao.REFLECT),Jo=xi(ao,ao.DISTANCE),ea=xi(ao,ao.DIFFERENCE),ta=xi(ao,ao.DOT),ra=xi(ao,ao.CROSS),sa=xi(ao,ao.POW),ia=xi(ao,ao.POW,2),na=xi(ao,ao.POW,3),oa=xi(ao,ao.POW,4),aa=xi(ao,ao.TRANSFORM_DIRECTION),ua=e=>kn(Io(e),sa(Po(e),1/3)),la=e=>ta(e,e),da=xi(ao,ao.MIX),ca=(e,t=0,r=1)=>fi(new ao(ao.CLAMP,fi(e),fi(t),fi(r))),ha=e=>ca(e),pa=xi(ao,ao.REFRACT),ga=xi(ao,ao.SMOOTHSTEP),ma=xi(ao,ao.FACEFORWARD),fa=_i((([e])=>{const t=ta(e.xy,Bi(12.9898,78.233)),r=Yo(t,co);return Co(Eo(r).mul(43758.5453))})),ya=(e,t,r)=>da(t,r,e),ba=(e,t,r)=>ga(t,r,e);$s("all",po),$s("any",go),$s("equals",mo),$s("radians",fo),$s("degrees",yo),$s("exp",bo),$s("exp2",xo),$s("log",To),$s("log2",_o),$s("sqrt",vo),$s("inverseSqrt",No),$s("floor",So),$s("ceil",Ao),$s("normalize",Ro),$s("fract",Co),$s("sin",Eo),$s("cos",wo),$s("tan",Mo),$s("asin",Bo),$s("acos",Uo),$s("atan",Fo),$s("abs",Po),$s("sign",Io),$s("length",Lo),$s("lengthSq",la),$s("negate",Do),$s("oneMinus",Vo),$s("dFdx",Oo),$s("dFdy",Go),$s("round",ko),$s("reciprocal",zo),$s("trunc",$o),$s("fwidth",Ho),$s("atan2",qo),$s("min",Ko),$s("max",Xo),$s("mod",Yo),$s("step",Qo),$s("reflect",Zo),$s("distance",Jo),$s("dot",ta),$s("cross",ra),$s("pow",sa),$s("pow2",ia),$s("pow3",na),$s("pow4",oa),$s("transformDirection",aa),$s("mix",ya),$s("clamp",ca),$s("refract",pa),$s("smoothstep",ba),$s("faceForward",ma),$s("difference",ea),$s("saturate",ha),$s("cbrt",ua),$s("transpose",jo),$s("rand",fa);class xa extends Ms{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const t=this.ifNode.getNodeType(e);if(null!==this.elseNode){const r=this.elseNode.getNodeType(e);if(e.getTypeLength(r)>e.getTypeLength(t))return r}return t}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:o}=e.getNodeProperties(this),a="void"!==t,u=a?sn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const Ta=xi(xa);$s("select",Ta);const _a=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),Ta(...e));$s("cond",_a);class va extends Ms{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Na=xi(va),Sa=(e,t)=>Na(e,{label:t});$s("context",Na),$s("label",Sa);class Aa extends Ms{static get type(){return"VarNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r}=this,s=e.getVarFromNode(this,r,e.getVectorType(this.getNodeType(e))),i=e.getPropertyName(s),n=t.build(e,s.type);return e.addLineFlowCode(`${i} = ${n}`,this),i}}const Ra=xi(Aa);$s("toVar",((...e)=>Ra(...e).append()));const Ca=e=>(console.warn('TSL: "temp" is deprecated. Use ".toVar()" instead.'),Ra(e));$s("temp",Ca);class Ea extends Ms{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e);if(void 0===t.propertyName){const s=this.getNodeType(e),i=e.getPropertyName(r,_s.VERTEX);e.flowNodeFromShaderStage(_s.VERTEX,this.node,s,i),t.propertyName=i}return e.getPropertyName(r)}}const wa=xi(Ea);$s("varying",wa);const Ma=_i((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return da(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ba=_i((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return da(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ua="WorkingColorSpace",Fa="OutputColorSpace";class Pa extends Fs{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ua?u.workingColorSpace:t===Fa?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let n=t;return!1!==u.enabled&&r!==s&&r&&s?(u.getTransfer(r)===l&&(n=Oi(Ma(n.rgb),n.a)),u.getPrimaries(r)!==u.getPrimaries(s)&&(n=Oi(Hi(u._getMatrix(new i,r,s)).mul(n.rgb),n.a)),u.getTransfer(s)===l&&(n=Oi(Ba(n.rgb),n.a)),n):n}}const Ia=e=>fi(new Pa(fi(e),Ua,Fa)),La=e=>fi(new Pa(fi(e),Fa,Ua)),Da=(e,t)=>fi(new Pa(fi(e),Ua,t)),Va=(e,t)=>fi(new Pa(fi(e),t,Ua));$s("toOutputColorSpace",Ia),$s("toWorkingColorSpace",La),$s("workingToColorSpace",Da),$s("colorSpaceToWorking",Va);let Oa=class extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class Ga extends Ms{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=vs.OBJECT}setGroup(e){return this.group=e,this}element(e){return fi(new Oa(this,fi(e)))}setNodeType(e){const t=tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new ka(e,t,r));class $a extends Fs{static get type(){return"ToneMappingNode"}constructor(e,t=Wa,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ds(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===d)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Oi(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Ha=(e,t,r)=>fi(new $a(e,fi(t),fi(r))),Wa=za("toneMappingExposure","float");$s("toneMapping",((e,t,r)=>Ha(t,r,e)));class ja extends Os{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=c,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new h(r,i),a=new g(o,s,n);o.setUsage(this.usage),this.attribute=a,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=wa(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const qa=(e,t,r,s)=>fi(new ja(e,t,r,s)),Ka=(e,t,r,s)=>qa(e,t,r,s).setUsage(p),Xa=(e,t,r,s)=>qa(e,t,r,s).setInstanced(!0),Ya=(e,t,r,s)=>Ka(e,t,r,s).setInstanced(!0);$s("toAttribute",(e=>qa(e.value)));class Qa extends Ms{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.updateBeforeType=vs.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;efi(new Qa(fi(e),t,r));$s("compute",Za);class Ja extends Ms{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){return this.node.getNodeType(e)}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const eu=(e,...t)=>fi(new Ja(fi(e),...t));$s("cache",eu);class tu extends Ms{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ru=xi(tu);$s("bypass",ru);class su extends Ms{static get type(){return"RemapNode"}constructor(e,t,r,s=Ci(0),i=Ci(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const iu=xi(su,null,null,{doClamp:!1}),nu=xi(su);$s("remap",iu),$s("remapClamp",nu);class ou extends Ms{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(`( ${s} )`,r,t);e.addLineFlowCode(s,this)}}const au=xi(ou),uu=e=>(e?Ta(e,au("discard")):au("discard")).append();$s("discard",uu);class lu extends Fs{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||d,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||m;return r!==d&&(t=t.toneMapping(r)),s!==m&&s!==u.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const du=(e,t=null,r=null)=>fi(new lu(fi(e),t,r));$s("renderOutput",du);class cu extends Ms{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return wa(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const hu=(e,t)=>fi(new cu(e,t)),pu=e=>hu("uv"+(e>0?e:""),"vec2");class gu extends Ms{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const mu=xi(gu);class fu extends en{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=vs.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const yu=xi(fu);class bu extends en{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=vs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===f?"uvec4":this.value.type===y?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return pu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=tn(this.value.matrix)),this._matrixUniform.mul(Ii(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?vs.FRAME:vs.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Ei(mu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;let r=this.uvNode;null!==r&&!0!==e.context.forceUVContext||!e.context.getUV||(r=e.context.getUV(this)),r||(r=this.getDefaultUV()),!0===this.updateMatrix&&(r=this.getTransformedUV(r)),r=this.setupUV(e,r);let s=this.levelNode;null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),t.uvNode=r,t.levelNode=s,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=e.getNodeProperties(this),s=this.value;if(!s||!0!==s.isTexture)throw new Error("TextureNode: Need a three.js texture.");const i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:s,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=r,c=this.generateUV(e,t),h=s?s.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${b}`,this),n.snippet=b,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(s)&&(a=Va(au(a,u),s.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}blur(e){const t=this.clone();return t.biasNode=fi(e).mul(yu(t)),t.referenceNode=this.getSelf(),fi(t)}level(e){const t=this.clone();return t.levelNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}size(e){return mu(this,e)}bias(e){const t=this.clone();return t.biasNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}compare(e){const t=this.clone();return t.compareNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}grad(e,t){const r=this.clone();return r.gradNode=[fi(e),fi(t)],r.referenceNode=this.getSelf(),fi(r)}depth(e){const t=this.clone();return t.depthNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const xu=xi(bu),Tu=(...e)=>xu(...e).setSampler(!1),_u=tn("float").label("cameraNear").setGroup(Zi).onRenderUpdate((({camera:e})=>e.near)),vu=tn("float").label("cameraFar").setGroup(Zi).onRenderUpdate((({camera:e})=>e.far)),Nu=tn("mat4").label("cameraProjectionMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrix)),Su=tn("mat4").label("cameraProjectionMatrixInverse").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),Au=tn("mat4").label("cameraViewMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorldInverse)),Ru=tn("mat4").label("cameraWorldMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorld)),Cu=tn("mat3").label("cameraNormalMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.normalMatrix)),Eu=tn(new r).label("cameraPosition").setGroup(Zi).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class wu extends Ms{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=vs.OBJECT,this._uniformNode=new en(null)}getNodeType(){const e=this.scope;return e===wu.WORLD_MATRIX?"mat4":e===wu.POSITION||e===wu.VIEW_POSITION||e===wu.DIRECTION||e===wu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===wu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===wu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===wu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===wu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===wu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===wu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==wu.POSITION&&t!==wu.VIEW_POSITION&&t!==wu.DIRECTION&&t!==wu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}wu.WORLD_MATRIX="worldMatrix",wu.POSITION="position",wu.SCALE="scale",wu.VIEW_POSITION="viewPosition",wu.DIRECTION="direction";const Mu=xi(wu,wu.DIRECTION),Bu=xi(wu,wu.WORLD_MATRIX),Uu=xi(wu,wu.POSITION),Fu=xi(wu,wu.SCALE),Pu=xi(wu,wu.VIEW_POSITION);class Iu extends wu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Lu=Ti(Iu,Iu.DIRECTION),Du=Ti(Iu,Iu.WORLD_MATRIX),Vu=Ti(Iu,Iu.POSITION),Ou=Ti(Iu,Iu.SCALE),Gu=Ti(Iu,Iu.VIEW_POSITION),ku=tn(new i).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),zu=tn(new n).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),$u=Au.mul(Du).toVar("modelViewMatrix"),Hu=_i((e=>(e.context.isHighPrecisionModelViewMatrix=!0,tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highPrecisionModelViewMatrix"),Wu=_i((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highPrecisionModelNormalMatrix"),ju=hu("position","vec3"),qu=ju.varying("positionLocal"),Ku=ju.varying("positionPrevious"),Xu=Du.mul(qu).xyz.varying("v_positionWorld"),Yu=qu.transformDirection(Du).varying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),Qu=$u.mul(qu).xyz.varying("v_positionView"),Zu=Qu.negate().varying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Ju extends Ms{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===b&&r.side===x?"false":e.getFrontFacing()}}const el=Ti(Ju),tl=Ci(el).mul(2).sub(1),rl=hu("normal","vec3"),sl=_i((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),Ii(0,1,0)):rl),"vec3").once()().toVar("normalLocal"),il=Qu.dFdx().cross(Qu.dFdy()).normalize().toVar("normalFlat"),nl=_i((e=>{let t;return t=!0===e.material.flatShading?il:wa(cl(sl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),ol=wa(nl.transformDirection(Au),"v_normalWorld").normalize().toVar("normalWorld"),al=_i((e=>e.context.setupNormal()),"vec3").once()().mul(tl).toVar("transformedNormalView"),ul=al.transformDirection(Au).toVar("transformedNormalWorld"),ll=_i((e=>e.context.setupClearcoatNormal()),"vec3").once()().mul(tl).toVar("transformedClearcoatNormalView"),dl=_i((([e,t=Du])=>{const r=Hi(t),s=e.div(Ii(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),cl=_i((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=ku.mul(e);return Au.transformDirection(s)})),hl=tn(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),pl=Zu.negate().reflect(al),gl=Zu.negate().refract(al,hl),ml=pl.transformDirection(Au).toVar("reflectVector"),fl=gl.transformDirection(Au).toVar("reflectVector");class yl extends bu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===T?ml:e.mapping===_?fl:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Ii(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==v&&r.isRenderTargetTexture?t:Ii(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const bl=xi(yl);class xl extends en{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Tl=(e,t,r)=>fi(new xl(e,t,r));class _l extends Bs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class vl extends xl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?fs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=vs.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rfi(new vl(e,t));class Sl extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Al extends Ms{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=vs.OBJECT}element(e){return fi(new Sl(this,fi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Tl(null,e,this.count):Array.isArray(this.getValueFromReference())?Nl(null,e):"texture"===e?xu(null):"cubeTexture"===e?bl(null):tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new Al(e,t,r)),Cl=(e,t,r,s)=>fi(new Al(e,t,s,r));class El extends Al{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const wl=(e,t,r)=>fi(new El(e,t,r)),Ml=_i((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),hu("tangent","vec4"))))(),Bl=Ml.xyz.toVar("tangentLocal"),Ul=$u.mul(Oi(Bl,0)).xyz.varying("v_tangentView").normalize().toVar("tangentView"),Fl=Ul.transformDirection(Au).varying("v_tangentWorld").normalize().toVar("tangentWorld"),Pl=Ul.toVar("transformedTangentView"),Il=Pl.transformDirection(Au).normalize().toVar("transformedTangentWorld"),Ll=e=>e.mul(Ml.w).xyz,Dl=wa(Ll(rl.cross(Ml)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Vl=wa(Ll(sl.cross(Bl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Ol=wa(Ll(nl.cross(Ul)),"v_bitangentView").normalize().toVar("bitangentView"),Gl=wa(Ll(ol.cross(Fl)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kl=Ll(al.cross(Pl)).normalize().toVar("transformedBitangentView"),zl=kl.transformDirection(Au).normalize().toVar("transformedBitangentWorld"),$l=Hi(Ul,Ol,nl),Hl=Zu.mul($l),Wl=(()=>{let e=Tn.cross(Zu);return e=e.cross(Tn).normalize(),e=da(e,al,bn.mul(un.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),jl=_i((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=tl.mul(g.inverseSqrt());return On(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class ql extends Fs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=N}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Ii(s.xy.mul(r),s.z));let i=null;if(t===S)i=cl(s);else if(t===N){i=!0===e.hasGeometryAttribute("tangent")?$l.mul(s).normalize():jl({eye_pos:Qu,surf_norm:nl,mapN:s,uv:pu()})}return i}}const Kl=xi(ql),Xl=_i((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||pu()),forceUVContext:!0}),s=Ci(r((e=>e)));return Bi(Ci(r((e=>e.add(e.dFdx())))).sub(s),Ci(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Yl=_i((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(tl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class Ql extends Fs{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Xl({textureNode:this.textureNode,bumpScale:e});return Yl({surf_pos:Qu,surf_norm:nl,dHdxy:t})}}const Zl=xi(Ql),Jl=new Map;class ed extends Ms{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Jl.get(e);return void 0===r&&(r=wl(e,t),Jl.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===ed.COLOR){const e=void 0!==t.color?this.getColor(r):Ii();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===ed.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===ed.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Ci(1);else if(r===ed.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularMap?e.mul(this.getTexture(r).a):e}else if(r===ed.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===ed.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===ed.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===ed.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===ed.NORMAL)t.normalMap?(s=Kl(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Zl(this.getTexture("bump").r,this.getFloat("bumpScale")):nl;else if(r===ed.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kl(this.getTexture(r),this.getCache(r+"Scale","vec2")):nl;else if(r===ed.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===ed.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===ed.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=$i(Vd.x,Vd.y,Vd.y.negate(),Vd.x).mul(e.rg.mul(2).sub(Bi(1)).normalize().mul(e.b))}else s=Vd;else if(r===ed.IRIDESCENCE_THICKNESS){const e=Rl("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Rl("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===ed.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===ed.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===ed.IOR)s=this.getFloat(r);else if(r===ed.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===ed.AO_MAP)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}ed.ALPHA_TEST="alphaTest",ed.COLOR="color",ed.OPACITY="opacity",ed.SHININESS="shininess",ed.SPECULAR="specular",ed.SPECULAR_STRENGTH="specularStrength",ed.SPECULAR_INTENSITY="specularIntensity",ed.SPECULAR_COLOR="specularColor",ed.REFLECTIVITY="reflectivity",ed.ROUGHNESS="roughness",ed.METALNESS="metalness",ed.NORMAL="normal",ed.CLEARCOAT="clearcoat",ed.CLEARCOAT_ROUGHNESS="clearcoatRoughness",ed.CLEARCOAT_NORMAL="clearcoatNormal",ed.EMISSIVE="emissive",ed.ROTATION="rotation",ed.SHEEN="sheen",ed.SHEEN_ROUGHNESS="sheenRoughness",ed.ANISOTROPY="anisotropy",ed.IRIDESCENCE="iridescence",ed.IRIDESCENCE_IOR="iridescenceIOR",ed.IRIDESCENCE_THICKNESS="iridescenceThickness",ed.IOR="ior",ed.TRANSMISSION="transmission",ed.THICKNESS="thickness",ed.ATTENUATION_DISTANCE="attenuationDistance",ed.ATTENUATION_COLOR="attenuationColor",ed.LINE_SCALE="scale",ed.LINE_DASH_SIZE="dashSize",ed.LINE_GAP_SIZE="gapSize",ed.LINE_WIDTH="linewidth",ed.LINE_DASH_OFFSET="dashOffset",ed.POINT_WIDTH="pointWidth",ed.DISPERSION="dispersion",ed.LIGHT_MAP="light",ed.AO_MAP="ao";const td=Ti(ed,ed.ALPHA_TEST),rd=Ti(ed,ed.COLOR),sd=Ti(ed,ed.SHININESS),id=Ti(ed,ed.EMISSIVE),nd=Ti(ed,ed.OPACITY),od=Ti(ed,ed.SPECULAR),ad=Ti(ed,ed.SPECULAR_INTENSITY),ud=Ti(ed,ed.SPECULAR_COLOR),ld=Ti(ed,ed.SPECULAR_STRENGTH),dd=Ti(ed,ed.REFLECTIVITY),cd=Ti(ed,ed.ROUGHNESS),hd=Ti(ed,ed.METALNESS),pd=Ti(ed,ed.NORMAL).context({getUV:null}),gd=Ti(ed,ed.CLEARCOAT),md=Ti(ed,ed.CLEARCOAT_ROUGHNESS),fd=Ti(ed,ed.CLEARCOAT_NORMAL).context({getUV:null}),yd=Ti(ed,ed.ROTATION),bd=Ti(ed,ed.SHEEN),xd=Ti(ed,ed.SHEEN_ROUGHNESS),Td=Ti(ed,ed.ANISOTROPY),_d=Ti(ed,ed.IRIDESCENCE),vd=Ti(ed,ed.IRIDESCENCE_IOR),Nd=Ti(ed,ed.IRIDESCENCE_THICKNESS),Sd=Ti(ed,ed.TRANSMISSION),Ad=Ti(ed,ed.THICKNESS),Rd=Ti(ed,ed.IOR),Cd=Ti(ed,ed.ATTENUATION_DISTANCE),Ed=Ti(ed,ed.ATTENUATION_COLOR),wd=Ti(ed,ed.LINE_SCALE),Md=Ti(ed,ed.LINE_DASH_SIZE),Bd=Ti(ed,ed.LINE_GAP_SIZE),Ud=Ti(ed,ed.LINE_WIDTH),Fd=Ti(ed,ed.LINE_DASH_OFFSET),Pd=Ti(ed,ed.POINT_WIDTH),Id=Ti(ed,ed.DISPERSION),Ld=Ti(ed,ed.LIGHT_MAP),Dd=Ti(ed,ed.AO_MAP),Vd=tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}));class Od extends Fs{static get type(){return"ModelViewProjectionNode"}constructor(e=null){super("vec4"),this.positionNode=e}setup(e){if("fragment"===e.shaderStage)return wa(e.context.mvp);const t=this.positionNode||qu,r=e.renderer.nodes.modelViewMatrix||$u;return Nu.mul(r).mul(t)}}const Gd=xi(Od);class kd extends Ms{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===kd.VERTEX)s=e.getVertexIndex();else if(r===kd.INSTANCE)s=e.getInstanceIndex();else if(r===kd.DRAW)s=e.getDrawIndex();else if(r===kd.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===kd.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==kd.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=wa(this).build(e,t)}return i}}kd.VERTEX="vertex",kd.INSTANCE="instance",kd.SUBGROUP="subgroup",kd.INVOCATION_LOCAL="invocationLocal",kd.INVOCATION_SUBGROUP="invocationSubgroup",kd.DRAW="draw";const zd=Ti(kd,kd.VERTEX),$d=Ti(kd,kd.INSTANCE),Hd=Ti(kd,kd.SUBGROUP),Wd=Ti(kd,kd.INVOCATION_SUBGROUP),jd=Ti(kd,kd.INVOCATION_LOCAL),qd=Ti(kd,kd.DRAW);class Kd extends Ms{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=vs.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Tl(r.array,"mat4",Math.max(t,1)).element($d);else{const e=new A(r.array,16,1);this.buffer=e;const t=r.usage===p?Ya:Xa,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Wi(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new R(s.array,3),t=s.usage===p?Ya:Xa;this.bufferColor=e,n=Ii(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(qu).xyz;if(qu.assign(o),e.hasGeometryAttribute("normal")){const e=dl(sl,i);sl.assign(e)}null!==this.instanceColorNode&&nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==p&&null!=this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==p&&null!=this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Xd=xi(Kd);class Yd extends Kd{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instanceMesh=e}}const Qd=xi(Yd);class Zd extends Ms{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=$d:this.batchingIdNode=qd);const t=_i((([e])=>{const t=mu(Tu(this.batchMesh._indirectTexture),0),r=Ei(e).modInt(Ei(t)),s=Ei(e).div(Ei(t));return Tu(this.batchMesh._indirectTexture,Ui(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Ei(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mu(Tu(s),0),n=Ci(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Ei(i)),u=Wi(Tu(s,Ui(o,a)),Tu(s,Ui(o.add(1),a)),Tu(s,Ui(o.add(2),a)),Tu(s,Ui(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=_i((([e])=>{const t=mu(Tu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Tu(l,Ui(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);nn("vec3","vBatchColor").assign(t)}const d=Hi(u);qu.assign(u.mul(qu));const c=sl.div(Ii(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;sl.assign(h),e.hasGeometryAttribute("tangent")&&Bl.mulAssign(d)}}const Jd=xi(Zd),ec=new WeakMap;class tc extends Ms{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=vs.OBJECT,this.skinIndexNode=hu("skinIndex","uvec4"),this.skinWeightNode=hu("skinWeight","vec4"),t?(r=Rl("bindMatrix","mat4"),s=Rl("bindMatrixInverse","mat4"),i=Cl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=tn(e.bindMatrix,"mat4"),s=tn(e.bindMatrixInverse,"mat4"),i=Tl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=qu){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=On(o.mul(s.x).mul(d),a.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=sl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=On(s.x.mul(o),s.y.mul(a),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Cl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ku)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")}setup(e){this.needsPreviousBoneMatrices(e)&&Ku.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(qu.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();sl.assign(t),e.hasGeometryAttribute("tangent")&&Bl.assign(t)}}generate(e,t){if("void"!==t)return qu.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;ec.get(t)!==e.frameId&&(ec.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const rc=e=>fi(new tc(e,!0));class sc extends Ms{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt()+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tfi(new sc(bi(e,"int"))).append(),nc=()=>au("break").append(),oc=new WeakMap,ac=new s,uc=_i((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Ei(zd).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Tu(e,Ui(u,a)).depth(i).mul(t)}));class lc extends Ms{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=tn(1),this.updateType=vs.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,o=void 0!==n?n.length:0,{texture:a,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,o=void 0!==n?n.length:0;let a=oc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*o),f=new C(m,h,p,o);f.type=E,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Ci(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Tu(this.mesh.morphTexture,Ui(Ei(e).add(1),Ei($d))).r):t.assign(Rl("morphTargetInfluences","float").element(e).toVar()),!0===s&&qu.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(0)})),!0===i&&sl.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(1)}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const dc=xi(lc);class cc extends Ms{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}generate(){console.warn("Abstract function.")}}class hc extends cc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class pc extends va{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Ii().toVar("directDiffuse"),directSpecular:Ii().toVar("directSpecular"),indirectDiffuse:Ii().toVar("indirectDiffuse"),indirectSpecular:Ii().toVar("indirectSpecular")};return{radiance:Ii().toVar("radiance"),irradiance:Ii().toVar("irradiance"),iblIrradiance:Ii().toVar("iblIrradiance"),ambientOcclusion:Ci(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const gc=xi(pc);class mc extends cc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let fc,yc;class bc extends Ms{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===bc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=vs.NONE;return this.scope!==bc.SIZE&&this.scope!==bc.VIEWPORT||(e=vs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===bc.VIEWPORT?null!==t?yc.copy(t.viewport):(e.getViewport(yc),yc.multiplyScalar(e.getPixelRatio())):null!==t?(fc.width=t.width,fc.height=t.height):e.getDrawingBufferSize(fc)}setup(){const e=this.scope;let r=null;return r=e===bc.SIZE?tn(fc||(fc=new t)):e===bc.VIEWPORT?tn(yc||(yc=new s)):Bi(_c.div(Tc)),r}generate(e){if(this.scope===bc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Tc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}bc.COORDINATE="coordinate",bc.VIEWPORT="viewport",bc.SIZE="size",bc.UV="uv";const xc=Ti(bc,bc.UV),Tc=Ti(bc,bc.SIZE),_c=Ti(bc,bc.COORDINATE),vc=Ti(bc,bc.VIEWPORT),Nc=vc.zw,Sc=_c.sub(vc.xy),Ac=Sc.div(Nc),Rc=_i((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Tc)),"vec2").once()(),Cc=_i((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),xc)),"vec2").once()(),Ec=_i((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),xc.flipY())),"vec2").once()(),wc=new t;class Mc extends bu{static get type(){return"ViewportTextureNode"}constructor(e=xc,t=null,r=null){null===r&&((r=new w).minFilter=M),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=vs.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(wc);const r=this.value;r.image.width===wc.width&&r.image.height===wc.height||(r.image.width=wc.width,r.image.height=wc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Bc=xi(Mc),Uc=xi(Mc,null,null,{generateMipmaps:!0});let Fc=null;class Pc extends Mc{static get type(){return"ViewportDepthTextureNode"}constructor(e=xc,t=null){null===Fc&&(Fc=new B),super(e,t,Fc)}}const Ic=xi(Pc);class Lc extends Ms{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Lc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Lc.DEPTH_BASE)null!==r&&(s=kc().assign(r));else if(t===Lc.DEPTH)s=e.isPerspectiveCamera?Vc(Qu.z,_u,vu):Dc(Qu.z,_u,vu);else if(t===Lc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Oc(r,_u,vu);s=Dc(e,_u,vu)}else s=r;else s=Dc(Qu.z,_u,vu);return s}}Lc.DEPTH_BASE="depthBase",Lc.DEPTH="depth",Lc.LINEAR_DEPTH="linearDepth";const Dc=(e,t,r)=>e.add(t).div(t.sub(r)),Vc=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Oc=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Gc=(e,t,r)=>{t=t.max(1e-6).toVar();const s=_o(e.negate().div(t)),i=_o(r.div(t));return s.div(i)},kc=xi(Lc,Lc.DEPTH_BASE),zc=Ti(Lc,Lc.DEPTH),$c=xi(Lc,Lc.LINEAR_DEPTH),Hc=$c(Ic());zc.assign=e=>kc(e);const Wc=xi(class extends Ms{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class jc extends Ms{static get type(){return"ClippingNode"}constructor(e=jc.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===jc.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===jc.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return _i((()=>{const r=Ci().toVar("distanceToPlane"),s=Ci().toVar("distanceToGradient"),i=Ci(1).toVar("clipOpacity"),n=t.length;if(!this.hardwareClipping&&n>0){const e=Nl(t);ic(n,(({i:t})=>{const n=e.element(t);r.assign(Qu.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ga(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Nl(e),n=Ci(1).toVar("intersectionClipOpacity");ic(o,(({i:e})=>{const i=t.element(e);r.assign(Qu.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ga(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}on.a.mulAssign(i),on.a.equal(0).discard()}))()}setupDefault(e,t){return _i((()=>{const r=t.length;if(!this.hardwareClipping&&r>0){const e=Nl(t);ic(r,(({i:t})=>{const r=e.element(t);Qu.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Nl(e),r=Mi(!0).toVar("clipped");ic(s,(({i:e})=>{const s=t.element(e);r.assign(Qu.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),_i((()=>{const s=Nl(e),i=Wc(t.getClipDistance());ic(r,(({i:e})=>{const t=s.element(e),r=Qu.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}jc.ALPHA_TO_COVERAGE="alphaToCoverage",jc.DEFAULT="default",jc.HARDWARE="hardware";const qc=_i((([e])=>Co(kn(1e4,Eo(kn(17,e.x).add(kn(.1,e.y)))).mul(On(.1,Po(Eo(kn(13,e.y).add(e.x)))))))),Kc=_i((([e])=>qc(Bi(qc(e.xy),e.z)))),Xc=_i((([e])=>{const t=Xo(Lo(Oo(e.xyz)),Lo(Go(e.xyz))),r=Ci(1).div(Ci(.05).mul(t)).toVar("pixScale"),s=Bi(xo(So(_o(r))),xo(Ao(_o(r)))),i=Bi(Kc(So(s.x.mul(e.xyz))),Kc(So(s.y.mul(e.xyz)))),n=Co(_o(r)),o=On(kn(n.oneMinus(),i.x),kn(n,i.y)),a=Ko(n,n.oneMinus()),u=Ii(o.mul(o).div(kn(2,a).mul(Gn(1,a))),o.sub(kn(.5,a)).div(Gn(1,a)),Gn(1,Gn(1,o).mul(Gn(1,o)).div(kn(2,a).mul(Gn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return ca(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Yc extends U{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.forceSinglePass=!1,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+cs(this)}build(e){this.setup(e)}setupObserver(e){return new os(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e);const t=e.renderer,r=t.getRenderTarget();let s;e.addStack(),e.stack.outputNode=this.vertexNode||this.setupPosition(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const i=this.setupClipping(e);if(!0===this.depthWrite&&(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const n=this.setupLighting(e);null!==i&&e.stack.add(i);const o=Oi(n,on.a).max(0);if(s=this.setupOutput(e,o),Sn.assign(s),null!==this.outputNode&&(s=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(s=e,null!==r&&(s=e.merge(r))):null!==r&&(s=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Oi(t)),s=this.setupOutput(e,t)}e.stack.outputNode=s,e.addFlow("fragment",e.removeStack()),e.monitor=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=fi(new jc(jc.ALPHA_TO_COVERAGE)):e.stack.add(fi(new jc))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(fi(new jc(jc.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Gc(Qu.z,_u,vu):Dc(Qu.z,_u,vu))}null!==s&&zc.assign(s).append()}setupPosition(e){const{object:t}=e,r=t.geometry;if(e.addStack(),(r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&dc(t).append(),!0===t.isSkinnedMesh&&rc(t).append(),this.displacementMap){const e=wl("displacementMap","texture"),t=wl("displacementScale","float"),r=wl("displacementBias","float");qu.addAssign(sl.normalize().mul(e.x.mul(t).add(r)))}t.isBatchedMesh&&Jd(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Qd(t).append(),null!==this.positionNode&&qu.assign(this.positionNode),this.setupHardwareClipping(e);const s=Gd();return e.context.vertex=e.removeStack(),e.context.mvp=s,s}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?Oi(this.colorNode):rd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=Oi(r.xyz.mul(hu("color","vec3")),r.a)),e.instanceColor){r=nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=nn("vec3","vBatchColor").mul(r)}on.assign(r);const s=this.opacityNode?Ci(this.opacityNode):nd;if(on.a.assign(on.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Ci(this.alphaTestNode):td;on.a.lessThanEqual(e).discard()}!0===this.alphaHash&&on.a.lessThan(Xc(qu)).discard(),!1===this.transparent&&this.blending===F&&!1===this.alphaToCoverage&&on.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Ii(0):on.rgb}setupNormal(){return this.normalNode?Ii(this.normalNode):pd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?wl("envMap","cubeTexture"):wl("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new mc(Ld)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Dd;t.push(new hc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=gc(n,t,r,s)}else null!==r&&(o=Ii(null!==s?da(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(an.assign(Ii(i||id)),o=o.add(an)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(t=Oi(r.mix(t.rgb,r.colorNode),t.a))}return t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=U.prototype.toJSON.call(this,e),s=hs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Qc=new P;class Zc extends Yc{static get type(){return"InstancedPointsNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.pointWidth=1,this.pointColorNode=null,this.pointWidthNode=null,this.setDefaultValues(Qc),this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor;this.vertexNode=_i((()=>{const e=hu("instancePosition").xyz,t=Oi($u.mul(Oi(e,1))),r=vc.z.div(vc.w),s=Nu.mul(t),i=ju.xy.toVar();return i.mulAssign(this.pointWidthNode?this.pointWidthNode:Pd),i.assign(i.div(vc.z)),i.y.assign(i.y.mul(r)),i.assign(i.mul(s.w)),s.addAssign(Oi(i,0,0)),s}))(),this.fragmentNode=_i((()=>{const s=Ci(1).toVar(),i=la(pu().mul(2).sub(1));if(t&&e.samples>1){const e=Ci(i.fwidth()).toVar();s.assign(ga(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();let n;if(this.pointColorNode)n=this.pointColorNode;else if(r){n=hu("instanceColor").mul(rd)}else n=rd;return s.mulAssign(nd),Oi(n,s)}))()}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const Jc=new I;class eh extends Yc{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.lights=!1,this.setDefaultValues(Jc),this.setValues(e)}}const th=new L;class rh extends Yc{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.lights=!1,this.setDefaultValues(th),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Ci(this.offsetNodeNode):Fd,t=this.dashScaleNode?Ci(this.dashScaleNode):wd,r=this.dashSizeNode?Ci(this.dashSizeNode):Md,s=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(r),Rn.assign(s);const i=wa(hu("lineDistance").mul(t));(e?i.add(e):i).mod(An.add(Rn)).greaterThan(An).discard()}}let sh=null;class ih extends Mc{static get type(){return"ViewportSharedTextureNode"}constructor(e=xc,t=null){null===sh&&(sh=new w),super(e,t,sh)}updateReference(){return this}}const nh=xi(ih),oh=new L;class ah extends Yc{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.lights=!1,this.setDefaultValues(oh),this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.useDash=e.dashed,this.useWorldUnits=!1,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=D,this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor,s=this.dashed,i=this.worldUnits,n=_i((({start:e,end:t})=>{const r=Nu.element(2).element(2),s=Nu.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Oi(da(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=_i((()=>{const e=hu("instanceStart"),t=hu("instanceEnd"),r=Oi($u.mul(Oi(e,1))).toVar("start"),o=Oi($u.mul(Oi(t,1))).toVar("end");if(s){const e=this.dashScaleNode?Ci(this.dashScaleNode):wd,t=this.offsetNode?Ci(this.offsetNodeNode):Fd,r=hu("instanceDistanceStart"),s=hu("instanceDistanceEnd");let i=ju.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),nn("float","lineDistance").assign(i)}i&&(nn("vec3","worldStart").assign(r.xyz),nn("vec3","worldEnd").assign(o.xyz));const a=vc.z.div(vc.w),u=Nu.element(2).element(3).equal(-1);Si(u,(()=>{Si(r.z.lessThan(0).and(o.z.greaterThan(0)),(()=>{o.assign(n({start:r,end:o}))})).ElseIf(o.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(n({start:o,end:r}))}))}));const l=Nu.mul(r),d=Nu.mul(o),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(a)),p.assign(p.normalize());const g=Oi().toVar();if(i){const e=o.xyz.sub(r.xyz).normalize(),t=da(r.xyz,o.xyz,.5).normalize(),i=e.cross(t).normalize(),n=e.cross(i),a=nn("vec4","worldPos");a.assign(ju.y.lessThan(.5).select(r,o));const u=Ud.mul(.5);a.addAssign(Oi(ju.x.lessThan(0).select(i.mul(u),i.mul(u).negate()),0)),s||(a.addAssign(Oi(ju.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(Oi(n.mul(u),0)),Si(ju.y.greaterThan(1).or(ju.y.lessThan(0)),(()=>{a.subAssign(Oi(n.mul(2).mul(u),0))}))),g.assign(Nu.mul(a));const l=Ii().toVar();l.assign(ju.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Bi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(ju.x.lessThan(0).select(e.negate(),e)),Si(ju.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(ju.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(Ud)),e.assign(e.div(vc.w)),g.assign(ju.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Oi(e,0,0)))}return g}))();const o=_i((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Bi(h,p)}));if(this.colorNode=_i((()=>{const n=pu();if(s){const e=this.dashSizeNode?Ci(this.dashSizeNode):Md,t=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(e),Rn.assign(t);const r=nn("float","lineDistance");n.y.lessThan(-1).or(n.y.greaterThan(1)).discard(),r.mod(An.add(Rn)).greaterThan(An).discard()}const a=Ci(1).toVar("alpha");if(i){const r=nn("vec3","worldStart"),i=nn("vec3","worldEnd"),n=nn("vec4","worldPos").xyz.normalize().mul(1e5),u=i.sub(r),l=o({p1:r,p2:i,p3:Ii(0,0,0),p4:n}),d=r.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Ud);if(!s)if(t&&e.samples>1){const e=h.fwidth();a.assign(ga(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(t&&e.samples>1){const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1)),r=e.mul(e).add(t.mul(t)),s=Ci(r.fwidth()).toVar("dlen");Si(n.y.abs().greaterThan(1),(()=>{a.assign(ga(s.oneMinus(),s.add(1),r).oneMinus())}))}else Si(n.y.abs().greaterThan(1),(()=>{const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1));e.mul(e).add(t.mul(t)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(r){const e=hu("instanceColorStart"),t=hu("instanceColorEnd");u=ju.y.lessThan(.5).select(e,t).mul(rd)}else u=rd;return Oi(u,a)}))(),this.transparent){const e=this.opacityNode?Ci(this.opacityNode):nd;this.outputNode=Oi(this.colorNode.rgb.mul(e).add(nh().rgb.mul(e.oneMinus())),this.colorNode.a)}}get worldUnits(){return this.useWorldUnits}set worldUnits(e){this.useWorldUnits!==e&&(this.useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this.useDash}set dashed(e){this.useDash!==e&&(this.useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const uh=e=>fi(e).mul(.5).add(.5),lh=new V;class dh extends Yc{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(lh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Ci(this.opacityNode):nd;on.assign(Oi(uh(al),e))}}class ch extends Fs{static get type(){return"EquirectUVNode"}constructor(e=Yu){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan2(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Bi(t,r)}}const hh=xi(ch);class ph extends O{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new G(5,5,5),n=hh(Yu),o=new Yc;o.colorNode=xu(t,n,0),o.side=x,o.blending=D;const a=new k(i,o),u=new z;u.add(a),t.minFilter===M&&(t.minFilter=$);const l=new H(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const gh=new WeakMap;class mh extends Fs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=bl();const t=new W;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=vs.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===j||r===q){if(gh.has(e)){const t=gh.get(e);yh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ph(r.height);s.fromEquirectangularTexture(t,e),yh(s.texture,e.mapping),this._cubeTexture=s.texture,gh.set(e,s.texture),e.addEventListener("dispose",fh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function fh(e){const t=e.target;t.removeEventListener("dispose",fh);const r=gh.get(t);void 0!==r&&(gh.delete(t),r.dispose())}function yh(e,t){t===j?e.mapping=T:t===q&&(e.mapping=_)}const bh=xi(mh);class xh extends cc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=bh(this.envNode)}}class Th extends cc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Ci(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class _h{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class vh extends _h{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(Oi(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(Oi(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(on.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case Y:i.rgb.assign(da(i.rgb,i.rgb.mul(n.rgb),ld.mul(dd)));break;case X:i.rgb.assign(da(i.rgb,n.rgb,ld.mul(dd)));break;case K:i.rgb.addAssign(n.rgb.mul(ld.mul(dd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Nh=new Q;class Sh extends Yc{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Nh),this.setValues(e)}setupNormal(){return nl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Th(Ld)),t}setupOutgoingLight(){return on.rgb}setupLightingModel(){return new vh}}const Ah=_i((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),Rh=_i((e=>e.diffuseColor.mul(1/Math.PI))),Ch=_i((({dotNH:e})=>Nn.mul(Ci(.5)).add(1).mul(Ci(1/Math.PI)).mul(e.pow(Nn)))),Eh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(t).clamp(),s=Zu.dot(t).clamp(),i=Ah({f0:_n,f90:1,dotVH:s}),n=Ci(.25),o=Ch({dotNH:r});return i.mul(n).mul(o)}));class wh extends vh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Eh({lightDirection:e})).mul(ld))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const Mh=new Z;class Bh extends Yc{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Mh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh(!1)}}const Uh=new J;class Fh extends Yc{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Uh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh}setupVariants(){const e=(this.shininessNode?Ci(this.shininessNode):sd).max(1e-4);Nn.assign(e);const t=this.specularNode||od;_n.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ph=_i((e=>{if(!1===e.geometry.hasAttribute("normal"))return Ci(0);const t=nl.dFdx().abs().max(nl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Ih=_i((e=>{const{roughness:t}=e,r=Ph();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Lh=_i((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return zn(.5,i.add(n).max(uo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Dh=_i((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul(Ii(e.mul(r),t.mul(s),o).length()),l=o.mul(Ii(e.mul(i),t.mul(n),a).length());return zn(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Vh=_i((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Oh=Ci(1/Math.PI),Gh=_i((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=Ii(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Oh.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),kh=_i((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||al,l=i.pow2(),d=t.add(Zu).normalize(),c=u.dot(t).clamp(),h=u.dot(Zu).clamp(),p=u.dot(d).clamp(),g=Zu.dot(d).clamp();let m,f,y=Ah({f0:r,f90:s,dotVH:g});if(pi(o)&&(y=gn.mix(y,n)),pi(a)){const e=xn.dot(t),r=xn.dot(Zu),s=xn.dot(d),i=Tn.dot(t),n=Tn.dot(Zu),o=Tn.dot(d);m=Dh({alphaT:yn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Gh({alphaT:yn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=Lh({alpha:l,dotNL:c,dotNV:h}),f=Vh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),zh=_i((({roughness:e,dotNV:t})=>{const r=Oi(-1,-.0275,-.572,.022),s=Oi(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Bi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),$h=_i((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=zh({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Hh=_i((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Ii(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),Wh=_i((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Ci(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Ci(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),jh=_i((({dotNV:e,dotNL:t})=>Ci(1).div(Ci(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),qh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(e).clamp(),s=al.dot(Zu).clamp(),i=al.dot(t).clamp(),n=Wh({roughness:pn,dotNH:i}),o=jh({dotNV:s,dotNL:r});return hn.mul(n).mul(o)})),Kh=_i((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Bi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Xh=_i((({f:e})=>{const t=e.length();return Xo(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Yh=_i((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),o=i.div(n),a=r.greaterThan(0).select(o,Xo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Qh=_i((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=Ii().toVar();return Si(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Hi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=Ii(0).toVar();f.addAssign(Yh({v1:h,v2:p})),f.addAssign(Yh({v1:p,v2:g})),f.addAssign(Yh({v1:g,v2:m})),f.addAssign(Yh({v1:m,v2:h})),c.assign(Ii(Xh({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Zh=1/6,Jh=e=>kn(Zh,kn(e,kn(e,e.negate().add(3)).sub(3)).add(1)),ep=e=>kn(Zh,kn(e,kn(e,kn(3,e).sub(6))).add(4)),tp=e=>kn(Zh,kn(e,kn(e,kn(-3,e).add(3)).add(3)).add(1)),rp=e=>kn(Zh,sa(e,3)),sp=e=>Jh(e).add(ep(e)),ip=e=>tp(e).add(rp(e)),np=e=>On(-1,ep(e).div(Jh(e).add(ep(e)))),op=e=>On(1,rp(e).div(tp(e).add(rp(e)))),ap=(e,t,r)=>{const s=e.uvNode,i=kn(s,t.zw).add(.5),n=So(i),o=Co(i),a=sp(o.x),u=ip(o.x),l=np(o.x),d=op(o.x),c=np(o.y),h=op(o.y),p=Bi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Bi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Bi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Bi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=sp(o.y).mul(On(a.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=ip(o.y).mul(On(a.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},up=_i((([e,t=Ci(3)])=>{const r=Bi(e.size(Ei(t))),s=Bi(e.size(Ei(t.add(1)))),i=zn(1,r),n=zn(1,s),o=ap(e,Oi(i,r),So(t)),a=ap(e,Oi(n,s),Ao(t));return Co(t).mix(o,a)})),lp=_i((([e,t,r,s,i])=>{const n=Ii(pa(t.negate(),Ro(e),zn(1,s))),o=Ii(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return Ro(n).mul(r.mul(o))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),dp=_i((([e,t])=>e.mul(ca(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),cp=Uc(),hp=Uc(),pp=_i((([e,t,r],{material:s})=>{const i=(s.side==x?cp:hp).sample(e),n=_o(Tc.x).mul(dp(t,r));return up(i,n)})),gp=_i((([e,t,r])=>(Si(r.notEqual(0),(()=>{const s=To(t).negate().div(r);return bo(s.negate().mul(e))})),Ii(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),mp=_i((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Oi().toVar(),f=Ii().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Ii(d.sub(i),d,d.add(i));ic({start:0,end:3},(({i:i})=>{const d=n.element(i),g=lp(e,t,c,d,a),y=o.add(g),b=l.mul(u.mul(Oi(y,1))),x=Bi(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Bi(x.x,x.y.oneMinus()));const T=pp(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(gp(Lo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=lp(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(Oi(n,1))),y=Bi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Bi(y.x,y.y.oneMinus())),m=pp(y,r,d),f=s.mul(gp(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Ii($h({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Oi(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),fp=Hi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),yp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),bp=_i((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=da(e,t,ga(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Si(o.lessThan(0),(()=>Ii(1)));const a=o.sqrt(),u=yp(n,e),l=Ah({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Ci(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Ii(1).add(t).div(Ii(1).sub(t))})(i.clamp(0,.9999)),g=yp(p,n.toVec3()),m=Ah({f0:g,f90:1,dotVH:a}),f=Ii(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,a,2),b=Ii(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Ii(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return ic({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Ii(54856e-17,44201e-17,52481e-17),i=Ii(1681e3,1795300,2208400),n=Ii(43278e5,93046e5,66121e5),o=Ci(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=Ii(a.x.add(o),a.y,a.z).div(1.0685e-7),fp.mul(a)})(Ci(e).mul(y),Ci(e).mul(b)).mul(2);v.addAssign(N.mul(t))})),v.max(Ii(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),xp=_i((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Ta(r.lessThan(.25),Ci(-339.2).mul(i).add(Ci(161.4).mul(r)).sub(25.9),Ci(-8.48).mul(i).add(Ci(14.3).mul(r)).sub(9.95)),o=Ta(r.lessThan(.25),Ci(44).mul(i).sub(Ci(23.7).mul(r)).add(3.26),Ci(1.97).mul(i).sub(Ci(3.27).mul(r)).add(.72));return Ta(r.lessThan(.25),0,Ci(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Tp=Ii(.04),_p=Ci(1);class vp extends _h{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Ii().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Ii().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Ii().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Ii().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Ii().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=al.dot(Zu).clamp();this.iridescenceFresnel=bp({outsideIOR:Ci(1),eta2:mn,cosTheta1:e,thinFilmThickness:fn,baseF0:_n}),this.iridescenceF0=Hh({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Xu,r=Eu.sub(Xu).normalize(),s=ul;e.backdrop=mp(s,r,un,on,_n,vn,t,Du,Au,Nu,En,Mn,Un,Bn,this.dispersion?Fn:null),e.backdropAlpha=wn,on.a.mulAssign(da(1,e.backdrop.a,wn))}}computeMultiscattering(e,t,r){const s=al.dot(Zu).clamp(),i=zh({roughness:un,dotNV:s}),n=(this.iridescenceF0?gn.mix(_n,this.iridescenceF0):_n).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=_n.add(_n.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(qh({lightDirection:e}))),!0===this.clearcoat){const r=ll.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(kh({lightDirection:e,f0:Tp,f90:_p,roughness:cn,normalView:ll})))}r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),r.directSpecular.addAssign(s.mul(kh({lightDirection:e,f0:_n,f90:1,roughness:un,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=al,h=Zu,p=Qu.toVar(),g=Kh({N:c,V:h,roughness:un}),m=n.sample(g).toVar(),f=o.sample(g).toVar(),y=Hi(Ii(m.x,0,m.y),Ii(0,1,0),Ii(m.z,0,m.w)).toVar(),b=_n.mul(f.x).add(_n.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Qh({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(on).mul(Qh({N:c,V:h,P:p,mInv:Hi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Rh({diffuseColor:on})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(hn,xp({normal:al,viewDir:Zu,roughness:pn}))),!0===this.clearcoat){const e=ll.dot(Zu).clamp(),t=$h({dotNV:e,specularColor:Tp,specularF90:_p,roughness:cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=Ii().toVar("singleScattering"),i=Ii().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,vn);const o=s.add(i),a=on.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=al.dot(Zu).clamp().add(e),s=un.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ll.dot(Zu).clamp(),r=Ah({dotVH:e,f0:Tp,f90:_p}),s=t.mul(dn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(dn));t.assign(s)}if(!0===this.sheen){const e=hn.r.max(hn.g).max(hn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Np=Ci(1),Sp=Ci(-2),Ap=Ci(.8),Rp=Ci(-1),Cp=Ci(.4),Ep=Ci(2),wp=Ci(.305),Mp=Ci(3),Bp=Ci(.21),Up=Ci(4),Fp=Ci(4),Pp=Ci(16),Ip=_i((([e])=>{const t=Ii(Po(e)).toVar(),r=Ci(-1).toVar();return Si(t.x.greaterThan(t.z),(()=>{Si(t.x.greaterThan(t.y),(()=>{r.assign(Ta(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})).Else((()=>{Si(t.z.greaterThan(t.y),(()=>{r.assign(Ta(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Lp=_i((([e,t])=>{const r=Bi().toVar();return Si(t.equal(0),(()=>{r.assign(Bi(e.z,e.y).div(Po(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Bi(e.x.negate(),e.z.negate()).div(Po(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Bi(e.x.negate(),e.y).div(Po(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Bi(e.z.negate(),e.y).div(Po(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Bi(e.x.negate(),e.z).div(Po(e.y)))})).Else((()=>{r.assign(Bi(e.x,e.y).div(Po(e.z)))})),kn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Dp=_i((([e])=>{const t=Ci(0).toVar();return Si(e.greaterThanEqual(Ap),(()=>{t.assign(Np.sub(e).mul(Rp.sub(Sp)).div(Np.sub(Ap)).add(Sp))})).ElseIf(e.greaterThanEqual(Cp),(()=>{t.assign(Ap.sub(e).mul(Ep.sub(Rp)).div(Ap.sub(Cp)).add(Rp))})).ElseIf(e.greaterThanEqual(wp),(()=>{t.assign(Cp.sub(e).mul(Mp.sub(Ep)).div(Cp.sub(wp)).add(Ep))})).ElseIf(e.greaterThanEqual(Bp),(()=>{t.assign(wp.sub(e).mul(Up.sub(Mp)).div(wp.sub(Bp)).add(Mp))})).Else((()=>{t.assign(Ci(-2).mul(_o(kn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Vp=_i((([e,t])=>{const r=e.toVar();r.assign(kn(2,r).sub(1));const s=Ii(r,1).toVar();return Si(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Op=_i((([e,t,r,s,i,n])=>{const o=Ci(r),a=Ii(t),u=ca(Dp(o),Sp,n),l=Co(u),d=So(u),c=Ii(Gp(e,a,d,s,i,n)).toVar();return Si(l.notEqual(0),(()=>{const t=Ii(Gp(e,a,d.add(1),s,i,n)).toVar();c.assign(da(c,t,l))})),c})),Gp=_i((([e,t,r,s,i,n])=>{const o=Ci(r).toVar(),a=Ii(t),u=Ci(Ip(a)).toVar(),l=Ci(Xo(Fp.sub(o),0)).toVar();o.assign(Xo(o,Fp));const d=Ci(xo(o)).toVar(),c=Bi(Lp(a,u).mul(d.sub(2)).add(1)).toVar();return Si(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(kn(3,Pp))),c.y.addAssign(kn(4,xo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Bi(),Bi())})),kp=_i((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=wo(s),l=r.mul(u).add(i.cross(r).mul(Eo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Gp(e,l,t,n,o,a)})),zp=_i((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Ii(Ta(t,r,ra(r,s))).toVar();Si(po(h.equals(Ii(0))),(()=>{h.assign(Ii(s.z,0,s.x.negate()))})),h.assign(Ro(h));const p=Ii().toVar();return p.addAssign(i.element(Ei(0)).mul(kp({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),ic({start:Ei(1),end:e},(({i:e})=>{Si(e.greaterThanEqual(n),(()=>{nc()}));const t=Ci(o.mul(Ci(e))).toVar();p.addAssign(i.element(e).mul(kp({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(kp({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),Oi(p,1)}));let $p=null;const Hp=new WeakMap;function Wp(e){let t=Hp.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=$p.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,Hp.set(e,t)}return t.texture}class jp extends Fs{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new ee;s.isRenderTargetTexture=!0,this._texture=xu(s),this._width=tn(0),this._height=tn(0),this._maxMip=tn(0),this.updateBeforeType=vs.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:Wp(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===$p&&($p=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===b&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=Ii(t.x.negate(),t.yz));let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Op(this._texture,t,s,this._width,this._height,this._maxMip)}}const qp=xi(jp),Kp=new WeakMap;class Xp extends cc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Kp.get(e);void 0===s&&(s=qp(e),Kp.set(e,s)),r=s}const s=t.envMap?Rl("envMapIntensity","float",e.material):Rl("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?Wl:al,n=r.context(Yp(un,i)).mul(s),o=r.context(Qp(ul)).mul(Math.PI).mul(s),a=eu(n),u=eu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(Yp(cn,ll)).mul(s),t=eu(e);l.addAssign(t)}}}const Yp=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Zu.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(Au)),r),getTextureLevel:()=>e}},Qp=e=>({getUV:()=>e,getTextureLevel:()=>Ci(1)}),Zp=new te;class Jp extends Yc{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Zp),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Xp(t):null}setupLightingModel(){return new vp}setupSpecular(){const e=da(Ii(.04),on.rgb,ln);_n.assign(e),vn.assign(1)}setupVariants(){const e=this.metalnessNode?Ci(this.metalnessNode):hd;ln.assign(e);let t=this.roughnessNode?Ci(this.roughnessNode):cd;t=Ih({roughness:t}),un.assign(t),this.setupSpecular(),on.assign(Oi(on.rgb.mul(e.oneMinus()),on.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const eg=new re;class tg extends Jp{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(eg),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Ci(this.iorNode):Rd;En.assign(e),_n.assign(da(Ko(ia(En.sub(1).div(En.add(1))).mul(ud),Ii(1)).mul(ad),on.rgb,ln)),vn.assign(da(ad,1,ln))}setupLightingModel(){return new vp(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Ci(this.clearcoatNode):gd,t=this.clearcoatRoughnessNode?Ci(this.clearcoatRoughnessNode):md;dn.assign(e),cn.assign(Ih({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Ii(this.sheenNode):bd,t=this.sheenRoughnessNode?Ci(this.sheenRoughnessNode):xd;hn.assign(e),pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Ci(this.iridescenceNode):_d,t=this.iridescenceIORNode?Ci(this.iridescenceIORNode):vd,r=this.iridescenceThicknessNode?Ci(this.iridescenceThicknessNode):Nd;gn.assign(e),mn.assign(t),fn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Bi(this.anisotropyNode):Td).toVar();bn.assign(e.length()),Si(bn.equal(0),(()=>{e.assign(Bi(1,0))})).Else((()=>{e.divAssign(Bi(bn)),bn.assign(bn.saturate())})),yn.assign(bn.pow2().mix(un.pow2(),1)),xn.assign($l[0].mul(e.x).add($l[1].mul(e.y))),Tn.assign($l[1].mul(e.x).sub($l[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Ci(this.transmissionNode):Sd,t=this.thicknessNode?Ci(this.thicknessNode):Ad,r=this.attenuationDistanceNode?Ci(this.attenuationDistanceNode):Cd,s=this.attenuationColorNode?Ii(this.attenuationColorNode):Ed;if(wn.assign(e),Mn.assign(t),Bn.assign(r),Un.assign(s),this.useDispersion){const e=this.dispersionNode?Ci(this.dispersionNode):Id;Fn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Ii(this.clearcoatNormalNode):fd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class rg extends vp{constructor(e,t,r,s){super(e,t,r),this.useSSS=s}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(al.mul(o)).normalize(),h=Ci(Zu.dot(c.negate()).saturate().pow(l).mul(d)),p=Ii(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class sg extends tg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Ci(.1),this.thicknessAmbientNode=Ci(0),this.thicknessAttenuationNode=Ci(.1),this.thicknessPowerNode=Ci(2),this.thicknessScaleNode=Ci(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new rg(this.useClearcoat,this.useSheen,this.useIridescence,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const ig=_i((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Bi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=wl("gradientMap","texture").context({getUV:()=>i});return Ii(e.r)}{const e=i.fwidth().mul(.5);return da(Ii(.7),Ii(1),ga(Ci(.7).sub(e.x),Ci(.7).add(e.x),i.x))}}));class ng extends _h{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=ig({normal:rl,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Rh({diffuseColor:on.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const og=new se;class ag extends Yc{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(og),this.setValues(e)}setupLightingModel(){return new ng}}class ug extends Fs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Ii(Zu.z,0,Zu.x.negate()).normalize(),t=Zu.cross(e);return Bi(e.dot(al),t.dot(al)).mul(.495).add(.5)}}const lg=Ti(ug),dg=new ie;class cg extends Yc{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(dg),this.setValues(e)}setupVariants(e){const t=lg;let r;r=e.material.matcap?wl("matcap","texture").context({getUV:()=>t}):Ii(da(.2,.8,t.y)),on.rgb.mulAssign(r.rgb)}}const hg=new P;class pg extends Yc{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.isPointsNodeMaterial=!0,this.lights=!1,this.transparent=!0,this.sizeNode=null,this.setDefaultValues(hg),this.setValues(e)}copy(e){return this.sizeNode=e.sizeNode,super.copy(e)}}class gg extends Fs{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return $i(e,s,s.negate(),e).mul(r)}{const e=t,s=Wi(Oi(1,0,0,0),Oi(0,wo(e.x),Eo(e.x).negate(),0),Oi(0,Eo(e.x),wo(e.x),0),Oi(0,0,0,1)),i=Wi(Oi(wo(e.y),0,Eo(e.y),0),Oi(0,1,0,0),Oi(Eo(e.y).negate(),0,wo(e.y),0),Oi(0,0,0,1)),n=Wi(Oi(wo(e.z),Eo(e.z).negate(),0,0),Oi(Eo(e.z),wo(e.z),0,0),Oi(0,0,1,0),Oi(0,0,0,1));return s.mul(i).mul(n).mul(Oi(r,1)).xyz}}}const mg=xi(gg),fg=new ne;class yg extends Yc{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this.lights=!1,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(fg),this.setValues(e)}setupPosition({object:e,camera:t,context:r}){const s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=qu;let u=$u.mul(Ii(i||0)),l=Bi(Du[0].xyz.length(),Du[1].xyz.length());if(null!==o&&(l=l.mul(o)),!s)if(t.isPerspectiveCamera)l=l.mul(u.z.negate());else{const e=Ci(2).div(Nu.element(1).element(1));l=l.mul(e.mul(2))}let d=a.xy;if(e.center&&!0===e.center.isVector2){const e=((e,t,r)=>fi(new Ga(e,t,r)))("center","vec2");d=d.sub(e.sub(.5))}d=d.mul(l);const c=Ci(n||yd),h=mg(d,c);u=Oi(u.xy.add(h),u.zw);const p=Nu.mul(u);return r.vertex=a,p}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}class bg extends _h{constructor(){super(),this.shadowNode=Ci(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){on.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(on.rgb)}}const xg=new oe;class Tg extends Yc{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(xg),this.setValues(e)}setupLightingModel(){return new bg}}const _g=_i((({texture:e,uv:t})=>{const r=1e-4,s=Ii().toVar();return Si(t.x.lessThan(r),(()=>{s.assign(Ii(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Ii(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Ii(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Ii(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Ii(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Ii(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Ii(-.01,0,0))).r.sub(e.sample(t.add(Ii(r,0,0))).r),n=e.sample(t.add(Ii(0,-.01,0))).r.sub(e.sample(t.add(Ii(0,r,0))).r),o=e.sample(t.add(Ii(0,0,-.01))).r.sub(e.sample(t.add(Ii(0,0,r))).r);s.assign(Ii(i,n,o))})),s.normalize()}));class vg extends bu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Ii(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){return t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return _g({texture:this,uv:e})}}const Ng=xi(vg);class Sg extends Yc{static get type(){return"VolumeNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.isVolumeNodeMaterial=!0,this.testNode=null,this.setValues(e)}setup(e){const t=Ng(this.map,null,0),r=_i((({orig:e,dir:t})=>{const r=Ii(-.5),s=Ii(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=Ko(n,o),u=Xo(n,o),l=Xo(a.x,Xo(a.y,a.z)),d=Ko(u.x,Ko(u.y,u.z));return Bi(l,d)}));this.fragmentNode=_i((()=>{const e=wa(Ii(zu.mul(Oi(Eu,1)))),s=wa(ju.sub(e)).normalize(),i=Bi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Bi(Xo(i.x,0),i.y));const n=Ii(e.add(i.x.mul(s))).toVar(),o=Ii(s.abs().reciprocal()).toVar(),a=Ci(Ko(o.x,Ko(o.y,o.z))).toVar("delta");a.divAssign(wl("steps","float"));const u=Oi(wl("base","color"),0).toVar();return ic({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=sn("float","d").assign(t.sample(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),nc()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),Oi(u)}))(),super.setup(e)}}class Ag{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}setAnimationLoop(e){this._animationLoop=e}setContext(e){this._context=e}dispose(){this.stop()}}class Rg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().monitor)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;a?p=o.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}return e.index&&(t+="index,"),t}getMaterialCacheKey(){const{object:e,material:t}=this;let r=t.customProgramCacheKey();for(const e of function(e){const t=Object.keys(e);let r=Object.getPrototypeOf(e);for(;r;){const e=Object.getOwnPropertyDescriptors(r);for(const r in e)if(void 0!==e[r]){const s=e[r];s&&"function"==typeof s.get&&t.push(r)}r=Object.getPrototypeOf(r)}return t}(t)){if(/^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test(e))continue;const s=t[e];let i;if(null!==s){const e=typeof s;"number"===e?i=0!==s?"1":"0":"object"===e?(i="{",s.isTexture&&(i+=s.mapping),i+="}"):i=String(s)}else i=String(s);r+=i+","}return r+=this.clippingContextCacheKey+",",e.geometry&&(r+=this.getGeometryCacheKey()),e.skeleton&&(r+=e.skeleton.bones.length+","),e.morphTargetInfluences&&(r+=e.morphTargetInfluences.length+","),e.isBatchedMesh&&(r+=e._matricesTexture.uuid+",",null!==e._colorsTexture&&(r+=e._colorsTexture.uuid+",")),e.count>1&&(r+=e.uuid+","),r+=e.receiveShadow+",",us(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=this._nodes.getCacheKey(this.scene,this.lightsNode);return this.object.receiveShadow&&(e+=1),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const wg=[];class Mg{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,o,a){const u=this.getChainMap(a);wg[0]=e,wg[1]=t,wg[2]=n,wg[3]=i;let l=u.get(wg);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set(wg,l)):(l.updateClipping(o),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,o,a)):l.version=t.version)),l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Rg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new Eg(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Bg{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Ug=1,Fg=2,Pg=3,Ig=4,Lg=16;class Dg extends Bg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ug?this.backend.createAttribute(e):t===Fg?this.backend.createIndexAttribute(e):t===Pg?this.backend.createStorageAttribute(e):t===Ig&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ae:ue)(t,1);return i.version=Vg(e),i}class Gg extends Bg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Pg):this.updateAttribute(e,Ug);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Fg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ig)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Og(t),e.set(t,r)):r.version!==Vg(t)&&(this.attributes.delete(r),r=Og(t),e.set(t,r)),s=r}return s}}class kg{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.compute={calls:0,frameCalls:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}updateTimestamp(e,t){0===this[e].timestampCalls&&(this[e].timestamp=0),this[e].timestamp+=t,this[e].timestampCalls++,this[e].timestampCalls>=this[e].previousFrameCalls&&(this[e].timestampCalls=0)}reset(){const e=this.render.frameCalls;this.render.previousFrameCalls=e;const t=this.compute.frameCalls;this.compute.previousFrameCalls=t,this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class zg{constructor(e){this.cacheKey=e,this.usedTimes=0}}class $g extends zg{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Hg extends zg{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Wg=0;class jg{constructor(e,t,r=null,s=null){this.id=Wg++,this.code=e,this.stage=t,this.transforms=r,this.attributes=s,this.usedTimes=0}}class qg extends Bg{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new jg(n.computeShader,"compute",n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState();let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new jg(n.vertexShader,"vertex"),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let a=this.programs.fragment.get(n.fragmentShader);void 0===a&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),a=new jg(n.fragmentShader,"fragment"),this.programs.fragment.set(n.fragmentShader,a),r.createProgram(a));const u=this._getRenderCacheKey(e,o,a);let l=this.caches.get(u);void 0===l?(i&&0===i.usedTimes&&this._releasePipeline(i),l=this._getRenderPipeline(e,o,a,u,t)):e.pipeline=l,l.usedTimes++,o.usedTimes++,a.usedTimes++,s.pipeline=l}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Hg(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new $g(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Kg extends Bg{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ig:Pg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function Xg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Yg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Qg(e){return(e.transmission>0||e.transmissionNode)&&e.side===le&&!1===e.forceSinglePass}class Zg{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Xg),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Yg),this.transparent.length>1&&this.transparent.sort(t||Yg)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new B,l.format=e.stencilBuffer?de:ce,l.type=e.stencilBuffer?he:f,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=im){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===j||t===q||t===T||t===_}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class om extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class am extends rn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class um extends Ms{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new mi(t);return this._currentCond=Ta(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new mi(t),s=Ta(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new mi(e),this}build(e,...t){const r=Ni();vi(this);for(const t of this.nodes)t.build(e,"void");return vi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const lm=xi(um);class dm extends Ms{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),fm=(e,t)=>sa(kn(4,e.mul(Gn(1,e))),t),ym=_i((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),bm=_i((([e])=>Ii(ym(e.z.add(ym(e.y.mul(1)))),ym(e.z.add(ym(e.x.mul(1)))),ym(e.y.add(ym(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),xm=_i((([e,t,r])=>{const s=Ii(e).toVar(),i=Ci(1.4).toVar(),n=Ci(0).toVar(),o=Ii(s).toVar();return ic({start:Ci(0),end:Ci(3),type:"float",condition:"<="},(()=>{const e=Ii(bm(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Ci(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Ci(ym(s.z.add(ym(s.x.add(ym(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"p",type:"vec3"},{name:"spd",type:"float"},{name:"time",type:"float"}]});class Tm extends Ms{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const _m=xi(Tm),vm=e=>(...t)=>_m(e,...t),Nm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.time)),Sm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.deltaTime)),Am=tn(0,"uint").setGroup(Zi).onRenderUpdate((e=>e.frameId)),Rm=_i((([e,t,r=Bi(.5)])=>mg(e.sub(r),t).add(r))),Cm=_i((([e,t,r=Bi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Em=_i((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Du.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Du;const i=Au.mul(s);return pi(t)&&(i[0][0]=Du[0].length(),i[0][1]=0,i[0][2]=0),pi(r)&&(i[1][0]=0,i[1][1]=Du[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,Nu.mul(i).mul(qu)})),wm=_i((([e=null])=>{const t=$c();return $c(Ic(e)).sub(t).lessThan(0).select(xc,e)}));class Mm extends Ms{static get type(){return"SpriteSheetUVNode"}constructor(e,t=pu(),r=Ci(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Bi(o,a);return t.add(l).mul(u)}}const Bm=xi(Mm);class Um extends Ms{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Ci(1),i=qu,n=sl){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot(Ii(1)));const a=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=xu(d,a).mul(o.x),g=xu(c,u).mul(o.y),m=xu(h,l).mul(o.z);return On(p,g,m)}}const Fm=xi(Um),Pm=new me,Im=new r,Lm=new r,Dm=new r,Vm=new n,Om=new r(0,0,-1),Gm=new s,km=new r,zm=new r,$m=new s,Hm=new t,Wm=new ge,jm=xc.flipX();Wm.depthTexture=new B(1,1);let qm=!1;class Km extends bu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Wm.texture,jm),this._reflectorBaseNode=e.reflector||new Xm(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=fi(new Km({defaultTexture:Wm.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class Xm extends Ms{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new fe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?vs.RENDER:vs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Hm),e.setSize(Math.round(Hm.width*r),Math.round(Hm.height*r))}setup(e){return this._updateResolution(Wm,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ge(0,0,{type:ye}),!0===this.generateMipmaps&&(t.texture.minFilter=be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new B),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&qm)return;qm=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(Hm),this._updateResolution(a,s),Lm.setFromMatrixPosition(n.matrixWorld),Dm.setFromMatrixPosition(r.matrixWorld),Vm.extractRotation(n.matrixWorld),Im.set(0,0,1),Im.applyMatrix4(Vm),km.subVectors(Lm,Dm),km.dot(Im)>0)return;km.reflect(Im).negate(),km.add(Lm),Vm.extractRotation(r.matrixWorld),Om.set(0,0,-1),Om.applyMatrix4(Vm),Om.add(Dm),zm.subVectors(Lm,Om),zm.reflect(Im).negate(),zm.add(Lm),o.coordinateSystem=r.coordinateSystem,o.position.copy(km),o.up.set(0,1,0),o.up.applyMatrix4(Vm),o.up.reflect(Im),o.lookAt(zm),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Pm.setFromNormalAndCoplanarPoint(Im,Lm),Pm.applyMatrix4(o.matrixWorldInverse),Gm.set(Pm.normal.x,Pm.normal.y,Pm.normal.z,Pm.constant);const u=o.projectionMatrix;$m.x=(Math.sign(Gm.x)+u.elements[8])/u.elements[0],$m.y=(Math.sign(Gm.y)+u.elements[9])/u.elements[5],$m.z=-1,$m.w=(1+u.elements[10])/u.elements[14],Gm.multiplyScalar(1/Gm.dot($m));u.elements[2]=Gm.x,u.elements[6]=Gm.y,u.elements[10]=s.coordinateSystem===v?Gm.z-0:Gm.z+1-0,u.elements[14]=Gm.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const l=s.getRenderTarget(),d=s.getMRT();s.setMRT(null),s.setRenderTarget(a),s.render(t,o),s.setMRT(d),s.setRenderTarget(l),i.visible=!0,qm=!1}}const Ym=new xe(-1,1,1,-1,0,1);class Qm extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new _e([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new _e(t,2))}}const Zm=new Qm;class Jm extends k{constructor(e=null){super(Zm,e),this.camera=Ym,this.isQuadMesh=!0}renderAsync(e){return e.renderAsync(this,Ym)}render(e){e.render(this,Ym)}}const ef=new t;class tf extends bu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ye}){const i=new ge(t,r,s);super(i.texture,pu()),this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new Jm(new Yc),this.updateBeforeType=vs.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(ef);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new bu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const rf=(e,...t)=>fi(new tf(fi(e),...t)),sf=_i((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===v?(e=Bi(e.x,e.y.oneMinus()).mul(2).sub(1),i=Oi(Ii(e,t),1)):i=Oi(Ii(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Oi(r.mul(i));return n.xyz.div(n.w)})),nf=_i((([e,t])=>{const r=t.mul(Oi(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Bi(s.x,s.y.oneMinus())})),of=_i((([e,t,r])=>{const s=mu(Tu(t)),i=Ui(e.mul(s)).toVar(),n=Tu(t,i).toVar(),o=Tu(t,i.sub(Ui(2,0))).toVar(),a=Tu(t,i.sub(Ui(1,0))).toVar(),u=Tu(t,i.add(Ui(1,0))).toVar(),l=Tu(t,i.add(Ui(2,0))).toVar(),d=Tu(t,i.add(Ui(0,2))).toVar(),c=Tu(t,i.add(Ui(0,1))).toVar(),h=Tu(t,i.sub(Ui(0,1))).toVar(),p=Tu(t,i.sub(Ui(0,2))).toVar(),g=Po(Gn(Ci(2).mul(a).sub(o),n)).toVar(),m=Po(Gn(Ci(2).mul(u).sub(l),n)).toVar(),f=Po(Gn(Ci(2).mul(c).sub(d),n)).toVar(),y=Po(Gn(Ci(2).mul(h).sub(p),n)).toVar(),b=sf(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(sf(e.sub(Bi(Ci(1).div(s.x),0)),a,r)),b.negate().add(sf(e.add(Bi(Ci(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(sf(e.add(Bi(0,Ci(1).div(s.y))),c,r)),b.negate().add(sf(e.sub(Bi(0,Ci(1).div(s.y))),h,r)));return Ro(ra(x,T))}));class af extends R{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageInstancedBufferAttribute=!0}}class uf extends ve{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageBufferAttribute=!0}}class lf extends Bs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const df=xi(lf);class cf extends xl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=gs(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Ss.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this.bufferCount=r,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return df(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=qa(this.value),this._varying=wa(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const hf=(e,t,r)=>fi(new cf(e,t,r));class pf extends cu{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class gf extends Ms{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const mf=Ti(gf),ff=new Se,yf=new n;class bf extends Ms{static get type(){return"SceneNode"}constructor(e=bf.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===bf.BACKGROUND_BLURRINESS?s=Rl("backgroundBlurriness","float",r):t===bf.BACKGROUND_INTENSITY?s=Rl("backgroundIntensity","float",r):t===bf.BACKGROUND_ROTATION?s=tn("mat4").label("backgroundRotation").setGroup(Zi).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Ne?(ff.copy(r.backgroundRotation),ff.x*=-1,ff.y*=-1,ff.z*=-1,yf.makeRotationFromEuler(ff)):yf.identity(),yf})):console.error("THREE.SceneNode: Unknown scope:",t),s}}bf.BACKGROUND_BLURRINESS="backgroundBlurriness",bf.BACKGROUND_INTENSITY="backgroundIntensity",bf.BACKGROUND_ROTATION="backgroundRotation";const xf=Ti(bf,bf.BACKGROUND_BLURRINESS),Tf=Ti(bf,bf.BACKGROUND_INTENSITY),_f=Ti(bf,bf.BACKGROUND_ROTATION);class vf extends bu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Ss.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Ss.READ_WRITE)}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}toWriteOnly(){return this.setAccess(Ss.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const Nf=xi(vf);class Sf extends Al{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const Af=new WeakMap;class Rf extends Fs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=vs.OBJECT,this.updateAfterType=vs.OBJECT,this.previousModelWorldMatrix=tn(new n),this.previousProjectionMatrix=tn(new n).setGroup(Zi),this.previousCameraViewMatrix=tn(new n)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ef(r);this.previousModelWorldMatrix.value.copy(s);const i=Cf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new n,i.previousCameraViewMatrix=new n,i.currentProjectionMatrix=new n,i.currentCameraViewMatrix=new n,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Ef(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?Nu:tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul($u).mul(qu),s=this.previousProjectionMatrix.mul(t).mul(Ku),i=r.xy.div(r.w),n=s.xy.div(s.w);return Gn(i,n)}}function Cf(e){let t=Af.get(e);return void 0===t&&(t={},Af.set(e,t)),t}function Ef(e,t=0){const r=Cf(e);let s=r[t];return void 0===s&&(r[t]=s=new n),s}const wf=Ti(Rf),Mf=_i((([e,t])=>Ko(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Bf=_i((([e,t])=>Ko(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Uf=_i((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ff=_i((([e,t])=>da(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Qo(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Pf=_i((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Oi(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),If=_i((([e])=>Of(e.rgb))),Lf=_i((([e,t=Ci(1)])=>t.mix(Of(e.rgb),e.rgb))),Df=_i((([e,t=Ci(1)])=>{const r=On(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return da(e.rgb,s,i)})),Vf=_i((([e,t=Ci(1)])=>{const r=Ii(.57735,.57735,.57735),s=t.cos();return Ii(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(ta(r,e.rgb).mul(s.oneMinus())))))})),Of=(e,t=Ii(u.getLuminanceCoefficients(new r)))=>ta(e,t),Gf=_i((([e,t=Ii(1),s=Ii(0),i=Ii(1),n=Ci(1),o=Ii(u.getLuminanceCoefficients(new r,Ae))])=>{const a=e.rgb.dot(Ii(o)),l=Xo(e.rgb.mul(t).add(s),0).toVar(),d=l.pow(i).toVar();return Si(l.r.greaterThan(0),(()=>{l.r.assign(d.r)})),Si(l.g.greaterThan(0),(()=>{l.g.assign(d.g)})),Si(l.b.greaterThan(0),(()=>{l.b.assign(d.b)})),l.assign(a.add(l.sub(a).mul(n))),Oi(l.rgb,e.a)}));class kf extends Fs{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const zf=xi(kf),$f=new t;class Hf extends bu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Wf extends Hf{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class jf extends Fs{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new B;i.isRenderTargetTexture=!0,i.name="depth";const n=new ge(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ye,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=tn(0),this._cameraFar=tn(0),this._mrt=null,this.isPassNode=!0,this.updateBeforeType=vs.FRAME}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=fi(new Wf(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=fi(new Wf(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Oc(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Dc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.scope===jf.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize($f);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}jf.COLOR="color",jf.DEPTH="depth";class qf extends jf{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(jf.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Yc;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=x;const t=sl.negate(),r=Nu.mul($u),s=Ci(1),i=r.mul(Oi(qu,1)),n=r.mul(Oi(qu.add(t),1)),o=Ro(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Oi(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Kf=_i((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Xf=_i((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Yf=_i((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Qf=_i((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),Zf=_i((([e,t])=>{const r=Hi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Hi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Qf(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Jf=Hi(Ii(1.6605,-.1246,-.0182),Ii(-.5876,1.1329,-.1006),Ii(-.0728,-.0083,1.1187)),ey=Hi(Ii(.6274,.0691,.0164),Ii(.3293,.9195,.088),Ii(.0433,.0113,.8956)),ty=_i((([e])=>{const t=Ii(e).toVar(),r=Ii(t.mul(t)).toVar(),s=Ii(r.mul(r)).toVar();return Ci(15.5).mul(s.mul(r)).sub(kn(40.14,s.mul(t))).add(kn(31.96,s).sub(kn(6.868,r.mul(t))).add(kn(.4298,r).add(kn(.1191,t).sub(.00232))))})),ry=_i((([e,t])=>{const r=Ii(e).toVar(),s=Hi(Ii(.856627153315983,.137318972929847,.11189821299995),Ii(.0951212405381588,.761241990602591,.0767994186031903),Ii(.0482516061458583,.101439036467562,.811302368396859)),i=Hi(Ii(1.1271005818144368,-.1413297634984383,-.14132976349843826),Ii(-.11060664309660323,1.157823702216272,-.11060664309660294),Ii(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Ci(-12.47393),o=Ci(4.026069);return r.mulAssign(t),r.assign(ey.mul(r)),r.assign(s.mul(r)),r.assign(Xo(r,1e-10)),r.assign(_o(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(ca(r,0,1)),r.assign(ty(r)),r.assign(i.mul(r)),r.assign(sa(Xo(Ii(0),r),Ii(2.2))),r.assign(Jf.mul(r)),r.assign(ca(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),sy=_i((([e,t])=>{const r=Ci(.76),s=Ci(.15);e=e.mul(t);const i=Ko(e.r,Ko(e.g,e.b)),n=Ta(i.lessThan(.08),i.sub(kn(6.25,i.mul(i))),.04);e.subAssign(n);const o=Xo(e.r,Xo(e.g,e.b));Si(o.lessThan(r),(()=>e));const a=Gn(1,r),u=Gn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=Gn(1,zn(1,s.mul(o.sub(u)).add(1)));return da(e,Ii(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class iy extends Ms{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const ny=xi(iy);class oy extends iy{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const ay=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class uy extends Ms{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Ci()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=bs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const ly=xi(uy);class dy extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class cy{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const hy=new dy;class py extends Ms{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new dy,this._output=ly(),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=ly(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=ly(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new cy(this),t=hy.get("THREE"),r=hy.get("TSL"),s=this.getMethod(this.codeNode),i=[e,this._local,hy,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Ci()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return ls(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const gy=xi(py);class my extends Ms{static get type(){return"FogNode"}constructor(e,t){super("float"),this.isFogNode=!0,this.colorNode=e,this.factorNode=t}getViewZNode(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Qu.z).negate()}setup(){return this.factorNode}}const fy=xi(my);class yy extends my{static get type(){return"FogRangeNode"}constructor(e,t,r){super(e,null),this.isFogRangeNode=!0,this.nearNode=t,this.farNode=r}setup(e){const t=this.getViewZNode(e);return ga(this.nearNode,this.farNode,t)}}const by=xi(yy);class xy extends my{static get type(){return"FogExp2Node"}constructor(e,t){super(e,null),this.isFogExp2Node=!0,this.densityNode=t}setup(e){const t=this.getViewZNode(e),r=this.densityNode;return r.mul(r,t,t).negate().exp().oneMinus()}}const Ty=xi(xy);let _y=null,vy=null;class Ny extends Ms{static get type(){return"RangeNode"}constructor(e=Ci(),t=Ci()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(fs(this.minNode.value)),r=e.getTypeLength(fs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(fs(i)),u=e.getTypeLength(fs(n));_y=_y||new s,vy=vy||new s,_y.setScalar(0),vy.setScalar(0),1===o?_y.setScalar(i):i.isColor?_y.set(i.r,i.g,i.b):_y.set(i.x,i.y,i.z||0,i.w||0),1===u?vy.setScalar(n):n.isColor?vy.set(n.r,n.g,n.b):vy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;efi(new Ay(e,t)),Cy=Ry("numWorkgroups","uvec3"),Ey=Ry("workgroupId","uvec3"),wy=Ry("localId","uvec3"),My=Ry("subgroupSize","uint");const By=xi(class extends Ms{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Uy extends Bs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class Fy extends Ms{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.scope=e}label(e){return this.name=e,this}getHash(){return this.uuid}setScope(e){return this.scope=e,this}getInputType(){return`${this.scope}Array`}element(e){return fi(new Uy(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Py extends Fs{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Py.ATOMIC_LOAD="atomicLoad",Py.ATOMIC_STORE="atomicStore",Py.ATOMIC_ADD="atomicAdd",Py.ATOMIC_SUB="atomicSub",Py.ATOMIC_MAX="atomicMax",Py.ATOMIC_MIN="atomicMin",Py.ATOMIC_AND="atomicAnd",Py.ATOMIC_OR="atomicOr",Py.ATOMIC_XOR="atomicXor";const Iy=xi(Py),Ly=(e,t,r,s)=>{const i=Iy(e,t,r,s);return i.append(),i};let Dy;function Vy(e){Dy=Dy||new WeakMap;let t=Dy.get(e);return void 0===t&&Dy.set(e,t={}),t}function Oy(e){const t=Vy(e);return t.shadowMatrix||(t.shadowMatrix=tn("mat4").setGroup(Zi).onRenderUpdate((()=>(e.shadow.updateMatrices(e),e.shadow.matrix))))}function Gy(e){const t=Vy(e);if(void 0===t.projectionUV){const r=Oy(e).mul(Xu);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function ky(e){const t=Vy(e);return t.position||(t.position=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function zy(e){const t=Vy(e);return t.targetPosition||(t.targetPosition=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function $y(e){const t=Vy(e);return t.viewPosition||(t.viewPosition=tn(new r).setGroup(Zi).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Hy=e=>Au.transformDirection(ky(e).sub(zy(e))),Wy=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},jy=new WeakMap;class qy extends Ms{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Ii().toVar("totalDiffuse"),this.totalSpecularNode=Ii().toVar("totalSpecular"),this.outgoingLightNode=Ii().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[];for(let t=0;te.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(fi(e));else{let s=null;if(null!==r&&(s=Wy(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;jy.has(e)?s=jy.get(e):(s=fi(new r(e)),jy.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=Ii(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}const Ky=(e=[])=>fi(new qy).setLights(e);class Xy extends Ms{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=vs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({material:e}){Yy.assign(e.shadowPositionNode||Xu)}dispose(){this.updateBeforeType=vs.NONE}}const Yy=Ii().toVar("shadowWorldPosition"),Qy=new WeakMap,Zy=_i((([e,t,r])=>{let s=Xu.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Jy=e=>{let t=Qy.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Rl("near","float",t).setGroup(Zi),s=Rl("far","float",t).setGroup(Zi),i=Uu(e);return Zy(i,r,s)})(e):null;t=new Yc,t.colorNode=Oi(0,0,0,1),t.depthNode=r,t.isShadowNodeMaterial=!0,t.blending=D,t.name="ShadowMaterial",Qy.set(e,t)}return t},eb=_i((({depthTexture:e,shadowCoord:t})=>xu(e,t.xy).compare(t.z))),tb=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Rl("radius","float",r).setGroup(Zi),o=Bi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return On(s(t.xy.add(Bi(a,u)),t.z),s(t.xy.add(Bi(0,u)),t.z),s(t.xy.add(Bi(l,u)),t.z),s(t.xy.add(Bi(c,h)),t.z),s(t.xy.add(Bi(0,h)),t.z),s(t.xy.add(Bi(p,h)),t.z),s(t.xy.add(Bi(a,0)),t.z),s(t.xy.add(Bi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Bi(p,0)),t.z),s(t.xy.add(Bi(l,0)),t.z),s(t.xy.add(Bi(c,g)),t.z),s(t.xy.add(Bi(0,g)),t.z),s(t.xy.add(Bi(p,g)),t.z),s(t.xy.add(Bi(a,d)),t.z),s(t.xy.add(Bi(0,d)),t.z),s(t.xy.add(Bi(l,d)),t.z)).mul(1/17)})),rb=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Bi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Co(u.mul(i).add(.5));return u.subAssign(l.mul(n)),On(s(u,t.z),s(u.add(Bi(o,0)),t.z),s(u.add(Bi(0,a)),t.z),s(u.add(n),t.z),da(s(u.add(Bi(o.negate(),0)),t.z),s(u.add(Bi(o.mul(2),0)),t.z),l.x),da(s(u.add(Bi(o.negate(),a)),t.z),s(u.add(Bi(o.mul(2),a)),t.z),l.x),da(s(u.add(Bi(0,a.negate())),t.z),s(u.add(Bi(0,a.mul(2))),t.z),l.y),da(s(u.add(Bi(o,a.negate())),t.z),s(u.add(Bi(o,a.mul(2))),t.z),l.y),da(da(s(u.add(Bi(o.negate(),a.negate())),t.z),s(u.add(Bi(o.mul(2),a.negate())),t.z),l.x),da(s(u.add(Bi(o.negate(),a.mul(2))),t.z),s(u.add(Bi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),sb=_i((({depthTexture:e,shadowCoord:t})=>{const r=Ci(1).toVar(),s=xu(e).sample(t.xy).rg,i=Qo(t.z,s.x);return Si(i.notEqual(Ci(1)),(()=>{const e=t.z.sub(s.x),n=Xo(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=ca(Gn(o,.3).div(.95-.3)),r.assign(ca(Xo(i,o)))})),r})),ib=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.sample(On(_c.xy,Bi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),nb=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.sample(On(_c.xy,Bi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(On(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),ob=[eb,tb,rb,sb],ab=new Jm;class ub extends Xy{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(o,Ci(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Rl("bias","float",r).setGroup(Zi);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===v&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=Rl("near","float",r.camera).setGroup(Zi),s=Rl("far","float",r.camera).setGroup(Zi);n=Gc(e.negate(),t,s)}return o=Ii(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return ob[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new B(s.mapSize.width,s.mapSize.height);n.compareFunction=Re;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===Ce){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye});const t=xu(n),r=xu(this.vsmShadowMapVertical.texture),i=Rl("blurSamples","float",s).setGroup(Zi),o=Rl("radius","float",s).setGroup(Zi),a=Rl("mapSize","vec2",s).setGroup(Zi);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Yc);u.fragmentNode=ib({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Yc),u.fragmentNode=nb({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=Rl("intensity","float",s).setGroup(Zi),u=Rl("normalBias","float",s).setGroup(Zi),l=Oy(r).mul(Yy.add(ul.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ce?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=xu(o.texture,d),m=da(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return _i((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}renderShadow(e){const{shadow:t,shadowMap:r}=this,{renderer:s,scene:i}=e;r.setSize(t.mapSize.width,t.mapSize.height),s.render(i,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=n.overrideMaterial;n.overrideMaterial=Jy(r),s.camera.layers.mask=o.layers.mask;const d=i.getRenderTarget(),c=i.getRenderObjectFunction(),h=i.getMRT();i.setMRT(null),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&a===Ce)&&(e.onBeforeShadow(i,e,o,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,o,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(c),!0!==r.isPointLight&&a===Ce&&this.vsmPass(i),i.setRenderTarget(d),i.setMRT(h),n.overrideMaterial=l}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),ab.material=this.vsmMaterialVertical,ab.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),ab.material=this.vsmMaterialHorizontal,ab.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const lb=(e,t)=>fi(new ub(e,t));class db extends cc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||tn(this.color).setGroup(Zi),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=vs.FRAME}customCacheKey(){return ds(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return lb(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?fi(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const cb=_i((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),hb=new e,pb=_i((([e,t])=>{const r=e.toVar(),s=Po(r),i=zn(1,Xo(s.x,Xo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Bi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Si(s.z.greaterThanEqual(o),(()=>{Si(r.z.greaterThan(0),(()=>{n.x.assign(Gn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=Io(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=Io(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Bi(.125,.25).mul(n).add(Bi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),gb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>xu(e,pb(t,s.y)).compare(r))),mb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Rl("radius","float",i).setGroup(Zi),o=Bi(-1,1).mul(n).mul(s.y);return xu(e,pb(t.add(o.xyy),s.y)).compare(r).add(xu(e,pb(t.add(o.yyy),s.y)).compare(r)).add(xu(e,pb(t.add(o.xyx),s.y)).compare(r)).add(xu(e,pb(t.add(o.yyx),s.y)).compare(r)).add(xu(e,pb(t,s.y)).compare(r)).add(xu(e,pb(t.add(o.xxy),s.y)).compare(r)).add(xu(e,pb(t.add(o.yxy),s.y)).compare(r)).add(xu(e,pb(t.add(o.xxx),s.y)).compare(r)).add(xu(e,pb(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),fb=_i((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.near)),a=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.far)),u=Rl("bias","float",s).setGroup(Zi),l=tn(s.mapSize).setGroup(Zi),d=Ci(1).toVar();return Si(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Bi(1).div(l.mul(Bi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),yb=new s,bb=new t,xb=new t;class Tb extends ub{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===we?gb:mb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return fb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();xb.copy(t.mapSize),xb.multiply(o),r.setSize(xb.width,xb.height),bb.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(hb),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(Qu),a=o.normalize(),u=o.length(),l=cb({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class vb extends db{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>fi(new Tb(e,t)))(this.light)}setup(e){super.setup(e),_b({color:this.colorNode,lightViewPosition:$y(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const Nb=_i((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),Sb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Mi(e).toVar();return Ta(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Ab=_i((([e,t])=>{const r=Mi(t).toVar(),s=Ci(e).toVar();return Ta(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Rb=_i((([e])=>{const t=Ci(e).toVar();return Ei(So(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),Cb=_i((([e,t])=>{const r=Ci(e).toVar();return t.assign(Rb(r)),r.sub(Ci(t))})),Eb=vm([_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ci(s).toVar(),l=Ci(r).toVar(),d=Ci(t).toVar(),c=Ci(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ii(s).toVar(),l=Ii(r).toVar(),d=Ii(t).toVar(),c=Ii(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),wb=vm([_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ci(a).toVar(),m=Ci(o).toVar(),f=Ci(n).toVar(),y=Ci(i).toVar(),b=Ci(s).toVar(),x=Ci(r).toVar(),T=Ci(t).toVar(),_=Ci(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ii(a).toVar(),m=Ii(o).toVar(),f=Ii(n).toVar(),y=Ii(i).toVar(),b=Ii(s).toVar(),x=Ii(r).toVar(),T=Ii(t).toVar(),_=Ii(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Mb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=wi(e).toVar(),o=wi(n.bitAnd(wi(7))).toVar(),a=Ci(Sb(o.lessThan(wi(4)),i,s)).toVar(),u=Ci(kn(2,Sb(o.lessThan(wi(4)),s,i))).toVar();return Ab(a,Mi(o.bitAnd(wi(1)))).add(Ab(u,Mi(o.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Bb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=wi(e).toVar(),u=wi(a.bitAnd(wi(15))).toVar(),l=Ci(Sb(u.lessThan(wi(8)),o,n)).toVar(),d=Ci(Sb(u.lessThan(wi(4)),n,Sb(u.equal(wi(12)).or(u.equal(wi(14))),o,i))).toVar();return Ab(l,Mi(u.bitAnd(wi(1)))).add(Ab(d,Mi(u.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Ub=vm([Mb,Bb]),Fb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Di(e).toVar();return Ii(Ub(n.x,i,s),Ub(n.y,i,s),Ub(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Pb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=Di(e).toVar();return Ii(Ub(a.x,o,n,i),Ub(a.y,o,n,i),Ub(a.z,o,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Ib=vm([Fb,Pb]),Lb=_i((([e])=>{const t=Ci(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Db=_i((([e])=>{const t=Ci(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Vb=vm([Lb,_i((([e])=>{const t=Ii(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Ob=vm([Db,_i((([e])=>{const t=Ii(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Gb=_i((([e,t])=>{const r=Ei(t).toVar(),s=wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Ei(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),kb=_i((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Gb(r,Ei(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Gb(e,Ei(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Gb(t,Ei(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Gb(r,Ei(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Gb(e,Ei(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Gb(t,Ei(4))),t.addAssign(e)})),zb=_i((([e,t,r])=>{const s=wi(r).toVar(),i=wi(t).toVar(),n=wi(e).toVar();return s.bitXorAssign(i),s.subAssign(Gb(i,Ei(14))),n.bitXorAssign(s),n.subAssign(Gb(s,Ei(11))),i.bitXorAssign(n),i.subAssign(Gb(n,Ei(25))),s.bitXorAssign(i),s.subAssign(Gb(i,Ei(16))),n.bitXorAssign(s),n.subAssign(Gb(s,Ei(4))),i.bitXorAssign(n),i.subAssign(Gb(n,Ei(14))),s.bitXorAssign(i),s.subAssign(Gb(i,Ei(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),$b=_i((([e])=>{const t=wi(e).toVar();return Ci(t).div(Ci(wi(Ei(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Hb=_i((([e])=>{const t=Ci(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Wb=vm([_i((([e])=>{const t=Ei(e).toVar(),r=wi(wi(1)).toVar(),s=wi(wi(Ei(3735928559)).add(r.shiftLeft(wi(2))).add(wi(13))).toVar();return zb(s.add(wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi(wi(2)).toVar(),n=wi().toVar(),o=wi().toVar(),a=wi().toVar();return n.assign(o.assign(a.assign(wi(Ei(3735928559)).add(i.shiftLeft(wi(2))).add(wi(13))))),n.addAssign(wi(s)),o.addAssign(wi(r)),zb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi(wi(3)).toVar(),a=wi().toVar(),u=wi().toVar(),l=wi().toVar();return a.assign(u.assign(l.assign(wi(Ei(3735928559)).add(o.shiftLeft(wi(2))).add(wi(13))))),a.addAssign(wi(n)),u.addAssign(wi(i)),l.addAssign(wi(s)),zb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),_i((([e,t,r,s])=>{const i=Ei(s).toVar(),n=Ei(r).toVar(),o=Ei(t).toVar(),a=Ei(e).toVar(),u=wi(wi(4)).toVar(),l=wi().toVar(),d=wi().toVar(),c=wi().toVar();return l.assign(d.assign(c.assign(wi(Ei(3735928559)).add(u.shiftLeft(wi(2))).add(wi(13))))),l.addAssign(wi(a)),d.addAssign(wi(o)),c.addAssign(wi(n)),kb(l,d,c),l.addAssign(wi(i)),zb(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),_i((([e,t,r,s,i])=>{const n=Ei(i).toVar(),o=Ei(s).toVar(),a=Ei(r).toVar(),u=Ei(t).toVar(),l=Ei(e).toVar(),d=wi(wi(5)).toVar(),c=wi().toVar(),h=wi().toVar(),p=wi().toVar();return c.assign(h.assign(p.assign(wi(Ei(3735928559)).add(d.shiftLeft(wi(2))).add(wi(13))))),c.addAssign(wi(l)),h.addAssign(wi(u)),p.addAssign(wi(a)),kb(c,h,p),c.addAssign(wi(o)),h.addAssign(wi(n)),zb(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),jb=vm([_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi(Wb(s,r)).toVar(),n=Di().toVar();return n.x.assign(i.bitAnd(Ei(255))),n.y.assign(i.shiftRight(Ei(8)).bitAnd(Ei(255))),n.z.assign(i.shiftRight(Ei(16)).bitAnd(Ei(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi(Wb(n,i,s)).toVar(),a=Di().toVar();return a.x.assign(o.bitAnd(Ei(255))),a.y.assign(o.shiftRight(Ei(8)).bitAnd(Ei(255))),a.z.assign(o.shiftRight(Ei(16)).bitAnd(Ei(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),qb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Cb(t.x,r)).toVar(),n=Ci(Cb(t.y,s)).toVar(),o=Ci(Hb(i)).toVar(),a=Ci(Hb(n)).toVar(),u=Ci(Eb(Ub(Wb(r,s),i,n),Ub(Wb(r.add(Ei(1)),s),i.sub(1),n),Ub(Wb(r,s.add(Ei(1))),i,n.sub(1)),Ub(Wb(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Vb(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Cb(t.x,r)).toVar(),o=Ci(Cb(t.y,s)).toVar(),a=Ci(Cb(t.z,i)).toVar(),u=Ci(Hb(n)).toVar(),l=Ci(Hb(o)).toVar(),d=Ci(Hb(a)).toVar(),c=Ci(wb(Ub(Wb(r,s,i),n,o,a),Ub(Wb(r.add(Ei(1)),s,i),n.sub(1),o,a),Ub(Wb(r,s.add(Ei(1)),i),n,o.sub(1),a),Ub(Wb(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Ub(Wb(r,s,i.add(Ei(1))),n,o,a.sub(1)),Ub(Wb(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Ub(Wb(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Ub(Wb(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Ob(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Kb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Cb(t.x,r)).toVar(),n=Ci(Cb(t.y,s)).toVar(),o=Ci(Hb(i)).toVar(),a=Ci(Hb(n)).toVar(),u=Ii(Eb(Ib(jb(r,s),i,n),Ib(jb(r.add(Ei(1)),s),i.sub(1),n),Ib(jb(r,s.add(Ei(1))),i,n.sub(1)),Ib(jb(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Vb(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Cb(t.x,r)).toVar(),o=Ci(Cb(t.y,s)).toVar(),a=Ci(Cb(t.z,i)).toVar(),u=Ci(Hb(n)).toVar(),l=Ci(Hb(o)).toVar(),d=Ci(Hb(a)).toVar(),c=Ii(wb(Ib(jb(r,s,i),n,o,a),Ib(jb(r.add(Ei(1)),s,i),n.sub(1),o,a),Ib(jb(r,s.add(Ei(1)),i),n,o.sub(1),a),Ib(jb(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Ib(jb(r,s,i.add(Ei(1))),n,o,a.sub(1)),Ib(jb(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Ib(jb(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Ib(jb(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Ob(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Xb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Rb(t)).toVar();return $b(Wb(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar();return $b(Wb(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar();return $b(Wb(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar(),n=Ei(Rb(t.w)).toVar();return $b(Wb(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Yb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Rb(t)).toVar();return Ii($b(Wb(r,Ei(0))),$b(Wb(r,Ei(1))),$b(Wb(r,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar();return Ii($b(Wb(r,s,Ei(0))),$b(Wb(r,s,Ei(1))),$b(Wb(r,s,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar();return Ii($b(Wb(r,s,i,Ei(0))),$b(Wb(r,s,i,Ei(1))),$b(Wb(r,s,i,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar(),n=Ei(Rb(t.w)).toVar();return Ii($b(Wb(r,s,i,n,Ei(0))),$b(Wb(r,s,i,n,Ei(1))),$b(Wb(r,s,i,n,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Qb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ci(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(qb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Zb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(Kb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Jb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar();return Bi(Qb(a,o,n,i),Qb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),ex=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(Zb(a,o,n,i)).toVar(),l=Ci(Qb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i)).toVar();return Oi(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),tx=vm([_i((([e,t,r,s,i,n,o])=>{const a=Ei(o).toVar(),u=Ci(n).toVar(),l=Ei(i).toVar(),d=Ei(s).toVar(),c=Ei(r).toVar(),h=Ei(t).toVar(),p=Bi(e).toVar(),g=Ii(Yb(Bi(h.add(d),c.add(l)))).toVar(),m=Bi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Bi(Bi(Ci(h),Ci(c)).add(m)).toVar(),y=Bi(f.sub(p)).toVar();return Si(a.equal(Ei(2)),(()=>Po(y.x).add(Po(y.y)))),Si(a.equal(Ei(3)),(()=>Xo(Po(y.x),Po(y.y)))),ta(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),_i((([e,t,r,s,i,n,o,a,u])=>{const l=Ei(u).toVar(),d=Ci(a).toVar(),c=Ei(o).toVar(),h=Ei(n).toVar(),p=Ei(i).toVar(),g=Ei(s).toVar(),m=Ei(r).toVar(),f=Ei(t).toVar(),y=Ii(e).toVar(),b=Ii(Yb(Ii(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Ii(Ii(Ci(f),Ci(m),Ci(g)).add(b)).toVar(),T=Ii(x.sub(y)).toVar();return Si(l.equal(Ei(2)),(()=>Po(T.x).add(Po(T.y)).add(Po(T.z)))),Si(l.equal(Ei(3)),(()=>Xo(Xo(Po(T.x),Po(T.y)),Po(T.z)))),ta(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),rx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Cb(n.x,o),Cb(n.y,a)).toVar(),l=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(tx(u,e,t,o,a,i,s)).toVar();l.assign(Ko(l,r))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),sx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Cb(n.x,o),Cb(n.y,a)).toVar(),l=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(tx(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),ix=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Cb(n.x,o),Cb(n.y,a)).toVar(),l=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(tx(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),nx=vm([rx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Cb(n.x,o),Cb(n.y,a),Cb(n.z,u)).toVar(),d=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(tx(l,e,t,r,o,a,u,i,s)).toVar();d.assign(Ko(d,n))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ox=vm([sx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Cb(n.x,o),Cb(n.y,a),Cb(n.z,u)).toVar(),d=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(tx(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ax=vm([ix,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Cb(n.x,o),Cb(n.y,a),Cb(n.z,u)).toVar(),d=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(tx(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ux=_i((([e])=>{const t=e.y,r=e.z,s=Ii().toVar();return Si(t.lessThan(1e-4),(()=>{s.assign(Ii(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(So(i)).mul(6).toVar();const n=Ei($o(i)),o=i.sub(Ci(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Si(n.equal(Ei(0)),(()=>{s.assign(Ii(r,l,a))})).ElseIf(n.equal(Ei(1)),(()=>{s.assign(Ii(u,r,a))})).ElseIf(n.equal(Ei(2)),(()=>{s.assign(Ii(a,r,l))})).ElseIf(n.equal(Ei(3)),(()=>{s.assign(Ii(a,u,r))})).ElseIf(n.equal(Ei(4)),(()=>{s.assign(Ii(l,a,r))})).Else((()=>{s.assign(Ii(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),lx=_i((([e])=>{const t=Ii(e).toVar(),r=Ci(t.x).toVar(),s=Ci(t.y).toVar(),i=Ci(t.z).toVar(),n=Ci(Ko(r,Ko(s,i))).toVar(),o=Ci(Xo(r,Xo(s,i))).toVar(),a=Ci(o.sub(n)).toVar(),u=Ci().toVar(),l=Ci().toVar(),d=Ci().toVar();return d.assign(o),Si(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Si(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Si(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(On(2,i.sub(r).div(a)))})).Else((()=>{u.assign(On(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Si(u.lessThan(0),(()=>{u.addAssign(1)}))})),Ii(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),dx=_i((([e])=>{const t=Ii(e).toVar(),r=Vi(qn(t,Ii(.04045))).toVar(),s=Ii(t.div(12.92)).toVar(),i=Ii(sa(Xo(t.add(Ii(.055)),Ii(0)).div(1.055),Ii(2.4))).toVar();return da(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),cx=(e,t)=>{e=Ci(e),t=Ci(t);const r=Bi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ga(e.sub(r),e.add(r),t)},hx=(e,t,r,s)=>da(e,t,r[s].clamp()),px=(e,t,r,s,i)=>da(e,t,cx(r,s[i])),gx=_i((([e,t,r])=>{const s=Ro(e).toVar("nDir"),i=Gn(Ci(.5).mul(t.sub(r)),Xu).div(s).toVar("rbmax"),n=Gn(Ci(-.5).mul(t.sub(r)),Xu).div(s).toVar("rbmin"),o=Ii().toVar("rbminmax");o.x=s.x.greaterThan(Ci(0)).select(i.x,n.x),o.y=s.y.greaterThan(Ci(0)).select(i.y,n.y),o.z=s.z.greaterThan(Ci(0)).select(i.z,n.z);const a=Ko(Ko(o.x,o.y),o.z).toVar("correction");return Xu.add(s.mul(a)).toVar("boxIntersection").sub(r)})),mx=_i((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(kn(r,r).sub(kn(s,s)))),n}));var fx=Object.freeze({__proto__:null,BRDF_GGX:kh,BRDF_Lambert:Rh,BasicShadowFilter:eb,Break:nc,Continue:()=>au("continue").append(),DFGApprox:zh,D_GGX:Vh,Discard:uu,EPSILON:uo,F_Schlick:Ah,Fn:_i,INFINITY:lo,If:Si,Loop:ic,NodeAccess:Ss,NodeShaderStage:_s,NodeType:Ns,NodeUpdateType:vs,PCFShadowFilter:tb,PCFSoftShadowFilter:rb,PI:co,PI2:ho,Return:()=>au("return").append(),Schlick_to_F0:Hh,ScriptableNodeResources:hy,ShaderNode:mi,TBNViewMatrix:$l,VSMShadowFilter:sb,V_GGX_SmithCorrelated:Lh,abs:Po,acesFilmicToneMapping:Zf,acos:Uo,add:On,addMethodChaining:$s,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:ry,all:po,alphaT:yn,and:Yn,anisotropy:bn,anisotropyB:Tn,anisotropyT:xn,any:go,append:Ai,arrayBuffer:e=>fi(new Gs(e,"ArrayBuffer")),asin:Bo,assign:In,atan:Fo,atan2:qo,atomicAdd:(e,t,r=null)=>Ly(Py.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Ly(Py.ATOMIC_AND,e,t,r),atomicFunc:Ly,atomicMax:(e,t,r=null)=>Ly(Py.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Ly(Py.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Ly(Py.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Ly(Py.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Ly(Py.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Ly(Py.ATOMIC_XOR,e,t,r),attenuationColor:Un,attenuationDistance:Bn,attribute:hu,attributeArray:(e,t="float")=>{const r=ms(t),s=new uf(e,r);return hf(s,t,e)},backgroundBlurriness:xf,backgroundIntensity:Tf,backgroundRotation:_f,batch:Jd,billboarding:Em,bitAnd:eo,bitNot:to,bitOr:ro,bitXor:so,bitangentGeometry:Dl,bitangentLocal:Vl,bitangentView:Ol,bitangentWorld:Gl,bitcast:Wo,blendBurn:Mf,blendColor:Pf,blendDodge:Bf,blendOverlay:Ff,blendScreen:Uf,blur:zp,bool:Mi,buffer:Tl,bufferAttribute:qa,bumpMap:Zl,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Mf(e)),bvec2:Pi,bvec3:Vi,bvec4:zi,bypass:ru,cache:eu,call:Dn,cameraFar:vu,cameraNear:_u,cameraNormalMatrix:Cu,cameraPosition:Eu,cameraProjectionMatrix:Nu,cameraProjectionMatrixInverse:Su,cameraViewMatrix:Au,cameraWorldMatrix:Ru,cbrt:ua,cdl:Gf,ceil:Ao,checker:Nb,cineonToneMapping:Yf,clamp:ca,clearcoat:dn,clearcoatRoughness:cn,code:ny,color:Ri,colorSpaceToWorking:Va,colorToDirection:e=>fi(e).mul(2).sub(1),compute:Za,cond:_a,context:Na,convert:qi,convertColorSpace:(e,t,r)=>fi(new Pa(fi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():rf(e,...t),cos:wo,cross:ra,cubeTexture:bl,dFdx:Oo,dFdy:Go,dashSize:An,defaultBuildStages:Rs,defaultShaderStages:As,defined:pi,degrees:yo,deltaTime:Sm,densityFog:Ty,depth:zc,depthPass:(e,t)=>fi(new jf(jf.DEPTH,e,t)),difference:ea,diffuseColor:on,directPointLight:_b,directionToColor:uh,dispersion:Fn,distance:Jo,div:zn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Bf(e)),dot:ta,drawIndex:qd,dynamicBufferAttribute:Ka,element:ji,emissive:an,equal:Hn,equals:mo,equirectUV:hh,exp:bo,exp2:xo,expression:au,faceDirection:tl,faceForward:ma,float:Ci,floor:So,fog:fy,fract:Co,frameGroup:Qi,frameId:Am,frontFacing:el,fwidth:Ho,gain:(e,t)=>e.lessThan(.5)?fm(e.mul(2),t).div(2):Gn(1,fm(kn(Gn(1,e),2),t).div(2)),gapSize:Rn,getConstNodeType:gi,getCurrentStack:Ni,getDirection:Vp,getDistanceAttenuation:cb,getGeometryRoughness:Ph,getNormalFromDepth:of,getParallaxCorrectNormal:gx,getRoughness:Ih,getScreenPosition:nf,getShIrradianceAt:mx,getTextureIndex:hm,getViewPosition:sf,glsl:(e,t)=>ny(e,t,"glsl"),glslFn:(e,t)=>ay(e,t,"glsl"),grayscale:If,greaterThan:qn,greaterThanEqual:Xn,hash:mm,highPrecisionModelNormalViewMatrix:Wu,highPrecisionModelViewMatrix:Hu,hue:Vf,instance:Xd,instanceIndex:$d,instancedArray:(e,t="float")=>{const r=ms(t),s=new af(e,r);return hf(s,t,e)},instancedBufferAttribute:Xa,instancedDynamicBufferAttribute:Ya,instancedMesh:Qd,int:Ei,inverseSqrt:No,invocationLocalIndex:jd,invocationSubgroupIndex:Wd,ior:En,iridescence:gn,iridescenceIOR:mn,iridescenceThickness:fn,ivec2:Ui,ivec3:Li,ivec4:Gi,js:(e,t)=>ny(e,t,"js"),label:Sa,length:Lo,lengthSq:la,lessThan:jn,lessThanEqual:Kn,lightPosition:ky,lightProjectionUV:Gy,lightShadowMatrix:Oy,lightTargetDirection:Hy,lightTargetPosition:zy,lightViewPosition:$y,lightingContext:gc,lights:Ky,linearDepth:$c,linearToneMapping:Kf,localId:wy,log:To,log2:_o,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(To(r.div(t)));return Ci(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),ic(...e)),luminance:Of,mat2:$i,mat3:Hi,mat4:Wi,matcapUV:lg,materialAOMap:Dd,materialAlphaTest:td,materialAnisotropy:Td,materialAnisotropyVector:Vd,materialAttenuationColor:Ed,materialAttenuationDistance:Cd,materialClearcoat:gd,materialClearcoatNormal:fd,materialClearcoatRoughness:md,materialColor:rd,materialDispersion:Id,materialEmissive:id,materialIOR:Rd,materialIridescence:_d,materialIridescenceIOR:vd,materialIridescenceThickness:Nd,materialLightMap:Ld,materialLineDashOffset:Fd,materialLineDashSize:Md,materialLineGapSize:Bd,materialLineScale:wd,materialLineWidth:Ud,materialMetalness:hd,materialNormal:pd,materialOpacity:nd,materialPointWidth:Pd,materialReference:wl,materialReflectivity:dd,materialRefractionRatio:hl,materialRotation:yd,materialRoughness:cd,materialSheen:bd,materialSheenRoughness:xd,materialShininess:sd,materialSpecular:od,materialSpecularColor:ud,materialSpecularIntensity:ad,materialSpecularStrength:ld,materialThickness:Ad,materialTransmission:Sd,max:Xo,maxMipLevel:yu,metalness:ln,min:Ko,mix:da,mixElement:ya,mod:Yo,modInt:$n,modelDirection:Lu,modelNormalMatrix:ku,modelPosition:Vu,modelScale:Ou,modelViewMatrix:$u,modelViewPosition:Gu,modelViewProjection:Gd,modelWorldMatrix:Du,modelWorldMatrixInverse:zu,morphReference:dc,mrt:gm,mul:kn,mx_aastep:cx,mx_cell_noise_float:(e=pu())=>Xb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Ci(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=pu(),t=3,r=2,s=.5,i=1)=>Qb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec2:(e=pu(),t=3,r=2,s=.5,i=1)=>Jb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec3:(e=pu(),t=3,r=2,s=.5,i=1)=>Zb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec4:(e=pu(),t=3,r=2,s=.5,i=1)=>ex(e,Ei(t),r,s).mul(i),mx_hsvtorgb:ux,mx_noise_float:(e=pu(),t=1,r=0)=>qb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=pu(),t=1,r=0)=>Kb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=pu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Oi(Kb(e),qb(e.add(Bi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=pu())=>hx(e,t,r,"x"),mx_ramptb:(e,t,r=pu())=>hx(e,t,r,"y"),mx_rgbtohsv:lx,mx_safepower:(e,t=1)=>(e=Ci(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=pu())=>px(e,t,r,s,"x"),mx_splittb:(e,t,r,s=pu())=>px(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:dx,mx_transform_uv:(e=1,t=0,r=pu())=>r.mul(e).add(t),mx_worley_noise_float:(e=pu(),t=1)=>nx(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec2:(e=pu(),t=1)=>ox(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec3:(e=pu(),t=1)=>ax(e.convert("vec2|vec3"),t,Ei(1)),negate:Do,neutralToneMapping:sy,nodeArray:bi,nodeImmutable:Ti,nodeObject:fi,nodeObjects:yi,nodeProxy:xi,normalFlat:il,normalGeometry:rl,normalLocal:sl,normalMap:Kl,normalView:nl,normalWorld:ol,normalize:Ro,not:Zn,notEqual:Wn,numWorkgroups:Cy,objectDirection:Mu,objectGroup:Ji,objectPosition:Uu,objectScale:Fu,objectViewPosition:Pu,objectWorldMatrix:Bu,oneMinus:Vo,or:Qn,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Nm)=>e.fract(),oscSine:(e=Nm)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Nm)=>e.fract().round(),oscTriangle:(e=Nm)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Sn,outputStruct:cm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Ff(e)),overloadingFn:vm,parabola:fm,parallaxDirection:Hl,parallaxUV:(e,t)=>e.sub(Hl.mul(t)),parameter:(e,t)=>fi(new am(e,t)),pass:(e,t,r)=>fi(new jf(jf.COLOR,e,t,r)),passTexture:(e,t)=>fi(new Hf(e,t)),pcurve:(e,t,r)=>sa(zn(sa(e,t),On(sa(e,t),sa(Gn(1,e),r))),1/t),perspectiveDepthToViewZ:Oc,pmremTexture:qp,pointUV:mf,pointWidth:Cn,positionGeometry:ju,positionLocal:qu,positionPrevious:Ku,positionView:Qu,positionViewDirection:Zu,positionWorld:Xu,positionWorldDirection:Yu,posterize:zf,pow:sa,pow2:ia,pow3:na,pow4:oa,property:sn,radians:fo,rand:fa,range:Sy,rangeFog:by,reciprocal:zo,reference:Rl,referenceBuffer:Cl,reflect:Zo,reflectVector:ml,reflectView:pl,reflector:e=>fi(new Km(e)),refract:pa,refractVector:fl,refractView:gl,reinhardToneMapping:Xf,remainder:oo,remap:iu,remapClamp:nu,renderGroup:Zi,renderOutput:du,rendererReference:za,rotate:mg,rotateUV:Rm,roughness:un,round:ko,rtt:rf,sRGBTransferEOTF:Ma,sRGBTransferOETF:Ba,sampler:e=>(!0===e.isNode?e:xu(e)).convert("sampler"),saturate:ha,saturation:Lf,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Uf(e)),screenCoordinate:_c,screenSize:Tc,screenUV:xc,scriptable:gy,scriptableValue:ly,select:Ta,setCurrentStack:vi,shaderStages:Cs,shadow:lb,sharedUniformGroup:Yi,sheen:hn,sheenRoughness:pn,shiftLeft:io,shiftRight:no,shininess:Nn,sign:Io,sin:Eo,sinc:(e,t)=>Eo(co.mul(t.mul(e).sub(1))).div(co.mul(t.mul(e).sub(1))),skinning:e=>fi(new tc(e)),skinningReference:rc,smoothstep:ga,smoothstepElement:ba,specularColor:_n,specularF90:vn,spherizeUV:Cm,split:(e,t)=>fi(new Ls(fi(e),t)),spritesheetUV:Bm,sqrt:vo,stack:lm,step:Qo,storage:hf,storageBarrier:()=>By("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),hf(e,t,r).setPBO(!0)),storageTexture:Nf,string:(e="")=>fi(new Gs(e,"string")),sub:Gn,subgroupIndex:Hd,subgroupSize:My,tan:Mo,tangentGeometry:Ml,tangentLocal:Bl,tangentView:Ul,tangentWorld:Fl,temp:Ca,texture:xu,texture3D:Ng,textureBarrier:()=>By("texture").append(),textureBicubic:up,textureCubeUV:Op,textureLoad:Tu,textureSize:mu,textureStore:(e,t,r)=>{const s=Nf(e,t,r);return null!==r&&s.append(),s},thickness:Mn,time:Nm,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Sm.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Nm.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Nm.mul(e)),toOutputColorSpace:Ia,toWorkingColorSpace:La,toneMapping:Ha,toneMappingExposure:Wa,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>fi(new qf(t,r,fi(s),fi(i),fi(n))),transformDirection:aa,transformNormal:dl,transformNormalToView:cl,transformedBentNormalView:Wl,transformedBitangentView:kl,transformedBitangentWorld:zl,transformedClearcoatNormalView:ll,transformedNormalView:al,transformedNormalWorld:ul,transformedTangentView:Pl,transformedTangentWorld:Il,transmission:wn,transpose:jo,tri:ym,tri3:bm,triNoise3D:xm,triplanarTexture:(...e)=>Fm(...e),triplanarTextures:Fm,trunc:$o,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),_i(...e)),uint:wi,uniform:tn,uniformArray:Nl,uniformGroup:Xi,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),fi(new vl(e,t))),userData:(e,t,r)=>fi(new Sf(e,t,r)),uv:pu,uvec2:Fi,uvec3:Di,uvec4:ki,varying:wa,varyingProperty:nn,vec2:Bi,vec3:Ii,vec4:Oi,vectorComponents:Es,velocity:wf,vertexColor:(...e)=>fi(new pf(...e)),vertexIndex:zd,vibrance:Df,viewZToLogarithmicDepth:Gc,viewZToOrthographicDepth:Dc,viewZToPerspectiveDepth:Vc,viewport:vc,viewportBottomLeft:Ec,viewportCoordinate:Sc,viewportDepthTexture:Ic,viewportLinearDepth:Hc,viewportMipTexture:Uc,viewportResolution:Rc,viewportSafeUV:wm,viewportSharedTexture:nh,viewportSize:Nc,viewportTexture:Bc,viewportTopLeft:Cc,viewportUV:Ac,wgsl:(e,t)=>ny(e,t,"wgsl"),wgslFn:(e,t)=>ay(e,t,"wgsl"),workgroupArray:(e,t)=>fi(new Fy("Workgroup",e,t)),workgroupBarrier:()=>By("workgroup").append(),workgroupId:Ey,workingToColorSpace:Da,xor:Jn});const yx=new om;class bx extends Bg{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(yx,Ae),yx.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(yx,Ae),yx.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;yx.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Na(Oi(n).mul(Tf),{getUV:()=>_f.mul(ol),getTextureLevel:()=>xf});let t=Gd();t=t.setZ(t.w);const s=new Yc;s.name="Background.material",s.side=x,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new k(new Me(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=Oi(n).mul(Tf),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);if(!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=yx.r,e.g=yx.g,e.b=yx.b,e.a=yx.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let xx=0;class Tx{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=xx++}}class _x{constructor(e,t,r,s,i,n,o,a,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=o,this.updateAfterNodes=a,this.monitor=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new Tx(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class vx{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Nx{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class Sx{constructor(e,t){this.isNodeVar=!0,this.name=e,this.type=t}}class Ax extends Sx{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Rx{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let Cx=0;class Ex{constructor(e=null){this.id=Cx++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class wx extends Ms{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class Mx{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class Bx extends Mx{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class Ux extends Mx{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class Fx extends Mx{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class Px extends Mx{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class Ix extends Mx{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class Lx extends Mx{constructor(e,t=new i){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class Dx extends Mx{constructor(e,t=new n){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class Vx extends Bx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Ox extends Ux{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Gx extends Fx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class kx extends Px{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class zx extends Ix{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class $x extends Lx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Hx extends Dx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const Wx=[.125,.215,.35,.446,.526,.582],jx=20,qx=new xe(-1,1,1,-1,0,1),Kx=new Ue(90,1),Xx=new e;let Yx=null,Qx=0,Zx=0;const Jx=(1+Math.sqrt(5))/2,eT=1/Jx,tT=[new r(-Jx,eT,0),new r(Jx,eT,0),new r(-eT,0,Jx),new r(eT,0,Jx),new r(0,Jx,-eT),new r(0,Jx,eT),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],rT=[3,1,5,0,4,2],sT=Vp(pu(),hu("faceIndex")).normalize(),iT=Ii(sT.x,sT.y.negate(),sT.z);class nT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}Yx=this._renderer.getRenderTarget(),Qx=this._renderer.getActiveCubeFace(),Zx=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=lT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=dT(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===T||e.mapping===_?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=Wx[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rT[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new Te;_.setAttribute("position",new ve(b,m)),_.setAttribute("uv",new ve(x,f)),_.setAttribute("faceIndex",new ve(T,y)),t.push(_),i.push(new k(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Nl(new Array(jx).fill(0)),n=tn(new r(0,1,0)),o=tn(0),a=Ci(jx),u=tn(0),l=tn(1),d=xu(null),c=tn(0),h=Ci(1/t),p=Ci(1/s),g=Ci(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:iT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=uT("blur");return f.uniforms=m,f.fragmentNode=zp({...m,latitudinal:u.equal(1)}),f}(i,e,t)}return i}async _compileMaterial(e){const t=new k(this._lodPlanes[0],e);await this._renderer.compile(t,qx)}_sceneToCubeUV(e,t,r,s){const i=Kx;i.near=t,i.far=r;const n=[-1,1,-1,-1,-1,-1],o=[1,1,1,-1,-1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(Xx),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Q({name:"PMREM.Background",side:x,depthWrite:!1,depthTest:!1});l=new k(new G,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(Xx),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;aT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===T||e.mapping===_;s?null===this._cubemapMaterial&&(this._cubemapMaterial=lT(e)):null===this._equirectMaterial&&(this._equirectMaterial=dT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;aT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,qx)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tjx&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),a.setRenderTarget(t),a.render(l,qx)}}function oT(e,t,r){const s=new ge(e,t,r);return s.texture.mapping=Be,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function aT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function uT(e){const t=new Yc;return t.depthTest=!1,t.depthWrite=!1,t.blending=D,t.name=`PMREM_${e}`,t}function lT(e){const t=uT("cubemap");return t.fragmentNode=bl(e,iT),t}function dT(e){const t=uT("equirect");return t.fragmentNode=xu(e,hh(iT),0),t}const cT=new WeakMap,hT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),pT=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class gT{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.monitor=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=lm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new Ex,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=cT.get(this.renderer);return void 0===e&&(e=new Rg,cT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ge(e,t,r)}createCubeRenderTarget(e,t){return new ph(e,t)}createPMREMGenerator(){return new nT(this.renderer)}includes(e){return this.nodes.includes(e)}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new Tx(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Tx(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Cs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${pT(n.r)}, ${pT(n.g)}, ${pT(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new vx(e,t);return r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===y)return"int";if(t===f)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;const r=gs(e);return("float"===t?"":t[0])+r}getTypeFromArray(e){return hT.get(e.constructor)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof Le||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=lm(this.stack),this.stacks.push(Ni()||this.stack),vi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,vi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new vx("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new wx("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const o=this.uniforms.index++;n=new Nx(s||"nodeUniform"+o,t,e),this.uniforms[r].push(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage){const i=this.getDataFromNode(e,s);let n=i.variable;if(void 0===n){const e=this.vars[s]||(this.vars[s]=[]);null===t&&(t="nodeVar"+e.length),n=new Sx(t,r),e.push(n),i.variable=n}return n}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Ax(t,r),e.push(i),s.varying=i}return i}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new Rx("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}buildFunctionNode(e){const t=new oy,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new am(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new Ex,this.stack=lm();for(const r of Rs)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t){return`${this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Yc),e.build(this)}else this.addFlow("compute",e);for(const e of Rs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Cs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new Vx(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new Ox(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new Gx(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new kx(e);if("color"===t)return new zx(e);if("mat3"===t)return new $x(e);if("mat4"===t)return new Hx(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}(${e}[0].xyz, ${e}[1].xyz, ${e}[2].xyz)`:9===s&&4===i?`${this.getType(r)}(${e}[0].xy, ${e}[1].xy)`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${De} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class mT{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class fT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}fT.isNodeFunctionInput=!0;class yT extends db{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=Hy(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const bT=new n,xT=new n;let TT=null;class _T extends db{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=tn(new r).setGroup(Zi),this.halfWidth=tn(new r).setGroup(Zi),this.updateType=vs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;xT.identity(),bT.copy(t.matrixWorld),bT.premultiply(r),xT.extractRotation(bT),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(xT),this.halfHeight.value.applyMatrix4(xT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=xu(TT.LTC_FLOAT_1),r=xu(TT.LTC_FLOAT_2)):(t=xu(TT.LTC_HALF_1),r=xu(TT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=$y(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){TT=e}}class vT extends db{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=tn(0).setGroup(Zi),this.penumbraCosNode=tn(0).setGroup(Zi),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return ga(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=$y(n).sub(Qu),a=o.normalize(),u=a.dot(Hy(n)),l=this.getSpotAttenuation(u),d=o.length(),c=cb({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=Gy(n),t=xu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class NT extends vT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=xu(t,Bi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class ST extends db{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class AT extends db{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ky(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=tn(new e).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=nl.dot(s).mul(.5).add(.5),n=da(r,t,i);e.context.irradiance.addAssign(n)}}class RT extends db{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Nl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=mx(ol,this.lightProbe);e.context.irradiance.addAssign(t)}}class CT{parseFunction(){console.warn("Abstract function.")}}class ET{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}ET.isNodeFunction=!0;const wT=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,MT=/[a-z_0-9]+/gi,BT="#pragma main";class UT extends ET{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(BT),r=-1!==t?e.slice(t+12):e,s=r.match(wT);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=MT.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){let s=null;if(!0===r.isCubeTexture||r.mapping===j||r.mapping===q||r.mapping===Be)if(e.backgroundBlurriness>0||r.mapping===Be)s=qp(r);else{let e;e=!0===r.isCubeTexture?bl(r):xu(r),s=bh(e)}else!0===r.isTexture?s=xu(r,xc.flipY()).setUpdateMatrix(!0):!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r);t.backgroundNode=s,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){let e=null;if(r.isFogExp2){const t=Rl("color","color",r).setGroup(Zi),s=Rl("density","float",r).setGroup(Zi);e=Ty(t,s)}else if(r.isFog){const t=Rl("color","color",r).setGroup(Zi),s=Rl("near","float",r).setGroup(Zi),i=Rl("far","float",r).setGroup(Zi);e=by(t,s,i)}else console.error("WebGPUNodes: Unsupported fog configuration.",r);t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){let e=null;!0===r.isCubeTexture?e=bl(r):!0===r.isTexture?e=xu(r):console.error("Nodes: Unsupported environment configuration.",r),t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return PT.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=xu(e,xc).renderOutput(t.toneMapping,t.currentColorSpace);return PT.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new mT,this.nodeBuilderCache=new Map}}const LT=new me;class DT{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",null===e?(this.intersectionPlanes=[],this.unionPlanes=[],this.viewNormalMatrix=new i,this.clippingGroupContexts=new WeakMap,this.shadowPass=!1):(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix),this.parentVersion=null}projectPlanes(e,t,r){const s=e.length;for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new IT(this,r),this._animation=new Ag(this._nodes,this.info),this._attributes=new Dg(r),this._background=new bx(this,this._nodes),this._geometries=new Gg(this._attributes,this.info),this._textures=new nm(this,r,this.info),this._pipelines=new qg(r,this._nodes),this._bindings=new Kg(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Mg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Jg(this.lighting),this._bundles=new OT,this._renderContexts=new sm,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:$T;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new DT),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._nodes.updateScene(u),this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init();const r=this._renderScene(e,t);await this.backend.resolveTimestampAsync(r,"render")}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=x,p.viewport=!1===p.viewportValue.equals(WT),p.scissorValue.copy(f).multiplyScalar(y).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(WT),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new DT),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),qT.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),jT.setFromProjectionMatrix(qT,g);const T=this._renderLists.get(e,t);if(T.begin(),this._projectObject(e,t,0,T,p.clippingContext),T.finish(),!0===this.sortObjects&&T.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=T.occlusionQueryCount,this._nodes.updateScene(u),this._background.update(u,T,p),this.backend.beginRender(p);const{bundles:_,lightsNode:v,transparentDoublePass:N,transparent:S,opaque:A}=T;if(_.length>0&&this._renderBundles(_,u,v),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,v),!0===this.transparent&&S.length>0&&this._renderTransparents(S,N,t,u,v),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}return u.onAfterRender(this,e,t,h),p}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s&&(this._textures.updateRenderTarget(s),i=this._textures.get(s)),this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}clearColorAsync(){return this.clearAsync(!0,!1,!1)}clearDepthAsync(){return this.clearAsync(!1,!0,!1)}clearStencilAsync(){return this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget?d:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget?Ae:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this.isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e),await this.backend.resolveTimestampAsync(e,"compute")}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){if(!1===this._initialized)return console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),!1;this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=KT.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=KT.copy(t).floor()}else t=KT.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||jT.intersectsSprite(e)){!0===this.sortObjects&&KT.setFromMatrixPosition(e.matrixWorld).applyMatrix4(qT);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,KT.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||jT.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),KT.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(qT)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=x;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Ge;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=le}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=d_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==y){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=c_[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}c_[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new o_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new a_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new u_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new e_(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new s_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let g_=null,m_=null,f_=null;class y_{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null}async init(e){this.renderer=e}begin(){}finish(){}draw(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}createRenderPipeline(){}createComputePipeline(){}destroyPipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}createDefaultTexture(){}createTexture(){}copyTextureToBuffer(){}createAttribute(){}createIndexAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}resolveTimestampAsync(){}hasFeatureAsync(){}hasFeature(){}getInstanceCount(e){const{object:t,geometry:r}=e;return r.isInstancedBufferGeometry?r.instanceCount:t.count>1?t.count:1}getDrawingBufferSize(){return g_=g_||new t,this.renderer.getDrawingBufferSize(g_)}getScissor(){return m_=m_||new s,this.renderer.getScissor(m_)}setScissorTest(){}getClearColor(){const e=this.renderer;return f_=f_||new om,e.getClearColor(f_),f_.getRGB(f_,this.renderer.currentColorSpace),f_}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ze(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${De} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let b_=0;class x_{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class T_{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===y,id:b_++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new x_(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let R_,C_,E_,w_=!1;class M_{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===w_&&(this._init(this.gl),w_=!0)}_init(e){R_={[dr]:e.REPEAT,[cr]:e.CLAMP_TO_EDGE,[hr]:e.MIRRORED_REPEAT},C_={[pr]:e.NEAREST,[gr]:e.NEAREST_MIPMAP_NEAREST,[Ie]:e.NEAREST_MIPMAP_LINEAR,[$]:e.LINEAR,[Pe]:e.LINEAR_MIPMAP_NEAREST,[M]:e.LINEAR_MIPMAP_LINEAR},E_={[mr]:e.NEVER,[fr]:e.ALWAYS,[Re]:e.LESS,[yr]:e.LEQUAL,[br]:e.EQUAL,[xr]:e.GEQUAL,[Tr]:e.GREATER,[_r]:e.NOTEQUAL}}filterFallback(e){const{gl:t}=this;return e===pr||e===gr||e===Ie?t.NEAREST:t.LINEAR}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,R_[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,R_[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,R_[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,C_[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===$&&n?M:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,C_[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,E_[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===pr)return;if(t.minFilter!==Ie&&t.minFilter!==M)return;if(t.type===E&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:o,glType:a}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,o,a,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.gerDrawingBufferSize().y;if(d){const r=0!==o||0!==a;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class B_{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class U_{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const F_={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class P_{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;s0)){const e=t.queryQueue.shift();this.initTimestampQuery(e)}}async resolveTimestampAsync(e,t="render"){if(!this.disjoint||!this.trackTimestamp)return;const r=this.get(e);r.gpuQueries||(r.gpuQueries=[]);for(let e=0;e0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t0&&e.add(s[t]),r[t]=null,i.deleteQuery(n),o++))}o1?f.renderInstances(x,y,b):f.render(x,y),a.bindVertexArray(null)}needsRenderUpdate(){return!1}getRenderCacheKey(){return""}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}createSampler(){}destroySampler(){}createNodeBuilder(e,t){return new p_(e,t)}createProgram(e){const t=this.gl,{stage:r,code:s}=e,i="fragment"===r?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);t.shaderSource(i,s),t.compileShader(i),this.set(e,{shaderGPU:i})}destroyProgram(){console.warn("Abstract class.")}createRenderPipeline(e,t){const r=this.gl,s=e.pipeline,{fragmentProgram:i,vertexProgram:n}=s,o=r.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU;if(r.attachShader(o,a),r.attachShader(o,u),r.linkProgram(o),this.set(s,{programGPU:o,fragmentShader:a,vertexShader:u}),null!==t&&this.parallel){const i=new Promise((t=>{const i=this.parallel,n=()=>{r.getProgramParameter(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eF_[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===d){const s=[];d=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,d);const i=[],l=e.textures;for(let r=0;r,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:G_,stripIndexFormat:sv},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:G_,stripIndexFormat:sv},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Yv,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Yv,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:Q_,storeOp:X_,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Yv,baseArrayLayer:r});const o=[];for(let a=1;a1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,mN=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,fN={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class yN extends ET{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(gN);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=mN.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class bN extends CT{parseFunction(e){return new yN(e)}}const xN="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},TN={[Ss.READ_ONLY]:"read",[Ss.WRITE_ONLY]:"write",[Ss.READ_WRITE]:"read_write"},_N={[dr]:"repeat",[cr]:"clamp",[hr]:"mirror"},vN={vertex:xN?xN.VERTEX:1,fragment:xN?xN.FRAGMENT:2,compute:xN?xN.COMPUTE:4},NN={instance:!0,swizzleAssign:!1,storageBuffer:!0},SN={"^^":"tsl_xor"},AN={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},RN={},CN={tsl_xor:new iy("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new iy("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new iy("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new iy("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new iy("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new iy("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new iy("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new iy("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new iy("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new iy("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new iy("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new iy("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new iy("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},EN={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(CN.pow_float=new iy("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),CN.pow_vec2=new iy("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[CN.pow_float]),CN.pow_vec3=new iy("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[CN.pow_float]),CN.pow_vec4=new iy("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[CN.pow_float]),EN.pow_float="tsl_pow_float",EN.pow_vec2="tsl_pow_vec2",EN.pow_vec3="tsl_pow_vec3",EN.pow_vec4="tsl_pow_vec4");let wN="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(wN+="diagnostic( off, derivative_uniformity );\n");class MN extends gT{constructor(e,t){super(e,t,new bN),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==m}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${_N[e.wrapS]}S_${_N[e.wrapT]}T`;let r=RN[t];if(void 0===r){const s=[];let i=`fn ${t}( coord : vec2f ) -> vec2f {\n\n\treturn vec2f(\n`;const n=(e,t)=>{e===dr?(s.push(CN.repeatWrapping_float),i+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===cr?(s.push(CN.clampWrapping_float),i+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===hr?(s.push(CN.mirrorWrapping_float),i+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(i+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};n(e.wrapS,"x"),i+=",\n",n(e.wrapT,"y"),i+="\n\t);\n\n}\n",RN[t]=r=new iy(i,s)}return r.build(this),t}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e);n=o>1?t:`${t}, u32( ${r} )`,i=new Aa(new ou(`textureDimensions( ${n} )`,"uvec2")),s.dimensionsSnippet[r]=i}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=`vec2u( ${this.generateWrapFunction(e)}( ${r} ) * vec2f( ${this.generateTextureDimension(e,t,i)} ) )`;return this.generateTextureLoad(e,t,n,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===E||!1===this.isSampleCompare(e)&&e.minFilter===pr&&e.magFilter===pr||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=SN[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Ss.READ_ONLY:e.access}getStorageAccess(e,t){return TN[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new o_(i.name,i.node,o,a):"cubeTexture"===t?n=new a_(i.name,i.node,o,a):"texture3D"===t&&(n=new u_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(vN[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==n.store)u.push(n),s=[n];else{const e=new nN(`${i.name}_sampler`,i.node,o);e.setVisibility(vN[r]),u.push(e,n),s=[e,n]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?e_:uN)(e,o);i.setVisibility(vN[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new s_(a,o),n.setVisibility(vN[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","id","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}getVar(e,t){return`var ${t} : ${this.getType(e)}`}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${pN(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],o=n.outputNode,a=void 0!==o&&!0===o.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n\t`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return AN[e]||e}isAvailable(e){let t=NN[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),NN[e]=t),t}_getWGSLMethod(e){return void 0!==CN[e]&&this._include(e),EN[e]}_include(e){const t=CN[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${wN}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = id.x + id.y * numWorkgroups.x * u32(${t}) + id.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class BN{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=iv.Depth24PlusStencil8:e.depth&&(t=iv.Depth24Plus),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?L_:e.isLineSegments||e.isMesh&&!0===t.wireframe?D_:e.isLine?V_:e.isMesh?O_:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){return navigator.userAgent.includes("Quest")?iv.BGRA8Unorm:navigator.gpu.getPreferredCanvasFormat()}}const UN=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),FN=new Map([[Le,["float16"]]]),PN=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class IN{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const o=s.device;let a=r.array;if(!1===e.normalized&&(a.constructor===Int16Array||a.constructor===Uint16Array)){const e=new Uint32Array(a.length);for(let t=0;t1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=Hv)),r.texture.isDepthTexture)s.sampleType=Wv;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===y?s.sampleType=jv:e===f?s.sampleType=qv:e===E&&(this.backend.hasFeature("float32-filterable")?s.sampleType=$v:s.sampleType=Hv)}r.isSampledCubeTexture?s.viewDimension=Zv:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=Qv:r.isSampledTexture3D&&(s.viewDimension=Jv),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,o=i.get(e);let a,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=eN;let n;n=t.isSampledCubeTexture?Zv:t.isSampledTexture3D?Jv:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Qv:Yv,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class DN{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==D&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===ft){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:Nv},r={srcFactor:i,dstFactor:n,operation:Nv}};if(e.premultipliedAlpha)switch(s){case F:i(cv,mv,cv,mv);break;case xt:i(cv,cv,cv,cv);break;case bt:i(dv,pv,dv,cv);break;case yt:i(dv,hv,dv,gv)}else switch(s){case F:i(gv,mv,cv,mv);break;case xt:i(gv,cv,gv,cv);break;case bt:i(dv,pv,dv,cv);break;case yt:i(dv,hv,dv,hv)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case rt:t=dv;break;case st:t=cv;break;case it:t=hv;break;case lt:t=pv;break;case nt:t=gv;break;case dt:t=mv;break;case at:t=fv;break;case ct:t=yv;break;case ut:t=bv;break;case ht:t=xv;break;case ot:t=Tv;break;case 211:t=_v;break;case 212:t=vv;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Mr:t=k_;break;case wr:t=K_;break;case Er:t=z_;break;case Cr:t=H_;break;case Rr:t=$_;break;case Ar:t=q_;break;case Sr:t=W_;break;case Nr:t=j_;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Vr:t=Mv;break;case Dr:t=Bv;break;case Lr:t=Uv;break;case Ir:t=Fv;break;case Pr:t=Pv;break;case Fr:t=Iv;break;case Ur:t=Lv;break;case Br:t=Dv;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Je:t=Nv;break;case et:t=Sv;break;case tt:t=Av;break;case Gr:t=Rv;break;case Or:t=Cv;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?rv:sv),r.side){case Ge:s.frontFace=Z_,s.cullMode=tv;break;case x:s.frontFace=Z_,s.cullMode=ev;break;case le:s.frontFace=Z_,s.cullMode=J_;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?wv:Ev}_getDepthCompare(e){let t;if(!1===e.depthTest)t=K_;else{const r=e.depthFunc;switch(r){case Ct:t=k_;break;case Rt:t=K_;break;case At:t=z_;break;case St:t=H_;break;case Nt:t=$_;break;case vt:t=q_;break;case _t:t=W_;break;case Tt:t=j_;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class VN extends y_{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new BN(this),this.attributeUtils=new IN(this),this.bindingUtils=new LN(this),this.pipelineUtils=new DN(this),this.textureUtils=new hN(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(sN),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(sN.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return v}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e){const t=e.renderTarget,r=this.get(t);let s=r.descriptors;if(void 0===s||r.width!==t.width||r.height!==t.height||r.activeMipmapLevel!==t.activeMipmapLevel||r.samples!==t.samples){s={},r.descriptors=s;const e=()=>{t.removeEventListener("dispose",e),this.delete(t)};t.addEventListener("dispose",e)}const i=e.getCacheKey();let n=s[i];if(void 0===n){const o=e.textures,a=[];for(let t=0;t0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.prepareTimestampBuffer(e,t.encoder),this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.prepareTimestampBuffer(e,t.cmdEncoderGPU),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e1?0:r;l.drawIndexed(t[r],s,e[r]/n,0,o)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}}needsRenderUpdate(e){const t=this.get(e),{object:r,material:s}=e,i=this.utils,n=i.getSampleCountRenderContext(e.context),o=i.getCurrentColorSpace(e.context),a=i.getCurrentColorFormat(e.context),u=i.getCurrentDepthStencilFormat(e.context),l=i.getPrimitiveTopology(r,s);let d=!1;return t.material===s&&t.materialVersion===s.version&&t.transparent===s.transparent&&t.blending===s.blending&&t.premultipliedAlpha===s.premultipliedAlpha&&t.blendSrc===s.blendSrc&&t.blendDst===s.blendDst&&t.blendEquation===s.blendEquation&&t.blendSrcAlpha===s.blendSrcAlpha&&t.blendDstAlpha===s.blendDstAlpha&&t.blendEquationAlpha===s.blendEquationAlpha&&t.colorWrite===s.colorWrite&&t.depthWrite===s.depthWrite&&t.depthTest===s.depthTest&&t.depthFunc===s.depthFunc&&t.stencilWrite===s.stencilWrite&&t.stencilFunc===s.stencilFunc&&t.stencilFail===s.stencilFail&&t.stencilZFail===s.stencilZFail&&t.stencilZPass===s.stencilZPass&&t.stencilFuncMask===s.stencilFuncMask&&t.stencilWriteMask===s.stencilWriteMask&&t.side===s.side&&t.alphaToCoverage===s.alphaToCoverage&&t.sampleCount===n&&t.colorSpace===o&&t.colorFormat===a&&t.depthStencilFormat===u&&t.primitiveTopology===l&&t.clippingContextCacheKey===e.clippingContextCacheKey||(t.material=s,t.materialVersion=s.version,t.transparent=s.transparent,t.blending=s.blending,t.premultipliedAlpha=s.premultipliedAlpha,t.blendSrc=s.blendSrc,t.blendDst=s.blendDst,t.blendEquation=s.blendEquation,t.blendSrcAlpha=s.blendSrcAlpha,t.blendDstAlpha=s.blendDstAlpha,t.blendEquationAlpha=s.blendEquationAlpha,t.colorWrite=s.colorWrite,t.depthWrite=s.depthWrite,t.depthTest=s.depthTest,t.depthFunc=s.depthFunc,t.stencilWrite=s.stencilWrite,t.stencilFunc=s.stencilFunc,t.stencilFail=s.stencilFail,t.stencilZFail=s.stencilZFail,t.stencilZPass=s.stencilZPass,t.stencilFuncMask=s.stencilFuncMask,t.stencilWriteMask=s.stencilWriteMask,t.side=s.side,t.alphaToCoverage=s.alphaToCoverage,t.sampleCount=n,t.colorSpace=o,t.colorFormat=a,t.depthStencilFormat=u,t.primitiveTopology=l,t.clippingContextCacheKey=e.clippingContextCacheKey,d=!0),d}getRenderCacheKey(e){const{object:t,material:r}=e,s=this.utils,i=e.context;return[r.transparent,r.blending,r.premultipliedAlpha,r.blendSrc,r.blendDst,r.blendEquation,r.blendSrcAlpha,r.blendDstAlpha,r.blendEquationAlpha,r.colorWrite,r.depthWrite,r.depthTest,r.depthFunc,r.stencilWrite,r.stencilFunc,r.stencilFail,r.stencilZFail,r.stencilZPass,r.stencilFuncMask,r.stencilWriteMask,r.side,s.getSampleCountRenderContext(i),s.getCurrentColorSpace(i),s.getCurrentColorFormat(i),s.getCurrentDepthStencilFormat(i),s.getPrimitiveTopology(t,r),e.getGeometryCacheKey(),e.clippingContextCacheKey].join()}createSampler(e){this.textureUtils.createSampler(e)}destroySampler(e){this.textureUtils.destroySampler(e)}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}initTimestampQuery(e,t){if(!this.trackTimestamp)return;const r=this.get(e);if(!r.timeStampQuerySet){const s=e.isComputeNode?"compute":"render",i=this.device.createQuerySet({type:"timestamp",count:2,label:`timestamp_${s}_${e.id}`}),n={querySet:i,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};Object.assign(t,{timestampWrites:n}),r.timeStampQuerySet=i}}prepareTimestampBuffer(e,t){if(!this.trackTimestamp)return;const r=this.get(e),s=2*BigInt64Array.BYTES_PER_ELEMENT;void 0===r.currentTimestampQueryBuffers&&(r.currentTimestampQueryBuffers={resolveBuffer:this.device.createBuffer({label:"timestamp resolve buffer",size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),resultBuffer:this.device.createBuffer({label:"timestamp result buffer",size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});const{resolveBuffer:i,resultBuffer:n}=r.currentTimestampQueryBuffers;t.resolveQuerySet(r.timeStampQuerySet,0,2,i,0),"unmapped"===n.mapState&&t.copyBufferToBuffer(i,0,n,0,s)}async resolveTimestampAsync(e,t="render"){if(!this.trackTimestamp)return;const r=this.get(e);if(void 0===r.currentTimestampQueryBuffers)return;const{resultBuffer:s}=r.currentTimestampQueryBuffers;"unmapped"===s.mapState&&s.mapAsync(GPUMapMode.READ).then((()=>{const e=new BigUint64Array(s.getMappedRange()),r=Number(e[1]-e[0])/1e6;this.renderer.info.updateTimestamp(t,r),s.unmap()}))}createNodeBuilder(e,t){return new MN(e,t)}createProgram(e){this.get(e).module={module:this.device.createShaderModule({code:e.code,label:e.stage}),entryPoint:"main"}}destroyProgram(e){this.delete(e)}createRenderPipeline(e,t){this.pipelineUtils.createRenderPipeline(e,t)}createComputePipeline(e,t){this.pipelineUtils.createComputePipeline(e,t)}beginBundle(e){const t=this.get(e);t._currentPass=t.currentPass,t._currentSets=t.currentSets,t.currentSets={attributes:{},bindingGroups:[],pipeline:null,index:null},t.currentPass=this.pipelineUtils.createBundleEncoder(e)}finishBundle(e,t){const r=this.get(e),s=r.currentPass.finish();this.get(t).bundleGPU=s,r.currentSets=r._currentSets,r.currentPass=r._currentPass}addBundle(e,t){this.get(e).renderBundles.push(this.get(t).bundleGPU)}createBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBinding(e){this.bindingUtils.updateBinding(e)}createIndexAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.INDEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createIndirectStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.INDIRECT|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}updateAttribute(e){this.attributeUtils.updateAttribute(e)}destroyAttribute(e){this.attributeUtils.destroyAttribute(e)}updateSize(){this.colorBuffer=this.textureUtils.getColorBuffer(),this.defaultRenderPassdescriptor=null}getMaxAnisotropy(){return 16}hasFeature(e){return this.device.features.has(e)}copyTextureToTexture(e,t,r=null,s=null,i=0){let n=0,o=0,a=0,u=0,l=0,d=0,c=e.image.width,h=e.image.height;null!==r&&(u=r.x,l=r.y,d=r.z||0,c=r.width,h=r.height),null!==s&&(n=s.x,o=s.y,a=s.z||0);const p=this.device.createCommandEncoder({label:"copyTextureToTexture_"+e.id+"_"+t.id}),g=this.get(e).texture,m=this.get(t).texture;p.copyTextureToTexture({texture:g,mipLevel:i,origin:{x:u,y:l,z:d}},{texture:m,mipLevel:i,origin:{x:n,y:o,z:a}},[c,h,1]),this.device.queue.submit([p.finish()])}copyFramebufferToTexture(e,t,r){const s=this.get(t);let i=null;i=t.renderTarget?e.isDepthTexture?this.get(t.depthTexture).texture:this.get(t.textures[0]).texture:e.isDepthTexture?this.textureUtils.getDepthBuffer(t.depth,t.stencil):this.context.getCurrentTexture();const n=this.get(e).texture;if(i.format!==n.format)return void console.error("WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.",i.format,n.format);let o;if(s.currentPass?(s.currentPass.end(),o=s.encoder):o=this.device.createCommandEncoder({label:"copyFramebufferToTexture_"+e.id}),o.copyTextureToTexture({texture:i,origin:[r.x,r.y,0]},{texture:n},[r.z,r.w]),e.generateMipmaps&&this.textureUtils.generateMipmaps(e),s.currentPass){const{descriptor:e}=s;for(let t=0;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new I_(e)));super(new t(e),e),this.library=new GN,this.isWebGPURenderer=!0}}class zN extends es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}const $N=new Yc,HN=new Jm($N);class WN{constructor(e,t=Oi(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0,$N.name="PostProcessing"}render(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,HN.render(e),e.toneMapping=t,e.outputColorSpace=r}update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;HN.material.fragmentNode=!0===this.outputColorTransform?du(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),HN.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,await HN.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}function jN(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function qN(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function KN(e,t,r={}){return(r=jN(e,r)).background=t.background,r.backgroundNode=t.backgroundNode,r.overrideMaterial=t.overrideMaterial,r}var XN=Object.freeze({__proto__:null,resetRendererAndSceneState:function(e,t,r){return r=KN(e,t,r),t.background=null,t.backgroundNode=null,t.overrideMaterial=null,r},resetRendererState:function(e,t){return t=jN(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t},restoreRendererAndSceneState:function(e,t,r){qN(e,r),t.background=r.background,t.backgroundNode=r.backgroundNode,t.overrideMaterial=r.overrideMaterial},restoreRendererState:qN,saveRendererAndSceneState:KN,saveRendererState:jN});class YN extends ee{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=$,this.minFilter=$,this.isStorageTexture=!0}}class QN extends uf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class ZN extends ts{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new rs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Ci()):fi(new this.nodes[e])}}class JN extends ss{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class eS extends is{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new ZN;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new JN;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t} nodes - An array of nodes that should be joined. + * @param {String?} [nodeType=null] - The node type. + */ constructor( nodes = [], nodeType = null ) { super( nodeType ); + /** + * An array of nodes that should be joined. + * + * @type {Array} + */ this.nodes = nodes; } + /** + * This method is overwritten since the node type must be inferred from the + * joined data length if not explicitly defined. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { if ( this.nodeType !== null ) { @@ -1950,8 +2057,19 @@ class JoinNode extends TempNode { } -const stringVectorComponents = vectorComponents.join( '' ); +const _stringVectorComponents = vectorComponents.join( '' ); +/** + * This module is part of the TSL core and usually not used in app level code. + * `SplitNode` represents a property access operation which means it is + * used to implement any `.xyzw`, `.rgba` and `stpq` usage on node objects. + * For example: + * ```js + * const redValue = color.r; + * ``` + * + * @augments Node + */ class SplitNode extends Node { static get type() { @@ -1960,17 +2078,46 @@ class SplitNode extends Node { } + /** + * Constructs a new split node. + * + * @param {Node} node - The node that should be accessed. + * @param {String} [components='x'] - The components that should be accessed. + */ constructor( node, components = 'x' ) { super(); + /** + * The node that should be accessed. + * + * @type {Node} + */ this.node = node; + + /** + * The components that should be accessed. + * + * @type {Node} + */ this.components = components; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isSplitNode = true; } + /** + * Returns the vector length which is computed based on the requested components. + * + * @return {Number} The vector length. + */ getVectorLength() { let vectorLength = this.components.length; @@ -1985,12 +2132,24 @@ class SplitNode extends Node { } + /** + * Returns the component type of the node's type. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The component type. + */ getComponentType( builder ) { return builder.getComponentType( this.node.getNodeType( builder ) ); } + /** + * This method is overwritten since the node type is inferred from requested components. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { return builder.getTypeFromLength( this.components.length, this.getComponentType( builder ) ); @@ -2020,7 +2179,7 @@ class SplitNode extends Node { const nodeSnippet = node.build( builder, type ); - if ( this.components.length === nodeTypeLength && this.components === stringVectorComponents.slice( 0, this.components.length ) ) { + if ( this.components.length === nodeTypeLength && this.components === _stringVectorComponents.slice( 0, this.components.length ) ) { // unnecessary swizzle @@ -2062,6 +2221,17 @@ class SplitNode extends Node { } +/** + * This module is part of the TSL core and usually not used in app level code. + * `SetNode` represents a set operation which means it is used to implement any + * `setXYZW()`, `setRGBA()` and `setSTPQ()` method invocations on node objects. + * For example: + * ```js + * materialLine.colorNode = color( 0, 0, 0 ).setR( float( 1 ) ); + * ``` + * + * @augments TempNode + */ class SetNode extends TempNode { static get type() { @@ -2070,16 +2240,46 @@ class SetNode extends TempNode { } + /** + * Constructs a new set node. + * + * @param {Node} sourceNode - The node that should be updated. + * @param {String} components - The components that should be updated. + * @param {Node} targetNode - The value node. + */ constructor( sourceNode, components, targetNode ) { super(); + /** + * The node that should be updated. + * + * @type {Node} + */ this.sourceNode = sourceNode; + + /** + * The components that should be updated. + * + * @type {String} + */ this.components = components; + + /** + * The value node. + * + * @type {Node} + */ this.targetNode = targetNode; } + /** + * This method is overwritten since the node type is inferred from {@link SetNode#sourceNode}. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { return this.sourceNode.getNodeType( builder ); @@ -2091,7 +2291,9 @@ class SetNode extends TempNode { const { sourceNode, components, targetNode } = this; const sourceType = this.getNodeType( builder ); - const targetType = builder.getTypeFromLength( components.length, targetNode.getNodeType( builder ) ); + + const componentType = builder.getComponentType( targetNode.getNodeType( builder ) ); + const targetType = builder.getTypeFromLength( components.length, componentType ); const targetSnippet = targetNode.build( builder, targetType ); const sourceSnippet = sourceNode.build( builder, sourceType ); @@ -2123,6 +2325,21 @@ class SetNode extends TempNode { } +/** + * This module is part of the TSL core and usually not used in app level code. + * It represents a flip operation during the shader generation process + * meaning it flips normalized values with the following formula: + * ``` + * x = 1 - x; + * ``` + * `FlipNode` is internally used to implement any `flipXYZW()`, `flipRGBA()` and + * `flipSTPQ()` method invocations on node objects. For example: + * ```js + * uvNode = uvNode.flipY(); + * ``` + * + * @augments TempNode + */ class FlipNode extends TempNode { static get type() { @@ -2131,15 +2348,38 @@ class FlipNode extends TempNode { } + /** + * Constructs a new flip node. + * + * @param {Node} sourceNode - The node which component(s) should be flipped. + * @param {String} components - The components that should be flipped e.g. `'x'` or `'xy'`. + */ constructor( sourceNode, components ) { super(); + /** + * The node which component(s) should be flipped. + * + * @type {Node} + */ this.sourceNode = sourceNode; + + /** + * The components that should be flipped e.g. `'x'` or `'xy'`. + * + * @type {String} + */ this.components = components; } + /** + * This method is overwritten since the node type is inferred from the source node. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { return this.sourceNode.getNodeType( builder ); @@ -3278,6 +3518,18 @@ const uniform = ( arg1, arg2 ) => { }; +/** + * This class represents a shader property. It can be used on + * to explicitly define a property and assign a value to it. + * + * ```js + * const threshold = property( 'float', 'threshold' ).assign( THRESHOLD ); + *``` + * `PropertyNode` is used by the engine to predefined common material properties + * for TSL code. + * + * @augments Node + */ class PropertyNode extends Node { static get type() { @@ -3286,13 +3538,41 @@ class PropertyNode extends Node { } + /** + * Constructs a new property node. + * + * @param {String} nodeType - The type of the node. + * @param {String?} [name=null] - The name of the property in the shader. + * @param {Boolean} [varying=false] - Whether this property is a varying or not. + */ constructor( nodeType, name = null, varying = false ) { super( nodeType ); + /** + * The name of the property in the shader. If no name is defined, + * the node system auto-generates one. + * + * @type {String?} + * @default null + */ this.name = name; + + /** + * Whether this property is a varying or not. + * + * @type {Boolean} + * @default false + */ this.varying = varying; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isPropertyNode = true; } @@ -3303,6 +3583,12 @@ class PropertyNode extends Node { } + /** + * The method is overwritten so it always returns `true`. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {Boolean} Whether this node is global or not. + */ isGlobal( /*builder*/ ) { return true; @@ -4655,7 +4941,7 @@ addMethodChaining( 'context', context ); addMethodChaining( 'label', label ); /** - * Class for representing shader variables as nodes. Variables are create from + * Class for representing shader variables as nodes. Variables are created from * existing nodes like the following: * * ```js @@ -4699,7 +4985,7 @@ class VarNode extends Node { this.name = name; /** - * `VarNonde` sets this property to `true` by default. + * `VarNode` sets this property to `true` by default. * * @type {Boolean} * @default true @@ -4821,9 +5107,10 @@ class VaryingNode extends Node { /** * The method is overwritten so it always returns `true`. * + * @param {NodeBuilder} builder - The current node builder. * @return {Boolean} Whether this node is global or not. */ - isGlobal() { + isGlobal( /*builder*/ ) { return true; @@ -4913,6 +5200,15 @@ const varying = /*@__PURE__*/ nodeProxy( VaryingNode ); addMethodChaining( 'varying', varying ); +/** @module ColorSpaceFunctions **/ + +/** + * Converts the given color value from sRGB to linear-sRGB color space. + * + * @method + * @param {vec3} color - The sRGB color. + * @return {vec3} The linear-sRGB color. + */ const sRGBTransferEOTF = /*@__PURE__*/ Fn( ( [ color ] ) => { const a = color.mul( 0.9478672986 ).add( 0.0521327014 ).pow( 2.4 ); @@ -4931,6 +5227,13 @@ const sRGBTransferEOTF = /*@__PURE__*/ Fn( ( [ color ] ) => { ] } ); +/** + * Converts the given color value from linear-sRGB to sRGB color space. + * + * @method + * @param {vec3} color - The linear-sRGB color. + * @return {vec3} The sRGB color. + */ const sRGBTransferOETF = /*@__PURE__*/ Fn( ( [ color ] ) => { const a = color.pow( 0.41666 ).mul( 1.055 ).sub( 0.055 ); @@ -4952,6 +5255,12 @@ const sRGBTransferOETF = /*@__PURE__*/ Fn( ( [ color ] ) => { const WORKING_COLOR_SPACE = 'WorkingColorSpace'; const OUTPUT_COLOR_SPACE = 'OutputColorSpace'; +/** + * This node represents a color space conversion. Meaning it converts + * a color value from a source to a target color space. + * + * @augments TempNode + */ class ColorSpaceNode extends TempNode { static get type() { @@ -4960,16 +5269,49 @@ class ColorSpaceNode extends TempNode { } + /** + * Constructs a new color space node. + * + * @param {Node} colorNode - Represents the color to convert. + * @param {String} source - The source color space. + * @param {String} target - The target color space. + */ constructor( colorNode, source, target ) { super( 'vec4' ); + /** + * Represents the color to convert. + * + * @type {Node} + */ this.colorNode = colorNode; + + /** + * The source color space. + * + * @type {Node} + */ this.source = source; + + /** + * The target color space. + * + * @type {Node} + */ this.target = target; } + /** + * This method resolves the constants `WORKING_COLOR_SPACE` and + * `OUTPUT_COLOR_SPACE` based on the current configuration of the + * color management and renderer. + * + * @param {NodeBuilder} builder - The current node builder. + * @param {String} colorSpace - The color space to resolve. + * @return {String} The resolved color space. + */ resolveColorSpace( builder, colorSpace ) { if ( colorSpace === WORKING_COLOR_SPACE ) { @@ -5235,6 +5577,11 @@ class RendererReferenceNode extends ReferenceBaseNode { const rendererReference = ( name, type, renderer ) => nodeObject( new RendererReferenceNode( name, type, renderer ) ); +/** + * This node represents a tone mapping operation. + * + * @augments TempNode + */ class ToneMappingNode extends TempNode { static get type() { @@ -5243,20 +5590,51 @@ class ToneMappingNode extends TempNode { } + /** + * Constructs a new tone mapping node. + * + * @param {Number} toneMapping - The tone mapping type. + * @param {Node} exposureNode - The tone mapping exposure. + * @param {Node} [colorNode=null] - The color node to process. + */ constructor( toneMapping, exposureNode = toneMappingExposure, colorNode = null ) { super( 'vec3' ); + /** + * The tone mapping type. + * + * @type {Number} + */ this.toneMapping = toneMapping; + /** + * The tone mapping exposure. + * + * @type {Node} + * @default null + */ this.exposureNode = exposureNode; + + /** + * Represents the color to process. + * + * @type {Node} + * @default null + */ this.colorNode = colorNode; } - getCacheKey() { + /** + * Overwrites the default `customCacheKey()` implementation by including the tone + * mapping type into the cache key. + * + * @return {Number} The hash. + */ + customCacheKey() { - return hash$1( super.getCacheKey(), this.toneMapping ); + return hash$1( this.toneMapping ); } @@ -5700,6 +6078,13 @@ const bypass = /*@__PURE__*/ nodeProxy( BypassNode ); addMethodChaining( 'bypass', bypass ); +/** + * This node allows to remap a node value from one range into another. E.g a value of + * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`. + * `RemapNode` takes care of that and converts the original value of `0.4` to `0.5`. + * + * @augments Node + */ class RemapNode extends Node { static get type() { @@ -5708,16 +6093,63 @@ class RemapNode extends Node { } + /** + * Constructs a new remap node. + * + * @param {Node} node - The node that should be remapped. + * @param {Node} inLowNode - The source or current lower bound of the range. + * @param {Node} inLowNode - The source or current upper bound of the range. + * @param {Node} [outLowNode=float(0)] - The target lower bound of the range. + * @param {Node} [outHighNode=float(1)] - The target upper bound of the range. + */ constructor( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) { super(); + /** + * The node that should be remapped. + * + * @type {Node} + */ this.node = node; + + /** + * The source or current lower bound of the range. + * + * @type {Node} + */ this.inLowNode = inLowNode; + + /** + * The source or current upper bound of the range. + * + * @type {Node} + */ this.inHighNode = inHighNode; + + /** + * The target lower bound of the range. + * + * @type {Node} + * @default float(0) + */ this.outLowNode = outLowNode; + + /** + * The target upper bound of the range. + * + * @type {Node} + * @default float(1) + */ this.outHighNode = outHighNode; + /** + * Whether the node value should be clamped before + * remapping it to the target range. + * + * @type {Boolean} + * @default true + */ this.doClamp = true; } @@ -5797,11 +6229,50 @@ class ExpressionNode extends Node { const expression = /*@__PURE__*/ nodeProxy( ExpressionNode ); +/** @module Discard **/ + +/** + * Represents a `discard` shader operation in TSL. + * + * @method + * @param {ConditionalNode?} conditional - An optional conditional node. It allows to decide whether the discard should be executed or not. + * @return {Node} The `discard` expression. + */ const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).append(); + +/** + * Represents a `return` shader operation in TSL. + * + * @method + * @return {ExpressionNode} The `return` expression. + */ const Return = () => expression( 'return' ).append(); addMethodChaining( 'discard', Discard ); +/** + * Normally, tone mapping and color conversion happens automatically + * before outputting pixel too the default (screen) framebuffer. In certain + * post processing setups this happens to late because certain effects + * require e.g. sRGB input. For such scenarios, `RenderOutputNode` can be used + * to apply tone mapping and color space conversion at an arbitrary point + * in the effect chain. + * + * When applying tone mapping and color space conversion manually with this node, + * you have to set {@link PostProcessing#outputColorTransform} to `false`. + * + * ```js + * const postProcessing = new PostProcessing( renderer ); + * postProcessing.outputColorTransform = false; + * + * const scenePass = pass( scene, camera ); + * const outputPass = renderOutput( scenePass ); + * + * postProcessing.outputNode = outputPass; + * ``` + * + * @augments TempNode + */ class RenderOutputNode extends TempNode { static get type() { @@ -5810,15 +6281,46 @@ class RenderOutputNode extends TempNode { } + /** + * Constructs a new render output node. + * + * @param {Node} colorNode - The color node to process. + * @param {String} toneMapping - The tone mapping type. + * @param {String} outputColorSpace - The output color space. + */ constructor( colorNode, toneMapping, outputColorSpace ) { super( 'vec4' ); + /** + * The color node to process. + * + * @type {Node} + */ this.colorNode = colorNode; + + /** + * The tone mapping type. + * + * @type {Number?} + */ this.toneMapping = toneMapping; + + /** + * The output color space. + * + * @type {String?} + */ this.outputColorSpace = outputColorSpace; - this.isRenderOutput = true; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ + this.isRenderOutputNode = true; } @@ -6053,6 +6555,16 @@ class TextureSizeNode extends Node { const textureSize = /*@__PURE__*/ nodeProxy( TextureSizeNode ); +/** + * A special type of uniform node that computes the + * maximum mipmap level for a given texture node. + * + * ```js + * const level = maxMipLevel( textureNode ); + * ``` + * + * @augments UniformNode + */ class MaxMipLevelNode extends UniformNode { static get type() { @@ -6061,22 +6573,52 @@ class MaxMipLevelNode extends UniformNode { } + /** + * Constructs a new max mip level node. + * + * @param {TextureNode} node - The texture node to compute the max mip level for. + */ constructor( textureNode ) { super( 0 ); + /** + * The texture node to compute the max mip level for. + * + * @private + * @type {TextureNode} + */ this._textureNode = textureNode; + /** + * The `updateType` is set to `NodeUpdateType.FRAME` since the node updates + * the texture once per frame in its {@link MaxMipLevelNode#update} method. + * + * @type {String} + * @default 'frame' + */ this.updateType = NodeUpdateType.FRAME; } + /** + * The texture node to compute the max mip level for. + * + * @readonly + * @type {TextureNode} + */ get textureNode() { return this._textureNode; } + /** + * The texture. + * + * @readonly + * @type {Texture} + */ get texture() { return this._textureNode.value; @@ -6409,7 +6951,15 @@ class TextureNode extends UniformNode { // @TODO: Move to TSL - uv( uvNode ) { + uv( uvNode ) { // @deprecated, r172 + + console.warn( 'THREE.TextureNode: .uv() has been renamed. Use .sample() instead.' ); + + return this.sample( uvNode ); + + } + + sample( uvNode ) { const textureNode = this.clone(); textureNode.uvNode = nodeObject( uvNode ); @@ -6748,6 +7298,11 @@ const positionWorldDirection = /*@__PURE__*/ positionLocal.transformDirection( m const positionView = /*@__PURE__*/ modelViewMatrix.mul( positionLocal ).xyz.varying( 'v_positionView' ); const positionViewDirection = /*@__PURE__*/ positionView.negate().varying( 'v_positionViewDirection' ).normalize().toVar( 'positionViewDirection' ); +/** + * This node can be used to evaluate whether a primitive is front or back facing. + * + * @augments Node + */ class FrontFacingNode extends Node { static get type() { @@ -6756,10 +7311,20 @@ class FrontFacingNode extends Node { } + /** + * Constructs a new front facing node. + */ constructor() { super( 'bool' ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFrontFacingNode = true; } @@ -7003,8 +7568,9 @@ class UniformArrayElementNode extends ArrayElementNode { const snippet = super.generate( builder ); const type = this.getNodeType(); + const paddedType = this.node.getPaddedType(); - return builder.format( snippet, 'vec4', type ); + return builder.format( snippet, paddedType, type ); } @@ -7020,13 +7586,11 @@ class UniformArrayNode extends BufferNode { constructor( value, elementType = null ) { - super( null, 'vec4' ); + super( null ); this.array = value; - this.elementType = elementType; - - this._elementType = null; - this._elementLength = 0; + this.elementType = elementType === null ? getValueType( value[ 0 ] ) : elementType; + this.paddedType = this.getPaddedType(); this.updateType = NodeUpdateType.RENDER; @@ -7034,15 +7598,43 @@ class UniformArrayNode extends BufferNode { } + getNodeType() { + + return this.paddedType; + + } + getElementType() { - return this.elementType || this._elementType; + return this.elementType; } - getElementLength() { + getPaddedType() { + + const elementType = this.elementType; + + let paddedType = 'vec4'; + + if ( elementType === 'mat2' ) { + + paddedType = 'mat2'; + + } else if ( /mat/.test( elementType ) === true ) { + + paddedType = 'mat4'; + + } else if ( elementType.charAt( 0 ) === 'i' ) { - return this._elementLength; + paddedType = 'ivec4'; + + } else if ( elementType.charAt( 0 ) === 'u' ) { + + paddedType = 'uvec4'; + + } + + return paddedType; } @@ -7050,10 +7642,9 @@ class UniformArrayNode extends BufferNode { const { array, value } = this; - const elementLength = this.getElementLength(); - const elementType = this.getElementType(); + const elementType = this.elementType; - if ( elementLength === 1 ) { + if ( elementType === 'float' || elementType === 'int' || elementType === 'uint' ) { for ( let i = 0; i < array.length; i ++ ) { @@ -7077,6 +7668,58 @@ class UniformArrayNode extends BufferNode { } + } else if ( elementType === 'mat2' ) { + + for ( let i = 0; i < array.length; i ++ ) { + + const index = i * 4; + const matrix = array[ i ]; + + value[ index ] = matrix.elements[ 0 ]; + value[ index + 1 ] = matrix.elements[ 1 ]; + value[ index + 2 ] = matrix.elements[ 2 ]; + value[ index + 3 ] = matrix.elements[ 3 ]; + + } + + } else if ( elementType === 'mat3' ) { + + for ( let i = 0; i < array.length; i ++ ) { + + const index = i * 16; + const matrix = array[ i ]; + + value[ index ] = matrix.elements[ 0 ]; + value[ index + 1 ] = matrix.elements[ 1 ]; + value[ index + 2 ] = matrix.elements[ 2 ]; + + value[ index + 4 ] = matrix.elements[ 3 ]; + value[ index + 5 ] = matrix.elements[ 4 ]; + value[ index + 6 ] = matrix.elements[ 5 ]; + + value[ index + 8 ] = matrix.elements[ 6 ]; + value[ index + 9 ] = matrix.elements[ 7 ]; + value[ index + 10 ] = matrix.elements[ 8 ]; + + value[ index + 15 ] = 1; + + } + + } else if ( elementType === 'mat4' ) { + + for ( let i = 0; i < array.length; i ++ ) { + + const index = i * 16; + const matrix = array[ i ]; + + for ( let i = 0; i < matrix.elements.length; i ++ ) { + + value[ index + i ] = matrix.elements[ i ]; + + } + + } + } else { for ( let i = 0; i < array.length; i ++ ) { @@ -7098,18 +7741,19 @@ class UniformArrayNode extends BufferNode { setup( builder ) { const length = this.array.length; - - this._elementType = this.elementType === null ? getValueType( this.array[ 0 ] ) : this.elementType; - this._elementLength = builder.getTypeLength( this._elementType ); + const elementType = this.elementType; let arrayType = Float32Array; - if ( this._elementType.charAt( 0 ) === 'i' ) arrayType = Int32Array; - else if ( this._elementType.charAt( 0 ) === 'u' ) arrayType = Uint32Array; + const paddedType = this.paddedType; + const paddedElementLength = builder.getTypeLength( paddedType ); - this.value = new arrayType( length * 4 ); + if ( elementType.charAt( 0 ) === 'i' ) arrayType = Int32Array; + if ( elementType.charAt( 0 ) === 'u' ) arrayType = Uint32Array; + + this.value = new arrayType( length * paddedElementLength ); this.bufferCount = length; - this.bufferType = builder.changeComponentType( 'vec4', builder.getComponentType( this._elementType ) ); + this.bufferType = paddedType; return super.setup( builder ); @@ -7444,6 +8088,15 @@ const perturbNormal2Arb = /*@__PURE__*/ Fn( ( inputs ) => { } ); +/** + * This class can be used for applying normals maps to materials. + * + * ```js + * material.normalNode = normalMap( texture( normalTex ) ); + * ``` + * + * @augments TempNode + */ class NormalMapNode extends TempNode { static get type() { @@ -7452,13 +8105,37 @@ class NormalMapNode extends TempNode { } + /** + * Constructs a new normal map node. + * + * @param {Node} textureNode - Represents the normal map data. + * @param {Node?} [scaleNode=null] - Controls the intensity of the effect. + */ constructor( node, scaleNode = null ) { super( 'vec3' ); + /** + * Represents the normal map data. + * + * @type {Node} + */ this.node = node; + + /** + * Controls the intensity of the effect. + * + * @type {Node?} + * @default null + */ this.scaleNode = scaleNode; + /** + * The normal map type. + * + * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)} + * @default TangentSpaceNormalMap + */ this.normalMapType = TangentSpaceNormalMap; } @@ -7549,6 +8226,15 @@ const perturbNormalArb = Fn( ( inputs ) => { } ); +/** + * This class can be used for applying bump maps to materials. + * + * ```js + * material.normalNode = bumpMap( texture( bumpTex ) ); + * ``` + * + * @augments TempNode + */ class BumpMapNode extends TempNode { static get type() { @@ -7557,11 +8243,29 @@ class BumpMapNode extends TempNode { } + /** + * Constructs a new bump map node. + * + * @param {Node} textureNode - Represents the bump map data. + * @param {Node?} [scaleNode=null] - Controls the intensity of the bump effect. + */ constructor( textureNode, scaleNode = null ) { super( 'vec3' ); + /** + * Represents the bump map data. + * + * @type {Node} + */ this.textureNode = textureNode; + + /** + * Controls the intensity of the bump effect. + * + * @type {Node?} + * @default null + */ this.scaleNode = scaleNode; } @@ -8609,6 +9313,32 @@ class SkinningNode extends Node { const skinning = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh ) ); const skinningReference = ( skinnedMesh ) => nodeObject( new SkinningNode( skinnedMesh, true ) ); +/** + * This module offers a variety of ways to implement loops in TSL. In it's basic form it's: + * ```js + * Loop( count, ( { i } ) => { + * + * } ); + * ``` + * However, it is also possible to define a start and end ranges, data types and loop conditions: + * ```js + * Loop( { start: int( 0 ), end: int( 10 ), type: 'int', condition: '<' }, ( { i } ) => { + * + * } ); + *``` + * Nested loops can be definde in a compacted form: + * ```js + * Loop( 10, 5, ( { i, j } ) => { + * + * } ); + * ``` + * Loops that should run backwards can be defined like so: + * ```js + * Loop( { start: 10 }, () => {} ); + * ``` + * The module also provides `Break()` and `Continue()` TSL expression for loop control. + * @augments Node + */ class LoopNode extends Node { static get type() { @@ -8617,6 +9347,11 @@ class LoopNode extends Node { } + /** + * Constructs a new loop node. + * + * @param {Array} params - Depending on the loop type, array holds different parameterization values for the loop. + */ constructor( params = [] ) { super(); @@ -8625,12 +9360,25 @@ class LoopNode extends Node { } + /** + * Returns a loop variable name based on an index. The pattern is + * `0` = `i`, `1`= `j`, `2`= `k` and so on. + * + * @param {Number} index - The index. + * @return {String} The loop variable name. + */ getVarName( index ) { return String.fromCharCode( 'i'.charCodeAt() + index ); } + /** + * Returns properties about this node. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {Object} The node properties. + */ getProperties( builder ) { const properties = builder.getNodeProperties( this ); @@ -8663,6 +9411,12 @@ class LoopNode extends Node { } + /** + * This method is overwritten since the node type is inferred based on the loop configuration. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node type. + */ getNodeType( builder ) { const { returnsNode } = this.getProperties( builder ); @@ -9197,6 +9951,13 @@ class IrradianceNode extends LightingNode { let screenSizeVec, viewportVec; +/** + * This node provides a collection of screen related metrics. + * Depending on {@link ScreenNode#scope}, the nodes can represent + * resolution or viewport data as well as fragment or uv coordinates. + * + * @augments Node + */ class ScreenNode extends Node { static get type() { @@ -9205,16 +9966,43 @@ class ScreenNode extends Node { } + /** + * Constructs a new screen node. + * + * @param {('coordinate'|'viewport'|'size'|'uv')} scope - The node's scope. + */ constructor( scope ) { super(); + /** + * The node represents different metric depending on which scope is selected. + * + * - `ScreenNode.COORDINATE`: Window-relative coordinates of the current fragment according to WebGPU standards. + * - `ScreenNode.VIEWPORT`: The current viewport defined as a four-dimensional vector. + * - `ScreenNode.SIZE`: The dimensions of the current bound framebuffer. + * - `ScreenNode.UV`: Normalized screen coordinates. + * + * @type {('coordinate'|'viewport'|'size'|'uv')} + */ this.scope = scope; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isViewportNode = true; } + /** + * This method is overwritten since the node type depends on the selected scope. + * + * @return {('vec2'|'vec4')} The node type. + */ getNodeType() { if ( this.scope === ScreenNode.VIEWPORT ) return 'vec4'; @@ -9222,6 +10010,11 @@ class ScreenNode extends Node { } + /** + * This method is overwritten since the node's update type depends on the selected scope. + * + * @return {NodeUpdateType} The update type. + */ getUpdateType() { let updateType = NodeUpdateType.NONE; @@ -9238,6 +10031,13 @@ class ScreenNode extends Node { } + /** + * `ScreenNode` implements {@link Node#update} to retrieve viewport and size information + * from the current renderer. + * + * @param {NodeFrame} frame - A reference to the current node frame. + * @return {Boolean?} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching). + */ update( { renderer } ) { const renderTarget = renderer.getRenderTarget(); @@ -9369,6 +10169,15 @@ const viewportBottomLeft = /*@__PURE__*/ ( Fn( () => { // @deprecated, r168 const _size$4 = /*@__PURE__*/ new Vector2(); +/** + * A special type of texture node which represents the data of the current viewport + * as a texture. The module extracts data from the current bound framebuffer with + * a copy operation so no extra render pass is required to produce the texture data + * (which is good for performance). `ViewportTextureNode` can be used as an input for a + * variety of effects like refractive or transmissive materials. + * + * @augments TextureNode + */ class ViewportTextureNode extends TextureNode { static get type() { @@ -9377,6 +10186,13 @@ class ViewportTextureNode extends TextureNode { } + /** + * Constructs a new viewport texture node. + * + * @param {Node} [uvNode=screenUV] - The uv node. + * @param {Node?} [levelNode=null] - The level node. + * @param {Texture?} [framebufferTexture=null] - A framebuffer texture holding the viewport data. If not provided, a framebuffer texture is created automatically. + */ constructor( uvNode = screenUV, levelNode = null, framebufferTexture = null ) { if ( framebufferTexture === null ) { @@ -9388,10 +10204,30 @@ class ViewportTextureNode extends TextureNode { super( framebufferTexture, uvNode, levelNode ); + /** + * Whether to generate mipmaps or not. + * + * @type {Boolean} + * @default false + */ this.generateMipmaps = false; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isOutputTextureNode = true; + /** + * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the + * scene once per frame in its {@link ViewportTextureNode#updateBefore} method. + * + * @type {String} + * @default 'frame' + */ this.updateBeforeType = NodeUpdateType.FRAME; } @@ -9440,6 +10276,13 @@ const viewportMipTexture = /*@__PURE__*/ nodeProxy( ViewportTextureNode, null, n let sharedDepthbuffer = null; +/** + * Represents the depth of the current viewport as a texture. This module + * can be used in combination with viewport texture to achieve effects + * that require depth evaluation. + * + * @augments ViewportTextureNode + */ class ViewportDepthTextureNode extends ViewportTextureNode { static get type() { @@ -9448,6 +10291,12 @@ class ViewportDepthTextureNode extends ViewportTextureNode { } + /** + * Constructs a new viewport shared texture node. + * + * @param {Node} [uvNode=screenUV] - The uv node. + * @param {Node?} [levelNode=null] - The level node. + */ constructor( uvNode = screenUV, levelNode = null ) { if ( sharedDepthbuffer === null ) { @@ -9464,6 +10313,13 @@ class ViewportDepthTextureNode extends ViewportTextureNode { const viewportDepthTexture = /*@__PURE__*/ nodeProxy( ViewportDepthTextureNode ); +/** + * This node offers a collection of features in context of the depth logic in the fragment shader. + * Depending on {@link ViewportDepthNode#scope}, it can be used to define a depth value for the current + * fragment or for depth evaluation purposes. + * + * @augments Node + */ class ViewportDepthNode extends Node { static get type() { @@ -9472,13 +10328,44 @@ class ViewportDepthNode extends Node { } + /** + * Constructs a new viewport depth node. + * + * @param {('depth'|'depthBase'|'linearDepth')} scope - The node's scope. + * @param {Node?} [valueNode=null] - The value node. + */ constructor( scope, valueNode = null ) { super( 'float' ); + /** + * The node behaves differently depending on which scope is selected. + * + * - `ViewportDepthNode.DEPTH_BASE`: Allows to define a value for the current fragment's depth. + * - `ViewportDepthNode.DEPTH`: Represents the depth value for the current fragment (`valueNode` is ignored). + * - `ViewportDepthNode.LINEAR_DEPTH`: Represents the linear (orthographic) depth value of the current fragment. + * If a `valueNode` is set, the scope can be used to convert perspective depth data to linear data. + * + * @type {('depth'|'depthBase'|'linearDepth')} + */ this.scope = scope; + + /** + * Can be used to define a custom depth value. + * The property is ignored in the `ViewportDepthNode.DEPTH` scope. + * + * @type {Node} + * @default null + */ this.valueNode = valueNode; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isViewportDepthNode = true; } @@ -10795,6 +11682,13 @@ class LineDashedNodeMaterial extends NodeMaterial { let _sharedFramebuffer = null; +/** + * `ViewportTextureNode` creates an internal texture for each node instance. This module + * shares a texture across all instances of `ViewportSharedTextureNode`. It should + * be the first choice when using data of the default/screen framebuffer for performance reasons. + * + * @augments ViewportTextureNode + */ class ViewportSharedTextureNode extends ViewportTextureNode { static get type() { @@ -10803,6 +11697,12 @@ class ViewportSharedTextureNode extends ViewportTextureNode { } + /** + * Constructs a new viewport shared texture node. + * + * @param {Node} [uvNode=screenUV] - The uv node. + * @param {Node?} [levelNode=null] - The level node. + */ constructor( uvNode = screenUV, levelNode = null ) { if ( _sharedFramebuffer === null ) { @@ -11263,7 +12163,24 @@ class Line2NodeMaterial extends NodeMaterial { } +/** @module Packing **/ + +/** + * Packs a direction vector into a color value. + * + * @method + * @param {Node} node - The direction to pack. + * @return {Node} The color. + */ const directionToColor = ( node ) => nodeObject( node ).mul( 0.5 ).add( 0.5 ); + +/** + * Unpacks a color value into a direction vector. + * + * @method + * @param {Node} color - The color to unpack. + * @return {Node} The direction. + */ const colorToDirection = ( node ) => nodeObject( node ).mul( 2.0 ).sub( 1 ); const _defaultValues$a = /*@__PURE__*/ new MeshNormalMaterial(); @@ -11300,6 +12217,17 @@ class MeshNormalNodeMaterial extends NodeMaterial { } +/** + * Can be used to compute texture coordinates for projecting an + * equirectangular texture onto a mesh for using it as the scene's + * background. + * + * ```js + * scene.backgroundNode = texture( equirectTexture, equirectUV() ); + * ``` + * + * @augments TempNode + */ class EquirectUVNode extends TempNode { static get type() { @@ -11308,10 +12236,20 @@ class EquirectUVNode extends TempNode { } + /** + * Constructs a new equirect uv node. + * + * @param {Node} [dirNode=positionWorldDirection] - A direction vector for sampling why is by default `positionWorldDirection`. + */ constructor( dirNode = positionWorldDirection ) { super( 'vec2' ); + /** + * A direction vector for sampling why is by default `positionWorldDirection`. + * + * @type {Node} + */ this.dirNode = dirNode; } @@ -11397,6 +12335,12 @@ class CubeRenderTarget extends WebGLCubeRenderTarget { const _cache$1 = new WeakMap(); +/** + * This node can be used to automatically convert environment maps in the + * equirectangular format into the cube map format. + * + * @augments TempNode + */ class CubeMapNode extends TempNode { static get type() { @@ -11405,20 +12349,59 @@ class CubeMapNode extends TempNode { } + /** + * Constructs a new cube map node. + * + * @param {Node} envNode - The node representing the environment map. + */ constructor( envNode ) { super( 'vec3' ); + /** + * The node representing the environment map. + * + * @type {Node} + */ this.envNode = envNode; + /** + * A reference to the internal cube texture. + * + * @private + * @type {CubeTexture} + * @default null + */ this._cubeTexture = null; + + /** + * A reference to the internal cube texture node. + * + * @private + * @type {CubeTextureNode} + */ this._cubeTextureNode = cubeTexture(); const defaultTexture = new CubeTexture(); defaultTexture.isRenderTargetTexture = true; + /** + * A default cube texture that acts as a placeholder. + * It is used when the conversion from equirectangular to cube + * map has not finished yet for a given texture. + * + * @private + * @type {CubeTexture} + */ this._defaultTexture = defaultTexture; + /** + * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates + * the texture once per render in its {@link CubeMapNode#updateBefore} method. + * + * @type {String} + * @default 'render' + */ this.updateBeforeType = NodeUpdateType.RENDER; } @@ -11504,6 +12487,14 @@ class CubeMapNode extends TempNode { } +/** + * Returns true if the given equirectangular image has been fully loaded + * and is ready for further processing. + * + * @private + * @param {Image} image - The equirectangular image to check. + * @return {Boolean} Whether the image is ready or not. + */ function isEquirectangularMapReady$1( image ) { if ( image === null || image === undefined ) return false; @@ -11512,6 +12503,14 @@ function isEquirectangularMapReady$1( image ) { } +/** + * This function is executed when `dispose()` is called on the equirectangular + * texture. In this case, the generated cube map with its render target + * is deleted as well. + * + * @private + * @param {Object} event - The event object. + */ function onTextureDispose( event ) { const texture = event.target; @@ -11530,6 +12529,14 @@ function onTextureDispose( event ) { } +/** + * This function makes sure the generated cube map uses the correct + * texture mapping that corresponds to the equirectangular original. + * + * @private + * @param {Texture} texture - The cube texture. + * @param {Number} mapping - The original texture mapping. + */ function mapTextureMapping( texture, mapping ) { if ( mapping === EquirectangularReflectionMapping ) { @@ -11612,6 +12619,7 @@ class LightingModel { * This method is intended for setting up lighting model and context data * which are later used in the evaluation process. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11622,6 +12630,7 @@ class LightingModel { * This method is intended for executing final tasks like final updates * to the outgoing light. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11632,6 +12641,7 @@ class LightingModel { * This method is intended for implementing the direct light term and * executed during the build process of directional, point and spot light nodes. * + * @abstract * @param {Object} input - The input data. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11642,6 +12652,7 @@ class LightingModel { * This method is intended for implementing the direct light term for * rect area light nodes. * + * @abstract * @param {Object} input - The input data. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11651,6 +12662,7 @@ class LightingModel { /** * This method is intended for implementing the indirect light term. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11662,6 +12674,7 @@ class LightingModel { * Unlike other methods, this method must be called manually by the lighting * model in its indirect term. * + * @abstract * @param {ContextNode} input - The current node context. * @param {StackNode} stack - The current stack. * @param {NodeBuilder} builder - The current node builder. @@ -11670,14 +12683,31 @@ class LightingModel { } +/** + * Represents the lighting model for unlit materials. The only light contribution + * is baked indirect lighting modulated with ambient occlusion and the material's + * diffuse color. Environment mapping is supported. Used in {@link MeshBasicNodeMaterial}. + * + * @augments LightingModel + */ class BasicLightingModel extends LightingModel { + /** + * Constructs a new basic lighting model. + */ constructor() { super(); } + /** + * Implements the baked indirect lighting with its modulation. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( context, stack, builder ) { const ambientOcclusion = context.ambientOcclusion; @@ -11706,6 +12736,13 @@ class BasicLightingModel extends LightingModel { } + /** + * Implements the environment mapping. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ finish( context, stack, builder ) { const material = builder.material; @@ -11848,16 +12885,42 @@ const BRDF_BlinnPhong = /*@__PURE__*/ Fn( ( { lightDirection } ) => { } ); +/** + * Represents the lighting model for a phong material. Used in {@link MeshPhongNodeMaterial}. + * + * @augments LightingModel + */ class PhongLightingModel extends BasicLightingModel { + /** + * Constructs a new phong lighting model. + * + * @param {Boolean} [specular=true] - Whether specular is supported or not. + */ constructor( specular = true ) { super(); + /** + * Whether specular is supported or not. Set this to `false` if you are + * lookking for a Lambert-like material meaning a material for non-shiny + * surfaces, without specular highlights. + * + * @type {Boolean} + * @default true + */ this.specular = specular; } + /** + * Implements the direct lighting. The specular portion is optional an can be controlled + * with the {@link PhongLightingModel#specular} flag. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ direct( { lightDirection, lightColor, reflectedLight } ) { const dotNL = transformedNormalView.dot( lightDirection ).clamp(); @@ -11873,6 +12936,13 @@ class PhongLightingModel extends BasicLightingModel { } + /** + * Implements the indirect lighting. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( { ambientOcclusion, irradiance, reflectedLight } ) { reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) ); @@ -12432,8 +13502,8 @@ const bicubic = ( textureNode, texelSize, lod ) => { const p2 = vec2( iuv.x.add( h0x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy ); const p3 = vec2( iuv.x.add( h1x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy ); - const a = g0( fuv.y ).mul( add( g0x.mul( textureNode.uv( p0 ).level( lod ) ), g1x.mul( textureNode.uv( p1 ).level( lod ) ) ) ); - const b = g1( fuv.y ).mul( add( g0x.mul( textureNode.uv( p2 ).level( lod ) ), g1x.mul( textureNode.uv( p3 ).level( lod ) ) ) ); + const a = g0( fuv.y ).mul( add( g0x.mul( textureNode.sample( p0 ).level( lod ) ), g1x.mul( textureNode.sample( p1 ).level( lod ) ) ) ); + const b = g1( fuv.y ).mul( add( g0x.mul( textureNode.sample( p2 ).level( lod ) ), g1x.mul( textureNode.sample( p3 ).level( lod ) ) ) ); return a.add( b ); @@ -12505,7 +13575,7 @@ const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ], const vTexture = material.side == BackSide ? viewportBackSideTexture : viewportFrontSideTexture; - const transmissionSample = vTexture.uv( fragCoord ); + const transmissionSample = vTexture.sample( fragCoord ); //const transmissionSample = viewportMipTexture( fragCoord ); const lod = log2( screenSize.x ).mul( applyIorToRoughness( roughness, ior ) ); @@ -12771,31 +13841,140 @@ const IBLSheenBRDF = /*@__PURE__*/ Fn( ( { normal, viewDir, roughness } ) => { const clearcoatF0 = vec3( 0.04 ); const clearcoatF90 = float( 1 ); -// +/** + * Represents the lighting model for a PBR material. + * + * @augments LightingModel + */ class PhysicalLightingModel extends LightingModel { + /** + * Constructs a new physical lighting model. + * + * @param {Boolean} [clearcoat=false] - Whether clearcoat is supported or not. + * @param {Boolean} [sheen=false] - Whether sheen is supported or not. + * @param {Boolean} [iridescence=false] - Whether iridescence is supported or not. + * @param {Boolean} [anisotropy=false] - Whether anisotropy is supported or not. + * @param {Boolean} [transmission=false] - Whether transmission is supported or not. + * @param {Boolean} [dispersion=false] - Whether dispersion is supported or not. + */ constructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false ) { super(); + /** + * Whether clearcoat is supported or not. + * + * @type {Boolean} + * @default false + */ this.clearcoat = clearcoat; + + /** + * Whether sheen is supported or not. + * + * @type {Boolean} + * @default false + */ this.sheen = sheen; + + /** + * Whether iridescence is supported or not. + * + * @type {Boolean} + * @default false + */ this.iridescence = iridescence; + + /** + * Whether anisotropy is supported or not. + * + * @type {Boolean} + * @default false + */ this.anisotropy = anisotropy; + + /** + * Whether transmission is supported or not. + * + * @type {Boolean} + * @default false + */ this.transmission = transmission; + + /** + * Whether dispersion is supported or not. + * + * @type {Boolean} + * @default false + */ this.dispersion = dispersion; + /** + * The clear coat radiance. + * + * @type {Node?} + * @default null + */ this.clearcoatRadiance = null; + + /** + * The clear coat specular direct. + * + * @type {Node?} + * @default null + */ this.clearcoatSpecularDirect = null; + + /** + * The clear coat specular indirect. + * + * @type {Node?} + * @default null + */ this.clearcoatSpecularIndirect = null; + + /** + * The sheen specular direct. + * + * @type {Node?} + * @default null + */ this.sheenSpecularDirect = null; + + /** + * The sheen specular indirect. + * + * @type {Node?} + * @default null + */ this.sheenSpecularIndirect = null; + + /** + * The iridescence Fresnel. + * + * @type {Node?} + * @default null + */ this.iridescenceFresnel = null; + + /** + * The iridescence F0. + * + * @type {Node?} + * @default null + */ this.iridescenceF0 = null; } + /** + * Depending on what features are requested, the method prepares certain node variables + * which are later used for lighting computations. + * + * @param {ContextNode} input - The current node context. + */ start( context ) { if ( this.clearcoat === true ) { @@ -12886,6 +14065,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the direct light. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ direct( { lightDirection, lightColor, reflectedLight } ) { const dotNL = transformedNormalView.dot( lightDirection ).clamp(); @@ -12912,6 +14098,14 @@ class PhysicalLightingModel extends LightingModel { } + /** + * This method is intended for implementing the direct light term for + * rect area light nodes. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ directRectArea( { lightColor, lightPosition, halfWidth, halfHeight, reflectedLight, ltc_1, ltc_2 } ) { const p0 = lightPosition.add( halfWidth ).sub( halfHeight ); // counterclockwise; light shines in local neg z direction @@ -12925,8 +14119,8 @@ class PhysicalLightingModel extends LightingModel { const uv = LTC_Uv( { N, V, roughness } ); - const t1 = ltc_1.uv( uv ).toVar(); - const t2 = ltc_2.uv( uv ).toVar(); + const t1 = ltc_1.sample( uv ).toVar(); + const t2 = ltc_2.sample( uv ).toVar(); const mInv = mat3( vec3( t1.x, 0, t1.y ), @@ -12944,6 +14138,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the indirect lighting. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( context, stack, builder ) { this.indirectDiffuse( context, stack, builder ); @@ -12952,12 +14153,26 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the indirect diffuse term. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirectDiffuse( { irradiance, reflectedLight } ) { reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) ); } + /** + * Implements the indirect specular term. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirectSpecular( { radiance, iblIrradiance, reflectedLight } ) { if ( this.sheen === true ) { @@ -13007,6 +14222,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Implements the ambient occlusion term. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ ambientOcclusion( { ambientOcclusion, reflectedLight } ) { const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV @@ -13033,6 +14255,13 @@ class PhysicalLightingModel extends LightingModel { } + /** + * Used for final lighting accumulations depending on the requested features. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ finish( context ) { const { outgoingLight } = context; @@ -13299,7 +14528,7 @@ const bilinearCubeUV = /*@__PURE__*/ Fn( ( [ envMap, direction_immutable, mipInt uv.x.mulAssign( CUBEUV_TEXEL_WIDTH ); uv.y.mulAssign( CUBEUV_TEXEL_HEIGHT ); - return envMap.uv( uv ).grad( vec2(), vec2() ); // disable anisotropic filtering + return envMap.sample( uv ).grad( vec2(), vec2() ); // disable anisotropic filtering } ); @@ -14138,8 +15367,21 @@ const getGradientIrradiance = /*@__PURE__*/ Fn( ( { normal, lightDirection, buil } ); +/** + * Represents the lighting model for a toon material. Used in {@link MeshToonNodeMaterial}. + * + * @augments LightingModel + */ class ToonLightingModel extends LightingModel { + /** + * Implements the direct lighting. Instead of using a conventional smooth irradiance, the irradiance is + * reduced to a small number of discrete shades to create a comic-like, flat look. + * + * @param {Object} input - The input data. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ direct( { lightDirection, lightColor, reflectedLight }, stack, builder ) { const irradiance = getGradientIrradiance( { normal: normalGeometry, lightDirection, builder } ).mul( lightColor ); @@ -14148,6 +15390,13 @@ class ToonLightingModel extends LightingModel { } + /** + * Implements the indirect lighting. + * + * @param {ContextNode} input - The current node context. + * @param {StackNode} stack - The current stack. + * @param {NodeBuilder} builder - The current node builder. + */ indirect( { ambientOcclusion, irradiance, reflectedLight } ) { reflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) ); @@ -14190,6 +15439,12 @@ class MeshToonNodeMaterial extends NodeMaterial { } +/** + * Can be used to compute texture coordinates for projecting a + * matcap onto a mesh. Used by {@link MeshMatcapNodeMaterial}. + * + * @augments TempNode + */ class MatcapUVNode extends TempNode { static get type() { @@ -14198,6 +15453,9 @@ class MatcapUVNode extends TempNode { } + /** + * Constructs a new matcap uv node. + */ constructor() { super( 'vec2' ); @@ -14300,6 +15558,11 @@ class PointsNodeMaterial extends NodeMaterial { } +/** + * Applies a rotation to the given position node. + * + * @augments TempNode + */ class RotateNode extends TempNode { static get type() { @@ -14308,15 +15571,40 @@ class RotateNode extends TempNode { } + /** + * Constructs a new rotate node. + * + * @param {Node} positionNode - The position node. + * @param {Node} rotationNode - Represents the rotation that is applied to the position node. Depending + * on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value. + */ constructor( positionNode, rotationNode ) { super(); + /** + * The position node. + * + * @type {Node} + */ this.positionNode = positionNode; + + /** + * Represents the rotation that is applied to the position node. + * Depending on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value. + * + * @type {Node} + */ this.rotationNode = rotationNode; } + /** + * The type of the {@link RotateNode#positionNode} defines the node's type. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {String} The node's type. + */ getNodeType( builder ) { return this.positionNode.getNodeType( builder ); @@ -14478,22 +15766,45 @@ class SpriteNodeMaterial extends NodeMaterial { } +/** + * Represents lighting model for a shadow material. Used in {@link ShadowNodeMaterial}. + * + * @augments LightingModel + */ class ShadowMaskModel extends LightingModel { + /** + * Constructs a new shadow mask model. + */ constructor() { super(); + /** + * The shadow mask node. + * + * @type {Node} + */ this.shadowNode = float( 1 ).toVar( 'shadowMask' ); } + /** + * Only used to save the shadow mask. + * + * @param {Object} input - The input data. + */ direct( { shadowMask } ) { this.shadowNode.mulAssign( shadowMask ); } + /** + * Uses the shadow mask to produce the final color. + * + * @param {ContextNode} input - The current node context. + */ finish( context ) { diffuseColor.a.mulAssign( this.shadowNode.oneMinus() ); @@ -14570,9 +15881,9 @@ const normal = Fn( ( { texture, uv } ) => { const step = 0.01; - const x = texture.uv( uv.add( vec3( - step, 0.0, 0.0 ) ) ).r.sub( texture.uv( uv.add( vec3( step, 0.0, 0.0 ) ) ).r ); - const y = texture.uv( uv.add( vec3( 0.0, - step, 0.0 ) ) ).r.sub( texture.uv( uv.add( vec3( 0.0, step, 0.0 ) ) ).r ); - const z = texture.uv( uv.add( vec3( 0.0, 0.0, - step ) ) ).r.sub( texture.uv( uv.add( vec3( 0.0, 0.0, step ) ) ).r ); + const x = texture.sample( uv.add( vec3( - step, 0.0, 0.0 ) ) ).r.sub( texture.sample( uv.add( vec3( step, 0.0, 0.0 ) ) ).r ); + const y = texture.sample( uv.add( vec3( 0.0, - step, 0.0 ) ) ).r.sub( texture.sample( uv.add( vec3( 0.0, step, 0.0 ) ) ).r ); + const z = texture.sample( uv.add( vec3( 0.0, 0.0, - step ) ) ).r.sub( texture.sample( uv.add( vec3( 0.0, 0.0, step ) ) ).r ); ret.assign( vec3( x, y, z ) ); @@ -14701,7 +16012,7 @@ class VolumeNodeMaterial extends NodeMaterial { Loop( { type: 'float', start: bounds.x, end: bounds.y, update: '+= delta' }, () => { - const d = property( 'float', 'd' ).assign( map.uv( p.add( 0.5 ) ).r ); + const d = property( 'float', 'd' ).assign( map.sample( p.add( 0.5 ) ).r ); if ( this.testNode !== null ) { @@ -17279,6 +18590,11 @@ class Color4 extends Color { } +/** + * Special version of {@link PropertyNode} which is used for parameters. + * + * @augments PropertyNode + */ class ParameterNode extends PropertyNode { static get type() { @@ -17287,10 +18603,23 @@ class ParameterNode extends PropertyNode { } + /** + * Constructs a new parameter node. + * + * @param {String} nodeType - The type of the node. + * @param {String?} [name=null] - The name of the parameter in the shader. + */ constructor( nodeType, name = null ) { super( nodeType, name ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isParameterNode = true; } @@ -17311,6 +18640,12 @@ class ParameterNode extends PropertyNode { const parameter = ( type, name ) => nodeObject( new ParameterNode( type, name ) ); +/** + * Stack is a helper for Nodes that need to produce stack-based code instead of continuous flow. + * They are usually needed in cases like `If`, `Else`. + * + * @augments Node + */ class StackNode extends Node { static get type() { @@ -17319,17 +18654,54 @@ class StackNode extends Node { } + /** + * Constructs a new stack node. + * + * @param {StackNode?} [parent=null] - The parent stack node. + */ constructor( parent = null ) { super(); + /** + * List of nodes. + * + * @type {Array} + */ this.nodes = []; + + /** + * The output node. + * + * @type {Node?} + * @default null + */ this.outputNode = null; + /** + * The parent stack node. + * + * @type {StackNode} + * @default null + */ this.parent = parent; + /** + * The current conditional node. + * + * @private + * @type {ConditionalNode} + * @default null + */ this._currentCond = null; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isStackNode = true; } @@ -17340,6 +18712,12 @@ class StackNode extends Node { } + /** + * Adds a node to this stack. + * + * @param {Node} node - The node to add. + * @return {StackNode} A reference to this stack node. + */ add( node ) { this.nodes.push( node ); @@ -17348,6 +18726,13 @@ class StackNode extends Node { } + /** + * Represent an `if` statement in TSL. + * + * @param {Node} boolNode - Represents the condition. + * @param {Function} method - TSL code which is executed if the condition evaluates to `true`. + * @return {StackNode} A reference to this stack node. + */ If( boolNode, method ) { const methodNode = new ShaderNode( method ); @@ -17357,6 +18742,13 @@ class StackNode extends Node { } + /** + * Represent an `elseif` statement in TSL. + * + * @param {Node} boolNode - Represents the condition. + * @param {Function} method - TSL code which is executed if the condition evaluates to `true`. + * @return {StackNode} A reference to this stack node. + */ ElseIf( boolNode, method ) { const methodNode = new ShaderNode( method ); @@ -17369,6 +18761,12 @@ class StackNode extends Node { } + /** + * Represent an `else` statement in TSL. + * + * @param {Function} method - TSL code which is executed in the `else` case. + * @return {StackNode} A reference to this stack node. + */ Else( method ) { this._currentCond.elseNode = new ShaderNode( method ); @@ -17809,8 +19207,27 @@ const overloadingBaseFn = /*@__PURE__*/ nodeProxy( FunctionOverloadingNode ); const overloadingFn = ( functionNodes ) => ( ...params ) => overloadingBaseFn( functionNodes, ...params ); +/** @module Timer **/ + +/** + * Represents the elapsed time in seconds. + * + * @type {UniformNode} + */ const time = /*@__PURE__*/ uniform( 0 ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.time ); + +/** + * Represents the delta time in seconds. + * + * @type {UniformNode} + */ const deltaTime = /*@__PURE__*/ uniform( 0 ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.deltaTime ); + +/** + * Represents the current frame ID. + * + * @type {UniformNode} + */ const frameId = /*@__PURE__*/ uniform( 0, 'uint' ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.frameId ); // Deprecated @@ -17836,17 +19253,70 @@ const timerDelta = ( timeScale = 1 ) => { // @deprecated, r170 }; +/** @module Oscillators **/ + +/** + * Generates a sine wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscSine = ( t = time ) => t.add( 0.75 ).mul( Math.PI * 2 ).sin().mul( 0.5 ).add( 0.5 ); + +/** + * Generates a square wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscSquare = ( t = time ) => t.fract().round(); + +/** + * Generates a triangle wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscTriangle = ( t = time ) => t.add( 0.5 ).fract().mul( 2 ).sub( 1 ).abs(); + +/** + * Generates a sawtooth wave oscillation based on a timer. + * + * @method + * @param {Node} time - The timer to generate the oscillation with. + * @return {Node} The oscillation node. + */ const oscSawtooth = ( t = time ) => t.fract(); +/** @module UVUtils **/ + +/** + * Rotates the given uv coordinates around a center point + * + * @method + * @param {Node} uv - The uv coordinates. + * @param {Node} rotation - The rotation defined in radians. + * @param {Node} center - The center of rotation + * @return {Node} The rotated uv coordinates. + */ const rotateUV = /*@__PURE__*/ Fn( ( [ uv, rotation, center = vec2( 0.5 ) ] ) => { return rotate( uv.sub( center ), rotation ).add( center ); } ); +/** + * Applies a spherical warping effect to the given uv coordinates. + * + * @method + * @param {Node} uv - The uv coordinates. + * @param {Node} strength - The strength of the effect. + * @param {Node} center - The center point + * @return {Node} The updated uv coordinates. + */ const spherizeUV = /*@__PURE__*/ Fn( ( [ uv, strength, center = vec2( 0.5 ) ] ) => { const delta = uv.sub( center ); @@ -17858,6 +19328,23 @@ const spherizeUV = /*@__PURE__*/ Fn( ( [ uv, strength, center = vec2( 0.5 ) ] ) } ); +/** @module SpriteUtils **/ + +/** + * This can be used to achieve a billboarding behavior for flat meshes. That means they are + * oriented always towards the camera. + * + * ```js + * material.vertexNode = billboarding(); + * ``` + * + * @method + * @param {Object} config - The configuration object. + * @param {Node?} [config.position=null] - Can be used to define the vertex positions in world space. + * @param {Boolean} [config.horizontal=true] - Whether to follow the camera rotation horizontally or not. + * @param {Boolean} [config.vertical=false] - Whether to follow the camera rotation vertically or not. + * @return {Node} The updated vertex position in clip space. + */ const billboarding = /*@__PURE__*/ Fn( ( { position = null, horizontal = true, vertical = false } ) => { let worldMatrix; @@ -17901,6 +19388,19 @@ const billboarding = /*@__PURE__*/ Fn( ( { position = null, horizontal = true, v } ); +/** @module ViewportUtils **/ + +/** + * A special version of a screen uv function that involves a depth comparison + * when computing the final uvs. The function mitigates visual erros when + * using viewport texture nodes for refraction purposes. Without this function + * objects in front of a refractive surface might appear on the refractive surface + * which is incorrect. + * + * @method + * @param {Node?} uv - Optional uv coordinates. By default `screenUV` is used. + * @return {Node} The update uv coordinates. + */ const viewportSafeUV = /*@__PURE__*/ Fn( ( [ uv = null ] ) => { const depth = linearDepth(); @@ -17911,6 +19411,17 @@ const viewportSafeUV = /*@__PURE__*/ Fn( ( [ uv = null ] ) => { } ); +/** + * Can be used to compute texture coordinates for animated sprite sheets. + * + * ```js + * const uvNode = spritesheetUV( vec2( 6, 6 ), uv(), time.mul( animationSpeed ) ); + * + * material.colorNode = texture( spriteSheet, uvNode ); + * ``` + * + * @augments Node + */ class SpriteSheetUVNode extends Node { static get type() { @@ -17919,12 +19430,36 @@ class SpriteSheetUVNode extends Node { } + /** + * Constructs a new sprite sheet uv node. + * + * @param {Node} countNode - The node that defines the number of sprites in the x and y direction (e.g 6x6). + * @param {Node} [uvNode=uv()] - The uv node. + * @param {Node} [frameNode=float()] - The node that defines the current frame/sprite. + */ constructor( countNode, uvNode = uv(), frameNode = float( 0 ) ) { super( 'vec2' ); + /** + * The node that defines the number of sprites in the x and y direction (e.g 6x6). + * + * @type {Node} + */ this.countNode = countNode; + + /** + * The uv node. + * + * @type {Node} + */ this.uvNode = uvNode; + + /** + * The node that defines the current frame/sprite. + * + * @type {Node} + */ this.frameNode = frameNode; } @@ -17951,6 +19486,15 @@ class SpriteSheetUVNode extends Node { const spritesheetUV = /*@__PURE__*/ nodeProxy( SpriteSheetUVNode ); +/** + * Can be used for triplanar texture mapping. + * + * ```js + * material.colorNode = triplanarTexture( texture( diffuseMap ) ); + * ``` + * + * @augments Node + */ class TriplanarTexturesNode extends Node { static get type() { @@ -17959,17 +19503,65 @@ class TriplanarTexturesNode extends Node { } + /** + * Constructs a new triplanar textures node. + * + * @param {Node} textureXNode - First texture node. + * @param {Node?} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead. + * @param {Node?} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead. + * @param {Node?} [scaleNode=float(1)] - The scale node. + * @param {Node?} [positionNode=positionLocal] - Vertex positions in local space. + * @param {Node?} [normalNode=normalLocal] - Normals in local space. + */ constructor( textureXNode, textureYNode = null, textureZNode = null, scaleNode = float( 1 ), positionNode = positionLocal, normalNode = normalLocal ) { super( 'vec4' ); + /** + * First texture node. + * + * @type {Node} + */ this.textureXNode = textureXNode; + + /** + * Second texture node. When not set, the shader will sample from `textureXNode` instead. + * + * @type {Node} + * @default null + */ this.textureYNode = textureYNode; + + /** + * Third texture node. When not set, the shader will sample from `textureXNode` instead. + * + * @type {Node} + * @default null + */ this.textureZNode = textureZNode; + /** + * The scale node. + * + * @type {Node} + * @default float(1) + */ this.scaleNode = scaleNode; + /** + * Vertex positions in local space. + * + * @type {Node} + * @default positionLocal + */ this.positionNode = positionNode; + + /** + * Normals in local space. + * + * @type {Node} + * @default normalLocal + */ this.normalNode = normalNode; } @@ -18028,6 +19620,19 @@ _defaultRT.depthTexture = new DepthTexture( 1, 1 ); let _inReflector = false; +/** + * This node can be used to implement mirror-like flat reflective surfaces. + * + * ```js + * const groundReflector = reflector(); + * material.colorNode = groundReflector; + * + * const plane = new Mesh( geometry, material ); + * plane.add( groundReflector.target ); + * ``` + * + * @augments TextureNode + */ class ReflectorNode extends TextureNode { static get type() { @@ -18036,29 +19641,70 @@ class ReflectorNode extends TextureNode { } + /** + * Constructs a new reflector node. + * + * @param {Object} [parameters={}] - An object holding configuration parameters. + * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to. + * @param {Number} [parameters.resolution=1] - The resolution scale. + * @param {Boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not. + * @param {Boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not. + * @param {Boolean} [parameters.depth=false] - Whether depth data should be generated or not. + */ constructor( parameters = {} ) { super( parameters.defaultTexture || _defaultRT.texture, _defaultUV ); + /** + * A reference to the internal reflector base node which holds the actual implementation. + * + * @private + * @type {Node?} + * @default null + */ this._reflectorBaseNode = parameters.reflector || new ReflectorBaseNode( this, parameters ); + + /** + * A reference to the internal depth node. + * + * @private + * @type {Node?} + * @default null + */ this._depthNode = null; this.setUpdateMatrix( false ); } + /** + * A reference to the internal reflector node. + * + * @type {Node} + */ get reflector() { return this._reflectorBaseNode; } + /** + * A reference to 3D object the reflector is linked to. + * + * @type {Object3D} + */ get target() { return this._reflectorBaseNode.target; } + /** + * Returns a node representing the mirror's depth. That can be used + * to implement more advanced reflection effects like distance attenuation. + * + * @return {Node} The depth node. + */ getDepthNode() { if ( this._depthNode === null ) { @@ -18100,7 +19746,15 @@ class ReflectorNode extends TextureNode { } - +/** + * Holds the actual implementation of the reflector. + * + * TOOD: Explain why `ReflectorBaseNode`. Originally the entire logic was implemented + * in `ReflectorNode`, see #29619. + * + * @private + * @augments Node + */ class ReflectorBaseNode extends Node { static get type() { @@ -18109,6 +19763,17 @@ class ReflectorBaseNode extends Node { } + /** + * Constructs a new reflector base node. + * + * @param {TextureNode} textureNode - Represents the rendered reflections as a texture node. + * @param {Object} [parameters={}] - An object holding configuration parameters. + * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to. + * @param {Number} [parameters.resolution=1] - The resolution scale. + * @param {Boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not. + * @param {Boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not. + * @param {Boolean} [parameters.depth=false] - Whether depth data should be generated or not. + */ constructor( textureNode, parameters = {} ) { super(); @@ -18121,23 +19786,85 @@ class ReflectorBaseNode extends Node { depth = false } = parameters; - // - + /** + * Represents the rendered reflections as a texture node. + * + * @type {TextureNode} + */ this.textureNode = textureNode; + /** + * The 3D object the reflector is linked to. + * + * @type {Object3D} + * @default {new Object3D()} + */ this.target = target; + + /** + * The resolution scale. + * + * @type {Number} + * @default {1} + */ this.resolution = resolution; + + /** + * Whether mipmaps should be generated or not. + * + * @type {Boolean} + * @default {false} + */ this.generateMipmaps = generateMipmaps; + + /** + * Whether reflectors can render other reflector nodes or not. + * + * @type {Boolean} + * @default {true} + */ this.bounces = bounces; + + /** + * Whether depth data should be generated or not. + * + * @type {Boolean} + * @default {false} + */ this.depth = depth; + /** + * The `updateBeforeType` is set to `NodeUpdateType.RENDER` when {@link ReflectorBaseNode#bounces} + * is `true`. Otherwise it's `NodeUpdateType.FRAME`. + * + * @type {String} + * @default 'render' + */ this.updateBeforeType = bounces ? NodeUpdateType.RENDER : NodeUpdateType.FRAME; + /** + * Weak map for managing virtual cameras. + * + * @type {WeakMap} + */ this.virtualCameras = new WeakMap(); + + /** + * Weak map for managing render targets. + * + * @type {WeakMap} + */ this.renderTargets = new WeakMap(); } + /** + * Updates the resolution of the internal render target. + * + * @private + * @param {RenderTarget} renderTarget - The render target to resize. + * @param {Renderer} renderer - The renderer that is used to determine the new size. + */ _updateResolution( renderTarget, renderer ) { const resolution = this.resolution; @@ -18156,6 +19883,13 @@ class ReflectorBaseNode extends Node { } + /** + * Returns a virtual camera for the given camera. The virutal camera is used to + * render the scene from the reflector's view so correct reflections can be produced. + * + * @param {Camera} camera - The scene's camera. + * @return {Camera} The corresponding virtual camera. + */ getVirtualCamera( camera ) { let virtualCamera = this.virtualCameras.get( camera ); @@ -18172,6 +19906,13 @@ class ReflectorBaseNode extends Node { } + /** + * Returns a render target for the given camera. The reflections are rendered + * into this render target. + * + * @param {Camera} camera - The scene's camera. + * @return {RenderTarget} The render target. + */ getRenderTarget( camera ) { let renderTarget = this.renderTargets.get( camera ); @@ -18370,6 +20111,14 @@ class QuadMesh extends Mesh { const _size$1 = /*@__PURE__*/ new Vector2(); +/** + * `RTTNode` takes another node and uses it with a `QuadMesh` to render into a texture (RTT). + * This module is especially relevant in context of post processing where certain nodes require + * texture input for their effects. With the helper function `convertToTexture()` which is based + * on this module, the node system can automatically ensure texture input if required. + * + * @augments Node + */ class RTTNode extends TextureNode { static get type() { @@ -18378,30 +20127,110 @@ class RTTNode extends TextureNode { } + /** + * Constructs a new RTT node. + * + * @param {Node} node - The node to render a texture with. + * @param {Number?} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized. + * @param {Number?} [height=null] - The height of the internal render target. + * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target. + */ constructor( node, width = null, height = null, options = { type: HalfFloatType } ) { const renderTarget = new RenderTarget( width, height, options ); super( renderTarget.texture, uv() ); + /** + * The node to render a texture with. + * + * @type {Node} + */ this.node = node; + + /** + * The width of the internal render target. + * If not width is applied, the render target is automatically resized. + * + * @type {Number?} + * @default null + */ this.width = width; + + /** + * The height of the internal render target. + * + * @type {Number?} + * @default null + */ this.height = height; + /** + * The pixel ratio + * + * @type {Number} + * @default 1 + */ + this.pixelRatio = 1; + + /** + * The render target + * + * @type {RenderTarget} + */ this.renderTarget = renderTarget; + /** + * Whether the texture requires an update or not. + * + * @type {Boolean} + * @default true + */ this.textureNeedsUpdate = true; - this.autoUpdate = true; - this.updateMap = new WeakMap(); + /** + * Whether the texture should automatically be updated or not. + * + * @type {Boolean} + * @default true + */ + this.autoUpdate = true; + /** + * The node which is used with the quad mesh for RTT. + * + * @private + * @type {Node} + * @default null + */ this._rttNode = null; + + /** + * The internal quad mesh for RTT. + * + * @private + * @type {QuadMesh} + */ this._quadMesh = new QuadMesh( new NodeMaterial() ); + /** + * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates + * the texture once per render in its {@link RTTNode#updateBefore} method. + * + * @type {String} + * @default 'render' + */ this.updateBeforeType = NodeUpdateType.RENDER; } + /** + * Whether the internal render target should automatically be resized or not. + * + * @type {Boolean} + * @readonly + * @default true + */ get autoSize() { return this.width === null; @@ -18418,6 +20247,12 @@ class RTTNode extends TextureNode { } + /** + * Sets the size of the internal render target + * + * @param {Number} width - The width to set. + * @param {Number} height - The width to set. + */ setSize( width, height ) { this.width = width; @@ -18432,6 +20267,11 @@ class RTTNode extends TextureNode { } + /** + * Sets the pixel ratio. This will also resize the render target. + * + * @param {Number} pixelRatio - The pixel ratio to set. + */ setPixelRatio( pixelRatio ) { this.pixelRatio = pixelRatio; @@ -18504,10 +20344,10 @@ const convertToTexture = ( node, ...params ) => { * depth value and the camera's inverse projection matrix. * * @method - * @param {vec2} screenPosition - The fragment's screen position expressed as uv coordinates. - * @param {float} depth - The fragment's depth value. - * @param {mat4} projectionMatrixInverse - The camera's inverse projection matrix. - * @return {vec3} The fragments position in view space. + * @param {Node} screenPosition - The fragment's screen position expressed as uv coordinates. + * @param {Node} depth - The fragment's depth value. + * @param {Node} projectionMatrixInverse - The camera's inverse projection matrix. + * @return {Node} The fragments position in view space. */ const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, projectionMatrixInverse ], builder ) => { @@ -18535,9 +20375,9 @@ const getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, projectionM * and the camera's projection matrix * * @method - * @param {vec3} viewPosition - The fragments position in view space. - * @param {mat4} projectionMatrix - The camera's projection matrix. - * @return {vec2} The fragment's screen position expressed as uv coordinates. + * @param {Node} viewPosition - The fragments position in view space. + * @param {Node} projectionMatrix - The camera's projection matrix. + * @return {Node} The fragment's screen position expressed as uv coordinates. */ const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionMatrix ] ) => { @@ -18552,10 +20392,10 @@ const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionMatrix ] * target is available or if flat surface normals are required. * * @method - * @param {vec2} uv - The texture coordinate. + * @param {Node} uv - The texture coordinate. * @param {DepthTexture} depthTexture - The depth texture. - * @param {mat4} projectionMatrixInverse - The camera's inverse projection matrix. - * @return {vec3} The computed normal vector. + * @param {Node} projectionMatrixInverse - The camera's inverse projection matrix. + * @return {Node} The computed normal vector. */ const getNormalFromDepth = /*@__PURE__*/ Fn( ( [ uv, depthTexture, projectionMatrixInverse ] ) => { @@ -18615,6 +20455,17 @@ class StorageBufferAttribute extends BufferAttribute { } +/** + * This class enables element access on instances of {@link StorageBufferNode}. + * In most cases, it is indirectly used when accessing elements with the + * {@link StorageBufferNode#element} method. + * + * ```js + * const position = positionStorage.element( instanceIndex ); + * ``` + * + * @augments ArrayElementNode + */ class StorageArrayElementNode extends ArrayElementNode { static get type() { @@ -18623,14 +20474,32 @@ class StorageArrayElementNode extends ArrayElementNode { } + /** + * Constructs storage buffer element node. + * + * @param {StorageBufferNode} node - The storage buffer node. + * @param {Node} indexNode - The index node that defines the element access. + */ constructor( storageBufferNode, indexNode ) { super( storageBufferNode, indexNode ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isStorageArrayElementNode = true; } + /** + * The storage buffer node. + * + * @type {StorageBufferNode} + */ set storageBufferNode( value ) { this.node = value; @@ -19446,18 +21315,43 @@ const overlay = ( ...params ) => { // @deprecated, r171 /** @module ColorAdjustment **/ +/** + * Computes a grayscale value for the given RGB color value. + * + * @method + * @param {vec3} color - The color value to compute the grayscale for. + * @return {vec3} The grayscale color. + */ const grayscale = /*@__PURE__*/ Fn( ( [ color ] ) => { return luminance( color.rgb ); } ); +/** + * Super-saturates or desaturates the given RGB color. + * + * @method + * @param {vec3} color - The input color. + * @param {float} [adjustment=1] - Specifies the amount of the conversion. A value under `1` desaturates the color, a value over `1` super-saturates it. + * @return {vec3} The saturated color. + */ const saturation = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { return adjustment.mix( luminance( color.rgb ), color.rgb ); } ); +/** + * Selectively enhance the intensity of less saturated RGB colors. Can result + * in a more natural and visually appealing image with enhanced color depth + * compared to {@link ColorAdjustment#saturation}. + * + * @method + * @param {vec3} color - The input color. + * @param {float} [adjustment=1] - Controls the intensity of the vibrance effect. + * @return {vec3} The updated color. + */ const vibrance = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { const average = add( color.r, color.g, color.b ).div( 3.0 ); @@ -19469,6 +21363,14 @@ const vibrance = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { } ); +/** + * Updates the hue component of the given RGB color while preserving its luminance and saturation. + * + * @method + * @param {vec3} color - The input color. + * @param {float} [adjustment=1] - Defines the degree of hue rotation in radians. A positive value rotates the hue clockwise, while a negative value rotates it counterclockwise. + * @return {vec3} The updated color. + */ const hue = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { const k = vec3( 0.57735, 0.57735, 0.57735 ); @@ -19479,13 +21381,19 @@ const hue = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => { } ); +/** + * Computes the luminance for the given RGB color value. + * + * @method + * @param {vec3} color - The color value to compute the luminance for. + * @param {vec3?} luminanceCoefficients - The luminance coefficients. By default predefined values of the current working color space are used. + * @return {vec3} The luminance. + */ const luminance = ( color, luminanceCoefficients = vec3( ColorManagement.getLuminanceCoefficients( new Vector3() ) ) ) => dot( color, luminanceCoefficients ); -const threshold = ( color, threshold ) => mix( vec3( 0.0 ), color, luminance( color ).sub( threshold ).max( 0 ) ); - /** * Color Decision List (CDL) v1.2 * @@ -19536,6 +21444,12 @@ const cdl = /*@__PURE__*/ Fn( ( [ } ); +/** + * Represents a posterize effect which reduces the number of colors + * in an image, resulting in a more blocky and stylized appearance. + * + * @augments TempNode + */ class PosterizeNode extends TempNode { static get type() { @@ -19544,11 +21458,28 @@ class PosterizeNode extends TempNode { } + /** + * Constructs a new posterize node. + * + * @param {Node} sourceNode - The input color. + * @param {Node} stepsNode - Controls the intensity of the posterization effect. A lower number results in a more blocky appearance. + */ constructor( sourceNode, stepsNode ) { super(); + /** + * The input color. + * + * @type {Node} + */ this.sourceNode = sourceNode; + + /** + * Controls the intensity of the posterization effect. A lower number results in a more blocky appearance. + * + * @type {Node} + */ this.stepsNode = stepsNode; } @@ -19567,6 +21498,12 @@ const posterize = /*@__PURE__*/ nodeProxy( PosterizeNode ); const _size = /*@__PURE__*/ new Vector2(); +/** + * Represents the texture of a pass node. + * + * @augments TextureNode + * @private + */ class PassTextureNode extends TextureNode { static get type() { @@ -19575,10 +21512,21 @@ class PassTextureNode extends TextureNode { } + /** + * Constructs a new pass texture node. + * + * @param {PassNode} passNode - The pass node. + * @param {Texture} texture - The output texture. + */ constructor( passNode, texture ) { super( texture ); + /** + * A reference to the pass node. + * + * @type {PassNode} + */ this.passNode = passNode; this.setUpdateMatrix( false ); @@ -19601,6 +21549,13 @@ class PassTextureNode extends TextureNode { } +/** + * An extension of `PassTextureNode` which allows to manage more than one + * internal texture. Relevant for the `getPreviousTexture()` related API. + * + * @augments PassTextureNode + * @private + */ class PassMultipleTextureNode extends PassTextureNode { static get type() { @@ -19609,15 +21564,40 @@ class PassMultipleTextureNode extends PassTextureNode { } + /** + * Constructs a new pass texture node. + * + * @param {PassNode} passNode - The pass node. + * @param {String} textureName - The output texture name. + * @param {Boolean} [previousTexture=false] - Whether previous frame data should be used or not. + */ constructor( passNode, textureName, previousTexture = false ) { + // null is passed to the super call since this class does not + // use an external texture for rendering pass data into. Instead + // the texture is managed by the pass node itself + super( passNode, null ); + /** + * The output texture name. + * + * @type {String} + */ this.textureName = textureName; + + /** + * Whether previous frame data should be used or not. + * + * @type {Boolean} + */ this.previousTexture = previousTexture; } + /** + * Updates the texture reference of this node. + */ updateTexture() { this.value = this.previousTexture ? this.passNode.getPreviousTexture( this.textureName ) : this.passNode.getTexture( this.textureName ); @@ -19640,6 +21620,21 @@ class PassMultipleTextureNode extends PassTextureNode { } +/** + * Represents a render pass (sometimes called beauty pass) in context of post processing. + * This pass produces a render for the given scene and camera and can provide multiple outputs + * via MRT for further processing. + * + * ```js + * const postProcessing = new PostProcessing( renderer ); + * + * const scenePass = pass( scene, camera ); + * + * postProcessing.outputNode = scenePass; + * ``` + * + * @augments TempNode + */ class PassNode extends TempNode { static get type() { @@ -19648,17 +21643,69 @@ class PassNode extends TempNode { } + /** + * Constructs a new pass node. + * + * @param {('color'|'depth')} scope - The scope of the pass. The scope determines whether the node outputs color or depth. + * @param {Scene} scene - A reference to the scene. + * @param {Camera} camera - A reference to the camera. + * @param {Object} options - Options for the internal render target. + */ constructor( scope, scene, camera, options = {} ) { super( 'vec4' ); + /** + * The scope of the pass. The scope determines whether the node outputs color or depth. + * + * @type {('color'|'depth')} + */ this.scope = scope; + + /** + * A reference to the scene. + * + * @type {Scene} + */ this.scene = scene; + + /** + * A reference to the camera. + * + * @type {camera} + */ this.camera = camera; + + /** + * Options for the internal render target. + * + * @type {Object} + */ this.options = options; + /** + * The pass's pixel ratio. Will be kept automatically kept in sync with the renderer's pixel ratio. + * + * @private + * @type {Number} + * @default 1 + */ this._pixelRatio = 1; + + /** + * The pass's pixel width. Will be kept automatically kept in sync with the renderer's width. + * @private + * @type {Number} + * @default 1 + */ this._width = 1; + + /** + * The pass's pixel height. Will be kept automatically kept in sync with the renderer's height. + * @private + * @type {Number} + * @default 1 + */ this._height = 1; const depthTexture = new DepthTexture(); @@ -19670,31 +21717,117 @@ class PassNode extends TempNode { renderTarget.texture.name = 'output'; renderTarget.depthTexture = depthTexture; + /** + * The pass's render target. + * + * @type {RenderTarget} + */ this.renderTarget = renderTarget; - this.updateBeforeType = NodeUpdateType.FRAME; - + /** + * A dictionary holding the internal result textures. + * + * @private + * @type {Object} + */ this._textures = { output: renderTarget.texture, depth: depthTexture }; + /** + * A dictionary holding the internal texture nodes. + * + * @private + * @type {Object} + */ this._textureNodes = {}; + + /** + * A dictionary holding the internal depth nodes. + * + * @private + * @type {Object} + */ this._linearDepthNodes = {}; + + /** + * A dictionary holding the internal viewZ nodes. + * + * @private + * @type {Object} + */ this._viewZNodes = {}; + /** + * A dictionary holding the texture data of the previous frame. + * Used for computing velocity/motion vectors. + * + * @private + * @type {Object} + */ this._previousTextures = {}; + + /** + * A dictionary holding the texture nodes of the previous frame. + * Used for computing velocity/motion vectors. + * + * @private + * @type {Object} + */ this._previousTextureNodes = {}; + /** + * The `near` property of the camera as a uniform. + * + * @private + * @type {UniformNode} + */ this._cameraNear = uniform( 0 ); + + /** + * The `far` property of the camera as a uniform. + * + * @private + * @type {UniformNode} + */ this._cameraFar = uniform( 0 ); + /** + * A MRT node configuring the MRT settings. + * + * @private + * @type {MRTNode?} + * @default null + */ this._mrt = null; + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isPassNode = true; + /** + * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the + * scene once per frame in its {@link PassNode#updateBefore} method. + * + * @type {String} + * @default 'frame' + */ + this.updateBeforeType = NodeUpdateType.FRAME; + } + /** + * Sets the given MRT node to setup MRT for this pass. + * + * @param {MRTNode} mrt - The MRT object. + * @return {PassNode} A reference to this pass. + */ setMRT( mrt ) { this._mrt = mrt; @@ -19703,18 +21836,34 @@ class PassNode extends TempNode { } + /** + * Returns the current MRT node. + * + * @return {MRTNode} The current MRT node. + */ getMRT() { return this._mrt; } + /** + * The method is overwritten so it always returns `true`. + * + * @return {Boolean} Whether this node is global or not. + */ isGlobal() { return true; } + /** + * Returns the texture for the given output name. + * + * @param {String} name - The output name to get the texture for. + * @return {Texture} The texture. + */ getTexture( name ) { let texture = this._textures[ name ]; @@ -19724,7 +21873,6 @@ class PassNode extends TempNode { const refTexture = this.renderTarget.texture; texture = refTexture.clone(); - texture.isRenderTargetTexture = true; texture.name = name; this._textures[ name ] = texture; @@ -19737,6 +21885,12 @@ class PassNode extends TempNode { } + /** + * Returns the texture holding the data of the previous frame for the given output name. + * + * @param {String} name - The output name to get the texture for. + * @return {Texture} The texture holding the data of the previous frame. + */ getPreviousTexture( name ) { let texture = this._previousTextures[ name ]; @@ -19744,7 +21898,6 @@ class PassNode extends TempNode { if ( texture === undefined ) { texture = this.getTexture( name ).clone(); - texture.isRenderTargetTexture = true; this._previousTextures[ name ] = texture; @@ -19754,6 +21907,11 @@ class PassNode extends TempNode { } + /** + * Switches current and previous textures for the given output name. + * + * @param {String} name - The output name. + */ toggleTexture( name ) { const prevTexture = this._previousTextures[ name ]; @@ -19775,6 +21933,12 @@ class PassNode extends TempNode { } + /** + * Returns the texture node for the given output name. + * + * @param {String} [name='output'] - The output name to get the texture node for. + * @return {TextureNode} The texture node. + */ getTextureNode( name = 'output' ) { let textureNode = this._textureNodes[ name ]; @@ -19791,6 +21955,12 @@ class PassNode extends TempNode { } + /** + * Returns the previous texture node for the given output name. + * + * @param {String} [name='output'] - The output name to get the previous texture node for. + * @return {TextureNode} The previous texture node. + */ getPreviousTextureNode( name = 'output' ) { let textureNode = this._previousTextureNodes[ name ]; @@ -19809,6 +21979,12 @@ class PassNode extends TempNode { } + /** + * Returns a viewZ node of this pass. + * + * @param {String} [name='depth'] - The output name to get the viewZ node for. In most cases the default `'depth'` can be used however the parameter exists for custom depth outputs. + * @return {Node} The viewZ node. + */ getViewZNode( name = 'depth' ) { let viewZNode = this._viewZNodes[ name ]; @@ -19826,6 +22002,12 @@ class PassNode extends TempNode { } + /** + * Returns a linear depth node of this pass. + * + * @param {String} [name='depth'] - The output name to get the linear depth node for. In most cases the default `'depth'` can be used however the parameter exists for custom depth outputs. + * @return {Node} The linear depth node. + */ getLinearDepthNode( name = 'depth' ) { let linearDepthNode = this._linearDepthNodes[ name ]; @@ -19857,8 +22039,6 @@ class PassNode extends TempNode { } - this.renderTarget.depthTexture.isMultisampleRenderTargetTexture = this.renderTarget.samples > 1; - return this.scope === PassNode.COLOR ? this.getTextureNode() : this.getLinearDepthNode(); } @@ -19896,6 +22076,12 @@ class PassNode extends TempNode { } + /** + * Sets the size of the pass's render target. Honors the pixel ratio. + * + * @param {Number} width - The width to set. + * @param {Number} height - The height to set. + */ setSize( width, height ) { this._width = width; @@ -19908,6 +22094,11 @@ class PassNode extends TempNode { } + /** + * Sets the pixel ratio the pass's render target and updates the size. + * + * @param {Number} pixelRatio - The pixel ratio to set. + */ setPixelRatio( pixelRatio ) { this._pixelRatio = pixelRatio; @@ -19916,6 +22107,9 @@ class PassNode extends TempNode { } + /** + * Frees internal resources. Should be called when the node is no longer in use. + */ dispose() { this.renderTarget.dispose(); @@ -19932,6 +22126,20 @@ const pass = ( scene, camera, options ) => nodeObject( new PassNode( PassNode.CO const passTexture = ( pass, texture ) => nodeObject( new PassTextureNode( pass, texture ) ); const depthPass = ( scene, camera ) => nodeObject( new PassNode( PassNode.DEPTH, scene, camera ) ); +/** + * Represents a render pass for producing a toon outline effect on compatible objects. + * Only 3D objects with materials of type `MeshToonMaterial` and `MeshToonNodeMaterial` + * will receive the outline. + * + * ```js + * const postProcessing = new PostProcessing( renderer ); + * + * const scenePass = toonOutlinePass( scene, camera ); + * + * postProcessing.outputNode = scenePass; + * ``` + * @augments PassNode + */ class ToonOutlinePassNode extends PassNode { static get type() { @@ -19940,14 +22148,46 @@ class ToonOutlinePassNode extends PassNode { } + /** + * Constructs a new outline pass node. + * + * @param {Scene} scene - A reference to the scene. + * @param {Camera} camera - A reference to the camera. + * @param {Node} colorNode - Defines the outline's color. + * @param {Node} thicknessNode - Defines the outline's thickness. + * @param {Node} alphaNode - Defines the outline's alpha. + */ constructor( scene, camera, colorNode, thicknessNode, alphaNode ) { super( PassNode.COLOR, scene, camera ); + /** + * Defines the outline's color. + * + * @type {Node} + */ this.colorNode = colorNode; + + /** + * Defines the outline's thickness. + * + * @type {Node} + */ this.thicknessNode = thicknessNode; + + /** + * Defines the outline's alpha. + * + * @type {Node} + */ this.alphaNode = alphaNode; + /** + * An internal material cache. + * + * @private + * @type {WeakMap} + */ this._materialCache = new WeakMap(); } @@ -19985,6 +22225,12 @@ class ToonOutlinePassNode extends PassNode { } + /** + * Creates the material used for outline rendering. + * + * @private + * @return {NodeMaterial} The outline material. + */ _createMaterial() { const material = new NodeMaterial(); @@ -20012,6 +22258,14 @@ class ToonOutlinePassNode extends PassNode { } + /** + * For the given toon material, this method returns a correspoding + * outline material. + * + * @private + * @param {(MeshToonMaterial|MeshToonNodeMaterial)} originalMaterial - The toon material. + * @return {NodeMaterial} The outline material. + */ _getOutlineMaterial( originalMaterial ) { let outlineMaterial = this._materialCache.get( originalMaterial ); @@ -20032,8 +22286,16 @@ class ToonOutlinePassNode extends PassNode { const toonOutlinePass = ( scene, camera, color = new Color( 0, 0, 0 ), thickness = 0.003, alpha = 1 ) => nodeObject( new ToonOutlinePassNode( scene, camera, nodeObject( color ), nodeObject( thickness ), nodeObject( alpha ) ) ); -// exposure only +/** @module ToneMappingFunctions **/ +/** + * Linear tone mapping, exposure only. + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const linearToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { return color.mul( exposure ).clamp(); @@ -20047,8 +22309,16 @@ const linearToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { ] } ); -// source: https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf - +/** + * Reinhard tone mapping. + * + * Reference: {@link https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const reinhardToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { color = color.mul( exposure ); @@ -20064,8 +22334,16 @@ const reinhardToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { ] } ); -// source: http://filmicworlds.com/blog/filmic-tonemapping-operators/ - +/** + * Cineon tone mapping. + * + * Reference: {@link http://filmicworlds.com/blog/filmic-tonemapping-operators/} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const cineonToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { // filmic operator by Jim Hejl and Richard Burgess-Dawson @@ -20097,8 +22375,16 @@ const RRTAndODTFit = /*@__PURE__*/ Fn( ( [ color ] ) => { } ); -// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs - +/** + * ACESFilmic tone mapping. + * + * Reference: {@link https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const acesFilmicToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT @@ -20149,6 +22435,14 @@ const agxDefaultContrastApprox = /*@__PURE__*/ Fn( ( [ x_immutable ] ) => { } ); +/** + * AgX tone mapping. + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const agxToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { const colortone = vec3( color ).toVar(); @@ -20180,8 +22474,16 @@ const agxToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { ] } ); -// https://modelviewer.dev/examples/tone-mapping - +/** + * Neutral tone mapping. + * + * Reference: {@link https://modelviewer.dev/examples/tone-mapping} + * + * @method + * @param {vec3} color - The color that should be tone mapped. + * @param {float} exposure - The exposure. + * @return {vec3} The tone mapped color. + */ const neutralToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => { const StartCompression = float( 0.8 - 0.04 ); @@ -21177,6 +23479,12 @@ class ScriptableNode extends Node { const scriptable = /*@__PURE__*/ nodeProxy( ScriptableNode ); +/** + * This class can be used to configure a fog for the scene. + * Nodes of this type are assigned to `Scene.fogNode`. + * + * @augments Node + */ class FogNode extends Node { static get type() { @@ -21185,17 +23493,52 @@ class FogNode extends Node { } + /** + * Constructs a new fog node. + * + * @param {Node} colorNode - Defines the color of the fog. + * @param {Node} factorNode - Defines how the fog is factored in the scene. + */ constructor( colorNode, factorNode ) { super( 'float' ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFogNode = true; + /** + * Defines the color of the fog. + * + * @type {Node?} + */ this.colorNode = colorNode; + + /** + * Defines how the fog is factored in the scene. + * + * @type {Node?} + */ this.factorNode = factorNode; } + /** + * Returns a node that represents the `z` coordinate in view space + * for the current fragment. It's a different representation of the + * default depth value. + * + * This value can be part of a computation that defines how the fog + * density increases when moving away from the camera. + * + * @param {NodeBuilder} builder - The current node builder. + * @return {Node} The viewZ node. + */ getViewZNode( builder ) { let viewZ; @@ -21222,6 +23565,12 @@ class FogNode extends Node { const fog = /*@__PURE__*/ nodeProxy( FogNode ); +/** + * Represents a range fog. The fog is smoothly interpolated + * between a range defined via near and far values. + * + * @augments FogNode + */ class FogRangeNode extends FogNode { static get type() { @@ -21230,13 +23579,38 @@ class FogRangeNode extends FogNode { } + /** + * Constructs a new range node. + * + * @param {Node} colorNode - Defines the color of the fog. + * @param {Node} nearNode - Defines the near value. + * @param {Node} farNode - Defines the far value. + */ constructor( colorNode, nearNode, farNode ) { - super( colorNode ); + super( colorNode, null ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFogRangeNode = true; + /** + * Defines the near value. + * + * @type {Node} + */ this.nearNode = nearNode; + + /** + * Defines the far value. + * + * @type {Node} + */ this.farNode = farNode; } @@ -21253,6 +23627,13 @@ class FogRangeNode extends FogNode { const rangeFog = /*@__PURE__*/ nodeProxy( FogRangeNode ); +/** + * Represents an exponential squared fog. This type of fog gives + * a clear view near the camera and a faster than exponentially + * densening fog farther from the camera. + * + * @augments FogNode + */ class FogExp2Node extends FogNode { static get type() { @@ -21261,12 +23642,30 @@ class FogExp2Node extends FogNode { } + /** + * Constructs a new exponential squared fog node. + * + * @param {Node} colorNode - Defines the color of the fog. + * @param {Node} densityNode - Defines the fog density. + */ constructor( colorNode, densityNode ) { - super( colorNode ); + super( colorNode, null ); + /** + * This flag can be used for type testing. + * + * @type {Boolean} + * @readonly + * @default true + */ this.isFogExp2Node = true; + /** + * Defines the fog density. + * + * @type {Node} + */ this.densityNode = densityNode; } @@ -21837,6 +24236,26 @@ class LightsNode extends Node { } + /** + * Overwrites the default `customCacheKey()` implementation by including the + * light IDs into the cache key. + * + * @return {Number} The hash. + */ + customCacheKey() { + + const lightIDs = []; + + for ( let i = 0; i < lights.length; i ++ ) { + + lightIDs.push( lights[ i ].id ); + + } + + return hashArray( lightIDs ); + + } + getHash( builder ) { if ( this._lightNodesHash === null ) { @@ -22045,9 +24464,44 @@ class LightsNode extends Node { const lights = ( lights = [] ) => nodeObject( new LightsNode() ).setLights( lights ); -const shadowMaterialLib = /*@__PURE__*/ new WeakMap(); +class ShadowBaseNode extends Node { + + static get type() { + + return 'ShadowBaseNode'; + + } + + constructor( light ) { + + super(); + + this.light = light; + this.updateBeforeType = NodeUpdateType.RENDER; + + this.isShadowBaseNode = true; + + } + + setupShadowPosition( { material } ) { + + // Use assign inside an Fn() + + shadowWorldPosition.assign( material.shadowPositionNode || positionWorld ); + + } + + dispose() { + + this.updateBeforeType = NodeUpdateType.NONE; + + } + +} + const shadowWorldPosition = /*@__PURE__*/ vec3().toVar( 'shadowWorldPosition' ); +const shadowMaterialLib = /*@__PURE__*/ new WeakMap(); const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => { let dist = positionWorld.sub( position ).length(); @@ -22201,7 +24655,7 @@ const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord } ) => { const occlusion = float( 1 ).toVar(); - const distribution = texture( depthTexture ).uv( shadowCoord.xy ).rg; + const distribution = texture( depthTexture ).sample( shadowCoord.xy ).rg; const hardShadow = step( shadowCoord.z, distribution.x ); @@ -22231,7 +24685,7 @@ const VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass const uvOffset = uvStart.add( float( i ).mul( uvStride ) ); - const depth = shadowPass.uv( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) ).x; + const depth = shadowPass.sample( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) ).x; mean.addAssign( depth ); squaredMean.addAssign( depth.mul( depth ) ); @@ -22257,7 +24711,7 @@ const VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPas const uvOffset = uvStart.add( float( i ).mul( uvStride ) ); - const distribution = shadowPass.uv( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) ); + const distribution = shadowPass.sample( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) ); mean.addAssign( distribution.x ); squaredMean.addAssign( add( distribution.y.mul( distribution.y ), distribution.x.mul( distribution.x ) ) ); @@ -22277,7 +24731,7 @@ const _shadowFilterLib = [ BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilt const _quadMesh$1 = /*@__PURE__*/ new QuadMesh(); -class ShadowNode extends Node { +class ShadowNode extends ShadowBaseNode { static get type() { @@ -22287,9 +24741,8 @@ class ShadowNode extends Node { constructor( light, shadow = null ) { - super(); + super( light ); - this.light = light; this.shadow = shadow || light.shadow; this.shadowMap = null; @@ -22300,7 +24753,6 @@ class ShadowNode extends Node { this.vsmMaterialVertical = null; this.vsmMaterialHorizontal = null; - this.updateBeforeType = NodeUpdateType.RENDER; this._node = null; this.isShadowNode = true; @@ -22452,12 +24904,12 @@ class ShadowNode extends Node { if ( builder.renderer.shadowMap.enabled === false ) return; - return Fn( ( { material } ) => { - - shadowWorldPosition.assign( material.shadowPositionNode || positionWorld ); + return Fn( () => { let node = this._node; + this.setupShadowPosition( builder ); + if ( node === null ) { this._node = node = this.setupShadow( builder ); @@ -22515,11 +24967,15 @@ class ShadowNode extends Node { renderer.setMRT( null ); - renderer.setRenderObjectFunction( ( object, ...params ) => { + renderer.setRenderObjectFunction( ( object, scene, _camera, geometry, material, group, ...params ) => { if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) { - renderer.renderObject( object, ...params ); + object.onBeforeShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group ); + + renderer.renderObject( object, scene, _camera, geometry, material, group, ...params ); + + object.onAfterShadow( renderer, object, camera, shadow.camera, geometry, scene.overrideMaterial, group ); } @@ -22589,7 +25045,7 @@ class ShadowNode extends Node { } - this.updateBeforeType = NodeUpdateType.NONE; + super.dispose(); } @@ -22645,9 +25101,15 @@ class AnalyticLightNode extends LightingNode { } - getCacheKey() { + /** + * Overwrites the default `customCacheKey()` implementation by including the + * light.id and light.castShadow into the cache key. + * + * @return {Number} The hash. + */ + customCacheKey() { - return hash$1( super.getCacheKey(), this.light.id, this.light.castShadow ? 1 : 0 ); + return hash$1( this.light.id, this.light.castShadow ? 1 : 0 ); } @@ -23065,6 +25527,15 @@ class PointLightNode extends AnalyticLightNode { } +/** @module Procedural **/ + +/** + * Creates a 2x2 checkerboard pattern that can be used as procedural texture data. + * + * @method + * @param {Node} uv - The uv coordinates. + * @return {Node} The result data. + */ const checker = /*@__PURE__*/ Fn( ( [ coord = uv() ] ) => { const uv = coord.mul( 2.0 ); @@ -25100,7 +27571,6 @@ var TSL = /*#__PURE__*/Object.freeze({ textureSize: textureSize, textureStore: textureStore, thickness: thickness, - threshold: threshold, time: time, timerDelta: timerDelta, timerGlobal: timerGlobal, @@ -26994,6 +29464,7 @@ class NodeBuilder { * The scene the 3D object belongs to. * * @type {Scene?} + * @default null */ this.scene = null; @@ -27001,29 +29472,125 @@ class NodeBuilder { * The camera the 3D object is rendered with. * * @type {Camera?} + * @default null */ this.camera = null; + /** + * A list of all nodes the builder is processing + * for this 3D object. + * + * @type {Array} + */ this.nodes = []; + + /** + * A list of all sequential nodes. + * + * @type {Array} + */ this.sequentialNodes = []; + + /** + * A list of all nodes which {@link Node#update} method should be executed. + * + * @type {Array} + */ this.updateNodes = []; + + /** + * A list of all nodes which {@link Node#updateBefore} method should be executed. + * + * @type {Array} + */ this.updateBeforeNodes = []; + + /** + * A list of all nodes which {@link Node#updateAfter} method should be executed. + * + * @type {Array} + */ this.updateAfterNodes = []; + + /** + * A dictionary that assigns each node to a unique hash. + * + * @type {Object} + */ this.hashNodes = {}; + /** + * A reference to a node material observer. + * + * @type {NodeMaterialObserver?} + * @default null + */ this.monitor = null; + /** + * A reference to the current lights node. + * + * @type {LightsNode?} + * @default null + */ this.lightsNode = null; + + /** + * A reference to the current environment node. + * + * @type {Node?} + * @default null + */ this.environmentNode = null; + + /** + * A reference to the current fog node. + * + * @type {FogNode?} + * @default null + */ this.fogNode = null; + /** + * The current clipping context. + * + * @type {ClippingContext?} + */ this.clippingContext = null; + /** + * The generated vertex shader. + * + * @type {String?} + */ this.vertexShader = null; + + /** + * The generated fragment shader. + * + * @type {String?} + */ this.fragmentShader = null; + + /** + * The generated compute shader. + * + * @type {String?} + */ this.computeShader = null; + /** + * Nodes used in the primary flow of code generation. + * + * @type {Object>} + */ this.flowNodes = { vertex: [], fragment: [], compute: [] }; + + /** + * Nodes code from `.flowNodes`. + * + * @type {Object} + */ this.flowCode = { vertex: '', fragment: '', compute: '' }; /** @@ -27041,8 +29608,26 @@ class NodeBuilder { * @type {Object} */ this.structs = { vertex: [], fragment: [], compute: [], index: 0 }; + + /** + * This dictionary holds the bindings for each shader stage. + * + * @type {Object} + */ this.bindings = { vertex: {}, fragment: {}, compute: {} }; + + /** + * This dictionary maintains the binding indices per bind group. + * + * @type {Object} + */ this.bindingsIndexes = {}; + + /** + * Reference to the array of bind groups. + * + * @type {Array?} + */ this.bindGroups = null; /** @@ -27083,19 +29668,80 @@ class NodeBuilder { * @type {Object>} */ this.vars = {}; + + /** + * Current code flow. + * All code generated in this stack will be stored in `.flow`. + * + * @type {{code: String}} + */ this.flow = { code: '' }; + + /** + * A chain of nodes. + * Used to check recursive calls in node-graph. + * + * @type {Array} + */ this.chaining = []; + + /** + * The current stack. + * This reflects the current process in the code block hierarchy, + * it is useful to know if the current process is inside a conditional for example. + * + * @type {StackNode} + */ this.stack = stack(); + + /** + * List of stack nodes. + * The current stack hierarchy is stored in an array. + * + * @type {Array} + */ this.stacks = []; + + /** + * A tab value. Used for shader string generation. + * + * @type {String} + * @default '\t' + */ this.tab = '\t'; + /** + * Reference to the current function node. + * + * @type {FunctionNode?} + * @default null + */ this.currentFunctionNode = null; + /** + * The builder's context. + * + * @type {Object} + */ this.context = { material: this.material }; + /** + * The builder's cache. + * + * @type {NodeCache} + */ this.cache = new NodeCache(); + + /** + * Since the {@link NodeBuilder#cache} might be temporarily + * overwritten by other caches, this member retains the reference + * to the builder's own cache. + * + * @type {NodeCache} + * @default this.cache + */ this.globalCache = this.cache; this.flowsData = new WeakMap(); @@ -27103,7 +29749,7 @@ class NodeBuilder { /** * The current shader stage. * - * @type {('vertex'|'fragment'|'compute')?} + * @type {('vertex'|'fragment'|'compute'|'any')?} */ this.shaderStage = null; @@ -27114,6 +29760,12 @@ class NodeBuilder { */ this.buildStage = null; + /** + * Whether comparison in shader code are generated with methods or not. + * + * @type {Boolean} + * @default false + */ this.useComparisonMethod = false; } @@ -27193,6 +29845,14 @@ class NodeBuilder { } + /** + * Returns a bind group for the given group name and binding. + * + * @private + * @param {String} groupName - The group name. + * @param {Array} bindings - List of bindings. + * @return {BindGroup} The bind group + */ _getBindGroup( groupName, bindings ) { const bindGroupsCache = this.getBindGroupsCache(); @@ -27237,6 +29897,13 @@ class NodeBuilder { } + /** + * Returns an array of node uniform groups for the given group name and shader stage. + * + * @param {String} groupName - The group name. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. + * @return {Array} The array of node uniform groups. + */ getBindGroupArray( groupName, shaderStage ) { const bindings = this.bindings[ shaderStage ]; @@ -27259,6 +29926,11 @@ class NodeBuilder { } + /** + * Returns a list bindings of all shader stages separated by groups. + * + * @return {Array} The list of bindings. + */ getBindings() { let bindingsGroups = this.bindGroups; @@ -27301,6 +29973,9 @@ class NodeBuilder { } + /** + * Sorts the bind groups and updates {@link NodeBuilder#bindingsIndexes}. + */ sortBindingGroups() { const bindingsGroups = this.getBindings(); @@ -27318,12 +29993,24 @@ class NodeBuilder { } + /** + * The builder maintains each node in a hash-based dictionary. + * This method sets the given node (value) with the given hash (key) into this dictionary. + * + * @param {Node} node - The node to add. + * @param {Number} hash - The hash of the node. + */ setHashNode( node, hash ) { this.hashNodes[ hash ] = node; } + /** + * Adds a node to this builder. + * + * @param {Node} node - The node to add. + */ addNode( node ) { if ( this.nodes.includes( node ) === false ) { @@ -27336,6 +30023,12 @@ class NodeBuilder { } + /** + * It is used to add Nodes that will be used as FRAME and RENDER events, + * and need to follow a certain sequence in the calls to work correctly. + * + * @param {Node} node - The node to add. + */ addSequentialNode( node ) { if ( this.sequentialNodes.includes( node ) === false ) { @@ -27346,6 +30039,9 @@ class NodeBuilder { } + /** + * Checks the update types of nodes + */ buildUpdateNodes() { for ( const node of this.nodes ) { @@ -27381,12 +30077,24 @@ class NodeBuilder { } + /** + * A reference the current node which is the + * last node in the chain of nodes. + * + * @type {Node} + */ get currentNode() { return this.chaining[ this.chaining.length - 1 ]; } + /** + * Whether the given texture is filtered or not. + * + * @param {Texture} texture - The texture to check. + * @return {Boolean} Whether the given texture is filtered or not. + */ isFilteredTexture( texture ) { return ( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter || @@ -27394,6 +30102,12 @@ class NodeBuilder { } + /** + * Adds the given node to the internal node chain. + * This is used to check recursive calls in node-graph. + * + * @param {Node} node - The node to add. + */ addChain( node ) { /* @@ -27408,6 +30122,11 @@ class NodeBuilder { } + /** + * Removes the given node from the internal node chain. + * + * @param {Node} node - The node to remove. + */ removeChain( node ) { const lastChain = this.chaining.pop(); @@ -27420,18 +30139,40 @@ class NodeBuilder { } + /** + * Returns the native shader method name for a given generic name. E.g. + * the method name `textureDimensions` matches the WGSL name but must be + * resolved to `textureSize` in GLSL. + * + * @abstract + * @param {String} name - The method name to resolve. + * @return {String} The resolved method name. + */ getMethod( method ) { return method; } + /** + * Returns a node for the given hash, see {@link NodeBuilder#setHashNode}. + * + * @param {Number} hash - The hash of the node. + * @return {Node} The found node. + */ getNodeFromHash( hash ) { return this.hashNodes[ hash ]; } + /** + * Adds the Node to a target flow so that it can generate code in the 'generate' process. + * + * @param {('vertex'|'fragment'|'compute')} shaderStage - The shader stage. + * @param {Node} node - The node to add. + * @return {Node} The node. + */ addFlow( shaderStage, node ) { this.flowNodes[ shaderStage ].push( node ); @@ -27440,18 +30181,34 @@ class NodeBuilder { } + /** + * Sets builder's context. + * + * @param {Object} context - The context to set. + */ setContext( context ) { this.context = context; } + /** + * Returns the builder's current context. + * + * @return {Object} The builder's current context. + */ getContext() { return this.context; } + /** + * Gets a context used in shader construction that can be shared across different materials. + * This is necessary since the renderer cache can reuse shaders generated in one material and use them in another. + * + * @return {Object} The builder's current context without material. + */ getSharedContext() { ({ ...this.context }); @@ -27460,18 +30217,35 @@ class NodeBuilder { } + /** + * Sets builder's cache. + * + * @param {NodeCache} cache - The cache to set. + */ setCache( cache ) { this.cache = cache; } + /** + * Returns the builder's current cache. + * + * @return {NodeCache} The builder's current cache. + */ getCache() { return this.cache; } + /** + * Returns a cache for the given node. + * + * @param {Node} Node - The node. + * @param {Boolean} [parent=true] - Whether this node refers to a shared parent cache or not. + * @return {NodeCache} The cache. + */ getCacheFromNode( node, parent = true ) { const data = this.getDataFromNode( node ); @@ -27481,48 +30255,99 @@ class NodeBuilder { } + /** + * Whether the requested feature is available or not. + * + * @abstract + * @param {String} name - The requested feature. + * @return {Boolean} Whether the requested feature is supported or not. + */ isAvailable( /*name*/ ) { return false; } + /** + * Returns the vertexIndex input variable as a native shader string. + * + * @abstract + * @return {String} The instanceIndex shader string. + */ getVertexIndex() { console.warn( 'Abstract function.' ); } + /** + * Returns the instanceIndex input variable as a native shader string. + * + * @abstract + * @return {String} The instanceIndex shader string. + */ getInstanceIndex() { console.warn( 'Abstract function.' ); } + /** + * Returns the drawIndex input variable as a native shader string. + * Only relevant for WebGL and its `WEBGL_multi_draw` extension. + * + * @abstract + * @return {String} The drawIndex shader string. + */ getDrawIndex() { console.warn( 'Abstract function.' ); } + /** + * Returns the frontFacing input variable as a native shader string. + * + * @abstract + * @return {String} The frontFacing shader string. + */ getFrontFacing() { console.warn( 'Abstract function.' ); } + /** + * Returns the fragCoord input variable as a native shader string. + * + * @abstract + * @return {String} The fragCoord shader string. + */ getFragCoord() { console.warn( 'Abstract function.' ); } + /** + * Whether to flip texture data along its vertical axis or not. WebGL needs + * this method evaluate to `true`, WebGPU to `false`. + * + * @abstract + * @return {Boolean} Whether to flip texture data along its vertical axis or not. + */ isFlipY() { return false; } + /** + * Calling this method increases the usage count for the given node by one. + * + * @param {Node} Node - The node to increase the usage count for. + * @return {Number} The updated usage count. + */ increaseUsage( node ) { const nodeData = this.getDataFromNode( node ); @@ -27532,18 +30357,44 @@ class NodeBuilder { } + /** + * Generates a texture sample shader string for the given texture data. + * + * @abstract + * @param {Texture} texture - The texture. + * @param {String} textureProperty - The texture property name. + * @param {String} uvSnippet - Snippet defining the texture coordinates. + * @return {String} The generated shader string. + */ generateTexture( /* texture, textureProperty, uvSnippet */ ) { console.warn( 'Abstract function.' ); } + /** + * Generates a texture LOD shader string for the given texture data. + * + * @abstract + * @param {Texture} texture - The texture. + * @param {String} textureProperty - The texture property name. + * @param {String} uvSnippet - Snippet defining the texture coordinates. + * @param {String} levelSnippet - Snippet defining the mip level. + * @return {String} The generated shader string. + */ generateTextureLod( /* texture, textureProperty, uvSnippet, levelSnippet */ ) { console.warn( 'Abstract function.' ); } + /** + * Generates the shader string for the given type and value. + * + * @param {String} type - The type. + * @param {Any?} [value=null] - The value. + * @return {String} The generated value as a shader string. + */ generateConst( type, value = null ) { if ( value === null ) { @@ -27659,7 +30510,7 @@ class NodeBuilder { * Returns for the given node and shader stage the property name for the shader. * * @param {Node} node - The node. - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The property name. */ getPropertyName( node/*, shaderStage*/ ) { @@ -27718,7 +30569,7 @@ class NodeBuilder { } /** - * Returns the component type of a given texutre. + * Returns the component type of a given texture. * * @param {Texture} texture - The texture. * @return {String} The component type. @@ -27915,6 +30766,11 @@ class NodeBuilder { } + /** + * Adds a stack node to the internal stack. + * + * @return {StackNode} The added stack node. + */ addStack() { this.stack = stack( this.stack ); @@ -27926,6 +30782,11 @@ class NodeBuilder { } + /** + * Removes the last stack node from the internal stack. + * + * @return {StackNode} The removed stack node. + */ removeStack() { const lastStack = this.stack; @@ -27937,6 +30798,15 @@ class NodeBuilder { } + /** + * The builder maintains (cached) data for each node during the building process. This method + * can be used to get these data for a specific shader stage and cache. + * + * @param {Node} node - The node to get the data for. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @param {NodeCache?} cache - An optional cache. + * @return {Object} The node data. + */ getDataFromNode( node, shaderStage = this.shaderStage, cache = null ) { cache = cache === null ? ( node.isGlobal( this ) ? this.globalCache : this.cache ) : cache; @@ -27957,6 +30827,13 @@ class NodeBuilder { } + /** + * Returns the properties for the given node and shader stage. + * + * @param {Node} node - The node to get the properties for. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage='any'] - The shader stage. + * @return {Object} The node properties. + */ getNodeProperties( node, shaderStage = 'any' ) { const nodeData = this.getDataFromNode( node, shaderStage ); @@ -27965,6 +30842,13 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeAttribute} for the given buffer attribute node. + * + * @param {BufferAttributeNode} node - The buffer attribute node. + * @param {String} type - The node type. + * @return {NodeAttribute} The node attribute. + */ getBufferAttributeFromNode( node, type ) { const nodeData = this.getDataFromNode( node ); @@ -27987,6 +30871,14 @@ class NodeBuilder { } + /** + * Returns an instance of {@link StructTypeNode} for the given output struct node. + * + * @param {OutputStructNode} node - The output struct node. + * @param {Array} types - The output struct types. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @return {StructTypeNode} The struct type attribute. + */ getStructTypeFromNode( node, types, shaderStage = this.shaderStage ) { const nodeData = this.getDataFromNode( node, shaderStage ); @@ -28009,6 +30901,15 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeUniform} for the given uniform node. + * + * @param {UniformNode} node - The uniform node. + * @param {String} type - The uniform type. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @param {String?} name - The name of the uniform. + * @return {NodeUniform} The node uniform. + */ getUniformFromNode( node, type, shaderStage = this.shaderStage, name = null ) { const nodeData = this.getDataFromNode( node, shaderStage, this.globalCache ); @@ -28031,6 +30932,15 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeVar} for the given variable node. + * + * @param {VarNode} node - The variable node. + * @param {String?} name - The variable's name. + * @param {String} [type=node.getNodeType( this )] - The variable's type. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @return {NodeVar} The node variable. + */ getVarFromNode( node, name = null, type = node.getNodeType( this ), shaderStage = this.shaderStage ) { const nodeData = this.getDataFromNode( node, shaderStage ); @@ -28055,6 +30965,14 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeVarying} for the given varying node. + * + * @param {(VaryingNode|PropertyNode)} node - The varying node. + * @param {String?} name - The varying's name. + * @param {String} [type=node.getNodeType( this )] - The varying's type. + * @return {NodeVar} The node varying. + */ getVaryingFromNode( node, name = null, type = node.getNodeType( this ) ) { const nodeData = this.getDataFromNode( node, 'any' ); @@ -28080,6 +30998,14 @@ class NodeBuilder { } + /** + * Returns an instance of {@link NodeCode} for the given code node. + * + * @param {CodeNode} node - The code node. + * @param {String} type - The node type. + * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage. + * @return {NodeCode} The node code. + */ getCodeFromNode( node, type, shaderStage = this.shaderStage ) { const nodeData = this.getDataFromNode( node ); @@ -28103,6 +31029,15 @@ class NodeBuilder { } + /** + * Adds a code flow based on the code-block hierarchy. + + * This is used so that code-blocks like If,Else create their variables locally if the Node + * is only used inside one of these conditionals in the current shader stage. + * + * @param {Node} node - The node to add. + * @param {Node} nodeBlock - Node-based code-block. Usually 'ConditionalNode'. + */ addFlowCodeHierarchy( node, nodeBlock ) { const { flowCodes, flowCodeBlock } = this.getDataFromNode( node ); @@ -28135,6 +31070,13 @@ class NodeBuilder { } + /** + * Add a inline-code to the current flow code-block. + * + * @param {Node} node - The node to add. + * @param {String} code - The code to add. + * @param {Node} nodeBlock - Current ConditionalNode + */ addLineFlowCodeBlock( node, code, nodeBlock ) { const nodeData = this.getDataFromNode( node ); @@ -28146,6 +31088,13 @@ class NodeBuilder { } + /** + * Add a inline-code to the current flow. + * + * @param {String} code - The code to add. + * @param {Node?} [node= null] - Optional Node, can help the system understand if the Node is part of a code-block. + * @return {NodeBuilder} A reference to this node builder. + */ addLineFlowCode( code, node = null ) { if ( code === '' ) return this; @@ -28170,6 +31119,12 @@ class NodeBuilder { } + /** + * Adds a code to the current code flow. + * + * @param {String} code - Shader code. + * @return {NodeBuilder} A reference to this node builder. + */ addFlowCode( code ) { this.flow.code += code; @@ -28178,6 +31133,12 @@ class NodeBuilder { } + /** + * Add tab in the code that will be generated so that other snippets respect the current tabulation. + * Typically used in codes with If,Else. + * + * @return {NodeBuilder} A reference to this node builder. + */ addFlowTab() { this.tab += '\t'; @@ -28186,6 +31147,11 @@ class NodeBuilder { } + /** + * Removes a tab. + * + * @return {NodeBuilder} A reference to this node builder. + */ removeFlowTab() { this.tab = this.tab.slice( 0, - 1 ); @@ -28194,12 +31160,25 @@ class NodeBuilder { } + /** + * Gets the current flow data based on a Node. + * + * @param {Node} node - Node that the flow was started. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. + * @return {Object} The flow data. + */ getFlowData( node/*, shaderStage*/ ) { return this.flowsData.get( node ); } + /** + * Executes the node flow based on a root node to generate the final shader code. + * + * @param {Node} node - The node to execute. + * @return {Object} The code flow. + */ flowNode( node ) { const output = node.getNodeType( this ); @@ -28212,6 +31191,13 @@ class NodeBuilder { } + /** + * Returns the native shader operator name for a given generic name. + * It is a similar type of method like {@link NodeBuilder#getMethod}. + * + * @param {ShaderNodeInternal} shaderNode - The shader node to build the function node with. + * @return {FunctionNode} The build function node. + */ buildFunctionNode( shaderNode ) { const fn = new FunctionNode(); @@ -28228,6 +31214,12 @@ class NodeBuilder { } + /** + * Generates a code flow based on a TSL function: Fn(). + * + * @param {ShaderNodeInternal} node - A function code will be generated based on the input. + * @return {Object} + */ flowShaderNode( shaderNode ) { const layout = shaderNode.layout; @@ -28266,6 +31258,13 @@ class NodeBuilder { } + /** + * Runs the node flow through all the steps of creation, 'setup', 'analyze', 'generate'. + * + * @param {Node} node - The node to execute. + * @param {String?} output - Expected output type. For example 'vec3'. + * @return {Object} + */ flowStagesNode( node, output = null ) { const previousFlow = this.flow; @@ -28304,12 +31303,27 @@ class NodeBuilder { } - getFunctionOperator() { + /** + * Returns the native shader operator name for a given generic name. + * It is a similar type of method like {@link NodeBuilder#getMethod}. + * + * @abstract + * @param {String} op - The operator name to resolve. + * @return {String} The resolved operator name. + */ + getFunctionOperator( /* op */ ) { return null; } + /** + * Generates a code flow based on a child Node. + * + * @param {Node} node - The node to execute. + * @param {String?} output - Expected output type. For example 'vec3'. + * @return {Object} The code flow. + */ flowChildNode( node, output = null ) { const previousFlow = this.flow; @@ -28328,6 +31342,18 @@ class NodeBuilder { } + /** + * Executes a flow of code in a different stage. + * + * Some nodes like `varying()` have the ability to compute code in vertex-stage and + * return the value in fragment-stage even if it is being executed in an input fragment. + * + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. + * @param {Node} node - The node to execute. + * @param {String?} output - Expected output type. For example 'vec3'. + * @param {String?} propertyName - The property name to assign the result. + * @return {Object} + */ flowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) { const previousShaderStage = this.shaderStage; @@ -28365,7 +31391,7 @@ class NodeBuilder { * Returns the attribute definitions as a shader string for the given shader stage. * * @abstract - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The attribute code section. */ getAttributes( /*shaderStage*/ ) { @@ -28378,7 +31404,7 @@ class NodeBuilder { * Returns the varying definitions as a shader string for the given shader stage. * * @abstract - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The varying code section. */ getVaryings( /*shaderStage*/ ) { @@ -28403,7 +31429,7 @@ class NodeBuilder { /** * Returns the variable definitions as a shader string for the given shader stage. * - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The variable code section. */ getVars( shaderStage ) { @@ -28430,7 +31456,7 @@ class NodeBuilder { * Returns the uniform definitions as a shader string for the given shader stage. * * @abstract - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The uniform code section. */ getUniforms( /*shaderStage*/ ) { @@ -28442,7 +31468,7 @@ class NodeBuilder { /** * Returns the native code definitions as a shader string for the given shader stage. * - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The current shader stage. + * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage. * @return {String} The native code section. */ getCodes( shaderStage ) { @@ -28465,6 +31491,11 @@ class NodeBuilder { } + /** + * Returns the hash of this node builder. + * + * @return {String} The hash. + */ getHash() { return this.vertexShader + this.fragmentShader + this.computeShader; @@ -28474,7 +31505,7 @@ class NodeBuilder { /** * Sets the current shader stage. * - * @param {('vertex'|'fragment'|'compute')?} shaderStage - The shader stage to set. + * @param {('vertex'|'fragment'|'compute'|'any')?} shaderStage - The shader stage to set. */ setShaderStage( shaderStage ) { @@ -28485,7 +31516,7 @@ class NodeBuilder { /** * Returns the current shader stage. * - * @return {('vertex'|'fragment'|'compute')?} The current shader stage. + * @return {('vertex'|'fragment'|'compute'|'any')?} The current shader stage. */ getShaderStage() { @@ -28605,6 +31636,13 @@ class NodeBuilder { } + /** + * Returns a uniform representation which is later used for UBO generation and rendering. + * + * @param {NodeUniform} uniformNode - The uniform node. + * @param {String} type - The requested type. + * @return {Uniform} The uniform. + */ getNodeUniform( uniformNode, type ) { if ( type === 'float' || type === 'int' || type === 'uint' ) return new NumberNodeUniform( uniformNode ); @@ -28619,12 +31657,16 @@ class NodeBuilder { } - createNodeMaterial( type = 'NodeMaterial' ) { // @deprecated, r168 - - throw new Error( `THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${ type }() instead.` ); - - } - + /** + * Formats the given shader snippet from a given type into another one. E.g. + * this method might be used to convert a simple float string `"1.0"` into a + * `vec3` representation: `"vec3( 1.0 )"`. + * + * @param {String} snippet - The shader snippet. + * @param {String} fromType - The source type. + * @param {String} toType - The target type. + * @return {String} The updated shader string. + */ format( snippet, fromType, toType ) { fromType = this.getVectorType( fromType ); @@ -28716,6 +31758,14 @@ class NodeBuilder { } + // deprecated + + createNodeMaterial( type = 'NodeMaterial' ) { // @deprecated, r168 + + throw new Error( `THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${ type }() instead.` ); + + } + } /** @@ -29031,7 +32081,7 @@ class NodeFunctionInput { * * @param {String} type - The input type. * @param {String} name - The input name. - * @param {Number?} [count=null] - TODO (only relevant for GLSL). + * @param {Number?} [count=null] - If the input is an Array, count will be the length. * @param {('in'|'out'|'inout')} [qualifier=''] - The parameter qualifier (only relevant for GLSL). * @param {Boolean} [isConst=false] - Whether the input uses a const qualifier or not (only relevant for GLSL). */ @@ -29052,7 +32102,7 @@ class NodeFunctionInput { this.name = name; /** - * TODO (only relevant for GLSL). + * If the input is an Array, count will be the length. * * @type {Number?} * @default null @@ -39147,11 +42197,7 @@ class WebGPUTextureUtils { textureData.format = format; - let sampleCount = options.sampleCount !== undefined ? options.sampleCount : 1; - - sampleCount = backend.utils.getSampleCount( sampleCount ); - - const primarySampleCount = texture.isRenderTargetTexture && ! texture.isMultisampleRenderTargetTexture ? 1 : sampleCount; + const { samples, primarySamples, isMSAA } = backend.utils.getTextureSampleData( texture ); let usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC; @@ -39175,7 +42221,7 @@ class WebGPUTextureUtils { depthOrArrayLayers: depth, }, mipLevelCount: levels, - sampleCount: primarySampleCount, + sampleCount: primarySamples, dimension: dimension, format: format, usage: usage @@ -39209,12 +42255,12 @@ class WebGPUTextureUtils { } - if ( texture.isRenderTargetTexture && sampleCount > 1 && ! texture.isMultisampleRenderTargetTexture ) { + if ( isMSAA ) { const msaaTextureDescriptorGPU = Object.assign( {}, textureDescriptorGPU ); msaaTextureDescriptorGPU.label = msaaTextureDescriptorGPU.label + '-msaa'; - msaaTextureDescriptorGPU.sampleCount = sampleCount; + msaaTextureDescriptorGPU.sampleCount = samples; textureData.msaaTexture = backend.device.createTexture( msaaTextureDescriptorGPU ); @@ -39337,7 +42383,7 @@ class WebGPUTextureUtils { depthTexture.image.width = width; depthTexture.image.height = height; - this.createTexture( depthTexture, { sampleCount: backend.utils.getSampleCount( backend.renderer.samples ), width, height } ); + this.createTexture( depthTexture, { width, height } ); return backend.get( depthTexture ).texture; @@ -40632,7 +43678,7 @@ class WGSLNodeBuilder extends NodeBuilder { _generateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, shaderStage = this.shaderStage ) { - if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false ) { return `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`; @@ -40720,7 +43766,9 @@ class WGSLNodeBuilder extends NodeBuilder { let textureDimensionsParams; - if ( texture.isMultisampleRenderTargetTexture === true ) { + const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture ); + + if ( primarySamples > 1 ) { textureDimensionsParams = textureProperty; @@ -40797,7 +43845,7 @@ class WGSLNodeBuilder extends NodeBuilder { return this.getComponentTypeFromTexture( texture ) !== 'float' || ( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) || ( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) || - texture.isMultisampleRenderTargetTexture === true; + this.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1; } @@ -40999,7 +44047,7 @@ class WGSLNodeBuilder extends NodeBuilder { texture.store = node.isStorageTextureNode === true; texture.setVisibility( gpuShaderStageLib[ shaderStage ] ); - if ( shaderStage === 'fragment' && this.isUnfilterable( node.value ) === false && texture.store === false ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( node.value ) === false && texture.store === false ) { const sampler = new NodeSampler( `${uniformNode.name}_sampler`, uniformNode.node, group ); sampler.setVisibility( gpuShaderStageLib[ shaderStage ] ); @@ -41511,7 +44559,7 @@ ${ flowData.code } const texture = uniform.node.value; - if ( shaderStage === 'fragment' && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) { + if ( ( shaderStage === 'fragment' || shaderStage === 'compute' ) && this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) { if ( this.isSampleCompare( texture ) ) { @@ -41529,7 +44577,9 @@ ${ flowData.code } let multisampled = ''; - if ( texture.isMultisampleRenderTargetTexture === true ) { + const { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture ); + + if ( primarySamples > 1 ) { multisampled = '_multisampled'; @@ -41949,6 +44999,36 @@ class WebGPUUtils { } + getTextureSampleData( texture ) { + + let samples; + + if ( texture.isFramebufferTexture ) { + + samples = 1; + + } else if ( texture.isDepthTexture && ! texture.renderTarget ) { + + const renderer = this.backend.renderer; + const renderTarget = renderer.getRenderTarget(); + + samples = renderTarget ? renderTarget.samples : renderer.samples; + + } else if ( texture.renderTarget ) { + + samples = texture.renderTarget.samples; + + } + + samples = samples || 1; + + const isMSAA = samples > 1 && texture.renderTarget !== null && ( texture.isDepthTexture !== true && texture.isFramebufferTexture !== true ); + const primarySamples = isMSAA ? 1 : samples; + + return { samples, primarySamples, isMSAA }; + + } + getCurrentColorFormat( renderContext ) { let format; @@ -42462,10 +45542,18 @@ class WebGPUBindingUtils { const texture = {}; // GPUTextureBindingLayout - if ( binding.texture.isMultisampleRenderTargetTexture === true ) { + const { primarySamples } = backend.utils.getTextureSampleData( binding.texture ); + + if ( primarySamples > 1 ) { texture.multisampled = true; + if ( ! binding.texture.isDepthTexture ) { + + texture.sampleType = GPUTextureSampleType.UnfilterableFloat; + + } + } if ( binding.texture.isDepthTexture ) { @@ -44582,8 +47670,6 @@ class WebGPUBackend extends Backend { const { resultBuffer } = renderContextData.currentTimestampQueryBuffers; - await this.device.queue.onSubmittedWorkDone(); - if ( resultBuffer.mapState === 'unmapped' ) { resultBuffer.mapAsync( GPUMapMode.READ ).then( () => { @@ -45530,4 +48616,4 @@ class ClippingGroup extends Group { } -export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayElementNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FogExp2Node, FogNode, FogRangeNode, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, InstancedPointsNodeMaterial, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, ModelViewProjectionNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PostProcessingUtils, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, shaderStages, vectorComponents }; +export { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayElementNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, CacheNode, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, DataArrayTexture, DataTexture, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectUVNode, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FogExp2Node, FogNode, FogRangeNode, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, InstancedPointsNodeMaterial, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoopNode, LuminanceAlphaFormat, LuminanceFormat, MRTNode, MatcapUVNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, ModelViewProjectionNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalMapNode, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PostProcessingUtils, PosterizeNode, PropertyNode, QuadMesh, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, StorageArrayElementNode, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, ToneMappingNode, ToonOutlinePassNode, TriplanarTexturesNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, shaderStages, vectorComponents }; diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index 2e8adebd872ebf..c9ae98c00dad28 100644 --- a/build/three.webgpu.nodes.min.js +++ b/build/three.webgpu.nodes.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2024 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix3 as i,Matrix4 as n,EventDispatcher as o,MathUtils as a,ColorManagement as u,SRGBTransfer as l,NoToneMapping as d,StaticDrawUsage as c,InterleavedBuffer as h,DynamicDrawUsage as p,InterleavedBufferAttribute as g,NoColorSpace as m,UnsignedIntType as f,IntType as y,WebGLCoordinateSystem as b,BackSide as x,CubeReflectionMapping as T,CubeRefractionMapping as _,WebGPUCoordinateSystem as v,TangentSpaceNormalMap as N,ObjectSpaceNormalMap as S,InstancedInterleavedBuffer as A,InstancedBufferAttribute as R,DataArrayTexture as C,FloatType as E,FramebufferTexture as w,LinearMipmapLinearFilter as M,DepthTexture as B,Material as U,NormalBlending as F,PointsMaterial as P,LineBasicMaterial as I,LineDashedMaterial as L,NoBlending as D,MeshNormalMaterial as V,WebGLCubeRenderTarget as O,BoxGeometry as G,Mesh as k,Scene as z,LinearFilter as $,CubeCamera as W,CubeTexture as H,EquirectangularReflectionMapping as j,EquirectangularRefractionMapping as q,AddOperation as K,MixOperation as X,MultiplyOperation as Y,MeshBasicMaterial as Q,MeshLambertMaterial as Z,MeshPhongMaterial as J,Texture as ee,MeshStandardMaterial as te,MeshPhysicalMaterial as re,MeshToonMaterial as se,MeshMatcapMaterial as ie,SpriteMaterial as ne,ShadowMaterial as oe,Uint32BufferAttribute as ae,Uint16BufferAttribute as ue,DoubleSide as le,DepthStencilFormat as de,DepthFormat as ce,UnsignedInt248Type as he,UnsignedByteType as pe,RenderTarget as ge,Plane as me,Object3D as fe,HalfFloatType as ye,LinearMipMapLinearFilter as be,OrthographicCamera as xe,BufferGeometry as Te,Float32BufferAttribute as _e,BufferAttribute as ve,UVMapping as Ne,Euler as Se,LinearSRGBColorSpace as Ae,LessCompare as Re,VSMShadowMap as Ce,RGFormat as Ee,BasicShadowMap as we,SphereGeometry as Me,CubeUVReflectionMapping as Be,PerspectiveCamera as Ue,RGBAFormat as Fe,LinearMipmapNearestFilter as Pe,NearestMipmapLinearFilter as Ie,Float16BufferAttribute as Le,REVISION as De,SRGBColorSpace as Ve,PCFShadowMap as Oe,FrontSide as Ge,Frustum as ke,DataTexture as ze,RedIntegerFormat as $e,RedFormat as We,RGIntegerFormat as He,RGBIntegerFormat as je,RGBFormat as qe,RGBAIntegerFormat as Ke,UnsignedShortType as Xe,ByteType as Ye,ShortType as Qe,createCanvasElement as Ze,AddEquation as Je,SubtractEquation as et,ReverseSubtractEquation as tt,ZeroFactor as rt,OneFactor as st,SrcColorFactor as it,SrcAlphaFactor as nt,SrcAlphaSaturateFactor as ot,DstColorFactor as at,DstAlphaFactor as ut,OneMinusSrcColorFactor as lt,OneMinusSrcAlphaFactor as dt,OneMinusDstColorFactor as ct,OneMinusDstAlphaFactor as ht,CullFaceNone as pt,CullFaceBack as gt,CullFaceFront as mt,CustomBlending as ft,MultiplyBlending as yt,SubtractiveBlending as bt,AdditiveBlending as xt,NotEqualDepth as Tt,GreaterDepth as _t,GreaterEqualDepth as vt,EqualDepth as Nt,LessEqualDepth as St,LessDepth as At,AlwaysDepth as Rt,NeverDepth as Ct,UnsignedShort4444Type as Et,UnsignedShort5551Type as wt,UnsignedInt5999Type as Mt,AlphaFormat as Bt,LuminanceFormat as Ut,LuminanceAlphaFormat as Ft,RGB_S3TC_DXT1_Format as Pt,RGBA_S3TC_DXT1_Format as It,RGBA_S3TC_DXT3_Format as Lt,RGBA_S3TC_DXT5_Format as Dt,RGB_PVRTC_4BPPV1_Format as Vt,RGB_PVRTC_2BPPV1_Format as Ot,RGBA_PVRTC_4BPPV1_Format as Gt,RGBA_PVRTC_2BPPV1_Format as kt,RGB_ETC1_Format as zt,RGB_ETC2_Format as $t,RGBA_ETC2_EAC_Format as Wt,RGBA_ASTC_4x4_Format as Ht,RGBA_ASTC_5x4_Format as jt,RGBA_ASTC_5x5_Format as qt,RGBA_ASTC_6x5_Format as Kt,RGBA_ASTC_6x6_Format as Xt,RGBA_ASTC_8x5_Format as Yt,RGBA_ASTC_8x6_Format as Qt,RGBA_ASTC_8x8_Format as Zt,RGBA_ASTC_10x5_Format as Jt,RGBA_ASTC_10x6_Format as er,RGBA_ASTC_10x8_Format as tr,RGBA_ASTC_10x10_Format as rr,RGBA_ASTC_12x10_Format as sr,RGBA_ASTC_12x12_Format as ir,RGBA_BPTC_Format as nr,RED_RGTC1_Format as or,SIGNED_RED_RGTC1_Format as ar,RED_GREEN_RGTC2_Format as ur,SIGNED_RED_GREEN_RGTC2_Format as lr,RepeatWrapping as dr,ClampToEdgeWrapping as cr,MirroredRepeatWrapping as hr,NearestFilter as pr,NearestMipmapNearestFilter as gr,NeverCompare as mr,AlwaysCompare as fr,LessEqualCompare as yr,EqualCompare as br,GreaterEqualCompare as xr,GreaterCompare as Tr,NotEqualCompare as _r,warnOnce as vr,NotEqualStencilFunc as Nr,GreaterStencilFunc as Sr,GreaterEqualStencilFunc as Ar,EqualStencilFunc as Rr,LessEqualStencilFunc as Cr,LessStencilFunc as Er,AlwaysStencilFunc as wr,NeverStencilFunc as Mr,DecrementWrapStencilOp as Br,IncrementWrapStencilOp as Ur,DecrementStencilOp as Fr,IncrementStencilOp as Pr,InvertStencilOp as Ir,ReplaceStencilOp as Lr,ZeroStencilOp as Dr,KeepStencilOp as Vr,MaxEquation as Or,MinEquation as Gr,SpotLight as kr,PointLight as zr,DirectionalLight as $r,RectAreaLight as Wr,AmbientLight as Hr,HemisphereLight as jr,LightProbe as qr,LinearToneMapping as Kr,ReinhardToneMapping as Xr,CineonToneMapping as Yr,ACESFilmicToneMapping as Qr,AgXToneMapping as Zr,NeutralToneMapping as Jr,Group as es,Loader as ts,FileLoader as rs,MaterialLoader as ss,ObjectLoader as is}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrayCamera,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,CylinderGeometry,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LinearTransfer,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Matrix2,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneGeometry,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding}from"./three.core.min.js";const ns=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveMap","envMap","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"];class os{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=ns,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const us=e=>as(e),ls=e=>as(e),ds=(...e)=>as(e);function cs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of hs(e))r.push(r,as(s.slice(0,-4)),i.getCacheKey(t));return as(r)}function*hs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Ts=Object.freeze({__proto__:null,arrayBufferToBase64:bs,base64ToArrayBuffer:xs,getCacheKey:cs,getLengthFromType:ms,getNodeChildren:hs,getTypeFromLength:gs,getValueFromType:ys,getValueType:fs,hash:ds,hashArray:ls,hashString:us});const _s={VERTEX:"vertex",FRAGMENT:"fragment"},vs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ns={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Ss={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},As=["fragment","vertex"],Rs=["setup","analyze","generate"],Cs=[...As,"compute"],Es=["x","y","z","w"];let ws=0;class Ms extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=vs.NONE,this.updateBeforeType=vs.NONE,this.updateAfterType=vs.NONE,this.uuid=a.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ws++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,vs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,vs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,vs.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of hs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=cs(this,e),this._cacheKeyVersion=this.version),this._cacheKey}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){e.stack.nodes.length;t.initialized=!0,t.outputNode=this.setup(e),null!==t.outputNode&&e.stack.nodes.length;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return hs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Bs extends Ms{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Us extends Ms{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Fs extends Ms{static get type(){return"TempNode"}constructor(e){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Ps extends Fs{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const Is=Es.join("");class Ls extends Ms{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(Es.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const o=r.build(e,n);i=this.components.length===s&&this.components===Is.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ds extends Fs{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getTypeFromLength(r.length,s.getNodeType(e)),o=s.build(e,n),a=t.build(e,i),u=e.getTypeLength(i),l=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Hs=e=>Ws(e).split("").sort().join(""),js={setup(e,t){const r=t.shift();return e(yi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ks.assign(r,...e),r);if(zs.has(t)){const s=zs.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&zs.has(t.slice(0,t.length-6))){const s=zs.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Ws(t),fi(new Ls(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Hs(t.slice(3).toLowerCase()),r=>fi(new Ds(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Hs(t.slice(4).toLowerCase()),()=>fi(new Vs(fi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),fi(new Ls(e,t));if(!0===/^\d+$/.test(t))return fi(new Bs(r,new Gs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},qs=new WeakMap,Ks=new WeakMap,Xs=function(e,t=null){for(const r in e)e[r]=fi(e[r],t);return e},Ys=function(e,t=null){const r=e.length;for(let s=0;sfi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...bi(t))):null!==r?(r=fi(r),(...s)=>i(new e(t,...bi(s),r))):(...r)=>i(new e(t,...bi(r)))},Zs=function(e,...t){return fi(new e(...bi(t)))};class Js extends Ms{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=Ks.get(e.constructor);void 0===s&&(s=new WeakMap,Ks.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=fi(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=fi(n.call(r))}else{const s=t.jsFunc,n=null!==r?s(r,e):s(e);i=fi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ei extends Ms{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return yi(e),fi(new Js(this,e))}setup(){return this.call()}}const ti=[!1,!0],ri=[0,1,2,3],si=[-1,-2],ii=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],ni=new Map;for(const e of ti)ni.set(e,new Gs(e));const oi=new Map;for(const e of ri)oi.set(e,new Gs(e,"uint"));const ai=new Map([...oi].map((e=>new Gs(e.value,"int"))));for(const e of si)ai.set(e,new Gs(e,"int"));const ui=new Map([...ai].map((e=>new Gs(e.value))));for(const e of ii)ui.set(e,new Gs(e));for(const e of ii)ui.set(-e,new Gs(-e));const li={bool:ni,uint:oi,ints:ai,float:ui},di=new Map([...ni,...ui]),ci=(e,t)=>di.has(e)?di.get(e):!0===e.isNode?e:new Gs(e,t),hi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[ys(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return fi(t.get(r[0]));if(1===r.length){const t=ci(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?fi(t):fi(new Us(t,e))}const s=r.map((e=>ci(e)));return fi(new Ps(s,e))}},pi=e=>"object"==typeof e&&null!==e?e.value:e,gi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function mi(e,t){return new Proxy(new ei(e,t),js)}const fi=(e,t=null)=>function(e,t=null){const r=fs(e);if("node"===r){let t=qs.get(e);return void 0===t&&(t=new Proxy(e,js),qs.set(e,t),qs.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?fi(ci(e,t)):"shader"===r?_i(e):e}(e,t),yi=(e,t=null)=>new Xs(e,t),bi=(e,t=null)=>new Ys(e,t),xi=(...e)=>new Qs(...e),Ti=(...e)=>new Zs(...e),_i=(e,t)=>{const r=new mi(e,t),s=(...e)=>{let t;return yi(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};$s("toGlobal",(e=>(e.global=!0,e)));const vi=e=>{ks=e},Ni=()=>ks,Si=(...e)=>ks.If(...e);function Ai(e){return ks&&ks.add(e),e}$s("append",Ai);const Ri=new hi("color"),Ci=new hi("float",li.float),Ei=new hi("int",li.ints),wi=new hi("uint",li.uint),Mi=new hi("bool",li.bool),Bi=new hi("vec2"),Ui=new hi("ivec2"),Fi=new hi("uvec2"),Pi=new hi("bvec2"),Ii=new hi("vec3"),Li=new hi("ivec3"),Di=new hi("uvec3"),Vi=new hi("bvec3"),Oi=new hi("vec4"),Gi=new hi("ivec4"),ki=new hi("uvec4"),zi=new hi("bvec4"),$i=new hi("mat2"),Wi=new hi("mat3"),Hi=new hi("mat4");$s("toColor",Ri),$s("toFloat",Ci),$s("toInt",Ei),$s("toUint",wi),$s("toBool",Mi),$s("toVec2",Bi),$s("toIVec2",Ui),$s("toUVec2",Fi),$s("toBVec2",Pi),$s("toVec3",Ii),$s("toIVec3",Li),$s("toUVec3",Di),$s("toBVec3",Vi),$s("toVec4",Oi),$s("toIVec4",Gi),$s("toUVec4",ki),$s("toBVec4",zi),$s("toMat2",$i),$s("toMat3",Wi),$s("toMat4",Hi);const ji=xi(Bs),qi=(e,t)=>fi(new Us(fi(e),t));$s("element",ji),$s("convert",qi);class Ki extends Ms{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Xi=e=>new Ki(e),Yi=(e,t=0)=>new Ki(e,!0,t),Qi=Yi("frame"),Zi=Yi("render"),Ji=Xi("object");class en extends Os{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Ji}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const tn=(e,t)=>{const r=gi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return fi(new en(s,r))};class rn extends Ms{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const sn=(e,t)=>fi(new rn(e,t)),nn=(e,t)=>fi(new rn(e,t,!0)),on=Ti(rn,"vec4","DiffuseColor"),an=Ti(rn,"vec3","EmissiveColor"),un=Ti(rn,"float","Roughness"),ln=Ti(rn,"float","Metalness"),dn=Ti(rn,"float","Clearcoat"),cn=Ti(rn,"float","ClearcoatRoughness"),hn=Ti(rn,"vec3","Sheen"),pn=Ti(rn,"float","SheenRoughness"),gn=Ti(rn,"float","Iridescence"),mn=Ti(rn,"float","IridescenceIOR"),fn=Ti(rn,"float","IridescenceThickness"),yn=Ti(rn,"float","AlphaT"),bn=Ti(rn,"float","Anisotropy"),xn=Ti(rn,"vec3","AnisotropyT"),Tn=Ti(rn,"vec3","AnisotropyB"),_n=Ti(rn,"color","SpecularColor"),vn=Ti(rn,"float","SpecularF90"),Nn=Ti(rn,"float","Shininess"),Sn=Ti(rn,"vec4","Output"),An=Ti(rn,"float","dashSize"),Rn=Ti(rn,"float","gapSize"),Cn=Ti(rn,"float","pointWidth"),En=Ti(rn,"float","IOR"),wn=Ti(rn,"float","Transmission"),Mn=Ti(rn,"float","Thickness"),Bn=Ti(rn,"float","AttenuationDistance"),Un=Ti(rn,"color","AttenuationColor"),Fn=Ti(rn,"float","Dispersion");class Pn extends Fs{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return Es.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?bi(t):yi(t[0]),fi(new Ln(fi(e),t)));$s("call",Dn);class Vn extends Fs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Vn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}return"float"===n&&e.isMatrix(o)?o:e.isMatrix(n)&&e.isVector(o)?e.getVectorFromMatrix(n):e.isVector(n)&&e.isMatrix(o)?e.getVectorFromMatrix(o):e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)&&e.isVector(a)?a=e.getVectorFromMatrix(o):o=e.isVector(o)&&e.isMatrix(a)?e.getVectorFromMatrix(a):a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const On=xi(Vn,"+"),Gn=xi(Vn,"-"),kn=xi(Vn,"*"),zn=xi(Vn,"/"),$n=xi(Vn,"%"),Wn=xi(Vn,"=="),Hn=xi(Vn,"!="),jn=xi(Vn,"<"),qn=xi(Vn,">"),Kn=xi(Vn,"<="),Xn=xi(Vn,">="),Yn=xi(Vn,"&&"),Qn=xi(Vn,"||"),Zn=xi(Vn,"!"),Jn=xi(Vn,"^^"),eo=xi(Vn,"&"),to=xi(Vn,"~"),ro=xi(Vn,"|"),so=xi(Vn,"^"),io=xi(Vn,"<<"),no=xi(Vn,">>");$s("add",On),$s("sub",Gn),$s("mul",kn),$s("div",zn),$s("modInt",$n),$s("equal",Wn),$s("notEqual",Hn),$s("lessThan",jn),$s("greaterThan",qn),$s("lessThanEqual",Kn),$s("greaterThanEqual",Xn),$s("and",Yn),$s("or",Qn),$s("not",Zn),$s("xor",Jn),$s("bitAnd",eo),$s("bitNot",to),$s("bitOr",ro),$s("bitXor",so),$s("shiftLeft",io),$s("shiftRight",no);const oo=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),$n(...e));$s("remainder",oo);class ao extends Fs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===ao.LENGTH||t===ao.DISTANCE||t===ao.DOT?"float":t===ao.CROSS?"vec3":t===ao.ALL?"bool":t===ao.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===ao.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,u=!0===e.renderer.isWebGLRenderer;if(r===ao.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=Oi(Ii(s),0):r=Oi(Ii(r),0);const i=kn(r,s).xyz;return Ro(i).build(e,t)}if(r===ao.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===ao.ONE_MINUS)return Gn(1,n).build(e,t);if(r===ao.RECIPROCAL)return zn(1,n).build(e,t);if(r===ao.DIFFERENCE)return Po(Gn(n,o)).build(e,t);{const l=[];return r===ao.CROSS||r===ao.MOD?l.push(n.build(e,s),o.build(e,s)):u&&r===ao.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):u&&(r===ao.MIN||r===ao.MAX)||r===ao.MOD?l.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===ao.REFRACT?l.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===ao.MIX?l.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(l.push(n.build(e,i)),null!==o&&l.push(o.build(e,i)),null!==a&&l.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ao.ALL="all",ao.ANY="any",ao.EQUALS="equals",ao.RADIANS="radians",ao.DEGREES="degrees",ao.EXP="exp",ao.EXP2="exp2",ao.LOG="log",ao.LOG2="log2",ao.SQRT="sqrt",ao.INVERSE_SQRT="inversesqrt",ao.FLOOR="floor",ao.CEIL="ceil",ao.NORMALIZE="normalize",ao.FRACT="fract",ao.SIN="sin",ao.COS="cos",ao.TAN="tan",ao.ASIN="asin",ao.ACOS="acos",ao.ATAN="atan",ao.ABS="abs",ao.SIGN="sign",ao.LENGTH="length",ao.NEGATE="negate",ao.ONE_MINUS="oneMinus",ao.DFDX="dFdx",ao.DFDY="dFdy",ao.ROUND="round",ao.RECIPROCAL="reciprocal",ao.TRUNC="trunc",ao.FWIDTH="fwidth",ao.BITCAST="bitcast",ao.TRANSPOSE="transpose",ao.ATAN2="atan2",ao.MIN="min",ao.MAX="max",ao.MOD="mod",ao.STEP="step",ao.REFLECT="reflect",ao.DISTANCE="distance",ao.DIFFERENCE="difference",ao.DOT="dot",ao.CROSS="cross",ao.POW="pow",ao.TRANSFORM_DIRECTION="transformDirection",ao.MIX="mix",ao.CLAMP="clamp",ao.REFRACT="refract",ao.SMOOTHSTEP="smoothstep",ao.FACEFORWARD="faceforward";const uo=Ci(1e-6),lo=Ci(1e6),co=Ci(Math.PI),ho=Ci(2*Math.PI),po=xi(ao,ao.ALL),go=xi(ao,ao.ANY),mo=xi(ao,ao.EQUALS),fo=xi(ao,ao.RADIANS),yo=xi(ao,ao.DEGREES),bo=xi(ao,ao.EXP),xo=xi(ao,ao.EXP2),To=xi(ao,ao.LOG),_o=xi(ao,ao.LOG2),vo=xi(ao,ao.SQRT),No=xi(ao,ao.INVERSE_SQRT),So=xi(ao,ao.FLOOR),Ao=xi(ao,ao.CEIL),Ro=xi(ao,ao.NORMALIZE),Co=xi(ao,ao.FRACT),Eo=xi(ao,ao.SIN),wo=xi(ao,ao.COS),Mo=xi(ao,ao.TAN),Bo=xi(ao,ao.ASIN),Uo=xi(ao,ao.ACOS),Fo=xi(ao,ao.ATAN),Po=xi(ao,ao.ABS),Io=xi(ao,ao.SIGN),Lo=xi(ao,ao.LENGTH),Do=xi(ao,ao.NEGATE),Vo=xi(ao,ao.ONE_MINUS),Oo=xi(ao,ao.DFDX),Go=xi(ao,ao.DFDY),ko=xi(ao,ao.ROUND),zo=xi(ao,ao.RECIPROCAL),$o=xi(ao,ao.TRUNC),Wo=xi(ao,ao.FWIDTH),Ho=xi(ao,ao.BITCAST),jo=xi(ao,ao.TRANSPOSE),qo=xi(ao,ao.ATAN2),Ko=xi(ao,ao.MIN),Xo=xi(ao,ao.MAX),Yo=xi(ao,ao.MOD),Qo=xi(ao,ao.STEP),Zo=xi(ao,ao.REFLECT),Jo=xi(ao,ao.DISTANCE),ea=xi(ao,ao.DIFFERENCE),ta=xi(ao,ao.DOT),ra=xi(ao,ao.CROSS),sa=xi(ao,ao.POW),ia=xi(ao,ao.POW,2),na=xi(ao,ao.POW,3),oa=xi(ao,ao.POW,4),aa=xi(ao,ao.TRANSFORM_DIRECTION),ua=e=>kn(Io(e),sa(Po(e),1/3)),la=e=>ta(e,e),da=xi(ao,ao.MIX),ca=(e,t=0,r=1)=>fi(new ao(ao.CLAMP,fi(e),fi(t),fi(r))),ha=e=>ca(e),pa=xi(ao,ao.REFRACT),ga=xi(ao,ao.SMOOTHSTEP),ma=xi(ao,ao.FACEFORWARD),fa=_i((([e])=>{const t=ta(e.xy,Bi(12.9898,78.233)),r=Yo(t,co);return Co(Eo(r).mul(43758.5453))})),ya=(e,t,r)=>da(t,r,e),ba=(e,t,r)=>ga(t,r,e);$s("all",po),$s("any",go),$s("equals",mo),$s("radians",fo),$s("degrees",yo),$s("exp",bo),$s("exp2",xo),$s("log",To),$s("log2",_o),$s("sqrt",vo),$s("inverseSqrt",No),$s("floor",So),$s("ceil",Ao),$s("normalize",Ro),$s("fract",Co),$s("sin",Eo),$s("cos",wo),$s("tan",Mo),$s("asin",Bo),$s("acos",Uo),$s("atan",Fo),$s("abs",Po),$s("sign",Io),$s("length",Lo),$s("lengthSq",la),$s("negate",Do),$s("oneMinus",Vo),$s("dFdx",Oo),$s("dFdy",Go),$s("round",ko),$s("reciprocal",zo),$s("trunc",$o),$s("fwidth",Wo),$s("atan2",qo),$s("min",Ko),$s("max",Xo),$s("mod",Yo),$s("step",Qo),$s("reflect",Zo),$s("distance",Jo),$s("dot",ta),$s("cross",ra),$s("pow",sa),$s("pow2",ia),$s("pow3",na),$s("pow4",oa),$s("transformDirection",aa),$s("mix",ya),$s("clamp",ca),$s("refract",pa),$s("smoothstep",ba),$s("faceForward",ma),$s("difference",ea),$s("saturate",ha),$s("cbrt",ua),$s("transpose",jo),$s("rand",fa);class xa extends Ms{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const t=this.ifNode.getNodeType(e);if(null!==this.elseNode){const r=this.elseNode.getNodeType(e);if(e.getTypeLength(r)>e.getTypeLength(t))return r}return t}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:o}=e.getNodeProperties(this),a="void"!==t,u=a?sn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const Ta=xi(xa);$s("select",Ta);const _a=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),Ta(...e));$s("cond",_a);class va extends Ms{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Na=xi(va),Sa=(e,t)=>Na(e,{label:t});$s("context",Na),$s("label",Sa);class Aa extends Ms{static get type(){return"VarNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r}=this,s=e.getVarFromNode(this,r,e.getVectorType(this.getNodeType(e))),i=e.getPropertyName(s),n=t.build(e,s.type);return e.addLineFlowCode(`${i} = ${n}`,this),i}}const Ra=xi(Aa);$s("toVar",((...e)=>Ra(...e).append()));const Ca=e=>(console.warn('TSL: "temp" is deprecated. Use ".toVar()" instead.'),Ra(e));$s("temp",Ca);class Ea extends Ms{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e);if(void 0===t.propertyName){const s=this.getNodeType(e),i=e.getPropertyName(r,_s.VERTEX);e.flowNodeFromShaderStage(_s.VERTEX,this.node,s,i),t.propertyName=i}return e.getPropertyName(r)}}const wa=xi(Ea);$s("varying",wa);const Ma=_i((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return da(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ba=_i((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return da(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ua="WorkingColorSpace",Fa="OutputColorSpace";class Pa extends Fs{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ua?u.workingColorSpace:t===Fa?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let n=t;return!1!==u.enabled&&r!==s&&r&&s?(u.getTransfer(r)===l&&(n=Oi(Ma(n.rgb),n.a)),u.getPrimaries(r)!==u.getPrimaries(s)&&(n=Oi(Wi(u._getMatrix(new i,r,s)).mul(n.rgb),n.a)),u.getTransfer(s)===l&&(n=Oi(Ba(n.rgb),n.a)),n):n}}const Ia=e=>fi(new Pa(fi(e),Ua,Fa)),La=e=>fi(new Pa(fi(e),Fa,Ua)),Da=(e,t)=>fi(new Pa(fi(e),Ua,t)),Va=(e,t)=>fi(new Pa(fi(e),t,Ua));$s("toOutputColorSpace",Ia),$s("toWorkingColorSpace",La),$s("workingToColorSpace",Da),$s("colorSpaceToWorking",Va);let Oa=class extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class Ga extends Ms{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=vs.OBJECT}setGroup(e){return this.group=e,this}element(e){return fi(new Oa(this,fi(e)))}setNodeType(e){const t=tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new ka(e,t,r));class $a extends Fs{static get type(){return"ToneMappingNode"}constructor(e,t=Ha,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}getCacheKey(){return ds(super.getCacheKey(),this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===d)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Oi(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Wa=(e,t,r)=>fi(new $a(e,fi(t),fi(r))),Ha=za("toneMappingExposure","float");$s("toneMapping",((e,t,r)=>Wa(t,r,e)));class ja extends Os{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=c,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new h(r,i),a=new g(o,s,n);o.setUsage(this.usage),this.attribute=a,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=wa(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const qa=(e,t,r,s)=>fi(new ja(e,t,r,s)),Ka=(e,t,r,s)=>qa(e,t,r,s).setUsage(p),Xa=(e,t,r,s)=>qa(e,t,r,s).setInstanced(!0),Ya=(e,t,r,s)=>Ka(e,t,r,s).setInstanced(!0);$s("toAttribute",(e=>qa(e.value)));class Qa extends Ms{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.updateBeforeType=vs.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;efi(new Qa(fi(e),t,r));$s("compute",Za);class Ja extends Ms{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){return this.node.getNodeType(e)}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const eu=(e,...t)=>fi(new Ja(fi(e),...t));$s("cache",eu);class tu extends Ms{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ru=xi(tu);$s("bypass",ru);class su extends Ms{static get type(){return"RemapNode"}constructor(e,t,r,s=Ci(0),i=Ci(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const iu=xi(su,null,null,{doClamp:!1}),nu=xi(su);$s("remap",iu),$s("remapClamp",nu);class ou extends Ms{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(`( ${s} )`,r,t);e.addLineFlowCode(s,this)}}const au=xi(ou),uu=e=>(e?Ta(e,au("discard")):au("discard")).append();$s("discard",uu);class lu extends Fs{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutput=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||d,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||m;return r!==d&&(t=t.toneMapping(r)),s!==m&&s!==u.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const du=(e,t=null,r=null)=>fi(new lu(fi(e),t,r));$s("renderOutput",du);class cu extends Ms{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return wa(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const hu=(e,t)=>fi(new cu(e,t)),pu=e=>hu("uv"+(e>0?e:""),"vec2");class gu extends Ms{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const mu=xi(gu);class fu extends en{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=vs.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const yu=xi(fu);class bu extends en{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=vs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===f?"uvec4":this.value.type===y?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return pu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=tn(this.value.matrix)),this._matrixUniform.mul(Ii(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?vs.FRAME:vs.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Ei(mu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;let r=this.uvNode;null!==r&&!0!==e.context.forceUVContext||!e.context.getUV||(r=e.context.getUV(this)),r||(r=this.getDefaultUV()),!0===this.updateMatrix&&(r=this.getTransformedUV(r)),r=this.setupUV(e,r);let s=this.levelNode;null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),t.uvNode=r,t.levelNode=s,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=e.getNodeProperties(this),s=this.value;if(!s||!0!==s.isTexture)throw new Error("TextureNode: Need a three.js texture.");const i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:s,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=r,c=this.generateUV(e,t),h=s?s.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${b}`,this),n.snippet=b,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(s)&&(a=Va(au(a,u),s.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){const t=this.clone();return t.uvNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}blur(e){const t=this.clone();return t.biasNode=fi(e).mul(yu(t)),t.referenceNode=this.getSelf(),fi(t)}level(e){const t=this.clone();return t.levelNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}size(e){return mu(this,e)}bias(e){const t=this.clone();return t.biasNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}compare(e){const t=this.clone();return t.compareNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}grad(e,t){const r=this.clone();return r.gradNode=[fi(e),fi(t)],r.referenceNode=this.getSelf(),fi(r)}depth(e){const t=this.clone();return t.depthNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const xu=xi(bu),Tu=(...e)=>xu(...e).setSampler(!1),_u=tn("float").label("cameraNear").setGroup(Zi).onRenderUpdate((({camera:e})=>e.near)),vu=tn("float").label("cameraFar").setGroup(Zi).onRenderUpdate((({camera:e})=>e.far)),Nu=tn("mat4").label("cameraProjectionMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrix)),Su=tn("mat4").label("cameraProjectionMatrixInverse").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),Au=tn("mat4").label("cameraViewMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorldInverse)),Ru=tn("mat4").label("cameraWorldMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorld)),Cu=tn("mat3").label("cameraNormalMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.normalMatrix)),Eu=tn(new r).label("cameraPosition").setGroup(Zi).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class wu extends Ms{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=vs.OBJECT,this._uniformNode=new en(null)}getNodeType(){const e=this.scope;return e===wu.WORLD_MATRIX?"mat4":e===wu.POSITION||e===wu.VIEW_POSITION||e===wu.DIRECTION||e===wu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===wu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===wu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===wu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===wu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===wu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===wu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==wu.POSITION&&t!==wu.VIEW_POSITION&&t!==wu.DIRECTION&&t!==wu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}wu.WORLD_MATRIX="worldMatrix",wu.POSITION="position",wu.SCALE="scale",wu.VIEW_POSITION="viewPosition",wu.DIRECTION="direction";const Mu=xi(wu,wu.DIRECTION),Bu=xi(wu,wu.WORLD_MATRIX),Uu=xi(wu,wu.POSITION),Fu=xi(wu,wu.SCALE),Pu=xi(wu,wu.VIEW_POSITION);class Iu extends wu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Lu=Ti(Iu,Iu.DIRECTION),Du=Ti(Iu,Iu.WORLD_MATRIX),Vu=Ti(Iu,Iu.POSITION),Ou=Ti(Iu,Iu.SCALE),Gu=Ti(Iu,Iu.VIEW_POSITION),ku=tn(new i).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),zu=tn(new n).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),$u=Au.mul(Du).toVar("modelViewMatrix"),Wu=_i((e=>(e.context.isHighPrecisionModelViewMatrix=!0,tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highPrecisionModelViewMatrix"),Hu=_i((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highPrecisionModelNormalMatrix"),ju=hu("position","vec3"),qu=ju.varying("positionLocal"),Ku=ju.varying("positionPrevious"),Xu=Du.mul(qu).xyz.varying("v_positionWorld"),Yu=qu.transformDirection(Du).varying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),Qu=$u.mul(qu).xyz.varying("v_positionView"),Zu=Qu.negate().varying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Ju extends Ms{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===b&&r.side===x?"false":e.getFrontFacing()}}const el=Ti(Ju),tl=Ci(el).mul(2).sub(1),rl=hu("normal","vec3"),sl=_i((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),Ii(0,1,0)):rl),"vec3").once()().toVar("normalLocal"),il=Qu.dFdx().cross(Qu.dFdy()).normalize().toVar("normalFlat"),nl=_i((e=>{let t;return t=!0===e.material.flatShading?il:wa(cl(sl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),ol=wa(nl.transformDirection(Au),"v_normalWorld").normalize().toVar("normalWorld"),al=_i((e=>e.context.setupNormal()),"vec3").once()().mul(tl).toVar("transformedNormalView"),ul=al.transformDirection(Au).toVar("transformedNormalWorld"),ll=_i((e=>e.context.setupClearcoatNormal()),"vec3").once()().mul(tl).toVar("transformedClearcoatNormalView"),dl=_i((([e,t=Du])=>{const r=Wi(t),s=e.div(Ii(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),cl=_i((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=ku.mul(e);return Au.transformDirection(s)})),hl=tn(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),pl=Zu.negate().reflect(al),gl=Zu.negate().refract(al,hl),ml=pl.transformDirection(Au).toVar("reflectVector"),fl=gl.transformDirection(Au).toVar("reflectVector");class yl extends bu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===T?ml:e.mapping===_?fl:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Ii(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==v&&r.isRenderTargetTexture?t:Ii(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const bl=xi(yl);class xl extends en{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Tl=(e,t,r)=>fi(new xl(e,t,r));class _l extends Bs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType();return e.format(t,"vec4",r)}}class vl extends xl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null,"vec4"),this.array=e,this.elementType=t,this._elementType=null,this._elementLength=0,this.updateType=vs.RENDER,this.isArrayBufferNode=!0}getElementType(){return this.elementType||this._elementType}getElementLength(){return this._elementLength}update(){const{array:e,value:t}=this,r=this.getElementLength(),s=this.getElementType();if(1===r)for(let r=0;rfi(new vl(e,t));class Sl extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Al extends Ms{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=vs.OBJECT}element(e){return fi(new Sl(this,fi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Tl(null,e,this.count):Array.isArray(this.getValueFromReference())?Nl(null,e):"texture"===e?xu(null):"cubeTexture"===e?bl(null):tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new Al(e,t,r)),Cl=(e,t,r,s)=>fi(new Al(e,t,s,r));class El extends Al{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const wl=(e,t,r)=>fi(new El(e,t,r)),Ml=_i((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),hu("tangent","vec4"))))(),Bl=Ml.xyz.toVar("tangentLocal"),Ul=$u.mul(Oi(Bl,0)).xyz.varying("v_tangentView").normalize().toVar("tangentView"),Fl=Ul.transformDirection(Au).varying("v_tangentWorld").normalize().toVar("tangentWorld"),Pl=Ul.toVar("transformedTangentView"),Il=Pl.transformDirection(Au).normalize().toVar("transformedTangentWorld"),Ll=e=>e.mul(Ml.w).xyz,Dl=wa(Ll(rl.cross(Ml)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Vl=wa(Ll(sl.cross(Bl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Ol=wa(Ll(nl.cross(Ul)),"v_bitangentView").normalize().toVar("bitangentView"),Gl=wa(Ll(ol.cross(Fl)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kl=Ll(al.cross(Pl)).normalize().toVar("transformedBitangentView"),zl=kl.transformDirection(Au).normalize().toVar("transformedBitangentWorld"),$l=Wi(Ul,Ol,nl),Wl=Zu.mul($l),Hl=(()=>{let e=Tn.cross(Zu);return e=e.cross(Tn).normalize(),e=da(e,al,bn.mul(un.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),jl=_i((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=tl.mul(g.inverseSqrt());return On(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class ql extends Fs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=N}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Ii(s.xy.mul(r),s.z));let i=null;if(t===S)i=cl(s);else if(t===N){i=!0===e.hasGeometryAttribute("tangent")?$l.mul(s).normalize():jl({eye_pos:Qu,surf_norm:nl,mapN:s,uv:pu()})}return i}}const Kl=xi(ql),Xl=_i((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||pu()),forceUVContext:!0}),s=Ci(r((e=>e)));return Bi(Ci(r((e=>e.add(e.dFdx())))).sub(s),Ci(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Yl=_i((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(tl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class Ql extends Fs{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Xl({textureNode:this.textureNode,bumpScale:e});return Yl({surf_pos:Qu,surf_norm:nl,dHdxy:t})}}const Zl=xi(Ql),Jl=new Map;class ed extends Ms{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Jl.get(e);return void 0===r&&(r=wl(e,t),Jl.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===ed.COLOR){const e=void 0!==t.color?this.getColor(r):Ii();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===ed.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===ed.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Ci(1);else if(r===ed.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularMap?e.mul(this.getTexture(r).a):e}else if(r===ed.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===ed.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===ed.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===ed.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===ed.NORMAL)t.normalMap?(s=Kl(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Zl(this.getTexture("bump").r,this.getFloat("bumpScale")):nl;else if(r===ed.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kl(this.getTexture(r),this.getCache(r+"Scale","vec2")):nl;else if(r===ed.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===ed.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===ed.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=$i(Vd.x,Vd.y,Vd.y.negate(),Vd.x).mul(e.rg.mul(2).sub(Bi(1)).normalize().mul(e.b))}else s=Vd;else if(r===ed.IRIDESCENCE_THICKNESS){const e=Rl("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Rl("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===ed.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===ed.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===ed.IOR)s=this.getFloat(r);else if(r===ed.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===ed.AO_MAP)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}ed.ALPHA_TEST="alphaTest",ed.COLOR="color",ed.OPACITY="opacity",ed.SHININESS="shininess",ed.SPECULAR="specular",ed.SPECULAR_STRENGTH="specularStrength",ed.SPECULAR_INTENSITY="specularIntensity",ed.SPECULAR_COLOR="specularColor",ed.REFLECTIVITY="reflectivity",ed.ROUGHNESS="roughness",ed.METALNESS="metalness",ed.NORMAL="normal",ed.CLEARCOAT="clearcoat",ed.CLEARCOAT_ROUGHNESS="clearcoatRoughness",ed.CLEARCOAT_NORMAL="clearcoatNormal",ed.EMISSIVE="emissive",ed.ROTATION="rotation",ed.SHEEN="sheen",ed.SHEEN_ROUGHNESS="sheenRoughness",ed.ANISOTROPY="anisotropy",ed.IRIDESCENCE="iridescence",ed.IRIDESCENCE_IOR="iridescenceIOR",ed.IRIDESCENCE_THICKNESS="iridescenceThickness",ed.IOR="ior",ed.TRANSMISSION="transmission",ed.THICKNESS="thickness",ed.ATTENUATION_DISTANCE="attenuationDistance",ed.ATTENUATION_COLOR="attenuationColor",ed.LINE_SCALE="scale",ed.LINE_DASH_SIZE="dashSize",ed.LINE_GAP_SIZE="gapSize",ed.LINE_WIDTH="linewidth",ed.LINE_DASH_OFFSET="dashOffset",ed.POINT_WIDTH="pointWidth",ed.DISPERSION="dispersion",ed.LIGHT_MAP="light",ed.AO_MAP="ao";const td=Ti(ed,ed.ALPHA_TEST),rd=Ti(ed,ed.COLOR),sd=Ti(ed,ed.SHININESS),id=Ti(ed,ed.EMISSIVE),nd=Ti(ed,ed.OPACITY),od=Ti(ed,ed.SPECULAR),ad=Ti(ed,ed.SPECULAR_INTENSITY),ud=Ti(ed,ed.SPECULAR_COLOR),ld=Ti(ed,ed.SPECULAR_STRENGTH),dd=Ti(ed,ed.REFLECTIVITY),cd=Ti(ed,ed.ROUGHNESS),hd=Ti(ed,ed.METALNESS),pd=Ti(ed,ed.NORMAL).context({getUV:null}),gd=Ti(ed,ed.CLEARCOAT),md=Ti(ed,ed.CLEARCOAT_ROUGHNESS),fd=Ti(ed,ed.CLEARCOAT_NORMAL).context({getUV:null}),yd=Ti(ed,ed.ROTATION),bd=Ti(ed,ed.SHEEN),xd=Ti(ed,ed.SHEEN_ROUGHNESS),Td=Ti(ed,ed.ANISOTROPY),_d=Ti(ed,ed.IRIDESCENCE),vd=Ti(ed,ed.IRIDESCENCE_IOR),Nd=Ti(ed,ed.IRIDESCENCE_THICKNESS),Sd=Ti(ed,ed.TRANSMISSION),Ad=Ti(ed,ed.THICKNESS),Rd=Ti(ed,ed.IOR),Cd=Ti(ed,ed.ATTENUATION_DISTANCE),Ed=Ti(ed,ed.ATTENUATION_COLOR),wd=Ti(ed,ed.LINE_SCALE),Md=Ti(ed,ed.LINE_DASH_SIZE),Bd=Ti(ed,ed.LINE_GAP_SIZE),Ud=Ti(ed,ed.LINE_WIDTH),Fd=Ti(ed,ed.LINE_DASH_OFFSET),Pd=Ti(ed,ed.POINT_WIDTH),Id=Ti(ed,ed.DISPERSION),Ld=Ti(ed,ed.LIGHT_MAP),Dd=Ti(ed,ed.AO_MAP),Vd=tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}));class Od extends Fs{static get type(){return"ModelViewProjectionNode"}constructor(e=null){super("vec4"),this.positionNode=e}setup(e){if("fragment"===e.shaderStage)return wa(e.context.mvp);const t=this.positionNode||qu,r=e.renderer.nodes.modelViewMatrix||$u;return Nu.mul(r).mul(t)}}const Gd=xi(Od);class kd extends Ms{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===kd.VERTEX)s=e.getVertexIndex();else if(r===kd.INSTANCE)s=e.getInstanceIndex();else if(r===kd.DRAW)s=e.getDrawIndex();else if(r===kd.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===kd.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==kd.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=wa(this).build(e,t)}return i}}kd.VERTEX="vertex",kd.INSTANCE="instance",kd.SUBGROUP="subgroup",kd.INVOCATION_LOCAL="invocationLocal",kd.INVOCATION_SUBGROUP="invocationSubgroup",kd.DRAW="draw";const zd=Ti(kd,kd.VERTEX),$d=Ti(kd,kd.INSTANCE),Wd=Ti(kd,kd.SUBGROUP),Hd=Ti(kd,kd.INVOCATION_SUBGROUP),jd=Ti(kd,kd.INVOCATION_LOCAL),qd=Ti(kd,kd.DRAW);class Kd extends Ms{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=vs.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Tl(r.array,"mat4",Math.max(t,1)).element($d);else{const e=new A(r.array,16,1);this.buffer=e;const t=r.usage===p?Ya:Xa,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Hi(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new R(s.array,3),t=s.usage===p?Ya:Xa;this.bufferColor=e,n=Ii(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(qu).xyz;if(qu.assign(o),e.hasGeometryAttribute("normal")){const e=dl(sl,i);sl.assign(e)}null!==this.instanceColorNode&&nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==p&&null!=this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==p&&null!=this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Xd=xi(Kd);class Yd extends Kd{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instanceMesh=e}}const Qd=xi(Yd);class Zd extends Ms{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=$d:this.batchingIdNode=qd);const t=_i((([e])=>{const t=mu(Tu(this.batchMesh._indirectTexture),0),r=Ei(e).modInt(Ei(t)),s=Ei(e).div(Ei(t));return Tu(this.batchMesh._indirectTexture,Ui(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Ei(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mu(Tu(s),0),n=Ci(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Ei(i)),u=Hi(Tu(s,Ui(o,a)),Tu(s,Ui(o.add(1),a)),Tu(s,Ui(o.add(2),a)),Tu(s,Ui(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=_i((([e])=>{const t=mu(Tu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Tu(l,Ui(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);nn("vec3","vBatchColor").assign(t)}const d=Wi(u);qu.assign(u.mul(qu));const c=sl.div(Ii(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;sl.assign(h),e.hasGeometryAttribute("tangent")&&Bl.mulAssign(d)}}const Jd=xi(Zd),ec=new WeakMap;class tc extends Ms{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=vs.OBJECT,this.skinIndexNode=hu("skinIndex","uvec4"),this.skinWeightNode=hu("skinWeight","vec4"),t?(r=Rl("bindMatrix","mat4"),s=Rl("bindMatrixInverse","mat4"),i=Cl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=tn(e.bindMatrix,"mat4"),s=tn(e.bindMatrixInverse,"mat4"),i=Tl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=qu){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=On(o.mul(s.x).mul(d),a.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=sl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=On(s.x.mul(o),s.y.mul(a),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Cl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ku)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")}setup(e){this.needsPreviousBoneMatrices(e)&&Ku.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(qu.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();sl.assign(t),e.hasGeometryAttribute("tangent")&&Bl.assign(t)}}generate(e,t){if("void"!==t)return qu.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;ec.get(t)!==e.frameId&&(ec.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const rc=e=>fi(new tc(e,!0));class sc extends Ms{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt()+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tfi(new sc(bi(e,"int"))).append(),nc=()=>au("break").append(),oc=new WeakMap,ac=new s,uc=_i((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Ei(zd).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Tu(e,Ui(u,a)).depth(i).mul(t)}));class lc extends Ms{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=tn(1),this.updateType=vs.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,o=void 0!==n?n.length:0,{texture:a,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,o=void 0!==n?n.length:0;let a=oc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*o),f=new C(m,h,p,o);f.type=E,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Ci(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Tu(this.mesh.morphTexture,Ui(Ei(e).add(1),Ei($d))).r):t.assign(Rl("morphTargetInfluences","float").element(e).toVar()),!0===s&&qu.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(0)})),!0===i&&sl.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(1)}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const dc=xi(lc);class cc extends Ms{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}generate(){console.warn("Abstract function.")}}class hc extends cc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class pc extends va{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Ii().toVar("directDiffuse"),directSpecular:Ii().toVar("directSpecular"),indirectDiffuse:Ii().toVar("indirectDiffuse"),indirectSpecular:Ii().toVar("indirectSpecular")};return{radiance:Ii().toVar("radiance"),irradiance:Ii().toVar("irradiance"),iblIrradiance:Ii().toVar("iblIrradiance"),ambientOcclusion:Ci(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const gc=xi(pc);class mc extends cc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let fc,yc;class bc extends Ms{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===bc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=vs.NONE;return this.scope!==bc.SIZE&&this.scope!==bc.VIEWPORT||(e=vs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===bc.VIEWPORT?null!==t?yc.copy(t.viewport):(e.getViewport(yc),yc.multiplyScalar(e.getPixelRatio())):null!==t?(fc.width=t.width,fc.height=t.height):e.getDrawingBufferSize(fc)}setup(){const e=this.scope;let r=null;return r=e===bc.SIZE?tn(fc||(fc=new t)):e===bc.VIEWPORT?tn(yc||(yc=new s)):Bi(_c.div(Tc)),r}generate(e){if(this.scope===bc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Tc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}bc.COORDINATE="coordinate",bc.VIEWPORT="viewport",bc.SIZE="size",bc.UV="uv";const xc=Ti(bc,bc.UV),Tc=Ti(bc,bc.SIZE),_c=Ti(bc,bc.COORDINATE),vc=Ti(bc,bc.VIEWPORT),Nc=vc.zw,Sc=_c.sub(vc.xy),Ac=Sc.div(Nc),Rc=_i((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Tc)),"vec2").once()(),Cc=_i((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),xc)),"vec2").once()(),Ec=_i((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),xc.flipY())),"vec2").once()(),wc=new t;class Mc extends bu{static get type(){return"ViewportTextureNode"}constructor(e=xc,t=null,r=null){null===r&&((r=new w).minFilter=M),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=vs.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(wc);const r=this.value;r.image.width===wc.width&&r.image.height===wc.height||(r.image.width=wc.width,r.image.height=wc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Bc=xi(Mc),Uc=xi(Mc,null,null,{generateMipmaps:!0});let Fc=null;class Pc extends Mc{static get type(){return"ViewportDepthTextureNode"}constructor(e=xc,t=null){null===Fc&&(Fc=new B),super(e,t,Fc)}}const Ic=xi(Pc);class Lc extends Ms{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Lc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Lc.DEPTH_BASE)null!==r&&(s=kc().assign(r));else if(t===Lc.DEPTH)s=e.isPerspectiveCamera?Vc(Qu.z,_u,vu):Dc(Qu.z,_u,vu);else if(t===Lc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Oc(r,_u,vu);s=Dc(e,_u,vu)}else s=r;else s=Dc(Qu.z,_u,vu);return s}}Lc.DEPTH_BASE="depthBase",Lc.DEPTH="depth",Lc.LINEAR_DEPTH="linearDepth";const Dc=(e,t,r)=>e.add(t).div(t.sub(r)),Vc=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Oc=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Gc=(e,t,r)=>{t=t.max(1e-6).toVar();const s=_o(e.negate().div(t)),i=_o(r.div(t));return s.div(i)},kc=xi(Lc,Lc.DEPTH_BASE),zc=Ti(Lc,Lc.DEPTH),$c=xi(Lc,Lc.LINEAR_DEPTH),Wc=$c(Ic());zc.assign=e=>kc(e);const Hc=xi(class extends Ms{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class jc extends Ms{static get type(){return"ClippingNode"}constructor(e=jc.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===jc.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===jc.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return _i((()=>{const r=Ci().toVar("distanceToPlane"),s=Ci().toVar("distanceToGradient"),i=Ci(1).toVar("clipOpacity"),n=t.length;if(!this.hardwareClipping&&n>0){const e=Nl(t);ic(n,(({i:t})=>{const n=e.element(t);r.assign(Qu.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ga(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Nl(e),n=Ci(1).toVar("intersectionClipOpacity");ic(o,(({i:e})=>{const i=t.element(e);r.assign(Qu.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ga(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}on.a.mulAssign(i),on.a.equal(0).discard()}))()}setupDefault(e,t){return _i((()=>{const r=t.length;if(!this.hardwareClipping&&r>0){const e=Nl(t);ic(r,(({i:t})=>{const r=e.element(t);Qu.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Nl(e),r=Mi(!0).toVar("clipped");ic(s,(({i:e})=>{const s=t.element(e);r.assign(Qu.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),_i((()=>{const s=Nl(e),i=Hc(t.getClipDistance());ic(r,(({i:e})=>{const t=s.element(e),r=Qu.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}jc.ALPHA_TO_COVERAGE="alphaToCoverage",jc.DEFAULT="default",jc.HARDWARE="hardware";const qc=_i((([e])=>Co(kn(1e4,Eo(kn(17,e.x).add(kn(.1,e.y)))).mul(On(.1,Po(Eo(kn(13,e.y).add(e.x)))))))),Kc=_i((([e])=>qc(Bi(qc(e.xy),e.z)))),Xc=_i((([e])=>{const t=Xo(Lo(Oo(e.xyz)),Lo(Go(e.xyz))),r=Ci(1).div(Ci(.05).mul(t)).toVar("pixScale"),s=Bi(xo(So(_o(r))),xo(Ao(_o(r)))),i=Bi(Kc(So(s.x.mul(e.xyz))),Kc(So(s.y.mul(e.xyz)))),n=Co(_o(r)),o=On(kn(n.oneMinus(),i.x),kn(n,i.y)),a=Ko(n,n.oneMinus()),u=Ii(o.mul(o).div(kn(2,a).mul(Gn(1,a))),o.sub(kn(.5,a)).div(Gn(1,a)),Gn(1,Gn(1,o).mul(Gn(1,o)).div(kn(2,a).mul(Gn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return ca(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Yc extends U{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.forceSinglePass=!1,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+cs(this)}build(e){this.setup(e)}setupObserver(e){return new os(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e);const t=e.renderer,r=t.getRenderTarget();let s;e.addStack(),e.stack.outputNode=this.vertexNode||this.setupPosition(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const i=this.setupClipping(e);if(!0===this.depthWrite&&(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const n=this.setupLighting(e);null!==i&&e.stack.add(i);const o=Oi(n,on.a).max(0);if(s=this.setupOutput(e,o),Sn.assign(s),null!==this.outputNode&&(s=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(s=e,null!==r&&(s=e.merge(r))):null!==r&&(s=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Oi(t)),s=this.setupOutput(e,t)}e.stack.outputNode=s,e.addFlow("fragment",e.removeStack()),e.monitor=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=fi(new jc(jc.ALPHA_TO_COVERAGE)):e.stack.add(fi(new jc))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(fi(new jc(jc.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Gc(Qu.z,_u,vu):Dc(Qu.z,_u,vu))}null!==s&&zc.assign(s).append()}setupPosition(e){const{object:t}=e,r=t.geometry;if(e.addStack(),(r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&dc(t).append(),!0===t.isSkinnedMesh&&rc(t).append(),this.displacementMap){const e=wl("displacementMap","texture"),t=wl("displacementScale","float"),r=wl("displacementBias","float");qu.addAssign(sl.normalize().mul(e.x.mul(t).add(r)))}t.isBatchedMesh&&Jd(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Qd(t).append(),null!==this.positionNode&&qu.assign(this.positionNode),this.setupHardwareClipping(e);const s=Gd();return e.context.vertex=e.removeStack(),e.context.mvp=s,s}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?Oi(this.colorNode):rd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=Oi(r.xyz.mul(hu("color","vec3")),r.a)),e.instanceColor){r=nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=nn("vec3","vBatchColor").mul(r)}on.assign(r);const s=this.opacityNode?Ci(this.opacityNode):nd;if(on.a.assign(on.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Ci(this.alphaTestNode):td;on.a.lessThanEqual(e).discard()}!0===this.alphaHash&&on.a.lessThan(Xc(qu)).discard(),!1===this.transparent&&this.blending===F&&!1===this.alphaToCoverage&&on.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Ii(0):on.rgb}setupNormal(){return this.normalNode?Ii(this.normalNode):pd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?wl("envMap","cubeTexture"):wl("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new mc(Ld)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Dd;t.push(new hc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=gc(n,t,r,s)}else null!==r&&(o=Ii(null!==s?da(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(an.assign(Ii(i||id)),o=o.add(an)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(t=Oi(r.mix(t.rgb,r.colorNode),t.a))}return t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=U.prototype.toJSON.call(this,e),s=hs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Qc=new P;class Zc extends Yc{static get type(){return"InstancedPointsNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.pointWidth=1,this.pointColorNode=null,this.pointWidthNode=null,this.setDefaultValues(Qc),this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor;this.vertexNode=_i((()=>{const e=hu("instancePosition").xyz,t=Oi($u.mul(Oi(e,1))),r=vc.z.div(vc.w),s=Nu.mul(t),i=ju.xy.toVar();return i.mulAssign(this.pointWidthNode?this.pointWidthNode:Pd),i.assign(i.div(vc.z)),i.y.assign(i.y.mul(r)),i.assign(i.mul(s.w)),s.addAssign(Oi(i,0,0)),s}))(),this.fragmentNode=_i((()=>{const s=Ci(1).toVar(),i=la(pu().mul(2).sub(1));if(t&&e.samples>1){const e=Ci(i.fwidth()).toVar();s.assign(ga(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();let n;if(this.pointColorNode)n=this.pointColorNode;else if(r){n=hu("instanceColor").mul(rd)}else n=rd;return s.mulAssign(nd),Oi(n,s)}))()}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const Jc=new I;class eh extends Yc{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.lights=!1,this.setDefaultValues(Jc),this.setValues(e)}}const th=new L;class rh extends Yc{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.lights=!1,this.setDefaultValues(th),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Ci(this.offsetNodeNode):Fd,t=this.dashScaleNode?Ci(this.dashScaleNode):wd,r=this.dashSizeNode?Ci(this.dashSizeNode):Md,s=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(r),Rn.assign(s);const i=wa(hu("lineDistance").mul(t));(e?i.add(e):i).mod(An.add(Rn)).greaterThan(An).discard()}}let sh=null;class ih extends Mc{static get type(){return"ViewportSharedTextureNode"}constructor(e=xc,t=null){null===sh&&(sh=new w),super(e,t,sh)}updateReference(){return this}}const nh=xi(ih),oh=new L;class ah extends Yc{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.lights=!1,this.setDefaultValues(oh),this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.useDash=e.dashed,this.useWorldUnits=!1,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=D,this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor,s=this.dashed,i=this.worldUnits,n=_i((({start:e,end:t})=>{const r=Nu.element(2).element(2),s=Nu.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Oi(da(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=_i((()=>{const e=hu("instanceStart"),t=hu("instanceEnd"),r=Oi($u.mul(Oi(e,1))).toVar("start"),o=Oi($u.mul(Oi(t,1))).toVar("end");if(s){const e=this.dashScaleNode?Ci(this.dashScaleNode):wd,t=this.offsetNode?Ci(this.offsetNodeNode):Fd,r=hu("instanceDistanceStart"),s=hu("instanceDistanceEnd");let i=ju.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),nn("float","lineDistance").assign(i)}i&&(nn("vec3","worldStart").assign(r.xyz),nn("vec3","worldEnd").assign(o.xyz));const a=vc.z.div(vc.w),u=Nu.element(2).element(3).equal(-1);Si(u,(()=>{Si(r.z.lessThan(0).and(o.z.greaterThan(0)),(()=>{o.assign(n({start:r,end:o}))})).ElseIf(o.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(n({start:o,end:r}))}))}));const l=Nu.mul(r),d=Nu.mul(o),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(a)),p.assign(p.normalize());const g=Oi().toVar();if(i){const e=o.xyz.sub(r.xyz).normalize(),t=da(r.xyz,o.xyz,.5).normalize(),i=e.cross(t).normalize(),n=e.cross(i),a=nn("vec4","worldPos");a.assign(ju.y.lessThan(.5).select(r,o));const u=Ud.mul(.5);a.addAssign(Oi(ju.x.lessThan(0).select(i.mul(u),i.mul(u).negate()),0)),s||(a.addAssign(Oi(ju.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(Oi(n.mul(u),0)),Si(ju.y.greaterThan(1).or(ju.y.lessThan(0)),(()=>{a.subAssign(Oi(n.mul(2).mul(u),0))}))),g.assign(Nu.mul(a));const l=Ii().toVar();l.assign(ju.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Bi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(ju.x.lessThan(0).select(e.negate(),e)),Si(ju.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(ju.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(Ud)),e.assign(e.div(vc.w)),g.assign(ju.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Oi(e,0,0)))}return g}))();const o=_i((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Bi(h,p)}));if(this.colorNode=_i((()=>{const n=pu();if(s){const e=this.dashSizeNode?Ci(this.dashSizeNode):Md,t=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(e),Rn.assign(t);const r=nn("float","lineDistance");n.y.lessThan(-1).or(n.y.greaterThan(1)).discard(),r.mod(An.add(Rn)).greaterThan(An).discard()}const a=Ci(1).toVar("alpha");if(i){const r=nn("vec3","worldStart"),i=nn("vec3","worldEnd"),n=nn("vec4","worldPos").xyz.normalize().mul(1e5),u=i.sub(r),l=o({p1:r,p2:i,p3:Ii(0,0,0),p4:n}),d=r.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Ud);if(!s)if(t&&e.samples>1){const e=h.fwidth();a.assign(ga(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(t&&e.samples>1){const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1)),r=e.mul(e).add(t.mul(t)),s=Ci(r.fwidth()).toVar("dlen");Si(n.y.abs().greaterThan(1),(()=>{a.assign(ga(s.oneMinus(),s.add(1),r).oneMinus())}))}else Si(n.y.abs().greaterThan(1),(()=>{const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1));e.mul(e).add(t.mul(t)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(r){const e=hu("instanceColorStart"),t=hu("instanceColorEnd");u=ju.y.lessThan(.5).select(e,t).mul(rd)}else u=rd;return Oi(u,a)}))(),this.transparent){const e=this.opacityNode?Ci(this.opacityNode):nd;this.outputNode=Oi(this.colorNode.rgb.mul(e).add(nh().rgb.mul(e.oneMinus())),this.colorNode.a)}}get worldUnits(){return this.useWorldUnits}set worldUnits(e){this.useWorldUnits!==e&&(this.useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this.useDash}set dashed(e){this.useDash!==e&&(this.useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const uh=e=>fi(e).mul(.5).add(.5),lh=new V;class dh extends Yc{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(lh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Ci(this.opacityNode):nd;on.assign(Oi(uh(al),e))}}class ch extends Fs{static get type(){return"EquirectUVNode"}constructor(e=Yu){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan2(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Bi(t,r)}}const hh=xi(ch);class ph extends O{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new G(5,5,5),n=hh(Yu),o=new Yc;o.colorNode=xu(t,n,0),o.side=x,o.blending=D;const a=new k(i,o),u=new z;u.add(a),t.minFilter===M&&(t.minFilter=$);const l=new W(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const gh=new WeakMap;class mh extends Fs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=bl();const t=new H;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=vs.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===j||r===q){if(gh.has(e)){const t=gh.get(e);yh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ph(r.height);s.fromEquirectangularTexture(t,e),yh(s.texture,e.mapping),this._cubeTexture=s.texture,gh.set(e,s.texture),e.addEventListener("dispose",fh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function fh(e){const t=e.target;t.removeEventListener("dispose",fh);const r=gh.get(t);void 0!==r&&(gh.delete(t),r.dispose())}function yh(e,t){t===j?e.mapping=T:t===q&&(e.mapping=_)}const bh=xi(mh);class xh extends cc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=bh(this.envNode)}}class Th extends cc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Ci(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class _h{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class vh extends _h{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(Oi(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(Oi(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(on.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case Y:i.rgb.assign(da(i.rgb,i.rgb.mul(n.rgb),ld.mul(dd)));break;case X:i.rgb.assign(da(i.rgb,n.rgb,ld.mul(dd)));break;case K:i.rgb.addAssign(n.rgb.mul(ld.mul(dd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Nh=new Q;class Sh extends Yc{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Nh),this.setValues(e)}setupNormal(){return nl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Th(Ld)),t}setupOutgoingLight(){return on.rgb}setupLightingModel(){return new vh}}const Ah=_i((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),Rh=_i((e=>e.diffuseColor.mul(1/Math.PI))),Ch=_i((({dotNH:e})=>Nn.mul(Ci(.5)).add(1).mul(Ci(1/Math.PI)).mul(e.pow(Nn)))),Eh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(t).clamp(),s=Zu.dot(t).clamp(),i=Ah({f0:_n,f90:1,dotVH:s}),n=Ci(.25),o=Ch({dotNH:r});return i.mul(n).mul(o)}));class wh extends vh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Eh({lightDirection:e})).mul(ld))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const Mh=new Z;class Bh extends Yc{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Mh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh(!1)}}const Uh=new J;class Fh extends Yc{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Uh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh}setupVariants(){const e=(this.shininessNode?Ci(this.shininessNode):sd).max(1e-4);Nn.assign(e);const t=this.specularNode||od;_n.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ph=_i((e=>{if(!1===e.geometry.hasAttribute("normal"))return Ci(0);const t=nl.dFdx().abs().max(nl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Ih=_i((e=>{const{roughness:t}=e,r=Ph();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Lh=_i((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return zn(.5,i.add(n).max(uo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Dh=_i((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul(Ii(e.mul(r),t.mul(s),o).length()),l=o.mul(Ii(e.mul(i),t.mul(n),a).length());return zn(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Vh=_i((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Oh=Ci(1/Math.PI),Gh=_i((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=Ii(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Oh.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),kh=_i((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||al,l=i.pow2(),d=t.add(Zu).normalize(),c=u.dot(t).clamp(),h=u.dot(Zu).clamp(),p=u.dot(d).clamp(),g=Zu.dot(d).clamp();let m,f,y=Ah({f0:r,f90:s,dotVH:g});if(pi(o)&&(y=gn.mix(y,n)),pi(a)){const e=xn.dot(t),r=xn.dot(Zu),s=xn.dot(d),i=Tn.dot(t),n=Tn.dot(Zu),o=Tn.dot(d);m=Dh({alphaT:yn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Gh({alphaT:yn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=Lh({alpha:l,dotNL:c,dotNV:h}),f=Vh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),zh=_i((({roughness:e,dotNV:t})=>{const r=Oi(-1,-.0275,-.572,.022),s=Oi(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Bi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),$h=_i((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=zh({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Wh=_i((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Ii(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),Hh=_i((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Ci(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Ci(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),jh=_i((({dotNV:e,dotNL:t})=>Ci(1).div(Ci(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),qh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(e).clamp(),s=al.dot(Zu).clamp(),i=al.dot(t).clamp(),n=Hh({roughness:pn,dotNH:i}),o=jh({dotNV:s,dotNL:r});return hn.mul(n).mul(o)})),Kh=_i((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Bi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Xh=_i((({f:e})=>{const t=e.length();return Xo(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Yh=_i((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),o=i.div(n),a=r.greaterThan(0).select(o,Xo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Qh=_i((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=Ii().toVar();return Si(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Wi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=Ii(0).toVar();f.addAssign(Yh({v1:h,v2:p})),f.addAssign(Yh({v1:p,v2:g})),f.addAssign(Yh({v1:g,v2:m})),f.addAssign(Yh({v1:m,v2:h})),c.assign(Ii(Xh({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Zh=1/6,Jh=e=>kn(Zh,kn(e,kn(e,e.negate().add(3)).sub(3)).add(1)),ep=e=>kn(Zh,kn(e,kn(e,kn(3,e).sub(6))).add(4)),tp=e=>kn(Zh,kn(e,kn(e,kn(-3,e).add(3)).add(3)).add(1)),rp=e=>kn(Zh,sa(e,3)),sp=e=>Jh(e).add(ep(e)),ip=e=>tp(e).add(rp(e)),np=e=>On(-1,ep(e).div(Jh(e).add(ep(e)))),op=e=>On(1,rp(e).div(tp(e).add(rp(e)))),ap=(e,t,r)=>{const s=e.uvNode,i=kn(s,t.zw).add(.5),n=So(i),o=Co(i),a=sp(o.x),u=ip(o.x),l=np(o.x),d=op(o.x),c=np(o.y),h=op(o.y),p=Bi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Bi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Bi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Bi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=sp(o.y).mul(On(a.mul(e.uv(p).level(r)),u.mul(e.uv(g).level(r)))),b=ip(o.y).mul(On(a.mul(e.uv(m).level(r)),u.mul(e.uv(f).level(r))));return y.add(b)},up=_i((([e,t=Ci(3)])=>{const r=Bi(e.size(Ei(t))),s=Bi(e.size(Ei(t.add(1)))),i=zn(1,r),n=zn(1,s),o=ap(e,Oi(i,r),So(t)),a=ap(e,Oi(n,s),Ao(t));return Co(t).mix(o,a)})),lp=_i((([e,t,r,s,i])=>{const n=Ii(pa(t.negate(),Ro(e),zn(1,s))),o=Ii(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return Ro(n).mul(r.mul(o))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),dp=_i((([e,t])=>e.mul(ca(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),cp=Uc(),hp=Uc(),pp=_i((([e,t,r],{material:s})=>{const i=(s.side==x?cp:hp).uv(e),n=_o(Tc.x).mul(dp(t,r));return up(i,n)})),gp=_i((([e,t,r])=>(Si(r.notEqual(0),(()=>{const s=To(t).negate().div(r);return bo(s.negate().mul(e))})),Ii(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),mp=_i((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Oi().toVar(),f=Ii().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Ii(d.sub(i),d,d.add(i));ic({start:0,end:3},(({i:i})=>{const d=n.element(i),g=lp(e,t,c,d,a),y=o.add(g),b=l.mul(u.mul(Oi(y,1))),x=Bi(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Bi(x.x,x.y.oneMinus()));const T=pp(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(gp(Lo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=lp(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(Oi(n,1))),y=Bi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Bi(y.x,y.y.oneMinus())),m=pp(y,r,d),f=s.mul(gp(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Ii($h({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Oi(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),fp=Wi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),yp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),bp=_i((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=da(e,t,ga(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Si(o.lessThan(0),(()=>Ii(1)));const a=o.sqrt(),u=yp(n,e),l=Ah({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Ci(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Ii(1).add(t).div(Ii(1).sub(t))})(i.clamp(0,.9999)),g=yp(p,n.toVec3()),m=Ah({f0:g,f90:1,dotVH:a}),f=Ii(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,a,2),b=Ii(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Ii(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return ic({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Ii(54856e-17,44201e-17,52481e-17),i=Ii(1681e3,1795300,2208400),n=Ii(43278e5,93046e5,66121e5),o=Ci(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=Ii(a.x.add(o),a.y,a.z).div(1.0685e-7),fp.mul(a)})(Ci(e).mul(y),Ci(e).mul(b)).mul(2);v.addAssign(N.mul(t))})),v.max(Ii(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),xp=_i((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Ta(r.lessThan(.25),Ci(-339.2).mul(i).add(Ci(161.4).mul(r)).sub(25.9),Ci(-8.48).mul(i).add(Ci(14.3).mul(r)).sub(9.95)),o=Ta(r.lessThan(.25),Ci(44).mul(i).sub(Ci(23.7).mul(r)).add(3.26),Ci(1.97).mul(i).sub(Ci(3.27).mul(r)).add(.72));return Ta(r.lessThan(.25),0,Ci(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Tp=Ii(.04),_p=Ci(1);class vp extends _h{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Ii().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Ii().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Ii().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Ii().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Ii().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=al.dot(Zu).clamp();this.iridescenceFresnel=bp({outsideIOR:Ci(1),eta2:mn,cosTheta1:e,thinFilmThickness:fn,baseF0:_n}),this.iridescenceF0=Wh({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Xu,r=Eu.sub(Xu).normalize(),s=ul;e.backdrop=mp(s,r,un,on,_n,vn,t,Du,Au,Nu,En,Mn,Un,Bn,this.dispersion?Fn:null),e.backdropAlpha=wn,on.a.mulAssign(da(1,e.backdrop.a,wn))}}computeMultiscattering(e,t,r){const s=al.dot(Zu).clamp(),i=zh({roughness:un,dotNV:s}),n=(this.iridescenceF0?gn.mix(_n,this.iridescenceF0):_n).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=_n.add(_n.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(qh({lightDirection:e}))),!0===this.clearcoat){const r=ll.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(kh({lightDirection:e,f0:Tp,f90:_p,roughness:cn,normalView:ll})))}r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),r.directSpecular.addAssign(s.mul(kh({lightDirection:e,f0:_n,f90:1,roughness:un,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=al,h=Zu,p=Qu.toVar(),g=Kh({N:c,V:h,roughness:un}),m=n.uv(g).toVar(),f=o.uv(g).toVar(),y=Wi(Ii(m.x,0,m.y),Ii(0,1,0),Ii(m.z,0,m.w)).toVar(),b=_n.mul(f.x).add(_n.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Qh({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(on).mul(Qh({N:c,V:h,P:p,mInv:Wi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Rh({diffuseColor:on})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(hn,xp({normal:al,viewDir:Zu,roughness:pn}))),!0===this.clearcoat){const e=ll.dot(Zu).clamp(),t=$h({dotNV:e,specularColor:Tp,specularF90:_p,roughness:cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=Ii().toVar("singleScattering"),i=Ii().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,vn);const o=s.add(i),a=on.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=al.dot(Zu).clamp().add(e),s=un.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ll.dot(Zu).clamp(),r=Ah({dotVH:e,f0:Tp,f90:_p}),s=t.mul(dn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(dn));t.assign(s)}if(!0===this.sheen){const e=hn.r.max(hn.g).max(hn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Np=Ci(1),Sp=Ci(-2),Ap=Ci(.8),Rp=Ci(-1),Cp=Ci(.4),Ep=Ci(2),wp=Ci(.305),Mp=Ci(3),Bp=Ci(.21),Up=Ci(4),Fp=Ci(4),Pp=Ci(16),Ip=_i((([e])=>{const t=Ii(Po(e)).toVar(),r=Ci(-1).toVar();return Si(t.x.greaterThan(t.z),(()=>{Si(t.x.greaterThan(t.y),(()=>{r.assign(Ta(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})).Else((()=>{Si(t.z.greaterThan(t.y),(()=>{r.assign(Ta(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Lp=_i((([e,t])=>{const r=Bi().toVar();return Si(t.equal(0),(()=>{r.assign(Bi(e.z,e.y).div(Po(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Bi(e.x.negate(),e.z.negate()).div(Po(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Bi(e.x.negate(),e.y).div(Po(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Bi(e.z.negate(),e.y).div(Po(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Bi(e.x.negate(),e.z).div(Po(e.y)))})).Else((()=>{r.assign(Bi(e.x,e.y).div(Po(e.z)))})),kn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Dp=_i((([e])=>{const t=Ci(0).toVar();return Si(e.greaterThanEqual(Ap),(()=>{t.assign(Np.sub(e).mul(Rp.sub(Sp)).div(Np.sub(Ap)).add(Sp))})).ElseIf(e.greaterThanEqual(Cp),(()=>{t.assign(Ap.sub(e).mul(Ep.sub(Rp)).div(Ap.sub(Cp)).add(Rp))})).ElseIf(e.greaterThanEqual(wp),(()=>{t.assign(Cp.sub(e).mul(Mp.sub(Ep)).div(Cp.sub(wp)).add(Ep))})).ElseIf(e.greaterThanEqual(Bp),(()=>{t.assign(wp.sub(e).mul(Up.sub(Mp)).div(wp.sub(Bp)).add(Mp))})).Else((()=>{t.assign(Ci(-2).mul(_o(kn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Vp=_i((([e,t])=>{const r=e.toVar();r.assign(kn(2,r).sub(1));const s=Ii(r,1).toVar();return Si(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Op=_i((([e,t,r,s,i,n])=>{const o=Ci(r),a=Ii(t),u=ca(Dp(o),Sp,n),l=Co(u),d=So(u),c=Ii(Gp(e,a,d,s,i,n)).toVar();return Si(l.notEqual(0),(()=>{const t=Ii(Gp(e,a,d.add(1),s,i,n)).toVar();c.assign(da(c,t,l))})),c})),Gp=_i((([e,t,r,s,i,n])=>{const o=Ci(r).toVar(),a=Ii(t),u=Ci(Ip(a)).toVar(),l=Ci(Xo(Fp.sub(o),0)).toVar();o.assign(Xo(o,Fp));const d=Ci(xo(o)).toVar(),c=Bi(Lp(a,u).mul(d.sub(2)).add(1)).toVar();return Si(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(kn(3,Pp))),c.y.addAssign(kn(4,xo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.uv(c).grad(Bi(),Bi())})),kp=_i((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=wo(s),l=r.mul(u).add(i.cross(r).mul(Eo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Gp(e,l,t,n,o,a)})),zp=_i((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Ii(Ta(t,r,ra(r,s))).toVar();Si(po(h.equals(Ii(0))),(()=>{h.assign(Ii(s.z,0,s.x.negate()))})),h.assign(Ro(h));const p=Ii().toVar();return p.addAssign(i.element(Ei(0)).mul(kp({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),ic({start:Ei(1),end:e},(({i:e})=>{Si(e.greaterThanEqual(n),(()=>{nc()}));const t=Ci(o.mul(Ci(e))).toVar();p.addAssign(i.element(e).mul(kp({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(kp({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),Oi(p,1)}));let $p=null;const Wp=new WeakMap;function Hp(e){let t=Wp.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=$p.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,Wp.set(e,t)}return t.texture}class jp extends Fs{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new ee;s.isRenderTargetTexture=!0,this._texture=xu(s),this._width=tn(0),this._height=tn(0),this._maxMip=tn(0),this.updateBeforeType=vs.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:Hp(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===$p&&($p=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===b&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=Ii(t.x.negate(),t.yz));let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Op(this._texture,t,s,this._width,this._height,this._maxMip)}}const qp=xi(jp),Kp=new WeakMap;class Xp extends cc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Kp.get(e);void 0===s&&(s=qp(e),Kp.set(e,s)),r=s}const s=t.envMap?Rl("envMapIntensity","float",e.material):Rl("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?Hl:al,n=r.context(Yp(un,i)).mul(s),o=r.context(Qp(ul)).mul(Math.PI).mul(s),a=eu(n),u=eu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(Yp(cn,ll)).mul(s),t=eu(e);l.addAssign(t)}}}const Yp=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Zu.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(Au)),r),getTextureLevel:()=>e}},Qp=e=>({getUV:()=>e,getTextureLevel:()=>Ci(1)}),Zp=new te;class Jp extends Yc{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Zp),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Xp(t):null}setupLightingModel(){return new vp}setupSpecular(){const e=da(Ii(.04),on.rgb,ln);_n.assign(e),vn.assign(1)}setupVariants(){const e=this.metalnessNode?Ci(this.metalnessNode):hd;ln.assign(e);let t=this.roughnessNode?Ci(this.roughnessNode):cd;t=Ih({roughness:t}),un.assign(t),this.setupSpecular(),on.assign(Oi(on.rgb.mul(e.oneMinus()),on.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const eg=new re;class tg extends Jp{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(eg),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Ci(this.iorNode):Rd;En.assign(e),_n.assign(da(Ko(ia(En.sub(1).div(En.add(1))).mul(ud),Ii(1)).mul(ad),on.rgb,ln)),vn.assign(da(ad,1,ln))}setupLightingModel(){return new vp(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Ci(this.clearcoatNode):gd,t=this.clearcoatRoughnessNode?Ci(this.clearcoatRoughnessNode):md;dn.assign(e),cn.assign(Ih({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Ii(this.sheenNode):bd,t=this.sheenRoughnessNode?Ci(this.sheenRoughnessNode):xd;hn.assign(e),pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Ci(this.iridescenceNode):_d,t=this.iridescenceIORNode?Ci(this.iridescenceIORNode):vd,r=this.iridescenceThicknessNode?Ci(this.iridescenceThicknessNode):Nd;gn.assign(e),mn.assign(t),fn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Bi(this.anisotropyNode):Td).toVar();bn.assign(e.length()),Si(bn.equal(0),(()=>{e.assign(Bi(1,0))})).Else((()=>{e.divAssign(Bi(bn)),bn.assign(bn.saturate())})),yn.assign(bn.pow2().mix(un.pow2(),1)),xn.assign($l[0].mul(e.x).add($l[1].mul(e.y))),Tn.assign($l[1].mul(e.x).sub($l[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Ci(this.transmissionNode):Sd,t=this.thicknessNode?Ci(this.thicknessNode):Ad,r=this.attenuationDistanceNode?Ci(this.attenuationDistanceNode):Cd,s=this.attenuationColorNode?Ii(this.attenuationColorNode):Ed;if(wn.assign(e),Mn.assign(t),Bn.assign(r),Un.assign(s),this.useDispersion){const e=this.dispersionNode?Ci(this.dispersionNode):Id;Fn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Ii(this.clearcoatNormalNode):fd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class rg extends vp{constructor(e,t,r,s){super(e,t,r),this.useSSS=s}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(al.mul(o)).normalize(),h=Ci(Zu.dot(c.negate()).saturate().pow(l).mul(d)),p=Ii(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class sg extends tg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Ci(.1),this.thicknessAmbientNode=Ci(0),this.thicknessAttenuationNode=Ci(.1),this.thicknessPowerNode=Ci(2),this.thicknessScaleNode=Ci(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new rg(this.useClearcoat,this.useSheen,this.useIridescence,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const ig=_i((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Bi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=wl("gradientMap","texture").context({getUV:()=>i});return Ii(e.r)}{const e=i.fwidth().mul(.5);return da(Ii(.7),Ii(1),ga(Ci(.7).sub(e.x),Ci(.7).add(e.x),i.x))}}));class ng extends _h{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=ig({normal:rl,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Rh({diffuseColor:on.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const og=new se;class ag extends Yc{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(og),this.setValues(e)}setupLightingModel(){return new ng}}class ug extends Fs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Ii(Zu.z,0,Zu.x.negate()).normalize(),t=Zu.cross(e);return Bi(e.dot(al),t.dot(al)).mul(.495).add(.5)}}const lg=Ti(ug),dg=new ie;class cg extends Yc{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(dg),this.setValues(e)}setupVariants(e){const t=lg;let r;r=e.material.matcap?wl("matcap","texture").context({getUV:()=>t}):Ii(da(.2,.8,t.y)),on.rgb.mulAssign(r.rgb)}}const hg=new P;class pg extends Yc{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.isPointsNodeMaterial=!0,this.lights=!1,this.transparent=!0,this.sizeNode=null,this.setDefaultValues(hg),this.setValues(e)}copy(e){return this.sizeNode=e.sizeNode,super.copy(e)}}class gg extends Fs{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return $i(e,s,s.negate(),e).mul(r)}{const e=t,s=Hi(Oi(1,0,0,0),Oi(0,wo(e.x),Eo(e.x).negate(),0),Oi(0,Eo(e.x),wo(e.x),0),Oi(0,0,0,1)),i=Hi(Oi(wo(e.y),0,Eo(e.y),0),Oi(0,1,0,0),Oi(Eo(e.y).negate(),0,wo(e.y),0),Oi(0,0,0,1)),n=Hi(Oi(wo(e.z),Eo(e.z).negate(),0,0),Oi(Eo(e.z),wo(e.z),0,0),Oi(0,0,1,0),Oi(0,0,0,1));return s.mul(i).mul(n).mul(Oi(r,1)).xyz}}}const mg=xi(gg),fg=new ne;class yg extends Yc{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this.lights=!1,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(fg),this.setValues(e)}setupPosition({object:e,camera:t,context:r}){const s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=qu;let u=$u.mul(Ii(i||0)),l=Bi(Du[0].xyz.length(),Du[1].xyz.length());if(null!==o&&(l=l.mul(o)),!s)if(t.isPerspectiveCamera)l=l.mul(u.z.negate());else{const e=Ci(2).div(Nu.element(1).element(1));l=l.mul(e.mul(2))}let d=a.xy;if(e.center&&!0===e.center.isVector2){const e=((e,t,r)=>fi(new Ga(e,t,r)))("center","vec2");d=d.sub(e.sub(.5))}d=d.mul(l);const c=Ci(n||yd),h=mg(d,c);u=Oi(u.xy.add(h),u.zw);const p=Nu.mul(u);return r.vertex=a,p}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}class bg extends _h{constructor(){super(),this.shadowNode=Ci(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){on.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(on.rgb)}}const xg=new oe;class Tg extends Yc{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(xg),this.setValues(e)}setupLightingModel(){return new bg}}const _g=_i((({texture:e,uv:t})=>{const r=1e-4,s=Ii().toVar();return Si(t.x.lessThan(r),(()=>{s.assign(Ii(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Ii(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Ii(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Ii(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Ii(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Ii(0,0,-1))})).Else((()=>{const r=.01,i=e.uv(t.add(Ii(-.01,0,0))).r.sub(e.uv(t.add(Ii(r,0,0))).r),n=e.uv(t.add(Ii(0,-.01,0))).r.sub(e.uv(t.add(Ii(0,r,0))).r),o=e.uv(t.add(Ii(0,0,-.01))).r.sub(e.uv(t.add(Ii(0,0,r))).r);s.assign(Ii(i,n,o))})),s.normalize()}));class vg extends bu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Ii(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){return t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return _g({texture:this,uv:e})}}const Ng=xi(vg);class Sg extends Yc{static get type(){return"VolumeNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.isVolumeNodeMaterial=!0,this.testNode=null,this.setValues(e)}setup(e){const t=Ng(this.map,null,0),r=_i((({orig:e,dir:t})=>{const r=Ii(-.5),s=Ii(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=Ko(n,o),u=Xo(n,o),l=Xo(a.x,Xo(a.y,a.z)),d=Ko(u.x,Ko(u.y,u.z));return Bi(l,d)}));this.fragmentNode=_i((()=>{const e=wa(Ii(zu.mul(Oi(Eu,1)))),s=wa(ju.sub(e)).normalize(),i=Bi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Bi(Xo(i.x,0),i.y));const n=Ii(e.add(i.x.mul(s))).toVar(),o=Ii(s.abs().reciprocal()).toVar(),a=Ci(Ko(o.x,Ko(o.y,o.z))).toVar("delta");a.divAssign(wl("steps","float"));const u=Oi(wl("base","color"),0).toVar();return ic({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=sn("float","d").assign(t.uv(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),nc()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),Oi(u)}))(),super.setup(e)}}class Ag{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}setAnimationLoop(e){this._animationLoop=e}setContext(e){this._context=e}dispose(){this.stop()}}class Rg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().monitor)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;a?p=o.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}return e.index&&(t+="index,"),t}getMaterialCacheKey(){const{object:e,material:t}=this;let r=t.customProgramCacheKey();for(const e of function(e){const t=Object.keys(e);let r=Object.getPrototypeOf(e);for(;r;){const e=Object.getOwnPropertyDescriptors(r);for(const r in e)if(void 0!==e[r]){const s=e[r];s&&"function"==typeof s.get&&t.push(r)}r=Object.getPrototypeOf(r)}return t}(t)){if(/^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test(e))continue;const s=t[e];let i;if(null!==s){const e=typeof s;"number"===e?i=0!==s?"1":"0":"object"===e?(i="{",s.isTexture&&(i+=s.mapping),i+="}"):i=String(s)}else i=String(s);r+=i+","}return r+=this.clippingContextCacheKey+",",e.geometry&&(r+=this.getGeometryCacheKey()),e.skeleton&&(r+=e.skeleton.bones.length+","),e.morphTargetInfluences&&(r+=e.morphTargetInfluences.length+","),e.isBatchedMesh&&(r+=e._matricesTexture.uuid+",",null!==e._colorsTexture&&(r+=e._colorsTexture.uuid+",")),e.count>1&&(r+=e.uuid+","),r+=e.receiveShadow+",",us(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=this._nodes.getCacheKey(this.scene,this.lightsNode);return this.object.receiveShadow&&(e+=1),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const wg=[];class Mg{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,o,a){const u=this.getChainMap(a);wg[0]=e,wg[1]=t,wg[2]=n,wg[3]=i;let l=u.get(wg);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set(wg,l)):(l.updateClipping(o),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,o,a)):l.version=t.version)),l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Rg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new Eg(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Bg{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Ug=1,Fg=2,Pg=3,Ig=4,Lg=16;class Dg extends Bg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ug?this.backend.createAttribute(e):t===Fg?this.backend.createIndexAttribute(e):t===Pg?this.backend.createStorageAttribute(e):t===Ig&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ae:ue)(t,1);return i.version=Vg(e),i}class Gg extends Bg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Pg):this.updateAttribute(e,Ug);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Fg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ig)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Og(t),e.set(t,r)):r.version!==Vg(t)&&(this.attributes.delete(r),r=Og(t),e.set(t,r)),s=r}return s}}class kg{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.compute={calls:0,frameCalls:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}updateTimestamp(e,t){0===this[e].timestampCalls&&(this[e].timestamp=0),this[e].timestamp+=t,this[e].timestampCalls++,this[e].timestampCalls>=this[e].previousFrameCalls&&(this[e].timestampCalls=0)}reset(){const e=this.render.frameCalls;this.render.previousFrameCalls=e;const t=this.compute.frameCalls;this.compute.previousFrameCalls=t,this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class zg{constructor(e){this.cacheKey=e,this.usedTimes=0}}class $g extends zg{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Wg extends zg{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Hg=0;class jg{constructor(e,t,r=null,s=null){this.id=Hg++,this.code=e,this.stage=t,this.transforms=r,this.attributes=s,this.usedTimes=0}}class qg extends Bg{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new jg(n.computeShader,"compute",n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState();let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new jg(n.vertexShader,"vertex"),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let a=this.programs.fragment.get(n.fragmentShader);void 0===a&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),a=new jg(n.fragmentShader,"fragment"),this.programs.fragment.set(n.fragmentShader,a),r.createProgram(a));const u=this._getRenderCacheKey(e,o,a);let l=this.caches.get(u);void 0===l?(i&&0===i.usedTimes&&this._releasePipeline(i),l=this._getRenderPipeline(e,o,a,u,t)):e.pipeline=l,l.usedTimes++,o.usedTimes++,a.usedTimes++,s.pipeline=l}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Wg(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new $g(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Kg extends Bg{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ig:Pg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function Xg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Yg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Qg(e){return(e.transmission>0||e.transmissionNode)&&e.side===le&&!1===e.forceSinglePass}class Zg{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Xg),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Yg),this.transparent.length>1&&this.transparent.sort(t||Yg)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new B,l.format=e.stencilBuffer?de:ce,l.type=e.stencilBuffer?he:f,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=im){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===j||t===q||t===T||t===_}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class om extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class am extends rn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class um extends Ms{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new mi(t);return this._currentCond=Ta(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new mi(t),s=Ta(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new mi(e),this}build(e,...t){const r=Ni();vi(this);for(const t of this.nodes)t.build(e,"void");return vi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const lm=xi(um);class dm extends Ms{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),fm=(e,t)=>sa(kn(4,e.mul(Gn(1,e))),t),ym=_i((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),bm=_i((([e])=>Ii(ym(e.z.add(ym(e.y.mul(1)))),ym(e.z.add(ym(e.x.mul(1)))),ym(e.y.add(ym(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),xm=_i((([e,t,r])=>{const s=Ii(e).toVar(),i=Ci(1.4).toVar(),n=Ci(0).toVar(),o=Ii(s).toVar();return ic({start:Ci(0),end:Ci(3),type:"float",condition:"<="},(()=>{const e=Ii(bm(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Ci(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Ci(ym(s.z.add(ym(s.x.add(ym(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"p",type:"vec3"},{name:"spd",type:"float"},{name:"time",type:"float"}]});class Tm extends Ms{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const _m=xi(Tm),vm=e=>(...t)=>_m(e,...t),Nm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.time)),Sm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.deltaTime)),Am=tn(0,"uint").setGroup(Zi).onRenderUpdate((e=>e.frameId)),Rm=_i((([e,t,r=Bi(.5)])=>mg(e.sub(r),t).add(r))),Cm=_i((([e,t,r=Bi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Em=_i((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Du.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Du;const i=Au.mul(s);return pi(t)&&(i[0][0]=Du[0].length(),i[0][1]=0,i[0][2]=0),pi(r)&&(i[1][0]=0,i[1][1]=Du[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,Nu.mul(i).mul(qu)})),wm=_i((([e=null])=>{const t=$c();return $c(Ic(e)).sub(t).lessThan(0).select(xc,e)}));class Mm extends Ms{static get type(){return"SpriteSheetUVNode"}constructor(e,t=pu(),r=Ci(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Bi(o,a);return t.add(l).mul(u)}}const Bm=xi(Mm);class Um extends Ms{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Ci(1),i=qu,n=sl){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot(Ii(1)));const a=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=xu(d,a).mul(o.x),g=xu(c,u).mul(o.y),m=xu(h,l).mul(o.z);return On(p,g,m)}}const Fm=xi(Um),Pm=new me,Im=new r,Lm=new r,Dm=new r,Vm=new n,Om=new r(0,0,-1),Gm=new s,km=new r,zm=new r,$m=new s,Wm=new t,Hm=new ge,jm=xc.flipX();Hm.depthTexture=new B(1,1);let qm=!1;class Km extends bu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Hm.texture,jm),this._reflectorBaseNode=e.reflector||new Xm(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=fi(new Km({defaultTexture:Hm.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class Xm extends Ms{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new fe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?vs.RENDER:vs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Wm),e.setSize(Math.round(Wm.width*r),Math.round(Wm.height*r))}setup(e){return this._updateResolution(Hm,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ge(0,0,{type:ye}),!0===this.generateMipmaps&&(t.texture.minFilter=be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new B),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&qm)return;qm=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(Wm),this._updateResolution(a,s),Lm.setFromMatrixPosition(n.matrixWorld),Dm.setFromMatrixPosition(r.matrixWorld),Vm.extractRotation(n.matrixWorld),Im.set(0,0,1),Im.applyMatrix4(Vm),km.subVectors(Lm,Dm),km.dot(Im)>0)return;km.reflect(Im).negate(),km.add(Lm),Vm.extractRotation(r.matrixWorld),Om.set(0,0,-1),Om.applyMatrix4(Vm),Om.add(Dm),zm.subVectors(Lm,Om),zm.reflect(Im).negate(),zm.add(Lm),o.coordinateSystem=r.coordinateSystem,o.position.copy(km),o.up.set(0,1,0),o.up.applyMatrix4(Vm),o.up.reflect(Im),o.lookAt(zm),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Pm.setFromNormalAndCoplanarPoint(Im,Lm),Pm.applyMatrix4(o.matrixWorldInverse),Gm.set(Pm.normal.x,Pm.normal.y,Pm.normal.z,Pm.constant);const u=o.projectionMatrix;$m.x=(Math.sign(Gm.x)+u.elements[8])/u.elements[0],$m.y=(Math.sign(Gm.y)+u.elements[9])/u.elements[5],$m.z=-1,$m.w=(1+u.elements[10])/u.elements[14],Gm.multiplyScalar(1/Gm.dot($m));u.elements[2]=Gm.x,u.elements[6]=Gm.y,u.elements[10]=s.coordinateSystem===v?Gm.z-0:Gm.z+1-0,u.elements[14]=Gm.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const l=s.getRenderTarget(),d=s.getMRT();s.setMRT(null),s.setRenderTarget(a),s.render(t,o),s.setMRT(d),s.setRenderTarget(l),i.visible=!0,qm=!1}}const Ym=new xe(-1,1,1,-1,0,1);class Qm extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new _e([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new _e(t,2))}}const Zm=new Qm;class Jm extends k{constructor(e=null){super(Zm,e),this.camera=Ym,this.isQuadMesh=!0}renderAsync(e){return e.renderAsync(this,Ym)}render(e){e.render(this,Ym)}}const ef=new t;class tf extends bu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ye}){const i=new ge(t,r,s);super(i.texture,pu()),this.node=e,this.width=t,this.height=r,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this.updateMap=new WeakMap,this._rttNode=null,this._quadMesh=new Jm(new Yc),this.updateBeforeType=vs.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(ef);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new bu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const rf=(e,...t)=>fi(new tf(fi(e),...t)),sf=_i((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===v?(e=Bi(e.x,e.y.oneMinus()).mul(2).sub(1),i=Oi(Ii(e,t),1)):i=Oi(Ii(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Oi(r.mul(i));return n.xyz.div(n.w)})),nf=_i((([e,t])=>{const r=t.mul(Oi(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Bi(s.x,s.y.oneMinus())})),of=_i((([e,t,r])=>{const s=mu(Tu(t)),i=Ui(e.mul(s)).toVar(),n=Tu(t,i).toVar(),o=Tu(t,i.sub(Ui(2,0))).toVar(),a=Tu(t,i.sub(Ui(1,0))).toVar(),u=Tu(t,i.add(Ui(1,0))).toVar(),l=Tu(t,i.add(Ui(2,0))).toVar(),d=Tu(t,i.add(Ui(0,2))).toVar(),c=Tu(t,i.add(Ui(0,1))).toVar(),h=Tu(t,i.sub(Ui(0,1))).toVar(),p=Tu(t,i.sub(Ui(0,2))).toVar(),g=Po(Gn(Ci(2).mul(a).sub(o),n)).toVar(),m=Po(Gn(Ci(2).mul(u).sub(l),n)).toVar(),f=Po(Gn(Ci(2).mul(c).sub(d),n)).toVar(),y=Po(Gn(Ci(2).mul(h).sub(p),n)).toVar(),b=sf(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(sf(e.sub(Bi(Ci(1).div(s.x),0)),a,r)),b.negate().add(sf(e.add(Bi(Ci(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(sf(e.add(Bi(0,Ci(1).div(s.y))),c,r)),b.negate().add(sf(e.sub(Bi(0,Ci(1).div(s.y))),h,r)));return Ro(ra(x,T))}));class af extends R{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageInstancedBufferAttribute=!0}}class uf extends ve{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageBufferAttribute=!0}}class lf extends Bs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const df=xi(lf);class cf extends xl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=gs(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Ss.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this.bufferCount=r,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return df(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=qa(this.value),this._varying=wa(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const hf=(e,t,r)=>fi(new cf(e,t,r));class pf extends cu{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class gf extends Ms{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const mf=Ti(gf),ff=new Se,yf=new n;class bf extends Ms{static get type(){return"SceneNode"}constructor(e=bf.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===bf.BACKGROUND_BLURRINESS?s=Rl("backgroundBlurriness","float",r):t===bf.BACKGROUND_INTENSITY?s=Rl("backgroundIntensity","float",r):t===bf.BACKGROUND_ROTATION?s=tn("mat4").label("backgroundRotation").setGroup(Zi).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Ne?(ff.copy(r.backgroundRotation),ff.x*=-1,ff.y*=-1,ff.z*=-1,yf.makeRotationFromEuler(ff)):yf.identity(),yf})):console.error("THREE.SceneNode: Unknown scope:",t),s}}bf.BACKGROUND_BLURRINESS="backgroundBlurriness",bf.BACKGROUND_INTENSITY="backgroundIntensity",bf.BACKGROUND_ROTATION="backgroundRotation";const xf=Ti(bf,bf.BACKGROUND_BLURRINESS),Tf=Ti(bf,bf.BACKGROUND_INTENSITY),_f=Ti(bf,bf.BACKGROUND_ROTATION);class vf extends bu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Ss.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Ss.READ_WRITE)}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}toWriteOnly(){return this.setAccess(Ss.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const Nf=xi(vf);class Sf extends Al{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const Af=new WeakMap;class Rf extends Fs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=vs.OBJECT,this.updateAfterType=vs.OBJECT,this.previousModelWorldMatrix=tn(new n),this.previousProjectionMatrix=tn(new n).setGroup(Zi),this.previousCameraViewMatrix=tn(new n)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ef(r);this.previousModelWorldMatrix.value.copy(s);const i=Cf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new n,i.previousCameraViewMatrix=new n,i.currentProjectionMatrix=new n,i.currentCameraViewMatrix=new n,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Ef(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?Nu:tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul($u).mul(qu),s=this.previousProjectionMatrix.mul(t).mul(Ku),i=r.xy.div(r.w),n=s.xy.div(s.w);return Gn(i,n)}}function Cf(e){let t=Af.get(e);return void 0===t&&(t={},Af.set(e,t)),t}function Ef(e,t=0){const r=Cf(e);let s=r[t];return void 0===s&&(r[t]=s=new n),s}const wf=Ti(Rf),Mf=_i((([e,t])=>Ko(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Bf=_i((([e,t])=>Ko(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Uf=_i((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ff=_i((([e,t])=>da(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Qo(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Pf=_i((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Oi(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),If=_i((([e])=>Of(e.rgb))),Lf=_i((([e,t=Ci(1)])=>t.mix(Of(e.rgb),e.rgb))),Df=_i((([e,t=Ci(1)])=>{const r=On(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return da(e.rgb,s,i)})),Vf=_i((([e,t=Ci(1)])=>{const r=Ii(.57735,.57735,.57735),s=t.cos();return Ii(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(ta(r,e.rgb).mul(s.oneMinus())))))})),Of=(e,t=Ii(u.getLuminanceCoefficients(new r)))=>ta(e,t),Gf=_i((([e,t=Ii(1),s=Ii(0),i=Ii(1),n=Ci(1),o=Ii(u.getLuminanceCoefficients(new r,Ae))])=>{const a=e.rgb.dot(Ii(o)),l=Xo(e.rgb.mul(t).add(s),0).toVar(),d=l.pow(i).toVar();return Si(l.r.greaterThan(0),(()=>{l.r.assign(d.r)})),Si(l.g.greaterThan(0),(()=>{l.g.assign(d.g)})),Si(l.b.greaterThan(0),(()=>{l.b.assign(d.b)})),l.assign(a.add(l.sub(a).mul(n))),Oi(l.rgb,e.a)}));class kf extends Fs{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const zf=xi(kf),$f=new t;class Wf extends bu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Hf extends Wf{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class jf extends Fs{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new B;i.isRenderTargetTexture=!0,i.name="depth";const n=new ge(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ye,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.updateBeforeType=vs.FRAME,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=tn(0),this._cameraFar=tn(0),this._mrt=null,this.isPassNode=!0}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.isRenderTargetTexture=!0,t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),t.isRenderTargetTexture=!0,this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=fi(new Hf(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=fi(new Hf(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Oc(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Dc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.renderTarget.depthTexture.isMultisampleRenderTargetTexture=this.renderTarget.samples>1,this.scope===jf.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize($f);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}jf.COLOR="color",jf.DEPTH="depth";class qf extends jf{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(jf.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Yc;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=x;const t=sl.negate(),r=Nu.mul($u),s=Ci(1),i=r.mul(Oi(qu,1)),n=r.mul(Oi(qu.add(t),1)),o=Ro(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Oi(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Kf=_i((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Xf=_i((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Yf=_i((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Qf=_i((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),Zf=_i((([e,t])=>{const r=Wi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Wi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Qf(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Jf=Wi(Ii(1.6605,-.1246,-.0182),Ii(-.5876,1.1329,-.1006),Ii(-.0728,-.0083,1.1187)),ey=Wi(Ii(.6274,.0691,.0164),Ii(.3293,.9195,.088),Ii(.0433,.0113,.8956)),ty=_i((([e])=>{const t=Ii(e).toVar(),r=Ii(t.mul(t)).toVar(),s=Ii(r.mul(r)).toVar();return Ci(15.5).mul(s.mul(r)).sub(kn(40.14,s.mul(t))).add(kn(31.96,s).sub(kn(6.868,r.mul(t))).add(kn(.4298,r).add(kn(.1191,t).sub(.00232))))})),ry=_i((([e,t])=>{const r=Ii(e).toVar(),s=Wi(Ii(.856627153315983,.137318972929847,.11189821299995),Ii(.0951212405381588,.761241990602591,.0767994186031903),Ii(.0482516061458583,.101439036467562,.811302368396859)),i=Wi(Ii(1.1271005818144368,-.1413297634984383,-.14132976349843826),Ii(-.11060664309660323,1.157823702216272,-.11060664309660294),Ii(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Ci(-12.47393),o=Ci(4.026069);return r.mulAssign(t),r.assign(ey.mul(r)),r.assign(s.mul(r)),r.assign(Xo(r,1e-10)),r.assign(_o(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(ca(r,0,1)),r.assign(ty(r)),r.assign(i.mul(r)),r.assign(sa(Xo(Ii(0),r),Ii(2.2))),r.assign(Jf.mul(r)),r.assign(ca(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),sy=_i((([e,t])=>{const r=Ci(.76),s=Ci(.15);e=e.mul(t);const i=Ko(e.r,Ko(e.g,e.b)),n=Ta(i.lessThan(.08),i.sub(kn(6.25,i.mul(i))),.04);e.subAssign(n);const o=Xo(e.r,Xo(e.g,e.b));Si(o.lessThan(r),(()=>e));const a=Gn(1,r),u=Gn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=Gn(1,zn(1,s.mul(o.sub(u)).add(1)));return da(e,Ii(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class iy extends Ms{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const ny=xi(iy);class oy extends iy{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const ay=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class uy extends Ms{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Ci()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=bs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const ly=xi(uy);class dy extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class cy{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const hy=new dy;class py extends Ms{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new dy,this._output=ly(),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=ly(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=ly(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new cy(this),t=hy.get("THREE"),r=hy.get("TSL"),s=this.getMethod(this.codeNode),i=[e,this._local,hy,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Ci()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return ls(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const gy=xi(py);class my extends Ms{static get type(){return"FogNode"}constructor(e,t){super("float"),this.isFogNode=!0,this.colorNode=e,this.factorNode=t}getViewZNode(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Qu.z).negate()}setup(){return this.factorNode}}const fy=xi(my);class yy extends my{static get type(){return"FogRangeNode"}constructor(e,t,r){super(e),this.isFogRangeNode=!0,this.nearNode=t,this.farNode=r}setup(e){const t=this.getViewZNode(e);return ga(this.nearNode,this.farNode,t)}}const by=xi(yy);class xy extends my{static get type(){return"FogExp2Node"}constructor(e,t){super(e),this.isFogExp2Node=!0,this.densityNode=t}setup(e){const t=this.getViewZNode(e),r=this.densityNode;return r.mul(r,t,t).negate().exp().oneMinus()}}const Ty=xi(xy);let _y=null,vy=null;class Ny extends Ms{static get type(){return"RangeNode"}constructor(e=Ci(),t=Ci()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(fs(this.minNode.value)),r=e.getTypeLength(fs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(fs(i)),u=e.getTypeLength(fs(n));_y=_y||new s,vy=vy||new s,_y.setScalar(0),vy.setScalar(0),1===o?_y.setScalar(i):i.isColor?_y.set(i.r,i.g,i.b):_y.set(i.x,i.y,i.z||0,i.w||0),1===u?vy.setScalar(n):n.isColor?vy.set(n.r,n.g,n.b):vy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;efi(new Ay(e,t)),Cy=Ry("numWorkgroups","uvec3"),Ey=Ry("workgroupId","uvec3"),wy=Ry("localId","uvec3"),My=Ry("subgroupSize","uint");const By=xi(class extends Ms{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Uy extends Bs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class Fy extends Ms{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.scope=e}label(e){return this.name=e,this}getHash(){return this.uuid}setScope(e){return this.scope=e,this}getInputType(){return`${this.scope}Array`}element(e){return fi(new Uy(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Py extends Fs{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Py.ATOMIC_LOAD="atomicLoad",Py.ATOMIC_STORE="atomicStore",Py.ATOMIC_ADD="atomicAdd",Py.ATOMIC_SUB="atomicSub",Py.ATOMIC_MAX="atomicMax",Py.ATOMIC_MIN="atomicMin",Py.ATOMIC_AND="atomicAnd",Py.ATOMIC_OR="atomicOr",Py.ATOMIC_XOR="atomicXor";const Iy=xi(Py),Ly=(e,t,r,s)=>{const i=Iy(e,t,r,s);return i.append(),i};let Dy;function Vy(e){Dy=Dy||new WeakMap;let t=Dy.get(e);return void 0===t&&Dy.set(e,t={}),t}function Oy(e){const t=Vy(e);return t.shadowMatrix||(t.shadowMatrix=tn("mat4").setGroup(Zi).onRenderUpdate((()=>(e.shadow.updateMatrices(e),e.shadow.matrix))))}function Gy(e){const t=Vy(e);if(void 0===t.projectionUV){const r=Oy(e).mul(Xu);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function ky(e){const t=Vy(e);return t.position||(t.position=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function zy(e){const t=Vy(e);return t.targetPosition||(t.targetPosition=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function $y(e){const t=Vy(e);return t.viewPosition||(t.viewPosition=tn(new r).setGroup(Zi).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Wy=e=>Au.transformDirection(ky(e).sub(zy(e))),Hy=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},jy=new WeakMap;class qy extends Ms{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Ii().toVar("totalDiffuse"),this.totalSpecularNode=Ii().toVar("totalSpecular"),this.outgoingLightNode=Ii().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}getHash(e){if(null===this._lightNodesHash){null===this._lightNodes&&this.setupLightsNode(e);const t=[];for(const e of this._lightNodes)t.push(e.getSelf().getHash());this._lightNodesHash="lights-"+t.join(",")}return this._lightNodesHash}analyze(e){const t=e.getDataFromNode(this);for(const r of t.nodes)r.build(e)}setupLightsNode(e){const t=[],r=this._lightNodes,s=(e=>e.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(fi(e));else{let s=null;if(null!==r&&(s=Hy(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;jy.has(e)?s=jy.get(e):(s=fi(new r(e)),jy.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=Ii(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}const Ky=new WeakMap,Xy=Ii().toVar("shadowWorldPosition"),Yy=_i((([e,t,r])=>{let s=Xu.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Qy=e=>{let t=Ky.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Rl("near","float",t).setGroup(Zi),s=Rl("far","float",t).setGroup(Zi),i=Uu(e);return Yy(i,r,s)})(e):null;t=new Yc,t.colorNode=Oi(0,0,0,1),t.depthNode=r,t.isShadowNodeMaterial=!0,t.blending=D,t.name="ShadowMaterial",Ky.set(e,t)}return t},Zy=_i((({depthTexture:e,shadowCoord:t})=>xu(e,t.xy).compare(t.z))),Jy=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Rl("radius","float",r).setGroup(Zi),o=Bi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return On(s(t.xy.add(Bi(a,u)),t.z),s(t.xy.add(Bi(0,u)),t.z),s(t.xy.add(Bi(l,u)),t.z),s(t.xy.add(Bi(c,h)),t.z),s(t.xy.add(Bi(0,h)),t.z),s(t.xy.add(Bi(p,h)),t.z),s(t.xy.add(Bi(a,0)),t.z),s(t.xy.add(Bi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Bi(p,0)),t.z),s(t.xy.add(Bi(l,0)),t.z),s(t.xy.add(Bi(c,g)),t.z),s(t.xy.add(Bi(0,g)),t.z),s(t.xy.add(Bi(p,g)),t.z),s(t.xy.add(Bi(a,d)),t.z),s(t.xy.add(Bi(0,d)),t.z),s(t.xy.add(Bi(l,d)),t.z)).mul(1/17)})),eb=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Bi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Co(u.mul(i).add(.5));return u.subAssign(l.mul(n)),On(s(u,t.z),s(u.add(Bi(o,0)),t.z),s(u.add(Bi(0,a)),t.z),s(u.add(n),t.z),da(s(u.add(Bi(o.negate(),0)),t.z),s(u.add(Bi(o.mul(2),0)),t.z),l.x),da(s(u.add(Bi(o.negate(),a)),t.z),s(u.add(Bi(o.mul(2),a)),t.z),l.x),da(s(u.add(Bi(0,a.negate())),t.z),s(u.add(Bi(0,a.mul(2))),t.z),l.y),da(s(u.add(Bi(o,a.negate())),t.z),s(u.add(Bi(o,a.mul(2))),t.z),l.y),da(da(s(u.add(Bi(o.negate(),a.negate())),t.z),s(u.add(Bi(o.mul(2),a.negate())),t.z),l.x),da(s(u.add(Bi(o.negate(),a.mul(2))),t.z),s(u.add(Bi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),tb=_i((({depthTexture:e,shadowCoord:t})=>{const r=Ci(1).toVar(),s=xu(e).uv(t.xy).rg,i=Qo(t.z,s.x);return Si(i.notEqual(Ci(1)),(()=>{const e=t.z.sub(s.x),n=Xo(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=ca(Gn(o,.3).div(.95-.3)),r.assign(ca(Xo(i,o)))})),r})),rb=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.uv(On(_c.xy,Bi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),sb=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.uv(On(_c.xy,Bi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(On(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),ib=[Zy,Jy,eb,tb],nb=new Jm;class ob extends Ms{static get type(){return"ShadowNode"}constructor(e,t=null){super(),this.light=e,this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this.updateBeforeType=vs.RENDER,this._node=null,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(o,Ci(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Rl("bias","float",r).setGroup(Zi);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===v&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=Rl("near","float",r.camera).setGroup(Zi),s=Rl("far","float",r.camera).setGroup(Zi);n=Gc(e.negate(),t,s)}return o=Ii(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return ib[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new B(s.mapSize.width,s.mapSize.height);n.compareFunction=Re;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===Ce){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye});const t=xu(n),r=xu(this.vsmShadowMapVertical.texture),i=Rl("blurSamples","float",s).setGroup(Zi),o=Rl("radius","float",s).setGroup(Zi),a=Rl("mapSize","vec2",s).setGroup(Zi);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Yc);u.fragmentNode=rb({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Yc),u.fragmentNode=sb({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=Rl("intensity","float",s).setGroup(Zi),u=Rl("normalBias","float",s).setGroup(Zi),l=Oy(r).mul(Xy.add(ul.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ce?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=xu(o.texture,d),m=da(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return _i((({material:t})=>{Xy.assign(t.shadowPositionNode||Xu);let r=this._node;return null===r&&(this._node=r=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r}))()}renderShadow(e){const{shadow:t,shadowMap:r}=this,{renderer:s,scene:i}=e;r.setSize(t.mapSize.width,t.mapSize.height),s.render(i,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=n.overrideMaterial;n.overrideMaterial=Qy(r),s.camera.layers.mask=o.layers.mask;const d=i.getRenderTarget(),c=i.getRenderObjectFunction(),h=i.getMRT();i.setMRT(null),i.setRenderObjectFunction(((e,...t)=>{(!0===e.castShadow||e.receiveShadow&&a===Ce)&&i.renderObject(e,...t)})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(c),!0!==r.isPointLight&&a===Ce&&this.vsmPass(i),i.setRenderTarget(d),i.setMRT(h),n.overrideMaterial=l}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),nb.material=this.vsmMaterialVertical,nb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),nb.material=this.vsmMaterialHorizontal,nb.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),this.updateBeforeType=vs.NONE}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const ab=(e,t)=>fi(new ob(e,t));class ub extends cc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||tn(this.color).setGroup(Zi),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=vs.FRAME}getCacheKey(){return ds(super.getCacheKey(),this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return ab(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?fi(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const lb=_i((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),db=new e,cb=_i((([e,t])=>{const r=e.toVar(),s=Po(r),i=zn(1,Xo(s.x,Xo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Bi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Si(s.z.greaterThanEqual(o),(()=>{Si(r.z.greaterThan(0),(()=>{n.x.assign(Gn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=Io(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=Io(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Bi(.125,.25).mul(n).add(Bi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),hb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>xu(e,cb(t,s.y)).compare(r))),pb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Rl("radius","float",i).setGroup(Zi),o=Bi(-1,1).mul(n).mul(s.y);return xu(e,cb(t.add(o.xyy),s.y)).compare(r).add(xu(e,cb(t.add(o.yyy),s.y)).compare(r)).add(xu(e,cb(t.add(o.xyx),s.y)).compare(r)).add(xu(e,cb(t.add(o.yyx),s.y)).compare(r)).add(xu(e,cb(t,s.y)).compare(r)).add(xu(e,cb(t.add(o.xxy),s.y)).compare(r)).add(xu(e,cb(t.add(o.yxy),s.y)).compare(r)).add(xu(e,cb(t.add(o.xxx),s.y)).compare(r)).add(xu(e,cb(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),gb=_i((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.near)),a=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.far)),u=Rl("bias","float",s).setGroup(Zi),l=tn(s.mapSize).setGroup(Zi),d=Ci(1).toVar();return Si(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Bi(1).div(l.mul(Bi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),mb=new s,fb=new t,yb=new t;class bb extends ob{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===we?hb:pb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return gb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();yb.copy(t.mapSize),yb.multiply(o),r.setSize(yb.width,yb.height),fb.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(db),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(Qu),a=o.normalize(),u=o.length(),l=lb({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class Tb extends ub{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>fi(new bb(e,t)))(this.light)}setup(e){super.setup(e),xb({color:this.colorNode,lightViewPosition:$y(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const _b=_i((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),vb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Mi(e).toVar();return Ta(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Nb=_i((([e,t])=>{const r=Mi(t).toVar(),s=Ci(e).toVar();return Ta(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Sb=_i((([e])=>{const t=Ci(e).toVar();return Ei(So(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),Ab=_i((([e,t])=>{const r=Ci(e).toVar();return t.assign(Sb(r)),r.sub(Ci(t))})),Rb=vm([_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ci(s).toVar(),l=Ci(r).toVar(),d=Ci(t).toVar(),c=Ci(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ii(s).toVar(),l=Ii(r).toVar(),d=Ii(t).toVar(),c=Ii(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),Cb=vm([_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ci(a).toVar(),m=Ci(o).toVar(),f=Ci(n).toVar(),y=Ci(i).toVar(),b=Ci(s).toVar(),x=Ci(r).toVar(),T=Ci(t).toVar(),_=Ci(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ii(a).toVar(),m=Ii(o).toVar(),f=Ii(n).toVar(),y=Ii(i).toVar(),b=Ii(s).toVar(),x=Ii(r).toVar(),T=Ii(t).toVar(),_=Ii(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Eb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=wi(e).toVar(),o=wi(n.bitAnd(wi(7))).toVar(),a=Ci(vb(o.lessThan(wi(4)),i,s)).toVar(),u=Ci(kn(2,vb(o.lessThan(wi(4)),s,i))).toVar();return Nb(a,Mi(o.bitAnd(wi(1)))).add(Nb(u,Mi(o.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),wb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=wi(e).toVar(),u=wi(a.bitAnd(wi(15))).toVar(),l=Ci(vb(u.lessThan(wi(8)),o,n)).toVar(),d=Ci(vb(u.lessThan(wi(4)),n,vb(u.equal(wi(12)).or(u.equal(wi(14))),o,i))).toVar();return Nb(l,Mi(u.bitAnd(wi(1)))).add(Nb(d,Mi(u.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Mb=vm([Eb,wb]),Bb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Di(e).toVar();return Ii(Mb(n.x,i,s),Mb(n.y,i,s),Mb(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Ub=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=Di(e).toVar();return Ii(Mb(a.x,o,n,i),Mb(a.y,o,n,i),Mb(a.z,o,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Fb=vm([Bb,Ub]),Pb=_i((([e])=>{const t=Ci(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Ib=_i((([e])=>{const t=Ci(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Lb=vm([Pb,_i((([e])=>{const t=Ii(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Db=vm([Ib,_i((([e])=>{const t=Ii(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Vb=_i((([e,t])=>{const r=Ei(t).toVar(),s=wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Ei(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),Ob=_i((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Vb(r,Ei(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Vb(e,Ei(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Vb(t,Ei(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Vb(r,Ei(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Vb(e,Ei(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Vb(t,Ei(4))),t.addAssign(e)})),Gb=_i((([e,t,r])=>{const s=wi(r).toVar(),i=wi(t).toVar(),n=wi(e).toVar();return s.bitXorAssign(i),s.subAssign(Vb(i,Ei(14))),n.bitXorAssign(s),n.subAssign(Vb(s,Ei(11))),i.bitXorAssign(n),i.subAssign(Vb(n,Ei(25))),s.bitXorAssign(i),s.subAssign(Vb(i,Ei(16))),n.bitXorAssign(s),n.subAssign(Vb(s,Ei(4))),i.bitXorAssign(n),i.subAssign(Vb(n,Ei(14))),s.bitXorAssign(i),s.subAssign(Vb(i,Ei(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),kb=_i((([e])=>{const t=wi(e).toVar();return Ci(t).div(Ci(wi(Ei(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),zb=_i((([e])=>{const t=Ci(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),$b=vm([_i((([e])=>{const t=Ei(e).toVar(),r=wi(wi(1)).toVar(),s=wi(wi(Ei(3735928559)).add(r.shiftLeft(wi(2))).add(wi(13))).toVar();return Gb(s.add(wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi(wi(2)).toVar(),n=wi().toVar(),o=wi().toVar(),a=wi().toVar();return n.assign(o.assign(a.assign(wi(Ei(3735928559)).add(i.shiftLeft(wi(2))).add(wi(13))))),n.addAssign(wi(s)),o.addAssign(wi(r)),Gb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi(wi(3)).toVar(),a=wi().toVar(),u=wi().toVar(),l=wi().toVar();return a.assign(u.assign(l.assign(wi(Ei(3735928559)).add(o.shiftLeft(wi(2))).add(wi(13))))),a.addAssign(wi(n)),u.addAssign(wi(i)),l.addAssign(wi(s)),Gb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),_i((([e,t,r,s])=>{const i=Ei(s).toVar(),n=Ei(r).toVar(),o=Ei(t).toVar(),a=Ei(e).toVar(),u=wi(wi(4)).toVar(),l=wi().toVar(),d=wi().toVar(),c=wi().toVar();return l.assign(d.assign(c.assign(wi(Ei(3735928559)).add(u.shiftLeft(wi(2))).add(wi(13))))),l.addAssign(wi(a)),d.addAssign(wi(o)),c.addAssign(wi(n)),Ob(l,d,c),l.addAssign(wi(i)),Gb(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),_i((([e,t,r,s,i])=>{const n=Ei(i).toVar(),o=Ei(s).toVar(),a=Ei(r).toVar(),u=Ei(t).toVar(),l=Ei(e).toVar(),d=wi(wi(5)).toVar(),c=wi().toVar(),h=wi().toVar(),p=wi().toVar();return c.assign(h.assign(p.assign(wi(Ei(3735928559)).add(d.shiftLeft(wi(2))).add(wi(13))))),c.addAssign(wi(l)),h.addAssign(wi(u)),p.addAssign(wi(a)),Ob(c,h,p),c.addAssign(wi(o)),h.addAssign(wi(n)),Gb(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Wb=vm([_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi($b(s,r)).toVar(),n=Di().toVar();return n.x.assign(i.bitAnd(Ei(255))),n.y.assign(i.shiftRight(Ei(8)).bitAnd(Ei(255))),n.z.assign(i.shiftRight(Ei(16)).bitAnd(Ei(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi($b(n,i,s)).toVar(),a=Di().toVar();return a.x.assign(o.bitAnd(Ei(255))),a.y.assign(o.shiftRight(Ei(8)).bitAnd(Ei(255))),a.z.assign(o.shiftRight(Ei(16)).bitAnd(Ei(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Hb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Ab(t.x,r)).toVar(),n=Ci(Ab(t.y,s)).toVar(),o=Ci(zb(i)).toVar(),a=Ci(zb(n)).toVar(),u=Ci(Rb(Mb($b(r,s),i,n),Mb($b(r.add(Ei(1)),s),i.sub(1),n),Mb($b(r,s.add(Ei(1))),i,n.sub(1)),Mb($b(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Lb(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Ab(t.x,r)).toVar(),o=Ci(Ab(t.y,s)).toVar(),a=Ci(Ab(t.z,i)).toVar(),u=Ci(zb(n)).toVar(),l=Ci(zb(o)).toVar(),d=Ci(zb(a)).toVar(),c=Ci(Cb(Mb($b(r,s,i),n,o,a),Mb($b(r.add(Ei(1)),s,i),n.sub(1),o,a),Mb($b(r,s.add(Ei(1)),i),n,o.sub(1),a),Mb($b(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Mb($b(r,s,i.add(Ei(1))),n,o,a.sub(1)),Mb($b(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Mb($b(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Mb($b(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Db(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),jb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Ab(t.x,r)).toVar(),n=Ci(Ab(t.y,s)).toVar(),o=Ci(zb(i)).toVar(),a=Ci(zb(n)).toVar(),u=Ii(Rb(Fb(Wb(r,s),i,n),Fb(Wb(r.add(Ei(1)),s),i.sub(1),n),Fb(Wb(r,s.add(Ei(1))),i,n.sub(1)),Fb(Wb(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Lb(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Ab(t.x,r)).toVar(),o=Ci(Ab(t.y,s)).toVar(),a=Ci(Ab(t.z,i)).toVar(),u=Ci(zb(n)).toVar(),l=Ci(zb(o)).toVar(),d=Ci(zb(a)).toVar(),c=Ii(Cb(Fb(Wb(r,s,i),n,o,a),Fb(Wb(r.add(Ei(1)),s,i),n.sub(1),o,a),Fb(Wb(r,s.add(Ei(1)),i),n,o.sub(1),a),Fb(Wb(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Fb(Wb(r,s,i.add(Ei(1))),n,o,a.sub(1)),Fb(Wb(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Fb(Wb(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Fb(Wb(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Db(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),qb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Sb(t)).toVar();return kb($b(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar();return kb($b(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar();return kb($b(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar(),n=Ei(Sb(t.w)).toVar();return kb($b(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Kb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Sb(t)).toVar();return Ii(kb($b(r,Ei(0))),kb($b(r,Ei(1))),kb($b(r,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar();return Ii(kb($b(r,s,Ei(0))),kb($b(r,s,Ei(1))),kb($b(r,s,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar();return Ii(kb($b(r,s,i,Ei(0))),kb($b(r,s,i,Ei(1))),kb($b(r,s,i,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Sb(t.x)).toVar(),s=Ei(Sb(t.y)).toVar(),i=Ei(Sb(t.z)).toVar(),n=Ei(Sb(t.w)).toVar();return Ii(kb($b(r,s,i,n,Ei(0))),kb($b(r,s,i,n,Ei(1))),kb($b(r,s,i,n,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Xb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ci(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(Hb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Yb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(jb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Qb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar();return Bi(Xb(a,o,n,i),Xb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Zb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(Yb(a,o,n,i)).toVar(),l=Ci(Xb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i)).toVar();return Oi(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Jb=vm([_i((([e,t,r,s,i,n,o])=>{const a=Ei(o).toVar(),u=Ci(n).toVar(),l=Ei(i).toVar(),d=Ei(s).toVar(),c=Ei(r).toVar(),h=Ei(t).toVar(),p=Bi(e).toVar(),g=Ii(Kb(Bi(h.add(d),c.add(l)))).toVar(),m=Bi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Bi(Bi(Ci(h),Ci(c)).add(m)).toVar(),y=Bi(f.sub(p)).toVar();return Si(a.equal(Ei(2)),(()=>Po(y.x).add(Po(y.y)))),Si(a.equal(Ei(3)),(()=>Xo(Po(y.x),Po(y.y)))),ta(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),_i((([e,t,r,s,i,n,o,a,u])=>{const l=Ei(u).toVar(),d=Ci(a).toVar(),c=Ei(o).toVar(),h=Ei(n).toVar(),p=Ei(i).toVar(),g=Ei(s).toVar(),m=Ei(r).toVar(),f=Ei(t).toVar(),y=Ii(e).toVar(),b=Ii(Kb(Ii(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Ii(Ii(Ci(f),Ci(m),Ci(g)).add(b)).toVar(),T=Ii(x.sub(y)).toVar();return Si(l.equal(Ei(2)),(()=>Po(T.x).add(Po(T.y)).add(Po(T.z)))),Si(l.equal(Ei(3)),(()=>Xo(Xo(Po(T.x),Po(T.y)),Po(T.z)))),ta(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ex=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Ab(n.x,o),Ab(n.y,a)).toVar(),l=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(Jb(u,e,t,o,a,i,s)).toVar();l.assign(Ko(l,r))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),tx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Ab(n.x,o),Ab(n.y,a)).toVar(),l=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(Jb(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),rx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Ab(n.x,o),Ab(n.y,a)).toVar(),l=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(Jb(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),sx=vm([ex,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Ab(n.x,o),Ab(n.y,a),Ab(n.z,u)).toVar(),d=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(Jb(l,e,t,r,o,a,u,i,s)).toVar();d.assign(Ko(d,n))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ix=vm([tx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Ab(n.x,o),Ab(n.y,a),Ab(n.z,u)).toVar(),d=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(Jb(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),nx=vm([rx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Ab(n.x,o),Ab(n.y,a),Ab(n.z,u)).toVar(),d=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(Jb(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ox=_i((([e])=>{const t=e.y,r=e.z,s=Ii().toVar();return Si(t.lessThan(1e-4),(()=>{s.assign(Ii(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(So(i)).mul(6).toVar();const n=Ei($o(i)),o=i.sub(Ci(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Si(n.equal(Ei(0)),(()=>{s.assign(Ii(r,l,a))})).ElseIf(n.equal(Ei(1)),(()=>{s.assign(Ii(u,r,a))})).ElseIf(n.equal(Ei(2)),(()=>{s.assign(Ii(a,r,l))})).ElseIf(n.equal(Ei(3)),(()=>{s.assign(Ii(a,u,r))})).ElseIf(n.equal(Ei(4)),(()=>{s.assign(Ii(l,a,r))})).Else((()=>{s.assign(Ii(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),ax=_i((([e])=>{const t=Ii(e).toVar(),r=Ci(t.x).toVar(),s=Ci(t.y).toVar(),i=Ci(t.z).toVar(),n=Ci(Ko(r,Ko(s,i))).toVar(),o=Ci(Xo(r,Xo(s,i))).toVar(),a=Ci(o.sub(n)).toVar(),u=Ci().toVar(),l=Ci().toVar(),d=Ci().toVar();return d.assign(o),Si(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Si(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Si(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(On(2,i.sub(r).div(a)))})).Else((()=>{u.assign(On(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Si(u.lessThan(0),(()=>{u.addAssign(1)}))})),Ii(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),ux=_i((([e])=>{const t=Ii(e).toVar(),r=Vi(qn(t,Ii(.04045))).toVar(),s=Ii(t.div(12.92)).toVar(),i=Ii(sa(Xo(t.add(Ii(.055)),Ii(0)).div(1.055),Ii(2.4))).toVar();return da(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),lx=(e,t)=>{e=Ci(e),t=Ci(t);const r=Bi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ga(e.sub(r),e.add(r),t)},dx=(e,t,r,s)=>da(e,t,r[s].clamp()),cx=(e,t,r,s,i)=>da(e,t,lx(r,s[i])),hx=_i((([e,t,r])=>{const s=Ro(e).toVar("nDir"),i=Gn(Ci(.5).mul(t.sub(r)),Xu).div(s).toVar("rbmax"),n=Gn(Ci(-.5).mul(t.sub(r)),Xu).div(s).toVar("rbmin"),o=Ii().toVar("rbminmax");o.x=s.x.greaterThan(Ci(0)).select(i.x,n.x),o.y=s.y.greaterThan(Ci(0)).select(i.y,n.y),o.z=s.z.greaterThan(Ci(0)).select(i.z,n.z);const a=Ko(Ko(o.x,o.y),o.z).toVar("correction");return Xu.add(s.mul(a)).toVar("boxIntersection").sub(r)})),px=_i((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(kn(r,r).sub(kn(s,s)))),n}));var gx=Object.freeze({__proto__:null,BRDF_GGX:kh,BRDF_Lambert:Rh,BasicShadowFilter:Zy,Break:nc,Continue:()=>au("continue").append(),DFGApprox:zh,D_GGX:Vh,Discard:uu,EPSILON:uo,F_Schlick:Ah,Fn:_i,INFINITY:lo,If:Si,Loop:ic,NodeAccess:Ss,NodeShaderStage:_s,NodeType:Ns,NodeUpdateType:vs,PCFShadowFilter:Jy,PCFSoftShadowFilter:eb,PI:co,PI2:ho,Return:()=>au("return").append(),Schlick_to_F0:Wh,ScriptableNodeResources:hy,ShaderNode:mi,TBNViewMatrix:$l,VSMShadowFilter:tb,V_GGX_SmithCorrelated:Lh,abs:Po,acesFilmicToneMapping:Zf,acos:Uo,add:On,addMethodChaining:$s,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:ry,all:po,alphaT:yn,and:Yn,anisotropy:bn,anisotropyB:Tn,anisotropyT:xn,any:go,append:Ai,arrayBuffer:e=>fi(new Gs(e,"ArrayBuffer")),asin:Bo,assign:In,atan:Fo,atan2:qo,atomicAdd:(e,t,r=null)=>Ly(Py.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Ly(Py.ATOMIC_AND,e,t,r),atomicFunc:Ly,atomicMax:(e,t,r=null)=>Ly(Py.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Ly(Py.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Ly(Py.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Ly(Py.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Ly(Py.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Ly(Py.ATOMIC_XOR,e,t,r),attenuationColor:Un,attenuationDistance:Bn,attribute:hu,attributeArray:(e,t="float")=>{const r=ms(t),s=new uf(e,r);return hf(s,t,e)},backgroundBlurriness:xf,backgroundIntensity:Tf,backgroundRotation:_f,batch:Jd,billboarding:Em,bitAnd:eo,bitNot:to,bitOr:ro,bitXor:so,bitangentGeometry:Dl,bitangentLocal:Vl,bitangentView:Ol,bitangentWorld:Gl,bitcast:Ho,blendBurn:Mf,blendColor:Pf,blendDodge:Bf,blendOverlay:Ff,blendScreen:Uf,blur:zp,bool:Mi,buffer:Tl,bufferAttribute:qa,bumpMap:Zl,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Mf(e)),bvec2:Pi,bvec3:Vi,bvec4:zi,bypass:ru,cache:eu,call:Dn,cameraFar:vu,cameraNear:_u,cameraNormalMatrix:Cu,cameraPosition:Eu,cameraProjectionMatrix:Nu,cameraProjectionMatrixInverse:Su,cameraViewMatrix:Au,cameraWorldMatrix:Ru,cbrt:ua,cdl:Gf,ceil:Ao,checker:_b,cineonToneMapping:Yf,clamp:ca,clearcoat:dn,clearcoatRoughness:cn,code:ny,color:Ri,colorSpaceToWorking:Va,colorToDirection:e=>fi(e).mul(2).sub(1),compute:Za,cond:_a,context:Na,convert:qi,convertColorSpace:(e,t,r)=>fi(new Pa(fi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():rf(e,...t),cos:wo,cross:ra,cubeTexture:bl,dFdx:Oo,dFdy:Go,dashSize:An,defaultBuildStages:Rs,defaultShaderStages:As,defined:pi,degrees:yo,deltaTime:Sm,densityFog:Ty,depth:zc,depthPass:(e,t)=>fi(new jf(jf.DEPTH,e,t)),difference:ea,diffuseColor:on,directPointLight:xb,directionToColor:uh,dispersion:Fn,distance:Jo,div:zn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Bf(e)),dot:ta,drawIndex:qd,dynamicBufferAttribute:Ka,element:ji,emissive:an,equal:Wn,equals:mo,equirectUV:hh,exp:bo,exp2:xo,expression:au,faceDirection:tl,faceForward:ma,float:Ci,floor:So,fog:fy,fract:Co,frameGroup:Qi,frameId:Am,frontFacing:el,fwidth:Wo,gain:(e,t)=>e.lessThan(.5)?fm(e.mul(2),t).div(2):Gn(1,fm(kn(Gn(1,e),2),t).div(2)),gapSize:Rn,getConstNodeType:gi,getCurrentStack:Ni,getDirection:Vp,getDistanceAttenuation:lb,getGeometryRoughness:Ph,getNormalFromDepth:of,getParallaxCorrectNormal:hx,getRoughness:Ih,getScreenPosition:nf,getShIrradianceAt:px,getTextureIndex:hm,getViewPosition:sf,glsl:(e,t)=>ny(e,t,"glsl"),glslFn:(e,t)=>ay(e,t,"glsl"),grayscale:If,greaterThan:qn,greaterThanEqual:Xn,hash:mm,highPrecisionModelNormalViewMatrix:Hu,highPrecisionModelViewMatrix:Wu,hue:Vf,instance:Xd,instanceIndex:$d,instancedArray:(e,t="float")=>{const r=ms(t),s=new af(e,r);return hf(s,t,e)},instancedBufferAttribute:Xa,instancedDynamicBufferAttribute:Ya,instancedMesh:Qd,int:Ei,inverseSqrt:No,invocationLocalIndex:jd,invocationSubgroupIndex:Hd,ior:En,iridescence:gn,iridescenceIOR:mn,iridescenceThickness:fn,ivec2:Ui,ivec3:Li,ivec4:Gi,js:(e,t)=>ny(e,t,"js"),label:Sa,length:Lo,lengthSq:la,lessThan:jn,lessThanEqual:Kn,lightPosition:ky,lightProjectionUV:Gy,lightShadowMatrix:Oy,lightTargetDirection:Wy,lightTargetPosition:zy,lightViewPosition:$y,lightingContext:gc,lights:(e=[])=>fi(new qy).setLights(e),linearDepth:$c,linearToneMapping:Kf,localId:wy,log:To,log2:_o,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(To(r.div(t)));return Ci(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),ic(...e)),luminance:Of,mat2:$i,mat3:Wi,mat4:Hi,matcapUV:lg,materialAOMap:Dd,materialAlphaTest:td,materialAnisotropy:Td,materialAnisotropyVector:Vd,materialAttenuationColor:Ed,materialAttenuationDistance:Cd,materialClearcoat:gd,materialClearcoatNormal:fd,materialClearcoatRoughness:md,materialColor:rd,materialDispersion:Id,materialEmissive:id,materialIOR:Rd,materialIridescence:_d,materialIridescenceIOR:vd,materialIridescenceThickness:Nd,materialLightMap:Ld,materialLineDashOffset:Fd,materialLineDashSize:Md,materialLineGapSize:Bd,materialLineScale:wd,materialLineWidth:Ud,materialMetalness:hd,materialNormal:pd,materialOpacity:nd,materialPointWidth:Pd,materialReference:wl,materialReflectivity:dd,materialRefractionRatio:hl,materialRotation:yd,materialRoughness:cd,materialSheen:bd,materialSheenRoughness:xd,materialShininess:sd,materialSpecular:od,materialSpecularColor:ud,materialSpecularIntensity:ad,materialSpecularStrength:ld,materialThickness:Ad,materialTransmission:Sd,max:Xo,maxMipLevel:yu,metalness:ln,min:Ko,mix:da,mixElement:ya,mod:Yo,modInt:$n,modelDirection:Lu,modelNormalMatrix:ku,modelPosition:Vu,modelScale:Ou,modelViewMatrix:$u,modelViewPosition:Gu,modelViewProjection:Gd,modelWorldMatrix:Du,modelWorldMatrixInverse:zu,morphReference:dc,mrt:gm,mul:kn,mx_aastep:lx,mx_cell_noise_float:(e=pu())=>qb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Ci(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=pu(),t=3,r=2,s=.5,i=1)=>Xb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec2:(e=pu(),t=3,r=2,s=.5,i=1)=>Qb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec3:(e=pu(),t=3,r=2,s=.5,i=1)=>Yb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec4:(e=pu(),t=3,r=2,s=.5,i=1)=>Zb(e,Ei(t),r,s).mul(i),mx_hsvtorgb:ox,mx_noise_float:(e=pu(),t=1,r=0)=>Hb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=pu(),t=1,r=0)=>jb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=pu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Oi(jb(e),Hb(e.add(Bi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=pu())=>dx(e,t,r,"x"),mx_ramptb:(e,t,r=pu())=>dx(e,t,r,"y"),mx_rgbtohsv:ax,mx_safepower:(e,t=1)=>(e=Ci(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=pu())=>cx(e,t,r,s,"x"),mx_splittb:(e,t,r,s=pu())=>cx(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:ux,mx_transform_uv:(e=1,t=0,r=pu())=>r.mul(e).add(t),mx_worley_noise_float:(e=pu(),t=1)=>sx(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec2:(e=pu(),t=1)=>ix(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec3:(e=pu(),t=1)=>nx(e.convert("vec2|vec3"),t,Ei(1)),negate:Do,neutralToneMapping:sy,nodeArray:bi,nodeImmutable:Ti,nodeObject:fi,nodeObjects:yi,nodeProxy:xi,normalFlat:il,normalGeometry:rl,normalLocal:sl,normalMap:Kl,normalView:nl,normalWorld:ol,normalize:Ro,not:Zn,notEqual:Hn,numWorkgroups:Cy,objectDirection:Mu,objectGroup:Ji,objectPosition:Uu,objectScale:Fu,objectViewPosition:Pu,objectWorldMatrix:Bu,oneMinus:Vo,or:Qn,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Nm)=>e.fract(),oscSine:(e=Nm)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Nm)=>e.fract().round(),oscTriangle:(e=Nm)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Sn,outputStruct:cm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Ff(e)),overloadingFn:vm,parabola:fm,parallaxDirection:Wl,parallaxUV:(e,t)=>e.sub(Wl.mul(t)),parameter:(e,t)=>fi(new am(e,t)),pass:(e,t,r)=>fi(new jf(jf.COLOR,e,t,r)),passTexture:(e,t)=>fi(new Wf(e,t)),pcurve:(e,t,r)=>sa(zn(sa(e,t),On(sa(e,t),sa(Gn(1,e),r))),1/t),perspectiveDepthToViewZ:Oc,pmremTexture:qp,pointUV:mf,pointWidth:Cn,positionGeometry:ju,positionLocal:qu,positionPrevious:Ku,positionView:Qu,positionViewDirection:Zu,positionWorld:Xu,positionWorldDirection:Yu,posterize:zf,pow:sa,pow2:ia,pow3:na,pow4:oa,property:sn,radians:fo,rand:fa,range:Sy,rangeFog:by,reciprocal:zo,reference:Rl,referenceBuffer:Cl,reflect:Zo,reflectVector:ml,reflectView:pl,reflector:e=>fi(new Km(e)),refract:pa,refractVector:fl,refractView:gl,reinhardToneMapping:Xf,remainder:oo,remap:iu,remapClamp:nu,renderGroup:Zi,renderOutput:du,rendererReference:za,rotate:mg,rotateUV:Rm,roughness:un,round:ko,rtt:rf,sRGBTransferEOTF:Ma,sRGBTransferOETF:Ba,sampler:e=>(!0===e.isNode?e:xu(e)).convert("sampler"),saturate:ha,saturation:Lf,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Uf(e)),screenCoordinate:_c,screenSize:Tc,screenUV:xc,scriptable:gy,scriptableValue:ly,select:Ta,setCurrentStack:vi,shaderStages:Cs,shadow:ab,sharedUniformGroup:Yi,sheen:hn,sheenRoughness:pn,shiftLeft:io,shiftRight:no,shininess:Nn,sign:Io,sin:Eo,sinc:(e,t)=>Eo(co.mul(t.mul(e).sub(1))).div(co.mul(t.mul(e).sub(1))),skinning:e=>fi(new tc(e)),skinningReference:rc,smoothstep:ga,smoothstepElement:ba,specularColor:_n,specularF90:vn,spherizeUV:Cm,split:(e,t)=>fi(new Ls(fi(e),t)),spritesheetUV:Bm,sqrt:vo,stack:lm,step:Qo,storage:hf,storageBarrier:()=>By("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),hf(e,t,r).setPBO(!0)),storageTexture:Nf,string:(e="")=>fi(new Gs(e,"string")),sub:Gn,subgroupIndex:Wd,subgroupSize:My,tan:Mo,tangentGeometry:Ml,tangentLocal:Bl,tangentView:Ul,tangentWorld:Fl,temp:Ca,texture:xu,texture3D:Ng,textureBarrier:()=>By("texture").append(),textureBicubic:up,textureCubeUV:Op,textureLoad:Tu,textureSize:mu,textureStore:(e,t,r)=>{const s=Nf(e,t,r);return null!==r&&s.append(),s},thickness:Mn,threshold:(e,t)=>da(Ii(0),e,Of(e).sub(t).max(0)),time:Nm,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Sm.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Nm.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Nm.mul(e)),toOutputColorSpace:Ia,toWorkingColorSpace:La,toneMapping:Wa,toneMappingExposure:Ha,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>fi(new qf(t,r,fi(s),fi(i),fi(n))),transformDirection:aa,transformNormal:dl,transformNormalToView:cl,transformedBentNormalView:Hl,transformedBitangentView:kl,transformedBitangentWorld:zl,transformedClearcoatNormalView:ll,transformedNormalView:al,transformedNormalWorld:ul,transformedTangentView:Pl,transformedTangentWorld:Il,transmission:wn,transpose:jo,tri:ym,tri3:bm,triNoise3D:xm,triplanarTexture:(...e)=>Fm(...e),triplanarTextures:Fm,trunc:$o,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),_i(...e)),uint:wi,uniform:tn,uniformArray:Nl,uniformGroup:Xi,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),fi(new vl(e,t))),userData:(e,t,r)=>fi(new Sf(e,t,r)),uv:pu,uvec2:Fi,uvec3:Di,uvec4:ki,varying:wa,varyingProperty:nn,vec2:Bi,vec3:Ii,vec4:Oi,vectorComponents:Es,velocity:wf,vertexColor:(...e)=>fi(new pf(...e)),vertexIndex:zd,vibrance:Df,viewZToLogarithmicDepth:Gc,viewZToOrthographicDepth:Dc,viewZToPerspectiveDepth:Vc,viewport:vc,viewportBottomLeft:Ec,viewportCoordinate:Sc,viewportDepthTexture:Ic,viewportLinearDepth:Wc,viewportMipTexture:Uc,viewportResolution:Rc,viewportSafeUV:wm,viewportSharedTexture:nh,viewportSize:Nc,viewportTexture:Bc,viewportTopLeft:Cc,viewportUV:Ac,wgsl:(e,t)=>ny(e,t,"wgsl"),wgslFn:(e,t)=>ay(e,t,"wgsl"),workgroupArray:(e,t)=>fi(new Fy("Workgroup",e,t)),workgroupBarrier:()=>By("workgroup").append(),workgroupId:Ey,workingToColorSpace:Da,xor:Jn});const mx=new om;class fx extends Bg{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(mx,Ae),mx.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(mx,Ae),mx.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;mx.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Na(Oi(n).mul(Tf),{getUV:()=>_f.mul(ol),getTextureLevel:()=>xf});let t=Gd();t=t.setZ(t.w);const s=new Yc;s.name="Background.material",s.side=x,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new k(new Me(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=Oi(n).mul(Tf),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);if(!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=mx.r,e.g=mx.g,e.b=mx.b,e.a=mx.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let yx=0;class bx{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=yx++}}class xx{constructor(e,t,r,s,i,n,o,a,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=o,this.updateAfterNodes=a,this.monitor=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new bx(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Tx{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class _x{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class vx{constructor(e,t){this.isNodeVar=!0,this.name=e,this.type=t}}class Nx extends vx{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Sx{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let Ax=0;class Rx{constructor(e=null){this.id=Ax++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class Cx extends Ms{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class Ex{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class wx extends Ex{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class Mx extends Ex{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class Bx extends Ex{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class Ux extends Ex{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class Fx extends Ex{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class Px extends Ex{constructor(e,t=new i){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class Ix extends Ex{constructor(e,t=new n){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class Lx extends wx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Dx extends Mx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Vx extends Bx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Ox extends Ux{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Gx extends Fx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class kx extends Px{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class zx extends Ix{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const $x=[.125,.215,.35,.446,.526,.582],Wx=20,Hx=new xe(-1,1,1,-1,0,1),jx=new Ue(90,1),qx=new e;let Kx=null,Xx=0,Yx=0;const Qx=(1+Math.sqrt(5))/2,Zx=1/Qx,Jx=[new r(-Qx,Zx,0),new r(Qx,Zx,0),new r(-Zx,0,Qx),new r(Zx,0,Qx),new r(0,Qx,-Zx),new r(0,Qx,Zx),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],eT=[3,1,5,0,4,2],tT=Vp(pu(),hu("faceIndex")).normalize(),rT=Ii(tT.x,tT.y.negate(),tT.z);class sT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}Kx=this._renderer.getRenderTarget(),Xx=this._renderer.getActiveCubeFace(),Yx=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=aT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=uT(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===T||e.mapping===_?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=$x[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=eT[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new Te;_.setAttribute("position",new ve(b,m)),_.setAttribute("uv",new ve(x,f)),_.setAttribute("faceIndex",new ve(T,y)),t.push(_),i.push(new k(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Nl(new Array(Wx).fill(0)),n=tn(new r(0,1,0)),o=tn(0),a=Ci(Wx),u=tn(0),l=tn(1),d=xu(null),c=tn(0),h=Ci(1/t),p=Ci(1/s),g=Ci(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:rT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=oT("blur");return f.uniforms=m,f.fragmentNode=zp({...m,latitudinal:u.equal(1)}),f}(i,e,t)}return i}async _compileMaterial(e){const t=new k(this._lodPlanes[0],e);await this._renderer.compile(t,Hx)}_sceneToCubeUV(e,t,r,s){const i=jx;i.near=t,i.far=r;const n=[-1,1,-1,-1,-1,-1],o=[1,1,1,-1,-1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(qx),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Q({name:"PMREM.Background",side:x,depthWrite:!1,depthTest:!1});l=new k(new G,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(qx),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;nT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===T||e.mapping===_;s?null===this._cubemapMaterial&&(this._cubemapMaterial=aT(e)):null===this._equirectMaterial&&(this._equirectMaterial=uT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;nT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,Hx)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tWx&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),a.setRenderTarget(t),a.render(l,Hx)}}function iT(e,t,r){const s=new ge(e,t,r);return s.texture.mapping=Be,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function nT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function oT(e){const t=new Yc;return t.depthTest=!1,t.depthWrite=!1,t.blending=D,t.name=`PMREM_${e}`,t}function aT(e){const t=oT("cubemap");return t.fragmentNode=bl(e,rT),t}function uT(e){const t=oT("equirect");return t.fragmentNode=xu(e,hh(rT),0),t}const lT=new WeakMap,dT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),cT=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class hT{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.monitor=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=lm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new Rx,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=lT.get(this.renderer);return void 0===e&&(e=new Rg,lT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ge(e,t,r)}createCubeRenderTarget(e,t){return new ph(e,t)}createPMREMGenerator(){return new sT(this.renderer)}includes(e){return this.nodes.includes(e)}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new bx(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new bx(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Cs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${cT(n.r)}, ${cT(n.g)}, ${cT(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new Tx(e,t);return r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===y)return"int";if(t===f)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;const r=gs(e);return("float"===t?"":t[0])+r}getTypeFromArray(e){return dT.get(e.constructor)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof Le||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=lm(this.stack),this.stacks.push(Ni()||this.stack),vi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,vi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Tx("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new Cx("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const o=this.uniforms.index++;n=new _x(s||"nodeUniform"+o,t,e),this.uniforms[r].push(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage){const i=this.getDataFromNode(e,s);let n=i.variable;if(void 0===n){const e=this.vars[s]||(this.vars[s]=[]);null===t&&(t="nodeVar"+e.length),n=new vx(t,r),e.push(n),i.variable=n}return n}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Nx(t,r),e.push(i),s.varying=i}return i}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new Sx("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}buildFunctionNode(e){const t=new oy,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new am(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new Rx,this.stack=lm();for(const r of Rs)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t){return`${this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Yc),e.build(this)}else this.addFlow("compute",e);for(const e of Rs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Cs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new Lx(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new Dx(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new Vx(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new Ox(e);if("color"===t)return new Gx(e);if("mat3"===t)return new kx(e);if("mat4"===t)return new zx(e);throw new Error(`Uniform "${t}" not declared.`)}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}(${e}[0].xyz, ${e}[1].xyz, ${e}[2].xyz)`:9===s&&4===i?`${this.getType(r)}(${e}[0].xy, ${e}[1].xy)`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${De} - Node System\n`}}class pT{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class gT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}gT.isNodeFunctionInput=!0;class mT extends ub{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=Wy(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const fT=new n,yT=new n;let bT=null;class xT extends ub{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=tn(new r).setGroup(Zi),this.halfWidth=tn(new r).setGroup(Zi),this.updateType=vs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;yT.identity(),fT.copy(t.matrixWorld),fT.premultiply(r),yT.extractRotation(fT),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(yT),this.halfHeight.value.applyMatrix4(yT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=xu(bT.LTC_FLOAT_1),r=xu(bT.LTC_FLOAT_2)):(t=xu(bT.LTC_HALF_1),r=xu(bT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=$y(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){bT=e}}class TT extends ub{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=tn(0).setGroup(Zi),this.penumbraCosNode=tn(0).setGroup(Zi),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return ga(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=$y(n).sub(Qu),a=o.normalize(),u=a.dot(Wy(n)),l=this.getSpotAttenuation(u),d=o.length(),c=lb({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=Gy(n),t=xu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class _T extends TT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=xu(t,Bi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class vT extends ub{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class NT extends ub{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ky(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=tn(new e).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=nl.dot(s).mul(.5).add(.5),n=da(r,t,i);e.context.irradiance.addAssign(n)}}class ST extends ub{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Nl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=px(ol,this.lightProbe);e.context.irradiance.addAssign(t)}}class AT{parseFunction(){console.warn("Abstract function.")}}class RT{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}RT.isNodeFunction=!0;const CT=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ET=/[a-z_0-9]+/gi,wT="#pragma main";class MT extends RT{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(wT),r=-1!==t?e.slice(t+12):e,s=r.match(CT);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=ET.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){let s=null;if(!0===r.isCubeTexture||r.mapping===j||r.mapping===q||r.mapping===Be)if(e.backgroundBlurriness>0||r.mapping===Be)s=qp(r);else{let e;e=!0===r.isCubeTexture?bl(r):xu(r),s=bh(e)}else!0===r.isTexture?s=xu(r,xc.flipY()).setUpdateMatrix(!0):!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r);t.backgroundNode=s,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){let e=null;if(r.isFogExp2){const t=Rl("color","color",r).setGroup(Zi),s=Rl("density","float",r).setGroup(Zi);e=Ty(t,s)}else if(r.isFog){const t=Rl("color","color",r).setGroup(Zi),s=Rl("near","float",r).setGroup(Zi),i=Rl("far","float",r).setGroup(Zi);e=by(t,s,i)}else console.error("WebGPUNodes: Unsupported fog configuration.",r);t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){let e=null;!0===r.isCubeTexture?e=bl(r):!0===r.isTexture?e=xu(r):console.error("Nodes: Unsupported environment configuration.",r),t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return UT.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=xu(e,xc).renderOutput(t.toneMapping,t.currentColorSpace);return UT.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new pT,this.nodeBuilderCache=new Map}}const PT=new me;class IT{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",null===e?(this.intersectionPlanes=[],this.unionPlanes=[],this.viewNormalMatrix=new i,this.clippingGroupContexts=new WeakMap,this.shadowPass=!1):(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix),this.parentVersion=null}projectPlanes(e,t,r){const s=e.length;for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new FT(this,r),this._animation=new Ag(this._nodes,this.info),this._attributes=new Dg(r),this._background=new fx(this,this._nodes),this._geometries=new Gg(this._attributes,this.info),this._textures=new nm(this,r,this.info),this._pipelines=new qg(r,this._nodes),this._bindings=new Kg(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Mg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Jg(this.lighting),this._bundles=new DT,this._renderContexts=new sm,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:kT;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new IT),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._nodes.updateScene(u),this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init();const r=this._renderScene(e,t);await this.backend.resolveTimestampAsync(r,"render")}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=x,p.viewport=!1===p.viewportValue.equals($T),p.scissorValue.copy(f).multiplyScalar(y).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals($T),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new IT),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),HT.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),WT.setFromProjectionMatrix(HT,g);const T=this._renderLists.get(e,t);if(T.begin(),this._projectObject(e,t,0,T,p.clippingContext),T.finish(),!0===this.sortObjects&&T.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=T.occlusionQueryCount,this._nodes.updateScene(u),this._background.update(u,T,p),this.backend.beginRender(p);const{bundles:_,lightsNode:v,transparentDoublePass:N,transparent:S,opaque:A}=T;if(_.length>0&&this._renderBundles(_,u,v),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,v),!0===this.transparent&&S.length>0&&this._renderTransparents(S,N,t,u,v),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}return u.onAfterRender(this,e,t,h),p}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s&&(this._textures.updateRenderTarget(s),i=this._textures.get(s)),this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}clearColorAsync(){return this.clearAsync(!0,!1,!1)}clearDepthAsync(){return this.clearAsync(!1,!0,!1)}clearStencilAsync(){return this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget?d:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget?Ae:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this.isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e),await this.backend.resolveTimestampAsync(e,"compute")}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){if(!1===this._initialized)return console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),!1;this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=jT.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=jT.copy(t).floor()}else t=jT.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||WT.intersectsSprite(e)){!0===this.sortObjects&&jT.setFromMatrixPosition(e.matrixWorld).applyMatrix4(HT);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,jT.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||WT.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),jT.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(HT)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=x;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Ge;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=le}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=u_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==y){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=l_[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}l_[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new i_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new n_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new o_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new ZT(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new t_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let h_=null,p_=null,g_=null;class m_{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null}async init(e){this.renderer=e}begin(){}finish(){}draw(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}createRenderPipeline(){}createComputePipeline(){}destroyPipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}createDefaultTexture(){}createTexture(){}copyTextureToBuffer(){}createAttribute(){}createIndexAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}resolveTimestampAsync(){}hasFeatureAsync(){}hasFeature(){}getInstanceCount(e){const{object:t,geometry:r}=e;return r.isInstancedBufferGeometry?r.instanceCount:t.count>1?t.count:1}getDrawingBufferSize(){return h_=h_||new t,this.renderer.getDrawingBufferSize(h_)}getScissor(){return p_=p_||new s,this.renderer.getScissor(p_)}setScissorTest(){}getClearColor(){const e=this.renderer;return g_=g_||new om,e.getClearColor(g_),g_.getRGB(g_,this.renderer.currentColorSpace),g_}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ze(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${De} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let f_=0;class y_{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class b_{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===y,id:f_++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new y_(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let S_,A_,R_,C_=!1;class E_{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===C_&&(this._init(this.gl),C_=!0)}_init(e){S_={[dr]:e.REPEAT,[cr]:e.CLAMP_TO_EDGE,[hr]:e.MIRRORED_REPEAT},A_={[pr]:e.NEAREST,[gr]:e.NEAREST_MIPMAP_NEAREST,[Ie]:e.NEAREST_MIPMAP_LINEAR,[$]:e.LINEAR,[Pe]:e.LINEAR_MIPMAP_NEAREST,[M]:e.LINEAR_MIPMAP_LINEAR},R_={[mr]:e.NEVER,[fr]:e.ALWAYS,[Re]:e.LESS,[yr]:e.LEQUAL,[br]:e.EQUAL,[xr]:e.GEQUAL,[Tr]:e.GREATER,[_r]:e.NOTEQUAL}}filterFallback(e){const{gl:t}=this;return e===pr||e===gr||e===Ie?t.NEAREST:t.LINEAR}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,S_[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,S_[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,S_[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,A_[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===$&&n?M:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,A_[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,R_[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===pr)return;if(t.minFilter!==Ie&&t.minFilter!==M)return;if(t.type===E&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:o,glType:a}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,o,a,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.gerDrawingBufferSize().y;if(d){const r=0!==o||0!==a;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class w_{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class M_{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const B_={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class U_{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;s0)){const e=t.queryQueue.shift();this.initTimestampQuery(e)}}async resolveTimestampAsync(e,t="render"){if(!this.disjoint||!this.trackTimestamp)return;const r=this.get(e);r.gpuQueries||(r.gpuQueries=[]);for(let e=0;e0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t0&&e.add(s[t]),r[t]=null,i.deleteQuery(n),o++))}o1?f.renderInstances(x,y,b):f.render(x,y),a.bindVertexArray(null)}needsRenderUpdate(){return!1}getRenderCacheKey(){return""}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}createSampler(){}destroySampler(){}createNodeBuilder(e,t){return new c_(e,t)}createProgram(e){const t=this.gl,{stage:r,code:s}=e,i="fragment"===r?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);t.shaderSource(i,s),t.compileShader(i),this.set(e,{shaderGPU:i})}destroyProgram(){console.warn("Abstract class.")}createRenderPipeline(e,t){const r=this.gl,s=e.pipeline,{fragmentProgram:i,vertexProgram:n}=s,o=r.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU;if(r.attachShader(o,a),r.attachShader(o,u),r.linkProgram(o),this.set(s,{programGPU:o,fragmentShader:a,vertexShader:u}),null!==t&&this.parallel){const i=new Promise((t=>{const i=this.parallel,n=()=>{r.getProgramParameter(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eB_[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===d){const s=[];d=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,d);const i=[],l=e.textures;for(let r=0;r,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:V_,stripIndexFormat:tv},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:V_,stripIndexFormat:tv},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Kv,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Kv,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:X_,storeOp:q_,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Kv,baseArrayLayer:r});const o=[];for(let a=1;a1&&!e.isMultisampleRenderTargetTexture){const e=Object.assign({},p);e.label=e.label+"-msaa",e.sampleCount=d,s.msaaTexture=r.device.createTexture(e)}s.initialized=!0,s.textureDescriptorGPU=p}destroyTexture(e){const t=this.backend,r=t.get(e);void 0!==r.texture&&r.texture.destroy(),void 0!==r.msaaTexture&&r.msaaTexture.destroy(),t.delete(e)}destroySampler(e){delete this.backend.get(e).sampler}generateMipmaps(e){const t=this.backend.get(e);if(e.isCubeTexture)for(let e=0;e<6;e++)this._generateMipmaps(t.texture,t.textureDescriptorGPU,e);else{const r=e.image.depth||1;for(let e=0;e1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,pN=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,gN={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class mN extends RT{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(hN);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=pN.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class fN extends AT{parseFunction(e){return new mN(e)}}const yN="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},bN={[Ss.READ_ONLY]:"read",[Ss.WRITE_ONLY]:"write",[Ss.READ_WRITE]:"read_write"},xN={[dr]:"repeat",[cr]:"clamp",[hr]:"mirror"},TN={vertex:yN?yN.VERTEX:1,fragment:yN?yN.FRAGMENT:2,compute:yN?yN.COMPUTE:4},_N={instance:!0,swizzleAssign:!1,storageBuffer:!0},vN={"^^":"tsl_xor"},NN={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},SN={},AN={tsl_xor:new iy("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new iy("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new iy("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new iy("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new iy("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new iy("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new iy("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new iy("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new iy("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new iy("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new iy("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new iy("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new iy("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},RN={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(AN.pow_float=new iy("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),AN.pow_vec2=new iy("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[AN.pow_float]),AN.pow_vec3=new iy("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[AN.pow_float]),AN.pow_vec4=new iy("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[AN.pow_float]),RN.pow_float="tsl_pow_float",RN.pow_vec2="tsl_pow_vec2",RN.pow_vec3="tsl_pow_vec3",RN.pow_vec4="tsl_pow_vec4");let CN="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(CN+="diagnostic( off, derivative_uniformity );\n");class EN extends hT{constructor(e,t){super(e,t,new fN),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==m}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"===n&&!1===this.isUnfilterable(e)?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s)}generateWrapFunction(e){const t=`tsl_coord_${xN[e.wrapS]}S_${xN[e.wrapT]}T`;let r=SN[t];if(void 0===r){const s=[];let i=`fn ${t}( coord : vec2f ) -> vec2f {\n\n\treturn vec2f(\n`;const n=(e,t)=>{e===dr?(s.push(AN.repeatWrapping_float),i+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===cr?(s.push(AN.clampWrapping_float),i+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===hr?(s.push(AN.mirrorWrapping_float),i+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(i+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};n(e.wrapS,"x"),i+=",\n",n(e.wrapT,"y"),i+="\n\t);\n\n}\n",SN[t]=r=new iy(i,s)}return r.build(this),t}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n;n=!0===e.isMultisampleRenderTargetTexture?t:`${t}, u32( ${r} )`,i=new Aa(new ou(`textureDimensions( ${n} )`,"uvec2")),s.dimensionsSnippet[r]=i}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=`vec2u( ${this.generateWrapFunction(e)}( ${r} ) * vec2f( ${this.generateTextureDimension(e,t,i)} ) )`;return this.generateTextureLoad(e,t,n,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===E||!1===this.isSampleCompare(e)&&e.minFilter===pr&&e.magFilter===pr||!0===e.isMultisampleRenderTargetTexture}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=vN[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Ss.READ_ONLY:e.access}getStorageAccess(e,t){return bN[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new i_(i.name,i.node,o,a):"cubeTexture"===t?n=new n_(i.name,i.node,o,a):"texture3D"===t&&(n=new o_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(TN[r]),"fragment"===r&&!1===this.isUnfilterable(e.value)&&!1===n.store){const e=new sN(`${i.name}_sampler`,i.node,o);e.setVisibility(TN[r]),u.push(e,n),s=[e,n]}else u.push(n),s=[n]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?ZT:oN)(e,o);i.setVisibility(TN[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new t_(a,o),n.setVisibility(TN[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","id","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}getVar(e,t){return`var ${t} : ${this.getType(e)}`}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${cN(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],o=n.outputNode,a=void 0!==o&&!0===o.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n\t`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return NN[e]||e}isAvailable(e){let t=_N[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),_N[e]=t),t}_getWGSLMethod(e){return void 0!==AN[e]&&this._include(e),RN[e]}_include(e){const t=AN[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${CN}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = id.x + id.y * numWorkgroups.x * u32(${t}) + id.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class wN{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=rv.Depth24PlusStencil8:e.depth&&(t=rv.Depth24Plus),t}getTextureFormatGPU(e){return this.backend.get(e).format}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?P_:e.isLineSegments||e.isMesh&&!0===t.wireframe?I_:e.isLine?L_:e.isMesh?D_:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){return navigator.userAgent.includes("Quest")?rv.BGRA8Unorm:navigator.gpu.getPreferredCanvasFormat()}}const MN=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),BN=new Map([[Le,["float16"]]]),UN=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class FN{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const o=s.device;let a=r.array;if(!1===e.normalized&&(a.constructor===Int16Array||a.constructor===Uint16Array)){const e=new Uint32Array(a.length);for(let t=0;t0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=Zv;let n;n=t.isSampledCubeTexture?Yv:t.isSampledTexture3D?Qv:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Xv:Kv,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class IN{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==D&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===ft){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:_v},r={srcFactor:i,dstFactor:n,operation:_v}};if(e.premultipliedAlpha)switch(s){case F:i(lv,pv,lv,pv);break;case xt:i(lv,lv,lv,lv);break;case bt:i(uv,cv,uv,lv);break;case yt:i(uv,dv,uv,hv)}else switch(s){case F:i(hv,pv,lv,pv);break;case xt:i(hv,lv,hv,lv);break;case bt:i(uv,cv,uv,lv);break;case yt:i(uv,dv,uv,dv)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case rt:t=uv;break;case st:t=lv;break;case it:t=dv;break;case lt:t=cv;break;case nt:t=hv;break;case dt:t=pv;break;case at:t=gv;break;case ct:t=mv;break;case ut:t=fv;break;case ht:t=yv;break;case ot:t=bv;break;case 211:t=xv;break;case 212:t=Tv;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Mr:t=O_;break;case wr:t=j_;break;case Er:t=G_;break;case Cr:t=z_;break;case Rr:t=k_;break;case Ar:t=H_;break;case Sr:t=$_;break;case Nr:t=W_;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Vr:t=Ev;break;case Dr:t=wv;break;case Lr:t=Mv;break;case Ir:t=Bv;break;case Pr:t=Uv;break;case Fr:t=Fv;break;case Ur:t=Pv;break;case Br:t=Iv;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Je:t=_v;break;case et:t=vv;break;case tt:t=Nv;break;case Gr:t=Sv;break;case Or:t=Av;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?ev:tv),r.side){case Ge:s.frontFace=Y_,s.cullMode=J_;break;case x:s.frontFace=Y_,s.cullMode=Z_;break;case le:s.frontFace=Y_,s.cullMode=Q_;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?Cv:Rv}_getDepthCompare(e){let t;if(!1===e.depthTest)t=j_;else{const r=e.depthFunc;switch(r){case Ct:t=O_;break;case Rt:t=j_;break;case At:t=G_;break;case St:t=z_;break;case Nt:t=k_;break;case vt:t=H_;break;case _t:t=$_;break;case Tt:t=W_;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class LN extends m_{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new wN(this),this.attributeUtils=new FN(this),this.bindingUtils=new PN(this),this.pipelineUtils=new IN(this),this.textureUtils=new dN(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(tN),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(tN.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return v}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e){const t=e.renderTarget,r=this.get(t);let s=r.descriptors;if(void 0===s||r.width!==t.width||r.height!==t.height||r.activeMipmapLevel!==t.activeMipmapLevel||r.samples!==t.samples){s={},r.descriptors=s;const e=()=>{t.removeEventListener("dispose",e),this.delete(t)};t.addEventListener("dispose",e)}const i=e.getCacheKey();let n=s[i];if(void 0===n){const o=e.textures,a=[];for(let t=0;t0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.prepareTimestampBuffer(e,t.encoder),this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.prepareTimestampBuffer(e,t.cmdEncoderGPU),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e1?0:r;l.drawIndexed(t[r],s,e[r]/n,0,o)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}}needsRenderUpdate(e){const t=this.get(e),{object:r,material:s}=e,i=this.utils,n=i.getSampleCountRenderContext(e.context),o=i.getCurrentColorSpace(e.context),a=i.getCurrentColorFormat(e.context),u=i.getCurrentDepthStencilFormat(e.context),l=i.getPrimitiveTopology(r,s);let d=!1;return t.material===s&&t.materialVersion===s.version&&t.transparent===s.transparent&&t.blending===s.blending&&t.premultipliedAlpha===s.premultipliedAlpha&&t.blendSrc===s.blendSrc&&t.blendDst===s.blendDst&&t.blendEquation===s.blendEquation&&t.blendSrcAlpha===s.blendSrcAlpha&&t.blendDstAlpha===s.blendDstAlpha&&t.blendEquationAlpha===s.blendEquationAlpha&&t.colorWrite===s.colorWrite&&t.depthWrite===s.depthWrite&&t.depthTest===s.depthTest&&t.depthFunc===s.depthFunc&&t.stencilWrite===s.stencilWrite&&t.stencilFunc===s.stencilFunc&&t.stencilFail===s.stencilFail&&t.stencilZFail===s.stencilZFail&&t.stencilZPass===s.stencilZPass&&t.stencilFuncMask===s.stencilFuncMask&&t.stencilWriteMask===s.stencilWriteMask&&t.side===s.side&&t.alphaToCoverage===s.alphaToCoverage&&t.sampleCount===n&&t.colorSpace===o&&t.colorFormat===a&&t.depthStencilFormat===u&&t.primitiveTopology===l&&t.clippingContextCacheKey===e.clippingContextCacheKey||(t.material=s,t.materialVersion=s.version,t.transparent=s.transparent,t.blending=s.blending,t.premultipliedAlpha=s.premultipliedAlpha,t.blendSrc=s.blendSrc,t.blendDst=s.blendDst,t.blendEquation=s.blendEquation,t.blendSrcAlpha=s.blendSrcAlpha,t.blendDstAlpha=s.blendDstAlpha,t.blendEquationAlpha=s.blendEquationAlpha,t.colorWrite=s.colorWrite,t.depthWrite=s.depthWrite,t.depthTest=s.depthTest,t.depthFunc=s.depthFunc,t.stencilWrite=s.stencilWrite,t.stencilFunc=s.stencilFunc,t.stencilFail=s.stencilFail,t.stencilZFail=s.stencilZFail,t.stencilZPass=s.stencilZPass,t.stencilFuncMask=s.stencilFuncMask,t.stencilWriteMask=s.stencilWriteMask,t.side=s.side,t.alphaToCoverage=s.alphaToCoverage,t.sampleCount=n,t.colorSpace=o,t.colorFormat=a,t.depthStencilFormat=u,t.primitiveTopology=l,t.clippingContextCacheKey=e.clippingContextCacheKey,d=!0),d}getRenderCacheKey(e){const{object:t,material:r}=e,s=this.utils,i=e.context;return[r.transparent,r.blending,r.premultipliedAlpha,r.blendSrc,r.blendDst,r.blendEquation,r.blendSrcAlpha,r.blendDstAlpha,r.blendEquationAlpha,r.colorWrite,r.depthWrite,r.depthTest,r.depthFunc,r.stencilWrite,r.stencilFunc,r.stencilFail,r.stencilZFail,r.stencilZPass,r.stencilFuncMask,r.stencilWriteMask,r.side,s.getSampleCountRenderContext(i),s.getCurrentColorSpace(i),s.getCurrentColorFormat(i),s.getCurrentDepthStencilFormat(i),s.getPrimitiveTopology(t,r),e.getGeometryCacheKey(),e.clippingContextCacheKey].join()}createSampler(e){this.textureUtils.createSampler(e)}destroySampler(e){this.textureUtils.destroySampler(e)}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}initTimestampQuery(e,t){if(!this.trackTimestamp)return;const r=this.get(e);if(!r.timeStampQuerySet){const s=e.isComputeNode?"compute":"render",i=this.device.createQuerySet({type:"timestamp",count:2,label:`timestamp_${s}_${e.id}`}),n={querySet:i,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};Object.assign(t,{timestampWrites:n}),r.timeStampQuerySet=i}}prepareTimestampBuffer(e,t){if(!this.trackTimestamp)return;const r=this.get(e),s=2*BigInt64Array.BYTES_PER_ELEMENT;void 0===r.currentTimestampQueryBuffers&&(r.currentTimestampQueryBuffers={resolveBuffer:this.device.createBuffer({label:"timestamp resolve buffer",size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),resultBuffer:this.device.createBuffer({label:"timestamp result buffer",size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});const{resolveBuffer:i,resultBuffer:n}=r.currentTimestampQueryBuffers;t.resolveQuerySet(r.timeStampQuerySet,0,2,i,0),"unmapped"===n.mapState&&t.copyBufferToBuffer(i,0,n,0,s)}async resolveTimestampAsync(e,t="render"){if(!this.trackTimestamp)return;const r=this.get(e);if(void 0===r.currentTimestampQueryBuffers)return;const{resultBuffer:s}=r.currentTimestampQueryBuffers;await this.device.queue.onSubmittedWorkDone(),"unmapped"===s.mapState&&s.mapAsync(GPUMapMode.READ).then((()=>{const e=new BigUint64Array(s.getMappedRange()),r=Number(e[1]-e[0])/1e6;this.renderer.info.updateTimestamp(t,r),s.unmap()}))}createNodeBuilder(e,t){return new EN(e,t)}createProgram(e){this.get(e).module={module:this.device.createShaderModule({code:e.code,label:e.stage}),entryPoint:"main"}}destroyProgram(e){this.delete(e)}createRenderPipeline(e,t){this.pipelineUtils.createRenderPipeline(e,t)}createComputePipeline(e,t){this.pipelineUtils.createComputePipeline(e,t)}beginBundle(e){const t=this.get(e);t._currentPass=t.currentPass,t._currentSets=t.currentSets,t.currentSets={attributes:{},bindingGroups:[],pipeline:null,index:null},t.currentPass=this.pipelineUtils.createBundleEncoder(e)}finishBundle(e,t){const r=this.get(e),s=r.currentPass.finish();this.get(t).bundleGPU=s,r.currentSets=r._currentSets,r.currentPass=r._currentPass}addBundle(e,t){this.get(e).renderBundles.push(this.get(t).bundleGPU)}createBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBinding(e){this.bindingUtils.updateBinding(e)}createIndexAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.INDEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createIndirectStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.INDIRECT|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}updateAttribute(e){this.attributeUtils.updateAttribute(e)}destroyAttribute(e){this.attributeUtils.destroyAttribute(e)}updateSize(){this.colorBuffer=this.textureUtils.getColorBuffer(),this.defaultRenderPassdescriptor=null}getMaxAnisotropy(){return 16}hasFeature(e){return this.device.features.has(e)}copyTextureToTexture(e,t,r=null,s=null,i=0){let n=0,o=0,a=0,u=0,l=0,d=0,c=e.image.width,h=e.image.height;null!==r&&(u=r.x,l=r.y,d=r.z||0,c=r.width,h=r.height),null!==s&&(n=s.x,o=s.y,a=s.z||0);const p=this.device.createCommandEncoder({label:"copyTextureToTexture_"+e.id+"_"+t.id}),g=this.get(e).texture,m=this.get(t).texture;p.copyTextureToTexture({texture:g,mipLevel:i,origin:{x:u,y:l,z:d}},{texture:m,mipLevel:i,origin:{x:n,y:o,z:a}},[c,h,1]),this.device.queue.submit([p.finish()])}copyFramebufferToTexture(e,t,r){const s=this.get(t);let i=null;i=t.renderTarget?e.isDepthTexture?this.get(t.depthTexture).texture:this.get(t.textures[0]).texture:e.isDepthTexture?this.textureUtils.getDepthBuffer(t.depth,t.stencil):this.context.getCurrentTexture();const n=this.get(e).texture;if(i.format!==n.format)return void console.error("WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.",i.format,n.format);let o;if(s.currentPass?(s.currentPass.end(),o=s.encoder):o=this.device.createCommandEncoder({label:"copyFramebufferToTexture_"+e.id}),o.copyTextureToTexture({texture:i,origin:[r.x,r.y,0]},{texture:n},[r.z,r.w]),e.generateMipmaps&&this.textureUtils.generateMipmaps(e),s.currentPass){const{descriptor:e}=s;for(let t=0;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new F_(e)));super(new t(e),e),this.library=new VN,this.isWebGPURenderer=!0}}class GN extends es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}const kN=new Yc,zN=new Jm(kN);class $N{constructor(e,t=Oi(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0,kN.name="PostProcessing"}render(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,zN.render(e),e.toneMapping=t,e.outputColorSpace=r}update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;zN.material.fragmentNode=!0===this.outputColorTransform?du(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),zN.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,await zN.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}function WN(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function HN(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function jN(e,t,r={}){return(r=WN(e,r)).background=t.background,r.backgroundNode=t.backgroundNode,r.overrideMaterial=t.overrideMaterial,r}var qN=Object.freeze({__proto__:null,resetRendererAndSceneState:function(e,t,r){return r=jN(e,t,r),t.background=null,t.backgroundNode=null,t.overrideMaterial=null,r},resetRendererState:function(e,t){return t=WN(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t},restoreRendererAndSceneState:function(e,t,r){HN(e,r),t.background=r.background,t.backgroundNode=r.backgroundNode,t.overrideMaterial=r.overrideMaterial},restoreRendererState:HN,saveRendererAndSceneState:jN,saveRendererState:WN});class KN extends ee{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=$,this.minFilter=$,this.isStorageTexture=!0}}class XN extends uf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class YN extends ts{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new rs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Ci()):fi(new this.nodes[e])}}class QN extends ss{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class ZN extends is{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new YN;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new QN;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return null!==e.renderer.nodes.modelViewMatrix||null!==e.renderer.nodes.modelNormalViewMatrix}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e){const{object:t,material:r,geometry:s}=e,i=this.getRenderObjectData(e);if(!0!==i.worldMatrix.equals(t.matrixWorld))return i.worldMatrix.copy(t.matrixWorld),!1;const n=i.material;for(const e in n){const t=n[e],s=r[e];if(void 0!==t.equals){if(!1===t.equals(s))return t.copy(s),!1}else if(!0===s.isTexture){if(t.id!==s.id||t.version!==s.version)return t.id=s.id,t.version=s.version,!1}else if(t!==s)return n[e]=s,!1}if(n.transmission>0){const{width:t,height:r}=e.context;if(i.bufferWidth!==t||i.bufferHeight!==r)return i.bufferWidth=t,i.bufferHeight=r,!1}const o=i.geometry,a=s.attributes,u=o.attributes,l=Object.keys(u),d=Object.keys(a);if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(a),!1;for(const e of l){const t=u[e],r=a[e];if(void 0===r)return delete u[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const c=s.index,h=o.indexVersion,p=c?c.version:null;if(h!==p)return o.indexVersion=p,!1;if(o.drawRange.start!==s.drawRange.start||o.drawRange.count!==s.drawRange.count)return o.drawRange.start=s.drawRange.start,o.drawRange.count=s.drawRange.count,!1;if(i.morphTargetInfluences){let e=!1;for(let r=0;r>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const us=e=>as(e),ls=e=>as(e),ds=(...e)=>as(e);function cs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of hs(e))r.push(r,as(s.slice(0,-4)),i.getCacheKey(t));return as(r)}function*hs(e,t=!1){for(const r in e){if(!0===r.startsWith("_"))continue;const s=e[r];if(!0===Array.isArray(s))for(let e=0;ee.charCodeAt(0))).buffer}var Ts=Object.freeze({__proto__:null,arrayBufferToBase64:bs,base64ToArrayBuffer:xs,getCacheKey:cs,getLengthFromType:ms,getNodeChildren:hs,getTypeFromLength:gs,getValueFromType:ys,getValueType:fs,hash:ds,hashArray:ls,hashString:us});const _s={VERTEX:"vertex",FRAGMENT:"fragment"},vs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Ns={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Ss={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},As=["fragment","vertex"],Rs=["setup","analyze","generate"],Cs=[...As,"compute"],Es=["x","y","z","w"];let ws=0;class Ms extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=vs.NONE,this.updateBeforeType=vs.NONE,this.updateAfterType=vs.NONE,this.uuid=a.generateUUID(),this.version=0,this.global=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ws++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this.getSelf()),this}onFrameUpdate(e){return this.onUpdate(e,vs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,vs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,vs.OBJECT)}onReference(e){return this.updateReference=e.bind(this.getSelf()),this}getSelf(){return this.self||this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of hs(this))yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}getCacheKey(e=!1){return!0!==(e=e||this.version!==this._cacheKeyVersion)&&null!==this._cacheKey||(this._cacheKey=ds(cs(this,e),this.customCacheKey()),this._cacheKeyVersion=this.version),this._cacheKey}customCacheKey(){return 0}getScope(){return this}getHash(){return this.uuid}getUpdateType(){return this.updateType}getUpdateBeforeType(){return this.updateBeforeType}getUpdateAfterType(){return this.updateAfterType}getElementType(e){const t=this.getNodeType(e);return e.getElementType(t)}getNodeType(e){const t=e.getNodeProperties(this);return t.outputNode?t.outputNode.getNodeType(e):this.nodeType}getShared(e){const t=this.getHash(e);return e.getNodeFromHash(t)||this}setup(e){const t=e.getNodeProperties(this);let r=0;for(const e of this.getChildren())t["node"+r++]=e;return null}analyze(e){if(1===e.increaseUsage(this)){const t=e.getNodeProperties(this);for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}generate(e,t){const{outputNode:r}=e.getNodeProperties(this);if(r&&!0===r.isNode)return r.build(e,t)}updateBefore(){console.warn("Abstract function.")}updateAfter(){console.warn("Abstract function.")}update(){console.warn("Abstract function.")}build(e,t=null){const r=this.getShared(e);if(this!==r)return r.build(e,t);e.addNode(this),e.addChain(this);let s=null;const i=e.getBuildStage();if("setup"===i){this.updateReference(e);const t=e.getNodeProperties(this);if(!0!==t.initialized){e.stack.nodes.length;t.initialized=!0,t.outputNode=this.setup(e),null!==t.outputNode&&e.stack.nodes.length;for(const r of Object.values(t))r&&!0===r.isNode&&r.build(e)}}else if("analyze"===i)this.analyze(e);else if("generate"===i){if(1===this.generate.length){const r=this.getNodeType(e),i=e.getDataFromNode(this);s=i.snippet,void 0===s?(s=this.generate(e)||"",i.snippet=s):void 0!==i.flowCodes&&void 0!==e.context.nodeBlock&&e.addFlowCodeHierarchy(this,e.context.nodeBlock),s=e.format(s,r,t)}else s=this.generate(e,t)||""}return e.removeChain(this),e.addSequentialNode(this),s}getSerializeChildren(){return hs(this)}serialize(e){const t=this.getSerializeChildren(),r={};for(const{property:s,index:i,childNode:n}of t)void 0!==i?(void 0===r[s]&&(r[s]=Number.isInteger(i)?[]:{}),r[s][i]=n.toJSON(e.meta).uuid):r[s]=n.toJSON(e.meta).uuid;Object.keys(r).length>0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.6,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class Bs extends Ms{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}generate(e){return`${this.node.build(e)}[ ${this.indexNode.build(e,"uint")} ]`}}class Us extends Ms{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class Fs extends Ms{static get type(){return"TempNode"}constructor(e){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),o=e.getPropertyName(n);return e.addLineFlowCode(`${o} = ${i}`,this),s.snippet=i,s.propertyName=o,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Ps extends Fs{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce(((t,r)=>t+e.getTypeLength(r.getNodeType(e))),0))}generate(e,t){const r=this.getNodeType(e),s=this.nodes,i=e.getComponentType(r),n=[];for(const t of s){let r=t.build(e);const s=e.getComponentType(t.getNodeType(e));s!==i&&(r=e.format(r,s,i)),n.push(r)}const o=`${e.getType(r)}( ${n.join(", ")} )`;return e.format(o,r,t)}}const Is=Es.join("");class Ls extends Ms{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(Es.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const o=r.build(e,n);i=this.components.length===s&&this.components===Is.slice(0,this.components.length)?e.format(o,n,t):e.format(`${o}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class Ds extends Fs{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),o=e.getTypeFromLength(r.length,n),a=s.build(e,o),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;ee.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"),Ws=e=>Hs(e).split("").sort().join(""),js={setup(e,t){const r=t.shift();return e(yi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ks.assign(r,...e),r);if(zs.has(t)){const s=zs.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&zs.has(t.slice(0,t.length-6))){const s=zs.get(t.slice(0,t.length-6));return e.isStackNode?(...e)=>r.assign(e[0],s(...e)):(...e)=>r.assign(s(r,...e))}if(!0===/^[xyzwrgbastpq]{1,4}$/.test(t))return t=Hs(t),fi(new Ls(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Ws(t.slice(3).toLowerCase()),r=>fi(new Ds(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=Ws(t.slice(4).toLowerCase()),()=>fi(new Vs(fi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),fi(new Ls(e,t));if(!0===/^\d+$/.test(t))return fi(new Bs(r,new Gs(Number(t),"uint")))}return Reflect.get(e,t,r)},set:(e,t,r,s)=>"string"!=typeof t||void 0!==e[t]||!0!==/^[xyzwrgbastpq]{1,4}$/.test(t)&&"width"!==t&&"height"!==t&&"depth"!==t&&!0!==/^\d+$/.test(t)?Reflect.set(e,t,r,s):(s[t].assign(r),!0)},qs=new WeakMap,Ks=new WeakMap,Xs=function(e,t=null){for(const r in e)e[r]=fi(e[r],t);return e},Ys=function(e,t=null){const r=e.length;for(let s=0;sfi(null!==s?Object.assign(e,s):e);return null===t?(...t)=>i(new e(...bi(t))):null!==r?(r=fi(r),(...s)=>i(new e(t,...bi(s),r))):(...r)=>i(new e(t,...bi(r)))},Zs=function(e,...t){return fi(new e(...bi(t)))};class Js extends Ms{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}call(e){const{shaderNode:t,inputNodes:r}=this,s=e.getNodeProperties(t);if(s.onceOutput)return s.onceOutput;let i=null;if(t.layout){let s=Ks.get(e.constructor);void 0===s&&(s=new WeakMap,Ks.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=fi(e.buildFunctionNode(t)),s.set(t,n)),null!==e.currentFunctionNode&&e.currentFunctionNode.includes.push(n),i=fi(n.call(r))}else{const s=t.jsFunc,n=null!==r?s(r,e):s(e);i=fi(n)}return t.once&&(s.onceOutput=i),i}getOutputNode(e){const t=e.getNodeProperties(this);return null===t.outputNode&&(t.outputNode=this.setupOutput(e)),t.outputNode}setup(e){return this.getOutputNode(e)}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}generate(e,t){return this.getOutputNode(e).build(e,t)}}class ei extends Ms{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}call(e=null){return yi(e),fi(new Js(this,e))}setup(){return this.call()}}const ti=[!1,!0],ri=[0,1,2,3],si=[-1,-2],ii=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],ni=new Map;for(const e of ti)ni.set(e,new Gs(e));const oi=new Map;for(const e of ri)oi.set(e,new Gs(e,"uint"));const ai=new Map([...oi].map((e=>new Gs(e.value,"int"))));for(const e of si)ai.set(e,new Gs(e,"int"));const ui=new Map([...ai].map((e=>new Gs(e.value))));for(const e of ii)ui.set(e,new Gs(e));for(const e of ii)ui.set(-e,new Gs(-e));const li={bool:ni,uint:oi,ints:ai,float:ui},di=new Map([...ni,...ui]),ci=(e,t)=>di.has(e)?di.get(e):!0===e.isNode?e:new Gs(e,t),hi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[ys(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return fi(t.get(r[0]));if(1===r.length){const t=ci(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?fi(t):fi(new Us(t,e))}const s=r.map((e=>ci(e)));return fi(new Ps(s,e))}},pi=e=>"object"==typeof e&&null!==e?e.value:e,gi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function mi(e,t){return new Proxy(new ei(e,t),js)}const fi=(e,t=null)=>function(e,t=null){const r=fs(e);if("node"===r){let t=qs.get(e);return void 0===t&&(t=new Proxy(e,js),qs.set(e,t),qs.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?fi(ci(e,t)):"shader"===r?_i(e):e}(e,t),yi=(e,t=null)=>new Xs(e,t),bi=(e,t=null)=>new Ys(e,t),xi=(...e)=>new Qs(...e),Ti=(...e)=>new Zs(...e),_i=(e,t)=>{const r=new mi(e,t),s=(...e)=>{let t;return yi(e),t=e[0]&&e[0].isNode?[...e]:e[0],r.call(t)};return s.shaderNode=r,s.setLayout=e=>(r.setLayout(e),s),s.once=()=>(r.once=!0,s),s};$s("toGlobal",(e=>(e.global=!0,e)));const vi=e=>{ks=e},Ni=()=>ks,Si=(...e)=>ks.If(...e);function Ai(e){return ks&&ks.add(e),e}$s("append",Ai);const Ri=new hi("color"),Ci=new hi("float",li.float),Ei=new hi("int",li.ints),wi=new hi("uint",li.uint),Mi=new hi("bool",li.bool),Bi=new hi("vec2"),Ui=new hi("ivec2"),Fi=new hi("uvec2"),Pi=new hi("bvec2"),Ii=new hi("vec3"),Li=new hi("ivec3"),Di=new hi("uvec3"),Vi=new hi("bvec3"),Oi=new hi("vec4"),Gi=new hi("ivec4"),ki=new hi("uvec4"),zi=new hi("bvec4"),$i=new hi("mat2"),Hi=new hi("mat3"),Wi=new hi("mat4");$s("toColor",Ri),$s("toFloat",Ci),$s("toInt",Ei),$s("toUint",wi),$s("toBool",Mi),$s("toVec2",Bi),$s("toIVec2",Ui),$s("toUVec2",Fi),$s("toBVec2",Pi),$s("toVec3",Ii),$s("toIVec3",Li),$s("toUVec3",Di),$s("toBVec3",Vi),$s("toVec4",Oi),$s("toIVec4",Gi),$s("toUVec4",ki),$s("toBVec4",zi),$s("toMat2",$i),$s("toMat3",Hi),$s("toMat4",Wi);const ji=xi(Bs),qi=(e,t)=>fi(new Us(fi(e),t));$s("element",ji),$s("convert",qi);class Ki extends Ms{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const Xi=e=>new Ki(e),Yi=(e,t=0)=>new Ki(e,!0,t),Qi=Yi("frame"),Zi=Yi("render"),Ji=Xi("object");class en extends Os{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Ji}label(e){return this.name=e,this}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){const r=this.getSelf();return e=e.bind(r),super.onUpdate((t=>{const s=e(t,r);void 0!==s&&(this.value=s)}),t)}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),o=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),a=e.getPropertyName(o);return void 0!==e.context.label&&delete e.context.label,e.format(a,r,t)}}const tn=(e,t)=>{const r=gi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return fi(new en(s,r))};class rn extends Ms{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0}getHash(e){return this.name||super.getHash(e)}isGlobal(){return!0}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const sn=(e,t)=>fi(new rn(e,t)),nn=(e,t)=>fi(new rn(e,t,!0)),on=Ti(rn,"vec4","DiffuseColor"),an=Ti(rn,"vec3","EmissiveColor"),un=Ti(rn,"float","Roughness"),ln=Ti(rn,"float","Metalness"),dn=Ti(rn,"float","Clearcoat"),cn=Ti(rn,"float","ClearcoatRoughness"),hn=Ti(rn,"vec3","Sheen"),pn=Ti(rn,"float","SheenRoughness"),gn=Ti(rn,"float","Iridescence"),mn=Ti(rn,"float","IridescenceIOR"),fn=Ti(rn,"float","IridescenceThickness"),yn=Ti(rn,"float","AlphaT"),bn=Ti(rn,"float","Anisotropy"),xn=Ti(rn,"vec3","AnisotropyT"),Tn=Ti(rn,"vec3","AnisotropyB"),_n=Ti(rn,"color","SpecularColor"),vn=Ti(rn,"float","SpecularF90"),Nn=Ti(rn,"float","Shininess"),Sn=Ti(rn,"vec4","Output"),An=Ti(rn,"float","dashSize"),Rn=Ti(rn,"float","gapSize"),Cn=Ti(rn,"float","pointWidth"),En=Ti(rn,"float","IOR"),wn=Ti(rn,"float","Transmission"),Mn=Ti(rn,"float","Thickness"),Bn=Ti(rn,"float","AttenuationDistance"),Un=Ti(rn,"color","AttenuationColor"),Fn=Ti(rn,"float","Dispersion");class Pn extends Fs{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return Es.join("").slice(0,r)!==t.components}return!1}generate(e,t){const{targetNode:r,sourceNode:s}=this,i=this.needsSplitAssign(e),n=r.getNodeType(e),o=r.context({assign:!0}).build(e),a=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=o);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${a}`,this);const u=r.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i))for(let e=0;e(t=t.length>1||t[0]&&!0===t[0].isNode?bi(t):yi(t[0]),fi(new Ln(fi(e),t)));$s("call",Dn);class Vn extends Fs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Vn(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"=="===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("<"===r||">"===r||"<="===r||">="===r){const r=t?e.getTypeLength(t):Math.max(e.getTypeLength(n),e.getTypeLength(o));return r>1?`bvec${r}`:"bool"}return"float"===n&&e.isMatrix(o)?o:e.isMatrix(n)&&e.isVector(o)?e.getVectorFromMatrix(n):e.isVector(n)&&e.isMatrix(o)?e.getVectorFromMatrix(o):e.getTypeLength(o)>e.getTypeLength(n)?o:n}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e,t);let o=null,a=null;"void"!==n?(o=s.getNodeType(e),a=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r?e.isVector(o)?a=o:o!==a&&(o=a="float"):">>"===r||"<<"===r?(o=n,a=e.changeComponentType(a,"uint")):e.isMatrix(o)&&e.isVector(a)?a=e.getVectorFromMatrix(o):o=e.isVector(o)&&e.isMatrix(a)?e.getVectorFromMatrix(a):a=n):o=a=n;const u=s.build(e,o),l=void 0!==i?i.build(e,a):null,d=e.getTypeLength(t),c=e.getFunctionOperator(r);return"void"!==t?"<"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} < ${l} )`,n,t):"<="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("lessThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} <= ${l} )`,n,t):">"===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThan",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} > ${l} )`,n,t):">="===r&&d>1?e.useComparisonMethod?e.format(`${e.getMethod("greaterThanEqual",t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} >= ${l} )`,n,t):"!"===r||"~"===r?e.format(`(${r}${u})`,o,t):c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t):"void"!==o?c?e.format(`${c}( ${u}, ${l} )`,n,t):e.format(`${u} ${r} ${l}`,n,t):void 0}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const On=xi(Vn,"+"),Gn=xi(Vn,"-"),kn=xi(Vn,"*"),zn=xi(Vn,"/"),$n=xi(Vn,"%"),Hn=xi(Vn,"=="),Wn=xi(Vn,"!="),jn=xi(Vn,"<"),qn=xi(Vn,">"),Kn=xi(Vn,"<="),Xn=xi(Vn,">="),Yn=xi(Vn,"&&"),Qn=xi(Vn,"||"),Zn=xi(Vn,"!"),Jn=xi(Vn,"^^"),eo=xi(Vn,"&"),to=xi(Vn,"~"),ro=xi(Vn,"|"),so=xi(Vn,"^"),io=xi(Vn,"<<"),no=xi(Vn,">>");$s("add",On),$s("sub",Gn),$s("mul",kn),$s("div",zn),$s("modInt",$n),$s("equal",Hn),$s("notEqual",Wn),$s("lessThan",jn),$s("greaterThan",qn),$s("lessThanEqual",Kn),$s("greaterThanEqual",Xn),$s("and",Yn),$s("or",Qn),$s("not",Zn),$s("xor",Jn),$s("bitAnd",eo),$s("bitNot",to),$s("bitOr",ro),$s("bitXor",so),$s("shiftLeft",io),$s("shiftRight",no);const oo=(...e)=>(console.warn("TSL.OperatorNode: .remainder() has been renamed to .modInt()."),$n(...e));$s("remainder",oo);class ao extends Fs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){super(),this.method=e,this.aNode=t,this.bNode=r,this.cNode=s}getInputType(e){const t=this.aNode.getNodeType(e),r=this.bNode?this.bNode.getNodeType(e):null,s=this.cNode?this.cNode.getNodeType(e):null,i=e.isMatrix(t)?0:e.getTypeLength(t),n=e.isMatrix(r)?0:e.getTypeLength(r),o=e.isMatrix(s)?0:e.getTypeLength(s);return i>n&&i>o?t:n>o?r:o>i?s:t}getNodeType(e){const t=this.method;return t===ao.LENGTH||t===ao.DISTANCE||t===ao.DOT?"float":t===ao.CROSS?"vec3":t===ao.ALL?"bool":t===ao.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):t===ao.MOD?this.aNode.getNodeType(e):this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,o=this.bNode,a=this.cNode,u=!0===e.renderer.isWebGLRenderer;if(r===ao.TRANSFORM_DIRECTION){let r=n,s=o;e.isMatrix(r.getNodeType(e))?s=Oi(Ii(s),0):r=Oi(Ii(r),0);const i=kn(r,s).xyz;return Ro(i).build(e,t)}if(r===ao.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===ao.ONE_MINUS)return Gn(1,n).build(e,t);if(r===ao.RECIPROCAL)return zn(1,n).build(e,t);if(r===ao.DIFFERENCE)return Po(Gn(n,o)).build(e,t);{const l=[];return r===ao.CROSS||r===ao.MOD?l.push(n.build(e,s),o.build(e,s)):u&&r===ao.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),o.build(e,i)):u&&(r===ao.MIN||r===ao.MAX)||r===ao.MOD?l.push(n.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):r===ao.REFRACT?l.push(n.build(e,i),o.build(e,i),a.build(e,"float")):r===ao.MIX?l.push(n.build(e,i),o.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)):(l.push(n.build(e,i)),null!==o&&l.push(o.build(e,i)),null!==a&&l.push(a.build(e,i))),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ao.ALL="all",ao.ANY="any",ao.EQUALS="equals",ao.RADIANS="radians",ao.DEGREES="degrees",ao.EXP="exp",ao.EXP2="exp2",ao.LOG="log",ao.LOG2="log2",ao.SQRT="sqrt",ao.INVERSE_SQRT="inversesqrt",ao.FLOOR="floor",ao.CEIL="ceil",ao.NORMALIZE="normalize",ao.FRACT="fract",ao.SIN="sin",ao.COS="cos",ao.TAN="tan",ao.ASIN="asin",ao.ACOS="acos",ao.ATAN="atan",ao.ABS="abs",ao.SIGN="sign",ao.LENGTH="length",ao.NEGATE="negate",ao.ONE_MINUS="oneMinus",ao.DFDX="dFdx",ao.DFDY="dFdy",ao.ROUND="round",ao.RECIPROCAL="reciprocal",ao.TRUNC="trunc",ao.FWIDTH="fwidth",ao.BITCAST="bitcast",ao.TRANSPOSE="transpose",ao.ATAN2="atan2",ao.MIN="min",ao.MAX="max",ao.MOD="mod",ao.STEP="step",ao.REFLECT="reflect",ao.DISTANCE="distance",ao.DIFFERENCE="difference",ao.DOT="dot",ao.CROSS="cross",ao.POW="pow",ao.TRANSFORM_DIRECTION="transformDirection",ao.MIX="mix",ao.CLAMP="clamp",ao.REFRACT="refract",ao.SMOOTHSTEP="smoothstep",ao.FACEFORWARD="faceforward";const uo=Ci(1e-6),lo=Ci(1e6),co=Ci(Math.PI),ho=Ci(2*Math.PI),po=xi(ao,ao.ALL),go=xi(ao,ao.ANY),mo=xi(ao,ao.EQUALS),fo=xi(ao,ao.RADIANS),yo=xi(ao,ao.DEGREES),bo=xi(ao,ao.EXP),xo=xi(ao,ao.EXP2),To=xi(ao,ao.LOG),_o=xi(ao,ao.LOG2),vo=xi(ao,ao.SQRT),No=xi(ao,ao.INVERSE_SQRT),So=xi(ao,ao.FLOOR),Ao=xi(ao,ao.CEIL),Ro=xi(ao,ao.NORMALIZE),Co=xi(ao,ao.FRACT),Eo=xi(ao,ao.SIN),wo=xi(ao,ao.COS),Mo=xi(ao,ao.TAN),Bo=xi(ao,ao.ASIN),Uo=xi(ao,ao.ACOS),Fo=xi(ao,ao.ATAN),Po=xi(ao,ao.ABS),Io=xi(ao,ao.SIGN),Lo=xi(ao,ao.LENGTH),Do=xi(ao,ao.NEGATE),Vo=xi(ao,ao.ONE_MINUS),Oo=xi(ao,ao.DFDX),Go=xi(ao,ao.DFDY),ko=xi(ao,ao.ROUND),zo=xi(ao,ao.RECIPROCAL),$o=xi(ao,ao.TRUNC),Ho=xi(ao,ao.FWIDTH),Wo=xi(ao,ao.BITCAST),jo=xi(ao,ao.TRANSPOSE),qo=xi(ao,ao.ATAN2),Ko=xi(ao,ao.MIN),Xo=xi(ao,ao.MAX),Yo=xi(ao,ao.MOD),Qo=xi(ao,ao.STEP),Zo=xi(ao,ao.REFLECT),Jo=xi(ao,ao.DISTANCE),ea=xi(ao,ao.DIFFERENCE),ta=xi(ao,ao.DOT),ra=xi(ao,ao.CROSS),sa=xi(ao,ao.POW),ia=xi(ao,ao.POW,2),na=xi(ao,ao.POW,3),oa=xi(ao,ao.POW,4),aa=xi(ao,ao.TRANSFORM_DIRECTION),ua=e=>kn(Io(e),sa(Po(e),1/3)),la=e=>ta(e,e),da=xi(ao,ao.MIX),ca=(e,t=0,r=1)=>fi(new ao(ao.CLAMP,fi(e),fi(t),fi(r))),ha=e=>ca(e),pa=xi(ao,ao.REFRACT),ga=xi(ao,ao.SMOOTHSTEP),ma=xi(ao,ao.FACEFORWARD),fa=_i((([e])=>{const t=ta(e.xy,Bi(12.9898,78.233)),r=Yo(t,co);return Co(Eo(r).mul(43758.5453))})),ya=(e,t,r)=>da(t,r,e),ba=(e,t,r)=>ga(t,r,e);$s("all",po),$s("any",go),$s("equals",mo),$s("radians",fo),$s("degrees",yo),$s("exp",bo),$s("exp2",xo),$s("log",To),$s("log2",_o),$s("sqrt",vo),$s("inverseSqrt",No),$s("floor",So),$s("ceil",Ao),$s("normalize",Ro),$s("fract",Co),$s("sin",Eo),$s("cos",wo),$s("tan",Mo),$s("asin",Bo),$s("acos",Uo),$s("atan",Fo),$s("abs",Po),$s("sign",Io),$s("length",Lo),$s("lengthSq",la),$s("negate",Do),$s("oneMinus",Vo),$s("dFdx",Oo),$s("dFdy",Go),$s("round",ko),$s("reciprocal",zo),$s("trunc",$o),$s("fwidth",Ho),$s("atan2",qo),$s("min",Ko),$s("max",Xo),$s("mod",Yo),$s("step",Qo),$s("reflect",Zo),$s("distance",Jo),$s("dot",ta),$s("cross",ra),$s("pow",sa),$s("pow2",ia),$s("pow3",na),$s("pow4",oa),$s("transformDirection",aa),$s("mix",ya),$s("clamp",ca),$s("refract",pa),$s("smoothstep",ba),$s("faceForward",ma),$s("difference",ea),$s("saturate",ha),$s("cbrt",ua),$s("transpose",jo),$s("rand",fa);class xa extends Ms{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const t=this.ifNode.getNodeType(e);if(null!==this.elseNode){const r=this.elseNode.getNodeType(e);if(e.getTypeLength(r)>e.getTypeLength(t))return r}return t}setup(e){const t=this.condNode.cache(),r=this.ifNode.cache(),s=this.elseNode?this.elseNode.cache():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.getNodeProperties(this);n.condNode=t,n.ifNode=r.context({nodeBlock:r}),n.elseNode=s?s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:o}=e.getNodeProperties(this),a="void"!==t,u=a?sn(r).build(e):"";s.nodeProperty=u;const l=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${l} ) {\n\n`).addFlowTab();let d=n.build(e,r);if(d&&(d=a?u+" = "+d+";":"return "+d+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+d+"\n\n"+e.tab+"}"),null!==o){e.addFlowCode(" else {\n\n").addFlowTab();let t=o.build(e,r);t&&(t=a?u+" = "+t+";":"return "+t+";"),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(u,r,t)}}const Ta=xi(xa);$s("select",Ta);const _a=(...e)=>(console.warn("TSL.ConditionalNode: cond() has been renamed to select()."),Ta(...e));$s("cond",_a);class va extends Ms{static get type(){return"ContextNode"}constructor(e,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}analyze(e){this.node.build(e)}setup(e){const t=e.getContext();e.setContext({...e.context,...this.value});const r=this.node.build(e);return e.setContext(t),r}generate(e,t){const r=e.getContext();e.setContext({...e.context,...this.value});const s=this.node.build(e,t);return e.setContext(r),s}}const Na=xi(va),Sa=(e,t)=>Na(e,{label:t});$s("context",Na),$s("label",Sa);class Aa extends Ms{static get type(){return"VarNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r}=this,s=e.getVarFromNode(this,r,e.getVectorType(this.getNodeType(e))),i=e.getPropertyName(s),n=t.build(e,s.type);return e.addLineFlowCode(`${i} = ${n}`,this),i}}const Ra=xi(Aa);$s("toVar",((...e)=>Ra(...e).append()));const Ca=e=>(console.warn('TSL: "temp" is deprecated. Use ".toVar()" instead.'),Ra(e));$s("temp",Ca);class Ea extends Ms{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0}isGlobal(){return!0}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e);t.varying=r=e.getVaryingFromNode(this,s,i),t.node=this.node}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e)}analyze(e){return this.setupVarying(e),this.node.analyze(e)}generate(e){const t=e.getNodeProperties(this),r=this.setupVarying(e);if(void 0===t.propertyName){const s=this.getNodeType(e),i=e.getPropertyName(r,_s.VERTEX);e.flowNodeFromShaderStage(_s.VERTEX,this.node,s,i),t.propertyName=i}return e.getPropertyName(r)}}const wa=xi(Ea);$s("varying",wa);const Ma=_i((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return da(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ba=_i((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return da(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ua="WorkingColorSpace",Fa="OutputColorSpace";class Pa extends Fs{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ua?u.workingColorSpace:t===Fa?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let n=t;return!1!==u.enabled&&r!==s&&r&&s?(u.getTransfer(r)===l&&(n=Oi(Ma(n.rgb),n.a)),u.getPrimaries(r)!==u.getPrimaries(s)&&(n=Oi(Hi(u._getMatrix(new i,r,s)).mul(n.rgb),n.a)),u.getTransfer(s)===l&&(n=Oi(Ba(n.rgb),n.a)),n):n}}const Ia=e=>fi(new Pa(fi(e),Ua,Fa)),La=e=>fi(new Pa(fi(e),Fa,Ua)),Da=(e,t)=>fi(new Pa(fi(e),Ua,t)),Va=(e,t)=>fi(new Pa(fi(e),t,Ua));$s("toOutputColorSpace",Ia),$s("toWorkingColorSpace",La),$s("workingToColorSpace",Da),$s("colorSpaceToWorking",Va);let Oa=class extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class Ga extends Ms{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=vs.OBJECT}setGroup(e){return this.group=e,this}element(e){return fi(new Oa(this,fi(e)))}setNodeType(e){const t=tn(null,e).getSelf();null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new ka(e,t,r));class $a extends Fs{static get type(){return"ToneMappingNode"}constructor(e,t=Wa,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return ds(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===d)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Oi(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Ha=(e,t,r)=>fi(new $a(e,fi(t),fi(r))),Wa=za("toneMappingExposure","float");$s("toneMapping",((e,t,r)=>Ha(t,r,e)));class ja extends Os{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=c,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=this.value,s=e.getTypeLength(t),i=this.bufferStride||s,n=this.bufferOffset,o=!0===r.isInterleavedBuffer?r:new h(r,i),a=new g(o,s,n);o.setUsage(this.usage),this.attribute=a,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=wa(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}const qa=(e,t,r,s)=>fi(new ja(e,t,r,s)),Ka=(e,t,r,s)=>qa(e,t,r,s).setUsage(p),Xa=(e,t,r,s)=>qa(e,t,r,s).setInstanced(!0),Ya=(e,t,r,s)=>Ka(e,t,r,s).setInstanced(!0);$s("toAttribute",(e=>qa(e.value)));class Qa extends Ms{static get type(){return"ComputeNode"}constructor(e,t,r=[64]){super("void"),this.isComputeNode=!0,this.computeNode=e,this.count=t,this.workgroupSize=r,this.dispatchCount=0,this.version=1,this.updateBeforeType=vs.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;efi(new Qa(fi(e),t,r));$s("compute",Za);class Ja extends Ms{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){return this.node.getNodeType(e)}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}}const eu=(e,...t)=>fi(new Ja(fi(e),...t));$s("cache",eu);class tu extends Ms{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ru=xi(tu);$s("bypass",ru);class su extends Ms{static get type(){return"RemapNode"}constructor(e,t,r,s=Ci(0),i=Ci(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let o=e.sub(t).div(r.sub(t));return!0===n&&(o=o.clamp()),o.mul(i.sub(s)).add(s)}}const iu=xi(su,null,null,{doClamp:!1}),nu=xi(su);$s("remap",iu),$s("remapClamp",nu);class ou extends Ms{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(`( ${s} )`,r,t);e.addLineFlowCode(s,this)}}const au=xi(ou),uu=e=>(e?Ta(e,au("discard")):au("discard")).append();$s("discard",uu);class lu extends Fs{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this.toneMapping?this.toneMapping:e.toneMapping)||d,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||m;return r!==d&&(t=t.toneMapping(r)),s!==m&&s!==u.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const du=(e,t=null,r=null)=>fi(new lu(fi(e),t,r));$s("renderOutput",du);class cu extends Ms{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return wa(this).build(e,r)}return console.warn(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const hu=(e,t)=>fi(new cu(e,t)),pu=e=>hu("uv"+(e>0?e:""),"vec2");class gu extends Ms{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const mu=xi(gu);class fu extends en{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=vs.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const yu=xi(fu);class bu extends en{static get type(){return"TextureNode"}constructor(e,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=vs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===f?"uvec4":this.value.type===y?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return pu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=tn(this.value.matrix)),this._matrixUniform.mul(Ii(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?vs.FRAME:vs.NONE,this}setupUV(e,t){const r=this.value;return e.isFlipY()&&(r.image instanceof ImageBitmap&&!0===r.flipY||!0===r.isRenderTargetTexture||!0===r.isFramebufferTexture||!0===r.isDepthTexture)&&(t=this.sampler?t.flipY():t.setY(Ei(mu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;let r=this.uvNode;null!==r&&!0!==e.context.forceUVContext||!e.context.getUV||(r=e.context.getUV(this)),r||(r=this.getDefaultUV()),!0===this.updateMatrix&&(r=this.getTransformedUV(r)),r=this.setupUV(e,r);let s=this.levelNode;null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),t.uvNode=r,t.levelNode=s,t.biasNode=this.biasNode,t.compareNode=this.compareNode,t.gradNode=this.gradNode,t.depthNode=this.depthNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateSnippet(e,t,r,s,i,n,o,a){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):a?e.generateTextureGrad(u,t,r,a,n):o?e.generateTextureCompare(u,t,r,o,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=e.getNodeProperties(this),s=this.value;if(!s||!0!==s.isTexture)throw new Error("TextureNode: Need a three.js texture.");const i=super.generate(e,"property");if("sampler"===t)return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:s,biasNode:a,compareNode:u,depthNode:l,gradNode:d}=r,c=this.generateUV(e,t),h=s?s.build(e,"float"):null,p=a?a.build(e,"float"):null,g=l?l.build(e,"int"):null,m=u?u.build(e,"float"):null,f=d?[d[0].build(e,"vec2"),d[1].build(e,"vec2")]:null,y=e.getVarFromNode(this);o=e.getPropertyName(y);const b=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${o} = ${b}`,this),n.snippet=b,n.propertyName=o}let a=o;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(s)&&(a=Va(au(a,u),s.colorSpace).setup(e).build(e,u)),e.format(a,u,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}uv(e){return console.warn("THREE.TextureNode: .uv() has been renamed. Use .sample() instead."),this.sample(e)}sample(e){const t=this.clone();return t.uvNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}blur(e){const t=this.clone();return t.biasNode=fi(e).mul(yu(t)),t.referenceNode=this.getSelf(),fi(t)}level(e){const t=this.clone();return t.levelNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}size(e){return mu(this,e)}bias(e){const t=this.clone();return t.biasNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}compare(e){const t=this.clone();return t.compareNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}grad(e,t){const r=this.clone();return r.gradNode=[fi(e),fi(t)],r.referenceNode=this.getSelf(),fi(r)}depth(e){const t=this.clone();return t.depthNode=fi(e),t.referenceNode=this.getSelf(),fi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix()}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e}}const xu=xi(bu),Tu=(...e)=>xu(...e).setSampler(!1),_u=tn("float").label("cameraNear").setGroup(Zi).onRenderUpdate((({camera:e})=>e.near)),vu=tn("float").label("cameraFar").setGroup(Zi).onRenderUpdate((({camera:e})=>e.far)),Nu=tn("mat4").label("cameraProjectionMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrix)),Su=tn("mat4").label("cameraProjectionMatrixInverse").setGroup(Zi).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse)),Au=tn("mat4").label("cameraViewMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorldInverse)),Ru=tn("mat4").label("cameraWorldMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.matrixWorld)),Cu=tn("mat3").label("cameraNormalMatrix").setGroup(Zi).onRenderUpdate((({camera:e})=>e.normalMatrix)),Eu=tn(new r).label("cameraPosition").setGroup(Zi).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld)));class wu extends Ms{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=vs.OBJECT,this._uniformNode=new en(null)}getNodeType(){const e=this.scope;return e===wu.WORLD_MATRIX?"mat4":e===wu.POSITION||e===wu.VIEW_POSITION||e===wu.DIRECTION||e===wu.SCALE?"vec3":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===wu.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===wu.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===wu.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===wu.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===wu.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}}generate(e){const t=this.scope;return t===wu.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t!==wu.POSITION&&t!==wu.VIEW_POSITION&&t!==wu.DIRECTION&&t!==wu.SCALE||(this._uniformNode.nodeType="vec3"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}wu.WORLD_MATRIX="worldMatrix",wu.POSITION="position",wu.SCALE="scale",wu.VIEW_POSITION="viewPosition",wu.DIRECTION="direction";const Mu=xi(wu,wu.DIRECTION),Bu=xi(wu,wu.WORLD_MATRIX),Uu=xi(wu,wu.POSITION),Fu=xi(wu,wu.SCALE),Pu=xi(wu,wu.VIEW_POSITION);class Iu extends wu{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Lu=Ti(Iu,Iu.DIRECTION),Du=Ti(Iu,Iu.WORLD_MATRIX),Vu=Ti(Iu,Iu.POSITION),Ou=Ti(Iu,Iu.SCALE),Gu=Ti(Iu,Iu.VIEW_POSITION),ku=tn(new i).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),zu=tn(new n).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),$u=Au.mul(Du).toVar("modelViewMatrix"),Hu=_i((e=>(e.context.isHighPrecisionModelViewMatrix=!0,tn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highPrecisionModelViewMatrix"),Wu=_i((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return tn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highPrecisionModelNormalMatrix"),ju=hu("position","vec3"),qu=ju.varying("positionLocal"),Ku=ju.varying("positionPrevious"),Xu=Du.mul(qu).xyz.varying("v_positionWorld"),Yu=qu.transformDirection(Du).varying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),Qu=$u.mul(qu).xyz.varying("v_positionView"),Zu=Qu.negate().varying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Ju extends Ms{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===b&&r.side===x?"false":e.getFrontFacing()}}const el=Ti(Ju),tl=Ci(el).mul(2).sub(1),rl=hu("normal","vec3"),sl=_i((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('TSL.NormalNode: Vertex attribute "normal" not found on geometry.'),Ii(0,1,0)):rl),"vec3").once()().toVar("normalLocal"),il=Qu.dFdx().cross(Qu.dFdy()).normalize().toVar("normalFlat"),nl=_i((e=>{let t;return t=!0===e.material.flatShading?il:wa(cl(sl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),ol=wa(nl.transformDirection(Au),"v_normalWorld").normalize().toVar("normalWorld"),al=_i((e=>e.context.setupNormal()),"vec3").once()().mul(tl).toVar("transformedNormalView"),ul=al.transformDirection(Au).toVar("transformedNormalWorld"),ll=_i((e=>e.context.setupClearcoatNormal()),"vec3").once()().mul(tl).toVar("transformedClearcoatNormalView"),dl=_i((([e,t=Du])=>{const r=Hi(t),s=e.div(Ii(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),cl=_i((([e],t)=>{const r=t.renderer.nodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=ku.mul(e);return Au.transformDirection(s)})),hl=tn(0).onReference((({material:e})=>e)).onRenderUpdate((({material:e})=>e.refractionRatio)),pl=Zu.negate().reflect(al),gl=Zu.negate().refract(al,hl),ml=pl.transformDirection(Au).toVar("reflectVector"),fl=gl.transformDirection(Au).toVar("reflectVector");class yl extends bu{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===T?ml:e.mapping===_?fl:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Ii(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==v&&r.isRenderTargetTexture?t:Ii(t.x.negate(),t.yz)}generateUV(e,t){return t.build(e,"vec3")}}const bl=xi(yl);class xl extends en{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Tl=(e,t,r)=>fi(new xl(e,t,r));class _l extends Bs{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class vl extends xl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?fs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=vs.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rfi(new vl(e,t));class Sl extends Bs{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class Al extends Ms{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=vs.OBJECT}element(e){return fi(new Sl(this,fi(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Tl(null,e,this.count):Array.isArray(this.getValueFromReference())?Nl(null,e):"texture"===e?xu(null):"cubeTexture"===e?bl(null):tn(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.label(this.name),this.node=t.getSelf()}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;efi(new Al(e,t,r)),Cl=(e,t,r,s)=>fi(new Al(e,t,s,r));class El extends Al{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const wl=(e,t,r)=>fi(new El(e,t,r)),Ml=_i((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),hu("tangent","vec4"))))(),Bl=Ml.xyz.toVar("tangentLocal"),Ul=$u.mul(Oi(Bl,0)).xyz.varying("v_tangentView").normalize().toVar("tangentView"),Fl=Ul.transformDirection(Au).varying("v_tangentWorld").normalize().toVar("tangentWorld"),Pl=Ul.toVar("transformedTangentView"),Il=Pl.transformDirection(Au).normalize().toVar("transformedTangentWorld"),Ll=e=>e.mul(Ml.w).xyz,Dl=wa(Ll(rl.cross(Ml)),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Vl=wa(Ll(sl.cross(Bl)),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Ol=wa(Ll(nl.cross(Ul)),"v_bitangentView").normalize().toVar("bitangentView"),Gl=wa(Ll(ol.cross(Fl)),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kl=Ll(al.cross(Pl)).normalize().toVar("transformedBitangentView"),zl=kl.transformDirection(Au).normalize().toVar("transformedBitangentWorld"),$l=Hi(Ul,Ol,nl),Hl=Zu.mul($l),Wl=(()=>{let e=Tn.cross(Zu);return e=e.cross(Tn).normalize(),e=da(e,al,bn.mul(un.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),jl=_i((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),o=t.dFdy(),a=i.dFdx(),u=i.dFdy(),l=r,d=o.cross(l),c=l.cross(n),h=d.mul(a.x).add(c.mul(u.x)),p=d.mul(a.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=tl.mul(g.inverseSqrt());return On(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class ql extends Fs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=N}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Ii(s.xy.mul(r),s.z));let i=null;if(t===S)i=cl(s);else if(t===N){i=!0===e.hasGeometryAttribute("tangent")?$l.mul(s).normalize():jl({eye_pos:Qu,surf_norm:nl,mapN:s,uv:pu()})}return i}}const Kl=xi(ql),Xl=_i((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||pu()),forceUVContext:!0}),s=Ci(r((e=>e)));return Bi(Ci(r((e=>e.add(e.dFdx())))).sub(s),Ci(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Yl=_i((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,o=t.dFdy().normalize().cross(n),a=n.cross(i),u=i.dot(o).mul(tl),l=u.sign().mul(s.x.mul(o).add(s.y.mul(a)));return u.abs().mul(r).sub(l).normalize()}));class Ql extends Fs{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Xl({textureNode:this.textureNode,bumpScale:e});return Yl({surf_pos:Qu,surf_norm:nl,dHdxy:t})}}const Zl=xi(Ql),Jl=new Map;class ed extends Ms{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Jl.get(e);return void 0===r&&(r=wl(e,t),Jl.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===ed.COLOR){const e=void 0!==t.color?this.getColor(r):Ii();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===ed.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===ed.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Ci(1);else if(r===ed.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularMap?e.mul(this.getTexture(r).a):e}else if(r===ed.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===ed.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===ed.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===ed.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===ed.NORMAL)t.normalMap?(s=Kl(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Zl(this.getTexture("bump").r,this.getFloat("bumpScale")):nl;else if(r===ed.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===ed.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kl(this.getTexture(r),this.getCache(r+"Scale","vec2")):nl;else if(r===ed.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===ed.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(.07,1)}else if(r===ed.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=$i(Vd.x,Vd.y,Vd.y.negate(),Vd.x).mul(e.rg.mul(2).sub(Bi(1)).normalize().mul(e.b))}else s=Vd;else if(r===ed.IRIDESCENCE_THICKNESS){const e=Rl("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=Rl("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===ed.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===ed.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===ed.IOR)s=this.getFloat(r);else if(r===ed.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===ed.AO_MAP)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}ed.ALPHA_TEST="alphaTest",ed.COLOR="color",ed.OPACITY="opacity",ed.SHININESS="shininess",ed.SPECULAR="specular",ed.SPECULAR_STRENGTH="specularStrength",ed.SPECULAR_INTENSITY="specularIntensity",ed.SPECULAR_COLOR="specularColor",ed.REFLECTIVITY="reflectivity",ed.ROUGHNESS="roughness",ed.METALNESS="metalness",ed.NORMAL="normal",ed.CLEARCOAT="clearcoat",ed.CLEARCOAT_ROUGHNESS="clearcoatRoughness",ed.CLEARCOAT_NORMAL="clearcoatNormal",ed.EMISSIVE="emissive",ed.ROTATION="rotation",ed.SHEEN="sheen",ed.SHEEN_ROUGHNESS="sheenRoughness",ed.ANISOTROPY="anisotropy",ed.IRIDESCENCE="iridescence",ed.IRIDESCENCE_IOR="iridescenceIOR",ed.IRIDESCENCE_THICKNESS="iridescenceThickness",ed.IOR="ior",ed.TRANSMISSION="transmission",ed.THICKNESS="thickness",ed.ATTENUATION_DISTANCE="attenuationDistance",ed.ATTENUATION_COLOR="attenuationColor",ed.LINE_SCALE="scale",ed.LINE_DASH_SIZE="dashSize",ed.LINE_GAP_SIZE="gapSize",ed.LINE_WIDTH="linewidth",ed.LINE_DASH_OFFSET="dashOffset",ed.POINT_WIDTH="pointWidth",ed.DISPERSION="dispersion",ed.LIGHT_MAP="light",ed.AO_MAP="ao";const td=Ti(ed,ed.ALPHA_TEST),rd=Ti(ed,ed.COLOR),sd=Ti(ed,ed.SHININESS),id=Ti(ed,ed.EMISSIVE),nd=Ti(ed,ed.OPACITY),od=Ti(ed,ed.SPECULAR),ad=Ti(ed,ed.SPECULAR_INTENSITY),ud=Ti(ed,ed.SPECULAR_COLOR),ld=Ti(ed,ed.SPECULAR_STRENGTH),dd=Ti(ed,ed.REFLECTIVITY),cd=Ti(ed,ed.ROUGHNESS),hd=Ti(ed,ed.METALNESS),pd=Ti(ed,ed.NORMAL).context({getUV:null}),gd=Ti(ed,ed.CLEARCOAT),md=Ti(ed,ed.CLEARCOAT_ROUGHNESS),fd=Ti(ed,ed.CLEARCOAT_NORMAL).context({getUV:null}),yd=Ti(ed,ed.ROTATION),bd=Ti(ed,ed.SHEEN),xd=Ti(ed,ed.SHEEN_ROUGHNESS),Td=Ti(ed,ed.ANISOTROPY),_d=Ti(ed,ed.IRIDESCENCE),vd=Ti(ed,ed.IRIDESCENCE_IOR),Nd=Ti(ed,ed.IRIDESCENCE_THICKNESS),Sd=Ti(ed,ed.TRANSMISSION),Ad=Ti(ed,ed.THICKNESS),Rd=Ti(ed,ed.IOR),Cd=Ti(ed,ed.ATTENUATION_DISTANCE),Ed=Ti(ed,ed.ATTENUATION_COLOR),wd=Ti(ed,ed.LINE_SCALE),Md=Ti(ed,ed.LINE_DASH_SIZE),Bd=Ti(ed,ed.LINE_GAP_SIZE),Ud=Ti(ed,ed.LINE_WIDTH),Fd=Ti(ed,ed.LINE_DASH_OFFSET),Pd=Ti(ed,ed.POINT_WIDTH),Id=Ti(ed,ed.DISPERSION),Ld=Ti(ed,ed.LIGHT_MAP),Dd=Ti(ed,ed.AO_MAP),Vd=tn(new t).onReference((function(e){return e.material})).onRenderUpdate((function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}));class Od extends Fs{static get type(){return"ModelViewProjectionNode"}constructor(e=null){super("vec4"),this.positionNode=e}setup(e){if("fragment"===e.shaderStage)return wa(e.context.mvp);const t=this.positionNode||qu,r=e.renderer.nodes.modelViewMatrix||$u;return Nu.mul(r).mul(t)}}const Gd=xi(Od);class kd extends Ms{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===kd.VERTEX)s=e.getVertexIndex();else if(r===kd.INSTANCE)s=e.getInstanceIndex();else if(r===kd.DRAW)s=e.getDrawIndex();else if(r===kd.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===kd.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==kd.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=wa(this).build(e,t)}return i}}kd.VERTEX="vertex",kd.INSTANCE="instance",kd.SUBGROUP="subgroup",kd.INVOCATION_LOCAL="invocationLocal",kd.INVOCATION_SUBGROUP="invocationSubgroup",kd.DRAW="draw";const zd=Ti(kd,kd.VERTEX),$d=Ti(kd,kd.INSTANCE),Hd=Ti(kd,kd.SUBGROUP),Wd=Ti(kd,kd.INVOCATION_SUBGROUP),jd=Ti(kd,kd.INVOCATION_LOCAL),qd=Ti(kd,kd.DRAW);class Kd extends Ms{static get type(){return"InstanceNode"}constructor(e,t,r){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=vs.FRAME,this.buffer=null,this.bufferColor=null}setup(e){const{count:t,instanceMatrix:r,instanceColor:s}=this;let{instanceMatrixNode:i,instanceColorNode:n}=this;if(null===i){if(t<=1e3)i=Tl(r.array,"mat4",Math.max(t,1)).element($d);else{const e=new A(r.array,16,1);this.buffer=e;const t=r.usage===p?Ya:Xa,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=Wi(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new R(s.array,3),t=s.usage===p?Ya:Xa;this.bufferColor=e,n=Ii(t(e,"vec3",3,0)),this.instanceColorNode=n}const o=i.mul(qu).xyz;if(qu.assign(o),e.hasGeometryAttribute("normal")){const e=dl(sl,i);sl.assign(e)}null!==this.instanceColorNode&&nn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==p&&null!=this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==p&&null!=this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Xd=xi(Kd);class Yd extends Kd{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instanceMesh=e}}const Qd=xi(Yd);class Zd extends Ms{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=$d:this.batchingIdNode=qd);const t=_i((([e])=>{const t=mu(Tu(this.batchMesh._indirectTexture),0),r=Ei(e).modInt(Ei(t)),s=Ei(e).div(Ei(t));return Tu(this.batchMesh._indirectTexture,Ui(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Ei(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mu(Tu(s),0),n=Ci(r).mul(4).toInt().toVar(),o=n.modInt(i),a=n.div(Ei(i)),u=Wi(Tu(s,Ui(o,a)),Tu(s,Ui(o.add(1),a)),Tu(s,Ui(o.add(2),a)),Tu(s,Ui(o.add(3),a))),l=this.batchMesh._colorsTexture;if(null!==l){const e=_i((([e])=>{const t=mu(Tu(l),0).x,r=e,s=r.modInt(t),i=r.div(t);return Tu(l,Ui(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);nn("vec3","vBatchColor").assign(t)}const d=Hi(u);qu.assign(u.mul(qu));const c=sl.div(Ii(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;sl.assign(h),e.hasGeometryAttribute("tangent")&&Bl.mulAssign(d)}}const Jd=xi(Zd),ec=new WeakMap;class tc extends Ms{static get type(){return"SkinningNode"}constructor(e,t=!1){let r,s,i;super("void"),this.skinnedMesh=e,this.useReference=t,this.updateType=vs.OBJECT,this.skinIndexNode=hu("skinIndex","uvec4"),this.skinWeightNode=hu("skinWeight","vec4"),t?(r=Rl("bindMatrix","mat4"),s=Rl("bindMatrixInverse","mat4"),i=Cl("skeleton.boneMatrices","mat4",e.skeleton.bones.length)):(r=tn(e.bindMatrix,"mat4"),s=tn(e.bindMatrixInverse,"mat4"),i=Tl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length)),this.bindMatrixNode=r,this.bindMatrixInverseNode=s,this.boneMatricesNode=i,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=qu){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=On(o.mul(s.x).mul(d),a.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormal(e=this.boneMatricesNode,t=sl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,o=e.element(r.x),a=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=On(s.x.mul(o),s.y.mul(a),s.z.mul(u),s.w.mul(l));return d=n.mul(d).mul(i),d.transformDirection(t).xyz}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=Cl("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ku)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")}setup(e){this.needsPreviousBoneMatrices(e)&&Ku.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(qu.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();sl.assign(t),e.hasGeometryAttribute("tangent")&&Bl.assign(t)}}generate(e,t){if("void"!==t)return qu.build(e,t)}update(e){const t=(this.useReference?e.object:this.skinnedMesh).skeleton;ec.get(t)!==e.frameId&&(ec.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const rc=e=>fi(new tc(e,!0));class sc extends Ms{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt()+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(n)?">=":"<"));const d={start:i,end:n,condition:u},c=d.start,h=d.end;let p="",g="",m="";l||(l="int"===a||"uint"===a?u.includes("<")?"++":"--":u.includes("<")?"+= 1.":"-= 1."),p+=e.getVar(a,o)+" = "+c,g+=o+" "+u+" "+h,m+=o+" "+l;const f=`for ( ${p}; ${g}; ${m} )`;e.addFlowCode((0===t?"\n":"")+e.tab+f+" {\n\n").addFlowTab()}const i=s.build(e,"void"),n=t.returnsNode?t.returnsNode.build(e):"";e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tfi(new sc(bi(e,"int"))).append(),nc=()=>au("break").append(),oc=new WeakMap,ac=new s,uc=_i((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const o=Ei(zd).mul(r).add(n),a=o.div(s),u=o.sub(a.mul(s));return Tu(e,Ui(u,a)).depth(i).mul(t)}));class lc extends Ms{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=tn(1),this.updateType=vs.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,o=void 0!==n?n.length:0,{texture:a,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,o=void 0!==n?n.length:0;let a=oc.get(e);if(void 0===a||a.count!==o){void 0!==a&&a.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*o),f=new C(m,h,p,o);f.type=E,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=Ci(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Tu(this.mesh.morphTexture,Ui(Ei(e).add(1),Ei($d))).r):t.assign(Rl("morphTargetInfluences","float").element(e).toVar()),!0===s&&qu.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(0)})),!0===i&&sl.addAssign(uc({bufferMap:a,influence:t,stride:u,width:d,depth:e,offset:Ei(1)}))}))}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce(((e,t)=>e+t),0)}}const dc=xi(lc);class cc extends Ms{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}generate(){console.warn("Abstract function.")}}class hc extends cc{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class pc extends va{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:Ii().toVar("directDiffuse"),directSpecular:Ii().toVar("directSpecular"),indirectDiffuse:Ii().toVar("indirectDiffuse"),indirectSpecular:Ii().toVar("indirectSpecular")};return{radiance:Ii().toVar("radiance"),irradiance:Ii().toVar("irradiance"),iblIrradiance:Ii().toVar("iblIrradiance"),ambientOcclusion:Ci(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const gc=xi(pc);class mc extends cc{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let fc,yc;class bc extends Ms{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===bc.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=vs.NONE;return this.scope!==bc.SIZE&&this.scope!==bc.VIEWPORT||(e=vs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===bc.VIEWPORT?null!==t?yc.copy(t.viewport):(e.getViewport(yc),yc.multiplyScalar(e.getPixelRatio())):null!==t?(fc.width=t.width,fc.height=t.height):e.getDrawingBufferSize(fc)}setup(){const e=this.scope;let r=null;return r=e===bc.SIZE?tn(fc||(fc=new t)):e===bc.VIEWPORT?tn(yc||(yc=new s)):Bi(_c.div(Tc)),r}generate(e){if(this.scope===bc.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Tc).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}bc.COORDINATE="coordinate",bc.VIEWPORT="viewport",bc.SIZE="size",bc.UV="uv";const xc=Ti(bc,bc.UV),Tc=Ti(bc,bc.SIZE),_c=Ti(bc,bc.COORDINATE),vc=Ti(bc,bc.VIEWPORT),Nc=vc.zw,Sc=_c.sub(vc.xy),Ac=Sc.div(Nc),Rc=_i((()=>(console.warn('TSL.ViewportNode: "viewportResolution" is deprecated. Use "screenSize" instead.'),Tc)),"vec2").once()(),Cc=_i((()=>(console.warn('TSL.ViewportNode: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),xc)),"vec2").once()(),Ec=_i((()=>(console.warn('TSL.ViewportNode: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),xc.flipY())),"vec2").once()(),wc=new t;class Mc extends bu{static get type(){return"ViewportTextureNode"}constructor(e=xc,t=null,r=null){null===r&&((r=new w).minFilter=M),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=vs.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(wc);const r=this.value;r.image.width===wc.width&&r.image.height===wc.height||(r.image.width=wc.width,r.image.height=wc.height,r.needsUpdate=!0);const s=r.generateMipmaps;r.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(r),r.generateMipmaps=s}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const Bc=xi(Mc),Uc=xi(Mc,null,null,{generateMipmaps:!0});let Fc=null;class Pc extends Mc{static get type(){return"ViewportDepthTextureNode"}constructor(e=xc,t=null){null===Fc&&(Fc=new B),super(e,t,Fc)}}const Ic=xi(Pc);class Lc extends Ms{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Lc.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Lc.DEPTH_BASE)null!==r&&(s=kc().assign(r));else if(t===Lc.DEPTH)s=e.isPerspectiveCamera?Vc(Qu.z,_u,vu):Dc(Qu.z,_u,vu);else if(t===Lc.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Oc(r,_u,vu);s=Dc(e,_u,vu)}else s=r;else s=Dc(Qu.z,_u,vu);return s}}Lc.DEPTH_BASE="depthBase",Lc.DEPTH="depth",Lc.LINEAR_DEPTH="linearDepth";const Dc=(e,t,r)=>e.add(t).div(t.sub(r)),Vc=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Oc=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Gc=(e,t,r)=>{t=t.max(1e-6).toVar();const s=_o(e.negate().div(t)),i=_o(r.div(t));return s.div(i)},kc=xi(Lc,Lc.DEPTH_BASE),zc=Ti(Lc,Lc.DEPTH),$c=xi(Lc,Lc.LINEAR_DEPTH),Hc=$c(Ic());zc.assign=e=>kc(e);const Wc=xi(class extends Ms{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}});class jc extends Ms{static get type(){return"ClippingNode"}constructor(e=jc.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===jc.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===jc.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return _i((()=>{const r=Ci().toVar("distanceToPlane"),s=Ci().toVar("distanceToGradient"),i=Ci(1).toVar("clipOpacity"),n=t.length;if(!this.hardwareClipping&&n>0){const e=Nl(t);ic(n,(({i:t})=>{const n=e.element(t);r.assign(Qu.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ga(s.negate(),s,r))}))}const o=e.length;if(o>0){const t=Nl(e),n=Ci(1).toVar("intersectionClipOpacity");ic(o,(({i:e})=>{const i=t.element(e);r.assign(Qu.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ga(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}on.a.mulAssign(i),on.a.equal(0).discard()}))()}setupDefault(e,t){return _i((()=>{const r=t.length;if(!this.hardwareClipping&&r>0){const e=Nl(t);ic(r,(({i:t})=>{const r=e.element(t);Qu.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=Nl(e),r=Mi(!0).toVar("clipped");ic(s,(({i:e})=>{const s=t.element(e);r.assign(Qu.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),_i((()=>{const s=Nl(e),i=Wc(t.getClipDistance());ic(r,(({i:e})=>{const t=s.element(e),r=Qu.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}jc.ALPHA_TO_COVERAGE="alphaToCoverage",jc.DEFAULT="default",jc.HARDWARE="hardware";const qc=_i((([e])=>Co(kn(1e4,Eo(kn(17,e.x).add(kn(.1,e.y)))).mul(On(.1,Po(Eo(kn(13,e.y).add(e.x)))))))),Kc=_i((([e])=>qc(Bi(qc(e.xy),e.z)))),Xc=_i((([e])=>{const t=Xo(Lo(Oo(e.xyz)),Lo(Go(e.xyz))),r=Ci(1).div(Ci(.05).mul(t)).toVar("pixScale"),s=Bi(xo(So(_o(r))),xo(Ao(_o(r)))),i=Bi(Kc(So(s.x.mul(e.xyz))),Kc(So(s.y.mul(e.xyz)))),n=Co(_o(r)),o=On(kn(n.oneMinus(),i.x),kn(n,i.y)),a=Ko(n,n.oneMinus()),u=Ii(o.mul(o).div(kn(2,a).mul(Gn(1,a))),o.sub(kn(.5,a)).div(Gn(1,a)),Gn(1,Gn(1,o).mul(Gn(1,o)).div(kn(2,a).mul(Gn(1,a))))),l=o.lessThan(a.oneMinus()).select(o.lessThan(a).select(u.x,u.y),u.z);return ca(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Yc extends U{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.forceSinglePass=!1,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.shadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null}customProgramCacheKey(){return this.type+cs(this)}build(e){this.setup(e)}setupObserver(e){return new os(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e);const t=e.renderer,r=t.getRenderTarget();let s;e.addStack(),e.stack.outputNode=this.vertexNode||this.setupPosition(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const i=this.setupClipping(e);if(!0===this.depthWrite&&(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const n=this.setupLighting(e);null!==i&&e.stack.add(i);const o=Oi(n,on.a).max(0);if(s=this.setupOutput(e,o),Sn.assign(s),null!==this.outputNode&&(s=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(s=e,null!==r&&(s=e.merge(r))):null!==r&&(s=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Oi(t)),s=this.setupOutput(e,t)}e.stack.outputNode=s,e.addFlow("fragment",e.removeStack()),e.monitor=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.samples;this.alphaToCoverage&&t>1?s=fi(new jc(jc.ALPHA_TO_COVERAGE)):e.stack.add(fi(new jc))}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.add(fi(new jc(jc.HARDWARE))),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Gc(Qu.z,_u,vu):Dc(Qu.z,_u,vu))}null!==s&&zc.assign(s).append()}setupPosition(e){const{object:t}=e,r=t.geometry;if(e.addStack(),(r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&dc(t).append(),!0===t.isSkinnedMesh&&rc(t).append(),this.displacementMap){const e=wl("displacementMap","texture"),t=wl("displacementScale","float"),r=wl("displacementBias","float");qu.addAssign(sl.normalize().mul(e.x.mul(t).add(r)))}t.isBatchedMesh&&Jd(t).append(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Qd(t).append(),null!==this.positionNode&&qu.assign(this.positionNode),this.setupHardwareClipping(e);const s=Gd();return e.context.vertex=e.removeStack(),e.context.mvp=s,s}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?Oi(this.colorNode):rd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=Oi(r.xyz.mul(hu("color","vec3")),r.a)),e.instanceColor){r=nn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=nn("vec3","vBatchColor").mul(r)}on.assign(r);const s=this.opacityNode?Ci(this.opacityNode):nd;if(on.a.assign(on.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Ci(this.alphaTestNode):td;on.a.lessThanEqual(e).discard()}!0===this.alphaHash&&on.a.lessThan(Xc(qu)).discard(),!1===this.transparent&&this.blending===F&&!1===this.alphaToCoverage&&on.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Ii(0):on.rgb}setupNormal(){return this.normalNode?Ii(this.normalNode):pd}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?wl("envMap","cubeTexture"):wl("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new mc(Ld)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);if(s&&s.isLightingNode&&t.push(s),null!==this.aoNode||e.material.aoMap){const e=null!==this.aoNode?this.aoNode:Dd;t.push(new hc(e))}let i=this.lightsNode||e.lightsNode;return t.length>0&&(i=e.renderer.lighting.createNode([...i.getLights(),...t])),i}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let o=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e);o=gc(n,t,r,s)}else null!==r&&(o=Ii(null!==s?da(o,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(an.assign(Ii(i||id)),o=o.add(an)),o}setupOutput(e,t){if(!0===this.fog){const r=e.fogNode;r&&(t=Oi(r.mix(t.rgb,r.colorNode),t.a))}return t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=U.prototype.toJSON.call(this,e),s=hs(this);r.inputNodes={};for(const{property:t,childNode:i}of s)r.inputNodes[t]=i.toJSON(e).uuid;function i(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=i(e.textures),s=i(e.images),n=i(e.nodes);t.length>0&&(r.textures=t),s.length>0&&(r.images=s),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.shadowPositionNode=e.shadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,super.copy(e)}}const Qc=new P;class Zc extends Yc{static get type(){return"InstancedPointsNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.pointWidth=1,this.pointColorNode=null,this.pointWidthNode=null,this.setDefaultValues(Qc),this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor;this.vertexNode=_i((()=>{const e=hu("instancePosition").xyz,t=Oi($u.mul(Oi(e,1))),r=vc.z.div(vc.w),s=Nu.mul(t),i=ju.xy.toVar();return i.mulAssign(this.pointWidthNode?this.pointWidthNode:Pd),i.assign(i.div(vc.z)),i.y.assign(i.y.mul(r)),i.assign(i.mul(s.w)),s.addAssign(Oi(i,0,0)),s}))(),this.fragmentNode=_i((()=>{const s=Ci(1).toVar(),i=la(pu().mul(2).sub(1));if(t&&e.samples>1){const e=Ci(i.fwidth()).toVar();s.assign(ga(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();let n;if(this.pointColorNode)n=this.pointColorNode;else if(r){n=hu("instanceColor").mul(rd)}else n=rd;return s.mulAssign(nd),Oi(n,s)}))()}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const Jc=new I;class eh extends Yc{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.lights=!1,this.setDefaultValues(Jc),this.setValues(e)}}const th=new L;class rh extends Yc{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.lights=!1,this.setDefaultValues(th),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Ci(this.offsetNodeNode):Fd,t=this.dashScaleNode?Ci(this.dashScaleNode):wd,r=this.dashSizeNode?Ci(this.dashSizeNode):Md,s=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(r),Rn.assign(s);const i=wa(hu("lineDistance").mul(t));(e?i.add(e):i).mod(An.add(Rn)).greaterThan(An).discard()}}let sh=null;class ih extends Mc{static get type(){return"ViewportSharedTextureNode"}constructor(e=xc,t=null){null===sh&&(sh=new w),super(e,t,sh)}updateReference(){return this}}const nh=xi(ih),oh=new L;class ah extends Yc{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.lights=!1,this.setDefaultValues(oh),this.useAlphaToCoverage=!0,this.useColor=e.vertexColors,this.useDash=e.dashed,this.useWorldUnits=!1,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=D,this.setValues(e)}setup(e){this.setupShaders(e),super.setup(e)}setupShaders({renderer:e}){const t=this.alphaToCoverage,r=this.useColor,s=this.dashed,i=this.worldUnits,n=_i((({start:e,end:t})=>{const r=Nu.element(2).element(2),s=Nu.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Oi(da(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=_i((()=>{const e=hu("instanceStart"),t=hu("instanceEnd"),r=Oi($u.mul(Oi(e,1))).toVar("start"),o=Oi($u.mul(Oi(t,1))).toVar("end");if(s){const e=this.dashScaleNode?Ci(this.dashScaleNode):wd,t=this.offsetNode?Ci(this.offsetNodeNode):Fd,r=hu("instanceDistanceStart"),s=hu("instanceDistanceEnd");let i=ju.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),nn("float","lineDistance").assign(i)}i&&(nn("vec3","worldStart").assign(r.xyz),nn("vec3","worldEnd").assign(o.xyz));const a=vc.z.div(vc.w),u=Nu.element(2).element(3).equal(-1);Si(u,(()=>{Si(r.z.lessThan(0).and(o.z.greaterThan(0)),(()=>{o.assign(n({start:r,end:o}))})).ElseIf(o.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(n({start:o,end:r}))}))}));const l=Nu.mul(r),d=Nu.mul(o),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(a)),p.assign(p.normalize());const g=Oi().toVar();if(i){const e=o.xyz.sub(r.xyz).normalize(),t=da(r.xyz,o.xyz,.5).normalize(),i=e.cross(t).normalize(),n=e.cross(i),a=nn("vec4","worldPos");a.assign(ju.y.lessThan(.5).select(r,o));const u=Ud.mul(.5);a.addAssign(Oi(ju.x.lessThan(0).select(i.mul(u),i.mul(u).negate()),0)),s||(a.addAssign(Oi(ju.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),a.addAssign(Oi(n.mul(u),0)),Si(ju.y.greaterThan(1).or(ju.y.lessThan(0)),(()=>{a.subAssign(Oi(n.mul(2).mul(u),0))}))),g.assign(Nu.mul(a));const l=Ii().toVar();l.assign(ju.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Bi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(a)),e.x.assign(e.x.div(a)),e.assign(ju.x.lessThan(0).select(e.negate(),e)),Si(ju.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(ju.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(Ud)),e.assign(e.div(vc.w)),g.assign(ju.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Oi(e,0,0)))}return g}))();const o=_i((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),o=t.sub(e),a=i.dot(n),u=n.dot(o),l=i.dot(o),d=n.dot(n),c=o.dot(o).mul(d).sub(u.mul(u)),h=a.mul(u).sub(l.mul(d)).div(c).clamp(),p=a.add(u.mul(h)).div(d).clamp();return Bi(h,p)}));if(this.colorNode=_i((()=>{const n=pu();if(s){const e=this.dashSizeNode?Ci(this.dashSizeNode):Md,t=this.dashSizeNode?Ci(this.dashGapNode):Bd;An.assign(e),Rn.assign(t);const r=nn("float","lineDistance");n.y.lessThan(-1).or(n.y.greaterThan(1)).discard(),r.mod(An.add(Rn)).greaterThan(An).discard()}const a=Ci(1).toVar("alpha");if(i){const r=nn("vec3","worldStart"),i=nn("vec3","worldEnd"),n=nn("vec4","worldPos").xyz.normalize().mul(1e5),u=i.sub(r),l=o({p1:r,p2:i,p3:Ii(0,0,0),p4:n}),d=r.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Ud);if(!s)if(t&&e.samples>1){const e=h.fwidth();a.assign(ga(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(t&&e.samples>1){const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1)),r=e.mul(e).add(t.mul(t)),s=Ci(r.fwidth()).toVar("dlen");Si(n.y.abs().greaterThan(1),(()=>{a.assign(ga(s.oneMinus(),s.add(1),r).oneMinus())}))}else Si(n.y.abs().greaterThan(1),(()=>{const e=n.x,t=n.y.greaterThan(0).select(n.y.sub(1),n.y.add(1));e.mul(e).add(t.mul(t)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(r){const e=hu("instanceColorStart"),t=hu("instanceColorEnd");u=ju.y.lessThan(.5).select(e,t).mul(rd)}else u=rd;return Oi(u,a)}))(),this.transparent){const e=this.opacityNode?Ci(this.opacityNode):nd;this.outputNode=Oi(this.colorNode.rgb.mul(e).add(nh().rgb.mul(e.oneMinus())),this.colorNode.a)}}get worldUnits(){return this.useWorldUnits}set worldUnits(e){this.useWorldUnits!==e&&(this.useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this.useDash}set dashed(e){this.useDash!==e&&(this.useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this.useAlphaToCoverage}set alphaToCoverage(e){this.useAlphaToCoverage!==e&&(this.useAlphaToCoverage=e,this.needsUpdate=!0)}}const uh=e=>fi(e).mul(.5).add(.5),lh=new V;class dh extends Yc{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(lh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Ci(this.opacityNode):nd;on.assign(Oi(uh(al),e))}}class ch extends Fs{static get type(){return"EquirectUVNode"}constructor(e=Yu){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan2(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Bi(t,r)}}const hh=xi(ch);class ph extends O{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new G(5,5,5),n=hh(Yu),o=new Yc;o.colorNode=xu(t,n,0),o.side=x,o.blending=D;const a=new k(i,o),u=new z;u.add(a),t.minFilter===M&&(t.minFilter=$);const l=new H(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,a.geometry.dispose(),a.material.dispose(),this}}const gh=new WeakMap;class mh extends Fs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=bl();const t=new W;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=vs.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===j||r===q){if(gh.has(e)){const t=gh.get(e);yh(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ph(r.height);s.fromEquirectangularTexture(t,e),yh(s.texture,e.mapping),this._cubeTexture=s.texture,gh.set(e,s.texture),e.addEventListener("dispose",fh)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function fh(e){const t=e.target;t.removeEventListener("dispose",fh);const r=gh.get(t);void 0!==r&&(gh.delete(t),r.dispose())}function yh(e,t){t===j?e.mapping=T:t===q&&(e.mapping=_)}const bh=xi(mh);class xh extends cc{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=bh(this.envNode)}}class Th extends cc{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Ci(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class _h{start(){}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class vh extends _h{constructor(){super()}indirect(e,t,r){const s=e.ambientOcclusion,i=e.reflectedLight,n=r.context.irradianceLightMap;i.indirectDiffuse.assign(Oi(0)),n?i.indirectDiffuse.addAssign(n):i.indirectDiffuse.addAssign(Oi(1,1,1,0)),i.indirectDiffuse.mulAssign(s),i.indirectDiffuse.mulAssign(on.rgb)}finish(e,t,r){const s=r.material,i=e.outgoingLight,n=r.context.environment;if(n)switch(s.combine){case Y:i.rgb.assign(da(i.rgb,i.rgb.mul(n.rgb),ld.mul(dd)));break;case X:i.rgb.assign(da(i.rgb,n.rgb,ld.mul(dd)));break;case K:i.rgb.addAssign(n.rgb.mul(ld.mul(dd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",s.combine)}}}const Nh=new Q;class Sh extends Yc{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Nh),this.setValues(e)}setupNormal(){return nl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new Th(Ld)),t}setupOutgoingLight(){return on.rgb}setupLightingModel(){return new vh}}const Ah=_i((({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))})),Rh=_i((e=>e.diffuseColor.mul(1/Math.PI))),Ch=_i((({dotNH:e})=>Nn.mul(Ci(.5)).add(1).mul(Ci(1/Math.PI)).mul(e.pow(Nn)))),Eh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(t).clamp(),s=Zu.dot(t).clamp(),i=Ah({f0:_n,f90:1,dotVH:s}),n=Ci(.25),o=Ch({dotNH:r});return i.mul(n).mul(o)}));class wh extends vh{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Eh({lightDirection:e})).mul(ld))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const Mh=new Z;class Bh extends Yc{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Mh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh(!1)}}const Uh=new J;class Fh extends Yc{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Uh),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new xh(t):null}setupLightingModel(){return new wh}setupVariants(){const e=(this.shininessNode?Ci(this.shininessNode):sd).max(1e-4);Nn.assign(e);const t=this.specularNode||od;_n.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ph=_i((e=>{if(!1===e.geometry.hasAttribute("normal"))return Ci(0);const t=nl.dFdx().abs().max(nl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Ih=_i((e=>{const{roughness:t}=e,r=Ph();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Lh=_i((({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return zn(.5,i.add(n).max(uo))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Dh=_i((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:o,dotNL:a})=>{const u=a.mul(Ii(e.mul(r),t.mul(s),o).length()),l=o.mul(Ii(e.mul(i),t.mul(n),a).length());return zn(.5,u.add(l)).saturate()})).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Vh=_i((({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)})).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Oh=Ci(1/Math.PI),Gh=_i((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),o=Ii(t.mul(s),e.mul(i),n.mul(r)),a=o.dot(o),u=n.div(a);return Oh.mul(n.mul(u.pow2()))})).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),kh=_i((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:o,USE_ANISOTROPY:a}=e,u=e.normalView||al,l=i.pow2(),d=t.add(Zu).normalize(),c=u.dot(t).clamp(),h=u.dot(Zu).clamp(),p=u.dot(d).clamp(),g=Zu.dot(d).clamp();let m,f,y=Ah({f0:r,f90:s,dotVH:g});if(pi(o)&&(y=gn.mix(y,n)),pi(a)){const e=xn.dot(t),r=xn.dot(Zu),s=xn.dot(d),i=Tn.dot(t),n=Tn.dot(Zu),o=Tn.dot(d);m=Dh({alphaT:yn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Gh({alphaT:yn,alphaB:l,dotNH:p,dotTH:s,dotBH:o})}else m=Lh({alpha:l,dotNL:c,dotNV:h}),f=Vh({alpha:l,dotNH:p});return y.mul(m).mul(f)})),zh=_i((({roughness:e,dotNV:t})=>{const r=Oi(-1,-.0275,-.572,.022),s=Oi(1,.0425,1.04,-.04),i=e.mul(r).add(s),n=i.x.mul(i.x).min(t.mul(-9.28).exp2()).mul(i.x).add(i.y);return Bi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),$h=_i((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=zh({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Hh=_i((({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(Ii(t).mul(n)).div(n.oneMinus())})).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),Wh=_i((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Ci(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Ci(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)})).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),jh=_i((({dotNV:e,dotNL:t})=>Ci(1).div(Ci(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),qh=_i((({lightDirection:e})=>{const t=e.add(Zu).normalize(),r=al.dot(e).clamp(),s=al.dot(Zu).clamp(),i=al.dot(t).clamp(),n=Wh({roughness:pn,dotNH:i}),o=jh({dotNV:s,dotNL:r});return hn.mul(n).mul(o)})),Kh=_i((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Bi(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i})).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),Xh=_i((({f:e})=>{const t=e.length();return Xo(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Yh=_i((({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),o=i.div(n),a=r.greaterThan(0).select(o,Xo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(o));return e.cross(t).mul(a)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Qh=_i((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:o,p3:a})=>{const u=n.sub(i).toVar(),l=a.sub(i).toVar(),d=u.cross(l),c=Ii().toVar();return Si(d.dot(r.sub(i)).greaterThanEqual(0),(()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Hi(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(o.sub(r)).normalize().toVar(),m=d.mul(a.sub(r)).normalize().toVar(),f=Ii(0).toVar();f.addAssign(Yh({v1:h,v2:p})),f.addAssign(Yh({v1:p,v2:g})),f.addAssign(Yh({v1:g,v2:m})),f.addAssign(Yh({v1:m,v2:h})),c.assign(Ii(Xh({f:f})))})),c})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Zh=1/6,Jh=e=>kn(Zh,kn(e,kn(e,e.negate().add(3)).sub(3)).add(1)),ep=e=>kn(Zh,kn(e,kn(e,kn(3,e).sub(6))).add(4)),tp=e=>kn(Zh,kn(e,kn(e,kn(-3,e).add(3)).add(3)).add(1)),rp=e=>kn(Zh,sa(e,3)),sp=e=>Jh(e).add(ep(e)),ip=e=>tp(e).add(rp(e)),np=e=>On(-1,ep(e).div(Jh(e).add(ep(e)))),op=e=>On(1,rp(e).div(tp(e).add(rp(e)))),ap=(e,t,r)=>{const s=e.uvNode,i=kn(s,t.zw).add(.5),n=So(i),o=Co(i),a=sp(o.x),u=ip(o.x),l=np(o.x),d=op(o.x),c=np(o.y),h=op(o.y),p=Bi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Bi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Bi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Bi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=sp(o.y).mul(On(a.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=ip(o.y).mul(On(a.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},up=_i((([e,t=Ci(3)])=>{const r=Bi(e.size(Ei(t))),s=Bi(e.size(Ei(t.add(1)))),i=zn(1,r),n=zn(1,s),o=ap(e,Oi(i,r),So(t)),a=ap(e,Oi(n,s),Ao(t));return Co(t).mix(o,a)})),lp=_i((([e,t,r,s,i])=>{const n=Ii(pa(t.negate(),Ro(e),zn(1,s))),o=Ii(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return Ro(n).mul(r.mul(o))})).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),dp=_i((([e,t])=>e.mul(ca(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),cp=Uc(),hp=Uc(),pp=_i((([e,t,r],{material:s})=>{const i=(s.side==x?cp:hp).sample(e),n=_o(Tc.x).mul(dp(t,r));return up(i,n)})),gp=_i((([e,t,r])=>(Si(r.notEqual(0),(()=>{const s=To(t).negate().div(r);return bo(s.negate().mul(e))})),Ii(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),mp=_i((([e,t,r,s,i,n,o,a,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Oi().toVar(),f=Ii().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Ii(d.sub(i),d,d.add(i));ic({start:0,end:3},(({i:i})=>{const d=n.element(i),g=lp(e,t,c,d,a),y=o.add(g),b=l.mul(u.mul(Oi(y,1))),x=Bi(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(Bi(x.x,x.y.oneMinus()));const T=pp(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(gp(Lo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=lp(e,t,c,d,a),n=o.add(i),g=l.mul(u.mul(Oi(n,1))),y=Bi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Bi(y.x,y.y.oneMinus())),m=pp(y,r,d),f=s.mul(gp(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Ii($h({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Oi(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),fp=Hi(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),yp=(e,t)=>e.sub(t).div(e.add(t)).pow2(),bp=_i((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=da(e,t,ga(0,.03,s)),o=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Si(o.lessThan(0),(()=>Ii(1)));const a=o.sqrt(),u=yp(n,e),l=Ah({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Ci(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Ii(1).add(t).div(Ii(1).sub(t))})(i.clamp(0,.9999)),g=yp(p,n.toVec3()),m=Ah({f0:g,f90:1,dotVH:a}),f=Ii(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,a,2),b=Ii(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Ii(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return ic({start:1,end:2,condition:"<=",name:"m"},(({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=Ii(54856e-17,44201e-17,52481e-17),i=Ii(1681e3,1795300,2208400),n=Ii(43278e5,93046e5,66121e5),o=Ci(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let a=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return a=Ii(a.x.add(o),a.y,a.z).div(1.0685e-7),fp.mul(a)})(Ci(e).mul(y),Ci(e).mul(b)).mul(2);v.addAssign(N.mul(t))})),v.max(Ii(0))})).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),xp=_i((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Ta(r.lessThan(.25),Ci(-339.2).mul(i).add(Ci(161.4).mul(r)).sub(25.9),Ci(-8.48).mul(i).add(Ci(14.3).mul(r)).sub(9.95)),o=Ta(r.lessThan(.25),Ci(44).mul(i).sub(Ci(23.7).mul(r)).add(3.26),Ci(1.97).mul(i).sub(Ci(3.27).mul(r)).add(.72));return Ta(r.lessThan(.25),0,Ci(.1).mul(r).sub(.025)).add(n.mul(s).add(o).exp()).mul(1/Math.PI).saturate()})),Tp=Ii(.04),_p=Ci(1);class vp extends _h{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Ii().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Ii().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Ii().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Ii().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Ii().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=al.dot(Zu).clamp();this.iridescenceFresnel=bp({outsideIOR:Ci(1),eta2:mn,cosTheta1:e,thinFilmThickness:fn,baseF0:_n}),this.iridescenceF0=Hh({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Xu,r=Eu.sub(Xu).normalize(),s=ul;e.backdrop=mp(s,r,un,on,_n,vn,t,Du,Au,Nu,En,Mn,Un,Bn,this.dispersion?Fn:null),e.backdropAlpha=wn,on.a.mulAssign(da(1,e.backdrop.a,wn))}}computeMultiscattering(e,t,r){const s=al.dot(Zu).clamp(),i=zh({roughness:un,dotNV:s}),n=(this.iridescenceF0?gn.mix(_n,this.iridescenceF0):_n).mul(i.x).add(r.mul(i.y)),o=i.x.add(i.y).oneMinus(),a=_n.add(_n.oneMinus().mul(.047619)),u=n.mul(a).div(o.mul(a).oneMinus());e.addAssign(n),t.addAssign(u.mul(o))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=al.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(qh({lightDirection:e}))),!0===this.clearcoat){const r=ll.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(kh({lightDirection:e,f0:Tp,f90:_p,roughness:cn,normalView:ll})))}r.directDiffuse.addAssign(s.mul(Rh({diffuseColor:on.rgb}))),r.directSpecular.addAssign(s.mul(kh({lightDirection:e,f0:_n,f90:1,roughness:un,iridescence:this.iridescence,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:o}){const a=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=al,h=Zu,p=Qu.toVar(),g=Kh({N:c,V:h,roughness:un}),m=n.sample(g).toVar(),f=o.sample(g).toVar(),y=Hi(Ii(m.x,0,m.y),Ii(0,1,0),Ii(m.z,0,m.w)).toVar(),b=_n.mul(f.x).add(_n.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Qh({N:c,V:h,P:p,mInv:y,p0:a,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(on).mul(Qh({N:c,V:h,P:p,mInv:Hi(1,0,0,0,1,0,0,0,1),p0:a,p1:u,p2:l,p3:d})))}indirect(e,t,r){this.indirectDiffuse(e,t,r),this.indirectSpecular(e,t,r),this.ambientOcclusion(e,t,r)}indirectDiffuse({irradiance:e,reflectedLight:t}){t.indirectDiffuse.addAssign(e.mul(Rh({diffuseColor:on})))}indirectSpecular({radiance:e,iblIrradiance:t,reflectedLight:r}){if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(t.mul(hn,xp({normal:al,viewDir:Zu,roughness:pn}))),!0===this.clearcoat){const e=ll.dot(Zu).clamp(),t=$h({dotNV:e,specularColor:Tp,specularF90:_p,roughness:cn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const s=Ii().toVar("singleScattering"),i=Ii().toVar("multiScattering"),n=t.mul(1/Math.PI);this.computeMultiscattering(s,i,vn);const o=s.add(i),a=on.mul(o.r.max(o.g).max(o.b).oneMinus());r.indirectSpecular.addAssign(e.mul(s)),r.indirectSpecular.addAssign(i.mul(n)),r.indirectDiffuse.addAssign(a.mul(n))}ambientOcclusion({ambientOcclusion:e,reflectedLight:t}){const r=al.dot(Zu).clamp().add(e),s=un.mul(-16).oneMinus().negate().exp2(),i=e.sub(r.pow(s).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(e),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(e),t.indirectDiffuse.mulAssign(e),t.indirectSpecular.mulAssign(i)}finish(e){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=ll.dot(Zu).clamp(),r=Ah({dotVH:e,f0:Tp,f90:_p}),s=t.mul(dn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(dn));t.assign(s)}if(!0===this.sheen){const e=hn.r.max(hn.g).max(hn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const Np=Ci(1),Sp=Ci(-2),Ap=Ci(.8),Rp=Ci(-1),Cp=Ci(.4),Ep=Ci(2),wp=Ci(.305),Mp=Ci(3),Bp=Ci(.21),Up=Ci(4),Fp=Ci(4),Pp=Ci(16),Ip=_i((([e])=>{const t=Ii(Po(e)).toVar(),r=Ci(-1).toVar();return Si(t.x.greaterThan(t.z),(()=>{Si(t.x.greaterThan(t.y),(()=>{r.assign(Ta(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})).Else((()=>{Si(t.z.greaterThan(t.y),(()=>{r.assign(Ta(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Ta(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Lp=_i((([e,t])=>{const r=Bi().toVar();return Si(t.equal(0),(()=>{r.assign(Bi(e.z,e.y).div(Po(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Bi(e.x.negate(),e.z.negate()).div(Po(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Bi(e.x.negate(),e.y).div(Po(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Bi(e.z.negate(),e.y).div(Po(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Bi(e.x.negate(),e.z).div(Po(e.y)))})).Else((()=>{r.assign(Bi(e.x,e.y).div(Po(e.z)))})),kn(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Dp=_i((([e])=>{const t=Ci(0).toVar();return Si(e.greaterThanEqual(Ap),(()=>{t.assign(Np.sub(e).mul(Rp.sub(Sp)).div(Np.sub(Ap)).add(Sp))})).ElseIf(e.greaterThanEqual(Cp),(()=>{t.assign(Ap.sub(e).mul(Ep.sub(Rp)).div(Ap.sub(Cp)).add(Rp))})).ElseIf(e.greaterThanEqual(wp),(()=>{t.assign(Cp.sub(e).mul(Mp.sub(Ep)).div(Cp.sub(wp)).add(Ep))})).ElseIf(e.greaterThanEqual(Bp),(()=>{t.assign(wp.sub(e).mul(Up.sub(Mp)).div(wp.sub(Bp)).add(Mp))})).Else((()=>{t.assign(Ci(-2).mul(_o(kn(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Vp=_i((([e,t])=>{const r=e.toVar();r.assign(kn(2,r).sub(1));const s=Ii(r,1).toVar();return Si(t.equal(0),(()=>{s.assign(s.zyx)})).ElseIf(t.equal(1),(()=>{s.assign(s.xzy),s.xz.mulAssign(-1)})).ElseIf(t.equal(2),(()=>{s.x.mulAssign(-1)})).ElseIf(t.equal(3),(()=>{s.assign(s.zyx),s.xz.mulAssign(-1)})).ElseIf(t.equal(4),(()=>{s.assign(s.xzy),s.xy.mulAssign(-1)})).ElseIf(t.equal(5),(()=>{s.z.mulAssign(-1)})),s})).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Op=_i((([e,t,r,s,i,n])=>{const o=Ci(r),a=Ii(t),u=ca(Dp(o),Sp,n),l=Co(u),d=So(u),c=Ii(Gp(e,a,d,s,i,n)).toVar();return Si(l.notEqual(0),(()=>{const t=Ii(Gp(e,a,d.add(1),s,i,n)).toVar();c.assign(da(c,t,l))})),c})),Gp=_i((([e,t,r,s,i,n])=>{const o=Ci(r).toVar(),a=Ii(t),u=Ci(Ip(a)).toVar(),l=Ci(Xo(Fp.sub(o),0)).toVar();o.assign(Xo(o,Fp));const d=Ci(xo(o)).toVar(),c=Bi(Lp(a,u).mul(d.sub(2)).add(1)).toVar();return Si(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(kn(3,Pp))),c.y.addAssign(kn(4,xo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Bi(),Bi())})),kp=_i((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:a})=>{const u=wo(s),l=r.mul(u).add(i.cross(r).mul(Eo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Gp(e,l,t,n,o,a)})),zp=_i((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:o,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Ii(Ta(t,r,ra(r,s))).toVar();Si(po(h.equals(Ii(0))),(()=>{h.assign(Ii(s.z,0,s.x.negate()))})),h.assign(Ro(h));const p=Ii().toVar();return p.addAssign(i.element(Ei(0)).mul(kp({theta:0,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),ic({start:Ei(1),end:e},(({i:e})=>{Si(e.greaterThanEqual(n),(()=>{nc()}));const t=Ci(o.mul(Ci(e))).toVar();p.addAssign(i.element(e).mul(kp({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(kp({theta:t,axis:h,outputDirection:s,mipInt:a,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),Oi(p,1)}));let $p=null;const Hp=new WeakMap;function Wp(e){let t=Hp.get(e);if((void 0!==t?t.pmremVersion:-1)!==e.pmremVersion){const r=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(r))return null;t=$p.fromEquirectangular(e,t)}t.pmremVersion=e.pmremVersion,Hp.set(e,t)}return t.texture}class jp extends Fs{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new ee;s.isRenderTargetTexture=!0,this._texture=xu(s),this._width=tn(0),this._height=tn(0),this._maxMip=tn(0),this.updateBeforeType=vs.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(){let e=this._pmrem;const t=e?e.pmremVersion:-1,r=this._value;t!==r.pmremVersion&&(e=!0===r.isPMREMTexture?r:Wp(r),null!==e&&(this._pmrem=e,this.updateFromTexture(e)))}setup(e){null===$p&&($p=e.createPMREMGenerator()),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this));const r=this.value;e.renderer.coordinateSystem===b&&!0!==r.isPMREMTexture&&!0===r.isRenderTargetTexture&&(t=Ii(t.x.negate(),t.yz));let s=this.levelNode;return null===s&&e.context.getTextureLevel&&(s=e.context.getTextureLevel(this)),Op(this._texture,t,s,this._width,this._height,this._maxMip)}}const qp=xi(jp),Kp=new WeakMap;class Xp extends cc{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=Kp.get(e);void 0===s&&(s=qp(e),Kp.set(e,s)),r=s}const s=t.envMap?Rl("envMapIntensity","float",e.material):Rl("environmentIntensity","float",e.scene),i=!0===t.useAnisotropy||t.anisotropy>0?Wl:al,n=r.context(Yp(un,i)).mul(s),o=r.context(Qp(ul)).mul(Math.PI).mul(s),a=eu(n),u=eu(o);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(u);const l=e.context.lightingModel.clearcoatRadiance;if(l){const e=r.context(Yp(cn,ll)).mul(s),t=eu(e);l.addAssign(t)}}}const Yp=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Zu.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(Au)),r),getTextureLevel:()=>e}},Qp=e=>({getUV:()=>e,getTextureLevel:()=>Ci(1)}),Zp=new te;class Jp extends Yc{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Zp),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new Xp(t):null}setupLightingModel(){return new vp}setupSpecular(){const e=da(Ii(.04),on.rgb,ln);_n.assign(e),vn.assign(1)}setupVariants(){const e=this.metalnessNode?Ci(this.metalnessNode):hd;ln.assign(e);let t=this.roughnessNode?Ci(this.roughnessNode):cd;t=Ih({roughness:t}),un.assign(t),this.setupSpecular(),on.assign(Oi(on.rgb.mul(e.oneMinus()),on.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const eg=new re;class tg extends Jp{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(eg),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?Ci(this.iorNode):Rd;En.assign(e),_n.assign(da(Ko(ia(En.sub(1).div(En.add(1))).mul(ud),Ii(1)).mul(ad),on.rgb,ln)),vn.assign(da(ad,1,ln))}setupLightingModel(){return new vp(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Ci(this.clearcoatNode):gd,t=this.clearcoatRoughnessNode?Ci(this.clearcoatRoughnessNode):md;dn.assign(e),cn.assign(Ih({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Ii(this.sheenNode):bd,t=this.sheenRoughnessNode?Ci(this.sheenRoughnessNode):xd;hn.assign(e),pn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Ci(this.iridescenceNode):_d,t=this.iridescenceIORNode?Ci(this.iridescenceIORNode):vd,r=this.iridescenceThicknessNode?Ci(this.iridescenceThicknessNode):Nd;gn.assign(e),mn.assign(t),fn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Bi(this.anisotropyNode):Td).toVar();bn.assign(e.length()),Si(bn.equal(0),(()=>{e.assign(Bi(1,0))})).Else((()=>{e.divAssign(Bi(bn)),bn.assign(bn.saturate())})),yn.assign(bn.pow2().mix(un.pow2(),1)),xn.assign($l[0].mul(e.x).add($l[1].mul(e.y))),Tn.assign($l[1].mul(e.x).sub($l[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Ci(this.transmissionNode):Sd,t=this.thicknessNode?Ci(this.thicknessNode):Ad,r=this.attenuationDistanceNode?Ci(this.attenuationDistanceNode):Cd,s=this.attenuationColorNode?Ii(this.attenuationColorNode):Ed;if(wn.assign(e),Mn.assign(t),Bn.assign(r),Un.assign(s),this.useDispersion){const e=this.dispersionNode?Ci(this.dispersionNode):Id;Fn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Ii(this.clearcoatNormalNode):fd}setup(e){e.context.setupClearcoatNormal=()=>this.setupClearcoatNormal(e),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class rg extends vp{constructor(e,t,r,s){super(e,t,r),this.useSSS=s}direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){if(!0===this.useSSS){const s=i.material,{thicknessColorNode:n,thicknessDistortionNode:o,thicknessAmbientNode:a,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=s,c=e.add(al.mul(o)).normalize(),h=Ci(Zu.dot(c.negate()).saturate().pow(l).mul(d)),p=Ii(h.add(a).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i)}}class sg extends tg{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Ci(.1),this.thicknessAmbientNode=Ci(0),this.thicknessAttenuationNode=Ci(.1),this.thicknessPowerNode=Ci(2),this.thicknessScaleNode=Ci(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new rg(this.useClearcoat,this.useSheen,this.useIridescence,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const ig=_i((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Bi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=wl("gradientMap","texture").context({getUV:()=>i});return Ii(e.r)}{const e=i.fwidth().mul(.5);return da(Ii(.7),Ii(1),ga(Ci(.7).sub(e.x),Ci(.7).add(e.x),i.x))}}));class ng extends _h{direct({lightDirection:e,lightColor:t,reflectedLight:r},s,i){const n=ig({normal:rl,lightDirection:e,builder:i}).mul(t);r.directDiffuse.addAssign(n.mul(Rh({diffuseColor:on.rgb})))}indirect({ambientOcclusion:e,irradiance:t,reflectedLight:r}){r.indirectDiffuse.addAssign(t.mul(Rh({diffuseColor:on}))),r.indirectDiffuse.mulAssign(e)}}const og=new se;class ag extends Yc{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(og),this.setValues(e)}setupLightingModel(){return new ng}}class ug extends Fs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Ii(Zu.z,0,Zu.x.negate()).normalize(),t=Zu.cross(e);return Bi(e.dot(al),t.dot(al)).mul(.495).add(.5)}}const lg=Ti(ug),dg=new ie;class cg extends Yc{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.lights=!1,this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(dg),this.setValues(e)}setupVariants(e){const t=lg;let r;r=e.material.matcap?wl("matcap","texture").context({getUV:()=>t}):Ii(da(.2,.8,t.y)),on.rgb.mulAssign(r.rgb)}}const hg=new P;class pg extends Yc{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.isPointsNodeMaterial=!0,this.lights=!1,this.transparent=!0,this.sizeNode=null,this.setDefaultValues(hg),this.setValues(e)}copy(e){return this.sizeNode=e.sizeNode,super.copy(e)}}class gg extends Fs{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return $i(e,s,s.negate(),e).mul(r)}{const e=t,s=Wi(Oi(1,0,0,0),Oi(0,wo(e.x),Eo(e.x).negate(),0),Oi(0,Eo(e.x),wo(e.x),0),Oi(0,0,0,1)),i=Wi(Oi(wo(e.y),0,Eo(e.y),0),Oi(0,1,0,0),Oi(Eo(e.y).negate(),0,wo(e.y),0),Oi(0,0,0,1)),n=Wi(Oi(wo(e.z),Eo(e.z).negate(),0,0),Oi(Eo(e.z),wo(e.z),0,0),Oi(0,0,1,0),Oi(0,0,0,1));return s.mul(i).mul(n).mul(Oi(r,1)).xyz}}}const mg=xi(gg),fg=new ne;class yg extends Yc{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this.lights=!1,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.setDefaultValues(fg),this.setValues(e)}setupPosition({object:e,camera:t,context:r}){const s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:o}=this,a=qu;let u=$u.mul(Ii(i||0)),l=Bi(Du[0].xyz.length(),Du[1].xyz.length());if(null!==o&&(l=l.mul(o)),!s)if(t.isPerspectiveCamera)l=l.mul(u.z.negate());else{const e=Ci(2).div(Nu.element(1).element(1));l=l.mul(e.mul(2))}let d=a.xy;if(e.center&&!0===e.center.isVector2){const e=((e,t,r)=>fi(new Ga(e,t,r)))("center","vec2");d=d.sub(e.sub(.5))}d=d.mul(l);const c=Ci(n||yd),h=mg(d,c);u=Oi(u.xy.add(h),u.zw);const p=Nu.mul(u);return r.vertex=a,p}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}class bg extends _h{constructor(){super(),this.shadowNode=Ci(1).toVar("shadowMask")}direct({shadowMask:e}){this.shadowNode.mulAssign(e)}finish(e){on.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(on.rgb)}}const xg=new oe;class Tg extends Yc{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.setDefaultValues(xg),this.setValues(e)}setupLightingModel(){return new bg}}const _g=_i((({texture:e,uv:t})=>{const r=1e-4,s=Ii().toVar();return Si(t.x.lessThan(r),(()=>{s.assign(Ii(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Ii(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Ii(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Ii(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Ii(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Ii(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Ii(-.01,0,0))).r.sub(e.sample(t.add(Ii(r,0,0))).r),n=e.sample(t.add(Ii(0,-.01,0))).r.sub(e.sample(t.add(Ii(0,r,0))).r),o=e.sample(t.add(Ii(0,0,-.01))).r.sub(e.sample(t.add(Ii(0,0,r))).r);s.assign(Ii(i,n,o))})),s.normalize()}));class vg extends bu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Ii(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){return t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return _g({texture:this,uv:e})}}const Ng=xi(vg);class Sg extends Yc{static get type(){return"VolumeNodeMaterial"}constructor(e={}){super(),this.lights=!1,this.isVolumeNodeMaterial=!0,this.testNode=null,this.setValues(e)}setup(e){const t=Ng(this.map,null,0),r=_i((({orig:e,dir:t})=>{const r=Ii(-.5),s=Ii(.5),i=t.reciprocal(),n=r.sub(e).mul(i),o=s.sub(e).mul(i),a=Ko(n,o),u=Xo(n,o),l=Xo(a.x,Xo(a.y,a.z)),d=Ko(u.x,Ko(u.y,u.z));return Bi(l,d)}));this.fragmentNode=_i((()=>{const e=wa(Ii(zu.mul(Oi(Eu,1)))),s=wa(ju.sub(e)).normalize(),i=Bi(r({orig:e,dir:s})).toVar();i.x.greaterThan(i.y).discard(),i.assign(Bi(Xo(i.x,0),i.y));const n=Ii(e.add(i.x.mul(s))).toVar(),o=Ii(s.abs().reciprocal()).toVar(),a=Ci(Ko(o.x,Ko(o.y,o.z))).toVar("delta");a.divAssign(wl("steps","float"));const u=Oi(wl("base","color"),0).toVar();return ic({type:"float",start:i.x,end:i.y,update:"+= delta"},(()=>{const e=sn("float","d").assign(t.sample(n.add(.5)).r);null!==this.testNode?this.testNode({map:t,mapValue:e,probe:n,finalColor:u}).append():(u.a.assign(1),nc()),n.addAssign(s.mul(a))})),u.a.equal(0).discard(),Oi(u)}))(),super.setup(e)}}class Ag{constructor(e,t){this.nodes=e,this.info=t,this._context=self,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,null!==this._animationLoop&&this._animationLoop(t,r)};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}setAnimationLoop(e){this._animationLoop=e}setContext(e){this._context=e}dispose(){this.stop()}}class Rg{constructor(){this.weakMap=new WeakMap}get(e){let t=this.weakMap;for(let r=0;r{this.dispose()},this.material.addEventListener("dispose",this.onMaterialDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().monitor)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set;for(const i of e){const e=i.node&&i.node.attribute?i.node.attribute:t.getAttribute(i.name);if(void 0===e)continue;r.push(e);const n=e.isInterleavedBufferAttribute?e.data:e;s.add(n)}return this.attributes=r,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),o=this.getIndex(),a=null!==o,u=r.isInstancedBufferGeometry?r.instanceCount:e.count>1?e.count:1;if(0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;a?p=o.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}return e.index&&(t+="index,"),t}getMaterialCacheKey(){const{object:e,material:t}=this;let r=t.customProgramCacheKey();for(const e of function(e){const t=Object.keys(e);let r=Object.getPrototypeOf(e);for(;r;){const e=Object.getOwnPropertyDescriptors(r);for(const r in e)if(void 0!==e[r]){const s=e[r];s&&"function"==typeof s.get&&t.push(r)}r=Object.getPrototypeOf(r)}return t}(t)){if(/^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test(e))continue;const s=t[e];let i;if(null!==s){const e=typeof s;"number"===e?i=0!==s?"1":"0":"object"===e?(i="{",s.isTexture&&(i+=s.mapping),i+="}"):i=String(s)}else i=String(s);r+=i+","}return r+=this.clippingContextCacheKey+",",e.geometry&&(r+=this.getGeometryCacheKey()),e.skeleton&&(r+=e.skeleton.bones.length+","),e.morphTargetInfluences&&(r+=e.morphTargetInfluences.length+","),e.isBatchedMesh&&(r+=e._matricesTexture.uuid+",",null!==e._colorsTexture&&(r+=e._colorsTexture.uuid+",")),e.count>1&&(r+=e.uuid+","),r+=e.receiveShadow+",",us(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=this._nodes.getCacheKey(this.scene,this.lightsNode);return this.object.receiveShadow&&(e+=1),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const wg=[];class Mg{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,o,a){const u=this.getChainMap(a);wg[0]=e,wg[1]=t,wg[2]=n,wg[3]=i;let l=u.get(wg);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,o,a),u.set(wg,l)):(l.updateClipping(o),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,o,a)):l.version=t.version)),l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Rg)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,o,a,u,l,d){const c=this.getChainMap(d),h=new Eg(e,t,r,s,i,n,o,a,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Bg{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const Ug=1,Fg=2,Pg=3,Ig=4,Lg=16;class Dg extends Bg{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return void 0!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Ug?this.backend.createAttribute(e):t===Fg?this.backend.createIndexAttribute(e):t===Pg?this.backend.createStorageAttribute(e):t===Ig&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version=0;--t)if(e[t]>=65535)return!0;return!1}(t)?ae:ue)(t,1);return i.version=Vg(e),i}class Gg extends Bg{constructor(e,t){super(),this.attributes=e,this.info=t,this.wireframes=new WeakMap,this.attributeCall=new WeakMap}has(e){const t=e.geometry;return super.has(t)&&!0===this.get(t).initialized}updateForRender(e){!1===this.has(e)&&this.initGeometry(e),this.updateAttributes(e)}initGeometry(e){const t=e.geometry;this.get(t).initialized=!0,this.info.memory.geometries++;const r=()=>{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r)};t.addEventListener("dispose",r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,Pg):this.updateAttribute(e,Ug);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Fg);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Ig)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=Og(t),e.set(t,r)):r.version!==Vg(t)&&(this.attributes.delete(r),r=Og(t),e.set(t,r)),s=r}return s}}class kg{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.compute={calls:0,frameCalls:0,timestamp:0,previousFrameCalls:0,timestampCalls:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):console.error("THREE.WebGPUInfo: Unknown object type.")}updateTimestamp(e,t){0===this[e].timestampCalls&&(this[e].timestamp=0),this[e].timestamp+=t,this[e].timestampCalls++,this[e].timestampCalls>=this[e].previousFrameCalls&&(this[e].timestampCalls=0)}reset(){const e=this.render.frameCalls;this.render.previousFrameCalls=e;const t=this.compute.frameCalls;this.compute.previousFrameCalls=t,this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class zg{constructor(e){this.cacheKey=e,this.usedTimes=0}}class $g extends zg{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class Hg extends zg{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let Wg=0;class jg{constructor(e,t,r=null,s=null){this.id=Wg++,this.code=e,this.stage=t,this.transforms=r,this.attributes=s,this.usedTimes=0}}class qg extends Bg{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let o=this.programs.compute.get(n.computeShader);void 0===o&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),o=new jg(n.computeShader,"compute",n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,o),r.createProgram(o));const a=this._getComputeCacheKey(e,o);let u=this.caches.get(a);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,o,a,t)),u.usedTimes++,o.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState();let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new jg(n.vertexShader,"vertex"),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let a=this.programs.fragment.get(n.fragmentShader);void 0===a&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),a=new jg(n.fragmentShader,"fragment"),this.programs.fragment.set(n.fragmentShader,a),r.createProgram(a));const u=this._getRenderCacheKey(e,o,a);let l=this.caches.get(u);void 0===l?(i&&0===i.usedTimes&&this._releasePipeline(i),l=this._getRenderPipeline(e,o,a,u,t)):e.pipeline=l,l.usedTimes++,o.usedTimes++,a.usedTimes++,s.pipeline=l}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new Hg(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new $g(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class Kg extends Bg{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Ig:Pg;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,o=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!this.nodes.updateGroup(t))continue}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampler)t.update();else if(t.isSampledTexture){const e=this.textures.get(t.texture);t.needsBindingsUpdate(e.generation)&&(s=!0);const a=t.update(),u=t.texture;a&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,o+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,a,u,t.textureNode.value,s),this.textures.updateTexture(u),s=!0),!0===u.isStorageTexture){const e=this.get(u);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(u)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(u),e.needsMipmap=!1)}}}!0===s&&this.backend.updateBindings(e,t,i?n:0,o)}}function Xg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Yg(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Qg(e){return(e.transmission>0||e.transmissionNode)&&e.side===le&&!1===e.forceSinglePass}class Zg{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,o){let a=this.renderItems[this.renderItemsIndex];return void 0===a?(a={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:o},this.renderItems[this.renderItemsIndex]=a):(a.id=e.id,a.object=e,a.geometry=t,a.material=r,a.groupOrder=s,a.renderOrder=e.renderOrder,a.z=i,a.group=n,a.clippingContext=o),this.renderItemsIndex++,a}push(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.push(a),this.transparent.push(a)):this.opaque.push(a)}unshift(e,t,r,s,i,n,o){const a=this.getNextRenderItem(e,t,r,s,i,n,o);!0===r.transparent||r.transmission>0?(Qg(r)&&this.transparentDoublePass.unshift(a),this.transparent.unshift(a)):this.opaque.unshift(a)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||Xg),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Yg),this.transparent.length>1&&this.transparent.sort(t||Yg)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=o.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new B,l.format=e.stencilBuffer?de:ce,l.type=e.stencilBuffer?he:f,l.image.width=a,l.image.height=u,i[t]=l),r.width===o.width&&o.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=a,l.image.height=u)),r.width=o.width,r.height=o.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};for(let e=0;e{e.removeEventListener("dispose",t);for(let e=0;e0){const s=e.image;if(void 0===s)console.warn("THREE.Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)console.warn("THREE.Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t),t.needsMipmaps&&0===e.mipmaps.length&&i.generateMipmaps(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version}if(!0!==r.initialized){r.initialized=!0,r.generation=e.version,this.info.memory.textures++;const t=()=>{e.removeEventListener("dispose",t),this._destroyTexture(e),this.info.memory.textures--};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=im){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.isCompressedTexture?e.mipmaps?e.mipmaps.length:1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return this.isEnvironmentTexture(e)||!0===e.isCompressedTexture||e.generateMipmaps}isEnvironmentTexture(e){const t=e.mapping;return t===j||t===q||t===T||t===_}_destroyTexture(e){this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e)}}class om extends e{constructor(e,t,r,s=1){super(e,t,r),this.a=s}set(e,t,r,s=1){return this.a=s,super.set(e,t,r)}copy(e){return void 0!==e.a&&(this.a=e.a),super.copy(e)}clone(){return new this.constructor(this.r,this.g,this.b,this.a)}}class am extends rn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class um extends Ms{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new mi(t);return this._currentCond=Ta(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new mi(t),s=Ta(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new mi(e),this}build(e,...t){const r=Ni();vi(this);for(const t of this.nodes)t.build(e,"void");return vi(r),this.outputNode?this.outputNode.build(e,...t):super.build(e,...t)}else(...e){return console.warn("TSL.StackNode: .else() has been renamed to .Else()."),this.Else(...e)}elseif(...e){return console.warn("TSL.StackNode: .elseif() has been renamed to .ElseIf()."),this.ElseIf(...e)}}const lm=xi(um);class dm extends Ms{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}setup(e){super.setup(e);const t=this.members,r=[];for(let s=0;s{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)})),fm=(e,t)=>sa(kn(4,e.mul(Gn(1,e))),t),ym=_i((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),bm=_i((([e])=>Ii(ym(e.z.add(ym(e.y.mul(1)))),ym(e.z.add(ym(e.x.mul(1)))),ym(e.y.add(ym(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),xm=_i((([e,t,r])=>{const s=Ii(e).toVar(),i=Ci(1.4).toVar(),n=Ci(0).toVar(),o=Ii(s).toVar();return ic({start:Ci(0),end:Ci(3),type:"float",condition:"<="},(()=>{const e=Ii(bm(o.mul(2))).toVar();s.addAssign(e.add(r.mul(Ci(.1).mul(t)))),o.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const a=Ci(ym(s.z.add(ym(s.x.add(ym(s.y)))))).toVar();n.addAssign(a.div(i)),o.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"p",type:"vec3"},{name:"spd",type:"float"},{name:"time",type:"float"}]});class Tm extends Ms{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFnCall=null,this.global=!0}getNodeType(){return this.functionNodes[0].shaderNode.layout.type}setup(e){const t=this.parametersNodes;let r=this._candidateFnCall;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const o=n.inputs;if(t.length===o.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const _m=xi(Tm),vm=e=>(...t)=>_m(e,...t),Nm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.time)),Sm=tn(0).setGroup(Zi).onRenderUpdate((e=>e.deltaTime)),Am=tn(0,"uint").setGroup(Zi).onRenderUpdate((e=>e.frameId)),Rm=_i((([e,t,r=Bi(.5)])=>mg(e.sub(r),t).add(r))),Cm=_i((([e,t,r=Bi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Em=_i((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Du.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Du;const i=Au.mul(s);return pi(t)&&(i[0][0]=Du[0].length(),i[0][1]=0,i[0][2]=0),pi(r)&&(i[1][0]=0,i[1][1]=Du[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,Nu.mul(i).mul(qu)})),wm=_i((([e=null])=>{const t=$c();return $c(Ic(e)).sub(t).lessThan(0).select(xc,e)}));class Mm extends Ms{static get type(){return"SpriteSheetUVNode"}constructor(e,t=pu(),r=Ci(0)){super("vec2"),this.countNode=e,this.uvNode=t,this.frameNode=r}setup(){const{frameNode:e,uvNode:t,countNode:r}=this,{width:s,height:i}=r,n=e.mod(s.mul(i)).floor(),o=n.mod(s),a=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Bi(o,a);return t.add(l).mul(u)}}const Bm=xi(Mm);class Um extends Ms{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Ci(1),i=qu,n=sl){super("vec4"),this.textureXNode=e,this.textureYNode=t,this.textureZNode=r,this.scaleNode=s,this.positionNode=i,this.normalNode=n}setup(){const{textureXNode:e,textureYNode:t,textureZNode:r,scaleNode:s,positionNode:i,normalNode:n}=this;let o=n.abs().normalize();o=o.div(o.dot(Ii(1)));const a=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=xu(d,a).mul(o.x),g=xu(c,u).mul(o.y),m=xu(h,l).mul(o.z);return On(p,g,m)}}const Fm=xi(Um),Pm=new me,Im=new r,Lm=new r,Dm=new r,Vm=new n,Om=new r(0,0,-1),Gm=new s,km=new r,zm=new r,$m=new s,Hm=new t,Wm=new ge,jm=xc.flipX();Wm.depthTexture=new B(1,1);let qm=!1;class Km extends bu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Wm.texture,jm),this._reflectorBaseNode=e.reflector||new Xm(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=fi(new Km({defaultTexture:Wm.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e._reflectorBaseNode=this._reflectorBaseNode,e}}class Xm extends Ms{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new fe,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:o=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=o,this.updateBeforeType=n?vs.RENDER:vs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new WeakMap}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(Hm),e.setSize(Math.round(Hm.width*r),Math.round(Hm.height*r))}setup(e){return this._updateResolution(Wm,e.renderer),super.setup(e)}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new ge(0,0,{type:ye}),!0===this.generateMipmaps&&(t.texture.minFilter=be,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new B),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&qm)return;qm=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,o=this.getVirtualCamera(r),a=this.getRenderTarget(o);if(s.getDrawingBufferSize(Hm),this._updateResolution(a,s),Lm.setFromMatrixPosition(n.matrixWorld),Dm.setFromMatrixPosition(r.matrixWorld),Vm.extractRotation(n.matrixWorld),Im.set(0,0,1),Im.applyMatrix4(Vm),km.subVectors(Lm,Dm),km.dot(Im)>0)return;km.reflect(Im).negate(),km.add(Lm),Vm.extractRotation(r.matrixWorld),Om.set(0,0,-1),Om.applyMatrix4(Vm),Om.add(Dm),zm.subVectors(Lm,Om),zm.reflect(Im).negate(),zm.add(Lm),o.coordinateSystem=r.coordinateSystem,o.position.copy(km),o.up.set(0,1,0),o.up.applyMatrix4(Vm),o.up.reflect(Im),o.lookAt(zm),o.near=r.near,o.far=r.far,o.updateMatrixWorld(),o.projectionMatrix.copy(r.projectionMatrix),Pm.setFromNormalAndCoplanarPoint(Im,Lm),Pm.applyMatrix4(o.matrixWorldInverse),Gm.set(Pm.normal.x,Pm.normal.y,Pm.normal.z,Pm.constant);const u=o.projectionMatrix;$m.x=(Math.sign(Gm.x)+u.elements[8])/u.elements[0],$m.y=(Math.sign(Gm.y)+u.elements[9])/u.elements[5],$m.z=-1,$m.w=(1+u.elements[10])/u.elements[14],Gm.multiplyScalar(1/Gm.dot($m));u.elements[2]=Gm.x,u.elements[6]=Gm.y,u.elements[10]=s.coordinateSystem===v?Gm.z-0:Gm.z+1-0,u.elements[14]=Gm.w,this.textureNode.value=a.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=a.depthTexture),i.visible=!1;const l=s.getRenderTarget(),d=s.getMRT();s.setMRT(null),s.setRenderTarget(a),s.render(t,o),s.setMRT(d),s.setRenderTarget(l),i.visible=!0,qm=!1}}const Ym=new xe(-1,1,1,-1,0,1);class Qm extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new _e([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new _e(t,2))}}const Zm=new Qm;class Jm extends k{constructor(e=null){super(Zm,e),this.camera=Ym,this.isQuadMesh=!0}renderAsync(e){return e.renderAsync(this,Ym)}render(e){e.render(this,Ym)}}const ef=new t;class tf extends bu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:ye}){const i=new ge(t,r,s);super(i.texture,pu()),this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new Jm(new Yc),this.updateBeforeType=vs.RENDER}get autoSize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoSize){this.pixelRatio=e.getPixelRatio();const t=e.getSize(ef);this.setSize(t.width,t.height)}this._quadMesh.material.fragmentNode=this._rttNode;const t=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(t)}clone(){const e=new bu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const rf=(e,...t)=>fi(new tf(fi(e),...t)),sf=_i((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===v?(e=Bi(e.x,e.y.oneMinus()).mul(2).sub(1),i=Oi(Ii(e,t),1)):i=Oi(Ii(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Oi(r.mul(i));return n.xyz.div(n.w)})),nf=_i((([e,t])=>{const r=t.mul(Oi(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Bi(s.x,s.y.oneMinus())})),of=_i((([e,t,r])=>{const s=mu(Tu(t)),i=Ui(e.mul(s)).toVar(),n=Tu(t,i).toVar(),o=Tu(t,i.sub(Ui(2,0))).toVar(),a=Tu(t,i.sub(Ui(1,0))).toVar(),u=Tu(t,i.add(Ui(1,0))).toVar(),l=Tu(t,i.add(Ui(2,0))).toVar(),d=Tu(t,i.add(Ui(0,2))).toVar(),c=Tu(t,i.add(Ui(0,1))).toVar(),h=Tu(t,i.sub(Ui(0,1))).toVar(),p=Tu(t,i.sub(Ui(0,2))).toVar(),g=Po(Gn(Ci(2).mul(a).sub(o),n)).toVar(),m=Po(Gn(Ci(2).mul(u).sub(l),n)).toVar(),f=Po(Gn(Ci(2).mul(c).sub(d),n)).toVar(),y=Po(Gn(Ci(2).mul(h).sub(p),n)).toVar(),b=sf(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(sf(e.sub(Bi(Ci(1).div(s.x),0)),a,r)),b.negate().add(sf(e.add(Bi(Ci(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(sf(e.add(Bi(0,Ci(1).div(s.y))),c,r)),b.negate().add(sf(e.sub(Bi(0,Ci(1).div(s.y))),h,r)));return Ro(ra(x,T))}));class af extends R{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageInstancedBufferAttribute=!0}}class uf extends ve{constructor(e,t,r=Float32Array){!1===ArrayBuffer.isView(e)&&(e=new r(e*t)),super(e,t),this.isStorageBufferAttribute=!0}}class lf extends Bs{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const df=xi(lf);class cf extends xl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(t=gs(e.itemSize),r=e.count),super(e,t,r),this.isStorageBufferNode=!0,this.access=Ss.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this.bufferCount=r,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return df(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=qa(this.value),this._varying=wa(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}generate(e){if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const hf=(e,t,r)=>fi(new cf(e,t,r));class pf extends cu{static get type(){return"VertexColorNode"}constructor(e=0){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}class gf extends Ms{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const mf=Ti(gf),ff=new Se,yf=new n;class bf extends Ms{static get type(){return"SceneNode"}constructor(e=bf.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===bf.BACKGROUND_BLURRINESS?s=Rl("backgroundBlurriness","float",r):t===bf.BACKGROUND_INTENSITY?s=Rl("backgroundIntensity","float",r):t===bf.BACKGROUND_ROTATION?s=tn("mat4").label("backgroundRotation").setGroup(Zi).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Ne?(ff.copy(r.backgroundRotation),ff.x*=-1,ff.y*=-1,ff.z*=-1,yf.makeRotationFromEuler(ff)):yf.identity(),yf})):console.error("THREE.SceneNode: Unknown scope:",t),s}}bf.BACKGROUND_BLURRINESS="backgroundBlurriness",bf.BACKGROUND_INTENSITY="backgroundIntensity",bf.BACKGROUND_ROTATION="backgroundRotation";const xf=Ti(bf,bf.BACKGROUND_BLURRINESS),Tf=Ti(bf,bf.BACKGROUND_INTENSITY),_f=Ti(bf,bf.BACKGROUND_ROTATION);class vf extends bu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Ss.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);e.getNodeProperties(this).storeNode=this.storeNode}setAccess(e){return this.access=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Ss.READ_WRITE)}toReadOnly(){return this.setAccess(Ss.READ_ONLY)}toWriteOnly(){return this.setAccess(Ss.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),o=s.build(e,"vec4"),a=e.generateTextureStore(e,i,n,o);e.addLineFlowCode(a,this)}}const Nf=xi(vf);class Sf extends Al{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const Af=new WeakMap;class Rf extends Fs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=vs.OBJECT,this.updateAfterType=vs.OBJECT,this.previousModelWorldMatrix=tn(new n),this.previousProjectionMatrix=tn(new n).setGroup(Zi),this.previousCameraViewMatrix=tn(new n)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Ef(r);this.previousModelWorldMatrix.value.copy(s);const i=Cf(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new n,i.previousCameraViewMatrix=new n,i.currentProjectionMatrix=new n,i.currentCameraViewMatrix=new n,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Ef(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?Nu:tn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul($u).mul(qu),s=this.previousProjectionMatrix.mul(t).mul(Ku),i=r.xy.div(r.w),n=s.xy.div(s.w);return Gn(i,n)}}function Cf(e){let t=Af.get(e);return void 0===t&&(t={},Af.set(e,t)),t}function Ef(e,t=0){const r=Cf(e);let s=r[t];return void 0===s&&(r[t]=s=new n),s}const wf=Ti(Rf),Mf=_i((([e,t])=>Ko(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Bf=_i((([e,t])=>Ko(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Uf=_i((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ff=_i((([e,t])=>da(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Qo(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Pf=_i((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Oi(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)})).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),If=_i((([e])=>Of(e.rgb))),Lf=_i((([e,t=Ci(1)])=>t.mix(Of(e.rgb),e.rgb))),Df=_i((([e,t=Ci(1)])=>{const r=On(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return da(e.rgb,s,i)})),Vf=_i((([e,t=Ci(1)])=>{const r=Ii(.57735,.57735,.57735),s=t.cos();return Ii(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(ta(r,e.rgb).mul(s.oneMinus())))))})),Of=(e,t=Ii(u.getLuminanceCoefficients(new r)))=>ta(e,t),Gf=_i((([e,t=Ii(1),s=Ii(0),i=Ii(1),n=Ci(1),o=Ii(u.getLuminanceCoefficients(new r,Ae))])=>{const a=e.rgb.dot(Ii(o)),l=Xo(e.rgb.mul(t).add(s),0).toVar(),d=l.pow(i).toVar();return Si(l.r.greaterThan(0),(()=>{l.r.assign(d.r)})),Si(l.g.greaterThan(0),(()=>{l.g.assign(d.g)})),Si(l.b.greaterThan(0),(()=>{l.b.assign(d.b)})),l.assign(a.add(l.sub(a).mul(n))),Oi(l.rgb,e.a)}));class kf extends Fs{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const zf=xi(kf),$f=new t;class Hf extends bu{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return e.object.isQuadMesh&&this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Wf extends Hf{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){return new this.constructor(this.passNode,this.textureName,this.previousTexture)}}class jf extends Fs{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new B;i.isRenderTargetTexture=!0,i.name="depth";const n=new ge(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:ye,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=tn(0),this._cameraFar=tn(0),this._mrt=null,this.isPassNode=!0,this.updateBeforeType=vs.FRAME}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}isGlobal(){return!0}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=fi(new Wf(this,e)),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=fi(new Wf(this,e,!0)),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Oc(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Dc(i,r,s)}return t}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,!0===e.backend.isWebGLBackend&&(this.renderTarget.samples=0),this.scope===jf.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r,camera:s}=this;this._pixelRatio=t.getPixelRatio();const i=t.getSize($f);this.setSize(i.width,i.height);const n=t.getRenderTarget(),o=t.getMRT();this._cameraNear.value=s.near,this._cameraFar.value=s.far;for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(n),t.setMRT(o)}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio,s=this._height*this._pixelRatio;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}jf.COLOR="color",jf.DEPTH="depth";class qf extends jf{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(jf.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction(((e,r,s,i,n,o,a,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,o,a,u)}t.renderObject(e,r,s,i,n,o,a,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Yc;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=x;const t=sl.negate(),r=Nu.mul($u),s=Ci(1),i=r.mul(Oi(qu,1)),n=r.mul(Oi(qu.add(t),1)),o=Ro(i.sub(n));return e.vertexNode=i.add(o.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Oi(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Kf=_i((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Xf=_i((([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp())).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Yf=_i((([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)})).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Qf=_i((([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)})),Zf=_i((([e,t])=>{const r=Hi(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Hi(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Qf(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Jf=Hi(Ii(1.6605,-.1246,-.0182),Ii(-.5876,1.1329,-.1006),Ii(-.0728,-.0083,1.1187)),ey=Hi(Ii(.6274,.0691,.0164),Ii(.3293,.9195,.088),Ii(.0433,.0113,.8956)),ty=_i((([e])=>{const t=Ii(e).toVar(),r=Ii(t.mul(t)).toVar(),s=Ii(r.mul(r)).toVar();return Ci(15.5).mul(s.mul(r)).sub(kn(40.14,s.mul(t))).add(kn(31.96,s).sub(kn(6.868,r.mul(t))).add(kn(.4298,r).add(kn(.1191,t).sub(.00232))))})),ry=_i((([e,t])=>{const r=Ii(e).toVar(),s=Hi(Ii(.856627153315983,.137318972929847,.11189821299995),Ii(.0951212405381588,.761241990602591,.0767994186031903),Ii(.0482516061458583,.101439036467562,.811302368396859)),i=Hi(Ii(1.1271005818144368,-.1413297634984383,-.14132976349843826),Ii(-.11060664309660323,1.157823702216272,-.11060664309660294),Ii(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Ci(-12.47393),o=Ci(4.026069);return r.mulAssign(t),r.assign(ey.mul(r)),r.assign(s.mul(r)),r.assign(Xo(r,1e-10)),r.assign(_o(r)),r.assign(r.sub(n).div(o.sub(n))),r.assign(ca(r,0,1)),r.assign(ty(r)),r.assign(i.mul(r)),r.assign(sa(Xo(Ii(0),r),Ii(2.2))),r.assign(Jf.mul(r)),r.assign(ca(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),sy=_i((([e,t])=>{const r=Ci(.76),s=Ci(.15);e=e.mul(t);const i=Ko(e.r,Ko(e.g,e.b)),n=Ta(i.lessThan(.08),i.sub(kn(6.25,i.mul(i))),.04);e.subAssign(n);const o=Xo(e.r,Xo(e.g,e.b));Si(o.lessThan(r),(()=>e));const a=Gn(1,r),u=Gn(1,a.mul(a).div(o.add(a.sub(r))));e.mulAssign(u.div(o));const l=Gn(1,zn(1,s.mul(o.sub(u)).add(1)));return da(e,Ii(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class iy extends Ms{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.code=e,this.includes=t,this.language=r}isGlobal(){return!0}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const ny=xi(iy);class oy extends iy{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const o=e.getPropertyName(n),a=this.getNodeFunction(e).getCode(o);return n.code=a+"\n","property"===t?o:e.format(`${o}()`,i,t)}}const ay=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class uy extends Ms{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new o,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:Ci()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=bs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const ly=xi(uy);class dy extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class cy{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const hy=new dy;class py extends Ms{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new dy,this._output=ly(),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=ly(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=ly(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new cy(this),t=hy.get("THREE"),r=hy.get("TSL"),s=this.getMethod(this.codeNode),i=[e,this._local,hy,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:Ci()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return ls(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const gy=xi(py);class my extends Ms{static get type(){return"FogNode"}constructor(e,t){super("float"),this.isFogNode=!0,this.colorNode=e,this.factorNode=t}getViewZNode(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Qu.z).negate()}setup(){return this.factorNode}}const fy=xi(my);class yy extends my{static get type(){return"FogRangeNode"}constructor(e,t,r){super(e,null),this.isFogRangeNode=!0,this.nearNode=t,this.farNode=r}setup(e){const t=this.getViewZNode(e);return ga(this.nearNode,this.farNode,t)}}const by=xi(yy);class xy extends my{static get type(){return"FogExp2Node"}constructor(e,t){super(e,null),this.isFogExp2Node=!0,this.densityNode=t}setup(e){const t=this.getViewZNode(e),r=this.densityNode;return r.mul(r,t,t).negate().exp().oneMinus()}}const Ty=xi(xy);let _y=null,vy=null;class Ny extends Ms{static get type(){return"RangeNode"}constructor(e=Ci(),t=Ci()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(fs(this.minNode.value)),r=e.getTypeLength(fs(this.maxNode.value));return t>r?t:r}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.minNode.value,n=this.maxNode.value,o=e.getTypeLength(fs(i)),u=e.getTypeLength(fs(n));_y=_y||new s,vy=vy||new s,_y.setScalar(0),vy.setScalar(0),1===o?_y.setScalar(i):i.isColor?_y.set(i.r,i.g,i.b):_y.set(i.x,i.y,i.z||0,i.w||0),1===u?vy.setScalar(n):n.isColor?vy.set(n.r,n.g,n.b):vy.set(n.x,n.y,n.z||0,n.w||0);const l=4,d=l*t.count,c=new Float32Array(d);for(let e=0;efi(new Ay(e,t)),Cy=Ry("numWorkgroups","uvec3"),Ey=Ry("workgroupId","uvec3"),wy=Ry("localId","uvec3"),My=Ry("subgroupSize","uint");const By=xi(class extends Ms{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class Uy extends Bs{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class Fy extends Ms{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.scope=e}label(e){return this.name=e,this}getHash(){return this.uuid}setScope(e){return this.scope=e,this}getInputType(){return`${this.scope}Array`}element(e){return fi(new Uy(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Py extends Fs{static get type(){return"AtomicFunctionNode"}constructor(e,t,r,s=null){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.storeNode=s}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=this.method,r=this.getNodeType(e),s=this.getInputType(e),i=this.pointerNode,n=this.valueNode,o=[];o.push(`&${i.build(e,s)}`),o.push(n.build(e,s));const a=`${e.getMethod(t,r)}( ${o.join(", ")} )`;if(null!==this.storeNode){const t=this.storeNode.build(e,s);e.addLineFlowCode(`${t} = ${a}`,this)}else e.addLineFlowCode(a,this)}}Py.ATOMIC_LOAD="atomicLoad",Py.ATOMIC_STORE="atomicStore",Py.ATOMIC_ADD="atomicAdd",Py.ATOMIC_SUB="atomicSub",Py.ATOMIC_MAX="atomicMax",Py.ATOMIC_MIN="atomicMin",Py.ATOMIC_AND="atomicAnd",Py.ATOMIC_OR="atomicOr",Py.ATOMIC_XOR="atomicXor";const Iy=xi(Py),Ly=(e,t,r,s)=>{const i=Iy(e,t,r,s);return i.append(),i};let Dy;function Vy(e){Dy=Dy||new WeakMap;let t=Dy.get(e);return void 0===t&&Dy.set(e,t={}),t}function Oy(e){const t=Vy(e);return t.shadowMatrix||(t.shadowMatrix=tn("mat4").setGroup(Zi).onRenderUpdate((()=>(e.shadow.updateMatrices(e),e.shadow.matrix))))}function Gy(e){const t=Vy(e);if(void 0===t.projectionUV){const r=Oy(e).mul(Xu);t.projectionUV=r.xyz.div(r.w)}return t.projectionUV}function ky(e){const t=Vy(e);return t.position||(t.position=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function zy(e){const t=Vy(e);return t.targetPosition||(t.targetPosition=tn(new r).setGroup(Zi).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function $y(e){const t=Vy(e);return t.viewPosition||(t.viewPosition=tn(new r).setGroup(Zi).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const Hy=e=>Au.transformDirection(ky(e).sub(zy(e))),Wy=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},jy=new WeakMap;class qy extends Ms{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Ii().toVar("totalDiffuse"),this.totalSpecularNode=Ii().toVar("totalSpecular"),this.outgoingLightNode=Ii().toVar("outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[];for(let t=0;te.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(fi(e));else{let s=null;if(null!==r&&(s=Wy(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){console.warn(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;jy.has(e)?s=jy.get(e):(s=fi(new r(e)),jy.set(e,s)),t.push(s)}}this._lightNodes=t}setupLights(e,t){for(const r of t)r.build(e)}setup(e){null===this._lightNodes&&this.setupLightsNode(e);const t=e.context,r=t.lightingModel;let s=this.outgoingLightNode;if(r){const{_lightNodes:i,totalDiffuseNode:n,totalSpecularNode:o}=this;t.outgoingLight=s;const a=e.addStack();e.getDataFromNode(this).nodes=a.nodes,r.start(t,a,e),this.setupLights(e,i),r.indirect(t,a,e);const{backdrop:u,backdropAlpha:l}=t,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=t.reflectedLight;let g=d.add(h);null!==u&&(g=Ii(null!==l?l.mix(g,u):u),t.material.transparent=!0),n.assign(g),o.assign(c.add(p)),s.assign(n.add(o)),r.finish(t,a,e),s=s.bypass(e.removeStack())}return s}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}const Ky=(e=[])=>fi(new qy).setLights(e);class Xy extends Ms{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=vs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({material:e}){Yy.assign(e.shadowPositionNode||Xu)}dispose(){this.updateBeforeType=vs.NONE}}const Yy=Ii().toVar("shadowWorldPosition"),Qy=new WeakMap,Zy=_i((([e,t,r])=>{let s=Xu.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Jy=e=>{let t=Qy.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=Rl("near","float",t).setGroup(Zi),s=Rl("far","float",t).setGroup(Zi),i=Uu(e);return Zy(i,r,s)})(e):null;t=new Yc,t.colorNode=Oi(0,0,0,1),t.depthNode=r,t.isShadowNodeMaterial=!0,t.blending=D,t.name="ShadowMaterial",Qy.set(e,t)}return t},eb=_i((({depthTexture:e,shadowCoord:t})=>xu(e,t.xy).compare(t.z))),tb=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Rl("radius","float",r).setGroup(Zi),o=Bi(1).div(i),a=o.x.negate().mul(n),u=o.y.negate().mul(n),l=o.x.mul(n),d=o.y.mul(n),c=a.div(2),h=u.div(2),p=l.div(2),g=d.div(2);return On(s(t.xy.add(Bi(a,u)),t.z),s(t.xy.add(Bi(0,u)),t.z),s(t.xy.add(Bi(l,u)),t.z),s(t.xy.add(Bi(c,h)),t.z),s(t.xy.add(Bi(0,h)),t.z),s(t.xy.add(Bi(p,h)),t.z),s(t.xy.add(Bi(a,0)),t.z),s(t.xy.add(Bi(c,0)),t.z),s(t.xy,t.z),s(t.xy.add(Bi(p,0)),t.z),s(t.xy.add(Bi(l,0)),t.z),s(t.xy.add(Bi(c,g)),t.z),s(t.xy.add(Bi(0,g)),t.z),s(t.xy.add(Bi(p,g)),t.z),s(t.xy.add(Bi(a,d)),t.z),s(t.xy.add(Bi(0,d)),t.z),s(t.xy.add(Bi(l,d)),t.z)).mul(1/17)})),rb=_i((({depthTexture:e,shadowCoord:t,shadow:r})=>{const s=(t,r)=>xu(e,t).compare(r),i=Rl("mapSize","vec2",r).setGroup(Zi),n=Bi(1).div(i),o=n.x,a=n.y,u=t.xy,l=Co(u.mul(i).add(.5));return u.subAssign(l.mul(n)),On(s(u,t.z),s(u.add(Bi(o,0)),t.z),s(u.add(Bi(0,a)),t.z),s(u.add(n),t.z),da(s(u.add(Bi(o.negate(),0)),t.z),s(u.add(Bi(o.mul(2),0)),t.z),l.x),da(s(u.add(Bi(o.negate(),a)),t.z),s(u.add(Bi(o.mul(2),a)),t.z),l.x),da(s(u.add(Bi(0,a.negate())),t.z),s(u.add(Bi(0,a.mul(2))),t.z),l.y),da(s(u.add(Bi(o,a.negate())),t.z),s(u.add(Bi(o,a.mul(2))),t.z),l.y),da(da(s(u.add(Bi(o.negate(),a.negate())),t.z),s(u.add(Bi(o.mul(2),a.negate())),t.z),l.x),da(s(u.add(Bi(o.negate(),a.mul(2))),t.z),s(u.add(Bi(o.mul(2),a.mul(2))),t.z),l.x),l.y)).mul(1/9)})),sb=_i((({depthTexture:e,shadowCoord:t})=>{const r=Ci(1).toVar(),s=xu(e).sample(t.xy).rg,i=Qo(t.z,s.x);return Si(i.notEqual(Ci(1)),(()=>{const e=t.z.sub(s.x),n=Xo(0,s.y.mul(s.y));let o=n.div(n.add(e.mul(e)));o=ca(Gn(o,.3).div(.95-.3)),r.assign(ca(Xo(i,o)))})),r})),ib=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.sample(On(_c.xy,Bi(0,u).mul(t)).div(r)).x;i.addAssign(l),n.addAssign(l.mul(l))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),nb=_i((({samples:e,radius:t,size:r,shadowPass:s})=>{const i=Ci(0).toVar(),n=Ci(0).toVar(),o=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(2).div(e.sub(1))),a=e.lessThanEqual(Ci(1)).select(Ci(0),Ci(-1));ic({start:Ei(0),end:Ei(e),type:"int",condition:"<"},(({i:e})=>{const u=a.add(Ci(e).mul(o)),l=s.sample(On(_c.xy,Bi(u,0).mul(t)).div(r));i.addAssign(l.x),n.addAssign(On(l.y.mul(l.y),l.x.mul(l.x)))})),i.divAssign(e),n.divAssign(e);const u=vo(n.sub(i.mul(i)));return Bi(i,u)})),ob=[eb,tb,rb,sb],ab=new Jm;class ub extends Xy{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this.isShadowNode=!0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){const n=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i});return n.select(o,Ci(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=Rl("bias","float",r).setGroup(Zi);let n,o=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)o=o.xyz.div(o.w),n=o.z,s.coordinateSystem===v&&(n=n.mul(2).sub(1));else{const e=o.w;o=o.xy.div(e);const t=Rl("near","float",r.camera).setGroup(Zi),s=Rl("far","float",r.camera).setGroup(Zi);n=Gc(e.negate(),t,s)}return o=Ii(o.x,o.y.oneMinus(),n.add(i)),o}getShadowFilterFn(e){return ob[e]}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,n=new B(s.mapSize.width,s.mapSize.height);n.compareFunction=Re;const o=e.createRenderTarget(s.mapSize.width,s.mapSize.height);if(o.depthTexture=n,s.camera.updateProjectionMatrix(),i===Ce){n.compareFunction=null,this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ee,type:ye});const t=xu(n),r=xu(this.vsmShadowMapVertical.texture),i=Rl("blurSamples","float",s).setGroup(Zi),o=Rl("radius","float",s).setGroup(Zi),a=Rl("mapSize","vec2",s).setGroup(Zi);let u=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Yc);u.fragmentNode=ib({samples:i,radius:o,size:a,shadowPass:t}).context(e.getSharedContext()),u.name="VSMVertical",u=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Yc),u.fragmentNode=nb({samples:i,radius:o,size:a,shadowPass:r}).context(e.getSharedContext()),u.name="VSMHorizontal"}const a=Rl("intensity","float",s).setGroup(Zi),u=Rl("normalBias","float",s).setGroup(Zi),l=Oy(r).mul(Yy.add(ul.mul(u))),d=this.setupShadowCoord(e,l),c=s.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===c)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const h=i===Ce?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:o.texture,depthTexture:h,shadowCoord:d,shadow:s}),g=xu(o.texture,d),m=da(1,p.rgb.mix(g,1),a.mul(g.a)).toVar();return this.shadowMap=o,this.shadow.map=o,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return _i((()=>{let t=this._node;return this.setupShadowPosition(e),null===t&&(this._node=t=this.setupShadow(e)),e.material.shadowNode&&console.warn('THREE.NodeMaterial: ".shadowNode" is deprecated. Use ".castShadowNode" instead.'),e.material.receivedShadowNode&&(t=e.material.receivedShadowNode(t)),t}))()}renderShadow(e){const{shadow:t,shadowMap:r}=this,{renderer:s,scene:i}=e;r.setSize(t.mapSize.width,t.mapSize.height),s.render(i,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:o}=e,a=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=n.overrideMaterial;n.overrideMaterial=Jy(r),s.camera.layers.mask=o.layers.mask;const d=i.getRenderTarget(),c=i.getRenderObjectFunction(),h=i.getMRT();i.setMRT(null),i.setRenderObjectFunction(((e,t,r,n,u,l,...d)=>{(!0===e.castShadow||e.receiveShadow&&a===Ce)&&(e.onBeforeShadow(i,e,o,s.camera,n,t.overrideMaterial,l),i.renderObject(e,t,r,n,u,l,...d),e.onAfterShadow(i,e,o,s.camera,n,t.overrideMaterial,l))})),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(c),!0!==r.isPointLight&&a===Ce&&this.vsmPass(i),i.setRenderTarget(d),i.setMRT(h),n.overrideMaterial=l}vsmPass(e){const{shadow:t}=this;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height),e.setRenderTarget(this.vsmShadowMapVertical),ab.material=this.vsmMaterialVertical,ab.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),ab.material=this.vsmMaterialHorizontal,ab.render(e)}dispose(){this.shadowMap.dispose(),this.shadowMap=null,null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null),super.dispose()}updateBefore(e){const{shadow:t}=this;(t.needsUpdate||t.autoUpdate)&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const lb=(e,t)=>fi(new ub(e,t));class db extends cc{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||tn(this.color).setGroup(Zi),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=vs.FRAME}customCacheKey(){return ds(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}setupShadowNode(){return lb(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const t=this.light.shadow.shadowNode;let s;s=void 0!==t?fi(t):this.setupShadowNode(e),this.shadowNode=s,this.shadowColorNode=r=this.colorNode.mul(s),this.baseColorNode=this.colorNode}this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const cb=_i((e=>{const{lightDistance:t,cutoffDistance:r,decayExponent:s}=e,i=t.pow(s).max(.01).reciprocal();return r.greaterThan(0).select(i.mul(t.div(r).pow4().oneMinus().clamp().pow2()),i)})),hb=new e,pb=_i((([e,t])=>{const r=e.toVar(),s=Po(r),i=zn(1,Xo(s.x,Xo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Bi(r.xy).toVar(),o=t.mul(1.5).oneMinus();return Si(s.z.greaterThanEqual(o),(()=>{Si(r.z.greaterThan(0),(()=>{n.x.assign(Gn(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(o),(()=>{const e=Io(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(o),(()=>{const e=Io(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Bi(.125,.25).mul(n).add(Bi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),gb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>xu(e,pb(t,s.y)).compare(r))),mb=_i((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=Rl("radius","float",i).setGroup(Zi),o=Bi(-1,1).mul(n).mul(s.y);return xu(e,pb(t.add(o.xyy),s.y)).compare(r).add(xu(e,pb(t.add(o.yyy),s.y)).compare(r)).add(xu(e,pb(t.add(o.xyx),s.y)).compare(r)).add(xu(e,pb(t.add(o.yyx),s.y)).compare(r)).add(xu(e,pb(t,s.y)).compare(r)).add(xu(e,pb(t.add(o.xxy),s.y)).compare(r)).add(xu(e,pb(t.add(o.yxy),s.y)).compare(r)).add(xu(e,pb(t.add(o.xxx),s.y)).compare(r)).add(xu(e,pb(t.add(o.yxx),s.y)).compare(r)).mul(1/9)})),fb=_i((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),o=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.near)),a=tn("float").setGroup(Zi).onRenderUpdate((()=>s.camera.far)),u=Rl("bias","float",s).setGroup(Zi),l=tn(s.mapSize).setGroup(Zi),d=Ci(1).toVar();return Si(n.sub(a).lessThanEqual(0).and(n.sub(o).greaterThanEqual(0)),(()=>{const r=n.sub(o).div(a.sub(o)).toVar();r.addAssign(u);const c=i.normalize(),h=Bi(1).div(l.mul(Bi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),yb=new s,bb=new t,xb=new t;class Tb extends ub{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===we?gb:mb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return fb({filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n})}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,o=t.getFrameExtents();xb.copy(t.mapSize),xb.multiply(o),r.setSize(xb.width,xb.height),bb.copy(t.mapSize);const a=i.autoClear,u=i.getClearColor(hb),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;e{const n=i.context.lightingModel,o=t.sub(Qu),a=o.normalize(),u=o.length(),l=cb({lightDistance:u,cutoffDistance:r,decayExponent:s}),d=e.mul(l),c=i.context.reflectedLight;n.direct({lightDirection:a,lightColor:d,reflectedLight:c},i.stack,i)}));class vb extends db{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return((e,t)=>fi(new Tb(e,t)))(this.light)}setup(e){super.setup(e),_b({color:this.colorNode,lightViewPosition:$y(this.light),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}).append()}}const Nb=_i((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),Sb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Mi(e).toVar();return Ta(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Ab=_i((([e,t])=>{const r=Mi(t).toVar(),s=Ci(e).toVar();return Ta(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),Rb=_i((([e])=>{const t=Ci(e).toVar();return Ei(So(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),Cb=_i((([e,t])=>{const r=Ci(e).toVar();return t.assign(Rb(r)),r.sub(Ci(t))})),Eb=vm([_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ci(s).toVar(),l=Ci(r).toVar(),d=Ci(t).toVar(),c=Ci(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),_i((([e,t,r,s,i,n])=>{const o=Ci(n).toVar(),a=Ci(i).toVar(),u=Ii(s).toVar(),l=Ii(r).toVar(),d=Ii(t).toVar(),c=Ii(e).toVar(),h=Ci(Gn(1,a)).toVar();return Gn(1,o).mul(c.mul(h).add(d.mul(a))).add(o.mul(l.mul(h).add(u.mul(a))))})).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),wb=vm([_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ci(a).toVar(),m=Ci(o).toVar(),f=Ci(n).toVar(),y=Ci(i).toVar(),b=Ci(s).toVar(),x=Ci(r).toVar(),T=Ci(t).toVar(),_=Ci(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),_i((([e,t,r,s,i,n,o,a,u,l,d])=>{const c=Ci(d).toVar(),h=Ci(l).toVar(),p=Ci(u).toVar(),g=Ii(a).toVar(),m=Ii(o).toVar(),f=Ii(n).toVar(),y=Ii(i).toVar(),b=Ii(s).toVar(),x=Ii(r).toVar(),T=Ii(t).toVar(),_=Ii(e).toVar(),v=Ci(Gn(1,p)).toVar(),N=Ci(Gn(1,h)).toVar();return Ci(Gn(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))})).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),Mb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=wi(e).toVar(),o=wi(n.bitAnd(wi(7))).toVar(),a=Ci(Sb(o.lessThan(wi(4)),i,s)).toVar(),u=Ci(kn(2,Sb(o.lessThan(wi(4)),s,i))).toVar();return Ab(a,Mi(o.bitAnd(wi(1)))).add(Ab(u,Mi(o.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Bb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=wi(e).toVar(),u=wi(a.bitAnd(wi(15))).toVar(),l=Ci(Sb(u.lessThan(wi(8)),o,n)).toVar(),d=Ci(Sb(u.lessThan(wi(4)),n,Sb(u.equal(wi(12)).or(u.equal(wi(14))),o,i))).toVar();return Ab(l,Mi(u.bitAnd(wi(1)))).add(Ab(d,Mi(u.bitAnd(wi(2)))))})).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Ub=vm([Mb,Bb]),Fb=_i((([e,t,r])=>{const s=Ci(r).toVar(),i=Ci(t).toVar(),n=Di(e).toVar();return Ii(Ub(n.x,i,s),Ub(n.y,i,s),Ub(n.z,i,s))})).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),Pb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ci(t).toVar(),a=Di(e).toVar();return Ii(Ub(a.x,o,n,i),Ub(a.y,o,n,i),Ub(a.z,o,n,i))})).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),Ib=vm([Fb,Pb]),Lb=_i((([e])=>{const t=Ci(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Db=_i((([e])=>{const t=Ci(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),Vb=vm([Lb,_i((([e])=>{const t=Ii(e).toVar();return kn(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Ob=vm([Db,_i((([e])=>{const t=Ii(e).toVar();return kn(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Gb=_i((([e,t])=>{const r=Ei(t).toVar(),s=wi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Ei(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),kb=_i((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Gb(r,Ei(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Gb(e,Ei(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Gb(t,Ei(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Gb(r,Ei(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Gb(e,Ei(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Gb(t,Ei(4))),t.addAssign(e)})),zb=_i((([e,t,r])=>{const s=wi(r).toVar(),i=wi(t).toVar(),n=wi(e).toVar();return s.bitXorAssign(i),s.subAssign(Gb(i,Ei(14))),n.bitXorAssign(s),n.subAssign(Gb(s,Ei(11))),i.bitXorAssign(n),i.subAssign(Gb(n,Ei(25))),s.bitXorAssign(i),s.subAssign(Gb(i,Ei(16))),n.bitXorAssign(s),n.subAssign(Gb(s,Ei(4))),i.bitXorAssign(n),i.subAssign(Gb(n,Ei(14))),s.bitXorAssign(i),s.subAssign(Gb(i,Ei(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),$b=_i((([e])=>{const t=wi(e).toVar();return Ci(t).div(Ci(wi(Ei(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Hb=_i((([e])=>{const t=Ci(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))})).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Wb=vm([_i((([e])=>{const t=Ei(e).toVar(),r=wi(wi(1)).toVar(),s=wi(wi(Ei(3735928559)).add(r.shiftLeft(wi(2))).add(wi(13))).toVar();return zb(s.add(wi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi(wi(2)).toVar(),n=wi().toVar(),o=wi().toVar(),a=wi().toVar();return n.assign(o.assign(a.assign(wi(Ei(3735928559)).add(i.shiftLeft(wi(2))).add(wi(13))))),n.addAssign(wi(s)),o.addAssign(wi(r)),zb(n,o,a)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi(wi(3)).toVar(),a=wi().toVar(),u=wi().toVar(),l=wi().toVar();return a.assign(u.assign(l.assign(wi(Ei(3735928559)).add(o.shiftLeft(wi(2))).add(wi(13))))),a.addAssign(wi(n)),u.addAssign(wi(i)),l.addAssign(wi(s)),zb(a,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),_i((([e,t,r,s])=>{const i=Ei(s).toVar(),n=Ei(r).toVar(),o=Ei(t).toVar(),a=Ei(e).toVar(),u=wi(wi(4)).toVar(),l=wi().toVar(),d=wi().toVar(),c=wi().toVar();return l.assign(d.assign(c.assign(wi(Ei(3735928559)).add(u.shiftLeft(wi(2))).add(wi(13))))),l.addAssign(wi(a)),d.addAssign(wi(o)),c.addAssign(wi(n)),kb(l,d,c),l.addAssign(wi(i)),zb(l,d,c)})).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),_i((([e,t,r,s,i])=>{const n=Ei(i).toVar(),o=Ei(s).toVar(),a=Ei(r).toVar(),u=Ei(t).toVar(),l=Ei(e).toVar(),d=wi(wi(5)).toVar(),c=wi().toVar(),h=wi().toVar(),p=wi().toVar();return c.assign(h.assign(p.assign(wi(Ei(3735928559)).add(d.shiftLeft(wi(2))).add(wi(13))))),c.addAssign(wi(l)),h.addAssign(wi(u)),p.addAssign(wi(a)),kb(c,h,p),c.addAssign(wi(o)),h.addAssign(wi(n)),zb(c,h,p)})).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),jb=vm([_i((([e,t])=>{const r=Ei(t).toVar(),s=Ei(e).toVar(),i=wi(Wb(s,r)).toVar(),n=Di().toVar();return n.x.assign(i.bitAnd(Ei(255))),n.y.assign(i.shiftRight(Ei(8)).bitAnd(Ei(255))),n.z.assign(i.shiftRight(Ei(16)).bitAnd(Ei(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ei(t).toVar(),n=Ei(e).toVar(),o=wi(Wb(n,i,s)).toVar(),a=Di().toVar();return a.x.assign(o.bitAnd(Ei(255))),a.y.assign(o.shiftRight(Ei(8)).bitAnd(Ei(255))),a.z.assign(o.shiftRight(Ei(16)).bitAnd(Ei(255))),a})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),qb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Cb(t.x,r)).toVar(),n=Ci(Cb(t.y,s)).toVar(),o=Ci(Hb(i)).toVar(),a=Ci(Hb(n)).toVar(),u=Ci(Eb(Ub(Wb(r,s),i,n),Ub(Wb(r.add(Ei(1)),s),i.sub(1),n),Ub(Wb(r,s.add(Ei(1))),i,n.sub(1)),Ub(Wb(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Vb(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Cb(t.x,r)).toVar(),o=Ci(Cb(t.y,s)).toVar(),a=Ci(Cb(t.z,i)).toVar(),u=Ci(Hb(n)).toVar(),l=Ci(Hb(o)).toVar(),d=Ci(Hb(a)).toVar(),c=Ci(wb(Ub(Wb(r,s,i),n,o,a),Ub(Wb(r.add(Ei(1)),s,i),n.sub(1),o,a),Ub(Wb(r,s.add(Ei(1)),i),n,o.sub(1),a),Ub(Wb(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Ub(Wb(r,s,i.add(Ei(1))),n,o,a.sub(1)),Ub(Wb(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Ub(Wb(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Ub(Wb(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Ob(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),Kb=vm([_i((([e])=>{const t=Bi(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ci(Cb(t.x,r)).toVar(),n=Ci(Cb(t.y,s)).toVar(),o=Ci(Hb(i)).toVar(),a=Ci(Hb(n)).toVar(),u=Ii(Eb(Ib(jb(r,s),i,n),Ib(jb(r.add(Ei(1)),s),i.sub(1),n),Ib(jb(r,s.add(Ei(1))),i,n.sub(1)),Ib(jb(r.add(Ei(1)),s.add(Ei(1))),i.sub(1),n.sub(1)),o,a)).toVar();return Vb(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei().toVar(),s=Ei().toVar(),i=Ei().toVar(),n=Ci(Cb(t.x,r)).toVar(),o=Ci(Cb(t.y,s)).toVar(),a=Ci(Cb(t.z,i)).toVar(),u=Ci(Hb(n)).toVar(),l=Ci(Hb(o)).toVar(),d=Ci(Hb(a)).toVar(),c=Ii(wb(Ib(jb(r,s,i),n,o,a),Ib(jb(r.add(Ei(1)),s,i),n.sub(1),o,a),Ib(jb(r,s.add(Ei(1)),i),n,o.sub(1),a),Ib(jb(r.add(Ei(1)),s.add(Ei(1)),i),n.sub(1),o.sub(1),a),Ib(jb(r,s,i.add(Ei(1))),n,o,a.sub(1)),Ib(jb(r.add(Ei(1)),s,i.add(Ei(1))),n.sub(1),o,a.sub(1)),Ib(jb(r,s.add(Ei(1)),i.add(Ei(1))),n,o.sub(1),a.sub(1)),Ib(jb(r.add(Ei(1)),s.add(Ei(1)),i.add(Ei(1))),n.sub(1),o.sub(1),a.sub(1)),u,l,d)).toVar();return Ob(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Xb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Rb(t)).toVar();return $b(Wb(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar();return $b(Wb(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar();return $b(Wb(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar(),n=Ei(Rb(t.w)).toVar();return $b(Wb(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Yb=vm([_i((([e])=>{const t=Ci(e).toVar(),r=Ei(Rb(t)).toVar();return Ii($b(Wb(r,Ei(0))),$b(Wb(r,Ei(1))),$b(Wb(r,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),_i((([e])=>{const t=Bi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar();return Ii($b(Wb(r,s,Ei(0))),$b(Wb(r,s,Ei(1))),$b(Wb(r,s,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),_i((([e])=>{const t=Ii(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar();return Ii($b(Wb(r,s,i,Ei(0))),$b(Wb(r,s,i,Ei(1))),$b(Wb(r,s,i,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),_i((([e])=>{const t=Oi(e).toVar(),r=Ei(Rb(t.x)).toVar(),s=Ei(Rb(t.y)).toVar(),i=Ei(Rb(t.z)).toVar(),n=Ei(Rb(t.w)).toVar();return Ii($b(Wb(r,s,i,n,Ei(0))),$b(Wb(r,s,i,n,Ei(1))),$b(Wb(r,s,i,n,Ei(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Qb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ci(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(qb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Zb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(0).toVar(),l=Ci(1).toVar();return ic(o,(()=>{u.addAssign(l.mul(Kb(a))),l.mulAssign(i),a.mulAssign(n)})),u})).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Jb=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar();return Bi(Qb(a,o,n,i),Qb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i))})).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),ex=_i((([e,t,r,s])=>{const i=Ci(s).toVar(),n=Ci(r).toVar(),o=Ei(t).toVar(),a=Ii(e).toVar(),u=Ii(Zb(a,o,n,i)).toVar(),l=Ci(Qb(a.add(Ii(Ei(19),Ei(193),Ei(17))),o,n,i)).toVar();return Oi(u,l)})).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),tx=vm([_i((([e,t,r,s,i,n,o])=>{const a=Ei(o).toVar(),u=Ci(n).toVar(),l=Ei(i).toVar(),d=Ei(s).toVar(),c=Ei(r).toVar(),h=Ei(t).toVar(),p=Bi(e).toVar(),g=Ii(Yb(Bi(h.add(d),c.add(l)))).toVar(),m=Bi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Bi(Bi(Ci(h),Ci(c)).add(m)).toVar(),y=Bi(f.sub(p)).toVar();return Si(a.equal(Ei(2)),(()=>Po(y.x).add(Po(y.y)))),Si(a.equal(Ei(3)),(()=>Xo(Po(y.x),Po(y.y)))),ta(y,y)})).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),_i((([e,t,r,s,i,n,o,a,u])=>{const l=Ei(u).toVar(),d=Ci(a).toVar(),c=Ei(o).toVar(),h=Ei(n).toVar(),p=Ei(i).toVar(),g=Ei(s).toVar(),m=Ei(r).toVar(),f=Ei(t).toVar(),y=Ii(e).toVar(),b=Ii(Yb(Ii(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Ii(Ii(Ci(f),Ci(m),Ci(g)).add(b)).toVar(),T=Ii(x.sub(y)).toVar();return Si(l.equal(Ei(2)),(()=>Po(T.x).add(Po(T.y)).add(Po(T.z)))),Si(l.equal(Ei(3)),(()=>Xo(Xo(Po(T.x),Po(T.y)),Po(T.z)))),ta(T,T)})).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),rx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Cb(n.x,o),Cb(n.y,a)).toVar(),l=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(tx(u,e,t,o,a,i,s)).toVar();l.assign(Ko(l,r))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),sx=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Cb(n.x,o),Cb(n.y,a)).toVar(),l=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(tx(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),ix=_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Bi(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Bi(Cb(n.x,o),Cb(n.y,a)).toVar(),l=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{const r=Ci(tx(u,e,t,o,a,i,s)).toVar();Si(r.lessThan(l.x),(()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.z.assign(l.y),l.y.assign(r)})).ElseIf(r.lessThan(l.z),(()=>{l.z.assign(r)}))}))})),Si(s.equal(Ei(0)),(()=>{l.assign(vo(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),nx=vm([rx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Cb(n.x,o),Cb(n.y,a),Cb(n.z,u)).toVar(),d=Ci(1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(tx(l,e,t,r,o,a,u,i,s)).toVar();d.assign(Ko(d,n))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ox=vm([sx,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Cb(n.x,o),Cb(n.y,a),Cb(n.z,u)).toVar(),d=Bi(1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(tx(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ax=vm([ix,_i((([e,t,r])=>{const s=Ei(r).toVar(),i=Ci(t).toVar(),n=Ii(e).toVar(),o=Ei().toVar(),a=Ei().toVar(),u=Ei().toVar(),l=Ii(Cb(n.x,o),Cb(n.y,a),Cb(n.z,u)).toVar(),d=Ii(1e6,1e6,1e6).toVar();return ic({start:-1,end:Ei(1),name:"x",condition:"<="},(({x:e})=>{ic({start:-1,end:Ei(1),name:"y",condition:"<="},(({y:t})=>{ic({start:-1,end:Ei(1),name:"z",condition:"<="},(({z:r})=>{const n=Ci(tx(l,e,t,r,o,a,u,i,s)).toVar();Si(n.lessThan(d.x),(()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.z.assign(d.y),d.y.assign(n)})).ElseIf(n.lessThan(d.z),(()=>{d.z.assign(n)}))}))}))})),Si(s.equal(Ei(0)),(()=>{d.assign(vo(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),ux=_i((([e])=>{const t=e.y,r=e.z,s=Ii().toVar();return Si(t.lessThan(1e-4),(()=>{s.assign(Ii(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(So(i)).mul(6).toVar();const n=Ei($o(i)),o=i.sub(Ci(n)),a=r.mul(t.oneMinus()),u=r.mul(t.mul(o).oneMinus()),l=r.mul(t.mul(o.oneMinus()).oneMinus());Si(n.equal(Ei(0)),(()=>{s.assign(Ii(r,l,a))})).ElseIf(n.equal(Ei(1)),(()=>{s.assign(Ii(u,r,a))})).ElseIf(n.equal(Ei(2)),(()=>{s.assign(Ii(a,r,l))})).ElseIf(n.equal(Ei(3)),(()=>{s.assign(Ii(a,u,r))})).ElseIf(n.equal(Ei(4)),(()=>{s.assign(Ii(l,a,r))})).Else((()=>{s.assign(Ii(r,a,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),lx=_i((([e])=>{const t=Ii(e).toVar(),r=Ci(t.x).toVar(),s=Ci(t.y).toVar(),i=Ci(t.z).toVar(),n=Ci(Ko(r,Ko(s,i))).toVar(),o=Ci(Xo(r,Xo(s,i))).toVar(),a=Ci(o.sub(n)).toVar(),u=Ci().toVar(),l=Ci().toVar(),d=Ci().toVar();return d.assign(o),Si(o.greaterThan(0),(()=>{l.assign(a.div(o))})).Else((()=>{l.assign(0)})),Si(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Si(r.greaterThanEqual(o),(()=>{u.assign(s.sub(i).div(a))})).ElseIf(s.greaterThanEqual(o),(()=>{u.assign(On(2,i.sub(r).div(a)))})).Else((()=>{u.assign(On(4,r.sub(s).div(a)))})),u.mulAssign(1/6),Si(u.lessThan(0),(()=>{u.addAssign(1)}))})),Ii(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),dx=_i((([e])=>{const t=Ii(e).toVar(),r=Vi(qn(t,Ii(.04045))).toVar(),s=Ii(t.div(12.92)).toVar(),i=Ii(sa(Xo(t.add(Ii(.055)),Ii(0)).div(1.055),Ii(2.4))).toVar();return da(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),cx=(e,t)=>{e=Ci(e),t=Ci(t);const r=Bi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ga(e.sub(r),e.add(r),t)},hx=(e,t,r,s)=>da(e,t,r[s].clamp()),px=(e,t,r,s,i)=>da(e,t,cx(r,s[i])),gx=_i((([e,t,r])=>{const s=Ro(e).toVar("nDir"),i=Gn(Ci(.5).mul(t.sub(r)),Xu).div(s).toVar("rbmax"),n=Gn(Ci(-.5).mul(t.sub(r)),Xu).div(s).toVar("rbmin"),o=Ii().toVar("rbminmax");o.x=s.x.greaterThan(Ci(0)).select(i.x,n.x),o.y=s.y.greaterThan(Ci(0)).select(i.y,n.y),o.z=s.z.greaterThan(Ci(0)).select(i.z,n.z);const a=Ko(Ko(o.x,o.y),o.z).toVar("correction");return Xu.add(s.mul(a)).toVar("boxIntersection").sub(r)})),mx=_i((([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(kn(r,r).sub(kn(s,s)))),n}));var fx=Object.freeze({__proto__:null,BRDF_GGX:kh,BRDF_Lambert:Rh,BasicShadowFilter:eb,Break:nc,Continue:()=>au("continue").append(),DFGApprox:zh,D_GGX:Vh,Discard:uu,EPSILON:uo,F_Schlick:Ah,Fn:_i,INFINITY:lo,If:Si,Loop:ic,NodeAccess:Ss,NodeShaderStage:_s,NodeType:Ns,NodeUpdateType:vs,PCFShadowFilter:tb,PCFSoftShadowFilter:rb,PI:co,PI2:ho,Return:()=>au("return").append(),Schlick_to_F0:Hh,ScriptableNodeResources:hy,ShaderNode:mi,TBNViewMatrix:$l,VSMShadowFilter:sb,V_GGX_SmithCorrelated:Lh,abs:Po,acesFilmicToneMapping:Zf,acos:Uo,add:On,addMethodChaining:$s,addNodeElement:function(e){console.warn("THREE.TSLBase: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:ry,all:po,alphaT:yn,and:Yn,anisotropy:bn,anisotropyB:Tn,anisotropyT:xn,any:go,append:Ai,arrayBuffer:e=>fi(new Gs(e,"ArrayBuffer")),asin:Bo,assign:In,atan:Fo,atan2:qo,atomicAdd:(e,t,r=null)=>Ly(Py.ATOMIC_ADD,e,t,r),atomicAnd:(e,t,r=null)=>Ly(Py.ATOMIC_AND,e,t,r),atomicFunc:Ly,atomicMax:(e,t,r=null)=>Ly(Py.ATOMIC_MAX,e,t,r),atomicMin:(e,t,r=null)=>Ly(Py.ATOMIC_MIN,e,t,r),atomicOr:(e,t,r=null)=>Ly(Py.ATOMIC_OR,e,t,r),atomicStore:(e,t,r=null)=>Ly(Py.ATOMIC_STORE,e,t,r),atomicSub:(e,t,r=null)=>Ly(Py.ATOMIC_SUB,e,t,r),atomicXor:(e,t,r=null)=>Ly(Py.ATOMIC_XOR,e,t,r),attenuationColor:Un,attenuationDistance:Bn,attribute:hu,attributeArray:(e,t="float")=>{const r=ms(t),s=new uf(e,r);return hf(s,t,e)},backgroundBlurriness:xf,backgroundIntensity:Tf,backgroundRotation:_f,batch:Jd,billboarding:Em,bitAnd:eo,bitNot:to,bitOr:ro,bitXor:so,bitangentGeometry:Dl,bitangentLocal:Vl,bitangentView:Ol,bitangentWorld:Gl,bitcast:Wo,blendBurn:Mf,blendColor:Pf,blendDodge:Bf,blendOverlay:Ff,blendScreen:Uf,blur:zp,bool:Mi,buffer:Tl,bufferAttribute:qa,bumpMap:Zl,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Mf(e)),bvec2:Pi,bvec3:Vi,bvec4:zi,bypass:ru,cache:eu,call:Dn,cameraFar:vu,cameraNear:_u,cameraNormalMatrix:Cu,cameraPosition:Eu,cameraProjectionMatrix:Nu,cameraProjectionMatrixInverse:Su,cameraViewMatrix:Au,cameraWorldMatrix:Ru,cbrt:ua,cdl:Gf,ceil:Ao,checker:Nb,cineonToneMapping:Yf,clamp:ca,clearcoat:dn,clearcoatRoughness:cn,code:ny,color:Ri,colorSpaceToWorking:Va,colorToDirection:e=>fi(e).mul(2).sub(1),compute:Za,cond:_a,context:Na,convert:qi,convertColorSpace:(e,t,r)=>fi(new Pa(fi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():rf(e,...t),cos:wo,cross:ra,cubeTexture:bl,dFdx:Oo,dFdy:Go,dashSize:An,defaultBuildStages:Rs,defaultShaderStages:As,defined:pi,degrees:yo,deltaTime:Sm,densityFog:Ty,depth:zc,depthPass:(e,t)=>fi(new jf(jf.DEPTH,e,t)),difference:ea,diffuseColor:on,directPointLight:_b,directionToColor:uh,dispersion:Fn,distance:Jo,div:zn,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Bf(e)),dot:ta,drawIndex:qd,dynamicBufferAttribute:Ka,element:ji,emissive:an,equal:Hn,equals:mo,equirectUV:hh,exp:bo,exp2:xo,expression:au,faceDirection:tl,faceForward:ma,float:Ci,floor:So,fog:fy,fract:Co,frameGroup:Qi,frameId:Am,frontFacing:el,fwidth:Ho,gain:(e,t)=>e.lessThan(.5)?fm(e.mul(2),t).div(2):Gn(1,fm(kn(Gn(1,e),2),t).div(2)),gapSize:Rn,getConstNodeType:gi,getCurrentStack:Ni,getDirection:Vp,getDistanceAttenuation:cb,getGeometryRoughness:Ph,getNormalFromDepth:of,getParallaxCorrectNormal:gx,getRoughness:Ih,getScreenPosition:nf,getShIrradianceAt:mx,getTextureIndex:hm,getViewPosition:sf,glsl:(e,t)=>ny(e,t,"glsl"),glslFn:(e,t)=>ay(e,t,"glsl"),grayscale:If,greaterThan:qn,greaterThanEqual:Xn,hash:mm,highPrecisionModelNormalViewMatrix:Wu,highPrecisionModelViewMatrix:Hu,hue:Vf,instance:Xd,instanceIndex:$d,instancedArray:(e,t="float")=>{const r=ms(t),s=new af(e,r);return hf(s,t,e)},instancedBufferAttribute:Xa,instancedDynamicBufferAttribute:Ya,instancedMesh:Qd,int:Ei,inverseSqrt:No,invocationLocalIndex:jd,invocationSubgroupIndex:Wd,ior:En,iridescence:gn,iridescenceIOR:mn,iridescenceThickness:fn,ivec2:Ui,ivec3:Li,ivec4:Gi,js:(e,t)=>ny(e,t,"js"),label:Sa,length:Lo,lengthSq:la,lessThan:jn,lessThanEqual:Kn,lightPosition:ky,lightProjectionUV:Gy,lightShadowMatrix:Oy,lightTargetDirection:Hy,lightTargetPosition:zy,lightViewPosition:$y,lightingContext:gc,lights:Ky,linearDepth:$c,linearToneMapping:Kf,localId:wy,log:To,log2:_o,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(To(r.div(t)));return Ci(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("TSL.LoopNode: loop() has been renamed to Loop()."),ic(...e)),luminance:Of,mat2:$i,mat3:Hi,mat4:Wi,matcapUV:lg,materialAOMap:Dd,materialAlphaTest:td,materialAnisotropy:Td,materialAnisotropyVector:Vd,materialAttenuationColor:Ed,materialAttenuationDistance:Cd,materialClearcoat:gd,materialClearcoatNormal:fd,materialClearcoatRoughness:md,materialColor:rd,materialDispersion:Id,materialEmissive:id,materialIOR:Rd,materialIridescence:_d,materialIridescenceIOR:vd,materialIridescenceThickness:Nd,materialLightMap:Ld,materialLineDashOffset:Fd,materialLineDashSize:Md,materialLineGapSize:Bd,materialLineScale:wd,materialLineWidth:Ud,materialMetalness:hd,materialNormal:pd,materialOpacity:nd,materialPointWidth:Pd,materialReference:wl,materialReflectivity:dd,materialRefractionRatio:hl,materialRotation:yd,materialRoughness:cd,materialSheen:bd,materialSheenRoughness:xd,materialShininess:sd,materialSpecular:od,materialSpecularColor:ud,materialSpecularIntensity:ad,materialSpecularStrength:ld,materialThickness:Ad,materialTransmission:Sd,max:Xo,maxMipLevel:yu,metalness:ln,min:Ko,mix:da,mixElement:ya,mod:Yo,modInt:$n,modelDirection:Lu,modelNormalMatrix:ku,modelPosition:Vu,modelScale:Ou,modelViewMatrix:$u,modelViewPosition:Gu,modelViewProjection:Gd,modelWorldMatrix:Du,modelWorldMatrixInverse:zu,morphReference:dc,mrt:gm,mul:kn,mx_aastep:cx,mx_cell_noise_float:(e=pu())=>Xb(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Ci(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=pu(),t=3,r=2,s=.5,i=1)=>Qb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec2:(e=pu(),t=3,r=2,s=.5,i=1)=>Jb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec3:(e=pu(),t=3,r=2,s=.5,i=1)=>Zb(e,Ei(t),r,s).mul(i),mx_fractal_noise_vec4:(e=pu(),t=3,r=2,s=.5,i=1)=>ex(e,Ei(t),r,s).mul(i),mx_hsvtorgb:ux,mx_noise_float:(e=pu(),t=1,r=0)=>qb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=pu(),t=1,r=0)=>Kb(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=pu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Oi(Kb(e),qb(e.add(Bi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=pu())=>hx(e,t,r,"x"),mx_ramptb:(e,t,r=pu())=>hx(e,t,r,"y"),mx_rgbtohsv:lx,mx_safepower:(e,t=1)=>(e=Ci(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=pu())=>px(e,t,r,s,"x"),mx_splittb:(e,t,r,s=pu())=>px(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:dx,mx_transform_uv:(e=1,t=0,r=pu())=>r.mul(e).add(t),mx_worley_noise_float:(e=pu(),t=1)=>nx(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec2:(e=pu(),t=1)=>ox(e.convert("vec2|vec3"),t,Ei(1)),mx_worley_noise_vec3:(e=pu(),t=1)=>ax(e.convert("vec2|vec3"),t,Ei(1)),negate:Do,neutralToneMapping:sy,nodeArray:bi,nodeImmutable:Ti,nodeObject:fi,nodeObjects:yi,nodeProxy:xi,normalFlat:il,normalGeometry:rl,normalLocal:sl,normalMap:Kl,normalView:nl,normalWorld:ol,normalize:Ro,not:Zn,notEqual:Wn,numWorkgroups:Cy,objectDirection:Mu,objectGroup:Ji,objectPosition:Uu,objectScale:Fu,objectViewPosition:Pu,objectWorldMatrix:Bu,oneMinus:Vo,or:Qn,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Nm)=>e.fract(),oscSine:(e=Nm)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Nm)=>e.fract().round(),oscTriangle:(e=Nm)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Sn,outputStruct:cm,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Ff(e)),overloadingFn:vm,parabola:fm,parallaxDirection:Hl,parallaxUV:(e,t)=>e.sub(Hl.mul(t)),parameter:(e,t)=>fi(new am(e,t)),pass:(e,t,r)=>fi(new jf(jf.COLOR,e,t,r)),passTexture:(e,t)=>fi(new Hf(e,t)),pcurve:(e,t,r)=>sa(zn(sa(e,t),On(sa(e,t),sa(Gn(1,e),r))),1/t),perspectiveDepthToViewZ:Oc,pmremTexture:qp,pointUV:mf,pointWidth:Cn,positionGeometry:ju,positionLocal:qu,positionPrevious:Ku,positionView:Qu,positionViewDirection:Zu,positionWorld:Xu,positionWorldDirection:Yu,posterize:zf,pow:sa,pow2:ia,pow3:na,pow4:oa,property:sn,radians:fo,rand:fa,range:Sy,rangeFog:by,reciprocal:zo,reference:Rl,referenceBuffer:Cl,reflect:Zo,reflectVector:ml,reflectView:pl,reflector:e=>fi(new Km(e)),refract:pa,refractVector:fl,refractView:gl,reinhardToneMapping:Xf,remainder:oo,remap:iu,remapClamp:nu,renderGroup:Zi,renderOutput:du,rendererReference:za,rotate:mg,rotateUV:Rm,roughness:un,round:ko,rtt:rf,sRGBTransferEOTF:Ma,sRGBTransferOETF:Ba,sampler:e=>(!0===e.isNode?e:xu(e)).convert("sampler"),saturate:ha,saturation:Lf,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Uf(e)),screenCoordinate:_c,screenSize:Tc,screenUV:xc,scriptable:gy,scriptableValue:ly,select:Ta,setCurrentStack:vi,shaderStages:Cs,shadow:lb,sharedUniformGroup:Yi,sheen:hn,sheenRoughness:pn,shiftLeft:io,shiftRight:no,shininess:Nn,sign:Io,sin:Eo,sinc:(e,t)=>Eo(co.mul(t.mul(e).sub(1))).div(co.mul(t.mul(e).sub(1))),skinning:e=>fi(new tc(e)),skinningReference:rc,smoothstep:ga,smoothstepElement:ba,specularColor:_n,specularF90:vn,spherizeUV:Cm,split:(e,t)=>fi(new Ls(fi(e),t)),spritesheetUV:Bm,sqrt:vo,stack:lm,step:Qo,storage:hf,storageBarrier:()=>By("storage").append(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),hf(e,t,r).setPBO(!0)),storageTexture:Nf,string:(e="")=>fi(new Gs(e,"string")),sub:Gn,subgroupIndex:Hd,subgroupSize:My,tan:Mo,tangentGeometry:Ml,tangentLocal:Bl,tangentView:Ul,tangentWorld:Fl,temp:Ca,texture:xu,texture3D:Ng,textureBarrier:()=>By("texture").append(),textureBicubic:up,textureCubeUV:Op,textureLoad:Tu,textureSize:mu,textureStore:(e,t,r)=>{const s=Nf(e,t,r);return null!==r&&s.append(),s},thickness:Mn,time:Nm,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Sm.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Nm.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Nm.mul(e)),toOutputColorSpace:Ia,toWorkingColorSpace:La,toneMapping:Ha,toneMappingExposure:Wa,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>fi(new qf(t,r,fi(s),fi(i),fi(n))),transformDirection:aa,transformNormal:dl,transformNormalToView:cl,transformedBentNormalView:Wl,transformedBitangentView:kl,transformedBitangentWorld:zl,transformedClearcoatNormalView:ll,transformedNormalView:al,transformedNormalWorld:ul,transformedTangentView:Pl,transformedTangentWorld:Il,transmission:wn,transpose:jo,tri:ym,tri3:bm,triNoise3D:xm,triplanarTexture:(...e)=>Fm(...e),triplanarTextures:Fm,trunc:$o,tslFn:(...e)=>(console.warn("TSL.ShaderNode: tslFn() has been renamed to Fn()."),_i(...e)),uint:wi,uniform:tn,uniformArray:Nl,uniformGroup:Xi,uniforms:(e,t)=>(console.warn("TSL.UniformArrayNode: uniforms() has been renamed to uniformArray()."),fi(new vl(e,t))),userData:(e,t,r)=>fi(new Sf(e,t,r)),uv:pu,uvec2:Fi,uvec3:Di,uvec4:ki,varying:wa,varyingProperty:nn,vec2:Bi,vec3:Ii,vec4:Oi,vectorComponents:Es,velocity:wf,vertexColor:(...e)=>fi(new pf(...e)),vertexIndex:zd,vibrance:Df,viewZToLogarithmicDepth:Gc,viewZToOrthographicDepth:Dc,viewZToPerspectiveDepth:Vc,viewport:vc,viewportBottomLeft:Ec,viewportCoordinate:Sc,viewportDepthTexture:Ic,viewportLinearDepth:Hc,viewportMipTexture:Uc,viewportResolution:Rc,viewportSafeUV:wm,viewportSharedTexture:nh,viewportSize:Nc,viewportTexture:Bc,viewportTopLeft:Cc,viewportUV:Ac,wgsl:(e,t)=>ny(e,t,"wgsl"),wgslFn:(e,t)=>ay(e,t,"wgsl"),workgroupArray:(e,t)=>fi(new Fy("Workgroup",e,t)),workgroupBarrier:()=>By("workgroup").append(),workgroupId:Ey,workingToColorSpace:Da,xor:Jn});const yx=new om;class bx extends Bg{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(yx,Ae),yx.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(yx,Ae),yx.a=1,n=!0;else if(!0===i.isNode){const r=this.get(e),n=i;yx.copy(s._clearColor);let o=r.backgroundMesh;if(void 0===o){const e=Na(Oi(n).mul(Tf),{getUV:()=>_f.mul(ol),getTextureLevel:()=>xf});let t=Gd();t=t.setZ(t.w);const s=new Yc;s.name="Background.material",s.side=x,s.depthTest=!1,s.depthWrite=!1,s.fog=!1,s.lights=!1,s.vertexNode=t,s.colorNode=e,r.backgroundMeshNode=e,r.backgroundMesh=o=new k(new Me(1,32,32),s),o.frustumCulled=!1,o.name="Background.mesh",o.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)}}const a=n.getCacheKey();r.backgroundCacheKey!==a&&(r.backgroundMeshNode.node=Oi(n).mul(Tf),r.backgroundMeshNode.needsUpdate=!0,o.material.needsUpdate=!0,r.backgroundCacheKey=a),t.unshift(o,o.geometry,o.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);if(!0===s.autoClear||!0===n){const e=r.clearColorValue;e.r=yx.r,e.g=yx.g,e.b=yx.b,e.a=yx.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(e.r*=e.a,e.g*=e.a,e.b*=e.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let xx=0;class Tx{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=xx++}}class _x{constructor(e,t,r,s,i,n,o,a,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=o,this.updateAfterNodes=a,this.monitor=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new Tx(t.name,[],t.index,t);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class vx{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Nx{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r.getSelf()}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class Sx{constructor(e,t){this.isNodeVar=!0,this.name=e,this.type=t}}class Ax extends Sx{constructor(e,t){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0}}class Rx{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let Cx=0;class Ex{constructor(e=null){this.id=Cx++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class wx extends Ms{static get type(){return"StructTypeNode"}constructor(e,t){super(),this.name=e,this.types=t,this.isStructTypeNode=!0}getMemberTypes(){return this.types}}class Mx{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0}setValue(e){this.value=e}getValue(){return this.value}}class Bx extends Mx{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class Ux extends Mx{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class Fx extends Mx{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class Px extends Mx{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class Ix extends Mx{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class Lx extends Mx{constructor(e,t=new i){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class Dx extends Mx{constructor(e,t=new n){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class Vx extends Bx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Ox extends Ux{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Gx extends Fx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class kx extends Px{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class zx extends Ix{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class $x extends Lx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class Hx extends Dx{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const Wx=[.125,.215,.35,.446,.526,.582],jx=20,qx=new xe(-1,1,1,-1,0,1),Kx=new Ue(90,1),Xx=new e;let Yx=null,Qx=0,Zx=0;const Jx=(1+Math.sqrt(5))/2,eT=1/Jx,tT=[new r(-Jx,eT,0),new r(Jx,eT,0),new r(-eT,0,Jx),new r(eT,0,Jx),new r(0,Jx,-eT),new r(0,Jx,eT),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],rT=[3,1,5,0,4,2],sT=Vp(pu(),hu("faceIndex")).normalize(),iT=Ii(sT.x,sT.y.negate(),sT.z);class nT{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i=null){if(this._setSize(256),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=i||this._allocateTargets();return this.fromSceneAsync(e,t,r,s,n),n}Yx=this._renderer.getRenderTarget(),Qx=this._renderer.getActiveCubeFace(),Zx=this._renderer.getActiveMipmapLevel();const n=i||this._allocateTargets();return n.depthBuffer=!0,this._sceneToCubeUV(e,r,s,n),t>0&&this._blur(n,0,0,t),this._applyPMREM(n),this._cleanup(n),n}async fromSceneAsync(e,t=0,r=.1,s=100,i=null){return!1===this._hasInitialized&&await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using .fromEquirectangularAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTargets();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return!1===this._hasInitialized&&await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=lT(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=dT(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===T||e.mapping===_?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?u=Wx[a-e+4-1]:0===a&&(u=0),s.push(u);const l=1/(o-2),d=-l,c=1+l,h=[d,d,c,d,c,c,d,d,c,c,d,c],p=6,g=6,m=3,f=2,y=1,b=new Float32Array(m*g*p),x=new Float32Array(f*g*p),T=new Float32Array(y*g*p);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rT[e];b.set(s,m*g*i),x.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new Te;_.setAttribute("position",new ve(b,m)),_.setAttribute("uv",new ve(x,f)),_.setAttribute("faceIndex",new ve(T,y)),t.push(_),i.push(new k(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=Nl(new Array(jx).fill(0)),n=tn(new r(0,1,0)),o=tn(0),a=Ci(jx),u=tn(0),l=tn(1),d=xu(null),c=tn(0),h=Ci(1/t),p=Ci(1/s),g=Ci(e),m={n:a,latitudinal:u,weights:i,poleAxis:n,outputDirection:iT,dTheta:o,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=uT("blur");return f.uniforms=m,f.fragmentNode=zp({...m,latitudinal:u.equal(1)}),f}(i,e,t)}return i}async _compileMaterial(e){const t=new k(this._lodPlanes[0],e);await this._renderer.compile(t,qx)}_sceneToCubeUV(e,t,r,s){const i=Kx;i.near=t,i.far=r;const n=[-1,1,-1,-1,-1,-1],o=[1,1,1,-1,-1,-1],a=this._renderer,u=a.autoClear;a.getClearColor(Xx),a.autoClear=!1;let l=this._backgroundBox;if(null===l){const e=new Q({name:"PMREM.Background",side:x,depthWrite:!1,depthTest:!1});l=new k(new G,e)}let d=!1;const c=e.background;c?c.isColor&&(l.material.color.copy(c),e.background=null,d=!0):(l.material.color.copy(Xx),d=!0),a.setRenderTarget(s),a.clear(),d&&a.render(l,i);for(let t=0;t<6;t++){const r=t%3;0===r?(i.up.set(0,n[t],0),i.lookAt(o[t],0,0)):1===r?(i.up.set(0,0,n[t]),i.lookAt(0,o[t],0)):(i.up.set(0,n[t],0),i.lookAt(0,0,o[t]));const u=this._cubeSize;aT(s,r*u,t>2?u:0,u,u),a.render(e,i)}a.autoClear=u,e.background=c}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===T||e.mapping===_;s?null===this._cubemapMaterial&&(this._cubemapMaterial=lT(e)):null===this._equirectMaterial&&(this._equirectMaterial=dT(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const o=this._cubeSize;aT(t,0,0,3*o,2*o),r.setRenderTarget(t),r.render(n,qx)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tjx&&console.warn(`sigmaRadians, ${i}, is too large and will clip, as it requested ${g} samples when the maximum is set to 20`);const m=[];let f=0;for(let e=0;ey-4?s-y+4:0),4*(this._cubeSize-b),3*b,2*b),a.setRenderTarget(t),a.render(l,qx)}}function oT(e,t,r){const s=new ge(e,t,r);return s.texture.mapping=Be,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function aT(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function uT(e){const t=new Yc;return t.depthTest=!1,t.depthWrite=!1,t.blending=D,t.name=`PMREM_${e}`,t}function lT(e){const t=uT("cubemap");return t.fragmentNode=bl(e,iT),t}function dT(e){const t=uT("equirect");return t.fragmentNode=xu(e,hh(iT),0),t}const cT=new WeakMap,hT=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),pT=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class gT{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.monitor=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.flow={code:""},this.chaining=[],this.stack=lm(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new Ex,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.useComparisonMethod=!1}getBindGroupsCache(){let e=cT.get(this.renderer);return void 0===e&&(e=new Rg,cT.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ge(e,t,r)}createCubeRenderTarget(e,t){return new ph(e,t)}createPMREMGenerator(){return new nT(this.renderer)}includes(e){return this.nodes.includes(e)}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new Tx(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Tx(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of Cs)for(const s in r[e]){const i=r[e][s];(t[s]||(t[s]=[])).push(...i)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort(((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order));for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${pT(n.r)}, ${pT(n.g)}, ${pT(n.b)} )`;const o=this.getTypeLength(i),a=this.getComponentType(i),u=e=>this.generateConst(a,e);if(2===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===o)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(o>4&&n&&(n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(o>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new vx(e,t);return r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===y)return"int";if(t===f)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;const r=gs(e);return("float"===t?"":t[0])+r}getTypeFromArray(e){return hT.get(e.constructor)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof Le||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}addStack(){return this.stack=lm(this.stack),this.stacks.push(Ni()||this.stack),vi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,vi(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);return void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={}),s[t]}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e);let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new vx("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e,r);let i=s.structType;if(void 0===i){const e=this.structs.index++;i=new wx("StructType"+e,t),this.structs[r].push(i),s.structType=i}return i}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const o=this.uniforms.index++;n=new Nx(s||"nodeUniform"+o,t,e),this.uniforms[r].push(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage){const i=this.getDataFromNode(e,s);let n=i.variable;if(void 0===n){const e=this.vars[s]||(this.vars[s]=[]);null===t&&(t="nodeVar"+e.length),n=new Sx(t,r),e.push(n),i.variable=n}return n}getVaryingFromNode(e,t=null,r=e.getNodeType(this)){const s=this.getDataFromNode(e,"any");let i=s.varying;if(void 0===i){const e=this.varyings,n=e.length;null===t&&(t="nodeVarying"+n),i=new Ax(t,r),e.push(i),s.varying=i}return i}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new Rx("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}buildFunctionNode(e){const t=new oy,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new am(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.cache,n=this.buildStage,o=this.stack,a={code:""};this.flow=a,this.vars={},this.cache=new Ex,this.stack=lm();for(const r of Rs)this.setBuildStage(r),a.result=e.build(this,t);return a.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.cache=i,this.stack=o,this.setBuildStage(n),a}getFunctionOperator(){return null}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.shaderStage;this.setShaderStage(e);const n=this.flowChildNode(t,r);return null!==s&&(n.code+=`${this.tab+s} = ${n.result};\n`),this.flowCode[e]=this.flowCode[e]+n.code,this.setShaderStage(i),n}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){console.warn("Abstract function.")}getVaryings(){console.warn("Abstract function.")}getVar(e,t){return`${this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){console.warn("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){console.warn("Abstract function.")}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(console.error(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Yc),e.build(this)}else this.addFlow("compute",e);for(const e of Rs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Cs){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getNodeUniform(e,t){if("float"===t||"int"===t||"uint"===t)return new Vx(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new Ox(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new Gx(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new kx(e);if("color"===t)return new zx(e);if("mat3"===t)return new $x(e);if("mat4"===t)return new Hx(e);throw new Error(`Uniform "${t}" not declared.`)}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}(${e}[0].xyz, ${e}[1].xyz, ${e}[2].xyz)`:9===s&&4===i?`${this.getType(r)}(${e}[0].xy, ${e}[1].xy)`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?this.format(`${e}.${"xyz".slice(0,i)}`,this.getTypeFromLength(i,this.getComponentType(t)),r):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${De} - Node System\n`}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class mT{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderMap:new WeakMap,frameMap:new WeakMap},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.frameId&&!1!==e.updateBefore(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateBeforeMap,r);t.get(r)!==this.renderId&&!1!==e.updateBefore(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.frameId&&!1!==e.updateAfter(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateAfterMap,r);t.get(r)!==this.renderId&&!1!==e.updateAfter(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===vs.FRAME){const{frameMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.frameId&&!1!==e.update(this)&&t.set(r,this.frameId)}else if(t===vs.RENDER){const{renderMap:t}=this._getMaps(this.updateMap,r);t.get(r)!==this.renderId&&!1!==e.update(this)&&t.set(r,this.renderId)}else t===vs.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class fT{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}fT.isNodeFunctionInput=!0;class yT extends db{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setup(e){super.setup(e);const t=e.context.lightingModel,r=this.colorNode,s=Hy(this.light),i=e.context.reflectedLight;t.direct({lightDirection:s,lightColor:r,reflectedLight:i},e.stack,e)}}const bT=new n,xT=new n;let TT=null;class _T extends db{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=tn(new r).setGroup(Zi),this.halfWidth=tn(new r).setGroup(Zi),this.updateType=vs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;xT.identity(),bT.copy(t.matrixWorld),bT.premultiply(r),xT.extractRotation(bT),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(xT),this.halfHeight.value.applyMatrix4(xT)}setup(e){let t,r;super.setup(e),e.isAvailable("float32Filterable")?(t=xu(TT.LTC_FLOAT_1),r=xu(TT.LTC_FLOAT_2)):(t=xu(TT.LTC_HALF_1),r=xu(TT.LTC_HALF_2));const{colorNode:s,light:i}=this,n=e.context.lightingModel,o=$y(i),a=e.context.reflectedLight;n.directRectArea({lightColor:s,lightPosition:o,halfWidth:this.halfWidth,halfHeight:this.halfHeight,reflectedLight:a,ltc_1:t,ltc_2:r},e.stack,e)}static setLTC(e){TT=e}}class vT extends db{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=tn(0).setGroup(Zi),this.penumbraCosNode=tn(0).setGroup(Zi),this.cutoffDistanceNode=tn(0).setGroup(Zi),this.decayExponentNode=tn(0).setGroup(Zi)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e){const{coneCosNode:t,penumbraCosNode:r}=this;return ga(t,r,e)}setup(e){super.setup(e);const t=e.context.lightingModel,{colorNode:r,cutoffDistanceNode:s,decayExponentNode:i,light:n}=this,o=$y(n).sub(Qu),a=o.normalize(),u=a.dot(Hy(n)),l=this.getSpotAttenuation(u),d=o.length(),c=cb({lightDistance:d,cutoffDistance:s,decayExponent:i});let h=r.mul(l).mul(c);if(n.map){const e=Gy(n),t=xu(n.map,e.xy).onRenderUpdate((()=>n.map));h=e.mul(2).sub(1).abs().lessThan(1).all().select(h.mul(t),h)}const p=e.context.reflectedLight;t.direct({lightDirection:a,lightColor:h,reflectedLight:p},e.stack,e)}}class NT extends vT{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e){const t=this.light.iesMap;let r=null;if(t&&!0===t.isTexture){const s=e.acos().mul(1/Math.PI);r=xu(t,Bi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class ST extends db{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class AT extends db{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ky(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=tn(new e).setGroup(Zi)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=nl.dot(s).mul(.5).add(.5),n=da(r,t,i);e.context.irradiance.addAssign(n)}}class RT extends db{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Nl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=mx(ol,this.lightProbe);e.context.irradiance.addAssign(t)}}class CT{parseFunction(){console.warn("Abstract function.")}}class ET{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}ET.isNodeFunction=!0;const wT=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,MT=/[a-z_0-9]+/gi,BT="#pragma main";class UT extends ET{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:o,headerCode:a}=(e=>{const t=(e=e.trim()).indexOf(BT),r=-1!==t?e.slice(t+12):e,s=r.match(wT);if(null!==s&&5===s.length){const i=s[4],n=[];let o=null;for(;null!==(o=MT.exec(i));)n.push(o);const a=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){let s=null;if(!0===r.isCubeTexture||r.mapping===j||r.mapping===q||r.mapping===Be)if(e.backgroundBlurriness>0||r.mapping===Be)s=qp(r);else{let e;e=!0===r.isCubeTexture?bl(r):xu(r),s=bh(e)}else!0===r.isTexture?s=xu(r,xc.flipY()).setUpdateMatrix(!0):!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r);t.backgroundNode=s,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){let e=null;if(r.isFogExp2){const t=Rl("color","color",r).setGroup(Zi),s=Rl("density","float",r).setGroup(Zi);e=Ty(t,s)}else if(r.isFog){const t=Rl("color","color",r).setGroup(Zi),s=Rl("near","float",r).setGroup(Zi),i=Rl("far","float",r).setGroup(Zi);e=by(t,s,i)}else console.error("WebGPUNodes: Unsupported fog configuration.",r);t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){let e=null;!0===r.isCubeTexture?e=bl(r):!0===r.isTexture?e=xu(r):console.error("Nodes: Unsupported environment configuration.",r),t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace}hasOutputChange(e){return PT.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=xu(e,xc).renderOutput(t.toneMapping,t.currentColorSpace);return PT.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new mT,this.nodeBuilderCache=new Map}}const LT=new me;class DT{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",null===e?(this.intersectionPlanes=[],this.unionPlanes=[],this.viewNormalMatrix=new i,this.clippingGroupContexts=new WeakMap,this.shadowPass=!1):(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix),this.parentVersion=null}projectPlanes(e,t,r){const s=e.length;for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(e,t,this._renderTarget),n=e.overrideMaterial||r.material,o=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:a,vertexShader:u}=o.getNodeBuilderState();return{fragmentShader:a,vertexShader:u}}}}async init(){if(this._initialized)throw new Error("Renderer: Backend has already been initialized.");return null!==this._initPromise||(this._initPromise=new Promise((async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new IT(this,r),this._animation=new Ag(this._nodes,this.info),this._attributes=new Dg(r),this._background=new bx(this,this._nodes),this._geometries=new Gg(this._attributes,this.info),this._textures=new nm(this,r,this.info),this._pipelines=new qg(r,this._nodes),this._bindings=new Kg(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Mg(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Jg(this.lighting),this._bundles=new OT,this._renderContexts=new sm,this._animation.start(),this._initialized=!0,e()}))),this._initPromise}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,o=this._currentRenderObjectFunction,a=this._compilationPromises,u=!0===e.isScene?e:$T;null===r&&(r=e);const l=this._renderTarget,d=this._renderContexts.get(r,t,l),c=this._activeMipmapLevel,h=[];this._currentRenderContext=d,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=h,s.renderId++,s.update(),d.depth=this.depth,d.stencil=this.stencil,d.clippingContext||(d.clippingContext=new DT),d.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,l);const p=this._renderLists.get(e,t);if(p.begin(),this._projectObject(e,t,0,p,d.clippingContext),r!==e&&r.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&p.pushLight(e)})),p.finish(),null!==l){this._textures.updateRenderTarget(l,c);const e=this._textures.get(l);d.textures=e.textures,d.depthTexture=e.depthTexture}else d.textures=null,d.depthTexture=null;this._nodes.updateScene(u),this._background.update(u,p,d);const g=p.opaque,m=p.transparent,f=p.transparentDoublePass,y=p.lightsNode;!0===this.opaque&&g.length>0&&this._renderObjects(g,t,u,y),!0===this.transparent&&m.length>0&&this._renderTransparents(m,f,t,u,y),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=o,this._compilationPromises=a,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init();const r=this._renderScene(e,t);await this.backend.resolveTimestampAsync(r,"render")}async waitForGPU(){await this.backend.waitForGPU()}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),console.error(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,o=this._currentRenderContext,a=this._bundles.get(s,i),u=this.backend.get(a);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(o)||l;if(u.renderContexts.add(o),d){this.backend.beginBundle(o),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=a;const e=n.opaque;!0===this.opaque&&e.length>0&&this._renderObjects(e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(o,a),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=c,p.viewportValue.height>>=c,p.viewportValue.minDepth=b,p.viewportValue.maxDepth=x,p.viewport=!1===p.viewportValue.equals(WT),p.scissorValue.copy(f).multiplyScalar(y).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(WT),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new DT),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h),qT.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),jT.setFromProjectionMatrix(qT,g);const T=this._renderLists.get(e,t);if(T.begin(),this._projectObject(e,t,0,T,p.clippingContext),T.finish(),!0===this.sortObjects&&T.sort(this._opaqueSort,this._transparentSort),null!==h){this._textures.updateRenderTarget(h,c);const e=this._textures.get(h);p.textures=e.textures,p.depthTexture=e.depthTexture,p.width=e.width,p.height=e.height,p.renderTarget=h,p.depth=h.depthBuffer,p.stencil=h.stencilBuffer}else p.textures=null,p.depthTexture=null,p.width=this.domElement.width,p.height=this.domElement.height,p.depth=this.depth,p.stencil=this.stencil;p.width>>=c,p.height>>=c,p.activeCubeFace=d,p.activeMipmapLevel=c,p.occlusionQueryCount=T.occlusionQueryCount,this._nodes.updateScene(u),this._background.update(u,T,p),this.backend.beginRender(p);const{bundles:_,lightsNode:v,transparentDoublePass:N,transparent:S,opaque:A}=T;if(_.length>0&&this._renderBundles(_,u,v),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,v),!0===this.transparent&&S.length>0&&this._renderTransparents(S,N,t,u,v),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=o,this._currentRenderObjectFunction=a,null!==s){this.setRenderTarget(l,d,c);const e=this._quad;this._nodes.hasOutputChange(h.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(h.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}return u.onAfterRender(this,e,t,h),p}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._pixelRatio}getDrawingBufferSize(e){return e.set(this._width*this._pixelRatio,this._height*this._pixelRatio).floor()}getSize(e){return e.set(this._width,this._height)}setPixelRatio(e=1){this._pixelRatio!==e&&(this._pixelRatio=e,this.setSize(this._width,this._height,!1))}setDrawingBufferSize(e,t,r){this._width=e,this._height=t,this._pixelRatio=r,this.domElement.width=Math.floor(e*r),this.domElement.height=Math.floor(t*r),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setSize(e,t,r=!0){this._width=e,this._height=t,this.domElement.width=Math.floor(e*this._pixelRatio),this.domElement.height=Math.floor(t*this._pixelRatio),!0===r&&(this.domElement.style.width=e+"px",this.domElement.style.height=t+"px"),this.setViewport(0,0,e,t),this._initialized&&this.backend.updateSize()}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){const t=this._scissor;return e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height,e}setScissor(e,t,r,s){const i=this._scissor;e.isVector4?i.copy(e):i.set(e,t,r,s)}getScissorTest(){return this._scissorTest}setScissorTest(e){this._scissorTest=e,this.backend.setScissorTest(e)}getViewport(e){return e.copy(this._viewport)}setViewport(e,t,r,s,i=0,n=1){const o=this._viewport;e.isVector4?o.copy(e):o.set(e,t,r,s),o.minDepth=i,o.maxDepth=n}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)return console.warn("THREE.Renderer: .clear() called before the backend is initialized. Try using .clearAsync() instead."),this.clearAsync(e,t,r);const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s&&(this._textures.updateRenderTarget(s),i=this._textures.get(s)),this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget){const e=this._quad;this._nodes.hasOutputChange(s.texture)&&(e.material.fragmentNode=this._nodes.getOutputNode(s.texture),e.material.needsUpdate=!0),this._renderScene(e,e.camera,!1)}}clearColor(){return this.clear(!0,!1,!1)}clearDepth(){return this.clear(!1,!0,!1)}clearStencil(){return this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){!1===this._initialized&&await this.init(),this.clear(e,t,r)}clearColorAsync(){return this.clearAsync(!0,!1,!1)}clearDepthAsync(){return this.clearAsync(!1,!0,!1)}clearStencilAsync(){return this.clearAsync(!1,!1,!0)}get currentToneMapping(){return null!==this._renderTarget?d:this.toneMapping}get currentColorSpace(){return null!==this._renderTarget?Ae:this.outputColorSpace}dispose(){this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e){if(!0===this.isDeviceLost)return;if(!1===this._initialized)return console.warn("THREE.Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e);const t=this._nodes.nodeFrame,r=t.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,t.renderId=this.info.calls;const s=this.backend,i=this._pipelines,n=this._bindings,o=this._nodes,a=Array.isArray(e)?e:[e];if(void 0===a[0]||!0!==a[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of a){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),o.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}o.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),a=i.getForCompute(t,r);s.compute(e,t,r,a)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e),await this.backend.resolveTimestampAsync(e,"compute")}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}hasFeature(e){return!1===this._initialized?(console.warn("THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead."),!1):this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){!1===this._initialized&&await this.init(),this._textures.updateTexture(e)}initTexture(e){if(!1===this._initialized)return console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),!1;this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=KT.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void console.error("THREE.Renderer.copyFramebufferToTexture: Invalid rectangle.");t=KT.copy(t).floor()}else t=KT.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t)}copyTextureToTexture(e,t,r=null,s=null,i=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i)}readRenderTargetPixelsAsync(e,t,r,s,i,n=0,o=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,o)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){if(!e.frustumCulled||jT.intersectsSprite(e)){!0===this.sortObjects&&KT.setFromMatrixPosition(e.matrixWorld).applyMatrix4(qT);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,KT.z,null,i)}}else if(e.isLineLoop)console.error("THREE.Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||jT.intersectsObject(e))){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),KT.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(qT)),Array.isArray(n)){const o=t.groups;for(let a=0,u=o.length;a0){for(const{material:e}of t)e.side=x;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Ge;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=le}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,o=e.length;n0?s:"";t=`${e.name} {\n\t${r} ${i.name}[${n}];\n};\n`}else{t=`${this.getVectorType(i.type)} ${this.getPropertyName(i,e)};`,n=!0}const o=i.node.precision;if(null!==o&&(t=d_[o]+" "+t),n){t="\t"+t;const e=i.groupNode.name;(s[e]||(s[e]=[])).push(t)}else t="uniform "+t,r.push(t)}let i="";for(const t in s){const r=s[t];i+=this._getGLSLUniformStruct(e+"_"+t,r.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==y){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[],r=e.getMemberTypes();for(let e=0;ee*t),1)}u`}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=c_[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}c_[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let o=n.uniformGPU;if(void 0===o){const s=e.groupNode,a=s.name,u=this.getBindGroupArray(a,r);if("texture"===t)o=new o_(i.name,i.node,s),u.push(o);else if("cubeTexture"===t)o=new a_(i.name,i.node,s),u.push(o);else if("texture3D"===t)o=new u_(i.name,i.node,s),u.push(o);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new e_(e,s);t.name=e.name,u.push(t),o=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new s_(r+"_"+a,s),e[a]=n,u.push(n)),o=this.getNodeUniform(i,t),n.addUniform(o)}n.uniformGPU=o}return i}}let g_=null,m_=null,f_=null;class y_{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null}async init(e){this.renderer=e}begin(){}finish(){}draw(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}createRenderPipeline(){}createComputePipeline(){}destroyPipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}createDefaultTexture(){}createTexture(){}copyTextureToBuffer(){}createAttribute(){}createIndexAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}resolveTimestampAsync(){}hasFeatureAsync(){}hasFeature(){}getInstanceCount(e){const{object:t,geometry:r}=e;return r.isInstancedBufferGeometry?r.instanceCount:t.count>1?t.count:1}getDrawingBufferSize(){return g_=g_||new t,this.renderer.getDrawingBufferSize(g_)}getScissor(){return m_=m_||new s,this.renderer.getScissor(m_)}setScissorTest(){}getClearColor(){const e=this.renderer;return f_=f_||new om,e.getClearColor(f_),f_.getRGB(f_,this.renderer.currentColorSpace),f_}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Ze(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${De} webgpu`),this.domElement=e),e}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}dispose(){}}let b_=0;class x_{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class T_{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,o=e.isInterleavedBufferAttribute?e.data:e,a=r.get(o);let u,l=a.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),a.bufferGPU=l,a.bufferType=t,a.version=o.version),i instanceof Float32Array)u=s.FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===y,id:b_++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new x_(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),o=n.bufferType,a=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(o,n.bufferGPU),0===a.length)r.bufferSubData(o,0,s);else{for(let e=0,t=a.length;e1?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()}))}}let R_,C_,E_,w_=!1;class M_{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===w_&&(this._init(this.gl),w_=!0)}_init(e){R_={[dr]:e.REPEAT,[cr]:e.CLAMP_TO_EDGE,[hr]:e.MIRRORED_REPEAT},C_={[pr]:e.NEAREST,[gr]:e.NEAREST_MIPMAP_NEAREST,[Ie]:e.NEAREST_MIPMAP_LINEAR,[$]:e.LINEAR,[Pe]:e.LINEAR_MIPMAP_NEAREST,[M]:e.LINEAR_MIPMAP_LINEAR},E_={[mr]:e.NEVER,[fr]:e.ALWAYS,[Re]:e.LESS,[yr]:e.LEQUAL,[br]:e.EQUAL,[xr]:e.GEQUAL,[Tr]:e.GREATER,[_r]:e.NOTEQUAL}}filterFallback(e){const{gl:t}=this;return e===pr||e===gr||e===Ie?t.NEAREST:t.LINEAR}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:o}=this;if(null!==e){if(void 0!==n[e])return n[e];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+e+"'")}let a=t;return t===n.RED&&(r===n.FLOAT&&(a=n.R32F),r===n.HALF_FLOAT&&(a=n.R16F),r===n.UNSIGNED_BYTE&&(a=n.R8),r===n.UNSIGNED_SHORT&&(a=n.R16),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.R8UI),r===n.UNSIGNED_SHORT&&(a=n.R16UI),r===n.UNSIGNED_INT&&(a=n.R32UI),r===n.BYTE&&(a=n.R8I),r===n.SHORT&&(a=n.R16I),r===n.INT&&(a=n.R32I)),t===n.RG&&(r===n.FLOAT&&(a=n.RG32F),r===n.HALF_FLOAT&&(a=n.RG16F),r===n.UNSIGNED_BYTE&&(a=n.RG8),r===n.UNSIGNED_SHORT&&(a=n.RG16),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RG8UI),r===n.UNSIGNED_SHORT&&(a=n.RG16UI),r===n.UNSIGNED_INT&&(a=n.RG32UI),r===n.BYTE&&(a=n.RG8I),r===n.SHORT&&(a=n.RG16I),r===n.INT&&(a=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(a=n.RGB32F),r===n.HALF_FLOAT&&(a=n.RGB16F),r===n.UNSIGNED_BYTE&&(a=n.RGB8),r===n.UNSIGNED_SHORT&&(a=n.RGB16),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(a=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(a=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGB8UI),r===n.UNSIGNED_SHORT&&(a=n.RGB16UI),r===n.UNSIGNED_INT&&(a=n.RGB32UI),r===n.BYTE&&(a=n.RGB8I),r===n.SHORT&&(a=n.RGB16I),r===n.INT&&(a=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(a=n.RGBA32F),r===n.HALF_FLOAT&&(a=n.RGBA16F),r===n.UNSIGNED_BYTE&&(a=n.RGBA8),r===n.UNSIGNED_SHORT&&(a=n.RGBA16),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I),r===n.UNSIGNED_BYTE&&(a=s===Ve&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(a=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(a=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(a=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(a=n.RGBA16UI),r===n.UNSIGNED_INT&&(a=n.RGBA32UI),r===n.BYTE&&(a=n.RGBA8I),r===n.SHORT&&(a=n.RGBA16I),r===n.INT&&(a=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_INT&&(a=n.DEPTH24_STENCIL8),r===n.FLOAT&&(a=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(a=n.DEPTH24_STENCIL8),a!==n.R16F&&a!==n.R32F&&a!==n.RG16F&&a!==n.RG32F&&a!==n.RGBA16F&&a!==n.RGBA32F||o.get("EXT_color_buffer_float"),a}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,r.NONE),r.texParameteri(e,r.TEXTURE_WRAP_S,R_[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,R_[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||r.texParameteri(e,r.TEXTURE_WRAP_R,R_[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,C_[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,o=t.minFilter===$&&n?M:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,C_[o]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,E_[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===pr)return;if(t.minFilter!==Ie&&t.minFilter!==M)return;if(t.type===E&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i,isDefault:!0})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:o,depth:a}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,o,a):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,o,a):e.isVideoTexture||r.texStorage2D(h,i,d,n,o),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:o,glType:a}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,o,a,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:o,glFormat:a,glType:u,glInternalFormat:l}=this.backend.get(e);if(e.isRenderTargetTexture||void 0===n)return;const d=e=>e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||e instanceof OffscreenCanvas?e:e.data;if(this.backend.state.bindTexture(o,n),this.setTextureParameters(o,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.gerDrawingBufferSize().y;if(d){const r=0!==o||0!==a;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-a-l;s.blitFramebuffer(o,p,o+u,p+l,o,p,o+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,o,c-l-a,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t){const{gl:r}=this,s=t.renderTarget,{samples:i,depthTexture:n,depthBuffer:o,stencilBuffer:a,width:u,height:l}=s;if(r.bindRenderbuffer(r.RENDERBUFFER,e),o&&!a){let t=r.DEPTH_COMPONENT24;i>0?(n&&n.isDepthTexture&&n.type===r.FLOAT&&(t=r.DEPTH_COMPONENT32F),r.renderbufferStorageMultisample(r.RENDERBUFFER,i,t,u,l)):r.renderbufferStorage(r.RENDERBUFFER,t,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_ATTACHMENT,r.RENDERBUFFER,e)}else o&&a&&(i>0?r.renderbufferStorageMultisample(r.RENDERBUFFER,i,r.DEPTH24_STENCIL8,u,l):r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,u,l),r.framebufferRenderbuffer(r.FRAMEBUFFER,r.DEPTH_STENCIL_ATTACHMENT,r.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:o,gl:a}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=a.createFramebuffer();a.bindFramebuffer(a.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?a.TEXTURE_CUBE_MAP_POSITIVE_X+n:a.TEXTURE_2D;a.framebufferTexture2D(a.READ_FRAMEBUFFER,a.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=a.createBuffer();a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.bufferData(a.PIXEL_PACK_BUFFER,g,a.STREAM_READ),a.readPixels(t,r,s,i,l,d,0),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),await o.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return a.bindBuffer(a.PIXEL_PACK_BUFFER,m),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,f),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),a.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}}class B_{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class U_{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const F_={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBKIT_WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-bc",EXT_texture_compression_bptc:"texture-compression-bptc",EXT_disjoint_timer_query_webgl2:"timestamp-query"};class P_{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:o,index:a}=this;0!==a?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),o.update(i,t,s,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:o,object:a,info:u}=this;0!==r&&(0!==o?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(a,t,i,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:o}=this;if(0===r)return;const a=s.get("WEBGL_multi_draw");if(null===a)for(let s=0;s0)){const e=t.queryQueue.shift();this.initTimestampQuery(e)}}async resolveTimestampAsync(e,t="render"){if(!this.disjoint||!this.trackTimestamp)return;const r=this.get(e);r.gpuQueries||(r.gpuQueries=[]);for(let e=0;e0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext,n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const o=e.textures;if(null!==o)for(let e=0;e0){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,o=s.msaaFrameBuffer,a=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let o=0;for(let t=0;t0&&e.add(s[t]),r[t]=null,i.deleteQuery(n),o++))}o1?f.renderInstances(x,y,b):f.render(x,y),a.bindVertexArray(null)}needsRenderUpdate(){return!1}getRenderCacheKey(){return""}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}createSampler(){}destroySampler(){}createNodeBuilder(e,t){return new p_(e,t)}createProgram(e){const t=this.gl,{stage:r,code:s}=e,i="fragment"===r?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);t.shaderSource(i,s),t.compileShader(i),this.set(e,{shaderGPU:i})}destroyProgram(){console.warn("Abstract class.")}createRenderPipeline(e,t){const r=this.gl,s=e.pipeline,{fragmentProgram:i,vertexProgram:n}=s,o=r.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU;if(r.attachShader(o,a),r.attachShader(o,u),r.linkProgram(o),this.set(s,{programGPU:o,fragmentShader:a,vertexShader:u}),null!==t&&this.parallel){const i=new Promise((t=>{const i=this.parallel,n=()=>{r.getProgramParameter(o,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()}));t.push(i)}else this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=e.getShaderInfoLog(t).trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=s.getProgramInfoLog(e).trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),o=this._getShaderErrors(s,t,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+o)}else""!==i&&console.warn("THREE.WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:o,vertexShader:a}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,o,a),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,o=s.createProgram(),a=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eF_[t]===e)),r=this.extensions;for(let e=0;e0){if(void 0===d){const s=[];d=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,d);const i=[],l=e.textures;for(let r=0;r,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:G_,stripIndexFormat:sv},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:G_,stripIndexFormat:sv},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,o=this.getTransferPipeline(s),a=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Yv,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Yv,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:Q_,storeOp:X_,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(o,l,d),h(a,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0){const s=this.get(e);void 0===s.useCount&&(s.useCount=0,s.layers=[]);const i=s.layers[r]||this._mipmapCreateBundles(e,t,r),n=this.device.createCommandEncoder({});this._mipmapRunBundles(n,i),this.device.queue.submit([n.finish()]),0!==s.useCount&&(s.layers[r]=i),s.useCount++}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Yv,baseArrayLayer:r});const o=[];for(let a=1;a1;for(let o=0;o]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,mN=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,fN={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class yN extends ET{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:o}=(e=>{const t=(e=e.trim()).match(gN);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=mN.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class bN extends CT{parseFunction(e){return new yN(e)}}const xN="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},TN={[Ss.READ_ONLY]:"read",[Ss.WRITE_ONLY]:"write",[Ss.READ_WRITE]:"read_write"},_N={[dr]:"repeat",[cr]:"clamp",[hr]:"mirror"},vN={vertex:xN?xN.VERTEX:1,fragment:xN?xN.FRAGMENT:2,compute:xN?xN.COMPUTE:4},NN={instance:!0,swizzleAssign:!1,storageBuffer:!0},SN={"^^":"tsl_xor"},AN={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},RN={},CN={tsl_xor:new iy("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new iy("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new iy("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new iy("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new iy("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new iy("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new iy("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new iy("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new iy("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new iy("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new iy("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new iy("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new iy("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},EN={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast"};"undefined"!=typeof navigator&&/Windows/g.test(navigator.userAgent)&&(CN.pow_float=new iy("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),CN.pow_vec2=new iy("fn tsl_pow_vec2( a : vec2f, b : vec2f ) -> vec2f { return vec2f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ) ); }",[CN.pow_float]),CN.pow_vec3=new iy("fn tsl_pow_vec3( a : vec3f, b : vec3f ) -> vec3f { return vec3f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ) ); }",[CN.pow_float]),CN.pow_vec4=new iy("fn tsl_pow_vec4( a : vec4f, b : vec4f ) -> vec4f { return vec4f( tsl_pow_float( a.x, b.x ), tsl_pow_float( a.y, b.y ), tsl_pow_float( a.z, b.z ), tsl_pow_float( a.w, b.w ) ); }",[CN.pow_float]),EN.pow_float="tsl_pow_float",EN.pow_vec2="tsl_pow_vec2",EN.pow_vec3="tsl_pow_vec3",EN.pow_vec4="tsl_pow_vec4");let wN="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(wN+="diagnostic( off, derivative_uniformity );\n");class MN extends gT{constructor(e,t){super(e,t,new bN),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==m}_generateTextureSample(e,t,r,s,i=this.shaderStage){return"fragment"===i?s?`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r):this.generateTextureLod(e,t,r,s,"0")}_generateVideoSample(e,t,r=this.shaderStage){if("fragment"===r)return`textureSampleBaseClampToEdge( ${e}, ${e}_sampler, vec2( ${t}.x, 1.0 - ${t}.y ) )`;console.error(`WebGPURenderer: THREE.VideoTexture does not support ${r} shader.`)}_generateTextureSampleLevel(e,t,r,s,i,n=this.shaderStage){return"fragment"!==n&&"compute"!==n||!1!==this.isUnfilterable(e)?this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,s):this.generateTextureLod(e,t,r,i,s):`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`}generateWrapFunction(e){const t=`tsl_coord_${_N[e.wrapS]}S_${_N[e.wrapT]}T`;let r=RN[t];if(void 0===r){const s=[];let i=`fn ${t}( coord : vec2f ) -> vec2f {\n\n\treturn vec2f(\n`;const n=(e,t)=>{e===dr?(s.push(CN.repeatWrapping_float),i+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===cr?(s.push(CN.clampWrapping_float),i+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===hr?(s.push(CN.mirrorWrapping_float),i+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(i+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};n(e.wrapS,"x"),i+=",\n",n(e.wrapT,"y"),i+="\n\t);\n\n}\n",RN[t]=r=new iy(i,s)}return r.build(this),t}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e);n=o>1?t:`${t}, u32( ${r} )`,i=new Aa(new ou(`textureDimensions( ${n} )`,"uvec2")),s.dimensionsSnippet[r]=i}return i.build(this)}generateFilteredTexture(e,t,r,s="0u"){this._include("biquadraticTexture");return`tsl_biquadraticTexture( ${t}, ${this.generateWrapFunction(e)}( ${r} ), ${this.generateTextureDimension(e,t,s)}, u32( ${s} ) )`}generateTextureLod(e,t,r,s,i="0u"){const n=`vec2u( ${this.generateWrapFunction(e)}( ${r} ) * vec2f( ${this.generateTextureDimension(e,t,i)} ) )`;return this.generateTextureLoad(e,t,n,s,i)}generateTextureLoad(e,t,r,s,i="0u"){return!0===e.isVideoTexture||!0===e.isStorageTexture?`textureLoad( ${t}, ${r} )`:s?`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:`textureLoad( ${t}, ${r}, u32( ${i} ) )`}generateTextureStore(e,t,r,s){return`textureStore( ${t}, ${r}, ${s} )`}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===E||!1===this.isSampleCompare(e)&&e.minFilter===pr&&e.magFilter===pr||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i=this.shaderStage){let n=null;return n=!0===e.isVideoTexture?this._generateVideoSample(t,r,i):this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,"0",i):this._generateTextureSample(e,t,r,s,i),n}generateTextureGrad(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;console.error(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${n} shader.`)}generateTextureCompare(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${n} shader.`)}generateTextureLevel(e,t,r,s,i,n=this.shaderStage){let o=null;return o=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),o}generateTextureBias(e,t,r,s,i,n=this.shaderStage){if("fragment"===n)return`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;console.error(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${n} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?`NodeBuffer_${e.id}.${t}`:e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}_getUniformGroupCount(e){return Object.keys(this.uniforms[e]).length}getFunctionOperator(e){const t=SN[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Ss.READ_ONLY:e.access}getStorageAccess(e,t){return TN[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let s;const o=e.groupNode,a=o.name,u=this.getBindGroupArray(a,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let n=null;const a=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?n=new o_(i.name,i.node,o,a):"cubeTexture"===t?n=new a_(i.name,i.node,o,a):"texture3D"===t&&(n=new u_(i.name,i.node,o,a)),n.store=!0===e.isStorageTextureNode,n.setVisibility(vN[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==n.store)u.push(n),s=[n];else{const e=new nN(`${i.name}_sampler`,i.node,o);e.setVisibility(vN[r]),u.push(e,n),s=[e,n]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const i=new("buffer"===t?e_:uN)(e,o);i.setVisibility(vN[r]),u.push(i),s=i}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[a];void 0===n&&(n=new s_(a,o),n.setVisibility(vN[r]),e[a]=n,u.push(n)),s=this.getNodeUniform(i,t),n.addUniform(s)}n.uniformGPU=s}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","id","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e`)}const s=this.getBuiltins("output");return s&&t.push("\t"+s),t.join(",\n")}getStructs(e){const t=[],r=this.structs[e];for(let e=0,s=r.length;e output : ${i};\n\n`)}return t.join("\n\n")}getVar(e,t){return`var ${t} : ${this.getType(e)}`}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","Vertex","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;i1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.isDepthTexture)s=`texture_depth${n}_2d`;else if(!0===t.isVideoTexture)s="texture_external";else if(!0===t.isData3DTexture)s="texture_3d";else if(!0===i.node.isStorageTextureNode){s=`texture_storage_2d<${pN(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${o.binding++} ) @group( ${o.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.bufferType),n=t.bufferCount,a=n>0&&"buffer"===i.type?", "+n:"",u=t.isAtomic?`atomic<${r}>`:`${r}`,l=`\t${i.name} : array< ${u}${a} >\n`,d=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";s.push(this._getWGSLStructBinding("NodeBuffer_"+t.id,l,d,o.binding++,o.group))}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:o.binding++,id:o.group,snippets:[]})).snippets.push(`\t${i.name} : ${e}`)}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}let o=r.join("\n");return o+=s.join("\n"),o+=i.join("\n"),o}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],o=n.outputNode,a=void 0!==o&&!0===o.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n\t`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.Vertex = ${i.result};`;else if("fragment"===t)if(a)r.returnType=o.nodeType,s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;\n\n",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}null!==this.material?(this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment)):this.computeShader=this._getWGSLComputeCode(e.compute,(this.object.workgroupSize||[64]).join(", "))}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getType(e){return AN[e]||e}isAvailable(e){let t=NN[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),NN[e]=t),t}_getWGSLMethod(e){return void 0!==CN[e]&&this._include(e),EN[e]}_include(e){const t=CN[e];return t.build(this),null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${wN}\n\n// uniforms\n${e.uniforms}\n\n// structs\n${e.structs}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${t} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = id.x + id.y * numWorkgroups.x * u32(${t}) + id.z * numWorkgroups.x * numWorkgroups.y * u32(${t});\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class BN{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=iv.Depth24PlusStencil8:e.depth&&(t=iv.Depth24Plus),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.samples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?L_:e.isLineSegments||e.isMesh&&!0===t.wireframe?D_:e.isLine?V_:e.isMesh?O_:void 0}getSampleCount(e){let t=1;return e>1&&(t=Math.pow(2,Math.floor(Math.log2(e))),2===t&&(t=4)),t}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.samples)}getPreferredCanvasFormat(){return navigator.userAgent.includes("Quest")?iv.BGRA8Unorm:navigator.gpu.getPreferredCanvasFormat()}}const UN=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),FN=new Map([[Le,["float16"]]]),PN=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class IN{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const o=s.device;let a=r.array;if(!1===e.normalized&&(a.constructor===Int16Array||a.constructor===Uint16Array)){const e=new Uint32Array(a.length);for(let t=0;t1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=Hv)),r.texture.isDepthTexture)s.sampleType=Wv;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===y?s.sampleType=jv:e===f?s.sampleType=qv:e===E&&(this.backend.hasFeature("float32-filterable")?s.sampleType=$v:s.sampleType=Hv)}r.isSampledCubeTexture?s.viewDimension=Zv:r.texture.isDataArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=Qv:r.isSampledTexture3D&&(s.viewDimension=Jv),e.texture=s}else console.error(`WebGPUBindingUtils: Unsupported binding "${r}".`);s.push(e)}return r.createBindGroupLayout({entries:s})}createBindings(e,t,r,s=0){const{backend:i,bindGroupLayoutCache:n}=this,o=i.get(e);let a,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===o.groups&&(o.groups=[],o.versions=[]),o.versions[r]===s&&(a=o.groups[r])),void 0===a&&(a=this.createBindGroup(e,u),r>0&&(o.groups[r]=a,o.versions[r]=s)),o.group=a,o.layout=u}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer;r.queue.writeBuffer(i,0,s,0)}createBindGroup(e,t){const r=this.backend,s=r.device;let i=0;const n=[];for(const t of e.bindings){if(t.isUniformBuffer){const e=r.get(t);if(void 0===e.buffer){const r=t.byteLength,i=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,n=s.createBuffer({label:"bindingBuffer_"+t.name,size:r,usage:i});e.buffer=n}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isStorageBuffer){const e=r.get(t);if(void 0===e.buffer){const s=t.attribute;e.buffer=r.get(s).buffer}n.push({binding:i,resource:{buffer:e.buffer}})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}else if(t.isSampledTexture){const e=r.get(t.texture);let o;if(void 0!==e.externalTexture)o=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(o=e[s],void 0===o){const i=eN;let n;n=t.isSampledCubeTexture?Zv:t.isSampledTexture3D?Jv:t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Qv:Yv,o=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:o})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class DN{constructor(e){this.backend=e}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:o,fragmentProgram:a}=n,u=this.backend,l=u.device,d=u.utils,c=u.get(n),h=[];for(const t of e.getBindings()){const e=u.get(t);h.push(e.layout)}const p=u.attributeUtils.createShaderVertexBuffers(e);let g;!0===s.transparent&&s.blending!==D&&(g=this._getBlending(s));let m={};!0===s.stencilWrite&&(m={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const f=this._getColorWriteMask(s),y=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:l.createPipelineLayout({bindGroupLayouts:h})},A={},R=e.context.depth,C=e.context.stencil;if(!0!==R&&!0!==C||(!0===R&&(A.format=v,A.depthWriteEnabled=s.depthWrite,A.depthCompare=_),!0===C&&(A.stencilFront=m,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),S.depthStencil=A),null===t)c.pipeline=l.createRenderPipeline(S);else{const e=new Promise((e=>{l.createRenderPipelineAsync(S).then((t=>{c.pipeline=t,e()}))}));t.push(e)}}createBundleEncoder(e){const t=this.backend,{utils:r,device:s}=t,i=r.getCurrentDepthStencilFormat(e),n={label:"renderBundleEncoder",colorFormats:[r.getCurrentColorFormat(e)],depthStencilFormat:i,sampleCount:this._getSampleCount(e)};return s.createRenderBundleEncoder(n)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),o=[];for(const e of t){const t=r.get(e);o.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:o})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,o=e.blendEquation;if(s===ft){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,a=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:o;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(o)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(a),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:Nv},r={srcFactor:i,dstFactor:n,operation:Nv}};if(e.premultipliedAlpha)switch(s){case F:i(cv,mv,cv,mv);break;case xt:i(cv,cv,cv,cv);break;case bt:i(dv,pv,dv,cv);break;case yt:i(dv,hv,dv,gv)}else switch(s){case F:i(gv,mv,cv,mv);break;case xt:i(gv,cv,gv,cv);break;case bt:i(dv,pv,dv,cv);break;case yt:i(dv,hv,dv,hv)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};console.error("THREE.WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case rt:t=dv;break;case st:t=cv;break;case it:t=hv;break;case lt:t=pv;break;case nt:t=gv;break;case dt:t=mv;break;case at:t=fv;break;case ct:t=yv;break;case ut:t=bv;break;case ht:t=xv;break;case ot:t=Tv;break;case 211:t=_v;break;case 212:t=vv;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Mr:t=k_;break;case wr:t=K_;break;case Er:t=z_;break;case Cr:t=H_;break;case Rr:t=$_;break;case Ar:t=q_;break;case Sr:t=W_;break;case Nr:t=j_;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Vr:t=Mv;break;case Dr:t=Bv;break;case Lr:t=Uv;break;case Ir:t=Fv;break;case Pr:t=Pv;break;case Fr:t=Iv;break;case Ur:t=Lv;break;case Br:t=Dv;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Je:t=Nv;break;case et:t=Sv;break;case tt:t=Av;break;case Gr:t=Rv;break;case Or:t=Cv;break;default:console.error("THREE.WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;switch(s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?rv:sv),r.side){case Ge:s.frontFace=Z_,s.cullMode=tv;break;case x:s.frontFace=Z_,s.cullMode=ev;break;case le:s.frontFace=Z_,s.cullMode=J_;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?wv:Ev}_getDepthCompare(e){let t;if(!1===e.depthTest)t=K_;else{const r=e.depthFunc;switch(r){case Ct:t=k_;break;case Rt:t=K_;break;case At:t=z_;break;case St:t=H_;break;case Nt:t=$_;break;case vt:t=q_;break;case _t:t=W_;break;case Tt:t=j_;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class VN extends y_{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.trackTimestamp=!0===e.trackTimestamp,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new BN(this),this.attributeUtils=new IN(this),this.bindingUtils=new LN(this),this.pipelineUtils=new DN(this),this.textureUtils=new hN(this),this.occludedResolveCache=new Map}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(sN),n=[];for(const e of i)s.features.has(e)&&n.push(e);const o={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(o)}else r=t.device;r.lost.then((t=>{const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}));const s=void 0!==t.context?t.context:e.domElement.getContext("webgpu");this.device=r,this.context=s;const i=t.alpha?"premultiplied":"opaque";this.trackTimestamp=this.trackTimestamp&&this.hasFeature(sN.TimestampQuery),this.context.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i}),this.updateSize()}get coordinateSystem(){return v}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){let e=this.defaultRenderPassdescriptor;if(null===e){const t=this.renderer;e={colorAttachments:[{view:null}]},!0!==this.renderer.depth&&!0!==this.renderer.stencil||(e.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(t.depth,t.stencil).createView()});const r=e.colorAttachments[0];this.renderer.samples>0?r.view=this.colorBuffer.createView():r.resolveTarget=void 0,this.defaultRenderPassdescriptor=e}const t=e.colorAttachments[0];return this.renderer.samples>0?t.resolveTarget=this.context.getCurrentTexture().createView():t.view=this.context.getCurrentTexture().createView(),e}_getRenderPassDescriptor(e){const t=e.renderTarget,r=this.get(t);let s=r.descriptors;if(void 0===s||r.width!==t.width||r.height!==t.height||r.activeMipmapLevel!==t.activeMipmapLevel||r.samples!==t.samples){s={},r.descriptors=s;const e=()=>{t.removeEventListener("dispose",e),this.delete(t)};t.addEventListener("dispose",e)}const i=e.getCacheKey();let n=s[i];if(void 0===n){const o=e.textures,a=[];for(let t=0;t0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const o=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery(),t.currentPass.end(),r>0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.prepareTimestampBuffer(e,t.encoder),this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo?(u.x=Math.min(t.dispatchCount,o),u.y=Math.ceil(t.dispatchCount/o)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.prepareTimestampBuffer(e,t.cmdEncoderGPU),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,context:s,pipeline:i}=e,n=e.getBindings(),o=this.get(s),a=this.get(i).pipeline,u=o.currentSets,l=o.currentPass,d=e.getDrawParameters();if(null===d)return;u.pipeline!==a&&(l.setPipeline(a),u.pipeline=a);const c=u.bindingGroups;for(let e=0,t=n.length;e1?0:r;l.drawIndexed(t[r],s,e[r]/n,0,o)}}else if(!0===p){const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndexedIndirect(e,0)}else l.drawIndexed(s,i,n,0,0);t.update(r,s,i)}else{const{vertexCount:s,instanceCount:i,firstVertex:n}=d,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;l.drawIndirect(e,0)}else l.draw(s,i,n,0);t.update(r,s,i)}}needsRenderUpdate(e){const t=this.get(e),{object:r,material:s}=e,i=this.utils,n=i.getSampleCountRenderContext(e.context),o=i.getCurrentColorSpace(e.context),a=i.getCurrentColorFormat(e.context),u=i.getCurrentDepthStencilFormat(e.context),l=i.getPrimitiveTopology(r,s);let d=!1;return t.material===s&&t.materialVersion===s.version&&t.transparent===s.transparent&&t.blending===s.blending&&t.premultipliedAlpha===s.premultipliedAlpha&&t.blendSrc===s.blendSrc&&t.blendDst===s.blendDst&&t.blendEquation===s.blendEquation&&t.blendSrcAlpha===s.blendSrcAlpha&&t.blendDstAlpha===s.blendDstAlpha&&t.blendEquationAlpha===s.blendEquationAlpha&&t.colorWrite===s.colorWrite&&t.depthWrite===s.depthWrite&&t.depthTest===s.depthTest&&t.depthFunc===s.depthFunc&&t.stencilWrite===s.stencilWrite&&t.stencilFunc===s.stencilFunc&&t.stencilFail===s.stencilFail&&t.stencilZFail===s.stencilZFail&&t.stencilZPass===s.stencilZPass&&t.stencilFuncMask===s.stencilFuncMask&&t.stencilWriteMask===s.stencilWriteMask&&t.side===s.side&&t.alphaToCoverage===s.alphaToCoverage&&t.sampleCount===n&&t.colorSpace===o&&t.colorFormat===a&&t.depthStencilFormat===u&&t.primitiveTopology===l&&t.clippingContextCacheKey===e.clippingContextCacheKey||(t.material=s,t.materialVersion=s.version,t.transparent=s.transparent,t.blending=s.blending,t.premultipliedAlpha=s.premultipliedAlpha,t.blendSrc=s.blendSrc,t.blendDst=s.blendDst,t.blendEquation=s.blendEquation,t.blendSrcAlpha=s.blendSrcAlpha,t.blendDstAlpha=s.blendDstAlpha,t.blendEquationAlpha=s.blendEquationAlpha,t.colorWrite=s.colorWrite,t.depthWrite=s.depthWrite,t.depthTest=s.depthTest,t.depthFunc=s.depthFunc,t.stencilWrite=s.stencilWrite,t.stencilFunc=s.stencilFunc,t.stencilFail=s.stencilFail,t.stencilZFail=s.stencilZFail,t.stencilZPass=s.stencilZPass,t.stencilFuncMask=s.stencilFuncMask,t.stencilWriteMask=s.stencilWriteMask,t.side=s.side,t.alphaToCoverage=s.alphaToCoverage,t.sampleCount=n,t.colorSpace=o,t.colorFormat=a,t.depthStencilFormat=u,t.primitiveTopology=l,t.clippingContextCacheKey=e.clippingContextCacheKey,d=!0),d}getRenderCacheKey(e){const{object:t,material:r}=e,s=this.utils,i=e.context;return[r.transparent,r.blending,r.premultipliedAlpha,r.blendSrc,r.blendDst,r.blendEquation,r.blendSrcAlpha,r.blendDstAlpha,r.blendEquationAlpha,r.colorWrite,r.depthWrite,r.depthTest,r.depthFunc,r.stencilWrite,r.stencilFunc,r.stencilFail,r.stencilZFail,r.stencilZPass,r.stencilFuncMask,r.stencilWriteMask,r.side,s.getSampleCountRenderContext(i),s.getCurrentColorSpace(i),s.getCurrentColorFormat(i),s.getCurrentDepthStencilFormat(i),s.getPrimitiveTopology(t,r),e.getGeometryCacheKey(),e.clippingContextCacheKey].join()}createSampler(e){this.textureUtils.createSampler(e)}destroySampler(e){this.textureUtils.destroySampler(e)}createDefaultTexture(e){this.textureUtils.createDefaultTexture(e)}createTexture(e,t){this.textureUtils.createTexture(e,t)}updateTexture(e,t){this.textureUtils.updateTexture(e,t)}generateMipmaps(e){this.textureUtils.generateMipmaps(e)}destroyTexture(e){this.textureUtils.destroyTexture(e)}copyTextureToBuffer(e,t,r,s,i,n){return this.textureUtils.copyTextureToBuffer(e,t,r,s,i,n)}initTimestampQuery(e,t){if(!this.trackTimestamp)return;const r=this.get(e);if(!r.timeStampQuerySet){const s=e.isComputeNode?"compute":"render",i=this.device.createQuerySet({type:"timestamp",count:2,label:`timestamp_${s}_${e.id}`}),n={querySet:i,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};Object.assign(t,{timestampWrites:n}),r.timeStampQuerySet=i}}prepareTimestampBuffer(e,t){if(!this.trackTimestamp)return;const r=this.get(e),s=2*BigInt64Array.BYTES_PER_ELEMENT;void 0===r.currentTimestampQueryBuffers&&(r.currentTimestampQueryBuffers={resolveBuffer:this.device.createBuffer({label:"timestamp resolve buffer",size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),resultBuffer:this.device.createBuffer({label:"timestamp result buffer",size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});const{resolveBuffer:i,resultBuffer:n}=r.currentTimestampQueryBuffers;t.resolveQuerySet(r.timeStampQuerySet,0,2,i,0),"unmapped"===n.mapState&&t.copyBufferToBuffer(i,0,n,0,s)}async resolveTimestampAsync(e,t="render"){if(!this.trackTimestamp)return;const r=this.get(e);if(void 0===r.currentTimestampQueryBuffers)return;const{resultBuffer:s}=r.currentTimestampQueryBuffers;"unmapped"===s.mapState&&s.mapAsync(GPUMapMode.READ).then((()=>{const e=new BigUint64Array(s.getMappedRange()),r=Number(e[1]-e[0])/1e6;this.renderer.info.updateTimestamp(t,r),s.unmap()}))}createNodeBuilder(e,t){return new MN(e,t)}createProgram(e){this.get(e).module={module:this.device.createShaderModule({code:e.code,label:e.stage}),entryPoint:"main"}}destroyProgram(e){this.delete(e)}createRenderPipeline(e,t){this.pipelineUtils.createRenderPipeline(e,t)}createComputePipeline(e,t){this.pipelineUtils.createComputePipeline(e,t)}beginBundle(e){const t=this.get(e);t._currentPass=t.currentPass,t._currentSets=t.currentSets,t.currentSets={attributes:{},bindingGroups:[],pipeline:null,index:null},t.currentPass=this.pipelineUtils.createBundleEncoder(e)}finishBundle(e,t){const r=this.get(e),s=r.currentPass.finish();this.get(t).bundleGPU=s,r.currentSets=r._currentSets,r.currentPass=r._currentPass}addBundle(e,t){this.get(e).renderBundles.push(this.get(t).bundleGPU)}createBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBindings(e,t,r,s){this.bindingUtils.createBindings(e,t,r,s)}updateBinding(e){this.bindingUtils.updateBinding(e)}createIndexAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.INDEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}createIndirectStorageAttribute(e){this.attributeUtils.createAttribute(e,GPUBufferUsage.STORAGE|GPUBufferUsage.INDIRECT|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST)}updateAttribute(e){this.attributeUtils.updateAttribute(e)}destroyAttribute(e){this.attributeUtils.destroyAttribute(e)}updateSize(){this.colorBuffer=this.textureUtils.getColorBuffer(),this.defaultRenderPassdescriptor=null}getMaxAnisotropy(){return 16}hasFeature(e){return this.device.features.has(e)}copyTextureToTexture(e,t,r=null,s=null,i=0){let n=0,o=0,a=0,u=0,l=0,d=0,c=e.image.width,h=e.image.height;null!==r&&(u=r.x,l=r.y,d=r.z||0,c=r.width,h=r.height),null!==s&&(n=s.x,o=s.y,a=s.z||0);const p=this.device.createCommandEncoder({label:"copyTextureToTexture_"+e.id+"_"+t.id}),g=this.get(e).texture,m=this.get(t).texture;p.copyTextureToTexture({texture:g,mipLevel:i,origin:{x:u,y:l,z:d}},{texture:m,mipLevel:i,origin:{x:n,y:o,z:a}},[c,h,1]),this.device.queue.submit([p.finish()])}copyFramebufferToTexture(e,t,r){const s=this.get(t);let i=null;i=t.renderTarget?e.isDepthTexture?this.get(t.depthTexture).texture:this.get(t.textures[0]).texture:e.isDepthTexture?this.textureUtils.getDepthBuffer(t.depth,t.stencil):this.context.getCurrentTexture();const n=this.get(e).texture;if(i.format!==n.format)return void console.error("WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.",i.format,n.format);let o;if(s.currentPass?(s.currentPass.end(),o=s.encoder):o=this.device.createCommandEncoder({label:"copyFramebufferToTexture_"+e.id}),o.copyTextureToTexture({texture:i,origin:[r.x,r.y,0]},{texture:n},[r.z,r.w]),e.generateMipmaps&&this.textureUtils.generateMipmaps(e),s.currentPass){const{descriptor:e}=s;for(let t=0;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new I_(e)));super(new t(e),e),this.library=new GN,this.isWebGPURenderer=!0}}class zN extends es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}const $N=new Yc,HN=new Jm($N);class WN{constructor(e,t=Oi(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0,$N.name="PostProcessing"}render(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,HN.render(e),e.toneMapping=t,e.outputColorSpace=r}update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;HN.material.fragmentNode=!0===this.outputColorTransform?du(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),HN.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this.update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=d,e.outputColorSpace=Ae,await HN.renderAsync(e),e.toneMapping=t,e.outputColorSpace=r}}function jN(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function qN(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function KN(e,t,r={}){return(r=jN(e,r)).background=t.background,r.backgroundNode=t.backgroundNode,r.overrideMaterial=t.overrideMaterial,r}var XN=Object.freeze({__proto__:null,resetRendererAndSceneState:function(e,t,r){return r=KN(e,t,r),t.background=null,t.backgroundNode=null,t.overrideMaterial=null,r},resetRendererState:function(e,t){return t=jN(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t},restoreRendererAndSceneState:function(e,t,r){qN(e,r),t.background=r.background,t.backgroundNode=r.backgroundNode,t.overrideMaterial=r.overrideMaterial},restoreRendererState:qN,saveRendererAndSceneState:KN,saveRendererState:jN});class YN extends ee{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=$,this.minFilter=$,this.isStorageTexture=!0}}class QN extends uf{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class ZN extends ts{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new rs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):console.error(t),this.manager.itemError(e)}}),r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(console.error("THREE.NodeLoader: Node type not found:",e),Ci()):fi(new this.nodes[e])}}class JN extends ss{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class eS extends is{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new ZN;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new JN;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t