diff --git a/build/three.cjs b/build/three.cjs index 4bb13ad8687e3b..c70f44ed0c3423 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -70702,7 +70702,7 @@ function WebGLUtils( gl, extensions ) { if ( extension !== null ) { - if ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; + if ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; if ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; if ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; if ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; diff --git a/build/three.module.js b/build/three.module.js index 0187faddbb65a0..50196da5a9bfbf 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -12723,7 +12723,7 @@ function WebGLUtils( gl, extensions ) { if ( extension !== null ) { - if ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; + if ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; if ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; if ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; if ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; diff --git a/build/three.module.min.js b/build/three.module.min.js index 095d3a009f5ebd..383ff4013dfea4 100644 --- a/build/three.module.min.js +++ b/build/three.module.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Matrix3 as e,Vector2 as t,Color as n,mergeUniforms as i,Vector3 as r,CubeUVReflectionMapping as a,Mesh as o,BoxGeometry as s,ShaderMaterial as l,BackSide as c,cloneUniforms as d,Euler as u,Matrix4 as f,ColorManagement as p,SRGBTransfer as m,PlaneGeometry as h,FrontSide as _,getUnlitUniformColorSpace as g,IntType as v,HalfFloatType as E,UnsignedByteType as S,FloatType as T,RGBAFormat as M,Plane as x,EquirectangularReflectionMapping as R,EquirectangularRefractionMapping as A,WebGLCubeRenderTarget as b,CubeReflectionMapping as C,CubeRefractionMapping as L,OrthographicCamera as w,PerspectiveCamera as U,NoToneMapping as P,MeshBasicMaterial as D,NoBlending as y,WebGLRenderTarget as I,BufferGeometry as N,BufferAttribute as O,LinearSRGBColorSpace as F,LinearFilter as B,warnOnce as H,Uint32BufferAttribute as G,Uint16BufferAttribute as V,arrayNeedsUint32 as z,Vector4 as W,DataArrayTexture as k,CubeTexture as X,Data3DTexture as Y,LessEqualCompare as j,DepthTexture as K,Texture as q,GLSL3 as Z,PCFShadowMap as $,PCFSoftShadowMap as Q,VSMShadowMap as J,CustomToneMapping as ee,NeutralToneMapping as te,AgXToneMapping as ne,ACESFilmicToneMapping as ie,CineonToneMapping as re,ReinhardToneMapping as ae,LinearToneMapping as oe,LinearTransfer as se,AddOperation as le,MixOperation as ce,MultiplyOperation as de,UniformsUtils as ue,DoubleSide as fe,NormalBlending as pe,TangentSpaceNormalMap as me,ObjectSpaceNormalMap as he,Layers as _e,Frustum as ge,MeshDepthMaterial as ve,RGBADepthPacking as Ee,MeshDistanceMaterial as Se,NearestFilter as Te,LessEqualDepth as Me,ReverseSubtractEquation as xe,SubtractEquation as Re,AddEquation as Ae,OneMinusConstantAlphaFactor as be,ConstantAlphaFactor as Ce,OneMinusConstantColorFactor as Le,ConstantColorFactor as we,OneMinusDstAlphaFactor as Ue,OneMinusDstColorFactor as Pe,OneMinusSrcAlphaFactor as De,OneMinusSrcColorFactor as ye,DstAlphaFactor as Ie,DstColorFactor as Ne,SrcAlphaSaturateFactor as Oe,SrcAlphaFactor as Fe,SrcColorFactor as Be,OneFactor as He,ZeroFactor as Ge,NotEqualDepth as Ve,GreaterDepth as ze,GreaterEqualDepth as We,EqualDepth as ke,LessDepth as Xe,AlwaysDepth as Ye,NeverDepth as je,CullFaceNone as Ke,CullFaceBack as qe,CullFaceFront as Ze,CustomBlending as $e,MultiplyBlending as Qe,SubtractiveBlending as Je,AdditiveBlending as et,MinEquation as tt,MaxEquation as nt,MirroredRepeatWrapping as it,ClampToEdgeWrapping as rt,RepeatWrapping as at,LinearMipmapLinearFilter as ot,LinearMipmapNearestFilter as st,NearestMipmapLinearFilter as lt,NearestMipmapNearestFilter as ct,NotEqualCompare as dt,GreaterCompare as ut,GreaterEqualCompare as ft,EqualCompare as pt,LessCompare as mt,AlwaysCompare as ht,NeverCompare as _t,NoColorSpace as gt,DepthStencilFormat as vt,getByteLength as Et,UnsignedInt248Type as St,DepthFormat as Tt,UnsignedIntType as Mt,UnsignedShortType as xt,createElementNS as Rt,UnsignedShort4444Type as At,UnsignedShort5551Type as bt,UnsignedInt5999Type as Ct,ByteType as Lt,ShortType as wt,AlphaFormat as Ut,RGBFormat as Pt,RedFormat as Dt,RedIntegerFormat as yt,RGFormat as It,RGIntegerFormat as Nt,RGBAIntegerFormat as Ot,RGB_S3TC_DXT1_Format as Ft,RGBA_S3TC_DXT1_Format as Bt,RGBA_S3TC_DXT3_Format as Ht,RGBA_S3TC_DXT5_Format as Gt,RGB_PVRTC_4BPPV1_Format as Vt,RGB_PVRTC_2BPPV1_Format as zt,RGBA_PVRTC_4BPPV1_Format as Wt,RGBA_PVRTC_2BPPV1_Format as kt,RGB_ETC1_Format as Xt,RGB_ETC2_Format as Yt,RGBA_ETC2_EAC_Format as jt,RGBA_ASTC_4x4_Format as Kt,RGBA_ASTC_5x4_Format as qt,RGBA_ASTC_5x5_Format as Zt,RGBA_ASTC_6x5_Format as $t,RGBA_ASTC_6x6_Format as Qt,RGBA_ASTC_8x5_Format as Jt,RGBA_ASTC_8x6_Format as en,RGBA_ASTC_8x8_Format as tn,RGBA_ASTC_10x5_Format as nn,RGBA_ASTC_10x6_Format as rn,RGBA_ASTC_10x8_Format as an,RGBA_ASTC_10x10_Format as on,RGBA_ASTC_12x10_Format as sn,RGBA_ASTC_12x12_Format as ln,RGBA_BPTC_Format as cn,RGB_BPTC_SIGNED_Format as dn,RGB_BPTC_UNSIGNED_Format as un,RED_RGTC1_Format as fn,SIGNED_RED_RGTC1_Format as pn,RED_GREEN_RGTC2_Format as mn,SIGNED_RED_GREEN_RGTC2_Format as hn,EventDispatcher as _n,ArrayCamera as gn,WebXRController as vn,RAD2DEG as En,createCanvasElement as Sn,SRGBColorSpace as Tn,REVISION as Mn,toNormalizedProjectionMatrix as xn,toReversedProjectionMatrix as Rn,probeAsync as An,WebGLCoordinateSystem as bn}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AlwaysStencilFunc,AmbientLight,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BasicShadowMap,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTexture,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DepthArrayTexture,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,Float32BufferAttribute,Fog,FogExp2,FramebufferTexture,FrustumArray,GLBufferAttribute,GLSL1,GreaterEqualStencilFunc,GreaterStencilFunc,GridHelper,Group,HemisphereLight,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,IncrementStencilOp,IncrementWrapStencilOp,InstancedBufferAttribute,InstancedBufferGeometry,InstancedInterleavedBuffer,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,InterleavedBuffer,InterleavedBufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,InvertStencilOp,KeepStencilOp,KeyframeTrack,LOD,LatheGeometry,LessEqualStencilFunc,LessStencilFunc,Light,LightProbe,Line,Line3,LineBasicMaterial,LineCurve,LineCurve3,LineDashedMaterial,LineLoop,LineSegments,LinearInterpolant,LinearMipMapLinearFilter,LinearMipMapNearestFilter,Loader,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Material,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NormalAnimationBlendMode,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,RenderTargetArray,ReplaceStencilOp,RingGeometry,Scene,ShadowMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,SphereGeometry,Spherical,SphericalHarmonics3,SplineCurve,SpotLight,SpotLightHelper,Sprite,SpriteMaterial,StaticCopyUsage,StaticDrawUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,UVMapping,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGPUCoordinateSystem,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,ZeroStencilOp}from"./three.core.min.js";function Cn(){let e=null,t=!1,n=null,i=null;function r(t,a){n(t,a),i=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==n&&(i=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(i),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function Ln(e){const t=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t.get(e)},remove:function(n){n.isInterleavedBufferAttribute&&(n=n.data);const i=t.get(n);i&&(e.deleteBuffer(i.buffer),t.delete(n))},update:function(n,i){if(n.isInterleavedBufferAttribute&&(n=n.data),n.isGLBufferAttribute){const e=t.get(n);return void((!e||e.versione.start-t.start));let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Un={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Pn={basic:{uniforms:i([Un.common,Un.specularmap,Un.envmap,Un.aomap,Un.lightmap,Un.fog]),vertexShader:wn.meshbasic_vert,fragmentShader:wn.meshbasic_frag},lambert:{uniforms:i([Un.common,Un.specularmap,Un.envmap,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.fog,Un.lights,{emissive:{value:new n(0)}}]),vertexShader:wn.meshlambert_vert,fragmentShader:wn.meshlambert_frag},phong:{uniforms:i([Un.common,Un.specularmap,Un.envmap,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.fog,Un.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:wn.meshphong_vert,fragmentShader:wn.meshphong_frag},standard:{uniforms:i([Un.common,Un.envmap,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.roughnessmap,Un.metalnessmap,Un.fog,Un.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:wn.meshphysical_vert,fragmentShader:wn.meshphysical_frag},toon:{uniforms:i([Un.common,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.gradientmap,Un.fog,Un.lights,{emissive:{value:new n(0)}}]),vertexShader:wn.meshtoon_vert,fragmentShader:wn.meshtoon_frag},matcap:{uniforms:i([Un.common,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.fog,{matcap:{value:null}}]),vertexShader:wn.meshmatcap_vert,fragmentShader:wn.meshmatcap_frag},points:{uniforms:i([Un.points,Un.fog]),vertexShader:wn.points_vert,fragmentShader:wn.points_frag},dashed:{uniforms:i([Un.common,Un.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:wn.linedashed_vert,fragmentShader:wn.linedashed_frag},depth:{uniforms:i([Un.common,Un.displacementmap]),vertexShader:wn.depth_vert,fragmentShader:wn.depth_frag},normal:{uniforms:i([Un.common,Un.bumpmap,Un.normalmap,Un.displacementmap,{opacity:{value:1}}]),vertexShader:wn.meshnormal_vert,fragmentShader:wn.meshnormal_frag},sprite:{uniforms:i([Un.sprite,Un.fog]),vertexShader:wn.sprite_vert,fragmentShader:wn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:wn.background_vert,fragmentShader:wn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:wn.backgroundCube_vert,fragmentShader:wn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:wn.cube_vert,fragmentShader:wn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:wn.equirect_vert,fragmentShader:wn.equirect_frag},distanceRGBA:{uniforms:i([Un.common,Un.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:wn.distanceRGBA_vert,fragmentShader:wn.distanceRGBA_frag},shadow:{uniforms:i([Un.lights,Un.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:wn.shadow_vert,fragmentShader:wn.shadow_frag}};Pn.physical={uniforms:i([Pn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:wn.meshphysical_vert,fragmentShader:wn.meshphysical_frag};const Dn={r:0,b:0,g:0},yn=new u,In=new f;function Nn(e,t,i,r,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,R=0,A=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?i:t).get(n)}return n}function C(t,n){t.getRGB(Dn,g(e)),r.buffers.color.setClear(Dn.r,Dn.g,Dn.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const i=b(t);null===i?C(E,M):i&&i.isColor&&(C(i,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?r.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&r.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(r.buffers.depth.setTest(!0),r.buffers.depth.setMask(!0),r.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const i=b(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===T&&(T=new o(new s(1e4,1e4,1e4),new l({name:"BackgroundCubeMaterial",uniforms:d(Pn.backgroundCube.uniforms),vertexShader:Pn.backgroundCube.vertexShader,fragmentShader:Pn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),yn.copy(n.backgroundRotation),yn.x*=-1,yn.y*=-1,yn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(yn.y*=-1,yn.z*=-1),T.material.uniforms.envMap.value=i,T.material.uniforms.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(In.makeRotationFromEuler(yn)),T.material.toneMapped=p.getTransfer(i.colorSpace)!==m,x===i&&R===i.version&&A===e.toneMapping||(T.material.needsUpdate=!0,x=i,R=i.version,A=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):i&&i.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Pn.background.uniforms),vertexShader:Pn.background.vertexShader,fragmentShader:Pn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=i,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(i.colorSpace)!==m,!0===i.matrixAutoUpdate&&i.updateMatrix(),S.material.uniforms.uvTransform.value.copy(i.matrix),x===i&&R===i.version&&A===e.toneMapping||(S.material.needsUpdate=!0,x=i,R=i.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function On(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),g&&function(e,t,n,i){const r={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reverseDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===M||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===E&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==S&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==T&&!r)},precision:o,logarithmicDepthBuffer:l,reverseDepthBuffer:c,maxTextures:d,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function Hn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new x,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function Gn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=C:t===A&&(e.mapping=L),e}function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping;if(a===R||a===A){if(t.has(r)){return n(t.get(r).texture,r.mapping)}{const a=r.image;if(a&&a.height>0){const o=new b(a.height);return o.fromEquirectangularTexture(e,r),t.set(r,o),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}const Vn=[.125,.215,.35,.446,.526,.582],zn=20,Wn=new w,kn=new n;let Xn=null,Yn=0,jn=0,Kn=!1;const qn=(1+Math.sqrt(5))/2,Zn=1/qn,$n=[new r(-qn,Zn,0),new r(qn,Zn,0),new r(-Zn,0,qn),new r(Zn,0,qn),new r(0,qn,-Zn),new r(0,qn,Zn),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Qn=new r;class Jn{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=Qn}=r;Xn=this._renderer.getRenderTarget(),Yn=this._renderer.getActiveCubeFace(),jn=this._renderer.getActiveMipmapLevel(),Kn=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=ii(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ni(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_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?s=Vn[o-e+4-1]:0===o&&(s=0),i.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(i,m*p*e),v.set(u,h*p*e);const r=[e,e,e,e,e,e];E.set(r,_*p*e)}const S=new N;S.setAttribute("position",new O(g,m)),S.setAttribute("uv",new O(v,h)),S.setAttribute("faceIndex",new O(E,_)),t.push(S),r>4&&r--}return{lodPlanes:t,sizeLods:n,sigmas:i}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(zn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:zn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ri(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1});return o}(i,e,t)}return i}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Wn)}_sceneToCubeUV(e,t,n,i,r){const a=new U(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(kn),u.toneMapping=P,u.autoClear=!1;const m=new D({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),h=new o(new s,m);let _=!1;const g=e.background;g?g.isColor&&(m.color.copy(g),e.background=null,_=!0):(m.color.copy(kn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;ti(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(h,a),u.render(e,a)}h.geometry.dispose(),h.material.dispose(),u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===C||e.mapping===L;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=ii()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ni());const r=i?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],r);r.uniforms.envMap.value=e;const s=this._cubeSize;ti(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Wn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodPlanes.length;for(let t=1;tzn&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?i-v+4:0),4*(this._cubeSize-E),3*E,2*E),l.setRenderTarget(t),l.render(d,Wn)}}function ei(e,t,n){const i=new I(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function ti(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function ni(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ri(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function ii(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ri(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function ri(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function ai(e){let t=new WeakMap,n=null;function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping,o=a===R||a===A,s=a===C||a===L;if(o||s){let a=t.get(r);const l=void 0!==a?a.texture.pmremVersion:0;if(r.isRenderTargetTexture&&r.pmremVersion!==l)return null===n&&(n=new Jn(e)),a=o?n.fromEquirectangular(r,a):n.fromCubemap(r,a),a.texture.pmremVersion=r.pmremVersion,t.set(r,a),a.texture;if(void 0!==a)return a.texture;{const l=r.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;in.maxTextureSize&&(M=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*M*4*u),R=new k(x,S,M,u);R.type=T,R.needsUpdate=!0;const A=4*E;for(let C=0;C0)return e;const r=t*n;let a=gi[r];if(void 0===a&&(a=new Float32Array(r),gi[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function xi(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Tr(e,t){const n=function(e){p._getMatrix(Er,p.workingColorSpace,e);const t=`mat3( ${Er.elements.map((e=>e.toFixed(4)))} )`;switch(p.getTransfer(e)){case se:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}function Mr(e,t){let n;switch(t){case oe:n="Linear";break;case ae:n="Reinhard";break;case re:n="Cineon";break;case ie:n="ACESFilmic";break;case ne:n="AgX";break;case te:n="Neutral";break;case ee:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const xr=new r;function Rr(){p.getLuminanceCoefficients(xr);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${xr.x.toFixed(4)}, ${xr.y.toFixed(4)}, ${xr.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Ar(e){return""!==e}function br(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Cr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Lr=/^[ \t]*#include +<([\w\d./]+)>/gm;function wr(e){return e.replace(Lr,Pr)}const Ur=new Map;function Pr(e,t){let n=wn[t];if(void 0===n){const e=Ur.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=wn[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return wr(n)}const Dr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function yr(e){return e.replace(Dr,Ir)}function Ir(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(Ar).join("\n"),v.length>0&&(v+="\n")):(g=[Nr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Ar).join("\n"),v=[Nr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==P?"#define TONE_MAPPING":"",n.toneMapping!==P?wn.tonemapping_pars_fragment:"",n.toneMapping!==P?Mr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",wn.colorspace_pars_fragment,Tr("linearToOutputTexel",n.outputColorSpace),Rr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Ar).join("\n")),s=wr(s),s=br(s,n),s=Cr(s,n),l=wr(l),l=br(l,n),l=Cr(l,n),s=yr(s),l=yr(l),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Z?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Z?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+v,S>0&&(g=["#extension GL_OVR_multiview : require","layout(num_views = "+S+") in;","#define VIEW_ID gl_ViewID_OVR"].join("\n")+"\n"+g,g=g.replace(["uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;"].join("\n"),["uniform mat4 modelViewMatrices["+S+"];","uniform mat4 projectionMatrices["+S+"];","uniform mat4 viewMatrices["+S+"];","uniform mat3 normalMatrices["+S+"];","#define modelViewMatrix modelViewMatrices[VIEW_ID]","#define projectionMatrix projectionMatrices[VIEW_ID]","#define viewMatrix viewMatrices[VIEW_ID]","#define normalMatrix normalMatrices[VIEW_ID]"].join("\n")),v=["#extension GL_OVR_multiview : require","#define VIEW_ID gl_ViewID_OVR"].join("\n")+"\n"+v,v=v.replace("uniform mat4 viewMatrix;",["uniform mat4 viewMatrices["+S+"];","#define viewMatrix viewMatrices[VIEW_ID]"].join("\n"))));const T=E+g+s,M=E+v+l,x=gr(r,r.VERTEX_SHADER,T),R=gr(r,r.FRAGMENT_SHADER,M);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(_).trim(),i=r.getShaderInfoLog(x).trim(),a=r.getShaderInfoLog(R).trim();let o=!0,s=!0;if(!1===r.getProgramParameter(_,r.LINK_STATUS))if(o=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,_,x,R);else{const e=Sr(r,x,"vertex"),i=Sr(r,R,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(_,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+n+"\n"+e+"\n"+i)}else""!==n?console.warn("THREE.WebGLProgram: Program Info Log:",n):""!==i&&""!==a||(s=!1);s&&(t.diagnostics={runnable:o,programLog:n,vertexShader:{log:i,prefix:g},fragmentShader:{log:a,prefix:v}})}r.deleteShader(x),r.deleteShader(R),b=new _r(r,_),w=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,ee=o.clearcoat>0,te=o.dispersion>0,ne=o.iridescence>0,ie=o.sheen>0,re=o.transmission>0,ae=J&&!!o.anisotropyMap,oe=ee&&!!o.clearcoatMap,se=ee&&!!o.clearcoatNormalMap,le=ee&&!!o.clearcoatRoughnessMap,ce=ne&&!!o.iridescenceMap,de=ne&&!!o.iridescenceThicknessMap,ue=ie&&!!o.sheenColorMap,_e=ie&&!!o.sheenRoughnessMap,ge=!!o.specularMap,ve=!!o.specularColorMap,Ee=!!o.specularIntensityMap,Se=re&&!!o.transmissionMap,Te=re&&!!o.thicknessMap,Me=!!o.gradientMap,xe=!!o.alphaMap,Re=o.alphaTest>0,Ae=!!o.alphaHash,be=!!o.extensions;let Ce=P;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(Ce=e.toneMapping));const Le={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:D,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:I,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:V,batchingColor:V&&null!==T._colorsTexture,instancing:G,instancingColor:G&&null!==T.instanceColor,instancingMorph:G&&null!==T.morphTexture,supportsVertexTextures:_,numMultiviewViews:B,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:F,alphaToCoverage:!!o.alphaToCoverage,map:z,matcap:W,envMap:k,envMapMode:k&&A.mapping,envMapCubeUVHeight:b,aoMap:X,lightMap:Y,bumpMap:j,normalMap:K,displacementMap:_&&q,emissiveMap:Z,normalMapObjectSpace:K&&o.normalMapType===he,normalMapTangentSpace:K&&o.normalMapType===me,metalnessMap:$,roughnessMap:Q,anisotropy:J,anisotropyMap:ae,clearcoat:ee,clearcoatMap:oe,clearcoatNormalMap:se,clearcoatRoughnessMap:le,dispersion:te,iridescence:ne,iridescenceMap:ce,iridescenceThicknessMap:de,sheen:ie,sheenColorMap:ue,sheenRoughnessMap:_e,specularMap:ge,specularColorMap:ve,specularIntensityMap:Ee,transmission:re,transmissionMap:Se,thicknessMap:Te,gradientMap:Me,opaque:!1===o.transparent&&o.blending===pe&&!1===o.alphaToCoverage,alphaMap:xe,alphaTest:Re,alphaHash:Ae,combine:o.combine,mapUv:z&&E(o.map.channel),aoMapUv:X&&E(o.aoMap.channel),lightMapUv:Y&&E(o.lightMap.channel),bumpMapUv:j&&E(o.bumpMap.channel),normalMapUv:K&&E(o.normalMap.channel),displacementMapUv:q&&E(o.displacementMap.channel),emissiveMapUv:Z&&E(o.emissiveMap.channel),metalnessMapUv:$&&E(o.metalnessMap.channel),roughnessMapUv:Q&&E(o.roughnessMap.channel),anisotropyMapUv:ae&&E(o.anisotropyMap.channel),clearcoatMapUv:oe&&E(o.clearcoatMap.channel),clearcoatNormalMapUv:se&&E(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:le&&E(o.clearcoatRoughnessMap.channel),iridescenceMapUv:ce&&E(o.iridescenceMap.channel),iridescenceThicknessMapUv:de&&E(o.iridescenceThicknessMap.channel),sheenColorMapUv:ue&&E(o.sheenColorMap.channel),sheenRoughnessMapUv:_e&&E(o.sheenRoughnessMap.channel),specularMapUv:ge&&E(o.specularMap.channel),specularColorMapUv:ve&&E(o.specularColorMap.channel),specularIntensityMapUv:Ee&&E(o.specularIntensityMap.channel),transmissionMapUv:Se&&E(o.transmissionMap.channel),thicknessMapUv:Te&&E(o.thicknessMap.channel),alphaMapUv:xe&&E(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||J),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(z||xe),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reverseDepthBuffer:H,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:w,morphTextureStride:N,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:Ce,decodeVideoTexture:z&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:Z&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===fe,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:be&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(be&&!0===o.extensions.multiDraw||V)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Le.vertexUv1s=u.has(1),Le.vertexUv2s=u.has(2),Le.vertexUv3s=u.has(3),u.clear(),Le},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&l.enable(21);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reverseDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);t.numMultiviewViews&&l.enable(22);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=Pn[t];n=ue.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i;for(let e=0,t=f.length;e0?i.push(d):!0===o.transparent?r.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?i.unshift(d):!0===o.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||zr),i.length>1&&i.sort(t||Wr),r.length>1&&r.sort(t||Wr)}}}function Xr(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new kr,e.set(t,[r])):n>=i.length?(r=new kr,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function Yr(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let jr=0;function Kr(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function qr(e){const n=new Yr,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new r);const o=new r,s=new f,l=new f;return{setup:function(t){let r=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(Kr);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Un.LTC_FLOAT_1,a.rectAreaLTC2=Un.LTC_FLOAT_2):(a.rectAreaLTC1=Un.LTC_HALF_1,a.rectAreaLTC2=Un.LTC_HALF_2)),a.ambient[0]=r,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=jr++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new Zr(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}function Qr(e,n,i){let r=new ge;const a=new t,s=new t,d=new W,u=new ve({depthPacking:Ee}),f=new Se,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[fe]:fe},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const E=new N;E.setAttribute("position",new O(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new o(E,g),T=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=$;let M=this.type;function x(t,i){const r=n.update(S);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new I(a.x,a.y)),g.uniforms.shadow_pass.value=t.map.texture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,S,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,v,S,null)}function R(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",b)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===J?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function A(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===J)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;cm||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/h.x),a.x=s.x*h.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/h.y),a.y=s.y*h.y,c.mapSize.y=s.y)),null===c.map||!0===f||!0===p){const e=this.type!==J?{minFilter:Te,magFilter:Te}:{};null!==c.map&&c.map.dispose(),c.map=new I(a.x,a.y,e),c.map.texture.name=l.name+".shadowMap",c.camera.updateProjectionMatrix()}e.setRenderTarget(c.map),e.clear();const _=c.getViewportCount();for(let e=0;e<_;e++){const t=c.getViewport(e);d.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(d),c.updateMatrices(l,e),r=c.getFrustum(),A(n,i,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===J&&x(c,i),c.needsUpdate=!1}M=this.type,T.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const Jr={[je]:Ye,[Xe]:ze,[ke]:Ve,[Me]:We,[Ye]:je,[ze]:Xe,[Ve]:ke,[We]:Me};function ea(e,t){const i=new function(){let t=!1;const n=new W;let i=null;const r=new W(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,a,o,s){!0===s&&(t*=o,i*=o,a*=o),n.set(t,i,a,o),!1===r.equals(n)&&(e.clearColor(t,i,a,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},r=new function(){let n=!1,i=!1,r=null,a=null,o=null;return{setReversed:function(e){if(i!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),i=e;const r=o;o=null,this.setClear(r)}},getReversed:function(){return i},setTest:function(t){t?k(e.DEPTH_TEST):X(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=Jr[t]),a!==t){switch(t){case je:e.depthFunc(e.NEVER);break;case Ye:e.depthFunc(e.ALWAYS);break;case Xe:e.depthFunc(e.LESS);break;case Me:e.depthFunc(e.LEQUAL);break;case ke:e.depthFunc(e.EQUAL);break;case We:e.depthFunc(e.GEQUAL);break;case ze:e.depthFunc(e.GREATER);break;case Ve:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(i&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,r=null,a=null,o=null,i=!1}}},a=new function(){let t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?k(e.STENCIL_TEST):X(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&a===o||(e.stencilFunc(t,n,o),i=t,r=n,a=o)},setOp:function(t,n,i){o===t&&s===n&&l===i||(e.stencilOp(t,n,i),o=t,s=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new n(0,0,0),x=0,R=!1,A=null,b=null,C=null,L=null,w=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let P=!1,D=0;const I=e.getParameter(e.VERSION);-1!==I.indexOf("WebGL")?(D=parseFloat(/^WebGL (\d)/.exec(I)[1]),P=D>=1):-1!==I.indexOf("OpenGL ES")&&(D=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),P=D>=2);let N=null,O={};const F=e.getParameter(e.SCISSOR_BOX),B=e.getParameter(e.VIEWPORT),H=(new W).fromArray(F),G=(new W).fromArray(B);function V(t,n,i,r){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(i*r.width),a=Math.floor(i*r.height);void 0===h&&(h=E(n,a));const o=t?E(n,a):h;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function R(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function b(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function C(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),i===e.RGBA){const t=o?se:p.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function L(t,n){let i;return t?null===n||n===Mt||n===St?i=e.DEPTH24_STENCIL8:n===T?i=e.DEPTH32F_STENCIL8:n===xt&&(i=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Mt||n===St?i=e.DEPTH_COMPONENT24:n===T?i=e.DEPTH_COMPONENT32F:n===xt&&(i=e.DEPTH_COMPONENT16),i}function w(e,t){return!0===R(e)||e.isFramebufferTexture&&e.minFilter!==Te&&e.minFilter!==B?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function U(e){const t=e.target;t.removeEventListener("dispose",U),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=_.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&_.delete(n)}r.remove(e)}(t),t.isVideoTexture&&f.delete(t)}function P(t){const n=t.target;n.removeEventListener("dispose",P),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function G(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",U));const r=n.source;let a=_.get(r);void 0===a&&(a={},_.set(r,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&D(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function V(t,n,a,s,l,c){const u=o.convert(a.format,a.colorSpace),f=o.convert(a.type),p=C(a.internalFormat,u,f,a.colorSpace),m=r.get(n),h=r.get(a);if(h.__renderTarget=n,!m.__hasExternalTextures){const t=Math.max(1,n.width>>c),r=Math.max(1,n.height>>c);!0===n.isWebGLMultiviewRenderTarget?i.texStorage3D(e.TEXTURE_2D_ARRAY,0,p,n.width,n.height,n.numViews):l===e.TEXTURE_3D||l===e.TEXTURE_2D_ARRAY?i.texImage3D(l,c,p,t,r,n.depth,0,u,f,null):i.texImage2D(l,c,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t);const _=K(n);!0===n.isWebGLMultiviewRenderTarget?_?d.framebufferTextureMultisampleMultiviewOVR(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,r.get(a).__webglTexture,0,Y(n),0,n.numViews):d.framebufferTextureMultiviewOVR(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,r.get(a).__webglTexture,0,0,n.numViews):(l===e.TEXTURE_2D||l>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&l<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,l,h.__webglTexture,c),i.bindFramebuffer(e.FRAMEBUFFER,null)}function z(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=L(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=Y(n);K(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;r0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function q(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==F&&n!==gt&&(p.getTransfer(n)===m?i===M&&r===S||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function Z(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(u.width=e.naturalWidth||e.width,u.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(u.width=e.displayWidth,u.height=e.displayHeight):(u.width=e.width,u.height=e.height),u}this.allocateTextureUnit=function(){const e=y;return e>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),y+=1,e},this.resetTextureUnits=function(){y=0},this.uploadTexture=function(t,n,s){if(this.deferTextureUploads)return n.isPendingDeferredUpload||(n.isPendingDeferredUpload=!0,g.push({textureProperties:t,texture:n,slot:s})),!1;let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=G(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===gt||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=x(n.image,!1,a.maxTextureSize);m=q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,v=C(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);H(l,n);const E=n.mipmaps,S=!0!==n.isVideoTexture,T=void 0===u.__version||!0===c,b=d.dataReady,U=w(n,m);if(n.isDepthTexture)v=L(n.format===vt,n.type),T&&(S?i.texStorage2D(e.TEXTURE_2D,1,v,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,v,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(E.length>0){S&&T&&i.texStorage2D(e.TEXTURE_2D,U,v,E[0].width,E[0].height);for(let t=0,n=E.length;t0){const r=Et(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*r/g.data.BYTES_PER_ELEMENT,(a+1)*r/g.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,v,g.width,g.height,m.depth,0,g.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else S?b&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):i.texImage3D(e.TEXTURE_2D_ARRAY,t,v,g.width,g.height,m.depth,0,h,_,g.data)}else{S&&T&&i.texStorage2D(e.TEXTURE_2D,U,v,E[0].width,E[0].height);for(let t=0,r=E.length;t0){const t=Et(m.width,m.height,n.format,n.type);for(const r of n.layerUpdates){const n=m.data.subarray(r*t/m.data.BYTES_PER_ELEMENT,(r+1)*t/m.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,r,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,v,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)S?(T&&i.texStorage3D(e.TEXTURE_3D,U,v,m.width,m.height,m.depth),b&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,v,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(T)if(S)i.texStorage2D(e.TEXTURE_2D,U,v,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(E.length>0){if(S&&T){const t=Z(E[0]);i.texStorage2D(e.TEXTURE_2D,U,v,t.width,t.height)}for(let t=0,n=E.length;t0&&a.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(!1===e.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else if(this.uploadTexture(a,t,n))return}i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)},this.setTexture2DArray=function(t,n){const a=r.get(t);t.version>0&&a.__version!==t.version?this.uploadTexture(a,t,n):i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n)},this.setTexture3D=function(t,n){const a=r.get(t);t.version>0&&a.__version!==t.version?this.uploadTexture(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=G(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===gt||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:x(n.image[e],!0,a.maxCubemapSize),h[e]=q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),v=o.convert(n.type),E=C(n.internalFormat,g,v,n.colorSpace),S=!0!==n.isVideoTexture,T=void 0===d.__version||!0===l,b=c.dataReady;let L,U=w(n,_);if(H(e.TEXTURE_CUBE_MAP,n),f){S&&T&&i.texStorage2D(e.TEXTURE_CUBE_MAP,U,E,_.width,_.height);for(let t=0;t<6;t++){L=h[t].mipmaps;for(let r=0;r0&&U++;const t=Z(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,U,E,t.width,t.height)}for(let t=0;t<6;t++)if(m){S?b&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,v,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,E,h[t].width,h[t].height,0,g,v,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===K(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===K(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,u=r.get(t),f=n.length>1;if(f)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,u.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,u.__webglFramebuffer);for(let i=0;i{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer){if(a)throw new Error("target.depthTexture not supported in Cube render targets");const e=t.texture.mipmaps;e&&e.length>0?W(n.__webglFramebuffer[0],t):this.setupDepthTexture(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),z(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),z(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)},this.setupFrameBufferTexture=V,this.useMultisampledRTT=K,this.setupDepthTexture=W,this.runDeferredUploads=function(){const e=this.deferTextureUploads;this.deferTextureUploads=!1;for(const e of g)this.uploadTexture(e.textureProperties,e.texture,e.slot),e.texture.isPendingDeferredUpload=!1;g=[],this.deferTextureUploads=e}}function na(e,t){return{convert:function(n,i=gt){let r;const a=p.getTransfer(i);if(n===S)return e.UNSIGNED_BYTE;if(n===At)return e.UNSIGNED_SHORT_4_4_4_4;if(n===bt)return e.UNSIGNED_SHORT_5_5_5_1;if(n===Ct)return e.UNSIGNED_INT_5_9_9_9_REV;if(n===Lt)return e.BYTE;if(n===wt)return e.SHORT;if(n===xt)return e.UNSIGNED_SHORT;if(n===v)return e.INT;if(n===Mt)return e.UNSIGNED_INT;if(n===T)return e.FLOAT;if(n===E)return e.HALF_FLOAT;if(n===Ut)return e.ALPHA;if(n===Pt)return e.RGB;if(n===M)return e.RGBA;if(n===Tt)return e.DEPTH_COMPONENT;if(n===vt)return e.DEPTH_STENCIL;if(n===Dt)return e.RED;if(n===yt)return e.RED_INTEGER;if(n===It)return e.RG;if(n===Nt)return e.RG_INTEGER;if(n===Ot)return e.RGBA_INTEGER;if(n===Ft||n===Bt||n===Ht||n===Gt)if(a===m){if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),null===r)return null;if(n===Ft)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Bt)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Ht)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Gt)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else{if(r=t.get("WEBGL_compressed_texture_s3tc"),null===r)return null;if(n===Ft)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Bt)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Ht)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Gt)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(n===Vt||n===zt||n===Wt||n===kt){if(r=t.get("WEBGL_compressed_texture_pvrtc"),null===r)return null;if(n===Vt)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===zt)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===Wt)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===kt)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(n===Xt||n===Yt||n===jt){if(r=t.get("WEBGL_compressed_texture_etc"),null===r)return null;if(n===Xt||n===Yt)return a===m?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===jt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}if(n===Kt||n===qt||n===Zt||n===$t||n===Qt||n===Jt||n===en||n===tn||n===nn||n===rn||n===an||n===on||n===sn||n===ln){if(r=t.get("WEBGL_compressed_texture_astc"),null===r)return null;if(n===Kt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===qt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Zt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===$t)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Qt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Jt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===en)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===tn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===nn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===rn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===an)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===on)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===sn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===ln)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}if(n===cn||n===dn||n===un){if(r=t.get("EXT_texture_compression_bptc"),null===r)return null;if(n===cn)return a===m?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===dn)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===un)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}if(n===fn||n===pn||n===mn||n===hn){if(r=t.get("EXT_texture_compression_rgtc"),null===r)return null;if(n===cn)return r.COMPRESSED_RED_RGTC1_EXT;if(n===pn)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===mn)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===hn)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}return n===St?e.UNSIGNED_INT_24_8:void 0!==e[n]?e[n]:null}}}class ia{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t,n){if(null===this.texture){const i=new q;e.properties.get(i).__webglTexture=t.texture,t.depthNear===n.depthNear&&t.depthFar===n.depthFar||(this.depthNear=t.depthNear,this.depthFar=t.depthFar),this.texture=i}}getMesh(e){if(null!==this.texture&&null===this.mesh){const t=e.cameras[0].viewport,n=new l({vertexShader:"\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}",fragmentShader:"\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class ra extends I{constructor(e,t,n,i={}){super(e,t,i),this.depthBuffer=!1,this.stencilBuffer=!1,this.numViews=n}copy(e){return super.copy(e),this.numViews=e.numViews,this}}ra.prototype.isWebGLMultiviewRenderTarget=!0;class aa extends _n{constructor(e,n,i,a){super();const o=this;let s=null,l=1,c=null,d="local-floor",u=1,f=null,p=null,m=null,h=null,_=null,g=null;const v=new ia,E=n.getContextAttributes();let T=null,x=null;const R=[],A=[],b=new t;let C=null;const L=new U;L.viewport=new W;const w=new U;w.viewport=new W;const P=[L,w],D=new gn;let y=null,N=null;function O(e){const t=A.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,f||c),n.dispatchEvent({type:e.type,data:e.inputSource}))}function F(){s.removeEventListener("select",O),s.removeEventListener("selectstart",O),s.removeEventListener("selectend",O),s.removeEventListener("squeeze",O),s.removeEventListener("squeezestart",O),s.removeEventListener("squeezeend",O),s.removeEventListener("end",F),s.removeEventListener("inputsourceschange",B);for(let e=0;e=0&&(A[i]=null,R[i].disconnect(n))}for(let t=0;t=A.length){A.push(n),i=e;break}if(null===A[e]){A[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.isMultiview=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new vn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new vn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new vn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){l=e,!0===o.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){d=e,!0===o.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return f||c},this.setReferenceSpace=function(e){f=e},this.getBaseLayer=function(){return null!==h?h:_},this.getBinding=function(){return m},this.getFrame=function(){return g},this.getSession=function(){return s},this.setSession=async function(t){if(s=t,null!==s){T=e.getRenderTarget(),s.addEventListener("select",O),s.addEventListener("selectstart",O),s.addEventListener("selectend",O),s.addEventListener("squeeze",O),s.addEventListener("squeezestart",O),s.addEventListener("squeezeend",O),s.addEventListener("end",F),s.addEventListener("inputsourceschange",B),!0!==E.xrCompatible&&await n.makeXRCompatible(),C=e.getPixelRatio(),e.getSize(b);if("undefined"!=typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,r=null,c=null;E.depth&&(c=E.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=E.stencil?vt:Tt,r=E.stencil?St:Mt),o.isMultiview=a&&i.has("OCULUS_multiview");const d={colorFormat:n.RGBA8,depthFormat:c,scaleFactor:l};o.isMultiview&&(d.textureType="texture-array"),m=new XRWebGLBinding(s,n),h=m.createProjectionLayer(d),s.updateRenderState({layers:[h]}),e.setPixelRatio(1),e.setSize(h.textureWidth,h.textureHeight,!1);const u={format:M,type:S,depthTexture:new K(h.textureWidth,h.textureHeight,r,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:E.stencil,encoding:e.outputEncoding,samples:E.antialias?4:0};if(o.isMultiview){const e=i.get("OCULUS_multiview");this.maxNumViews=n.getParameter(e.MAX_VIEWS_OVR),x=new ra(h.textureWidth,h.textureHeight,2,u)}else x=new I(h.textureWidth,h.textureHeight,u)}else{const t={antialias:E.antialias,alpha:!0,depth:E.depth,stencil:E.stencil,framebufferScaleFactor:l};_=new XRWebGLLayer(s,n,t),s.updateRenderState({baseLayer:_}),e.setPixelRatio(1),e.setSize(_.framebufferWidth,_.framebufferHeight,!1),x=new I(_.framebufferWidth,_.framebufferHeight,{format:M,type:S,colorSpace:e.outputColorSpace,stencilBuffer:E.stencil,resolveDepthBuffer:!1===_.ignoreDepthValues,resolveStencilBuffer:!1===_.ignoreDepthValues})}x.isXRRenderTarget=!0,this.setFoveation(u),f=null,c=await s.requestReferenceSpace(d),k.setContext(s),k.start(),o.isPresenting=!0,o.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==s)return s.environmentBlendMode},this.getDepthTexture=function(){return v.getDepthTexture()};const H=new r,G=new r;function V(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===s)return;let t=e.near,n=e.far;null!==v.texture&&(v.depthNear>0&&(t=v.depthNear),v.depthFar>0&&(n=v.depthFar)),D.near=w.near=L.near=t,D.far=w.far=L.far=n,y===D.near&&N===D.far||(s.updateRenderState({depthNear:D.near,depthFar:D.far}),y=D.near,N=D.far),L.layers.mask=2|e.layers.mask,w.layers.mask=4|e.layers.mask,D.layers.mask=L.layers.mask|w.layers.mask;const i=e.parent,r=D.cameras;V(D,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,oa.copy(o),oa.x*=-1,oa.y*=-1,oa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(oa.y*=-1,oa.z*=-1),e.envMapRotation.value.setFromMatrix4(sa.makeRotationFromEuler(oa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isMeshBasicMaterial||r.isMeshLambertMaterial?i(e,r):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r)):r.isMeshStandardMaterial?(i(e,r),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,i){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=i.texture,e.transmissionSamplerSize.value.set(i.width,i.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,a,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function ca(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return i[a]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else if(!1===e.equals(r))return e.copy(r),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=P;i.toneMapped&&(null!==y&&!0!==y.isXRRenderTarget||(m=L.toneMapping));const h=y&&y.isWebGLMultiviewRenderTarget?y.numViews:0,_=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,g=void 0!==_?_.length:0,v=me.get(i),E=A.state.lights;if(!0===ee&&(!0===te||e!==O)){const t=e===O&&i.id===N;be.setState(i,e,t)}let S=!1;i.version===v.__version?v.needsLights&&v.lightsStateVersion!==E.state.version||v.outputColorSpace!==s||r.isBatchedMesh&&!1===v.batching?S=!0:r.isBatchedMesh||!0!==v.batching?r.isBatchedMesh&&!0===v.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===v.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===v.instancing?S=!0:r.isInstancedMesh||!0!==v.instancing?r.isSkinnedMesh&&!1===v.skinning?S=!0:r.isSkinnedMesh||!0!==v.skinning?r.isInstancedMesh&&!0===v.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===v.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===v.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===v.instancingMorph&&null!==r.morphTexture||v.envMap!==l||!0===i.fog&&v.fog!==a?S=!0:void 0===v.numClippingPlanes||v.numClippingPlanes===be.numPlanes&&v.numIntersection===be.numIntersection?(v.vertexAlphas!==c||v.vertexTangents!==d||v.morphTargets!==u||v.morphNormals!==f||v.morphColors!==p||v.toneMapping!==m||v.morphTargetsCount!==g||v.numMultiviewViews!==h)&&(S=!0):S=!0:S=!0:S=!0:S=!0:(S=!0,v.__version=i.version);let T=v.currentProgram;!0===S&&(T=et(i,t,r));let M=!1,x=!1,R=!1;const b=T.getUniforms(),C=v.uniforms;ue.useProgram(T.program)&&(M=!0,x=!0,R=!0);i.id!==N&&(N=i.id,x=!0);if(M||O!==e){T.numMultiviewViews>0?Le.updateCameraProjectionMatricesUniform(e,b):b.setValue(Oe,"projectionMatrix",e.projectionMatrix);ue.buffers.depth.getReversed()?(ne.copy(e.projectionMatrix),xn(ne),Rn(ne),b.setValue(Oe,"projectionMatrix",ne)):b.setValue(Oe,"projectionMatrix",e.projectionMatrix),b.setValue(Oe,"viewMatrix",e.matrixWorldInverse);const t=b.map.cameraPosition;void 0!==t&&t.setValue(Oe,re.setFromMatrixPosition(e.matrixWorld)),de.logarithmicDepthBuffer&&b.setValue(Oe,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&b.setValue(Oe,"isOrthographic",!0===e.isOrthographicCamera),O!==e&&(O=e,x=!0,R=!0)}if(r.isSkinnedMesh){T.numMultiviewViews>0?Le.updateCameraViewMatricesUniform(e,b):b.setValue(Oe,"viewMatrix",e.matrixWorldInverse),b.setOptional(Oe,r,"bindMatrix"),b.setOptional(Oe,r,"bindMatrixInverse");const t=r.skeleton;t&&(null===t.boneTexture&&t.computeBoneTexture(),b.setValue(Oe,"boneTexture",t.boneTexture,he))}r.isBatchedMesh&&(b.setOptional(Oe,r,"batchingTexture"),b.setValue(Oe,"batchingTexture",r._matricesTexture,he),b.setOptional(Oe,r,"batchingIdTexture"),b.setValue(Oe,"batchingIdTexture",r._indirectTexture,he),b.setOptional(Oe,r,"batchingColorTexture"),null!==r._colorsTexture&&b.setValue(Oe,"batchingColorTexture",r._colorsTexture,he));const w=n.morphAttributes;void 0===w.position&&void 0===w.normal&&void 0===w.color||Ue.update(r,n,T);(x||v.receiveShadow!==r.receiveShadow)&&(v.receiveShadow=r.receiveShadow,b.setValue(Oe,"receiveShadow",r.receiveShadow));i.isMeshGouraudMaterial&&null!==i.envMap&&(C.envMap.value=l,C.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(C.envMapIntensity.value=t.environmentIntensity);x&&(b.setValue(Oe,"toneMappingExposure",L.toneMappingExposure),v.needsLights&&(D=R,(U=C).ambientLightColor.needsUpdate=D,U.lightProbe.needsUpdate=D,U.directionalLights.needsUpdate=D,U.directionalLightShadows.needsUpdate=D,U.pointLights.needsUpdate=D,U.pointLightShadows.needsUpdate=D,U.spotLights.needsUpdate=D,U.spotLightShadows.needsUpdate=D,U.rectAreaLights.needsUpdate=D,U.hemisphereLights.needsUpdate=D),a&&!0===i.fog&&xe.refreshFogUniforms(C,a),xe.refreshMaterialUniforms(C,i,j,Y,A.state.transmissionRenderTarget[e.id]),_r.upload(Oe,tt(v),C,he));var U,D;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(_r.upload(Oe,tt(v),C,he),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&b.setValue(Oe,"center",r.center);T.numMultiviewViews>0?Le.updateObjectMatricesUniforms(r,e,b):(b.setValue(Oe,"modelViewMatrix",r.modelViewMatrix),b.setValue(Oe,"normalMatrix",r.normalMatrix));if(b.setValue(Oe,"modelViewMatrix",r.modelViewMatrix),b.setValue(Oe,"normalMatrix",r.normalMatrix),b.setValue(Oe,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach((function(e){me.get(e).currentProgram.isReady()&&i.delete(e)})),0!==i.size?setTimeout(n,10):t(e)}null!==ce.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)}))};let Xe=null;function Ye(){Ke.stop()}function je(){Ke.start()}const Ke=new Cn;function qe(e,t,n,i){if(!1===e.visible)return;if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)A.pushLight(e),e.castShadow&&A.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||J.intersectsSprite(e)){i&&ae.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ie);const t=Te.update(e),r=e.material;r.visible&&R.push(e,t,r,n,ae.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||J.intersectsObject(e))){const t=Te.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ae.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ae.copy(t.boundingSphere.center)),ae.applyMatrix4(e.matrixWorld).applyMatrix4(ie)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&Qe(r,t,n),a.length>0&&Qe(a,t,n),o.length>0&&Qe(o,t,n),ue.buffers.depth.setTest(!0),ue.buffers.depth.setMask(!0),ue.buffers.color.setMask(!0),ue.setPolygonOffset(!1)}function $e(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===A.state.transmissionRenderTarget[i.id]&&(A.state.transmissionRenderTarget[i.id]=new I(1,1,{generateMipmaps:!0,type:ce.has("EXT_color_buffer_half_float")||ce.has("EXT_color_buffer_float")?E:S,minFilter:ot,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace}));const r=A.state.transmissionRenderTarget[i.id],a=i.viewport||B;r.setSize(a.z*L.transmissionResolutionScale,a.w*L.transmissionResolutionScale);const s=L.getRenderTarget();L.setRenderTarget(r),L.getClearColor(z),k=L.getClearAlpha(),k<1&&L.setClearColor(16777215,.5),L.clear(),se&&we.render(n);const l=L.toneMapping;L.toneMapping=P;const d=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),A.setupLightsView(i),!0===ee&&be.setGlobalState(L.clippingPlanes,i),Qe(e,n,i),he.updateMultisampleRenderTarget(r),he.updateRenderTargetMipmap(r),!1===ce.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let n=0,o=a.length;n0)for(let t=0,n=a.length;t0&&$e(i,r,e,t),se&&we.render(e),Ze(R,e,t);null!==y&&0===D&&(he.updateMultisampleRenderTarget(y),he.updateRenderTargetMipmap(y)),!0===e.isScene&&e.onAfterRender(L,e,t),he.runDeferredUploads(),Ie.resetDefaultState(),N=-1,O=null,C.pop(),C.length>0?(A=C[C.length-1],!0===ee&&be.setGlobalState(L.clippingPlanes,A.state.camera)):A=null,b.pop(),R=b.length>0?b[b.length-1]:null},this.getActiveCubeFace=function(){return U},this.getActiveMipmapLevel=function(){return D},this.getRenderTarget=function(){return y},this.setRenderTargetTextures=function(e,t,n){const i=me.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,i.__autoAllocateDepthBuffer||y.isWebGLMultiviewRenderTarget||!0===ce.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),i.__useRenderToTexture=!1),me.get(e.texture).__webglTexture=t,me.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0,i.__autoAllocateDepthBuffer=void 0===n},this.setRenderTargetFramebuffer=function(e,t){const n=me.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const it=Oe.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){y=e,U=t,D=n;let i=!0,r=null,a=!1,o=!1;if(e){const s=me.get(e);if(void 0!==s.__useDefaultFramebuffer)ue.bindFramebuffer(Oe.FRAMEBUFFER,null),i=!1;else if(void 0===s.__webglFramebuffer)he.setupRenderTarget(e);else if(s.__hasExternalTextures)he.rebindTextures(e,me.get(e.texture).__webglTexture,me.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&me.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");he.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=me.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(r=Array.isArray(c[t])?c[t][n]:c[t],a=!0):r=e.samples>0&&!1===he.useMultisampledRTT(e)?me.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,B.copy(e.viewport),G.copy(e.scissor),V=e.scissorTest}else B.copy(Z).multiplyScalar(j).floor(),G.copy($).multiplyScalar(j).floor(),V=Q;0!==n&&(r=it);if(ue.bindFramebuffer(Oe.FRAMEBUFFER,r)&&i&&ue.drawBuffers(e,r),ue.viewport(B),ue.scissor(G),ue.setScissorTest(V),a){const i=me.get(e.texture);Oe.framebufferTexture2D(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,Oe.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(o){const i=me.get(e.texture),r=t;Oe.framebufferTextureLayer(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,i.__webglTexture,n,r)}else if(null!==e&&0!==n){const t=me.get(e.texture);Oe.framebufferTexture2D(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,Oe.TEXTURE_2D,t.__webglTexture,n)}N=-1},this.readRenderTargetPixels=function(e,t,n,i,r,a,o){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=me.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){ue.bindFramebuffer(Oe.FRAMEBUFFER,s);try{const o=e.texture,s=o.format,l=o.type;if(!de.textureFormatReadable(s))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!de.textureTypeReadable(l))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&Oe.readPixels(t,n,i,r,ye.convert(s),ye.convert(l),a)}finally{const e=null!==y?me.get(y).__webglFramebuffer:null;ue.bindFramebuffer(Oe.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=me.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ue.bindFramebuffer(Oe.FRAMEBUFFER,s);const o=e.texture,l=o.format,c=o.type;if(!de.textureFormatReadable(l))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!de.textureTypeReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const d=Oe.createBuffer();Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,d),Oe.bufferData(Oe.PIXEL_PACK_BUFFER,a.byteLength,Oe.STREAM_READ),Oe.readPixels(t,n,i,r,ye.convert(l),ye.convert(c),0);const u=null!==y?me.get(y).__webglFramebuffer:null;ue.bindFramebuffer(Oe.FRAMEBUFFER,u);const f=Oe.fenceSync(Oe.SYNC_GPU_COMMANDS_COMPLETE,0);return Oe.flush(),await An(Oe,f,4),Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,d),Oe.getBufferSubData(Oe.PIXEL_PACK_BUFFER,0,a),Oe.deleteBuffer(d),Oe.deleteSync(f),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;he.setTexture2D(e,0),Oe.copyTexSubImage2D(Oe.TEXTURE_2D,n,0,0,o,s,r,a),ue.unbindTexture()};const rt=Oe.createFramebuffer(),at=Oe.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=null){let o,s,l,c,d,u,f,p,m;null===a&&(0!==r?(H("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=r,r=0):a=0);const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=ye.convert(t.format),g=ye.convert(t.type);let v;t.isData3DTexture?(he.setTexture3D(t,0),v=Oe.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(he.setTexture2DArray(t,0),v=Oe.TEXTURE_2D_ARRAY):(he.setTexture2D(t,0),v=Oe.TEXTURE_2D),Oe.pixelStorei(Oe.UNPACK_FLIP_Y_WEBGL,t.flipY),Oe.pixelStorei(Oe.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),Oe.pixelStorei(Oe.UNPACK_ALIGNMENT,t.unpackAlignment);const E=Oe.getParameter(Oe.UNPACK_ROW_LENGTH),S=Oe.getParameter(Oe.UNPACK_IMAGE_HEIGHT),T=Oe.getParameter(Oe.UNPACK_SKIP_PIXELS),M=Oe.getParameter(Oe.UNPACK_SKIP_ROWS),x=Oe.getParameter(Oe.UNPACK_SKIP_IMAGES);Oe.pixelStorei(Oe.UNPACK_ROW_LENGTH,h.width),Oe.pixelStorei(Oe.UNPACK_IMAGE_HEIGHT,h.height),Oe.pixelStorei(Oe.UNPACK_SKIP_PIXELS,c),Oe.pixelStorei(Oe.UNPACK_SKIP_ROWS,d),Oe.pixelStorei(Oe.UNPACK_SKIP_IMAGES,u);const R=e.isDataArrayTexture||e.isData3DTexture,A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=me.get(e),i=me.get(t),h=me.get(n.__renderTarget),_=me.get(i.__renderTarget);ue.bindFramebuffer(Oe.READ_FRAMEBUFFER,h.__webglFramebuffer),ue.bindFramebuffer(Oe.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;ne.start-t.start));let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Un={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Pn={basic:{uniforms:i([Un.common,Un.specularmap,Un.envmap,Un.aomap,Un.lightmap,Un.fog]),vertexShader:wn.meshbasic_vert,fragmentShader:wn.meshbasic_frag},lambert:{uniforms:i([Un.common,Un.specularmap,Un.envmap,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.fog,Un.lights,{emissive:{value:new n(0)}}]),vertexShader:wn.meshlambert_vert,fragmentShader:wn.meshlambert_frag},phong:{uniforms:i([Un.common,Un.specularmap,Un.envmap,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.fog,Un.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:wn.meshphong_vert,fragmentShader:wn.meshphong_frag},standard:{uniforms:i([Un.common,Un.envmap,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.roughnessmap,Un.metalnessmap,Un.fog,Un.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:wn.meshphysical_vert,fragmentShader:wn.meshphysical_frag},toon:{uniforms:i([Un.common,Un.aomap,Un.lightmap,Un.emissivemap,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.gradientmap,Un.fog,Un.lights,{emissive:{value:new n(0)}}]),vertexShader:wn.meshtoon_vert,fragmentShader:wn.meshtoon_frag},matcap:{uniforms:i([Un.common,Un.bumpmap,Un.normalmap,Un.displacementmap,Un.fog,{matcap:{value:null}}]),vertexShader:wn.meshmatcap_vert,fragmentShader:wn.meshmatcap_frag},points:{uniforms:i([Un.points,Un.fog]),vertexShader:wn.points_vert,fragmentShader:wn.points_frag},dashed:{uniforms:i([Un.common,Un.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:wn.linedashed_vert,fragmentShader:wn.linedashed_frag},depth:{uniforms:i([Un.common,Un.displacementmap]),vertexShader:wn.depth_vert,fragmentShader:wn.depth_frag},normal:{uniforms:i([Un.common,Un.bumpmap,Un.normalmap,Un.displacementmap,{opacity:{value:1}}]),vertexShader:wn.meshnormal_vert,fragmentShader:wn.meshnormal_frag},sprite:{uniforms:i([Un.sprite,Un.fog]),vertexShader:wn.sprite_vert,fragmentShader:wn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:wn.background_vert,fragmentShader:wn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:wn.backgroundCube_vert,fragmentShader:wn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:wn.cube_vert,fragmentShader:wn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:wn.equirect_vert,fragmentShader:wn.equirect_frag},distanceRGBA:{uniforms:i([Un.common,Un.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:wn.distanceRGBA_vert,fragmentShader:wn.distanceRGBA_frag},shadow:{uniforms:i([Un.lights,Un.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:wn.shadow_vert,fragmentShader:wn.shadow_frag}};Pn.physical={uniforms:i([Pn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:wn.meshphysical_vert,fragmentShader:wn.meshphysical_frag};const Dn={r:0,b:0,g:0},yn=new u,In=new f;function Nn(e,t,i,r,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,R=0,A=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?i:t).get(n)}return n}function C(t,n){t.getRGB(Dn,g(e)),r.buffers.color.setClear(Dn.r,Dn.g,Dn.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const i=b(t);null===i?C(E,M):i&&i.isColor&&(C(i,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?r.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&r.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(r.buffers.depth.setTest(!0),r.buffers.depth.setMask(!0),r.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const i=b(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===T&&(T=new o(new s(1e4,1e4,1e4),new l({name:"BackgroundCubeMaterial",uniforms:d(Pn.backgroundCube.uniforms),vertexShader:Pn.backgroundCube.vertexShader,fragmentShader:Pn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),yn.copy(n.backgroundRotation),yn.x*=-1,yn.y*=-1,yn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(yn.y*=-1,yn.z*=-1),T.material.uniforms.envMap.value=i,T.material.uniforms.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(In.makeRotationFromEuler(yn)),T.material.toneMapped=p.getTransfer(i.colorSpace)!==m,x===i&&R===i.version&&A===e.toneMapping||(T.material.needsUpdate=!0,x=i,R=i.version,A=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):i&&i.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Pn.background.uniforms),vertexShader:Pn.background.vertexShader,fragmentShader:Pn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=i,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(i.colorSpace)!==m,!0===i.matrixAutoUpdate&&i.updateMatrix(),S.material.uniforms.uvTransform.value.copy(i.matrix),x===i&&R===i.version&&A===e.toneMapping||(S.material.needsUpdate=!0,x=i,R=i.version,A=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function On(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),g&&function(e,t,n,i){const r={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(console.warn("THREE.WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reverseDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===M||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===E&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==S&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==T&&!r)},precision:o,logarithmicDepthBuffer:l,reverseDepthBuffer:c,maxTextures:d,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function Hn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new x,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function Gn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=C:t===A&&(e.mapping=L),e}function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping;if(a===R||a===A){if(t.has(r)){return n(t.get(r).texture,r.mapping)}{const a=r.image;if(a&&a.height>0){const o=new b(a.height);return o.fromEquirectangularTexture(e,r),t.set(r,o),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}const Vn=[.125,.215,.35,.446,.526,.582],zn=20,Wn=new w,kn=new n;let Xn=null,Yn=0,jn=0,Kn=!1;const qn=(1+Math.sqrt(5))/2,Zn=1/qn,$n=[new r(-qn,Zn,0),new r(qn,Zn,0),new r(-Zn,0,qn),new r(Zn,0,qn),new r(0,qn,-Zn),new r(0,qn,Zn),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Qn=new r;class Jn{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=Qn}=r;Xn=this._renderer.getRenderTarget(),Yn=this._renderer.getActiveCubeFace(),jn=this._renderer.getActiveMipmapLevel(),Kn=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=ii(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ni(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_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?s=Vn[o-e+4-1]:0===o&&(s=0),i.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(i,m*p*e),v.set(u,h*p*e);const r=[e,e,e,e,e,e];E.set(r,_*p*e)}const S=new N;S.setAttribute("position",new O(g,m)),S.setAttribute("uv",new O(v,h)),S.setAttribute("faceIndex",new O(E,_)),t.push(S),r>4&&r--}return{lodPlanes:t,sizeLods:n,sigmas:i}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(zn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:zn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ri(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1});return o}(i,e,t)}return i}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Wn)}_sceneToCubeUV(e,t,n,i,r){const a=new U(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(kn),u.toneMapping=P,u.autoClear=!1;const m=new D({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),h=new o(new s,m);let _=!1;const g=e.background;g?g.isColor&&(m.color.copy(g),e.background=null,_=!0):(m.color.copy(kn),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;ti(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(h,a),u.render(e,a)}h.geometry.dispose(),h.material.dispose(),u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===C||e.mapping===L;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=ii()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ni());const r=i?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],r);r.uniforms.envMap.value=e;const s=this._cubeSize;ti(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Wn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodPlanes.length;for(let t=1;tzn&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?i-v+4:0),4*(this._cubeSize-E),3*E,2*E),l.setRenderTarget(t),l.render(d,Wn)}}function ei(e,t,n){const i=new I(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function ti(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function ni(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ri(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function ii(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ri(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:y,depthTest:!1,depthWrite:!1})}function ri(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function ai(e){let t=new WeakMap,n=null;function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping,o=a===R||a===A,s=a===C||a===L;if(o||s){let a=t.get(r);const l=void 0!==a?a.texture.pmremVersion:0;if(r.isRenderTargetTexture&&r.pmremVersion!==l)return null===n&&(n=new Jn(e)),a=o?n.fromEquirectangular(r,a):n.fromCubemap(r,a),a.texture.pmremVersion=r.pmremVersion,t.set(r,a),a.texture;if(void 0!==a)return a.texture;{const l=r.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;in.maxTextureSize&&(M=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*M*4*u),R=new k(x,S,M,u);R.type=T,R.needsUpdate=!0;const A=4*E;for(let C=0;C0)return e;const r=t*n;let a=gi[r];if(void 0===a&&(a=new Float32Array(r),gi[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function xi(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Tr(e,t){const n=function(e){p._getMatrix(Er,p.workingColorSpace,e);const t=`mat3( ${Er.elements.map((e=>e.toFixed(4)))} )`;switch(p.getTransfer(e)){case se:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}function Mr(e,t){let n;switch(t){case oe:n="Linear";break;case ae:n="Reinhard";break;case re:n="Cineon";break;case ie:n="ACESFilmic";break;case ne:n="AgX";break;case te:n="Neutral";break;case ee:n="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const xr=new r;function Rr(){p.getLuminanceCoefficients(xr);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${xr.x.toFixed(4)}, ${xr.y.toFixed(4)}, ${xr.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Ar(e){return""!==e}function br(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Cr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Lr=/^[ \t]*#include +<([\w\d./]+)>/gm;function wr(e){return e.replace(Lr,Pr)}const Ur=new Map;function Pr(e,t){let n=wn[t];if(void 0===n){const e=Ur.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=wn[e],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return wr(n)}const Dr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function yr(e){return e.replace(Dr,Ir)}function Ir(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(Ar).join("\n"),v.length>0&&(v+="\n")):(g=[Nr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(Ar).join("\n"),v=[Nr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",n.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==P?"#define TONE_MAPPING":"",n.toneMapping!==P?wn.tonemapping_pars_fragment:"",n.toneMapping!==P?Mr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",wn.colorspace_pars_fragment,Tr("linearToOutputTexel",n.outputColorSpace),Rr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Ar).join("\n")),s=wr(s),s=br(s,n),s=Cr(s,n),l=wr(l),l=br(l,n),l=Cr(l,n),s=yr(s),l=yr(l),!0!==n.isRawShaderMaterial&&(E="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Z?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Z?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+v,S>0&&(g=["#extension GL_OVR_multiview : require","layout(num_views = "+S+") in;","#define VIEW_ID gl_ViewID_OVR"].join("\n")+"\n"+g,g=g.replace(["uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;"].join("\n"),["uniform mat4 modelViewMatrices["+S+"];","uniform mat4 projectionMatrices["+S+"];","uniform mat4 viewMatrices["+S+"];","uniform mat3 normalMatrices["+S+"];","#define modelViewMatrix modelViewMatrices[VIEW_ID]","#define projectionMatrix projectionMatrices[VIEW_ID]","#define viewMatrix viewMatrices[VIEW_ID]","#define normalMatrix normalMatrices[VIEW_ID]"].join("\n")),v=["#extension GL_OVR_multiview : require","#define VIEW_ID gl_ViewID_OVR"].join("\n")+"\n"+v,v=v.replace("uniform mat4 viewMatrix;",["uniform mat4 viewMatrices["+S+"];","#define viewMatrix viewMatrices[VIEW_ID]"].join("\n"))));const T=E+g+s,M=E+v+l,x=gr(r,r.VERTEX_SHADER,T),R=gr(r,r.FRAGMENT_SHADER,M);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(_).trim(),i=r.getShaderInfoLog(x).trim(),a=r.getShaderInfoLog(R).trim();let o=!0,s=!0;if(!1===r.getProgramParameter(_,r.LINK_STATUS))if(o=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,_,x,R);else{const e=Sr(r,x,"vertex"),i=Sr(r,R,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(_,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+n+"\n"+e+"\n"+i)}else""!==n?console.warn("THREE.WebGLProgram: Program Info Log:",n):""!==i&&""!==a||(s=!1);s&&(t.diagnostics={runnable:o,programLog:n,vertexShader:{log:i,prefix:g},fragmentShader:{log:a,prefix:v}})}r.deleteShader(x),r.deleteShader(R),b=new _r(r,_),w=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,ee=o.clearcoat>0,te=o.dispersion>0,ne=o.iridescence>0,ie=o.sheen>0,re=o.transmission>0,ae=J&&!!o.anisotropyMap,oe=ee&&!!o.clearcoatMap,se=ee&&!!o.clearcoatNormalMap,le=ee&&!!o.clearcoatRoughnessMap,ce=ne&&!!o.iridescenceMap,de=ne&&!!o.iridescenceThicknessMap,ue=ie&&!!o.sheenColorMap,_e=ie&&!!o.sheenRoughnessMap,ge=!!o.specularMap,ve=!!o.specularColorMap,Ee=!!o.specularIntensityMap,Se=re&&!!o.transmissionMap,Te=re&&!!o.thicknessMap,Me=!!o.gradientMap,xe=!!o.alphaMap,Re=o.alphaTest>0,Ae=!!o.alphaHash,be=!!o.extensions;let Ce=P;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(Ce=e.toneMapping));const Le={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:D,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:I,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:V,batchingColor:V&&null!==T._colorsTexture,instancing:G,instancingColor:G&&null!==T.instanceColor,instancingMorph:G&&null!==T.morphTexture,supportsVertexTextures:_,numMultiviewViews:B,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:F,alphaToCoverage:!!o.alphaToCoverage,map:z,matcap:W,envMap:k,envMapMode:k&&A.mapping,envMapCubeUVHeight:b,aoMap:X,lightMap:Y,bumpMap:j,normalMap:K,displacementMap:_&&q,emissiveMap:Z,normalMapObjectSpace:K&&o.normalMapType===he,normalMapTangentSpace:K&&o.normalMapType===me,metalnessMap:$,roughnessMap:Q,anisotropy:J,anisotropyMap:ae,clearcoat:ee,clearcoatMap:oe,clearcoatNormalMap:se,clearcoatRoughnessMap:le,dispersion:te,iridescence:ne,iridescenceMap:ce,iridescenceThicknessMap:de,sheen:ie,sheenColorMap:ue,sheenRoughnessMap:_e,specularMap:ge,specularColorMap:ve,specularIntensityMap:Ee,transmission:re,transmissionMap:Se,thicknessMap:Te,gradientMap:Me,opaque:!1===o.transparent&&o.blending===pe&&!1===o.alphaToCoverage,alphaMap:xe,alphaTest:Re,alphaHash:Ae,combine:o.combine,mapUv:z&&E(o.map.channel),aoMapUv:X&&E(o.aoMap.channel),lightMapUv:Y&&E(o.lightMap.channel),bumpMapUv:j&&E(o.bumpMap.channel),normalMapUv:K&&E(o.normalMap.channel),displacementMapUv:q&&E(o.displacementMap.channel),emissiveMapUv:Z&&E(o.emissiveMap.channel),metalnessMapUv:$&&E(o.metalnessMap.channel),roughnessMapUv:Q&&E(o.roughnessMap.channel),anisotropyMapUv:ae&&E(o.anisotropyMap.channel),clearcoatMapUv:oe&&E(o.clearcoatMap.channel),clearcoatNormalMapUv:se&&E(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:le&&E(o.clearcoatRoughnessMap.channel),iridescenceMapUv:ce&&E(o.iridescenceMap.channel),iridescenceThicknessMapUv:de&&E(o.iridescenceThicknessMap.channel),sheenColorMapUv:ue&&E(o.sheenColorMap.channel),sheenRoughnessMapUv:_e&&E(o.sheenRoughnessMap.channel),specularMapUv:ge&&E(o.specularMap.channel),specularColorMapUv:ve&&E(o.specularColorMap.channel),specularIntensityMapUv:Ee&&E(o.specularIntensityMap.channel),transmissionMapUv:Se&&E(o.transmissionMap.channel),thicknessMapUv:Te&&E(o.thicknessMap.channel),alphaMapUv:xe&&E(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||J),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(z||xe),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reverseDepthBuffer:H,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:w,morphTextureStride:N,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:Ce,decodeVideoTexture:z&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:Z&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===fe,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:be&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(be&&!0===o.extensions.multiDraw||V)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Le.vertexUv1s=u.has(1),Le.vertexUv2s=u.has(2),Le.vertexUv3s=u.has(3),u.clear(),Le},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&l.enable(21);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reverseDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);t.numMultiviewViews&&l.enable(22);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=Pn[t];n=ue.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i;for(let e=0,t=f.length;e0?i.push(d):!0===o.transparent?r.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?i.unshift(d):!0===o.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||zr),i.length>1&&i.sort(t||Wr),r.length>1&&r.sort(t||Wr)}}}function Xr(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new kr,e.set(t,[r])):n>=i.length?(r=new kr,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function Yr(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let jr=0;function Kr(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function qr(e){const n=new Yr,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new r);const o=new r,s=new f,l=new f;return{setup:function(t){let r=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(Kr);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Un.LTC_FLOAT_1,a.rectAreaLTC2=Un.LTC_FLOAT_2):(a.rectAreaLTC1=Un.LTC_HALF_1,a.rectAreaLTC2=Un.LTC_HALF_2)),a.ambient[0]=r,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=jr++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new Zr(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}function Qr(e,n,i){let r=new ge;const a=new t,s=new t,d=new W,u=new ve({depthPacking:Ee}),f=new Se,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[fe]:fe},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const E=new N;E.setAttribute("position",new O(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const S=new o(E,g),T=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=$;let M=this.type;function x(t,i){const r=n.update(S);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new I(a.x,a.y)),g.uniforms.shadow_pass.value=t.map.texture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,S,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,v,S,null)}function R(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",b)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===J?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function A(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===J)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;cm||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/h.x),a.x=s.x*h.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/h.y),a.y=s.y*h.y,c.mapSize.y=s.y)),null===c.map||!0===f||!0===p){const e=this.type!==J?{minFilter:Te,magFilter:Te}:{};null!==c.map&&c.map.dispose(),c.map=new I(a.x,a.y,e),c.map.texture.name=l.name+".shadowMap",c.camera.updateProjectionMatrix()}e.setRenderTarget(c.map),e.clear();const _=c.getViewportCount();for(let e=0;e<_;e++){const t=c.getViewport(e);d.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(d),c.updateMatrices(l,e),r=c.getFrustum(),A(n,i,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===J&&x(c,i),c.needsUpdate=!1}M=this.type,T.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const Jr={[je]:Ye,[Xe]:ze,[ke]:Ve,[Me]:We,[Ye]:je,[ze]:Xe,[Ve]:ke,[We]:Me};function ea(e,t){const i=new function(){let t=!1;const n=new W;let i=null;const r=new W(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,a,o,s){!0===s&&(t*=o,i*=o,a*=o),n.set(t,i,a,o),!1===r.equals(n)&&(e.clearColor(t,i,a,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},r=new function(){let n=!1,i=!1,r=null,a=null,o=null;return{setReversed:function(e){if(i!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),i=e;const r=o;o=null,this.setClear(r)}},getReversed:function(){return i},setTest:function(t){t?k(e.DEPTH_TEST):X(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=Jr[t]),a!==t){switch(t){case je:e.depthFunc(e.NEVER);break;case Ye:e.depthFunc(e.ALWAYS);break;case Xe:e.depthFunc(e.LESS);break;case Me:e.depthFunc(e.LEQUAL);break;case ke:e.depthFunc(e.EQUAL);break;case We:e.depthFunc(e.GEQUAL);break;case ze:e.depthFunc(e.GREATER);break;case Ve:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(i&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,r=null,a=null,o=null,i=!1}}},a=new function(){let t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?k(e.STENCIL_TEST):X(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&a===o||(e.stencilFunc(t,n,o),i=t,r=n,a=o)},setOp:function(t,n,i){o===t&&s===n&&l===i||(e.stencilOp(t,n,i),o=t,s=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new n(0,0,0),x=0,R=!1,A=null,b=null,C=null,L=null,w=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let P=!1,D=0;const I=e.getParameter(e.VERSION);-1!==I.indexOf("WebGL")?(D=parseFloat(/^WebGL (\d)/.exec(I)[1]),P=D>=1):-1!==I.indexOf("OpenGL ES")&&(D=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),P=D>=2);let N=null,O={};const F=e.getParameter(e.SCISSOR_BOX),B=e.getParameter(e.VIEWPORT),H=(new W).fromArray(F),G=(new W).fromArray(B);function V(t,n,i,r){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(i*r.width),a=Math.floor(i*r.height);void 0===h&&(h=E(n,a));const o=t?E(n,a):h;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function R(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function b(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function C(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),i===e.RGBA){const t=o?se:p.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function L(t,n){let i;return t?null===n||n===Mt||n===St?i=e.DEPTH24_STENCIL8:n===T?i=e.DEPTH32F_STENCIL8:n===xt&&(i=e.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Mt||n===St?i=e.DEPTH_COMPONENT24:n===T?i=e.DEPTH_COMPONENT32F:n===xt&&(i=e.DEPTH_COMPONENT16),i}function w(e,t){return!0===R(e)||e.isFramebufferTexture&&e.minFilter!==Te&&e.minFilter!==B?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function U(e){const t=e.target;t.removeEventListener("dispose",U),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=_.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&_.delete(n)}r.remove(e)}(t),t.isVideoTexture&&f.delete(t)}function P(t){const n=t.target;n.removeEventListener("dispose",P),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function G(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",U));const r=n.source;let a=_.get(r);void 0===a&&(a={},_.set(r,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&D(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function V(t,n,a,s,l,c){const u=o.convert(a.format,a.colorSpace),f=o.convert(a.type),p=C(a.internalFormat,u,f,a.colorSpace),m=r.get(n),h=r.get(a);if(h.__renderTarget=n,!m.__hasExternalTextures){const t=Math.max(1,n.width>>c),r=Math.max(1,n.height>>c);!0===n.isWebGLMultiviewRenderTarget?i.texStorage3D(e.TEXTURE_2D_ARRAY,0,p,n.width,n.height,n.numViews):l===e.TEXTURE_3D||l===e.TEXTURE_2D_ARRAY?i.texImage3D(l,c,p,t,r,n.depth,0,u,f,null):i.texImage2D(l,c,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t);const _=K(n);!0===n.isWebGLMultiviewRenderTarget?_?d.framebufferTextureMultisampleMultiviewOVR(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,r.get(a).__webglTexture,0,Y(n),0,n.numViews):d.framebufferTextureMultiviewOVR(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,r.get(a).__webglTexture,0,0,n.numViews):(l===e.TEXTURE_2D||l>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&l<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,l,h.__webglTexture,c),i.bindFramebuffer(e.FRAMEBUFFER,null)}function z(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=L(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,c=Y(n);K(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;r0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function q(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==F&&n!==gt&&(p.getTransfer(n)===m?i===M&&r===S||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",n)),t}function Z(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(u.width=e.naturalWidth||e.width,u.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(u.width=e.displayWidth,u.height=e.displayHeight):(u.width=e.width,u.height=e.height),u}this.allocateTextureUnit=function(){const e=y;return e>=a.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),y+=1,e},this.resetTextureUnits=function(){y=0},this.uploadTexture=function(t,n,s){if(this.deferTextureUploads)return n.isPendingDeferredUpload||(n.isPendingDeferredUpload=!0,g.push({textureProperties:t,texture:n,slot:s})),!1;let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=G(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===gt||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=x(n.image,!1,a.maxTextureSize);m=q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,v=C(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);H(l,n);const E=n.mipmaps,S=!0!==n.isVideoTexture,T=void 0===u.__version||!0===c,b=d.dataReady,U=w(n,m);if(n.isDepthTexture)v=L(n.format===vt,n.type),T&&(S?i.texStorage2D(e.TEXTURE_2D,1,v,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,v,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(E.length>0){S&&T&&i.texStorage2D(e.TEXTURE_2D,U,v,E[0].width,E[0].height);for(let t=0,n=E.length;t0){const r=Et(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*r/g.data.BYTES_PER_ELEMENT,(a+1)*r/g.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,v,g.width,g.height,m.depth,0,g.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else S?b&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):i.texImage3D(e.TEXTURE_2D_ARRAY,t,v,g.width,g.height,m.depth,0,h,_,g.data)}else{S&&T&&i.texStorage2D(e.TEXTURE_2D,U,v,E[0].width,E[0].height);for(let t=0,r=E.length;t0){const t=Et(m.width,m.height,n.format,n.type);for(const r of n.layerUpdates){const n=m.data.subarray(r*t/m.data.BYTES_PER_ELEMENT,(r+1)*t/m.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,r,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,v,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)S?(T&&i.texStorage3D(e.TEXTURE_3D,U,v,m.width,m.height,m.depth),b&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,v,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(T)if(S)i.texStorage2D(e.TEXTURE_2D,U,v,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(E.length>0){if(S&&T){const t=Z(E[0]);i.texStorage2D(e.TEXTURE_2D,U,v,t.width,t.height)}for(let t=0,n=E.length;t0&&a.__version!==t.version){const e=t.image;if(null===e)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(!1===e.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else if(this.uploadTexture(a,t,n))return}i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)},this.setTexture2DArray=function(t,n){const a=r.get(t);t.version>0&&a.__version!==t.version?this.uploadTexture(a,t,n):i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n)},this.setTexture3D=function(t,n){const a=r.get(t);t.version>0&&a.__version!==t.version?this.uploadTexture(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=G(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===gt?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===gt||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:x(n.image[e],!0,a.maxCubemapSize),h[e]=q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),v=o.convert(n.type),E=C(n.internalFormat,g,v,n.colorSpace),S=!0!==n.isVideoTexture,T=void 0===d.__version||!0===l,b=c.dataReady;let L,U=w(n,_);if(H(e.TEXTURE_CUBE_MAP,n),f){S&&T&&i.texStorage2D(e.TEXTURE_CUBE_MAP,U,E,_.width,_.height);for(let t=0;t<6;t++){L=h[t].mipmaps;for(let r=0;r0&&U++;const t=Z(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,U,E,t.width,t.height)}for(let t=0;t<6;t++)if(m){S?b&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,v,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,E,h[t].width,h[t].height,0,g,v,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===K(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===K(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,u=r.get(t),f=n.length>1;if(f)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,u.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,u.__webglFramebuffer);for(let i=0;i{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer){if(a)throw new Error("target.depthTexture not supported in Cube render targets");const e=t.texture.mipmaps;e&&e.length>0?W(n.__webglFramebuffer[0],t):this.setupDepthTexture(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),z(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),z(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)},this.setupFrameBufferTexture=V,this.useMultisampledRTT=K,this.setupDepthTexture=W,this.runDeferredUploads=function(){const e=this.deferTextureUploads;this.deferTextureUploads=!1;for(const e of g)this.uploadTexture(e.textureProperties,e.texture,e.slot),e.texture.isPendingDeferredUpload=!1;g=[],this.deferTextureUploads=e}}function na(e,t){return{convert:function(n,i=gt){let r;const a=p.getTransfer(i);if(n===S)return e.UNSIGNED_BYTE;if(n===At)return e.UNSIGNED_SHORT_4_4_4_4;if(n===bt)return e.UNSIGNED_SHORT_5_5_5_1;if(n===Ct)return e.UNSIGNED_INT_5_9_9_9_REV;if(n===Lt)return e.BYTE;if(n===wt)return e.SHORT;if(n===xt)return e.UNSIGNED_SHORT;if(n===v)return e.INT;if(n===Mt)return e.UNSIGNED_INT;if(n===T)return e.FLOAT;if(n===E)return e.HALF_FLOAT;if(n===Ut)return e.ALPHA;if(n===Pt)return e.RGB;if(n===M)return e.RGBA;if(n===Tt)return e.DEPTH_COMPONENT;if(n===vt)return e.DEPTH_STENCIL;if(n===Dt)return e.RED;if(n===yt)return e.RED_INTEGER;if(n===It)return e.RG;if(n===Nt)return e.RG_INTEGER;if(n===Ot)return e.RGBA_INTEGER;if(n===Ft||n===Bt||n===Ht||n===Gt)if(a===m){if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),null===r)return null;if(n===Ft)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Bt)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Ht)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Gt)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else{if(r=t.get("WEBGL_compressed_texture_s3tc"),null===r)return null;if(n===Ft)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Bt)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Ht)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Gt)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(n===Vt||n===zt||n===Wt||n===kt){if(r=t.get("WEBGL_compressed_texture_pvrtc"),null===r)return null;if(n===Vt)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===zt)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===Wt)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===kt)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(n===Xt||n===Yt||n===jt){if(r=t.get("WEBGL_compressed_texture_etc"),null===r)return null;if(n===Xt||n===Yt)return a===m?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===jt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}if(n===Kt||n===qt||n===Zt||n===$t||n===Qt||n===Jt||n===en||n===tn||n===nn||n===rn||n===an||n===on||n===sn||n===ln){if(r=t.get("WEBGL_compressed_texture_astc"),null===r)return null;if(n===Kt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===qt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Zt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===$t)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Qt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Jt)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===en)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===tn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===nn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===rn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===an)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===on)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===sn)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===ln)return a===m?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}if(n===cn||n===dn||n===un){if(r=t.get("EXT_texture_compression_bptc"),null===r)return null;if(n===cn)return a===m?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===dn)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===un)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}if(n===fn||n===pn||n===mn||n===hn){if(r=t.get("EXT_texture_compression_rgtc"),null===r)return null;if(n===fn)return r.COMPRESSED_RED_RGTC1_EXT;if(n===pn)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===mn)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===hn)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}return n===St?e.UNSIGNED_INT_24_8:void 0!==e[n]?e[n]:null}}}class ia{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t,n){if(null===this.texture){const i=new q;e.properties.get(i).__webglTexture=t.texture,t.depthNear===n.depthNear&&t.depthFar===n.depthFar||(this.depthNear=t.depthNear,this.depthFar=t.depthFar),this.texture=i}}getMesh(e){if(null!==this.texture&&null===this.mesh){const t=e.cameras[0].viewport,n=new l({vertexShader:"\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}",fragmentShader:"\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class ra extends I{constructor(e,t,n,i={}){super(e,t,i),this.depthBuffer=!1,this.stencilBuffer=!1,this.numViews=n}copy(e){return super.copy(e),this.numViews=e.numViews,this}}ra.prototype.isWebGLMultiviewRenderTarget=!0;class aa extends _n{constructor(e,n,i,a){super();const o=this;let s=null,l=1,c=null,d="local-floor",u=1,f=null,p=null,m=null,h=null,_=null,g=null;const v=new ia,E=n.getContextAttributes();let T=null,x=null;const R=[],A=[],b=new t;let C=null;const L=new U;L.viewport=new W;const w=new U;w.viewport=new W;const P=[L,w],D=new gn;let y=null,N=null;function O(e){const t=A.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,f||c),n.dispatchEvent({type:e.type,data:e.inputSource}))}function F(){s.removeEventListener("select",O),s.removeEventListener("selectstart",O),s.removeEventListener("selectend",O),s.removeEventListener("squeeze",O),s.removeEventListener("squeezestart",O),s.removeEventListener("squeezeend",O),s.removeEventListener("end",F),s.removeEventListener("inputsourceschange",B);for(let e=0;e=0&&(A[i]=null,R[i].disconnect(n))}for(let t=0;t=A.length){A.push(n),i=e;break}if(null===A[e]){A[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.isMultiview=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new vn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new vn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new vn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){l=e,!0===o.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){d=e,!0===o.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return f||c},this.setReferenceSpace=function(e){f=e},this.getBaseLayer=function(){return null!==h?h:_},this.getBinding=function(){return m},this.getFrame=function(){return g},this.getSession=function(){return s},this.setSession=async function(t){if(s=t,null!==s){T=e.getRenderTarget(),s.addEventListener("select",O),s.addEventListener("selectstart",O),s.addEventListener("selectend",O),s.addEventListener("squeeze",O),s.addEventListener("squeezestart",O),s.addEventListener("squeezeend",O),s.addEventListener("end",F),s.addEventListener("inputsourceschange",B),!0!==E.xrCompatible&&await n.makeXRCompatible(),C=e.getPixelRatio(),e.getSize(b);if("undefined"!=typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,r=null,c=null;E.depth&&(c=E.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=E.stencil?vt:Tt,r=E.stencil?St:Mt),o.isMultiview=a&&i.has("OCULUS_multiview");const d={colorFormat:n.RGBA8,depthFormat:c,scaleFactor:l};o.isMultiview&&(d.textureType="texture-array"),m=new XRWebGLBinding(s,n),h=m.createProjectionLayer(d),s.updateRenderState({layers:[h]}),e.setPixelRatio(1),e.setSize(h.textureWidth,h.textureHeight,!1);const u={format:M,type:S,depthTexture:new K(h.textureWidth,h.textureHeight,r,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:E.stencil,encoding:e.outputEncoding,samples:E.antialias?4:0};if(o.isMultiview){const e=i.get("OCULUS_multiview");this.maxNumViews=n.getParameter(e.MAX_VIEWS_OVR),x=new ra(h.textureWidth,h.textureHeight,2,u)}else x=new I(h.textureWidth,h.textureHeight,u)}else{const t={antialias:E.antialias,alpha:!0,depth:E.depth,stencil:E.stencil,framebufferScaleFactor:l};_=new XRWebGLLayer(s,n,t),s.updateRenderState({baseLayer:_}),e.setPixelRatio(1),e.setSize(_.framebufferWidth,_.framebufferHeight,!1),x=new I(_.framebufferWidth,_.framebufferHeight,{format:M,type:S,colorSpace:e.outputColorSpace,stencilBuffer:E.stencil,resolveDepthBuffer:!1===_.ignoreDepthValues,resolveStencilBuffer:!1===_.ignoreDepthValues})}x.isXRRenderTarget=!0,this.setFoveation(u),f=null,c=await s.requestReferenceSpace(d),k.setContext(s),k.start(),o.isPresenting=!0,o.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==s)return s.environmentBlendMode},this.getDepthTexture=function(){return v.getDepthTexture()};const H=new r,G=new r;function V(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===s)return;let t=e.near,n=e.far;null!==v.texture&&(v.depthNear>0&&(t=v.depthNear),v.depthFar>0&&(n=v.depthFar)),D.near=w.near=L.near=t,D.far=w.far=L.far=n,y===D.near&&N===D.far||(s.updateRenderState({depthNear:D.near,depthFar:D.far}),y=D.near,N=D.far),L.layers.mask=2|e.layers.mask,w.layers.mask=4|e.layers.mask,D.layers.mask=L.layers.mask|w.layers.mask;const i=e.parent,r=D.cameras;V(D,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,oa.copy(o),oa.x*=-1,oa.y*=-1,oa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(oa.y*=-1,oa.z*=-1),e.envMapRotation.value.setFromMatrix4(sa.makeRotationFromEuler(oa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isMeshBasicMaterial||r.isMeshLambertMaterial?i(e,r):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r)):r.isMeshStandardMaterial?(i(e,r),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,i){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=i.texture,e.transmissionSamplerSize.value.set(i.width,i.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,a,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function ca(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return i[a]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else if(!1===e.equals(r))return e.copy(r),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=P;i.toneMapped&&(null!==y&&!0!==y.isXRRenderTarget||(m=L.toneMapping));const h=y&&y.isWebGLMultiviewRenderTarget?y.numViews:0,_=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,g=void 0!==_?_.length:0,v=me.get(i),E=A.state.lights;if(!0===ee&&(!0===te||e!==O)){const t=e===O&&i.id===N;be.setState(i,e,t)}let S=!1;i.version===v.__version?v.needsLights&&v.lightsStateVersion!==E.state.version||v.outputColorSpace!==s||r.isBatchedMesh&&!1===v.batching?S=!0:r.isBatchedMesh||!0!==v.batching?r.isBatchedMesh&&!0===v.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===v.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===v.instancing?S=!0:r.isInstancedMesh||!0!==v.instancing?r.isSkinnedMesh&&!1===v.skinning?S=!0:r.isSkinnedMesh||!0!==v.skinning?r.isInstancedMesh&&!0===v.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===v.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===v.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===v.instancingMorph&&null!==r.morphTexture||v.envMap!==l||!0===i.fog&&v.fog!==a?S=!0:void 0===v.numClippingPlanes||v.numClippingPlanes===be.numPlanes&&v.numIntersection===be.numIntersection?(v.vertexAlphas!==c||v.vertexTangents!==d||v.morphTargets!==u||v.morphNormals!==f||v.morphColors!==p||v.toneMapping!==m||v.morphTargetsCount!==g||v.numMultiviewViews!==h)&&(S=!0):S=!0:S=!0:S=!0:S=!0:(S=!0,v.__version=i.version);let T=v.currentProgram;!0===S&&(T=et(i,t,r));let M=!1,x=!1,R=!1;const b=T.getUniforms(),C=v.uniforms;ue.useProgram(T.program)&&(M=!0,x=!0,R=!0);i.id!==N&&(N=i.id,x=!0);if(M||O!==e){T.numMultiviewViews>0?Le.updateCameraProjectionMatricesUniform(e,b):b.setValue(Oe,"projectionMatrix",e.projectionMatrix);ue.buffers.depth.getReversed()?(ne.copy(e.projectionMatrix),xn(ne),Rn(ne),b.setValue(Oe,"projectionMatrix",ne)):b.setValue(Oe,"projectionMatrix",e.projectionMatrix),b.setValue(Oe,"viewMatrix",e.matrixWorldInverse);const t=b.map.cameraPosition;void 0!==t&&t.setValue(Oe,re.setFromMatrixPosition(e.matrixWorld)),de.logarithmicDepthBuffer&&b.setValue(Oe,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&b.setValue(Oe,"isOrthographic",!0===e.isOrthographicCamera),O!==e&&(O=e,x=!0,R=!0)}if(r.isSkinnedMesh){T.numMultiviewViews>0?Le.updateCameraViewMatricesUniform(e,b):b.setValue(Oe,"viewMatrix",e.matrixWorldInverse),b.setOptional(Oe,r,"bindMatrix"),b.setOptional(Oe,r,"bindMatrixInverse");const t=r.skeleton;t&&(null===t.boneTexture&&t.computeBoneTexture(),b.setValue(Oe,"boneTexture",t.boneTexture,he))}r.isBatchedMesh&&(b.setOptional(Oe,r,"batchingTexture"),b.setValue(Oe,"batchingTexture",r._matricesTexture,he),b.setOptional(Oe,r,"batchingIdTexture"),b.setValue(Oe,"batchingIdTexture",r._indirectTexture,he),b.setOptional(Oe,r,"batchingColorTexture"),null!==r._colorsTexture&&b.setValue(Oe,"batchingColorTexture",r._colorsTexture,he));const w=n.morphAttributes;void 0===w.position&&void 0===w.normal&&void 0===w.color||Ue.update(r,n,T);(x||v.receiveShadow!==r.receiveShadow)&&(v.receiveShadow=r.receiveShadow,b.setValue(Oe,"receiveShadow",r.receiveShadow));i.isMeshGouraudMaterial&&null!==i.envMap&&(C.envMap.value=l,C.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(C.envMapIntensity.value=t.environmentIntensity);x&&(b.setValue(Oe,"toneMappingExposure",L.toneMappingExposure),v.needsLights&&(D=R,(U=C).ambientLightColor.needsUpdate=D,U.lightProbe.needsUpdate=D,U.directionalLights.needsUpdate=D,U.directionalLightShadows.needsUpdate=D,U.pointLights.needsUpdate=D,U.pointLightShadows.needsUpdate=D,U.spotLights.needsUpdate=D,U.spotLightShadows.needsUpdate=D,U.rectAreaLights.needsUpdate=D,U.hemisphereLights.needsUpdate=D),a&&!0===i.fog&&xe.refreshFogUniforms(C,a),xe.refreshMaterialUniforms(C,i,j,Y,A.state.transmissionRenderTarget[e.id]),_r.upload(Oe,tt(v),C,he));var U,D;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(_r.upload(Oe,tt(v),C,he),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&b.setValue(Oe,"center",r.center);T.numMultiviewViews>0?Le.updateObjectMatricesUniforms(r,e,b):(b.setValue(Oe,"modelViewMatrix",r.modelViewMatrix),b.setValue(Oe,"normalMatrix",r.normalMatrix));if(b.setValue(Oe,"modelViewMatrix",r.modelViewMatrix),b.setValue(Oe,"normalMatrix",r.normalMatrix),b.setValue(Oe,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach((function(e){me.get(e).currentProgram.isReady()&&i.delete(e)})),0!==i.size?setTimeout(n,10):t(e)}null!==ce.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)}))};let Xe=null;function Ye(){Ke.stop()}function je(){Ke.start()}const Ke=new Cn;function qe(e,t,n,i){if(!1===e.visible)return;if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)A.pushLight(e),e.castShadow&&A.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||J.intersectsSprite(e)){i&&ae.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ie);const t=Te.update(e),r=e.material;r.visible&&R.push(e,t,r,n,ae.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||J.intersectsObject(e))){const t=Te.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ae.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ae.copy(t.boundingSphere.center)),ae.applyMatrix4(e.matrixWorld).applyMatrix4(ie)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&Qe(r,t,n),a.length>0&&Qe(a,t,n),o.length>0&&Qe(o,t,n),ue.buffers.depth.setTest(!0),ue.buffers.depth.setMask(!0),ue.buffers.color.setMask(!0),ue.setPolygonOffset(!1)}function $e(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===A.state.transmissionRenderTarget[i.id]&&(A.state.transmissionRenderTarget[i.id]=new I(1,1,{generateMipmaps:!0,type:ce.has("EXT_color_buffer_half_float")||ce.has("EXT_color_buffer_float")?E:S,minFilter:ot,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace}));const r=A.state.transmissionRenderTarget[i.id],a=i.viewport||B;r.setSize(a.z*L.transmissionResolutionScale,a.w*L.transmissionResolutionScale);const s=L.getRenderTarget();L.setRenderTarget(r),L.getClearColor(z),k=L.getClearAlpha(),k<1&&L.setClearColor(16777215,.5),L.clear(),se&&we.render(n);const l=L.toneMapping;L.toneMapping=P;const d=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),A.setupLightsView(i),!0===ee&&be.setGlobalState(L.clippingPlanes,i),Qe(e,n,i),he.updateMultisampleRenderTarget(r),he.updateRenderTargetMipmap(r),!1===ce.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let n=0,o=a.length;n0)for(let t=0,n=a.length;t0&&$e(i,r,e,t),se&&we.render(e),Ze(R,e,t);null!==y&&0===D&&(he.updateMultisampleRenderTarget(y),he.updateRenderTargetMipmap(y)),!0===e.isScene&&e.onAfterRender(L,e,t),he.runDeferredUploads(),Ie.resetDefaultState(),N=-1,O=null,C.pop(),C.length>0?(A=C[C.length-1],!0===ee&&be.setGlobalState(L.clippingPlanes,A.state.camera)):A=null,b.pop(),R=b.length>0?b[b.length-1]:null},this.getActiveCubeFace=function(){return U},this.getActiveMipmapLevel=function(){return D},this.getRenderTarget=function(){return y},this.setRenderTargetTextures=function(e,t,n){const i=me.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,i.__autoAllocateDepthBuffer||y.isWebGLMultiviewRenderTarget||!0===ce.has("WEBGL_multisampled_render_to_texture")&&(console.warn("THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided"),i.__useRenderToTexture=!1),me.get(e.texture).__webglTexture=t,me.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0,i.__autoAllocateDepthBuffer=void 0===n},this.setRenderTargetFramebuffer=function(e,t){const n=me.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const it=Oe.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){y=e,U=t,D=n;let i=!0,r=null,a=!1,o=!1;if(e){const s=me.get(e);if(void 0!==s.__useDefaultFramebuffer)ue.bindFramebuffer(Oe.FRAMEBUFFER,null),i=!1;else if(void 0===s.__webglFramebuffer)he.setupRenderTarget(e);else if(s.__hasExternalTextures)he.rebindTextures(e,me.get(e.texture).__webglTexture,me.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&me.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");he.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=me.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(r=Array.isArray(c[t])?c[t][n]:c[t],a=!0):r=e.samples>0&&!1===he.useMultisampledRTT(e)?me.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,B.copy(e.viewport),G.copy(e.scissor),V=e.scissorTest}else B.copy(Z).multiplyScalar(j).floor(),G.copy($).multiplyScalar(j).floor(),V=Q;0!==n&&(r=it);if(ue.bindFramebuffer(Oe.FRAMEBUFFER,r)&&i&&ue.drawBuffers(e,r),ue.viewport(B),ue.scissor(G),ue.setScissorTest(V),a){const i=me.get(e.texture);Oe.framebufferTexture2D(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,Oe.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(o){const i=me.get(e.texture),r=t;Oe.framebufferTextureLayer(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,i.__webglTexture,n,r)}else if(null!==e&&0!==n){const t=me.get(e.texture);Oe.framebufferTexture2D(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,Oe.TEXTURE_2D,t.__webglTexture,n)}N=-1},this.readRenderTargetPixels=function(e,t,n,i,r,a,o){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=me.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){ue.bindFramebuffer(Oe.FRAMEBUFFER,s);try{const o=e.texture,s=o.format,l=o.type;if(!de.textureFormatReadable(s))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!de.textureTypeReadable(l))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&Oe.readPixels(t,n,i,r,ye.convert(s),ye.convert(l),a)}finally{const e=null!==y?me.get(y).__webglFramebuffer:null;ue.bindFramebuffer(Oe.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let s=me.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(s=s[o]),s){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ue.bindFramebuffer(Oe.FRAMEBUFFER,s);const o=e.texture,l=o.format,c=o.type;if(!de.textureFormatReadable(l))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!de.textureTypeReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const d=Oe.createBuffer();Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,d),Oe.bufferData(Oe.PIXEL_PACK_BUFFER,a.byteLength,Oe.STREAM_READ),Oe.readPixels(t,n,i,r,ye.convert(l),ye.convert(c),0);const u=null!==y?me.get(y).__webglFramebuffer:null;ue.bindFramebuffer(Oe.FRAMEBUFFER,u);const f=Oe.fenceSync(Oe.SYNC_GPU_COMMANDS_COMPLETE,0);return Oe.flush(),await An(Oe,f,4),Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,d),Oe.getBufferSubData(Oe.PIXEL_PACK_BUFFER,0,a),Oe.deleteBuffer(d),Oe.deleteSync(f),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;he.setTexture2D(e,0),Oe.copyTexSubImage2D(Oe.TEXTURE_2D,n,0,0,o,s,r,a),ue.unbindTexture()};const rt=Oe.createFramebuffer(),at=Oe.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=null){let o,s,l,c,d,u,f,p,m;null===a&&(0!==r?(H("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=r,r=0):a=0);const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=ye.convert(t.format),g=ye.convert(t.type);let v;t.isData3DTexture?(he.setTexture3D(t,0),v=Oe.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(he.setTexture2DArray(t,0),v=Oe.TEXTURE_2D_ARRAY):(he.setTexture2D(t,0),v=Oe.TEXTURE_2D),Oe.pixelStorei(Oe.UNPACK_FLIP_Y_WEBGL,t.flipY),Oe.pixelStorei(Oe.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),Oe.pixelStorei(Oe.UNPACK_ALIGNMENT,t.unpackAlignment);const E=Oe.getParameter(Oe.UNPACK_ROW_LENGTH),S=Oe.getParameter(Oe.UNPACK_IMAGE_HEIGHT),T=Oe.getParameter(Oe.UNPACK_SKIP_PIXELS),M=Oe.getParameter(Oe.UNPACK_SKIP_ROWS),x=Oe.getParameter(Oe.UNPACK_SKIP_IMAGES);Oe.pixelStorei(Oe.UNPACK_ROW_LENGTH,h.width),Oe.pixelStorei(Oe.UNPACK_IMAGE_HEIGHT,h.height),Oe.pixelStorei(Oe.UNPACK_SKIP_PIXELS,c),Oe.pixelStorei(Oe.UNPACK_SKIP_ROWS,d),Oe.pixelStorei(Oe.UNPACK_SKIP_IMAGES,u);const R=e.isDataArrayTexture||e.isData3DTexture,A=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=me.get(e),i=me.get(t),h=me.get(n.__renderTarget),_=me.get(i.__renderTarget);ue.bindFramebuffer(Oe.READ_FRAMEBUFFER,h.__webglFramebuffer),ue.bindFramebuffer(Oe.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n0){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.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.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 a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[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=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.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 bs=e=>xs(e),Ts=e=>xs(e),_s=(...e)=>xs(e);function vs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of Ns(e))r.push(xs(s.slice(0,-4)),i.getCacheKey(t));return xs(r)}function*Ns(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 Bs=Object.freeze({__proto__:null,arrayBufferToBase64:Ls,base64ToArrayBuffer:Fs,getCacheKey:vs,getDataFromObject:Ps,getLengthFromType:Rs,getNodeChildren:Ns,getTypeFromLength:Es,getTypedArrayFromType:As,getValueFromType:Ms,getValueType:Cs,hash:_s,hashArray:Ts,hashString:bs});const Ds={VERTEX:"vertex",FRAGMENT:"fragment"},Is={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Vs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Us={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Os=["fragment","vertex"],ks=["setup","analyze","generate"],Gs=[...Os,"compute"],zs=["x","y","z","w"];let Hs=0;class $s extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Is.NONE,this.updateBeforeType=Is.NONE,this.updateAfterType=Is.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:Hs++})}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,Is.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Is.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Is.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 Ns(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=_s(vs(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)}getMemberType(){return"void"}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 t.outputNode||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){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}s&&r.build(e),t.outputNode=r}s=t.outputNode||null}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?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),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 Ns(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 Ws extends $s{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){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class js extends $s{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 qs extends $s{static get type(){return"TempNode"}constructor(e=null){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),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Xs extends qs{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=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Ks=zs.join("");class Ys extends $s{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(zs.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 a=r.build(e,n);i=this.components.length===s&&this.components===Ks.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${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 Qs extends qs{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)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),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"),oi=e=>ai(e).split("").sort().join(""),ui={setup(e,t){const r=t.shift();return e(Fi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(si.assign(r,...e),r);if(ii.has(t)){const s=ii.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&ii.has(t.slice(0,t.length-6))){const s=ii.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=ai(t),Li(new Ys(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=oi(t.slice(3).toLowerCase()),r=>Li(new Qs(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=oi(t.slice(4).toLowerCase()),()=>Li(new Zs(Li(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Li(new Ys(e,t));if(!0===/^\d+$/.test(t))return Li(new Ws(r,new ti(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Li(new ri(r,e))}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)},li=new WeakMap,di=new WeakMap,ci=function(e,t=null){for(const r in e)e[r]=Li(e[r],t);return e},hi=function(e,t=null){const r=e.length;for(let s=0;sLi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Bi(l(t)))):null!==r?(r=Li(r),n=(...s)=>i(new e(t,...Bi(l(s)),r))):n=(...r)=>i(new e(t,...Bi(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},gi=function(e,...t){return Li(new e(...Bi(t)))};class mi extends $s{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}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=di.get(e.constructor);void 0===s&&(s=new WeakMap,di.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Li(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Li(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Li(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 fi extends $s{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 Fi(e),Li(new mi(this,e))}setup(){return this.call()}}const yi=[!1,!0],xi=[0,1,2,3],bi=[-1,-2],Ti=[.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],_i=new Map;for(const e of yi)_i.set(e,new ti(e));const vi=new Map;for(const e of xi)vi.set(e,new ti(e,"uint"));const Ni=new Map([...vi].map((e=>new ti(e.value,"int"))));for(const e of bi)Ni.set(e,new ti(e,"int"));const Si=new Map([...Ni].map((e=>new ti(e.value))));for(const e of Ti)Si.set(e,new ti(e));for(const e of Ti)Si.set(-e,new ti(-e));const wi={bool:_i,uint:vi,ints:Ni,float:Si},Ei=new Map([..._i,...Si]),Ai=(e,t)=>Ei.has(e)?Ei.get(e):!0===e.isNode?e:new ti(e,t),Ri=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ms(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Li(t.get(r[0]));if(1===r.length){const t=Ai(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Li(t):Li(new js(t,e))}const s=r.map((e=>Ai(e)));return Li(new Xs(s,e))}},Ci=e=>"object"==typeof e&&null!==e?e.value:e,Mi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Pi(e,t){return new Proxy(new fi(e,t),ui)}const Li=(e,t=null)=>function(e,t=null){const r=Cs(e);if("node"===r){let t=li.get(e);return void 0===t&&(t=new Proxy(e,ui),li.set(e,t),li.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Li(Ai(e,t)):"shader"===r?Ui(e):e}(e,t),Fi=(e,t=null)=>new ci(e,t),Bi=(e,t=null)=>new hi(e,t),Di=(...e)=>new pi(...e),Ii=(...e)=>new gi(...e);let Vi=0;const Ui=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Pi(e,r),i=(...e)=>{let t;Fi(e),t=e[0]&&e[0].isNode?[...e]:e[0];const i=s.call(t);return"void"===r&&i.toStack(),i};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Vi++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};ni("toGlobal",(e=>(e.global=!0,e)));const Oi=e=>{si=e},ki=()=>si,Gi=(...e)=>si.If(...e);function zi(e){return si&&si.add(e),e}ni("toStack",zi);const Hi=new Ri("color"),$i=new Ri("float",wi.float),Wi=new Ri("int",wi.ints),ji=new Ri("uint",wi.uint),qi=new Ri("bool",wi.bool),Xi=new Ri("vec2"),Ki=new Ri("ivec2"),Yi=new Ri("uvec2"),Qi=new Ri("bvec2"),Zi=new Ri("vec3"),Ji=new Ri("ivec3"),en=new Ri("uvec3"),tn=new Ri("bvec3"),rn=new Ri("vec4"),sn=new Ri("ivec4"),nn=new Ri("uvec4"),an=new Ri("bvec4"),on=new Ri("mat2"),un=new Ri("mat3"),ln=new Ri("mat4");ni("toColor",Hi),ni("toFloat",$i),ni("toInt",Wi),ni("toUint",ji),ni("toBool",qi),ni("toVec2",Xi),ni("toIVec2",Ki),ni("toUVec2",Yi),ni("toBVec2",Qi),ni("toVec3",Zi),ni("toIVec3",Ji),ni("toUVec3",en),ni("toBVec3",tn),ni("toVec4",rn),ni("toIVec4",sn),ni("toUVec4",nn),ni("toBVec4",an),ni("toMat2",on),ni("toMat3",un),ni("toMat4",ln);const dn=Di(Ws).setParameterLength(2),cn=(e,t)=>Li(new js(Li(e),t));ni("element",dn),ni("convert",cn);ni("append",(e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),zi(e))));class hn extends $s{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 pn=(e,t)=>Li(new hn(e,t)),gn=(e,t)=>Li(new hn(e,t,!0)),mn=Ii(hn,"vec4","DiffuseColor"),fn=Ii(hn,"vec3","EmissiveColor"),yn=Ii(hn,"float","Roughness"),xn=Ii(hn,"float","Metalness"),bn=Ii(hn,"float","Clearcoat"),Tn=Ii(hn,"float","ClearcoatRoughness"),_n=Ii(hn,"vec3","Sheen"),vn=Ii(hn,"float","SheenRoughness"),Nn=Ii(hn,"float","Iridescence"),Sn=Ii(hn,"float","IridescenceIOR"),wn=Ii(hn,"float","IridescenceThickness"),En=Ii(hn,"float","AlphaT"),An=Ii(hn,"float","Anisotropy"),Rn=Ii(hn,"vec3","AnisotropyT"),Cn=Ii(hn,"vec3","AnisotropyB"),Mn=Ii(hn,"color","SpecularColor"),Pn=Ii(hn,"float","SpecularF90"),Ln=Ii(hn,"float","Shininess"),Fn=Ii(hn,"vec4","Output"),Bn=Ii(hn,"float","dashSize"),Dn=Ii(hn,"float","gapSize"),In=Ii(hn,"float","pointWidth"),Vn=Ii(hn,"float","IOR"),Un=Ii(hn,"float","Transmission"),On=Ii(hn,"float","Thickness"),kn=Ii(hn,"float","AttenuationDistance"),Gn=Ii(hn,"color","AttenuationColor"),zn=Ii(hn,"float","Dispersion");class Hn extends $s{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 $n=e=>new Hn(e),Wn=(e,t=0)=>new Hn(e,!0,t),jn=Wn("frame"),qn=Wn("render"),Xn=$n("object");class Kn extends Js{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Xn}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),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Yn=(e,t)=>{const r=Mi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Li(new Kn(s,r))};class Qn extends qs{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Zn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Qn(null,r.length,r)}else{const r=e[0],s=e[1];t=new Qn(r,s)}return Li(t)};ni("toArray",((e,t)=>Zn(Array(t).fill(e))));class Jn extends qs{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 zs.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),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,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)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Bi(t):Fi(t[0]),Li(new ta(Li(e),t)));ni("call",ra);const sa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class ia extends qs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new ia(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const na=Di(ia,"+").setParameterLength(2,1/0).setName("add"),aa=Di(ia,"-").setParameterLength(2,1/0).setName("sub"),oa=Di(ia,"*").setParameterLength(2,1/0).setName("mul"),ua=Di(ia,"/").setParameterLength(2,1/0).setName("div"),la=Di(ia,"%").setParameterLength(2).setName("mod"),da=Di(ia,"==").setParameterLength(2).setName("equal"),ca=Di(ia,"!=").setParameterLength(2).setName("notEqual"),ha=Di(ia,"<").setParameterLength(2).setName("lessThan"),pa=Di(ia,">").setParameterLength(2).setName("greaterThan"),ga=Di(ia,"<=").setParameterLength(2).setName("lessThanEqual"),ma=Di(ia,">=").setParameterLength(2).setName("greaterThanEqual"),fa=Di(ia,"&&").setParameterLength(2,1/0).setName("and"),ya=Di(ia,"||").setParameterLength(2,1/0).setName("or"),xa=Di(ia,"!").setParameterLength(1).setName("not"),ba=Di(ia,"^^").setParameterLength(2).setName("xor"),Ta=Di(ia,"&").setParameterLength(2).setName("bitAnd"),_a=Di(ia,"~").setParameterLength(2).setName("bitNot"),va=Di(ia,"|").setParameterLength(2).setName("bitOr"),Na=Di(ia,"^").setParameterLength(2).setName("bitXor"),Sa=Di(ia,"<<").setParameterLength(2).setName("shiftLeft"),wa=Di(ia,">>").setParameterLength(2).setName("shiftRight"),Ea=Ui((([e])=>(e.addAssign(1),e))),Aa=Ui((([e])=>(e.subAssign(1),e))),Ra=Ui((([e])=>{const t=Wi(e).toConst();return e.addAssign(1),t})),Ca=Ui((([e])=>{const t=Wi(e).toConst();return e.subAssign(1),t}));ni("add",na),ni("sub",aa),ni("mul",oa),ni("div",ua),ni("mod",la),ni("equal",da),ni("notEqual",ca),ni("lessThan",ha),ni("greaterThan",pa),ni("lessThanEqual",ga),ni("greaterThanEqual",ma),ni("and",fa),ni("or",ya),ni("not",xa),ni("xor",ba),ni("bitAnd",Ta),ni("bitNot",_a),ni("bitOr",va),ni("bitXor",Na),ni("shiftLeft",Sa),ni("shiftRight",wa),ni("incrementBefore",Ea),ni("decrementBefore",Aa),ni("increment",Ra),ni("decrement",Ca);const Ma=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),la(e,t)),Pa=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),la(Wi(e),Wi(t)));ni("remainder",Ma),ni("modInt",Pa);class La extends qs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===La.MAX||e===La.MIN)&&arguments.length>3){let i=new La(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===La.LENGTH||t===La.DISTANCE||t===La.DOT?"float":t===La.CROSS?"vec3":t===La.ALL||t===La.ANY?"bool":t===La.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===La.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=rn(Zi(s),0):r=rn(Zi(r),0);const i=oa(r,s).xyz;return Ka(i).build(e,t)}if(r===La.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===La.ONE_MINUS)return aa(1,n).build(e,t);if(r===La.RECIPROCAL)return ua(1,n).build(e,t);if(r===La.DIFFERENCE)return so(aa(n,a)).build(e,t);{const c=[];return r===La.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===La.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==La.MIN&&r!==La.MAX?r===La.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===La.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===La.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==La.DFDX&&r!==La.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}La.ALL="all",La.ANY="any",La.RADIANS="radians",La.DEGREES="degrees",La.EXP="exp",La.EXP2="exp2",La.LOG="log",La.LOG2="log2",La.SQRT="sqrt",La.INVERSE_SQRT="inversesqrt",La.FLOOR="floor",La.CEIL="ceil",La.NORMALIZE="normalize",La.FRACT="fract",La.SIN="sin",La.COS="cos",La.TAN="tan",La.ASIN="asin",La.ACOS="acos",La.ATAN="atan",La.ABS="abs",La.SIGN="sign",La.LENGTH="length",La.NEGATE="negate",La.ONE_MINUS="oneMinus",La.DFDX="dFdx",La.DFDY="dFdy",La.ROUND="round",La.RECIPROCAL="reciprocal",La.TRUNC="trunc",La.FWIDTH="fwidth",La.TRANSPOSE="transpose",La.BITCAST="bitcast",La.EQUALS="equals",La.MIN="min",La.MAX="max",La.STEP="step",La.REFLECT="reflect",La.DISTANCE="distance",La.DIFFERENCE="difference",La.DOT="dot",La.CROSS="cross",La.POW="pow",La.TRANSFORM_DIRECTION="transformDirection",La.MIX="mix",La.CLAMP="clamp",La.REFRACT="refract",La.SMOOTHSTEP="smoothstep",La.FACEFORWARD="faceforward";const Fa=$i(1e-6),Ba=$i(1e6),Da=$i(Math.PI),Ia=$i(2*Math.PI),Va=Di(La,La.ALL).setParameterLength(1),Ua=Di(La,La.ANY).setParameterLength(1),Oa=Di(La,La.RADIANS).setParameterLength(1),ka=Di(La,La.DEGREES).setParameterLength(1),Ga=Di(La,La.EXP).setParameterLength(1),za=Di(La,La.EXP2).setParameterLength(1),Ha=Di(La,La.LOG).setParameterLength(1),$a=Di(La,La.LOG2).setParameterLength(1),Wa=Di(La,La.SQRT).setParameterLength(1),ja=Di(La,La.INVERSE_SQRT).setParameterLength(1),qa=Di(La,La.FLOOR).setParameterLength(1),Xa=Di(La,La.CEIL).setParameterLength(1),Ka=Di(La,La.NORMALIZE).setParameterLength(1),Ya=Di(La,La.FRACT).setParameterLength(1),Qa=Di(La,La.SIN).setParameterLength(1),Za=Di(La,La.COS).setParameterLength(1),Ja=Di(La,La.TAN).setParameterLength(1),eo=Di(La,La.ASIN).setParameterLength(1),to=Di(La,La.ACOS).setParameterLength(1),ro=Di(La,La.ATAN).setParameterLength(1,2),so=Di(La,La.ABS).setParameterLength(1),io=Di(La,La.SIGN).setParameterLength(1),no=Di(La,La.LENGTH).setParameterLength(1),ao=Di(La,La.NEGATE).setParameterLength(1),oo=Di(La,La.ONE_MINUS).setParameterLength(1),uo=Di(La,La.DFDX).setParameterLength(1),lo=Di(La,La.DFDY).setParameterLength(1),co=Di(La,La.ROUND).setParameterLength(1),ho=Di(La,La.RECIPROCAL).setParameterLength(1),po=Di(La,La.TRUNC).setParameterLength(1),go=Di(La,La.FWIDTH).setParameterLength(1),mo=Di(La,La.TRANSPOSE).setParameterLength(1),fo=Di(La,La.BITCAST).setParameterLength(2),yo=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),da(e,t)),xo=Di(La,La.MIN).setParameterLength(2,1/0),bo=Di(La,La.MAX).setParameterLength(2,1/0),To=Di(La,La.STEP).setParameterLength(2),_o=Di(La,La.REFLECT).setParameterLength(2),vo=Di(La,La.DISTANCE).setParameterLength(2),No=Di(La,La.DIFFERENCE).setParameterLength(2),So=Di(La,La.DOT).setParameterLength(2),wo=Di(La,La.CROSS).setParameterLength(2),Eo=Di(La,La.POW).setParameterLength(2),Ao=Di(La,La.POW,2).setParameterLength(1),Ro=Di(La,La.POW,3).setParameterLength(1),Co=Di(La,La.POW,4).setParameterLength(1),Mo=Di(La,La.TRANSFORM_DIRECTION).setParameterLength(2),Po=e=>oa(io(e),Eo(so(e),1/3)),Lo=e=>So(e,e),Fo=Di(La,La.MIX).setParameterLength(3),Bo=(e,t=0,r=1)=>Li(new La(La.CLAMP,Li(e),Li(t),Li(r))),Do=e=>Bo(e),Io=Di(La,La.REFRACT).setParameterLength(3),Vo=Di(La,La.SMOOTHSTEP).setParameterLength(3),Uo=Di(La,La.FACEFORWARD).setParameterLength(3),Oo=Ui((([e])=>{const t=So(e.xy,Xi(12.9898,78.233)),r=la(t,Da);return Ya(Qa(r).mul(43758.5453))})),ko=(e,t,r)=>Fo(t,r,e),Go=(e,t,r)=>Vo(t,r,e),zo=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),ro(e,t)),Ho=Uo,$o=ja;ni("all",Va),ni("any",Ua),ni("equals",yo),ni("radians",Oa),ni("degrees",ka),ni("exp",Ga),ni("exp2",za),ni("log",Ha),ni("log2",$a),ni("sqrt",Wa),ni("inverseSqrt",ja),ni("floor",qa),ni("ceil",Xa),ni("normalize",Ka),ni("fract",Ya),ni("sin",Qa),ni("cos",Za),ni("tan",Ja),ni("asin",eo),ni("acos",to),ni("atan",ro),ni("abs",so),ni("sign",io),ni("length",no),ni("lengthSq",Lo),ni("negate",ao),ni("oneMinus",oo),ni("dFdx",uo),ni("dFdy",lo),ni("round",co),ni("reciprocal",ho),ni("trunc",po),ni("fwidth",go),ni("atan2",zo),ni("min",xo),ni("max",bo),ni("step",To),ni("reflect",_o),ni("distance",vo),ni("dot",So),ni("cross",wo),ni("pow",Eo),ni("pow2",Ao),ni("pow3",Ro),ni("pow4",Co),ni("transformDirection",Mo),ni("mix",ko),ni("clamp",Bo),ni("refract",Io),ni("smoothstep",Go),ni("faceForward",Uo),ni("difference",No),ni("saturate",Do),ni("cbrt",Po),ni("transpose",mo),ni("rand",Oo);class Wo extends $s{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}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:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?pn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const jo=Di(Wo).setParameterLength(2,3);ni("select",jo);const qo=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),jo(...e));ni("cond",qo);class Xo extends $s{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 Ko=Di(Xo).setParameterLength(1,2),Yo=(e,t)=>Ko(e,{label:t});ni("context",Ko),ni("label",Yo);class Qo extends $s{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const Zo=Di(Qo),Jo=(e,t=null)=>Zo(e,t).toStack(),eu=(e,t=null)=>Zo(e,t,!0).toStack();ni("toVar",Jo),ni("toConst",eu);const tu=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),Zo(e));ni("temp",tu);class ru extends $s{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null}isGlobal(){return!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}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),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),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),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Ds.VERTEX);e.flowNodeFromShaderStage(Ds.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const su=Di(ru).setParameterLength(1,2),iu=e=>su(e);ni("toVarying",su),ni("toVertexStage",iu),ni("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),su(...e)))),ni("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),su(...e))));const nu=Ui((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Fo(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),au=Ui((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Fo(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ou="WorkingColorSpace",uu="OutputColorSpace";class lu extends qs{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===ou?c.workingColorSpace:t===uu?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 i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=rn(nu(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=rn(un(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=rn(au(i.rgb),i.a)),i):i}}const du=e=>Li(new lu(Li(e),ou,uu)),cu=e=>Li(new lu(Li(e),uu,ou)),hu=(e,t)=>Li(new lu(Li(e),ou,t)),pu=(e,t)=>Li(new lu(Li(e),t,ou));ni("toOutputColorSpace",du),ni("toWorkingColorSpace",cu),ni("workingToColorSpace",hu),ni("colorSpaceToWorking",pu);let gu=class extends Ws{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 mu extends $s{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=Is.OBJECT}setGroup(e){return this.group=e,this}element(e){return Li(new gu(this,Li(e)))}setNodeType(e){const t=Yn(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;eLi(new fu(e,t,r));class xu extends qs{static get type(){return"ToneMappingNode"}constructor(e,t=Tu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return _s(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=rn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const bu=(e,t,r)=>Li(new xu(e,Li(t),Li(r))),Tu=yu("toneMappingExposure","float");ni("toneMapping",((e,t,r)=>bu(t,r,e)));class _u extends Js{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=g,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,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,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=su(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 vu=(e,t=null,r=0,s=0)=>Li(new _u(e,t,r,s)),Nu=(e,t=null,r=0,s=0)=>vu(e,t,r,s).setUsage(y),Su=(e,t=null,r=0,s=0)=>vu(e,t,r,s).setInstanced(!0),wu=(e,t=null,r=0,s=0)=>Nu(e,t,r,s).setInstanced(!0);ni("toAttribute",(e=>vu(e.value)));class Eu extends $s{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.name="",this.updateBeforeType=Is.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eLi(new Eu(Li(e),t,r));ni("compute",Au);class Ru extends $s{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}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 Cu=(e,t)=>Li(new Ru(Li(e),t));ni("cache",Cu);class Mu extends $s{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 Pu=Di(Mu).setParameterLength(2);ni("bypass",Pu);class Lu extends $s{static get type(){return"RemapNode"}constructor(e,t,r,s=$i(0),i=$i(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 a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Fu=Di(Lu,null,null,{doClamp:!1}).setParameterLength(3,5),Bu=Di(Lu).setParameterLength(3,5);ni("remap",Fu),ni("remapClamp",Bu);class Du extends $s{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 Iu=Di(Du).setParameterLength(1,2),Vu=e=>(e?jo(e,Iu("discard")):Iu("discard")).toStack();ni("discard",Vu);class Uu extends qs{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)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Ou=(e,t=null,r=null)=>Li(new Uu(Li(e),t,r));ni("renderOutput",Ou);class ku extends qs{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const Gu=(e,t=null)=>Li(new ku(Li(e),t));ni("debug",Gu);class zu extends $s{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 su(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=null)=>Li(new zu(e,t)),$u=(e=0)=>Hu("uv"+(e>0?e:""),"vec2");class Wu extends $s{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 ju=Di(Wu).setParameterLength(1,2);class qu extends Kn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Is.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 Xu=Di(qu).setParameterLength(1);class Ku extends Kn{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=Is.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===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return $u(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Yn(this.value.matrix)),this._matrixUniform.mul(Zi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Is.OBJECT:Is.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(Wi(ju(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,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,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.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);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=pu(Iu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,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=Li(e),t.referenceNode=this.getSelf(),Li(t)}blur(e){const t=this.clone();t.biasNode=Li(e).mul(Xu(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Li(t)}level(e){const t=this.clone();return t.levelNode=Li(e),t.referenceNode=this.getSelf(),Li(t)}size(e){return ju(this,e)}bias(e){const t=this.clone();return t.biasNode=Li(e),t.referenceNode=this.getSelf(),Li(t)}compare(e){const t=this.clone();return t.compareNode=Li(e),t.referenceNode=this.getSelf(),Li(t)}grad(e,t){const r=this.clone();return r.gradNode=[Li(e),Li(t)],r.referenceNode=this.getSelf(),Li(r)}depth(e){const t=this.clone();return t.depthNode=Li(e),t.referenceNode=this.getSelf(),Li(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.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const Yu=Di(Ku).setParameterLength(1,4),Qu=(...e)=>Yu(...e).setSampler(!1);class Zu extends Kn{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 Ju=(e,t,r)=>Li(new Zu(e,t,r));class el extends Ws{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 tl extends Zu{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Cs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Is.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;rLi(new tl(e,t));const sl=Di(class extends $s{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),il=Yn(0,"uint").label("u_cameraIndex").setGroup(Wn("cameraIndex")).toVarying("v_cameraIndex"),nl=Yn("float").label("cameraNear").setGroup(qn).onRenderUpdate((({camera:e})=>e.near)),al=Yn("float").label("cameraFar").setGroup(qn).onRenderUpdate((({camera:e})=>e.far)),ol=Ui((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=rl(r).setGroup(qn).label("cameraProjectionMatrices").element(e.isMultiViewCamera?sl("gl_ViewID_OVR"):il).toVar("cameraProjectionMatrix")}else t=Yn("mat4").label("cameraProjectionMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),ul=Ui((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=rl(r).setGroup(qn).label("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?sl("gl_ViewID_OVR"):il).toVar("cameraProjectionMatrixInverse")}else t=Yn("mat4").label("cameraProjectionMatrixInverse").setGroup(qn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse));return t})).once()(),ll=Ui((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=rl(r).setGroup(qn).label("cameraViewMatrices").element(e.isMultiViewCamera?sl("gl_ViewID_OVR"):il).toVar("cameraViewMatrix")}else t=Yn("mat4").label("cameraViewMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),dl=Yn("mat4").label("cameraWorldMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.matrixWorld)),cl=Yn("mat3").label("cameraNormalMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.normalMatrix)),hl=Yn(new r).label("cameraPosition").setGroup(qn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),pl=new v;class gl extends $s{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Is.OBJECT,this._uniformNode=new Kn(null)}getNodeType(){const e=this.scope;return e===gl.WORLD_MATRIX?"mat4":e===gl.POSITION||e===gl.VIEW_POSITION||e===gl.DIRECTION||e===gl.SCALE?"vec3":e===gl.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===gl.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===gl.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===gl.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===gl.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===gl.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===gl.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),pl.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=pl.radius}}generate(e){const t=this.scope;return t===gl.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===gl.POSITION||t===gl.VIEW_POSITION||t===gl.DIRECTION||t===gl.SCALE?this._uniformNode.nodeType="vec3":t===gl.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}gl.WORLD_MATRIX="worldMatrix",gl.POSITION="position",gl.SCALE="scale",gl.VIEW_POSITION="viewPosition",gl.DIRECTION="direction",gl.RADIUS="radius";const ml=Di(gl,gl.DIRECTION).setParameterLength(1),fl=Di(gl,gl.WORLD_MATRIX).setParameterLength(1),yl=Di(gl,gl.POSITION).setParameterLength(1),xl=Di(gl,gl.SCALE).setParameterLength(1),bl=Di(gl,gl.VIEW_POSITION).setParameterLength(1),Tl=Di(gl,gl.RADIUS).setParameterLength(1);class _l extends gl{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const vl=Ii(_l,_l.DIRECTION),Nl=Ii(_l,_l.WORLD_MATRIX),Sl=Ii(_l,_l.POSITION),wl=Ii(_l,_l.SCALE),El=Ii(_l,_l.VIEW_POSITION),Al=Ii(_l,_l.RADIUS),Rl=Yn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),Cl=Yn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Ml=Ui((e=>e.renderer.overrideNodes.modelViewMatrix||Pl)).once()().toVar("modelViewMatrix"),Pl=ll.mul(Nl),Ll=Ui((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Yn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),Fl=Ui((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Yn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Bl=Hu("position","vec3"),Dl=Bl.toVarying("positionLocal"),Il=Bl.toVarying("positionPrevious"),Vl=Nl.mul(Dl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),Ul=Dl.transformDirection(Nl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Ol=Ui((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),kl=Ol.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Gl extends $s{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const zl=Ii(Gl),Hl=$i(zl).mul(2).sub(1),$l=Hu("normal","vec3"),Wl=Ui((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),Zi(0,1,0)):$l),"vec3").once()().toVar("normalLocal"),jl=Ol.dFdx().cross(Ol.dFdy()).normalize().toVar("normalFlat"),ql=Ui((e=>{let t;return t=!0===e.material.flatShading?jl:su(Jl(Wl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),Xl=Ui((e=>{let t=ql.transformDirection(ll);return!0!==e.material.flatShading&&(t=su(t,"v_normalWorld")),t}),"vec3").once()().normalize().toVar("normalWorld"),Kl=Ui((e=>{let t=e.context.setupNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul(Hl)),t}),"vec3").once()().toVar("transformedNormalView"),Yl=Kl.transformDirection(ll).toVar("transformedNormalWorld"),Ql=Ui((e=>{let t=e.context.setupClearcoatNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul(Hl)),t}),"vec3").once()().toVar("transformedClearcoatNormalView"),Zl=Ui((([e,t=Nl])=>{const r=un(t),s=e.div(Zi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),Jl=Ui((([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Rl.mul(e);return ll.transformDirection(s)})),ed=new S,td=new a,rd=Yn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),sd=Yn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),id=Yn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(ed.copy(r),td.makeRotationFromEuler(ed)):td.identity(),td})),nd=kl.negate().reflect(Kl),ad=kl.negate().refract(Kl,rd),od=nd.transformDirection(ll).toVar("reflectVector"),ud=ad.transformDirection(ll).toVar("reflectVector");class ld extends Ku{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===w?od:e.mapping===E?ud:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Zi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=Zi(t.x.negate(),t.yz)),id.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const dd=Di(ld).setParameterLength(1,4).setName("cubeTexture");class cd extends Ws{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 hd extends $s{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=Is.OBJECT}element(e){return Li(new cd(this,Li(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Ju(null,e,this.count):Array.isArray(this.getValueFromReference())?rl(null,e):"texture"===e?Yu(null):"cubeTexture"===e?dd(null):Yn(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;eLi(new hd(e,t,r)),gd=(e,t,r,s)=>Li(new hd(e,t,s,r));class md extends hd{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 fd=(e,t,r=null)=>Li(new md(e,t,r)),yd=Ui((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Hu("tangent","vec4"))))(),xd=yd.xyz.toVar("tangentLocal"),bd=Ml.mul(rn(xd,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),Td=bd.transformDirection(ll).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),_d=bd.toVar("transformedTangentView"),vd=_d.transformDirection(ll).normalize().toVar("transformedTangentWorld"),Nd=Ui((([e,t],r)=>{let s=e.mul(yd.w).xyz;return!0!==r.material.flatShading&&(s=su(e,t)),s})).once(),Sd=Nd($l.cross(yd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),wd=Nd(Wl.cross(xd),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Ed=Nd(ql.cross(bd),"v_bitangentView").normalize().toVar("bitangentView"),Ad=Nd(Xl.cross(Td),"v_bitangentWorld").normalize().toVar("bitangentWorld"),Rd=Nd(Kl.cross(_d),"v_transformedBitangentView").normalize().toVar("transformedBitangentView"),Cd=Rd.transformDirection(ll).normalize().toVar("transformedBitangentWorld"),Md=un(bd,Ed,ql),Pd=kl.mul(Md),Ld=(()=>{let e=Cn.cross(kl);return e=e.cross(Cn).normalize(),e=Fo(e,Kl,An.mul(yn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),Fd=Ui((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Hl.mul(g.inverseSqrt());return na(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Bd extends qs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Zi(s.xy.mul(r),s.z));let i=null;if(t===R)i=Jl(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Md.mul(s).normalize():Fd({eye_pos:Ol,surf_norm:ql,mapN:s,uv:$u()})}return i}}const Dd=Di(Bd).setParameterLength(1,2),Id=Ui((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||$u()),forceUVContext:!0}),s=$i(r((e=>e)));return Xi($i(r((e=>e.add(e.dFdx())))).sub(s),$i(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Vd=Ui((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Hl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class Ud extends qs{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=Id({textureNode:this.textureNode,bumpScale:e});return Vd({surf_pos:Ol,surf_norm:ql,dHdxy:t})}}const Od=Di(Ud).setParameterLength(1,2),kd=new Map;class Gd extends $s{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=kd.get(e);return void 0===r&&(r=fd(e,t),kd.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===Gd.COLOR){const e=void 0!==t.color?this.getColor(r):Zi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Gd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Gd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:$i(1);else if(r===Gd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Gd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Gd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Gd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Gd.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===Gd.NORMAL)t.normalMap?(s=Dd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Od(this.getTexture("bump").r,this.getFloat("bumpScale")):ql;else if(r===Gd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Gd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Gd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Dd(this.getTexture(r),this.getCache(r+"Scale","vec2")):ql;else if(r===Gd.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===Gd.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===Gd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=on(wc.x,wc.y,wc.y.negate(),wc.x).mul(e.rg.mul(2).sub(Xi(1)).normalize().mul(e.b))}else s=wc;else if(r===Gd.IRIDESCENCE_THICKNESS){const e=pd("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=pd("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Gd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Gd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Gd.IOR)s=this.getFloat(r);else if(r===Gd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Gd.AO)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}}Gd.ALPHA_TEST="alphaTest",Gd.COLOR="color",Gd.OPACITY="opacity",Gd.SHININESS="shininess",Gd.SPECULAR="specular",Gd.SPECULAR_STRENGTH="specularStrength",Gd.SPECULAR_INTENSITY="specularIntensity",Gd.SPECULAR_COLOR="specularColor",Gd.REFLECTIVITY="reflectivity",Gd.ROUGHNESS="roughness",Gd.METALNESS="metalness",Gd.NORMAL="normal",Gd.CLEARCOAT="clearcoat",Gd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Gd.CLEARCOAT_NORMAL="clearcoatNormal",Gd.EMISSIVE="emissive",Gd.ROTATION="rotation",Gd.SHEEN="sheen",Gd.SHEEN_ROUGHNESS="sheenRoughness",Gd.ANISOTROPY="anisotropy",Gd.IRIDESCENCE="iridescence",Gd.IRIDESCENCE_IOR="iridescenceIOR",Gd.IRIDESCENCE_THICKNESS="iridescenceThickness",Gd.IOR="ior",Gd.TRANSMISSION="transmission",Gd.THICKNESS="thickness",Gd.ATTENUATION_DISTANCE="attenuationDistance",Gd.ATTENUATION_COLOR="attenuationColor",Gd.LINE_SCALE="scale",Gd.LINE_DASH_SIZE="dashSize",Gd.LINE_GAP_SIZE="gapSize",Gd.LINE_WIDTH="linewidth",Gd.LINE_DASH_OFFSET="dashOffset",Gd.POINT_SIZE="size",Gd.DISPERSION="dispersion",Gd.LIGHT_MAP="light",Gd.AO="ao";const zd=Ii(Gd,Gd.ALPHA_TEST),Hd=Ii(Gd,Gd.COLOR),$d=Ii(Gd,Gd.SHININESS),Wd=Ii(Gd,Gd.EMISSIVE),jd=Ii(Gd,Gd.OPACITY),qd=Ii(Gd,Gd.SPECULAR),Xd=Ii(Gd,Gd.SPECULAR_INTENSITY),Kd=Ii(Gd,Gd.SPECULAR_COLOR),Yd=Ii(Gd,Gd.SPECULAR_STRENGTH),Qd=Ii(Gd,Gd.REFLECTIVITY),Zd=Ii(Gd,Gd.ROUGHNESS),Jd=Ii(Gd,Gd.METALNESS),ec=Ii(Gd,Gd.NORMAL),tc=Ii(Gd,Gd.CLEARCOAT),rc=Ii(Gd,Gd.CLEARCOAT_ROUGHNESS),sc=Ii(Gd,Gd.CLEARCOAT_NORMAL),ic=Ii(Gd,Gd.ROTATION),nc=Ii(Gd,Gd.SHEEN),ac=Ii(Gd,Gd.SHEEN_ROUGHNESS),oc=Ii(Gd,Gd.ANISOTROPY),uc=Ii(Gd,Gd.IRIDESCENCE),lc=Ii(Gd,Gd.IRIDESCENCE_IOR),dc=Ii(Gd,Gd.IRIDESCENCE_THICKNESS),cc=Ii(Gd,Gd.TRANSMISSION),hc=Ii(Gd,Gd.THICKNESS),pc=Ii(Gd,Gd.IOR),gc=Ii(Gd,Gd.ATTENUATION_DISTANCE),mc=Ii(Gd,Gd.ATTENUATION_COLOR),fc=Ii(Gd,Gd.LINE_SCALE),yc=Ii(Gd,Gd.LINE_DASH_SIZE),xc=Ii(Gd,Gd.LINE_GAP_SIZE),bc=Ii(Gd,Gd.LINE_WIDTH),Tc=Ii(Gd,Gd.LINE_DASH_OFFSET),_c=Ii(Gd,Gd.POINT_SIZE),vc=Ii(Gd,Gd.DISPERSION),Nc=Ii(Gd,Gd.LIGHT_MAP),Sc=Ii(Gd,Gd.AO),wc=Yn(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))})),Ec=Ui((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Ac extends $s{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===Ac.VERTEX)s=e.getVertexIndex();else if(r===Ac.INSTANCE)s=e.getInstanceIndex();else if(r===Ac.DRAW)s=e.getDrawIndex();else if(r===Ac.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Ac.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Ac.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=su(this).build(e,t)}return i}}Ac.VERTEX="vertex",Ac.INSTANCE="instance",Ac.SUBGROUP="subgroup",Ac.INVOCATION_LOCAL="invocationLocal",Ac.INVOCATION_SUBGROUP="invocationSubgroup",Ac.DRAW="draw";const Rc=Ii(Ac,Ac.VERTEX),Cc=Ii(Ac,Ac.INSTANCE),Mc=Ii(Ac,Ac.SUBGROUP),Pc=Ii(Ac,Ac.INVOCATION_SUBGROUP),Lc=Ii(Ac,Ac.INVOCATION_LOCAL),Fc=Ii(Ac,Ac.DRAW);class Bc extends $s{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Is.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=Ju(r.array,"mat4",Math.max(t,1)).element(Cc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?wu:Su,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=ln(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?wu:Su;this.bufferColor=e,n=Zi(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Dl).xyz;if(Dl.assign(a),e.hasGeometryAttribute("normal")){const e=Zl(Wl,i);Wl.assign(e)}null!==this.instanceColorNode&&gn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Dc=Di(Bc).setParameterLength(2,3);class Ic extends Bc{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Vc=Di(Ic).setParameterLength(1);class Uc extends $s{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=Cc:this.batchingIdNode=Fc);const t=Ui((([e])=>{const t=Wi(ju(Qu(this.batchMesh._indirectTexture),0).x),r=Wi(e).mod(t),s=Wi(e).div(t);return Qu(this.batchMesh._indirectTexture,Ki(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Wi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Wi(ju(Qu(s),0).x),n=$i(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=ln(Qu(s,Ki(a,o)),Qu(s,Ki(a.add(1),o)),Qu(s,Ki(a.add(2),o)),Qu(s,Ki(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Ui((([e])=>{const t=Wi(ju(Qu(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Qu(l,Ki(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);gn("vec3","vBatchColor").assign(t)}const d=un(u);Dl.assign(u.mul(Dl));const c=Wl.div(Zi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Wl.assign(h),e.hasGeometryAttribute("tangent")&&xd.mulAssign(d)}}const Oc=Di(Uc).setParameterLength(1);class kc extends Ws{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}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}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 Gc=Di(kc).setParameterLength(2);class zc extends Zu{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Es(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Us.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,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 Gc(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Us.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=vu(this.value),this._varying=su(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.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(null!==this.structTypeNode&&this.structTypeNode.build(e),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 Hc=(e,t=null,r=0)=>Li(new zc(e,t,r)),$c=new WeakMap;class Wc extends $s{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Is.OBJECT,this.skinIndexNode=Hu("skinIndex","uvec4"),this.skinWeightNode=Hu("skinWeight","vec4"),this.bindMatrixNode=pd("bindMatrix","mat4"),this.bindMatrixInverseNode=pd("bindMatrixInverse","mat4"),this.boneMatricesNode=gd("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Dl,this.toPositionNode=Dl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=na(a.mul(s.x).mul(d),o.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=Wl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=na(s.x.mul(a),s.y.mul(o),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=gd("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Il)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ps(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Il.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Wl.assign(t),e.hasGeometryAttribute("tangent")&&xd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;$c.get(t)!==e.frameId&&($c.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const jc=e=>Li(new Wc(e));class qc extends $s{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+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(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\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;tLi(new qc(Bi(e,"int"))).toStack(),Kc=()=>Iu("break").toStack(),Yc=new WeakMap,Qc=new s,Zc=Ui((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Wi(Rc).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Qu(e,Ki(u,o)).depth(i).xyz.mul(t)}));class Jc extends $s{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Yn(1),this.updateType=Is.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,a=void 0!==n?n.length:0,{texture:o,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,a=void 0!==n?n.length:0;let o=Yc.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.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*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=$i(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Qu(this.mesh.morphTexture,Ki(Wi(e).add(1),Wi(Cc))).r):t.assign(pd("morphTargetInfluences","float").element(e).toVar()),Gi(t.notEqual(0),(()=>{!0===s&&Dl.addAssign(Zc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Wi(0)})),!0===i&&Wl.addAssign(Zc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Wi(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 eh=Di(Jc).setParameterLength(1);class th extends $s{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class rh extends th{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class sh extends Xo{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:Zi().toVar("directDiffuse"),directSpecular:Zi().toVar("directSpecular"),indirectDiffuse:Zi().toVar("indirectDiffuse"),indirectSpecular:Zi().toVar("indirectSpecular")};return{radiance:Zi().toVar("radiance"),irradiance:Zi().toVar("irradiance"),iblIrradiance:Zi().toVar("iblIrradiance"),ambientOcclusion:$i(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 ih=Di(sh);class nh extends th{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let ah,oh;class uh extends $s{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===uh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Is.NONE;return this.scope!==uh.SIZE&&this.scope!==uh.VIEWPORT||(e=Is.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===uh.VIEWPORT?null!==t?oh.copy(t.viewport):(e.getViewport(oh),oh.multiplyScalar(e.getPixelRatio())):null!==t?(ah.width=t.width,ah.height=t.height):e.getDrawingBufferSize(ah)}setup(){const e=this.scope;let r=null;return r=e===uh.SIZE?Yn(ah||(ah=new t)):e===uh.VIEWPORT?Yn(oh||(oh=new s)):Xi(ch.div(dh)),r}generate(e){if(this.scope===uh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(dh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}uh.COORDINATE="coordinate",uh.VIEWPORT="viewport",uh.SIZE="size",uh.UV="uv";const lh=Ii(uh,uh.UV),dh=Ii(uh,uh.SIZE),ch=Ii(uh,uh.COORDINATE),hh=Ii(uh,uh.VIEWPORT),ph=hh.zw,gh=ch.sub(hh.xy),mh=gh.div(ph),fh=Ui((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),dh)),"vec2").once()(),yh=Ui((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),lh)),"vec2").once()(),xh=Ui((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),lh.flipY())),"vec2").once()(),bh=new t;class Th extends Ku{static get type(){return"ViewportTextureNode"}constructor(e=lh,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Is.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(bh);const r=this.value;r.image.width===bh.width&&r.image.height===bh.height||(r.image.width=bh.width,r.image.height=bh.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 _h=Di(Th).setParameterLength(0,3),vh=Di(Th,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let Nh=null;class Sh extends Th{static get type(){return"ViewportDepthTextureNode"}constructor(e=lh,t=null){null===Nh&&(Nh=new D),super(e,t,Nh)}}const wh=Di(Sh).setParameterLength(0,2);class Eh extends $s{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===Eh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Eh.DEPTH_BASE)null!==r&&(s=Ph().assign(r));else if(t===Eh.DEPTH)s=e.isPerspectiveCamera?Rh(Ol.z,nl,al):Ah(Ol.z,nl,al);else if(t===Eh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ch(r,nl,al);s=Ah(e,nl,al)}else s=r;else s=Ah(Ol.z,nl,al);return s}}Eh.DEPTH_BASE="depthBase",Eh.DEPTH="depth",Eh.LINEAR_DEPTH="linearDepth";const Ah=(e,t,r)=>e.add(t).div(t.sub(r)),Rh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ch=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Mh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=$a(e.negate().div(t)),i=$a(r.div(t));return s.div(i)},Ph=Di(Eh,Eh.DEPTH_BASE),Lh=Ii(Eh,Eh.DEPTH),Fh=Di(Eh,Eh.LINEAR_DEPTH).setParameterLength(0,1),Bh=Fh(wh());Lh.assign=e=>Ph(e);class Dh extends $s{static get type(){return"ClippingNode"}constructor(e=Dh.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===Dh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Dh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Ui((()=>{const r=$i().toVar("distanceToPlane"),s=$i().toVar("distanceToGradient"),i=$i(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=rl(t);Xc(n,(({i:t})=>{const n=e.element(t);r.assign(Ol.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Vo(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=rl(e),n=$i(1).toVar("intersectionClipOpacity");Xc(a,(({i:e})=>{const i=t.element(e);r.assign(Ol.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Vo(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}mn.a.mulAssign(i),mn.a.equal(0).discard()}))()}setupDefault(e,t){return Ui((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=rl(t);Xc(r,(({i:t})=>{const r=e.element(t);Ol.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=rl(e),r=qi(!0).toVar("clipped");Xc(s,(({i:e})=>{const s=t.element(e);r.assign(Ol.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Ui((()=>{const s=rl(e),i=sl(t.getClipDistance());Xc(r,(({i:e})=>{const t=s.element(e),r=Ol.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Dh.ALPHA_TO_COVERAGE="alphaToCoverage",Dh.DEFAULT="default",Dh.HARDWARE="hardware";const Ih=Ui((([e])=>Ya(oa(1e4,Qa(oa(17,e.x).add(oa(.1,e.y)))).mul(na(.1,so(Qa(oa(13,e.y).add(e.x)))))))),Vh=Ui((([e])=>Ih(Xi(Ih(e.xy),e.z)))),Uh=Ui((([e])=>{const t=bo(no(uo(e.xyz)),no(lo(e.xyz))),r=$i(1).div($i(.05).mul(t)).toVar("pixScale"),s=Xi(za(qa($a(r))),za(Xa($a(r)))),i=Xi(Vh(qa(s.x.mul(e.xyz))),Vh(qa(s.y.mul(e.xyz)))),n=Ya($a(r)),a=na(oa(n.oneMinus(),i.x),oa(n,i.y)),o=xo(n,n.oneMinus()),u=Zi(a.mul(a).div(oa(2,o).mul(aa(1,o))),a.sub(oa(.5,o)).div(aa(1,o)),aa(1,aa(1,a).mul(aa(1,a)).div(oa(2,o).mul(aa(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Bo(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Oh extends zu{static get type(){return"VertexColorNode"}constructor(e){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}}const kh=(e=0)=>Li(new Oh(e));class Gh extends I{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,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.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+vs(this)}build(e){this.setup(e)}setupObserver(e){return new ys(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=rn(s,mn.a).max(0);i=this.setupOutput(e,a),Fn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&Fn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=rn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=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=Li(new Dh(Dh.ALPHA_TO_COVERAGE)):e.stack.add(Li(new Dh))}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(Li(new Dh(Dh.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?Mh(Ol.z,nl,al):Ah(Ol.z,nl,al))}null!==s&&Lh.assign(s).toStack()}setupPositionView(){return Ml.mul(Dl).xyz}setupModelViewProjection(){return ol.mul(Ol)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Ec}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&eh(t).toStack(),!0===t.isSkinnedMesh&&jc(t).toStack(),this.displacementMap){const e=fd("displacementMap","texture"),t=fd("displacementScale","float"),r=fd("displacementBias","float");Dl.addAssign(Wl.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Oc(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Vc(t).toStack(),null!==this.positionNode&&Dl.assign(this.positionNode.context({isPositionNodeInput:!0})),Dl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?rn(this.colorNode):Hd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(kh())),e.instanceColor){r=gn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=gn("vec3","vBatchColor").mul(r)}mn.assign(r);const s=this.opacityNode?$i(this.opacityNode):jd;if(mn.a.assign(mn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?$i(this.alphaTestNode):zd;mn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&mn.a.lessThan(Uh(Dl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&mn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Zi(0):mn.rgb}setupNormal(){return this.normalNode?Zi(this.normalNode):ec}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?fd("envMap","cubeTexture"):fd("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new nh(Nc)),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:Sc;t.push(new rh(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 a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=ih(n,t,r,s)}else null!==r&&(a=Zi(null!==s?Fo(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(fn.assign(Zi(i||Wd)),a=a.add(fn)),a}setupFog(e,t){const r=e.fogNode;return r&&(Fn.assign(t),t=rn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),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=I.prototype.toJSON.call(this,e),s=Ns(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.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,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 zh=new U;class Hh extends Gh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(zh),this.setValues(e)}}const $h=new O;class Wh extends Gh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues($h),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?$i(this.offsetNode):Tc,t=this.dashScaleNode?$i(this.dashScaleNode):fc,r=this.dashSizeNode?$i(this.dashSizeNode):yc,s=this.gapSizeNode?$i(this.gapSizeNode):xc;Bn.assign(r),Dn.assign(s);const i=su(Hu("lineDistance").mul(t));(e?i.add(e):i).mod(Bn.add(Dn)).greaterThan(Bn).discard()}}let jh=null;class qh extends Th{static get type(){return"ViewportSharedTextureNode"}constructor(e=lh,t=null){null===jh&&(jh=new F),super(e,t,jh)}updateReference(){return this}}const Xh=Di(qh).setParameterLength(0,2),Kh=new O;class Yh extends Gh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Kh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=k,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=Ui((({start:e,end:t})=>{const r=ol.element(2).element(2),s=ol.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return rn(Fo(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Ui((()=>{const e=Hu("instanceStart"),t=Hu("instanceEnd"),r=rn(Ml.mul(rn(e,1))).toVar("start"),s=rn(Ml.mul(rn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?$i(this.dashScaleNode):fc,t=this.offsetNode?$i(this.offsetNode):Tc,r=Hu("instanceDistanceStart"),s=Hu("instanceDistanceEnd");let i=Bl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),gn("float","lineDistance").assign(i)}n&&(gn("vec3","worldStart").assign(r.xyz),gn("vec3","worldEnd").assign(s.xyz));const o=hh.z.div(hh.w),u=ol.element(2).element(3).equal(-1);Gi(u,(()=>{Gi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=ol.mul(r),d=ol.mul(s),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(o)),p.assign(p.normalize());const g=rn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Fo(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=gn("vec4","worldPos");o.assign(Bl.y.lessThan(.5).select(r,s));const u=bc.mul(.5);o.addAssign(rn(Bl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(rn(Bl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(rn(a.mul(u),0)),Gi(Bl.y.greaterThan(1).or(Bl.y.lessThan(0)),(()=>{o.subAssign(rn(a.mul(2).mul(u),0))}))),g.assign(ol.mul(o));const l=Zi().toVar();l.assign(Bl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Xi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bl.x.lessThan(0).select(e.negate(),e)),Gi(Bl.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Bl.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(bc)),e.assign(e.div(hh.w)),g.assign(Bl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(rn(e,0,0)))}return g}))();const o=Ui((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return Xi(h,p)}));if(this.colorNode=Ui((()=>{const e=$u();if(i){const t=this.dashSizeNode?$i(this.dashSizeNode):yc,r=this.gapSizeNode?$i(this.gapSizeNode):xc;Bn.assign(t),Dn.assign(r);const s=gn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(Bn.add(Dn)).greaterThan(Bn).discard()}const a=$i(1).toVar("alpha");if(n){const e=gn("vec3","worldStart"),s=gn("vec3","worldEnd"),n=gn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Zi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(bc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Vo(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=$i(s.fwidth()).toVar("dlen");Gi(e.y.abs().greaterThan(1),(()=>{a.assign(Vo(i.oneMinus(),i.add(1),s).oneMinus())}))}else Gi(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Hu("instanceColorStart"),t=Hu("instanceColorEnd");u=Bl.y.lessThan(.5).select(e,t).mul(Hd)}else u=Hd;return rn(u,a)}))(),this.transparent){const e=this.opacityNode?$i(this.opacityNode):jd;this.outputNode=rn(this.colorNode.rgb.mul(e).add(Xh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}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 Qh=e=>Li(e).mul(.5).add(.5),Zh=new G;class Jh extends Gh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Zh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?$i(this.opacityNode):jd;mn.assign(pu(rn(Qh(Kl),e),z))}}class ep extends qs{static get type(){return"EquirectUVNode"}constructor(e=Ul){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Xi(t,r)}}const tp=Di(ep).setParameterLength(0,1);class rp extends H{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 $(5,5,5),n=tp(Ul),a=new Gh;a.colorNode=Yu(t,n,0),a.side=N,a.blending=k;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const sp=new WeakMap;class ip extends qs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=dd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Is.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===Y||r===Q){if(sp.has(e)){const t=sp.get(e);ap(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new rp(r.height);s.fromEquirectangularTexture(t,e),ap(s.texture,e.mapping),this._cubeTexture=s.texture,sp.set(e,s.texture),e.addEventListener("dispose",np)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function np(e){const t=e.target;t.removeEventListener("dispose",np);const r=sp.get(t);void 0!==r&&(sp.delete(t),r.dispose())}function ap(e,t){t===Y?e.mapping=w:t===Q&&(e.mapping=E)}const op=Di(ip).setParameterLength(1);class up extends th{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=op(this.envNode)}}class lp extends th{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=$i(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class dp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class cp extends dp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(rn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(rn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(mn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Fo(s.rgb,s.rgb.mul(i.rgb),Yd.mul(Qd)));break;case J:s.rgb.assign(Fo(s.rgb,i.rgb,Yd.mul(Qd)));break;case Z:s.rgb.addAssign(i.rgb.mul(Yd.mul(Qd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const hp=new te;class pp extends Gh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(hp),this.setValues(e)}setupNormal(){return ql}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new up(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new lp(Nc)),t}setupOutgoingLight(){return mn.rgb}setupLightingModel(){return new cp}}const gp=Ui((({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))})),mp=Ui((e=>e.diffuseColor.mul(1/Math.PI))),fp=Ui((({dotNH:e})=>Ln.mul($i(.5)).add(1).mul($i(1/Math.PI)).mul(e.pow(Ln)))),yp=Ui((({lightDirection:e})=>{const t=e.add(kl).normalize(),r=Kl.dot(t).clamp(),s=kl.dot(t).clamp(),i=gp({f0:Mn,f90:1,dotVH:s}),n=$i(.25),a=fp({dotNH:r});return i.mul(n).mul(a)}));class xp extends cp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Kl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(mp({diffuseColor:mn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(yp({lightDirection:e})).mul(Yd))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(mp({diffuseColor:mn}))),s.indirectDiffuse.mulAssign(t)}}const bp=new re;class Tp extends Gh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(bp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new up(t):null}setupLightingModel(){return new xp(!1)}}const _p=new se;class vp extends Gh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(_p),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new up(t):null}setupLightingModel(){return new xp}setupVariants(){const e=(this.shininessNode?$i(this.shininessNode):$d).max(1e-4);Ln.assign(e);const t=this.specularNode||qd;Mn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Np=Ui((e=>{if(!1===e.geometry.hasAttribute("normal"))return $i(0);const t=ql.dFdx().abs().max(ql.dFdy().abs());return t.x.max(t.y).max(t.z)})),Sp=Ui((e=>{const{roughness:t}=e,r=Np();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),wp=Ui((({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 ua(.5,i.add(n).max(Fa))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Ep=Ui((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Zi(e.mul(r),t.mul(s),a).length()),l=a.mul(Zi(e.mul(i),t.mul(n),o).length());return ua(.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"}]}),Ap=Ui((({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"}]}),Rp=$i(1/Math.PI),Cp=Ui((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Zi(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Rp.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"}]}),Mp=Ui((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||Kl,l=i.pow2(),d=t.add(kl).normalize(),c=u.dot(t).clamp(),h=u.dot(kl).clamp(),p=u.dot(d).clamp(),g=kl.dot(d).clamp();let m,f,y=gp({f0:r,f90:s,dotVH:g});if(Ci(a)&&(y=Nn.mix(y,n)),Ci(o)){const e=Rn.dot(t),r=Rn.dot(kl),s=Rn.dot(d),i=Cn.dot(t),n=Cn.dot(kl),a=Cn.dot(d);m=Ep({alphaT:En,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Cp({alphaT:En,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=wp({alpha:l,dotNL:c,dotNV:h}),f=Ap({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Pp=Ui((({roughness:e,dotNV:t})=>{const r=rn(-1,-.0275,-.572,.022),s=rn(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 Xi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Lp=Ui((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Pp({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Fp=Ui((({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(Zi(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"}]}),Bp=Ui((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=$i(1).div(r),i=t.pow2().oneMinus().max(.0078125);return $i(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"}]}),Dp=Ui((({dotNV:e,dotNL:t})=>$i(1).div($i(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Ip=Ui((({lightDirection:e})=>{const t=e.add(kl).normalize(),r=Kl.dot(e).clamp(),s=Kl.dot(kl).clamp(),i=Kl.dot(t).clamp(),n=Bp({roughness:vn,dotNH:i}),a=Dp({dotNV:s,dotNL:r});return _n.mul(n).mul(a)})),Vp=Ui((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Xi(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"}]}),Up=Ui((({f:e})=>{const t=e.length();return bo(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Op=Ui((({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(),a=i.div(n),o=r.greaterThan(0).select(a,bo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),kp=Ui((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=Zi().toVar();return Gi(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(un(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=Zi(0).toVar();f.addAssign(Op({v1:h,v2:p})),f.addAssign(Op({v1:p,v2:g})),f.addAssign(Op({v1:g,v2:m})),f.addAssign(Op({v1:m,v2:h})),c.assign(Zi(Up({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"}]}),Gp=Ui((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=Zi().toVar();return Gi(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=Zi(0).toVar();d.addAssign(Op({v1:n,v2:a})),d.addAssign(Op({v1:a,v2:o})),d.addAssign(Op({v1:o,v2:l})),d.addAssign(Op({v1:l,v2:n})),u.assign(Zi(Up({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),zp=1/6,Hp=e=>oa(zp,oa(e,oa(e,e.negate().add(3)).sub(3)).add(1)),$p=e=>oa(zp,oa(e,oa(e,oa(3,e).sub(6))).add(4)),Wp=e=>oa(zp,oa(e,oa(e,oa(-3,e).add(3)).add(3)).add(1)),jp=e=>oa(zp,Eo(e,3)),qp=e=>Hp(e).add($p(e)),Xp=e=>Wp(e).add(jp(e)),Kp=e=>na(-1,$p(e).div(Hp(e).add($p(e)))),Yp=e=>na(1,jp(e).div(Wp(e).add(jp(e)))),Qp=(e,t,r)=>{const s=e.uvNode,i=oa(s,t.zw).add(.5),n=qa(i),a=Ya(i),o=qp(a.x),u=Xp(a.x),l=Kp(a.x),d=Yp(a.x),c=Kp(a.y),h=Yp(a.y),p=Xi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Xi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Xi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Xi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=qp(a.y).mul(na(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Xp(a.y).mul(na(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},Zp=Ui((([e,t=$i(3)])=>{const r=Xi(e.size(Wi(t))),s=Xi(e.size(Wi(t.add(1)))),i=ua(1,r),n=ua(1,s),a=Qp(e,rn(i,r),qa(t)),o=Qp(e,rn(n,s),Xa(t));return Ya(t).mix(a,o)})),Jp=Ui((([e,t,r,s,i])=>{const n=Zi(Io(t.negate(),Ka(e),ua(1,s))),a=Zi(no(i[0].xyz),no(i[1].xyz),no(i[2].xyz));return Ka(n).mul(r.mul(a))})).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"}]}),eg=Ui((([e,t])=>e.mul(Bo(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),tg=vh(),rg=vh(),sg=Ui((([e,t,r],{material:s})=>{const i=(s.side===N?tg:rg).sample(e),n=$a(dh.x).mul(eg(t,r));return Zp(i,n)})),ig=Ui((([e,t,r])=>(Gi(r.notEqual(0),(()=>{const s=Ha(t).negate().div(r);return Ga(s.negate().mul(e))})),Zi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),ng=Ui((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=rn().toVar(),f=Zi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Zi(d.sub(i),d,d.add(i));Xc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Jp(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(rn(y,1))),b=Xi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Xi(b.x,b.y.oneMinus()));const T=sg(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(ig(no(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Jp(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(rn(n,1))),y=Xi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Xi(y.x,y.y.oneMinus())),m=sg(y,r,d),f=s.mul(ig(no(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=Zi(Lp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return rn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),ag=un(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),og=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ug=Ui((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Fo(e,t,Vo(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Gi(a.lessThan(0),(()=>Zi(1)));const o=a.sqrt(),u=og(n,e),l=gp({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=$i(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Zi(1).add(t).div(Zi(1).sub(t))})(i.clamp(0,.9999)),g=og(p,n.toVec3()),m=gp({f0:g,f90:1,dotVH:o}),f=Zi(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,o,2),x=Zi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(Zi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Xc({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=Zi(54856e-17,44201e-17,52481e-17),i=Zi(1681e3,1795300,2208400),n=Zi(43278e5,93046e5,66121e5),a=$i(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=Zi(o.x.add(a),o.y,o.z).div(1.0685e-7),ag.mul(o)})($i(e).mul(y),$i(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(Zi(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"}]}),lg=Ui((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=jo(r.lessThan(.25),$i(-339.2).mul(i).add($i(161.4).mul(r)).sub(25.9),$i(-8.48).mul(i).add($i(14.3).mul(r)).sub(9.95)),a=jo(r.lessThan(.25),$i(44).mul(i).sub($i(23.7).mul(r)).add(3.26),$i(1.97).mul(i).sub($i(3.27).mul(r)).add(.72));return jo(r.lessThan(.25),0,$i(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),dg=Zi(.04),cg=$i(1);class hg extends dp{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=Zi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Zi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Zi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Zi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Zi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Kl.dot(kl).clamp();this.iridescenceFresnel=ug({outsideIOR:$i(1),eta2:Sn,cosTheta1:e,thinFilmThickness:wn,baseF0:Mn}),this.iridescenceF0=Fp({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Vl,r=hl.sub(Vl).normalize(),s=Yl,i=e.context;i.backdrop=ng(s,r,yn,mn,Mn,Pn,t,Nl,ll,ol,Vn,On,Gn,kn,this.dispersion?zn:null),i.backdropAlpha=Un,mn.a.mulAssign(Fo(1,i.backdrop.a,Un))}super.start(e)}computeMultiscattering(e,t,r){const s=Kl.dot(kl).clamp(),i=Pp({roughness:yn,dotNV:s}),n=(this.iridescenceF0?Nn.mix(Mn,this.iridescenceF0):Mn).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Mn.add(Mn.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Kl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Ip({lightDirection:e}))),!0===this.clearcoat){const r=Ql.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Mp({lightDirection:e,f0:dg,f90:cg,roughness:Tn,normalView:Ql})))}r.directDiffuse.addAssign(s.mul(mp({diffuseColor:mn.rgb}))),r.directSpecular.addAssign(s.mul(Mp({lightDirection:e,f0:Mn,f90:1,roughness:yn,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:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Kl,h=kl,p=Ol.toVar(),g=Vp({N:c,V:h,roughness:yn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=un(Zi(m.x,0,m.y),Zi(0,1,0),Zi(m.z,0,m.w)).toVar(),x=Mn.mul(f.x).add(Mn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(kp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(mn).mul(kp({N:c,V:h,P:p,mInv:un(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(mp({diffuseColor:mn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(_n,lg({normal:Kl,viewDir:kl,roughness:vn}))),!0===this.clearcoat){const e=Ql.dot(kl).clamp(),t=Lp({dotNV:e,specularColor:dg,specularF90:cg,roughness:Tn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Zi().toVar("singleScattering"),n=Zi().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Pn);const o=i.add(n),u=mn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Kl.dot(kl).clamp().add(t),i=yn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Ql.dot(kl).clamp(),r=gp({dotVH:e,f0:dg,f90:cg}),s=t.mul(bn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(bn));t.assign(s)}if(!0===this.sheen){const e=_n.r.max(_n.g).max(_n.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const pg=$i(1),gg=$i(-2),mg=$i(.8),fg=$i(-1),yg=$i(.4),xg=$i(2),bg=$i(.305),Tg=$i(3),_g=$i(.21),vg=$i(4),Ng=$i(4),Sg=$i(16),wg=Ui((([e])=>{const t=Zi(so(e)).toVar(),r=$i(-1).toVar();return Gi(t.x.greaterThan(t.z),(()=>{Gi(t.x.greaterThan(t.y),(()=>{r.assign(jo(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(jo(e.y.greaterThan(0),1,4))}))})).Else((()=>{Gi(t.z.greaterThan(t.y),(()=>{r.assign(jo(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(jo(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Eg=Ui((([e,t])=>{const r=Xi().toVar();return Gi(t.equal(0),(()=>{r.assign(Xi(e.z,e.y).div(so(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Xi(e.x.negate(),e.z.negate()).div(so(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Xi(e.x.negate(),e.y).div(so(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Xi(e.z.negate(),e.y).div(so(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Xi(e.x.negate(),e.z).div(so(e.y)))})).Else((()=>{r.assign(Xi(e.x,e.y).div(so(e.z)))})),oa(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Ag=Ui((([e])=>{const t=$i(0).toVar();return Gi(e.greaterThanEqual(mg),(()=>{t.assign(pg.sub(e).mul(fg.sub(gg)).div(pg.sub(mg)).add(gg))})).ElseIf(e.greaterThanEqual(yg),(()=>{t.assign(mg.sub(e).mul(xg.sub(fg)).div(mg.sub(yg)).add(fg))})).ElseIf(e.greaterThanEqual(bg),(()=>{t.assign(yg.sub(e).mul(Tg.sub(xg)).div(yg.sub(bg)).add(xg))})).ElseIf(e.greaterThanEqual(_g),(()=>{t.assign(bg.sub(e).mul(vg.sub(Tg)).div(bg.sub(_g)).add(Tg))})).Else((()=>{t.assign($i(-2).mul($a(oa(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Rg=Ui((([e,t])=>{const r=e.toVar();r.assign(oa(2,r).sub(1));const s=Zi(r,1).toVar();return Gi(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"}]}),Cg=Ui((([e,t,r,s,i,n])=>{const a=$i(r),o=Zi(t),u=Bo(Ag(a),gg,n),l=Ya(u),d=qa(u),c=Zi(Mg(e,o,d,s,i,n)).toVar();return Gi(l.notEqual(0),(()=>{const t=Zi(Mg(e,o,d.add(1),s,i,n)).toVar();c.assign(Fo(c,t,l))})),c})),Mg=Ui((([e,t,r,s,i,n])=>{const a=$i(r).toVar(),o=Zi(t),u=$i(wg(o)).toVar(),l=$i(bo(Ng.sub(a),0)).toVar();a.assign(bo(a,Ng));const d=$i(za(a)).toVar(),c=Xi(Eg(o,u).mul(d.sub(2)).add(1)).toVar();return Gi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(oa(3,Sg))),c.y.addAssign(oa(4,za(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Xi(),Xi())})),Pg=Ui((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Za(s),l=r.mul(u).add(i.cross(r).mul(Qa(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Mg(e,l,t,n,a,o)})),Lg=Ui((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Zi(jo(t,r,wo(r,s))).toVar();Gi(h.equal(Zi(0)),(()=>{h.assign(Zi(s.z,0,s.x.negate()))})),h.assign(Ka(h));const p=Zi().toVar();return p.addAssign(i.element(0).mul(Pg({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Xc({start:Wi(1),end:e},(({i:e})=>{Gi(e.greaterThanEqual(n),(()=>{Kc()}));const t=$i(a.mul($i(e))).toVar();p.addAssign(i.element(e).mul(Pg({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Pg({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),rn(p,1)})),Fg=[.125,.215,.35,.446,.526,.582],Bg=20,Dg=new ie(-1,1,1,-1,0,1),Ig=new ne(90,1),Vg=new e;let Ug=null,Og=0,kg=0;const Gg=(1+Math.sqrt(5))/2,zg=1/Gg,Hg=[new r(-Gg,zg,0),new r(Gg,zg,0),new r(-zg,0,Gg),new r(zg,0,Gg),new r(0,Gg,-zg),new r(0,Gg,zg),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],$g=new r,Wg=new WeakMap,jg=[3,1,5,0,4,2],qg=Rg($u(),Hu("faceIndex")).normalize(),Xg=Zi(qg.x,qg.y,qg.z);class Kg{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={}){const{size:n=256,position:a=$g,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Ug=this._renderer.getRenderTarget(),Og=this._renderer.getActiveCubeFace(),kg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){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=Jg(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=em(),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===w||e.mapping===E?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=Fg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-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,x=new Float32Array(m*g*p),b=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=jg[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=rl(new Array(Bg).fill(0)),n=Yn(new r(0,1,0)),a=Yn(0),o=$i(Bg),u=Yn(0),l=Yn(1),d=Yu(null),c=Yn(0),h=$i(1/t),p=$i(1/s),g=$i(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Xg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Zg("blur");return f.fragmentNode=Lg({...m,latitudinal:u.equal(1)}),Wg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Dg)}_sceneToCubeUV(e,t,r,s,i){const n=Ig;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Vg),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new $,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Vg),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Qg(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===w||e.mapping===E;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Jg(e)):null===this._equirectMaterial&&(this._equirectMaterial=em(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Qg(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Dg)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tBg&&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-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Dg)}}function Yg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function Qg(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Zg(e){const t=new Gh;return t.depthTest=!1,t.depthWrite=!1,t.blending=k,t.name=`PMREM_${e}`,t}function Jg(e){const t=Zg("cubemap");return t.fragmentNode=dd(e,Xg),t}function em(e){const t=Zg("equirect");return t.fragmentNode=Yu(e,tp(Xg),0),t}const tm=new WeakMap;function rm(e,t,r){const s=function(e){let t=tm.get(e);void 0===t&&(t=new WeakMap,tm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class sm extends qs{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 pe;s.isRenderTargetTexture=!0,this._texture=Yu(s),this._width=Yn(0),this._height=Yn(0),this._maxMip=Yn(0),this.updateBeforeType=Is.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(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:rm(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Kg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=id.mul(Zi(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Cg(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const im=Di(sm).setParameterLength(1,3),nm=new WeakMap;class am extends th{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=nm.get(e);void 0===s&&(s=im(e),nm.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Ld:Kl,i=r.context(om(yn,s)).mul(sd),n=r.context(um(Yl)).mul(Math.PI).mul(sd),a=Cu(i),o=Cu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(om(Tn,Ql)).mul(sd),t=Cu(e);u.addAssign(t)}}}const om=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=kl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(ll)),r),getTextureLevel:()=>e}},um=e=>({getUV:()=>e,getTextureLevel:()=>$i(1)}),lm=new ge;class dm extends Gh{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(lm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new am(t):null}setupLightingModel(){return new hg}setupSpecular(){const e=Fo(Zi(.04),mn.rgb,xn);Mn.assign(e),Pn.assign(1)}setupVariants(){const e=this.metalnessNode?$i(this.metalnessNode):Jd;xn.assign(e);let t=this.roughnessNode?$i(this.roughnessNode):Zd;t=Sp({roughness:t}),yn.assign(t),this.setupSpecular(),mn.assign(rn(mn.rgb.mul(e.oneMinus()),mn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const cm=new me;class hm extends dm{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(cm),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?$i(this.iorNode):pc;Vn.assign(e),Mn.assign(Fo(xo(Ao(Vn.sub(1).div(Vn.add(1))).mul(Kd),Zi(1)).mul(Xd),mn.rgb,xn)),Pn.assign(Fo(Xd,1,xn))}setupLightingModel(){return new hg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?$i(this.clearcoatNode):tc,t=this.clearcoatRoughnessNode?$i(this.clearcoatRoughnessNode):rc;bn.assign(e),Tn.assign(Sp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Zi(this.sheenNode):nc,t=this.sheenRoughnessNode?$i(this.sheenRoughnessNode):ac;_n.assign(e),vn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?$i(this.iridescenceNode):uc,t=this.iridescenceIORNode?$i(this.iridescenceIORNode):lc,r=this.iridescenceThicknessNode?$i(this.iridescenceThicknessNode):dc;Nn.assign(e),Sn.assign(t),wn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Xi(this.anisotropyNode):oc).toVar();An.assign(e.length()),Gi(An.equal(0),(()=>{e.assign(Xi(1,0))})).Else((()=>{e.divAssign(Xi(An)),An.assign(An.saturate())})),En.assign(An.pow2().mix(yn.pow2(),1)),Rn.assign(Md[0].mul(e.x).add(Md[1].mul(e.y))),Cn.assign(Md[1].mul(e.x).sub(Md[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?$i(this.transmissionNode):cc,t=this.thicknessNode?$i(this.thicknessNode):hc,r=this.attenuationDistanceNode?$i(this.attenuationDistanceNode):gc,s=this.attenuationColorNode?Zi(this.attenuationColorNode):mc;if(Un.assign(e),On.assign(t),kn.assign(r),Gn.assign(s),this.useDispersion){const e=this.dispersionNode?$i(this.dispersionNode):vc;zn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Zi(this.clearcoatNormalNode):sc}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 pm extends hg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(Kl.mul(a)).normalize(),h=$i(kl.dot(c.negate()).saturate().pow(l).mul(d)),p=Zi(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class gm extends hm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=$i(.1),this.thicknessAmbientNode=$i(0),this.thicknessAttenuationNode=$i(.1),this.thicknessPowerNode=$i(2),this.thicknessScaleNode=$i(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new pm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,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 mm=Ui((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Xi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=fd("gradientMap","texture").context({getUV:()=>i});return Zi(e.r)}{const e=i.fwidth().mul(.5);return Fo(Zi(.7),Zi(1),Vo($i(.7).sub(e.x),$i(.7).add(e.x),i.x))}}));class fm extends dp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=mm({normal:$l,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(mp({diffuseColor:mn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(mp({diffuseColor:mn}))),s.indirectDiffuse.mulAssign(t)}}const ym=new fe;class xm extends Gh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(ym),this.setValues(e)}setupLightingModel(){return new fm}}class bm extends qs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Zi(kl.z,0,kl.x.negate()).normalize(),t=kl.cross(e);return Xi(e.dot(Kl),t.dot(Kl)).mul(.495).add(.5)}}const Tm=Ii(bm),_m=new ye;class vm extends Gh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(_m),this.setValues(e)}setupVariants(e){const t=Tm;let r;r=e.material.matcap?fd("matcap","texture").context({getUV:()=>t}):Zi(Fo(.2,.8,t.y)),mn.rgb.mulAssign(r.rgb)}}class Nm extends qs{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 on(e,s,s.negate(),e).mul(r)}{const e=t,s=ln(rn(1,0,0,0),rn(0,Za(e.x),Qa(e.x).negate(),0),rn(0,Qa(e.x),Za(e.x),0),rn(0,0,0,1)),i=ln(rn(Za(e.y),0,Qa(e.y),0),rn(0,1,0,0),rn(Qa(e.y).negate(),0,Za(e.y),0),rn(0,0,0,1)),n=ln(rn(Za(e.z),Qa(e.z).negate(),0,0),rn(Qa(e.z),Za(e.z),0,0),rn(0,0,1,0),rn(0,0,0,1));return s.mul(i).mul(n).mul(rn(r,1)).xyz}}}const Sm=Di(Nm).setParameterLength(2),wm=new xe;class Em extends Gh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(wm),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Ml.mul(Zi(i||0));let u=Xi(Nl[0].xyz.length(),Nl[1].xyz.length());if(null!==a&&(u=u.mul(Xi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=$i(2).div(ol.element(1).element(1));u=u.mul(e.mul(2))}let l=Bl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Li(new mu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=$i(n||ic),c=Sm(l,d);return rn(o.xy.add(c),o.zw)}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)}}const Am=new be;class Rm extends Em{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Am),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ml.mul(Zi(e||Dl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Bl.xy.toVar(),a=hh.z.div(hh.w);if(r&&r.isNode){const e=$i(r);n.assign(Sm(n,e))}let o=null!==i?Xi(i):_c;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Ol.z.negate()))),s&&s.isNode&&(o=o.mul(Xi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(hh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(rn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class Cm extends dp{constructor(){super(),this.shadowNode=$i(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){mn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(mn.rgb)}}const Mm=new Te;class Pm extends Gh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(Mm),this.setValues(e)}setupLightingModel(){return new Cm}}const Lm=pn("vec3"),Fm=pn("vec3"),Bm=pn("vec3");class Dm extends dp{constructor(){super()}start(e){const{material:t,context:r}=e,s=pn("vec3"),i=pn("vec3");Gi(hl.sub(Vl).length().greaterThan(Al.mul(2)),(()=>{s.assign(hl),i.assign(Vl)})).Else((()=>{s.assign(Vl),i.assign(hl)}));const n=i.sub(s),a=Yn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=$i(0).toVar(),d=Zi(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),Xc(a,(()=>{const i=s.add(u.mul(l)),n=ll.mul(rn(i,1)).xyz;let a;null!==t.depthNode&&(Fm.assign(Fh(Rh(n.z,nl,al))),r.sceneDepthNode=Fh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Lm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Lm.mulAssign(a);const c=Lm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),Bm.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?Gi(r.greaterThanEqual(Fm),(()=>{Lm.addAssign(e)})):Lm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Gp({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Bm)}}class Im extends Gh{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Dm}}class Vm{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,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}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Um{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().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}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}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),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;o?p=a.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,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",bs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=_s(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=_s(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Gm=[];class zm{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,a,o){const u=this.getChainMap(o);Gm[0]=e,Gm[1]=t,Gm[2]=n,Gm[3]=i;let l=u.get(Gm);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Gm,l)):(l.updateClipping(a),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,a,o)):l.version=t.version)),Gm.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Um)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new km(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Hm{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=null;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 $m=1,Wm=2,jm=3,qm=4,Xm=16;class Km extends Hm{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===$m?this.backend.createAttribute(e):t===Wm?this.backend.createIndexAttribute(e):t===jm?this.backend.createStorageAttribute(e):t===qm&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{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,jm):this.updateAttribute(e,$m);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Wm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,qm)}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=Qm(t),e.set(t,r)):r.version!==Ym(t)&&(this.attributes.delete(r),r=Qm(t),e.set(t,r)),s=r}return s}}class Jm{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},this.compute={calls:0,frameCalls:0,timestamp: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.")}reset(){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 ef{constructor(e){this.cacheKey=e,this.usedTimes=0}}class tf extends ef{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class rf extends ef{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let sf=0;class nf{constructor(e,t,r,s=null,i=null){this.id=sf++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class af extends Hm{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 a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new nf(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.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(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new nf(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new nf(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}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 rf(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 tf(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 of extends Hm{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?qm:jm;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?qm:jm;this.attributes.update(e,r)}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 o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,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,a)}}function uf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function lf(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 df(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class cf{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,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(df(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(df(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||uf),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||lf),this.transparent.length>1&&this.transparent.sort(t||lf)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=!0===e.multiview&&a.depth>1?new Ee:new D,l.format=e.stencilBuffer?Ae:Re,l.type=e.stencilBuffer?Ce:b,l.image.width=o,l.image.height=u,l.image.depth=a.depth,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isDepthArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.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};if(!0!==e.isXRRenderTarget){for(let t=0;t1,c&&(r.needsUpdate=!0),this.updateTexture(r,h)}l&&this.updateTexture(l,h)}if(!0!==r.initialized){r.initialized=!0;const t=()=>{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)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=_f){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!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class Nf 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 Sf extends hn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class wf extends $s{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Pi(t);return this._currentCond=jo(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Pi(t),s=jo(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Pi(e),this}Switch(e){return this._expressionNode=Li(e),this}Case(...e){const t=[];if(!(e.length>=2))throw new Error("TSL: Invalid parameter length. Case() requires at least two parameters.");for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=Rs(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Rf extends $s{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class Cf extends $s{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{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)})),Df=(e,t)=>Eo(oa(4,e.mul(aa(1,e))),t),If=Ui((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Vf=Ui((([e])=>Zi(If(e.z.add(If(e.y.mul(1)))),If(e.z.add(If(e.x.mul(1)))),If(e.y.add(If(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Uf=Ui((([e,t,r])=>{const s=Zi(e).toVar(),i=$i(1.4).toVar(),n=$i(0).toVar(),a=Zi(s).toVar();return Xc({start:$i(0),end:$i(3),type:"float",condition:"<="},(()=>{const e=Zi(Vf(a.mul(2))).toVar();s.addAssign(e.add(r.mul($i(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=$i(If(s.z.add(If(s.x.add(If(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Of extends $s{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 a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const kf=Di(Of),Gf=e=>(...t)=>kf(e,...t),zf=Yn(0).setGroup(qn).onRenderUpdate((e=>e.time)),Hf=Yn(0).setGroup(qn).onRenderUpdate((e=>e.deltaTime)),$f=Yn(0,"uint").setGroup(qn).onRenderUpdate((e=>e.frameId)),Wf=Ui((([e,t,r=Xi(.5)])=>Sm(e.sub(r),t).add(r))),jf=Ui((([e,t,r=Xi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),qf=Ui((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Nl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Nl;const i=ll.mul(s);return Ci(t)&&(i[0][0]=Nl[0].length(),i[0][1]=0,i[0][2]=0),Ci(r)&&(i[1][0]=0,i[1][1]=Nl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ol.mul(i).mul(Dl)})),Xf=Ui((([e=null])=>{const t=Fh();return Fh(wh(e)).sub(t).lessThan(0).select(lh,e)}));class Kf extends $s{static get type(){return"SpriteSheetUVNode"}constructor(e,t=$u(),r=$i(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(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Xi(a,o);return t.add(l).mul(u)}}const Yf=Di(Kf).setParameterLength(3);class Qf extends $s{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=$i(1),i=Dl,n=Wl){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 a=n.abs().normalize();a=a.div(a.dot(Zi(1)));const o=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=Yu(d,o).mul(a.x),g=Yu(c,u).mul(a.y),m=Yu(h,l).mul(a.z);return na(p,g,m)}}const Zf=Di(Qf).setParameterLength(1,6),Jf=new Pe,ey=new r,ty=new r,ry=new r,sy=new a,iy=new r(0,0,-1),ny=new s,ay=new r,oy=new r,uy=new s,ly=new t,dy=new ae,cy=lh.flipX();dy.depthTexture=new D(1,1);let hy=!1;class py extends Ku{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||dy.texture,cy),this._reflectorBaseNode=e.reflector||new gy(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=Li(new py({defaultTexture:dy.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}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class gy extends $s{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Le,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Is.RENDER:Is.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(ly),e.setSize(Math.round(ly.width*r),Math.round(ly.height*r))}setup(e){return this._updateResolution(dy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}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 ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Fe,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new D),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&hy)return!1;hy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(ly),this._updateResolution(o,s),ty.setFromMatrixPosition(n.matrixWorld),ry.setFromMatrixPosition(r.matrixWorld),sy.extractRotation(n.matrixWorld),ey.set(0,0,1),ey.applyMatrix4(sy),ay.subVectors(ty,ry);if(!0===ay.dot(ey)>0&&!1===this.forceUpdate)return;ay.reflect(ey).negate(),ay.add(ty),sy.extractRotation(r.matrixWorld),iy.set(0,0,-1),iy.applyMatrix4(sy),iy.add(ry),oy.subVectors(ty,iy),oy.reflect(ey).negate(),oy.add(ty),a.coordinateSystem=r.coordinateSystem,a.position.copy(ay),a.up.set(0,1,0),a.up.applyMatrix4(sy),a.up.reflect(ey),a.lookAt(oy),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Jf.setFromNormalAndCoplanarPoint(ey,ty),Jf.applyMatrix4(a.matrixWorldInverse),ny.set(Jf.normal.x,Jf.normal.y,Jf.normal.z,Jf.constant);const u=a.projectionMatrix;uy.x=(Math.sign(ny.x)+u.elements[8])/u.elements[0],uy.y=(Math.sign(ny.y)+u.elements[9])/u.elements[5],uy.z=-1,uy.w=(1+u.elements[10])/u.elements[14],ny.multiplyScalar(1/ny.dot(uy));u.elements[2]=ny.x,u.elements[6]=ny.y,u.elements[10]=s.coordinateSystem===d?ny.z-0:ny.z+1-0,u.elements[14]=ny.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,hy=!1,this.forceUpdate=!1}}const my=new ie(-1,1,1,-1,0,1);class fy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Be([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Be(t,2))}}const yy=new fy;class xy extends W{constructor(e=null){super(yy,e),this.camera=my,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,my)}render(e){e.render(this,my)}}const by=new t;class Ty extends Ku{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,$u()),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 xy(new Gh),this.updateBeforeType=Is.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(by);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 Ku(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const _y=(e,...t)=>Li(new Ty(Li(e),...t)),vy=Ui((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=Xi(e.x,e.y.oneMinus()).mul(2).sub(1),i=rn(Zi(e,t),1)):i=rn(Zi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=rn(r.mul(i));return n.xyz.div(n.w)})),Ny=Ui((([e,t])=>{const r=t.mul(rn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Xi(s.x,s.y.oneMinus())})),Sy=Ui((([e,t,r])=>{const s=ju(Qu(t)),i=Ki(e.mul(s)).toVar(),n=Qu(t,i).toVar(),a=Qu(t,i.sub(Ki(2,0))).toVar(),o=Qu(t,i.sub(Ki(1,0))).toVar(),u=Qu(t,i.add(Ki(1,0))).toVar(),l=Qu(t,i.add(Ki(2,0))).toVar(),d=Qu(t,i.add(Ki(0,2))).toVar(),c=Qu(t,i.add(Ki(0,1))).toVar(),h=Qu(t,i.sub(Ki(0,1))).toVar(),p=Qu(t,i.sub(Ki(0,2))).toVar(),g=so(aa($i(2).mul(o).sub(a),n)).toVar(),m=so(aa($i(2).mul(u).sub(l),n)).toVar(),f=so(aa($i(2).mul(c).sub(d),n)).toVar(),y=so(aa($i(2).mul(h).sub(p),n)).toVar(),x=vy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(vy(e.sub(Xi($i(1).div(s.x),0)),o,r)),x.negate().add(vy(e.add(Xi($i(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(vy(e.add(Xi(0,$i(1).div(s.y))),c,r)),x.negate().add(vy(e.sub(Xi(0,$i(1).div(s.y))),h,r)));return Ka(wo(b,T))}));class wy extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Ey extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Ay extends $s{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Ry=Ii(Ay),Cy=new S,My=new a;class Py extends $s{static get type(){return"SceneNode"}constructor(e=Py.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===Py.BACKGROUND_BLURRINESS?s=pd("backgroundBlurriness","float",r):t===Py.BACKGROUND_INTENSITY?s=pd("backgroundIntensity","float",r):t===Py.BACKGROUND_ROTATION?s=Yn("mat4").label("backgroundRotation").setGroup(qn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==De?(Cy.copy(r.backgroundRotation),Cy.x*=-1,Cy.y*=-1,Cy.z*=-1,My.makeRotationFromEuler(Cy)):My.identity(),My})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Py.BACKGROUND_BLURRINESS="backgroundBlurriness",Py.BACKGROUND_INTENSITY="backgroundIntensity",Py.BACKGROUND_ROTATION="backgroundRotation";const Ly=Ii(Py,Py.BACKGROUND_BLURRINESS),Fy=Ii(Py,Py.BACKGROUND_INTENSITY),By=Ii(Py,Py.BACKGROUND_ROTATION);class Dy extends Ku{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Us.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(Us.READ_WRITE)}toReadOnly(){return this.setAccess(Us.READ_ONLY)}toWriteOnly(){return this.setAccess(Us.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Iy=Di(Dy).setParameterLength(1,3),Vy=Ui((({texture:e,uv:t})=>{const r=1e-4,s=Zi().toVar();return Gi(t.x.lessThan(r),(()=>{s.assign(Zi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Zi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Zi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Zi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Zi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Zi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Zi(-.01,0,0))).r.sub(e.sample(t.add(Zi(r,0,0))).r),n=e.sample(t.add(Zi(0,-.01,0))).r.sub(e.sample(t.add(Zi(0,r,0))).r),a=e.sample(t.add(Zi(0,0,-.01))).r.sub(e.sample(t.add(Zi(0,0,r))).r);s.assign(Zi(i,n,a))})),s.normalize()}));class Uy extends Ku{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Zi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Wi(ju(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Vy({texture:this,uv:e})}}const Oy=Di(Uy).setParameterLength(1,3);class ky extends hd{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 Gy=new WeakMap;class zy extends qs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Is.OBJECT,this.updateAfterType=Is.OBJECT,this.previousModelWorldMatrix=Yn(new a),this.previousProjectionMatrix=Yn(new a).setGroup(qn),this.previousCameraViewMatrix=Yn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=$y(r);this.previousModelWorldMatrix.value.copy(s);const i=Hy(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,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}){$y(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ol:Yn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ml).mul(Dl),s=this.previousProjectionMatrix.mul(t).mul(Il),i=r.xy.div(r.w),n=s.xy.div(s.w);return aa(i,n)}}function Hy(e){let t=Gy.get(e);return void 0===t&&(t={},Gy.set(e,t)),t}function $y(e,t=0){const r=Hy(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Wy=Ii(zy),jy=Ui((([e,t])=>xo(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qy=Ui((([e,t])=>xo(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xy=Ui((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ky=Ui((([e,t])=>Fo(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),To(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Yy=Ui((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return rn(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"}]}),Qy=Ui((([e])=>tx(e.rgb))),Zy=Ui((([e,t=$i(1)])=>t.mix(tx(e.rgb),e.rgb))),Jy=Ui((([e,t=$i(1)])=>{const r=na(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 Fo(e.rgb,s,i)})),ex=Ui((([e,t=$i(1)])=>{const r=Zi(.57735,.57735,.57735),s=t.cos();return Zi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(So(r,e.rgb).mul(s.oneMinus())))))})),tx=(e,t=Zi(c.getLuminanceCoefficients(new r)))=>So(e,t),rx=Ui((([e,t=Zi(1),s=Zi(0),i=Zi(1),n=$i(1),a=Zi(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(Zi(a)),u=bo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Gi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Gi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Gi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),rn(u.rgb,e.a)}));class sx extends qs{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 ix=Di(sx).setParameterLength(2),nx=new t;class ax extends Ku{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 ox extends ax{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 ux extends qs{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 D;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...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=Yn(0),this._cameraFar=Yn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Is.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}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=Li(new ox(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=Li(new ox(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=Ch(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=Ah(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.texture.type=e.getColorBufferType(),this.scope===ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),nx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(nx)),this._pixelRatio=i,this.setSize(nx.width,nx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}ux.COLOR="color",ux.DEPTH="depth";class lx extends ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(ux.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,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Gh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=Wl.negate(),r=ol.mul(Ml),s=$i(1),i=r.mul(rn(Dl,1)),n=r.mul(rn(Dl.add(t),1)),a=Ka(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=rn(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 dx=Ui((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),cx=Ui((([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"}]}),hx=Ui((([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"}]}),px=Ui((([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)})),gx=Ui((([e,t])=>{const r=un(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=un(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=px(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),mx=un(Zi(1.6605,-.1246,-.0182),Zi(-.5876,1.1329,-.1006),Zi(-.0728,-.0083,1.1187)),fx=un(Zi(.6274,.0691,.0164),Zi(.3293,.9195,.088),Zi(.0433,.0113,.8956)),yx=Ui((([e])=>{const t=Zi(e).toVar(),r=Zi(t.mul(t)).toVar(),s=Zi(r.mul(r)).toVar();return $i(15.5).mul(s.mul(r)).sub(oa(40.14,s.mul(t))).add(oa(31.96,s).sub(oa(6.868,r.mul(t))).add(oa(.4298,r).add(oa(.1191,t).sub(.00232))))})),xx=Ui((([e,t])=>{const r=Zi(e).toVar(),s=un(Zi(.856627153315983,.137318972929847,.11189821299995),Zi(.0951212405381588,.761241990602591,.0767994186031903),Zi(.0482516061458583,.101439036467562,.811302368396859)),i=un(Zi(1.1271005818144368,-.1413297634984383,-.14132976349843826),Zi(-.11060664309660323,1.157823702216272,-.11060664309660294),Zi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=$i(-12.47393),a=$i(4.026069);return r.mulAssign(t),r.assign(fx.mul(r)),r.assign(s.mul(r)),r.assign(bo(r,1e-10)),r.assign($a(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Bo(r,0,1)),r.assign(yx(r)),r.assign(i.mul(r)),r.assign(Eo(bo(Zi(0),r),Zi(2.2))),r.assign(mx.mul(r)),r.assign(Bo(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),bx=Ui((([e,t])=>{const r=$i(.76),s=$i(.15);e=e.mul(t);const i=xo(e.r,xo(e.g,e.b)),n=jo(i.lessThan(.08),i.sub(oa(6.25,i.mul(i))),.04);e.subAssign(n);const a=bo(e.r,bo(e.g,e.b));Gi(a.lessThan(r),(()=>e));const o=aa(1,r),u=aa(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=aa(1,ua(1,s.mul(a.sub(u)).add(1)));return Fo(e,Zi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Tx extends $s{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 _x=Di(Tx).setParameterLength(1,3);class vx extends Tx{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 a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Nx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Sx extends $s{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:$i()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ls(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?Fs(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 wx=Di(Sx).setParameterLength(1);class Ex 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 Ax{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 Rx=new Ex;class Cx extends $s{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Ex,this._output=wx(null),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]=wx(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]=wx(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 Ax(this),t=Rx.get("THREE"),r=Rx.get("TSL"),s=this.getMethod(),i=[e,this._local,Rx,()=>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:$i()}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=[bs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ts(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 Mx=Di(Cx).setParameterLength(1,2);function Px(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ol.z).negate()}const Lx=Ui((([e,t],r)=>{const s=Px(r);return Vo(e,t,s)})),Fx=Ui((([e],t)=>{const r=Px(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Bx=Ui((([e,t])=>rn(t.toFloat().mix(Fn.rgb,e.toVec3()),Fn.a)));let Dx=null,Ix=null;class Vx extends $s{static get type(){return"RangeNode"}constructor(e=$i(),t=$i()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Cs(this.minNode.value)),r=e.getTypeLength(Cs(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,a=e.getTypeLength(Cs(i)),o=e.getTypeLength(Cs(n));Dx=Dx||new s,Ix=Ix||new s,Dx.setScalar(0),Ix.setScalar(0),1===a?Dx.setScalar(i):i.isColor?Dx.set(i.r,i.g,i.b,1):Dx.set(i.x,i.y,i.z||0,i.w||0),1===o?Ix.setScalar(n):n.isColor?Ix.set(n.r,n.g,n.b,1):Ix.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;eLi(new Ox(e,t)),Gx=kx("numWorkgroups","uvec3"),zx=kx("workgroupId","uvec3"),Hx=kx("globalId","uvec3"),$x=kx("localId","uvec3"),Wx=kx("subgroupSize","uint");const jx=Di(class extends $s{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 qx extends Ws{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 Xx extends $s{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Li(new qx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Kx extends $s{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(1===r.length&&!0===r[0].isStackNode))return void 0===t.constNode&&(t.constNode=Iu(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}Kx.ATOMIC_LOAD="atomicLoad",Kx.ATOMIC_STORE="atomicStore",Kx.ATOMIC_ADD="atomicAdd",Kx.ATOMIC_SUB="atomicSub",Kx.ATOMIC_MAX="atomicMax",Kx.ATOMIC_MIN="atomicMin",Kx.ATOMIC_AND="atomicAnd",Kx.ATOMIC_OR="atomicOr",Kx.ATOMIC_XOR="atomicXor";const Yx=Di(Kx),Qx=(e,t,r)=>Yx(e,t,r).toStack();let Zx;function Jx(e){Zx=Zx||new WeakMap;let t=Zx.get(e);return void 0===t&&Zx.set(e,t={}),t}function eb(e){const t=Jx(e);return t.shadowMatrix||(t.shadowMatrix=Yn("mat4").setGroup(qn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function tb(e,t=Vl){const r=eb(e).mul(t);return r.xyz.div(r.w)}function rb(e){const t=Jx(e);return t.position||(t.position=Yn(new r).setGroup(qn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function sb(e){const t=Jx(e);return t.targetPosition||(t.targetPosition=Yn(new r).setGroup(qn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function ib(e){const t=Jx(e);return t.viewPosition||(t.viewPosition=Yn(new r).setGroup(qn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const nb=e=>ll.transformDirection(rb(e).sub(sb(e))),ab=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},ob=new WeakMap;class ub extends $s{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Zi().toVar(),this.totalSpecularNode=Zi().toVar(),this.outgoingLightNode=Zi().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Li(e));else{let s=null;if(null!==r&&(s=ab(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;ob.has(e)?s=ob.get(e):(s=Li(new r(e)),ob.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=Zi(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class lb extends $s{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Is.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){db.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Vl)}dispose(){this.updateBeforeType=Is.NONE}}const db=pn("vec3","shadowPositionWorld");function cb(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 hb(e,t){return t=cb(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function pb(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 gb(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function mb(e,t){return t=gb(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function fb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function yb(e,t,r){return r=mb(t,r=hb(e,r))}function xb(e,t,r){pb(e,r),fb(t,r)}var bb=Object.freeze({__proto__:null,resetRendererAndSceneState:yb,resetRendererState:hb,resetSceneState:mb,restoreRendererAndSceneState:xb,restoreRendererState:pb,restoreSceneState:fb,saveRendererAndSceneState:function(e,t,r={}){return r=gb(t,r=cb(e,r))},saveRendererState:cb,saveSceneState:gb});const Tb=new WeakMap,_b=Ui((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Yu(e,t.xy).label("t_basic");return e.isDepthArrayTexture&&(s=s.depth(r)),s.compare(t.z)})),vb=Ui((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Yu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pd("mapSize","vec2",r).setGroup(qn),a=pd("radius","float",r).setGroup(qn),o=Xi(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return na(i(t.xy.add(Xi(u,l)),t.z),i(t.xy.add(Xi(0,l)),t.z),i(t.xy.add(Xi(d,l)),t.z),i(t.xy.add(Xi(h,p)),t.z),i(t.xy.add(Xi(0,p)),t.z),i(t.xy.add(Xi(g,p)),t.z),i(t.xy.add(Xi(u,0)),t.z),i(t.xy.add(Xi(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(Xi(g,0)),t.z),i(t.xy.add(Xi(d,0)),t.z),i(t.xy.add(Xi(h,m)),t.z),i(t.xy.add(Xi(0,m)),t.z),i(t.xy.add(Xi(g,m)),t.z),i(t.xy.add(Xi(u,c)),t.z),i(t.xy.add(Xi(0,c)),t.z),i(t.xy.add(Xi(d,c)),t.z)).mul(1/17)})),Nb=Ui((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Yu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pd("mapSize","vec2",r).setGroup(qn),a=Xi(1).div(n),o=a.x,u=a.y,l=t.xy,d=Ya(l.mul(n).add(.5));return l.subAssign(d.mul(a)),na(i(l,t.z),i(l.add(Xi(o,0)),t.z),i(l.add(Xi(0,u)),t.z),i(l.add(a),t.z),Fo(i(l.add(Xi(o.negate(),0)),t.z),i(l.add(Xi(o.mul(2),0)),t.z),d.x),Fo(i(l.add(Xi(o.negate(),u)),t.z),i(l.add(Xi(o.mul(2),u)),t.z),d.x),Fo(i(l.add(Xi(0,u.negate())),t.z),i(l.add(Xi(0,u.mul(2))),t.z),d.y),Fo(i(l.add(Xi(o,u.negate())),t.z),i(l.add(Xi(o,u.mul(2))),t.z),d.y),Fo(Fo(i(l.add(Xi(o.negate(),u.negate())),t.z),i(l.add(Xi(o.mul(2),u.negate())),t.z),d.x),Fo(i(l.add(Xi(o.negate(),u.mul(2))),t.z),i(l.add(Xi(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)})),Sb=Ui((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=$i(1).toVar();let i=Yu(e).sample(t.xy);(e.isDepthArrayTexture||e.isDataArrayTexture)&&(i=i.depth(r)),i=i.rg;const n=To(t.z,i.x);return Gi(n.notEqual($i(1)),(()=>{const e=t.z.sub(i.x),r=bo(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Bo(aa(a,.3).div(.95-.3)),s.assign(Bo(bo(n,a)))})),s})),wb=Ui((([e,t,r])=>{let s=Vl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Eb=e=>{let t=Tb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=pd("near","float",t).setGroup(qn),s=pd("far","float",t).setGroup(qn),i=yl(e);return wb(i,r,s)})(e):null;t=new Gh,t.colorNode=rn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,Tb.set(e,t)}return t},Ab=new Um,Rb=[],Cb=(e,t,r,s)=>{Rb[0]=e,Rb[1]=t;let i=Ab.get(Rb);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Ps(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,Ab.set(Rb,i)),Rb[0]=null,Rb[1]=null,i},Mb=Ui((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=$i(0).toVar("meanVertical"),a=$i(0).toVar("squareMeanVertical"),o=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),u=e.lessThanEqual($i(1)).select($i(0),$i(-1));Xc({start:Wi(0),end:Wi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add($i(e).mul(o));let d=s.sample(na(ch.xy,Xi(0,l).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))})),n.divAssign(e),a.divAssign(e);const l=Wa(a.sub(n.mul(n)));return Xi(n,l)})),Pb=Ui((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=$i(0).toVar("meanHorizontal"),a=$i(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual($i(1)).select($i(0),$i(2).div(e.sub(1))),u=e.lessThanEqual($i(1)).select($i(0),$i(-1));Xc({start:Wi(0),end:Wi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add($i(e).mul(o));let d=s.sample(na(ch.xy,Xi(l,0).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(na(d.y.mul(d.y),d.x.mul(d.x)))})),n.divAssign(e),a.divAssign(e);const l=Wa(a.sub(n.mul(n)));return Xi(n,l)})),Lb=[_b,vb,Nb,Sb];let Fb;const Bb=new xy;class Db extends lb{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._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=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,depthLayer:n});return a.select(o,$i(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=pd("bias","float",r).setGroup(qn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=pd("near","float",r.camera).setGroup(qn),s=pd("far","float",r.camera).setGroup(qn);n=Mh(e.negate(),t,s)}return a=Zi(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return Lb[e]}setupRenderTarget(e,t){const r=new D(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Ve;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie){n.compareFunction=null,a.isRenderTargetArray?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}));let t=Yu(n);n.isDepthArrayTexture&&(t=t.depth(this.depthLayer));let r=Yu(this.vsmShadowMapVertical.texture);n.isDepthArrayTexture&&(r=r.depth(this.depthLayer));const i=pd("blurSamples","float",s).setGroup(qn),o=pd("radius","float",s).setGroup(qn),u=pd("mapSize","vec2",s).setGroup(qn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Gh);l.fragmentNode=Mb({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Gh),l.fragmentNode=Pb({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=pd("intensity","float",s).setGroup(qn),u=pd("normalBias","float",s).setGroup(qn),l=eb(r).mul(db.add(Yl.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===Ie?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=Yu(a.texture,d);n.isDepthArrayTexture&&(g=g.depth(this.depthLayer));const m=Fo(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Ui((()=>{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,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");Fb=yb(i,n,Fb),n.overrideMaterial=Eb(r),i.setRenderObjectFunction(Cb(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),!0!==r.isPointLight&&o===Ie&&this.vsmPass(i),s.camera.layers.mask=l,xb(i,n,Fb)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),Bb.material=this.vsmMaterialVertical,Bb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Bb.material=this.vsmMaterialHorizontal,Bb.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;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Ib=(e,t)=>Li(new Db(e,t)),Vb=new e,Ub=Ui((([e,t])=>{const r=e.toVar(),s=so(r),i=ua(1,bo(s.x,bo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Xi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return Gi(s.z.greaterThanEqual(a),(()=>{Gi(r.z.greaterThan(0),(()=>{n.x.assign(aa(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=io(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{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))})),Xi(.125,.25).mul(n).add(Xi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Ob=Ui((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Yu(e,Ub(t,s.y)).compare(r))),kb=Ui((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=pd("radius","float",i).setGroup(qn),a=Xi(-1,1).mul(n).mul(s.y);return Yu(e,Ub(t.add(a.xyy),s.y)).compare(r).add(Yu(e,Ub(t.add(a.yyy),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.xyx),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.yyx),s.y)).compare(r)).add(Yu(e,Ub(t,s.y)).compare(r)).add(Yu(e,Ub(t.add(a.xxy),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.yxy),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.xxx),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),Gb=Ui((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Yn("float").setGroup(qn).onRenderUpdate((()=>s.camera.near)),o=Yn("float").setGroup(qn).onRenderUpdate((()=>s.camera.far)),u=pd("bias","float",s).setGroup(qn),l=Yn(s.mapSize).setGroup(qn),d=$i(1).toVar();return Gi(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=Xi(1).div(l.mul(Xi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),zb=new s,Hb=new t,$b=new t;class Wb extends Db{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Oe?Ob:kb}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,a=t.getFrameExtents();$b.copy(t.mapSize),$b.multiply(a),r.setSize($b.width,$b.height),Hb.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Vb),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eLi(new Wb(e,t));class qb extends th{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Yn(this.color).setGroup(qn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Is.FRAME}customCacheKey(){return _s(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return ib(this.light).sub(e.context.positionView||Ol)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return Ib(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Li(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),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);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Xb=Ui((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Kb=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Xb({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Yb extends qb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Yn(0).setGroup(qn),this.decayExponentNode=Yn(2).setGroup(qn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return jb(this.light)}setupDirect(e){return Kb({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const Qb=Ui((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),Zb=Ui((([e=$u()],{renderer:t,material:r})=>{const s=$i(1).toVar(),i=Lo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=$i(i.fwidth()).toVar();s.assign(Vo(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),Jb=Ui((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=qi(e).toVar();return jo(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),eT=Ui((([e,t])=>{const r=qi(t).toVar(),s=$i(e).toVar();return jo(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),tT=Ui((([e])=>{const t=$i(e).toVar();return Wi(qa(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),rT=Ui((([e,t])=>{const r=$i(e).toVar();return t.assign(tT(r)),r.sub($i(t))})),sT=Gf([Ui((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=$i(s).toVar(),l=$i(r).toVar(),d=$i(t).toVar(),c=$i(e).toVar(),h=$i(aa(1,o)).toVar();return aa(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]}),Ui((([e,t,r,s,i,n])=>{const a=$i(n).toVar(),o=$i(i).toVar(),u=Zi(s).toVar(),l=Zi(r).toVar(),d=Zi(t).toVar(),c=Zi(e).toVar(),h=$i(aa(1,o)).toVar();return aa(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]})]),iT=Gf([Ui((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=$i(o).toVar(),m=$i(a).toVar(),f=$i(n).toVar(),y=$i(i).toVar(),x=$i(s).toVar(),b=$i(r).toVar(),T=$i(t).toVar(),_=$i(e).toVar(),v=$i(aa(1,p)).toVar(),N=$i(aa(1,h)).toVar();return $i(aa(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),Ui((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=$i(d).toVar(),h=$i(l).toVar(),p=$i(u).toVar(),g=Zi(o).toVar(),m=Zi(a).toVar(),f=Zi(n).toVar(),y=Zi(i).toVar(),x=Zi(s).toVar(),b=Zi(r).toVar(),T=Zi(t).toVar(),_=Zi(e).toVar(),v=$i(aa(1,p)).toVar(),N=$i(aa(1,h)).toVar();return $i(aa(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),nT=Ui((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=ji(e).toVar(),a=ji(n.bitAnd(ji(7))).toVar(),o=$i(Jb(a.lessThan(ji(4)),i,s)).toVar(),u=$i(oa(2,Jb(a.lessThan(ji(4)),s,i))).toVar();return eT(o,qi(a.bitAnd(ji(1)))).add(eT(u,qi(a.bitAnd(ji(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),aT=Ui((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=ji(e).toVar(),u=ji(o.bitAnd(ji(15))).toVar(),l=$i(Jb(u.lessThan(ji(8)),a,n)).toVar(),d=$i(Jb(u.lessThan(ji(4)),n,Jb(u.equal(ji(12)).or(u.equal(ji(14))),a,i))).toVar();return eT(l,qi(u.bitAnd(ji(1)))).add(eT(d,qi(u.bitAnd(ji(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"}]}),oT=Gf([nT,aT]),uT=Ui((([e,t,r])=>{const s=$i(r).toVar(),i=$i(t).toVar(),n=en(e).toVar();return Zi(oT(n.x,i,s),oT(n.y,i,s),oT(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"}]}),lT=Ui((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=$i(t).toVar(),o=en(e).toVar();return Zi(oT(o.x,a,n,i),oT(o.y,a,n,i),oT(o.z,a,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"}]}),dT=Gf([uT,lT]),cT=Ui((([e])=>{const t=$i(e).toVar();return oa(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),hT=Ui((([e])=>{const t=$i(e).toVar();return oa(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),pT=Gf([cT,Ui((([e])=>{const t=Zi(e).toVar();return oa(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),gT=Gf([hT,Ui((([e])=>{const t=Zi(e).toVar();return oa(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),mT=Ui((([e,t])=>{const r=Wi(t).toVar(),s=ji(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Wi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),fT=Ui((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(mT(r,Wi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(mT(e,Wi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(mT(t,Wi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(mT(r,Wi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(mT(e,Wi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(mT(t,Wi(4))),t.addAssign(e)})),yT=Ui((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=ji(e).toVar();return s.bitXorAssign(i),s.subAssign(mT(i,Wi(14))),n.bitXorAssign(s),n.subAssign(mT(s,Wi(11))),i.bitXorAssign(n),i.subAssign(mT(n,Wi(25))),s.bitXorAssign(i),s.subAssign(mT(i,Wi(16))),n.bitXorAssign(s),n.subAssign(mT(s,Wi(4))),i.bitXorAssign(n),i.subAssign(mT(n,Wi(14))),s.bitXorAssign(i),s.subAssign(mT(i,Wi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),xT=Ui((([e])=>{const t=ji(e).toVar();return $i(t).div($i(ji(Wi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),bT=Ui((([e])=>{const t=$i(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"}]}),TT=Gf([Ui((([e])=>{const t=Wi(e).toVar(),r=ji(ji(1)).toVar(),s=ji(ji(Wi(3735928559)).add(r.shiftLeft(ji(2))).add(ji(13))).toVar();return yT(s.add(ji(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Ui((([e,t])=>{const r=Wi(t).toVar(),s=Wi(e).toVar(),i=ji(ji(2)).toVar(),n=ji().toVar(),a=ji().toVar(),o=ji().toVar();return n.assign(a.assign(o.assign(ji(Wi(3735928559)).add(i.shiftLeft(ji(2))).add(ji(13))))),n.addAssign(ji(s)),a.addAssign(ji(r)),yT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar(),a=ji(ji(3)).toVar(),o=ji().toVar(),u=ji().toVar(),l=ji().toVar();return o.assign(u.assign(l.assign(ji(Wi(3735928559)).add(a.shiftLeft(ji(2))).add(ji(13))))),o.addAssign(ji(n)),u.addAssign(ji(i)),l.addAssign(ji(s)),yT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Ui((([e,t,r,s])=>{const i=Wi(s).toVar(),n=Wi(r).toVar(),a=Wi(t).toVar(),o=Wi(e).toVar(),u=ji(ji(4)).toVar(),l=ji().toVar(),d=ji().toVar(),c=ji().toVar();return l.assign(d.assign(c.assign(ji(Wi(3735928559)).add(u.shiftLeft(ji(2))).add(ji(13))))),l.addAssign(ji(o)),d.addAssign(ji(a)),c.addAssign(ji(n)),fT(l,d,c),l.addAssign(ji(i)),yT(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"}]}),Ui((([e,t,r,s,i])=>{const n=Wi(i).toVar(),a=Wi(s).toVar(),o=Wi(r).toVar(),u=Wi(t).toVar(),l=Wi(e).toVar(),d=ji(ji(5)).toVar(),c=ji().toVar(),h=ji().toVar(),p=ji().toVar();return c.assign(h.assign(p.assign(ji(Wi(3735928559)).add(d.shiftLeft(ji(2))).add(ji(13))))),c.addAssign(ji(l)),h.addAssign(ji(u)),p.addAssign(ji(o)),fT(c,h,p),c.addAssign(ji(a)),h.addAssign(ji(n)),yT(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"}]})]),_T=Gf([Ui((([e,t])=>{const r=Wi(t).toVar(),s=Wi(e).toVar(),i=ji(TT(s,r)).toVar(),n=en().toVar();return n.x.assign(i.bitAnd(Wi(255))),n.y.assign(i.shiftRight(Wi(8)).bitAnd(Wi(255))),n.z.assign(i.shiftRight(Wi(16)).bitAnd(Wi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar(),a=ji(TT(n,i,s)).toVar(),o=en().toVar();return o.x.assign(a.bitAnd(Wi(255))),o.y.assign(a.shiftRight(Wi(8)).bitAnd(Wi(255))),o.z.assign(a.shiftRight(Wi(16)).bitAnd(Wi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),vT=Gf([Ui((([e])=>{const t=Xi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=$i(rT(t.x,r)).toVar(),n=$i(rT(t.y,s)).toVar(),a=$i(bT(i)).toVar(),o=$i(bT(n)).toVar(),u=$i(sT(oT(TT(r,s),i,n),oT(TT(r.add(Wi(1)),s),i.sub(1),n),oT(TT(r,s.add(Wi(1))),i,n.sub(1)),oT(TT(r.add(Wi(1)),s.add(Wi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return pT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=Wi().toVar(),n=$i(rT(t.x,r)).toVar(),a=$i(rT(t.y,s)).toVar(),o=$i(rT(t.z,i)).toVar(),u=$i(bT(n)).toVar(),l=$i(bT(a)).toVar(),d=$i(bT(o)).toVar(),c=$i(iT(oT(TT(r,s,i),n,a,o),oT(TT(r.add(Wi(1)),s,i),n.sub(1),a,o),oT(TT(r,s.add(Wi(1)),i),n,a.sub(1),o),oT(TT(r.add(Wi(1)),s.add(Wi(1)),i),n.sub(1),a.sub(1),o),oT(TT(r,s,i.add(Wi(1))),n,a,o.sub(1)),oT(TT(r.add(Wi(1)),s,i.add(Wi(1))),n.sub(1),a,o.sub(1)),oT(TT(r,s.add(Wi(1)),i.add(Wi(1))),n,a.sub(1),o.sub(1)),oT(TT(r.add(Wi(1)),s.add(Wi(1)),i.add(Wi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return gT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),NT=Gf([Ui((([e])=>{const t=Xi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=$i(rT(t.x,r)).toVar(),n=$i(rT(t.y,s)).toVar(),a=$i(bT(i)).toVar(),o=$i(bT(n)).toVar(),u=Zi(sT(dT(_T(r,s),i,n),dT(_T(r.add(Wi(1)),s),i.sub(1),n),dT(_T(r,s.add(Wi(1))),i,n.sub(1)),dT(_T(r.add(Wi(1)),s.add(Wi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return pT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=Wi().toVar(),n=$i(rT(t.x,r)).toVar(),a=$i(rT(t.y,s)).toVar(),o=$i(rT(t.z,i)).toVar(),u=$i(bT(n)).toVar(),l=$i(bT(a)).toVar(),d=$i(bT(o)).toVar(),c=Zi(iT(dT(_T(r,s,i),n,a,o),dT(_T(r.add(Wi(1)),s,i),n.sub(1),a,o),dT(_T(r,s.add(Wi(1)),i),n,a.sub(1),o),dT(_T(r.add(Wi(1)),s.add(Wi(1)),i),n.sub(1),a.sub(1),o),dT(_T(r,s,i.add(Wi(1))),n,a,o.sub(1)),dT(_T(r.add(Wi(1)),s,i.add(Wi(1))),n.sub(1),a,o.sub(1)),dT(_T(r,s.add(Wi(1)),i.add(Wi(1))),n,a.sub(1),o.sub(1)),dT(_T(r.add(Wi(1)),s.add(Wi(1)),i.add(Wi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return gT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),ST=Gf([Ui((([e])=>{const t=$i(e).toVar(),r=Wi(tT(t)).toVar();return xT(TT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Ui((([e])=>{const t=Xi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar();return xT(TT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar();return xT(TT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Ui((([e])=>{const t=rn(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar(),n=Wi(tT(t.w)).toVar();return xT(TT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),wT=Gf([Ui((([e])=>{const t=$i(e).toVar(),r=Wi(tT(t)).toVar();return Zi(xT(TT(r,Wi(0))),xT(TT(r,Wi(1))),xT(TT(r,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Ui((([e])=>{const t=Xi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar();return Zi(xT(TT(r,s,Wi(0))),xT(TT(r,s,Wi(1))),xT(TT(r,s,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar();return Zi(xT(TT(r,s,i,Wi(0))),xT(TT(r,s,i,Wi(1))),xT(TT(r,s,i,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Ui((([e])=>{const t=rn(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar(),n=Wi(tT(t.w)).toVar();return Zi(xT(TT(r,s,i,n,Wi(0))),xT(TT(r,s,i,n,Wi(1))),xT(TT(r,s,i,n,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),ET=Ui((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar(),u=$i(0).toVar(),l=$i(1).toVar();return Xc(a,(()=>{u.addAssign(l.mul(vT(o))),l.mulAssign(i),o.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"}]}),AT=Ui((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar(),u=Zi(0).toVar(),l=$i(1).toVar();return Xc(a,(()=>{u.addAssign(l.mul(NT(o))),l.mulAssign(i),o.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"}]}),RT=Ui((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar();return Xi(ET(o,a,n,i),ET(o.add(Zi(Wi(19),Wi(193),Wi(17))),a,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"}]}),CT=Ui((([e,t,r,s])=>{const i=$i(s).toVar(),n=$i(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar(),u=Zi(AT(o,a,n,i)).toVar(),l=$i(ET(o.add(Zi(Wi(19),Wi(193),Wi(17))),a,n,i)).toVar();return rn(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"}]}),MT=Gf([Ui((([e,t,r,s,i,n,a])=>{const o=Wi(a).toVar(),u=$i(n).toVar(),l=Wi(i).toVar(),d=Wi(s).toVar(),c=Wi(r).toVar(),h=Wi(t).toVar(),p=Xi(e).toVar(),g=Zi(wT(Xi(h.add(d),c.add(l)))).toVar(),m=Xi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Xi(Xi($i(h),$i(c)).add(m)).toVar(),y=Xi(f.sub(p)).toVar();return Gi(o.equal(Wi(2)),(()=>so(y.x).add(so(y.y)))),Gi(o.equal(Wi(3)),(()=>bo(so(y.x),so(y.y)))),So(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"}]}),Ui((([e,t,r,s,i,n,a,o,u])=>{const l=Wi(u).toVar(),d=$i(o).toVar(),c=Wi(a).toVar(),h=Wi(n).toVar(),p=Wi(i).toVar(),g=Wi(s).toVar(),m=Wi(r).toVar(),f=Wi(t).toVar(),y=Zi(e).toVar(),x=Zi(wT(Zi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=Zi(Zi($i(f),$i(m),$i(g)).add(x)).toVar(),T=Zi(b.sub(y)).toVar();return Gi(l.equal(Wi(2)),(()=>so(T.x).add(so(T.y)).add(so(T.z)))),Gi(l.equal(Wi(3)),(()=>bo(bo(so(T.x),so(T.y)),so(T.z)))),So(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"}]})]),PT=Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=$i(t).toVar(),n=Xi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Xi(rT(n.x,a),rT(n.y,o)).toVar(),l=$i(1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(MT(u,e,t,a,o,i,s)).toVar();l.assign(xo(l,r))}))})),Gi(s.equal(Wi(0)),(()=>{l.assign(Wa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),LT=Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=$i(t).toVar(),n=Xi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Xi(rT(n.x,a),rT(n.y,o)).toVar(),l=Xi(1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(MT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Gi(s.equal(Wi(0)),(()=>{l.assign(Wa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),FT=Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=$i(t).toVar(),n=Xi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Xi(rT(n.x,a),rT(n.y,o)).toVar(),l=Zi(1e6,1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{const r=$i(MT(u,e,t,a,o,i,s)).toVar();Gi(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)}))}))})),Gi(s.equal(Wi(0)),(()=>{l.assign(Wa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),BT=Gf([PT,Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=$i(t).toVar(),n=Zi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Zi(rT(n.x,a),rT(n.y,o),rT(n.z,u)).toVar(),d=$i(1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{Xc({start:-1,end:Wi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(MT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(xo(d,n))}))}))})),Gi(s.equal(Wi(0)),(()=>{d.assign(Wa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),DT=Gf([LT,Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=$i(t).toVar(),n=Zi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Zi(rT(n.x,a),rT(n.y,o),rT(n.z,u)).toVar(),d=Xi(1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{Xc({start:-1,end:Wi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(MT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Gi(s.equal(Wi(0)),(()=>{d.assign(Wa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),IT=Gf([FT,Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=$i(t).toVar(),n=Zi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Zi(rT(n.x,a),rT(n.y,o),rT(n.z,u)).toVar(),d=Zi(1e6,1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{Xc({start:-1,end:Wi(1),name:"z",condition:"<="},(({z:r})=>{const n=$i(MT(l,e,t,r,a,o,u,i,s)).toVar();Gi(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)}))}))}))})),Gi(s.equal(Wi(0)),(()=>{d.assign(Wa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),VT=Ui((([e])=>{const t=e.y,r=e.z,s=Zi().toVar();return Gi(t.lessThan(1e-4),(()=>{s.assign(Zi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(qa(i)).mul(6).toVar();const n=Wi(po(i)),a=i.sub($i(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());Gi(n.equal(Wi(0)),(()=>{s.assign(Zi(r,l,o))})).ElseIf(n.equal(Wi(1)),(()=>{s.assign(Zi(u,r,o))})).ElseIf(n.equal(Wi(2)),(()=>{s.assign(Zi(o,r,l))})).ElseIf(n.equal(Wi(3)),(()=>{s.assign(Zi(o,u,r))})).ElseIf(n.equal(Wi(4)),(()=>{s.assign(Zi(l,o,r))})).Else((()=>{s.assign(Zi(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),UT=Ui((([e])=>{const t=Zi(e).toVar(),r=$i(t.x).toVar(),s=$i(t.y).toVar(),i=$i(t.z).toVar(),n=$i(xo(r,xo(s,i))).toVar(),a=$i(bo(r,bo(s,i))).toVar(),o=$i(a.sub(n)).toVar(),u=$i().toVar(),l=$i().toVar(),d=$i().toVar();return d.assign(a),Gi(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),Gi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Gi(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(na(2,i.sub(r).div(o)))})).Else((()=>{u.assign(na(4,r.sub(s).div(o)))})),u.mulAssign(1/6),Gi(u.lessThan(0),(()=>{u.addAssign(1)}))})),Zi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),OT=Ui((([e])=>{const t=Zi(e).toVar(),r=tn(pa(t,Zi(.04045))).toVar(),s=Zi(t.div(12.92)).toVar(),i=Zi(Eo(bo(t.add(Zi(.055)),Zi(0)).div(1.055),Zi(2.4))).toVar();return Fo(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),kT=(e,t)=>{e=$i(e),t=$i(t);const r=Xi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Vo(e.sub(r),e.add(r),t)},GT=(e,t,r,s)=>Fo(e,t,r[s].clamp()),zT=(e,t,r,s,i)=>Fo(e,t,kT(r,s[i])),HT=Ui((([e,t,r])=>{const s=Ka(e).toVar(),i=aa($i(.5).mul(t.sub(r)),Vl).div(s).toVar(),n=aa($i(-.5).mul(t.sub(r)),Vl).div(s).toVar(),a=Zi().toVar();a.x=s.x.greaterThan($i(0)).select(i.x,n.x),a.y=s.y.greaterThan($i(0)).select(i.y,n.y),a.z=s.z.greaterThan($i(0)).select(i.z,n.z);const o=xo(xo(a.x,a.y),a.z).toVar();return Vl.add(s.mul(o)).toVar().sub(r)})),$T=Ui((([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(oa(r,r).sub(oa(s,s)))),n}));var WT=Object.freeze({__proto__:null,BRDF_GGX:Mp,BRDF_Lambert:mp,BasicPointShadowFilter:Ob,BasicShadowFilter:_b,Break:Kc,Const:eu,Continue:()=>Iu("continue").toStack(),DFGApprox:Pp,D_GGX:Ap,Discard:Vu,EPSILON:Fa,F_Schlick:gp,Fn:Ui,INFINITY:Ba,If:Gi,Loop:Xc,NodeAccess:Us,NodeShaderStage:Ds,NodeType:Vs,NodeUpdateType:Is,PCFShadowFilter:vb,PCFSoftShadowFilter:Nb,PI:Da,PI2:Ia,PointShadowFilter:kb,Return:()=>Iu("return").toStack(),Schlick_to_F0:Fp,ScriptableNodeResources:Rx,ShaderNode:Pi,Stack:zi,Switch:(...e)=>si.Switch(...e),TBNViewMatrix:Md,VSMShadowFilter:Sb,V_GGX_SmithCorrelated:wp,Var:Jo,abs:so,acesFilmicToneMapping:gx,acos:to,add:na,addMethodChaining:ni,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:xx,all:Va,alphaT:En,and:fa,anisotropy:An,anisotropyB:Cn,anisotropyT:Rn,any:Ua,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),zi(e)),array:Zn,arrayBuffer:e=>Li(new ti(e,"ArrayBuffer")),asin:eo,assign:ea,atan:ro,atan2:zo,atomicAdd:(e,t)=>Qx(Kx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Qx(Kx.ATOMIC_AND,e,t),atomicFunc:Qx,atomicLoad:e=>Qx(Kx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Qx(Kx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Qx(Kx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Qx(Kx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Qx(Kx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Qx(Kx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Qx(Kx.ATOMIC_XOR,e,t),attenuationColor:Gn,attenuationDistance:kn,attribute:Hu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new Ey(e,r,s);return Hc(i,t,e)},backgroundBlurriness:Ly,backgroundIntensity:Fy,backgroundRotation:By,batch:Oc,billboarding:qf,bitAnd:Ta,bitNot:_a,bitOr:va,bitXor:Na,bitangentGeometry:Sd,bitangentLocal:wd,bitangentView:Ed,bitangentWorld:Ad,bitcast:fo,blendBurn:jy,blendColor:Yy,blendDodge:qy,blendOverlay:Ky,blendScreen:Xy,blur:Lg,bool:qi,buffer:Ju,bufferAttribute:vu,bumpMap:Od,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),jy(e)),bvec2:Qi,bvec3:tn,bvec4:an,bypass:Pu,cache:Cu,call:ra,cameraFar:al,cameraIndex:il,cameraNear:nl,cameraNormalMatrix:cl,cameraPosition:hl,cameraProjectionMatrix:ol,cameraProjectionMatrixInverse:ul,cameraViewMatrix:ll,cameraWorldMatrix:dl,cbrt:Po,cdl:rx,ceil:Xa,checker:Qb,cineonToneMapping:hx,clamp:Bo,clearcoat:bn,clearcoatRoughness:Tn,code:_x,color:Hi,colorSpaceToWorking:pu,colorToDirection:e=>Li(e).mul(2).sub(1),compute:Au,computeSkinning:(e,t=null)=>{const r=new Wc(e);return r.positionNode=Hc(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Cc).toVar(),r.skinIndexNode=Hc(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Cc).toVar(),r.skinWeightNode=Hc(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Cc).toVar(),r.bindMatrixNode=Yn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Yn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ju(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Li(r)},cond:qo,context:Ko,convert:cn,convertColorSpace:(e,t,r)=>Li(new lu(Li(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():_y(e,...t),cos:Za,cross:wo,cubeTexture:dd,cubeToUV:Ub,dFdx:uo,dFdy:lo,dashSize:Bn,debug:Gu,decrement:Ca,decrementBefore:Aa,defaultBuildStages:ks,defaultShaderStages:Os,defined:Ci,degrees:ka,deltaTime:Hf,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Bx(e,Fx(t))},densityFogFactor:Fx,depth:Lh,depthPass:(e,t,r)=>Li(new ux(ux.DEPTH,e,t,r)),difference:No,diffuseColor:mn,directPointLight:Kb,directionToColor:Qh,dispersion:zn,distance:vo,div:ua,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),qy(e)),dot:So,drawIndex:Fc,dynamicBufferAttribute:Nu,element:dn,emissive:fn,equal:da,equals:yo,equirectUV:tp,exp:Ga,exp2:za,expression:Iu,faceDirection:Hl,faceForward:Uo,faceforward:Ho,float:$i,floor:qa,fog:Bx,fract:Ya,frameGroup:jn,frameId:$f,frontFacing:zl,fwidth:go,gain:(e,t)=>e.lessThan(.5)?Df(e.mul(2),t).div(2):aa(1,Df(oa(aa(1,e),2),t).div(2)),gapSize:Dn,getConstNodeType:Mi,getCurrentStack:ki,getDirection:Rg,getDistanceAttenuation:Xb,getGeometryRoughness:Np,getNormalFromDepth:Sy,getParallaxCorrectNormal:HT,getRoughness:Sp,getScreenPosition:Ny,getShIrradianceAt:$T,getShadowMaterial:Eb,getShadowRenderObjectFunction:Cb,getTextureIndex:Pf,getViewPosition:vy,globalId:Hx,glsl:(e,t)=>_x(e,t,"glsl"),glslFn:(e,t)=>Nx(e,t,"glsl"),grayscale:Qy,greaterThan:pa,greaterThanEqual:ma,hash:Bf,highpModelNormalViewMatrix:Fl,highpModelViewMatrix:Ll,hue:ex,increment:Ra,incrementBefore:Ea,instance:Dc,instanceIndex:Cc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new wy(e,r,s);return Hc(i,t,e)},instancedBufferAttribute:Su,instancedDynamicBufferAttribute:wu,instancedMesh:Vc,int:Wi,inverseSqrt:ja,inversesqrt:$o,invocationLocalIndex:Lc,invocationSubgroupIndex:Pc,ior:Vn,iridescence:Nn,iridescenceIOR:Sn,iridescenceThickness:wn,ivec2:Ki,ivec3:Ji,ivec4:sn,js:(e,t)=>_x(e,t,"js"),label:Yo,length:no,lengthSq:Lo,lessThan:ha,lessThanEqual:ga,lightPosition:rb,lightProjectionUV:tb,lightShadowMatrix:eb,lightTargetDirection:nb,lightTargetPosition:sb,lightViewPosition:ib,lightingContext:ih,lights:(e=[])=>Li(new ub).setLights(e),linearDepth:Fh,linearToneMapping:dx,localId:$x,log:Ha,log2:$a,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Ha(r.div(t)));return $i(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),Xc(...e)),luminance:tx,mat2:on,mat3:un,mat4:ln,matcapUV:Tm,materialAO:Sc,materialAlphaTest:zd,materialAnisotropy:oc,materialAnisotropyVector:wc,materialAttenuationColor:mc,materialAttenuationDistance:gc,materialClearcoat:tc,materialClearcoatNormal:sc,materialClearcoatRoughness:rc,materialColor:Hd,materialDispersion:vc,materialEmissive:Wd,materialEnvIntensity:sd,materialEnvRotation:id,materialIOR:pc,materialIridescence:uc,materialIridescenceIOR:lc,materialIridescenceThickness:dc,materialLightMap:Nc,materialLineDashOffset:Tc,materialLineDashSize:yc,materialLineGapSize:xc,materialLineScale:fc,materialLineWidth:bc,materialMetalness:Jd,materialNormal:ec,materialOpacity:jd,materialPointSize:_c,materialReference:fd,materialReflectivity:Qd,materialRefractionRatio:rd,materialRotation:ic,materialRoughness:Zd,materialSheen:nc,materialSheenRoughness:ac,materialShininess:$d,materialSpecular:qd,materialSpecularColor:Kd,materialSpecularIntensity:Xd,materialSpecularStrength:Yd,materialThickness:hc,materialTransmission:cc,max:bo,maxMipLevel:Xu,mediumpModelViewMatrix:Pl,metalness:xn,min:xo,mix:Fo,mixElement:ko,mod:la,modInt:Pa,modelDirection:vl,modelNormalMatrix:Rl,modelPosition:Sl,modelRadius:Al,modelScale:wl,modelViewMatrix:Ml,modelViewPosition:El,modelViewProjection:Ec,modelWorldMatrix:Nl,modelWorldMatrixInverse:Cl,morphReference:eh,mrt:Ff,mul:oa,mx_aastep:kT,mx_cell_noise_float:(e=$u())=>ST(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>$i(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=$u(),t=3,r=2,s=.5,i=1)=>ET(e,Wi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=$u(),t=3,r=2,s=.5,i=1)=>RT(e,Wi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=$u(),t=3,r=2,s=.5,i=1)=>AT(e,Wi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=$u(),t=3,r=2,s=.5,i=1)=>CT(e,Wi(t),r,s).mul(i),mx_hsvtorgb:VT,mx_noise_float:(e=$u(),t=1,r=0)=>vT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=$u(),t=1,r=0)=>NT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=$u(),t=1,r=0)=>{e=e.convert("vec2|vec3");return rn(NT(e),vT(e.add(Xi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=$u())=>GT(e,t,r,"x"),mx_ramptb:(e,t,r=$u())=>GT(e,t,r,"y"),mx_rgbtohsv:UT,mx_safepower:(e,t=1)=>(e=$i(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=$u())=>zT(e,t,r,s,"x"),mx_splittb:(e,t,r,s=$u())=>zT(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:OT,mx_transform_uv:(e=1,t=0,r=$u())=>r.mul(e).add(t),mx_worley_noise_float:(e=$u(),t=1)=>BT(e.convert("vec2|vec3"),t,Wi(1)),mx_worley_noise_vec2:(e=$u(),t=1)=>DT(e.convert("vec2|vec3"),t,Wi(1)),mx_worley_noise_vec3:(e=$u(),t=1)=>IT(e.convert("vec2|vec3"),t,Wi(1)),negate:ao,neutralToneMapping:bx,nodeArray:Bi,nodeImmutable:Ii,nodeObject:Li,nodeObjects:Fi,nodeProxy:Di,normalFlat:jl,normalGeometry:$l,normalLocal:Wl,normalMap:Dd,normalView:ql,normalWorld:Xl,normalize:Ka,not:xa,notEqual:ca,numWorkgroups:Gx,objectDirection:ml,objectGroup:Xn,objectPosition:yl,objectRadius:Tl,objectScale:xl,objectViewPosition:bl,objectWorldMatrix:fl,oneMinus:oo,or:ya,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=zf)=>e.fract(),oscSine:(e=zf)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=zf)=>e.fract().round(),oscTriangle:(e=zf)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Fn,outputStruct:Mf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Ky(e)),overloadingFn:Gf,parabola:Df,parallaxDirection:Pd,parallaxUV:(e,t)=>e.sub(Pd.mul(t)),parameter:(e,t)=>Li(new Sf(e,t)),pass:(e,t,r)=>Li(new ux(ux.COLOR,e,t,r)),passTexture:(e,t)=>Li(new ax(e,t)),pcurve:(e,t,r)=>Eo(ua(Eo(e,t),na(Eo(e,t),Eo(aa(1,e),r))),1/t),perspectiveDepthToViewZ:Ch,pmremTexture:im,pointShadow:jb,pointUV:Ry,pointWidth:In,positionGeometry:Bl,positionLocal:Dl,positionPrevious:Il,positionView:Ol,positionViewDirection:kl,positionWorld:Vl,positionWorldDirection:Ul,posterize:ix,pow:Eo,pow2:Ao,pow3:Ro,pow4:Co,property:pn,radians:Oa,rand:Oo,range:Ux,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Bx(e,Lx(t,r))},rangeFogFactor:Lx,reciprocal:ho,reference:pd,referenceBuffer:gd,reflect:_o,reflectVector:od,reflectView:nd,reflector:e=>Li(new py(e)),refract:Io,refractVector:ud,refractView:ad,reinhardToneMapping:cx,remainder:Ma,remap:Fu,remapClamp:Bu,renderGroup:qn,renderOutput:Ou,rendererReference:yu,rotate:Sm,rotateUV:Wf,roughness:yn,round:co,rtt:_y,sRGBTransferEOTF:nu,sRGBTransferOETF:au,sampler:e=>(!0===e.isNode?e:Yu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Yu(e)).convert("samplerComparison"),saturate:Do,saturation:Zy,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Xy(e)),screenCoordinate:ch,screenSize:dh,screenUV:lh,scriptable:Mx,scriptableValue:wx,select:jo,setCurrentStack:Oi,shaderStages:Gs,shadow:Ib,shadowPositionWorld:db,shapeCircle:Zb,sharedUniformGroup:Wn,sheen:_n,sheenRoughness:vn,shiftLeft:Sa,shiftRight:wa,shininess:Ln,sign:io,sin:Qa,sinc:(e,t)=>Qa(Da.mul(t.mul(e).sub(1))).div(Da.mul(t.mul(e).sub(1))),skinning:jc,smoothstep:Vo,smoothstepElement:Go,specularColor:Mn,specularF90:Pn,spherizeUV:jf,split:(e,t)=>Li(new Ys(Li(e),t)),spritesheetUV:Yf,sqrt:Wa,stack:Ef,step:To,storage:Hc,storageBarrier:()=>jx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Hc(e,t,r).setPBO(!0)),storageTexture:Iy,string:(e="")=>Li(new ti(e,"string")),struct:(e,t=null)=>{const r=new Af(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;ejx("texture").toStack(),textureBicubic:Zp,textureCubeUV:Cg,textureLoad:Qu,textureSize:ju,textureStore:(e,t,r)=>{const s=Iy(e,t,r);return null!==r&&s.toStack(),s},thickness:On,time:zf,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Hf.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),zf.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),zf.mul(e)),toOutputColorSpace:du,toWorkingColorSpace:cu,toneMapping:bu,toneMappingExposure:Tu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Li(new lx(t,r,Li(s),Li(i),Li(n))),transformDirection:Mo,transformNormal:Zl,transformNormalToView:Jl,transformedBentNormalView:Ld,transformedBitangentView:Rd,transformedBitangentWorld:Cd,transformedClearcoatNormalView:Ql,transformedNormalView:Kl,transformedNormalWorld:Yl,transformedTangentView:_d,transformedTangentWorld:vd,transmission:Un,transpose:mo,triNoise3D:Uf,triplanarTexture:(...e)=>Zf(...e),triplanarTextures:Zf,trunc:po,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),Ui(...e)),uint:ji,uniform:Yn,uniformArray:rl,uniformGroup:$n,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Li(new tl(e,t))),userData:(e,t,r)=>Li(new ky(e,t,r)),uv:$u,uvec2:Yi,uvec3:en,uvec4:nn,varying:su,varyingProperty:gn,vec2:Xi,vec3:Zi,vec4:rn,vectorComponents:zs,velocity:Wy,vertexColor:kh,vertexIndex:Rc,vertexStage:iu,vibrance:Jy,viewZToLogarithmicDepth:Mh,viewZToOrthographicDepth:Ah,viewZToPerspectiveDepth:Rh,viewport:hh,viewportBottomLeft:xh,viewportCoordinate:gh,viewportDepthTexture:wh,viewportLinearDepth:Bh,viewportMipTexture:vh,viewportResolution:fh,viewportSafeUV:Xf,viewportSharedTexture:Xh,viewportSize:ph,viewportTexture:_h,viewportTopLeft:yh,viewportUV:mh,wgsl:(e,t)=>_x(e,t,"wgsl"),wgslFn:(e,t)=>Nx(e,t,"wgsl"),workgroupArray:(e,t)=>Li(new Xx("Workgroup",e,t)),workgroupBarrier:()=>jx("workgroup").toStack(),workgroupId:zx,workingToColorSpace:hu,xor:ba});const jT=new Nf;class qT extends Hm{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(jT),jT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(jT),jT.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;jT.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=Ko(rn(u).mul(Fy),{getUV:()=>By.mul(Xl),getTextureLevel:()=>Ly});let h=Ec;h=h.setZ(h.w);const p=new Gh;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=N,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new W(new ke(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=rn(u).mul(Fy),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?jT.set(0,0,0,1):"alpha-blend"===a&&jT.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=jT.r,m.g=jT.g,m.b=jT.b,m.a=jT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.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 XT=0;class KT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=XT++}}class YT{constructor(e,t,r,s,i,n,a,o,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=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new KT(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 QT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class ZT{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 JT{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class e_ extends JT{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class t_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let r_=0;class s_{constructor(e=null){this.id=r_++,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 i_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class n_{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 a_ extends n_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class o_ extends n_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class u_ extends n_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class l_ extends n_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class d_ extends n_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class c_ extends n_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class h_ extends n_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class p_ extends n_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class g_ extends a_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class m_ extends o_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class f_ extends u_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class y_ extends l_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class x_ extends d_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class b_ extends c_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class T_ extends h_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class __ extends p_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const v_=new WeakMap,N_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),S_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class w_{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.observer=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.declarations={},this.flow={code:""},this.chaining=[],this.stack=Ef(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new s_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=v_.get(this.renderer);return void 0===e&&(e=new Um,v_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createRenderTargetArray(e,t,r,s){return new Ge(e,t,r,s)}createCubeRenderTarget(e,t){return new rp(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_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 KT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new KT(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 Gs)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")}( ${S_(n.r)}, ${S_(n.g)}, ${S_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>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 QT(e,t);return this.registerDeclaration(s),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||"samplerComparison"===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===T)return"int";if(t===b)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;let r=Es(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return N_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}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 $e||!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=Ef(this.stack),this.stacks.push(ki()||this.stack),Oi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Oi(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 QT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new i_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}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 a=this.uniforms.index++;n=new ZT(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new JT(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any");let a=n.varying;if(void 0===a){const e=this.varyings,o=e.length;null===t&&(t="nodeVarying"+o),a=new e_(t,r,s,i),e.push(a),this.registerDeclaration(a),n.varying=a}return a}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}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 t_("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}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new vx,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 Sf(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.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new s_,this.stack=Ef();for(const r of ks)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}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,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):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 Gh),e.build(this)}else this.addFlow("compute",e);for(const e of ks){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Gs){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 g_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new m_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new f_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new y_(e);if("color"===t)return new x_(e);if("mat2"===t)return new b_(e);if("mat3"===t)return new T_(e);if("mat4"===t)return new __(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?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,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${We} - Node System\n`}*[Symbol.iterator](){}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class E_{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===Is.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===Is.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===Is.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Is.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===Is.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===Is.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Is.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===Is.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===Is.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 A_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}A_.isNodeFunctionInput=!0;class R_ extends qb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:nb(this.light),lightColor:e}}}const C_=new a,M_=new a;let P_=null;class L_ extends qb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Yn(new r).setGroup(qn),this.halfWidth=Yn(new r).setGroup(qn),this.updateType=Is.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;M_.identity(),C_.copy(t.matrixWorld),C_.premultiply(r),M_.extractRotation(C_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(M_),this.halfHeight.value.applyMatrix4(M_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Yu(P_.LTC_FLOAT_1),r=Yu(P_.LTC_FLOAT_2)):(t=Yu(P_.LTC_HALF_1),r=Yu(P_.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:ib(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){P_=e}}class F_ extends qb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Yn(0).setGroup(qn),this.penumbraCosNode=Yn(0).setGroup(qn),this.cutoffDistanceNode=Yn(0).setGroup(qn),this.decayExponentNode=Yn(0).setGroup(qn)}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 Vo(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(nb(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Xb({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=tb(i,e.context.positionWorld),r=Yu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class B_ extends F_{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=Yu(t,Xi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class D_ extends qb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class I_ extends qb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=rb(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Yn(new e).setGroup(qn)}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=ql.dot(s).mul(.5).add(.5),n=Fo(r,t,i);e.context.irradiance.addAssign(n)}}class V_ extends qb{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=rl(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=$T(Xl,this.lightProbe);e.context.irradiance.addAssign(t)}}class U_{parseFunction(){console.warn("Abstract function.")}}class O_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}O_.isNodeFunction=!0;const k_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,G_=/[a-z_0-9]+/gi,z_="#pragma main";class H_ extends O_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(z_),r=-1!==t?e.slice(t+12):e,s=r.match(k_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=G_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return im(r);{let e;return e=!0===r.isCubeTexture?dd(r):Yu(r),op(e)}}if(!0===r.isTexture)return Yu(r,lh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=pd("color","color",r).setGroup(qn),t=pd("density","float",r).setGroup(qn);return Bx(e,Fx(t))}if(r.isFog){const e=pd("color","color",r).setGroup(qn),t=pd("near","float",r).setGroup(qn),s=pd("far","float",r).setGroup(qn);return Bx(e,Lx(t,s))}console.error("THREE.Renderer: 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){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?dd(r):!0===r.isTexture?Yu(r):void 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+","+e.xr.isPresenting}hasOutputChange(e){return W_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isTextureArray?Oy(e,Zi(lh,sl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Yu(e,lh).renderOutput(t.toneMapping,t.currentColorSpace);return W_.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 E_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const K_=new Pe;class Y_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new iv(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Me,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;uv(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function hv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function pv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);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,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,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 X_(this,r),this._animation=new Vm(this._nodes,this.info),this._attributes=new Km(r),this._background=new qT(this,this._nodes),this._geometries=new Zm(this._attributes,this.info),this._textures=new vf(this,r,this.info),this._pipelines=new af(r,this._nodes),this._bindings=new of(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new zm(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new pf(this.lighting),this._bundles=new J_,this._renderContexts=new Tf,this._animation.start(),this._initialized=!0,e(this)}))),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,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:gv;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 Y_),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._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=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=Ll,this.overrideNodes.modelNormalViewMatrix=Fl):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===Ll&&this.overrideNodes.modelNormalViewMatrix===Fl}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_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,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),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=T,p.viewport=!1===p.viewportValue.equals(fv),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(fv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Y_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?xv:yv;t.isArrayCamera||(bv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(bv,g));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.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=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:w,transparent:E,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&E.length>0&&this._renderTransparents(E,w,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}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.xr&&this.xr.isPresenting||(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.xr&&this.xr.isPresenting||(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 a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.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);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}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)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}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(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.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}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}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,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(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){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=Tv.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=Tv.copy(t).floor()}else t=Tv.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,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;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){const n=t.isArrayCamera?xv:yv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&Tv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(bv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,Tv.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){const n=t.isArrayCamera?xv:yv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),Tv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(bv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Xe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Xe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class vv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class Nv extends vv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Xm-e%Xm)%Xm;var e}get buffer(){return this._buffer}update(){return!0}}class Sv extends Nv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let wv=0;class Ev extends Sv{constructor(e,t){super("UniformBuffer_"+wv++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Av extends Sv{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?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 a=i.node.precision;if(null!==a&&(t=Iv[a]+" "+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!==T){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=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${Uv[s.interpolationType]||s.interpolationType} ${Ov[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${Uv[e.interpolationType]||e.interpolationType} ${Ov[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*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=Vv[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)}Vv[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} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}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 a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new Lv(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new Fv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Bv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new Ev(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new Cv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let zv=null,Hv=null;class $v{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void mt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void mt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return zv=zv||new t,this.renderer.getDrawingBufferSize(zv)}setScissorTest(){}getClearColor(){const e=this.renderer;return Hv=Hv||new Nf,e.getClearColor(Hv),Hv.getRGB(Hv),Hv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:ft(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${We} 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 Wv,jv,qv=0;class Xv{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 Kv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.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===T,id:qv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Xv(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),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.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 Zv,Jv,eN,tN=!1;class rN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===tN&&(this._init(),tN=!0)}_init(){const e=this.gl;Zv={[wr]:e.REPEAT,[Sr]:e.CLAMP_TO_EDGE,[Nr]:e.MIRRORED_REPEAT},Jv={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[He]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[ze]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},eN={[Fr]:e.NEVER,[Lr]:e.ALWAYS,[Ve]:e.LESS,[Pr]:e.LEQUAL,[Mr]:e.EQUAL,[Cr]:e.GEQUAL,[Rr]:e.GREATER,[Ar]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDepthArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture||!0===e.isTextureArray?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:a}=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 o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}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,Zv[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,Zv[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||!0!==t.isDepthArrayTexture&&!1===t.isTextureArray&&r.texParameteri(e,r.TEXTURE_WRAP_R,Zv[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,Jv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,Jv[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,eN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==He&&t.minFilter!==B)return;if(t.type===L&&!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:a,depth:o}=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.isDepthArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture||e.isTextureArray?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),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:a,glType:o}=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,a,o,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:a,glFormat:o,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(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;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-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+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,a,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,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.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 sN{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 iN{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 nN={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",OVR_multiview2:"OVR_multiview2"};class aN{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:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class lN extends $v{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new sN(this),this.capabilities=new iN(this),this.attributeUtils=new Kv(this),this.textureUtils=new rN(this),this.bufferRenderer=new aN(this),this.state=new Yv(this),this.utils=new Qv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e.autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new uN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(mt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):mt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,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"),a=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"+a)}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:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),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,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;enN[t]===e)),r=this.extensions;for(let e=0;e0&&!1===x&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const dN="point-list",cN="line-list",hN="line-strip",pN="triangle-list",gN="triangle-strip",mN="never",fN="less",yN="equal",xN="less-equal",bN="greater",TN="not-equal",_N="greater-equal",vN="always",NN="store",SN="load",wN="clear",EN="ccw",AN="none",RN="front",CN="back",MN="uint16",PN="uint32",LN="r8unorm",FN="r8snorm",BN="r8uint",DN="r8sint",IN="r16uint",VN="r16sint",UN="r16float",ON="rg8unorm",kN="rg8snorm",GN="rg8uint",zN="rg8sint",HN="r32uint",$N="r32sint",WN="r32float",jN="rg16uint",qN="rg16sint",XN="rg16float",KN="rgba8unorm",YN="rgba8unorm-srgb",QN="rgba8snorm",ZN="rgba8uint",JN="rgba8sint",eS="bgra8unorm",tS="bgra8unorm-srgb",rS="rgb9e5ufloat",sS="rgb10a2unorm",iS="rgb10a2unorm",nS="rg32uint",aS="rg32sint",oS="rg32float",uS="rgba16uint",lS="rgba16sint",dS="rgba16float",cS="rgba32uint",hS="rgba32sint",pS="rgba32float",gS="depth16unorm",mS="depth24plus",fS="depth24plus-stencil8",yS="depth32float",xS="depth32float-stencil8",bS="bc1-rgba-unorm",TS="bc1-rgba-unorm-srgb",_S="bc2-rgba-unorm",vS="bc2-rgba-unorm-srgb",NS="bc3-rgba-unorm",SS="bc3-rgba-unorm-srgb",wS="bc4-r-unorm",ES="bc4-r-snorm",AS="bc5-rg-unorm",RS="bc5-rg-snorm",CS="bc6h-rgb-ufloat",MS="bc6h-rgb-float",PS="bc7-rgba-unorm",LS="bc7-rgba-srgb",FS="etc2-rgb8unorm",BS="etc2-rgb8unorm-srgb",DS="etc2-rgb8a1unorm",IS="etc2-rgb8a1unorm-srgb",VS="etc2-rgba8unorm",US="etc2-rgba8unorm-srgb",OS="eac-r11unorm",kS="eac-r11snorm",GS="eac-rg11unorm",zS="eac-rg11snorm",HS="astc-4x4-unorm",$S="astc-4x4-unorm-srgb",WS="astc-5x4-unorm",jS="astc-5x4-unorm-srgb",qS="astc-5x5-unorm",XS="astc-5x5-unorm-srgb",KS="astc-6x5-unorm",YS="astc-6x5-unorm-srgb",QS="astc-6x6-unorm",ZS="astc-6x6-unorm-srgb",JS="astc-8x5-unorm",ew="astc-8x5-unorm-srgb",tw="astc-8x6-unorm",rw="astc-8x6-unorm-srgb",sw="astc-8x8-unorm",iw="astc-8x8-unorm-srgb",nw="astc-10x5-unorm",aw="astc-10x5-unorm-srgb",ow="astc-10x6-unorm",uw="astc-10x6-unorm-srgb",lw="astc-10x8-unorm",dw="astc-10x8-unorm-srgb",cw="astc-10x10-unorm",hw="astc-10x10-unorm-srgb",pw="astc-12x10-unorm",gw="astc-12x10-unorm-srgb",mw="astc-12x12-unorm",fw="astc-12x12-unorm-srgb",yw="clamp-to-edge",xw="repeat",bw="mirror-repeat",Tw="linear",_w="nearest",vw="zero",Nw="one",Sw="src",ww="one-minus-src",Ew="src-alpha",Aw="one-minus-src-alpha",Rw="dst",Cw="one-minus-dst",Mw="dst-alpha",Pw="one-minus-dst-alpha",Lw="src-alpha-saturated",Fw="constant",Bw="one-minus-constant",Dw="add",Iw="subtract",Vw="reverse-subtract",Uw="min",Ow="max",kw=0,Gw=15,zw="keep",Hw="zero",$w="replace",Ww="invert",jw="increment-clamp",qw="decrement-clamp",Xw="increment-wrap",Kw="decrement-wrap",Yw="storage",Qw="read-only-storage",Zw="write-only",Jw="read-only",eE="read-write",tE="non-filtering",rE="comparison",sE="float",iE="unfilterable-float",nE="depth",aE="sint",oE="uint",uE="2d",lE="3d",dE="2d",cE="2d-array",hE="cube",pE="3d",gE="all",mE="vertex",fE="instance",yE={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class xE extends vv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class bE extends xE{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class TE extends Nv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let _E=0;class vE extends TE{constructor(e,t){super("StorageBuffer_"+_E++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Us.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class NE extends Hm{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:Tw}),this.flipYSampler=e.createSampler({minFilter:_w}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\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:gN,stripIndexFormat:PN},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:gN,stripIndexFormat:PN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=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:dE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:dE,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:wN,storeOp:NN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,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:dE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,CE=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,ME={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_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"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 PE extends O_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(RE);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=CE.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 LE extends U_{parseFunction(e){return new PE(e)}}const FE="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},BE={[Us.READ_ONLY]:"read",[Us.WRITE_ONLY]:"write",[Us.READ_WRITE]:"read_write"},DE={[wr]:"repeat",[Sr]:"clamp",[Nr]:"mirror"},IE={vertex:FE?FE.VERTEX:1,fragment:FE?FE.FRAGMENT:2,compute:FE?FE.COMPUTE:4},VE={instance:!0,swizzleAssign:!1,storageBuffer:!0},UE={"^^":"tsl_xor"},OE={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"},kE={},GE={tsl_xor:new Tx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Tx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Tx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Tx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Tx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Tx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Tx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Tx("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 Tx("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 Tx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Tx("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 Tx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Tx("\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")},zE={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)&&(GE.pow_float=new Tx("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),GE.pow_vec2=new Tx("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 ) ); }",[GE.pow_float]),GE.pow_vec3=new Tx("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 ) ); }",[GE.pow_float]),GE.pow_vec4=new Tx("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 ) ); }",[GE.pow_float]),zE.pow_float="tsl_pow_float",zE.pow_vec2="tsl_pow_vec2",zE.pow_vec3="tsl_pow_vec3",zE.pow_vec4="tsl_pow_vec4");let HE="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(HE+="diagnostic( off, derivative_uniformity );\n");class $E extends w_{constructor(e,t){super(e,t,new LE),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_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_${DE[e.wrapS]}S_${DE[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=kE[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===wr?(s.push(GE.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Sr?(s.push(GE.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Nr?(s.push(GE.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",kE[t]=r=new Tx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${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,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Qo(new Du(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isDepthArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Qo(new Du(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Qo(new Du("6u","u32")))}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=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return!0===e.isVideoTexture||!0===e.isStorageTexture?n=`textureLoad( ${t}, ${r} )`:s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}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===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||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 e.isDepthArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`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 a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}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?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=UE[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Us.READ_ONLY:e.access}getStorageAccess(e,t){return BE[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 a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new Lv(i.name,i.node,o,n):"cubeTexture"===t?s=new Fv(i.name,i.node,o,n):"texture3D"===t&&(s=new Bv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(IE[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new bE(`${i.name}_sampler`,i.node,o);e.setVisibility(IE[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?Ev:vE)(e,o);n.setVisibility(IE[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new Cv(u,o),s.setVisibility(IE[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}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","globalId","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"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}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,e.count)};`);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;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;"fragment"!==e&&"compute"!==e||!1!==this.isUnfilterable(t)||!0===i.node.isStorageTextureNode||(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture||!0===t.isTextureArray)s="texture_2d_array";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isDepthArrayTexture?"_array":""}`;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<${AE(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.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 a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;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],a=n.outputNode,o=void 0!==a&&!0===a.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`),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(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",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;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,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 OE[e]||e}isAvailable(e){let t=VE[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),VE[e]=t),t}_getWGSLMethod(e){return void 0!==GE[e]&&this._include(e),zE[e]}_include(e){const t=GE[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// structs\n${e.structs}\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${HE}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\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// structs\n${e.structs}\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 = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.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 WE{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=fS:e.depth&&(t=mS),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?dN:e.isLineSegments||e.isMesh&&!0===t.wireframe?cN:e.isLine?hN:e.isMesh?pN: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(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Me)return eS;if(e===he)return dS;throw new Error("Unsupported outputType")}}const jE=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),qE=new Map([[$e,["float16"]]]),XE=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class KE{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 a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=iE)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=iE:s.sampleType=nE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=aE:e===b?s.sampleType=oE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=sE:s.sampleType=iE)}r.isSampledCubeTexture?s.viewDimension=hE:r.texture.isDataArrayTexture||r.texture.isDepthArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=cE:r.isSampledTexture3D&&(s.viewDimension=pE),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,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.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)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}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 a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=gE;let n;n=t.isSampledCubeTexture?hE:t.isSampledTexture3D?pE:t.texture.isDataArrayTexture||t.texture.isDepthArrayTexture||t.texture.isCompressedArrayTexture?cE:dE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class QE{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:a,fragmentProgram:o}=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;s.blending===k||s.blending===V&&!1===s.transparent||(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})},w={},E=e.context.depth,A=e.context.stencil;if(!0!==E&&!0!==A||(!0===E&&(w.format=v,w.depthWriteEnabled=s.depthWrite,w.depthCompare=_),!0===A&&(w.stencilFront=m,w.stencilBack={},w.stencilReadMask=s.stencilFuncMask,w.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(w.depthBias=s.polygonOffsetUnits,w.depthBiasSlopeScale=s.polygonOffsetFactor,w.depthBiasClamp=0),S.depthStencil=w),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,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===Ke){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:Dw},r={srcFactor:i,dstFactor:n,operation:Dw}};if(e.premultipliedAlpha)switch(s){case V:i(Nw,Aw,Nw,Aw);break;case Bt:i(Nw,Nw,Nw,Nw);break;case Ft:i(vw,ww,vw,Nw);break;case Lt:i(vw,Sw,vw,Ew)}else switch(s){case V:i(Ew,Aw,Nw,Aw);break;case Bt:i(Ew,Nw,Ew,Nw);break;case Ft:i(vw,ww,vw,Nw);break;case Lt:i(vw,Sw,vw,Sw)}}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 Qe:t=vw;break;case Rt:t=Nw;break;case At:t=Sw;break;case vt:t=ww;break;case Et:t=Ew;break;case _t:t=Aw;break;case St:t=Rw;break;case Tt:t=Cw;break;case Nt:t=Mw;break;case bt:t=Pw;break;case wt:t=Lw;break;case 211:t=Fw;break;case 212:t=Bw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Gr:t=mN;break;case kr:t=vN;break;case Or:t=fN;break;case Ur:t=xN;break;case Vr:t=yN;break;case Ir:t=_N;break;case Dr:t=bN;break;case Br:t=TN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Kr:t=zw;break;case Xr:t=Hw;break;case qr:t=$w;break;case jr:t=Ww;break;case Wr:t=jw;break;case $r:t=qw;break;case Hr:t=Xw;break;case zr:t=Kw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Ye:t=Dw;break;case xt:t=Iw;break;case yt:t=Vw;break;case Qr:t=Uw;break;case Yr:t=Ow;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?MN:PN),r.side){case Xe:s.frontFace=EN,s.cullMode=CN;break;case N:s.frontFace=EN,s.cullMode=RN;break;case Se:s.frontFace=EN,s.cullMode=AN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?Gw:kw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=vN;else{const r=e.depthFunc;switch(r){case zt:t=mN;break;case Gt:t=vN;break;case kt:t=fN;break;case Ot:t=xN;break;case Ut:t=yN;break;case Vt:t=_N;break;case It:t=bN;break;case Dt:t=TN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class ZE extends oN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class JE extends $v{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new WE(this),this.attributeUtils=new KE(this),this.bindingUtils=new YE(this),this.pipelineUtils=new QE(this),this.textureUtils=new EE(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,featureLevel:t.compatibilityMode?"compatibility":void 0},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(yE),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}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(yE.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 d}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}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.isDepthArrayTexture&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s0&&(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,{loadOp:SN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=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();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){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.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{t.setPipeline(u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&mt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new lN(e)));super(new t(e),e),this.library=new tA,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class sA extends cs{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class iA{constructor(e,t=rn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Gh;r.name="PostProcessing",this._quadMesh=new xy(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Ou(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class nA extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class aA extends Ey{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class oA extends hs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new ps(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),$i()):Li(new this.nodes[e])}}class uA extends gs{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 lA extends ms{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 oA;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 uA;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.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.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 a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[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=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.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 _s=e=>Ts(e),vs=e=>Ts(e),Ns=(...e)=>Ts(e);function Ss(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of ws(e))r.push(Ts(s.slice(0,-4)),i.getCacheKey(t));return Ts(r)}function*ws(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 Is=Object.freeze({__proto__:null,arrayBufferToBase64:Bs,base64ToArrayBuffer:Ds,getCacheKey:Ss,getDataFromObject:Fs,getLengthFromType:Ms,getNodeChildren:ws,getTypeFromLength:Rs,getTypedArrayFromType:Cs,getValueFromType:Ls,getValueType:Ps,hash:Ns,hashArray:vs,hashString:_s});const Vs={VERTEX:"vertex",FRAGMENT:"fragment"},Us={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Os={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ks={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Gs=["fragment","vertex"],zs=["setup","analyze","generate"],Hs=[...Gs,"compute"],$s=["x","y","z","w"];let Ws=0;class js extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Us.NONE,this.updateBeforeType=Us.NONE,this.updateAfterType=Us.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!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,Us.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Us.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Us.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 ws(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=Ns(Ss(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)}getMemberType(){return"void"}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 t.outputNode||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){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}s&&r.build(e),t.outputNode=r}s=t.outputNode||null}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?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),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 ws(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 qs extends js{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){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Xs extends js{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 Ks extends js{static get type(){return"TempNode"}constructor(e=null){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),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Ys extends Ks{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=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Qs=$s.join("");class Zs extends js{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($s.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 a=r.build(e,n);i=this.components.length===s&&this.components===Qs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${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 Js extends Ks{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)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),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"),li=e=>ui(e).split("").sort().join(""),di={setup(e,t){const r=t.shift();return e(Di(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ni.assign(r,...e),r);if(ai.has(t)){const s=ai.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&ai.has(t.slice(0,t.length-6))){const s=ai.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=ui(t),Bi(new Zs(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=li(t.slice(3).toLowerCase()),r=>Bi(new Js(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=li(t.slice(4).toLowerCase()),()=>Bi(new ei(Bi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Bi(new Zs(e,t));if(!0===/^\d+$/.test(t))return Bi(new qs(r,new si(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Bi(new ii(r,e))}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)},ci=new WeakMap,hi=new WeakMap,pi=function(e,t=null){for(const r in e)e[r]=Bi(e[r],t);return e},gi=function(e,t=null){const r=e.length;for(let s=0;sBi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Ii(l(t)))):null!==r?(r=Bi(r),n=(...s)=>i(new e(t,...Ii(l(s)),r))):n=(...r)=>i(new e(t,...Ii(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},fi=function(e,...t){return Bi(new e(...Ii(t)))};class yi extends js{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}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=hi.get(e.constructor);void 0===s&&(s=new WeakMap,hi.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Bi(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Bi(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Bi(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 xi extends js{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 Di(e),Bi(new yi(this,e))}setup(){return this.call()}}const bi=[!1,!0],Ti=[0,1,2,3],_i=[-1,-2],vi=[.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 bi)Ni.set(e,new si(e));const Si=new Map;for(const e of Ti)Si.set(e,new si(e,"uint"));const wi=new Map([...Si].map((e=>new si(e.value,"int"))));for(const e of _i)wi.set(e,new si(e,"int"));const Ei=new Map([...wi].map((e=>new si(e.value))));for(const e of vi)Ei.set(e,new si(e));for(const e of vi)Ei.set(-e,new si(-e));const Ai={bool:Ni,uint:Si,ints:wi,float:Ei},Ri=new Map([...Ni,...Ei]),Ci=(e,t)=>Ri.has(e)?Ri.get(e):!0===e.isNode?e:new si(e,t),Mi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ls(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Bi(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?Bi(t):Bi(new Xs(t,e))}const s=r.map((e=>Ci(e)));return Bi(new Ys(s,e))}},Pi=e=>"object"==typeof e&&null!==e?e.value:e,Li=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Fi(e,t){return new Proxy(new xi(e,t),di)}const Bi=(e,t=null)=>function(e,t=null){const r=Ps(e);if("node"===r){let t=ci.get(e);return void 0===t&&(t=new Proxy(e,di),ci.set(e,t),ci.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Bi(Ci(e,t)):"shader"===r?ki(e):e}(e,t),Di=(e,t=null)=>new pi(e,t),Ii=(e,t=null)=>new gi(e,t),Vi=(...e)=>new mi(...e),Ui=(...e)=>new fi(...e);let Oi=0;const ki=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Fi(e,r),i=(...e)=>{let t;Di(e),t=e[0]&&e[0].isNode?[...e]:e[0];const i=s.call(t);return"void"===r&&i.toStack(),i};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Oi++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};oi("toGlobal",(e=>(e.global=!0,e)));const Gi=e=>{ni=e},zi=()=>ni,Hi=(...e)=>ni.If(...e);function $i(e){return ni&&ni.add(e),e}oi("toStack",$i);const Wi=new Mi("color"),ji=new Mi("float",Ai.float),qi=new Mi("int",Ai.ints),Xi=new Mi("uint",Ai.uint),Ki=new Mi("bool",Ai.bool),Yi=new Mi("vec2"),Qi=new Mi("ivec2"),Zi=new Mi("uvec2"),Ji=new Mi("bvec2"),en=new Mi("vec3"),tn=new Mi("ivec3"),rn=new Mi("uvec3"),sn=new Mi("bvec3"),nn=new Mi("vec4"),an=new Mi("ivec4"),on=new Mi("uvec4"),un=new Mi("bvec4"),ln=new Mi("mat2"),dn=new Mi("mat3"),cn=new Mi("mat4");oi("toColor",Wi),oi("toFloat",ji),oi("toInt",qi),oi("toUint",Xi),oi("toBool",Ki),oi("toVec2",Yi),oi("toIVec2",Qi),oi("toUVec2",Zi),oi("toBVec2",Ji),oi("toVec3",en),oi("toIVec3",tn),oi("toUVec3",rn),oi("toBVec3",sn),oi("toVec4",nn),oi("toIVec4",an),oi("toUVec4",on),oi("toBVec4",un),oi("toMat2",ln),oi("toMat3",dn),oi("toMat4",cn);const hn=Vi(qs).setParameterLength(2),pn=(e,t)=>Bi(new Xs(Bi(e),t));oi("element",hn),oi("convert",pn);oi("append",(e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),$i(e))));class gn extends js{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 mn=(e,t)=>Bi(new gn(e,t)),fn=(e,t)=>Bi(new gn(e,t,!0)),yn=Ui(gn,"vec4","DiffuseColor"),xn=Ui(gn,"vec3","EmissiveColor"),bn=Ui(gn,"float","Roughness"),Tn=Ui(gn,"float","Metalness"),_n=Ui(gn,"float","Clearcoat"),vn=Ui(gn,"float","ClearcoatRoughness"),Nn=Ui(gn,"vec3","Sheen"),Sn=Ui(gn,"float","SheenRoughness"),wn=Ui(gn,"float","Iridescence"),En=Ui(gn,"float","IridescenceIOR"),An=Ui(gn,"float","IridescenceThickness"),Rn=Ui(gn,"float","AlphaT"),Cn=Ui(gn,"float","Anisotropy"),Mn=Ui(gn,"vec3","AnisotropyT"),Pn=Ui(gn,"vec3","AnisotropyB"),Ln=Ui(gn,"color","SpecularColor"),Fn=Ui(gn,"float","SpecularF90"),Bn=Ui(gn,"float","Shininess"),Dn=Ui(gn,"vec4","Output"),In=Ui(gn,"float","dashSize"),Vn=Ui(gn,"float","gapSize"),Un=Ui(gn,"float","pointWidth"),On=Ui(gn,"float","IOR"),kn=Ui(gn,"float","Transmission"),Gn=Ui(gn,"float","Thickness"),zn=Ui(gn,"float","AttenuationDistance"),Hn=Ui(gn,"color","AttenuationColor"),$n=Ui(gn,"float","Dispersion");class Wn extends js{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 jn=e=>new Wn(e),qn=(e,t=0)=>new Wn(e,!0,t),Xn=qn("frame"),Kn=qn("render"),Yn=jn("object");class Qn extends ti{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Yn}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),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Zn=(e,t)=>{const r=Li(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Bi(new Qn(s,r))};class Jn extends Ks{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const ea=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Jn(null,r.length,r)}else{const r=e[0],s=e[1];t=new Jn(r,s)}return Bi(t)};oi("toArray",((e,t)=>ea(Array(t).fill(e))));class ta extends Ks{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 $s.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),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,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)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Ii(t):Di(t[0]),Bi(new sa(Bi(e),t)));oi("call",ia);const na={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class aa extends Ks{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new aa(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const oa=Vi(aa,"+").setParameterLength(2,1/0).setName("add"),ua=Vi(aa,"-").setParameterLength(2,1/0).setName("sub"),la=Vi(aa,"*").setParameterLength(2,1/0).setName("mul"),da=Vi(aa,"/").setParameterLength(2,1/0).setName("div"),ca=Vi(aa,"%").setParameterLength(2).setName("mod"),ha=Vi(aa,"==").setParameterLength(2).setName("equal"),pa=Vi(aa,"!=").setParameterLength(2).setName("notEqual"),ga=Vi(aa,"<").setParameterLength(2).setName("lessThan"),ma=Vi(aa,">").setParameterLength(2).setName("greaterThan"),fa=Vi(aa,"<=").setParameterLength(2).setName("lessThanEqual"),ya=Vi(aa,">=").setParameterLength(2).setName("greaterThanEqual"),xa=Vi(aa,"&&").setParameterLength(2,1/0).setName("and"),ba=Vi(aa,"||").setParameterLength(2,1/0).setName("or"),Ta=Vi(aa,"!").setParameterLength(1).setName("not"),_a=Vi(aa,"^^").setParameterLength(2).setName("xor"),va=Vi(aa,"&").setParameterLength(2).setName("bitAnd"),Na=Vi(aa,"~").setParameterLength(2).setName("bitNot"),Sa=Vi(aa,"|").setParameterLength(2).setName("bitOr"),wa=Vi(aa,"^").setParameterLength(2).setName("bitXor"),Ea=Vi(aa,"<<").setParameterLength(2).setName("shiftLeft"),Aa=Vi(aa,">>").setParameterLength(2).setName("shiftRight"),Ra=ki((([e])=>(e.addAssign(1),e))),Ca=ki((([e])=>(e.subAssign(1),e))),Ma=ki((([e])=>{const t=qi(e).toConst();return e.addAssign(1),t})),Pa=ki((([e])=>{const t=qi(e).toConst();return e.subAssign(1),t}));oi("add",oa),oi("sub",ua),oi("mul",la),oi("div",da),oi("mod",ca),oi("equal",ha),oi("notEqual",pa),oi("lessThan",ga),oi("greaterThan",ma),oi("lessThanEqual",fa),oi("greaterThanEqual",ya),oi("and",xa),oi("or",ba),oi("not",Ta),oi("xor",_a),oi("bitAnd",va),oi("bitNot",Na),oi("bitOr",Sa),oi("bitXor",wa),oi("shiftLeft",Ea),oi("shiftRight",Aa),oi("incrementBefore",Ra),oi("decrementBefore",Ca),oi("increment",Ma),oi("decrement",Pa);const La=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),ca(e,t)),Fa=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),ca(qi(e),qi(t)));oi("remainder",La),oi("modInt",Fa);class Ba extends Ks{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===Ba.MAX||e===Ba.MIN)&&arguments.length>3){let i=new Ba(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===Ba.LENGTH||t===Ba.DISTANCE||t===Ba.DOT?"float":t===Ba.CROSS?"vec3":t===Ba.ALL||t===Ba.ANY?"bool":t===Ba.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===Ba.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=nn(en(s),0):r=nn(en(r),0);const i=la(r,s).xyz;return Qa(i).build(e,t)}if(r===Ba.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===Ba.ONE_MINUS)return ua(1,n).build(e,t);if(r===Ba.RECIPROCAL)return da(1,n).build(e,t);if(r===Ba.DIFFERENCE)return no(ua(n,a)).build(e,t);{const c=[];return r===Ba.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===Ba.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==Ba.MIN&&r!==Ba.MAX?r===Ba.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===Ba.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===Ba.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==Ba.DFDX&&r!==Ba.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}Ba.ALL="all",Ba.ANY="any",Ba.RADIANS="radians",Ba.DEGREES="degrees",Ba.EXP="exp",Ba.EXP2="exp2",Ba.LOG="log",Ba.LOG2="log2",Ba.SQRT="sqrt",Ba.INVERSE_SQRT="inversesqrt",Ba.FLOOR="floor",Ba.CEIL="ceil",Ba.NORMALIZE="normalize",Ba.FRACT="fract",Ba.SIN="sin",Ba.COS="cos",Ba.TAN="tan",Ba.ASIN="asin",Ba.ACOS="acos",Ba.ATAN="atan",Ba.ABS="abs",Ba.SIGN="sign",Ba.LENGTH="length",Ba.NEGATE="negate",Ba.ONE_MINUS="oneMinus",Ba.DFDX="dFdx",Ba.DFDY="dFdy",Ba.ROUND="round",Ba.RECIPROCAL="reciprocal",Ba.TRUNC="trunc",Ba.FWIDTH="fwidth",Ba.TRANSPOSE="transpose",Ba.BITCAST="bitcast",Ba.EQUALS="equals",Ba.MIN="min",Ba.MAX="max",Ba.STEP="step",Ba.REFLECT="reflect",Ba.DISTANCE="distance",Ba.DIFFERENCE="difference",Ba.DOT="dot",Ba.CROSS="cross",Ba.POW="pow",Ba.TRANSFORM_DIRECTION="transformDirection",Ba.MIX="mix",Ba.CLAMP="clamp",Ba.REFRACT="refract",Ba.SMOOTHSTEP="smoothstep",Ba.FACEFORWARD="faceforward";const Da=ji(1e-6),Ia=ji(1e6),Va=ji(Math.PI),Ua=ji(2*Math.PI),Oa=Vi(Ba,Ba.ALL).setParameterLength(1),ka=Vi(Ba,Ba.ANY).setParameterLength(1),Ga=Vi(Ba,Ba.RADIANS).setParameterLength(1),za=Vi(Ba,Ba.DEGREES).setParameterLength(1),Ha=Vi(Ba,Ba.EXP).setParameterLength(1),$a=Vi(Ba,Ba.EXP2).setParameterLength(1),Wa=Vi(Ba,Ba.LOG).setParameterLength(1),ja=Vi(Ba,Ba.LOG2).setParameterLength(1),qa=Vi(Ba,Ba.SQRT).setParameterLength(1),Xa=Vi(Ba,Ba.INVERSE_SQRT).setParameterLength(1),Ka=Vi(Ba,Ba.FLOOR).setParameterLength(1),Ya=Vi(Ba,Ba.CEIL).setParameterLength(1),Qa=Vi(Ba,Ba.NORMALIZE).setParameterLength(1),Za=Vi(Ba,Ba.FRACT).setParameterLength(1),Ja=Vi(Ba,Ba.SIN).setParameterLength(1),eo=Vi(Ba,Ba.COS).setParameterLength(1),to=Vi(Ba,Ba.TAN).setParameterLength(1),ro=Vi(Ba,Ba.ASIN).setParameterLength(1),so=Vi(Ba,Ba.ACOS).setParameterLength(1),io=Vi(Ba,Ba.ATAN).setParameterLength(1,2),no=Vi(Ba,Ba.ABS).setParameterLength(1),ao=Vi(Ba,Ba.SIGN).setParameterLength(1),oo=Vi(Ba,Ba.LENGTH).setParameterLength(1),uo=Vi(Ba,Ba.NEGATE).setParameterLength(1),lo=Vi(Ba,Ba.ONE_MINUS).setParameterLength(1),co=Vi(Ba,Ba.DFDX).setParameterLength(1),ho=Vi(Ba,Ba.DFDY).setParameterLength(1),po=Vi(Ba,Ba.ROUND).setParameterLength(1),go=Vi(Ba,Ba.RECIPROCAL).setParameterLength(1),mo=Vi(Ba,Ba.TRUNC).setParameterLength(1),fo=Vi(Ba,Ba.FWIDTH).setParameterLength(1),yo=Vi(Ba,Ba.TRANSPOSE).setParameterLength(1),xo=Vi(Ba,Ba.BITCAST).setParameterLength(2),bo=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),ha(e,t)),To=Vi(Ba,Ba.MIN).setParameterLength(2,1/0),_o=Vi(Ba,Ba.MAX).setParameterLength(2,1/0),vo=Vi(Ba,Ba.STEP).setParameterLength(2),No=Vi(Ba,Ba.REFLECT).setParameterLength(2),So=Vi(Ba,Ba.DISTANCE).setParameterLength(2),wo=Vi(Ba,Ba.DIFFERENCE).setParameterLength(2),Eo=Vi(Ba,Ba.DOT).setParameterLength(2),Ao=Vi(Ba,Ba.CROSS).setParameterLength(2),Ro=Vi(Ba,Ba.POW).setParameterLength(2),Co=Vi(Ba,Ba.POW,2).setParameterLength(1),Mo=Vi(Ba,Ba.POW,3).setParameterLength(1),Po=Vi(Ba,Ba.POW,4).setParameterLength(1),Lo=Vi(Ba,Ba.TRANSFORM_DIRECTION).setParameterLength(2),Fo=e=>la(ao(e),Ro(no(e),1/3)),Bo=e=>Eo(e,e),Do=Vi(Ba,Ba.MIX).setParameterLength(3),Io=(e,t=0,r=1)=>Bi(new Ba(Ba.CLAMP,Bi(e),Bi(t),Bi(r))),Vo=e=>Io(e),Uo=Vi(Ba,Ba.REFRACT).setParameterLength(3),Oo=Vi(Ba,Ba.SMOOTHSTEP).setParameterLength(3),ko=Vi(Ba,Ba.FACEFORWARD).setParameterLength(3),Go=ki((([e])=>{const t=Eo(e.xy,Yi(12.9898,78.233)),r=ca(t,Va);return Za(Ja(r).mul(43758.5453))})),zo=(e,t,r)=>Do(t,r,e),Ho=(e,t,r)=>Oo(t,r,e),$o=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),io(e,t)),Wo=ko,jo=Xa;oi("all",Oa),oi("any",ka),oi("equals",bo),oi("radians",Ga),oi("degrees",za),oi("exp",Ha),oi("exp2",$a),oi("log",Wa),oi("log2",ja),oi("sqrt",qa),oi("inverseSqrt",Xa),oi("floor",Ka),oi("ceil",Ya),oi("normalize",Qa),oi("fract",Za),oi("sin",Ja),oi("cos",eo),oi("tan",to),oi("asin",ro),oi("acos",so),oi("atan",io),oi("abs",no),oi("sign",ao),oi("length",oo),oi("lengthSq",Bo),oi("negate",uo),oi("oneMinus",lo),oi("dFdx",co),oi("dFdy",ho),oi("round",po),oi("reciprocal",go),oi("trunc",mo),oi("fwidth",fo),oi("atan2",$o),oi("min",To),oi("max",_o),oi("step",vo),oi("reflect",No),oi("distance",So),oi("dot",Eo),oi("cross",Ao),oi("pow",Ro),oi("pow2",Co),oi("pow3",Mo),oi("pow4",Po),oi("transformDirection",Lo),oi("mix",zo),oi("clamp",Io),oi("refract",Uo),oi("smoothstep",Ho),oi("faceForward",ko),oi("difference",wo),oi("saturate",Vo),oi("cbrt",Fo),oi("transpose",yo),oi("rand",Go);class qo extends js{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}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:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?mn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const Xo=Vi(qo).setParameterLength(2,3);oi("select",Xo);const Ko=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),Xo(...e));oi("cond",Ko);class Yo extends js{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 Qo=Vi(Yo).setParameterLength(1,2),Zo=(e,t)=>Qo(e,{label:t});oi("context",Qo),oi("label",Zo);class Jo extends js{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const eu=Vi(Jo),tu=(e,t=null)=>eu(e,t).toStack(),ru=(e,t=null)=>eu(e,t,!0).toStack();oi("toVar",tu),oi("toConst",ru);const su=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),eu(e));oi("temp",su);class iu extends js{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null}isGlobal(){return!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}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),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),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),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Vs.VERTEX);e.flowNodeFromShaderStage(Vs.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const nu=Vi(iu).setParameterLength(1,2),au=e=>nu(e);oi("toVarying",nu),oi("toVertexStage",au),oi("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),nu(...e)))),oi("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),nu(...e))));const ou=ki((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Do(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),uu=ki((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Do(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),lu="WorkingColorSpace",du="OutputColorSpace";class cu extends Ks{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===lu?c.workingColorSpace:t===du?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 i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=nn(ou(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=nn(dn(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=nn(uu(i.rgb),i.a)),i):i}}const hu=e=>Bi(new cu(Bi(e),lu,du)),pu=e=>Bi(new cu(Bi(e),du,lu)),gu=(e,t)=>Bi(new cu(Bi(e),lu,t)),mu=(e,t)=>Bi(new cu(Bi(e),t,lu));oi("toOutputColorSpace",hu),oi("toWorkingColorSpace",pu),oi("workingToColorSpace",gu),oi("colorSpaceToWorking",mu);let fu=class extends qs{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 yu extends js{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=Us.OBJECT}setGroup(e){return this.group=e,this}element(e){return Bi(new fu(this,Bi(e)))}setNodeType(e){const t=Zn(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;eBi(new xu(e,t,r));class Tu extends Ks{static get type(){return"ToneMappingNode"}constructor(e,t=vu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Ns(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=nn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const _u=(e,t,r)=>Bi(new Tu(e,Bi(t),Bi(r))),vu=bu("toneMappingExposure","float");oi("toneMapping",((e,t,r)=>_u(t,r,e)));class Nu extends ti{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=g,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,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,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=nu(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 Su=(e,t=null,r=0,s=0)=>Bi(new Nu(e,t,r,s)),wu=(e,t=null,r=0,s=0)=>Su(e,t,r,s).setUsage(y),Eu=(e,t=null,r=0,s=0)=>Su(e,t,r,s).setInstanced(!0),Au=(e,t=null,r=0,s=0)=>wu(e,t,r,s).setInstanced(!0);oi("toAttribute",(e=>Su(e.value)));class Ru extends js{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.name="",this.updateBeforeType=Us.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eBi(new Ru(Bi(e),t,r));oi("compute",Cu);class Mu extends js{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}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 Pu=(e,t)=>Bi(new Mu(Bi(e),t));oi("cache",Pu);class Lu extends js{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 Fu=Vi(Lu).setParameterLength(2);oi("bypass",Fu);class Bu extends js{static get type(){return"RemapNode"}constructor(e,t,r,s=ji(0),i=ji(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 a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Du=Vi(Bu,null,null,{doClamp:!1}).setParameterLength(3,5),Iu=Vi(Bu).setParameterLength(3,5);oi("remap",Du),oi("remapClamp",Iu);class Vu extends js{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 Uu=Vi(Vu).setParameterLength(1,2),Ou=e=>(e?Xo(e,Uu("discard")):Uu("discard")).toStack();oi("discard",Ou);class ku extends Ks{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)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Gu=(e,t=null,r=null)=>Bi(new ku(Bi(e),t,r));oi("renderOutput",Gu);class zu extends Ks{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const Hu=(e,t=null)=>Bi(new zu(Bi(e),t));oi("debug",Hu);class $u extends js{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 nu(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 Wu=(e,t=null)=>Bi(new $u(e,t)),ju=(e=0)=>Wu("uv"+(e>0?e:""),"vec2");class qu extends js{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 Xu=Vi(qu).setParameterLength(1,2);class Ku extends Qn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Us.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=Vi(Ku).setParameterLength(1);class Qu extends Qn{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=Us.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===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return ju(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Zn(this.value.matrix)),this._matrixUniform.mul(en(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Us.OBJECT:Us.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(qi(Xu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,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,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.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);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=mu(Uu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,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=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}blur(e){const t=this.clone();t.biasNode=Bi(e).mul(Yu(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Bi(t)}level(e){const t=this.clone();return t.levelNode=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}size(e){return Xu(this,e)}bias(e){const t=this.clone();return t.biasNode=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}compare(e){const t=this.clone();return t.compareNode=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Bi(e),Bi(t)],r.referenceNode=this.getSelf(),Bi(r)}depth(e){const t=this.clone();return t.depthNode=Bi(e),t.referenceNode=this.getSelf(),Bi(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.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const Zu=Vi(Qu).setParameterLength(1,4),Ju=(...e)=>Zu(...e).setSampler(!1);class el extends Qn{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)=>Bi(new el(e,t,r));class rl extends qs{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 sl extends el{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ps(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Us.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;rBi(new sl(e,t));const nl=Vi(class extends js{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),al=Zn(0,"uint").label("u_cameraIndex").setGroup(qn("cameraIndex")).toVarying("v_cameraIndex"),ol=Zn("float").label("cameraNear").setGroup(Kn).onRenderUpdate((({camera:e})=>e.near)),ul=Zn("float").label("cameraFar").setGroup(Kn).onRenderUpdate((({camera:e})=>e.far)),ll=ki((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=il(r).setGroup(Kn).label("cameraProjectionMatrices").element(e.isMultiViewCamera?nl("gl_ViewID_OVR"):al).toVar("cameraProjectionMatrix")}else t=Zn("mat4").label("cameraProjectionMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),dl=ki((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=il(r).setGroup(Kn).label("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?nl("gl_ViewID_OVR"):al).toVar("cameraProjectionMatrixInverse")}else t=Zn("mat4").label("cameraProjectionMatrixInverse").setGroup(Kn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse));return t})).once()(),cl=ki((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=il(r).setGroup(Kn).label("cameraViewMatrices").element(e.isMultiViewCamera?nl("gl_ViewID_OVR"):al).toVar("cameraViewMatrix")}else t=Zn("mat4").label("cameraViewMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),hl=Zn("mat4").label("cameraWorldMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.matrixWorld)),pl=Zn("mat3").label("cameraNormalMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.normalMatrix)),gl=Zn(new r).label("cameraPosition").setGroup(Kn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),ml=new v;class fl extends js{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Us.OBJECT,this._uniformNode=new Qn(null)}getNodeType(){const e=this.scope;return e===fl.WORLD_MATRIX?"mat4":e===fl.POSITION||e===fl.VIEW_POSITION||e===fl.DIRECTION||e===fl.SCALE?"vec3":e===fl.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===fl.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===fl.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===fl.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===fl.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===fl.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===fl.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ml.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ml.radius}}generate(e){const t=this.scope;return t===fl.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===fl.POSITION||t===fl.VIEW_POSITION||t===fl.DIRECTION||t===fl.SCALE?this._uniformNode.nodeType="vec3":t===fl.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}fl.WORLD_MATRIX="worldMatrix",fl.POSITION="position",fl.SCALE="scale",fl.VIEW_POSITION="viewPosition",fl.DIRECTION="direction",fl.RADIUS="radius";const yl=Vi(fl,fl.DIRECTION).setParameterLength(1),xl=Vi(fl,fl.WORLD_MATRIX).setParameterLength(1),bl=Vi(fl,fl.POSITION).setParameterLength(1),Tl=Vi(fl,fl.SCALE).setParameterLength(1),_l=Vi(fl,fl.VIEW_POSITION).setParameterLength(1),vl=Vi(fl,fl.RADIUS).setParameterLength(1);class Nl extends fl{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Sl=Ui(Nl,Nl.DIRECTION),wl=Ui(Nl,Nl.WORLD_MATRIX),El=Ui(Nl,Nl.POSITION),Al=Ui(Nl,Nl.SCALE),Rl=Ui(Nl,Nl.VIEW_POSITION),Cl=Ui(Nl,Nl.RADIUS),Ml=Zn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),Pl=Zn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Ll=ki((e=>e.renderer.overrideNodes.modelViewMatrix||Fl)).once()().toVar("modelViewMatrix"),Fl=cl.mul(wl),Bl=ki((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Zn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),Dl=ki((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Zn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Il=Wu("position","vec3"),Vl=Il.toVarying("positionLocal"),Ul=Il.toVarying("positionPrevious"),Ol=wl.mul(Vl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),kl=Vl.transformDirection(wl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Gl=ki((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),zl=Gl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Hl extends js{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const $l=Ui(Hl),Wl=ji($l).mul(2).sub(1),jl=Wu("normal","vec3"),ql=ki((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),en(0,1,0)):jl),"vec3").once()().toVar("normalLocal"),Xl=Gl.dFdx().cross(Gl.dFdy()).normalize().toVar("normalFlat"),Kl=ki((e=>{let t;return t=!0===e.material.flatShading?Xl:nu(td(ql),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),Yl=ki((e=>{let t=Kl.transformDirection(cl);return!0!==e.material.flatShading&&(t=nu(t,"v_normalWorld")),t}),"vec3").once()().normalize().toVar("normalWorld"),Ql=ki((e=>{let t=e.context.setupNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul(Wl)),t}),"vec3").once()().toVar("transformedNormalView"),Zl=Ql.transformDirection(cl).toVar("transformedNormalWorld"),Jl=ki((e=>{let t=e.context.setupClearcoatNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul(Wl)),t}),"vec3").once()().toVar("transformedClearcoatNormalView"),ed=ki((([e,t=wl])=>{const r=dn(t),s=e.div(en(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),td=ki((([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Ml.mul(e);return cl.transformDirection(s)})),rd=new S,sd=new a,id=Zn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),nd=Zn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),ad=Zn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(rd.copy(r),sd.makeRotationFromEuler(rd)):sd.identity(),sd})),od=zl.negate().reflect(Ql),ud=zl.negate().refract(Ql,id),ld=od.transformDirection(cl).toVar("reflectVector"),dd=ud.transformDirection(cl).toVar("reflectVector");class cd extends Qu{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===w?ld:e.mapping===E?dd:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),en(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=en(t.x.negate(),t.yz)),ad.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const hd=Vi(cd).setParameterLength(1,4).setName("cubeTexture");class pd extends qs{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 gd extends js{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=Us.OBJECT}element(e){return Bi(new pd(this,Bi(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())?il(null,e):"texture"===e?Zu(null):"cubeTexture"===e?hd(null):Zn(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;eBi(new gd(e,t,r)),fd=(e,t,r,s)=>Bi(new gd(e,t,s,r));class yd extends gd{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 xd=(e,t,r=null)=>Bi(new yd(e,t,r)),bd=ki((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Wu("tangent","vec4"))))(),Td=bd.xyz.toVar("tangentLocal"),_d=Ll.mul(nn(Td,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),vd=_d.transformDirection(cl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Nd=_d.toVar("transformedTangentView"),Sd=Nd.transformDirection(cl).normalize().toVar("transformedTangentWorld"),wd=ki((([e,t],r)=>{let s=e.mul(bd.w).xyz;return!0!==r.material.flatShading&&(s=nu(e,t)),s})).once(),Ed=wd(jl.cross(bd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Ad=wd(ql.cross(Td),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Rd=wd(Kl.cross(_d),"v_bitangentView").normalize().toVar("bitangentView"),Cd=wd(Yl.cross(vd),"v_bitangentWorld").normalize().toVar("bitangentWorld"),Md=wd(Ql.cross(Nd),"v_transformedBitangentView").normalize().toVar("transformedBitangentView"),Pd=Md.transformDirection(cl).normalize().toVar("transformedBitangentWorld"),Ld=dn(_d,Rd,Kl),Fd=zl.mul(Ld),Bd=(()=>{let e=Pn.cross(zl);return e=e.cross(Pn).normalize(),e=Do(e,Ql,Cn.mul(bn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),Dd=ki((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Wl.mul(g.inverseSqrt());return oa(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Id extends Ks{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=en(s.xy.mul(r),s.z));let i=null;if(t===R)i=td(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Ld.mul(s).normalize():Dd({eye_pos:Gl,surf_norm:Kl,mapN:s,uv:ju()})}return i}}const Vd=Vi(Id).setParameterLength(1,2),Ud=ki((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||ju()),forceUVContext:!0}),s=ji(r((e=>e)));return Yi(ji(r((e=>e.add(e.dFdx())))).sub(s),ji(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Od=ki((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Wl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class kd extends Ks{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=Ud({textureNode:this.textureNode,bumpScale:e});return Od({surf_pos:Gl,surf_norm:Kl,dHdxy:t})}}const Gd=Vi(kd).setParameterLength(1,2),zd=new Map;class Hd extends js{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=zd.get(e);return void 0===r&&(r=xd(e,t),zd.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===Hd.COLOR){const e=void 0!==t.color?this.getColor(r):en();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Hd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Hd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:ji(1);else if(r===Hd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Hd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Hd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Hd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Hd.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===Hd.NORMAL)t.normalMap?(s=Vd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Gd(this.getTexture("bump").r,this.getFloat("bumpScale")):Kl;else if(r===Hd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Hd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Hd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Vd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Kl;else if(r===Hd.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===Hd.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===Hd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=ln(Ac.x,Ac.y,Ac.y.negate(),Ac.x).mul(e.rg.mul(2).sub(Yi(1)).normalize().mul(e.b))}else s=Ac;else if(r===Hd.IRIDESCENCE_THICKNESS){const e=md("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=md("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Hd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Hd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Hd.IOR)s=this.getFloat(r);else if(r===Hd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Hd.AO)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}}Hd.ALPHA_TEST="alphaTest",Hd.COLOR="color",Hd.OPACITY="opacity",Hd.SHININESS="shininess",Hd.SPECULAR="specular",Hd.SPECULAR_STRENGTH="specularStrength",Hd.SPECULAR_INTENSITY="specularIntensity",Hd.SPECULAR_COLOR="specularColor",Hd.REFLECTIVITY="reflectivity",Hd.ROUGHNESS="roughness",Hd.METALNESS="metalness",Hd.NORMAL="normal",Hd.CLEARCOAT="clearcoat",Hd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Hd.CLEARCOAT_NORMAL="clearcoatNormal",Hd.EMISSIVE="emissive",Hd.ROTATION="rotation",Hd.SHEEN="sheen",Hd.SHEEN_ROUGHNESS="sheenRoughness",Hd.ANISOTROPY="anisotropy",Hd.IRIDESCENCE="iridescence",Hd.IRIDESCENCE_IOR="iridescenceIOR",Hd.IRIDESCENCE_THICKNESS="iridescenceThickness",Hd.IOR="ior",Hd.TRANSMISSION="transmission",Hd.THICKNESS="thickness",Hd.ATTENUATION_DISTANCE="attenuationDistance",Hd.ATTENUATION_COLOR="attenuationColor",Hd.LINE_SCALE="scale",Hd.LINE_DASH_SIZE="dashSize",Hd.LINE_GAP_SIZE="gapSize",Hd.LINE_WIDTH="linewidth",Hd.LINE_DASH_OFFSET="dashOffset",Hd.POINT_SIZE="size",Hd.DISPERSION="dispersion",Hd.LIGHT_MAP="light",Hd.AO="ao";const $d=Ui(Hd,Hd.ALPHA_TEST),Wd=Ui(Hd,Hd.COLOR),jd=Ui(Hd,Hd.SHININESS),qd=Ui(Hd,Hd.EMISSIVE),Xd=Ui(Hd,Hd.OPACITY),Kd=Ui(Hd,Hd.SPECULAR),Yd=Ui(Hd,Hd.SPECULAR_INTENSITY),Qd=Ui(Hd,Hd.SPECULAR_COLOR),Zd=Ui(Hd,Hd.SPECULAR_STRENGTH),Jd=Ui(Hd,Hd.REFLECTIVITY),ec=Ui(Hd,Hd.ROUGHNESS),tc=Ui(Hd,Hd.METALNESS),rc=Ui(Hd,Hd.NORMAL),sc=Ui(Hd,Hd.CLEARCOAT),ic=Ui(Hd,Hd.CLEARCOAT_ROUGHNESS),nc=Ui(Hd,Hd.CLEARCOAT_NORMAL),ac=Ui(Hd,Hd.ROTATION),oc=Ui(Hd,Hd.SHEEN),uc=Ui(Hd,Hd.SHEEN_ROUGHNESS),lc=Ui(Hd,Hd.ANISOTROPY),dc=Ui(Hd,Hd.IRIDESCENCE),cc=Ui(Hd,Hd.IRIDESCENCE_IOR),hc=Ui(Hd,Hd.IRIDESCENCE_THICKNESS),pc=Ui(Hd,Hd.TRANSMISSION),gc=Ui(Hd,Hd.THICKNESS),mc=Ui(Hd,Hd.IOR),fc=Ui(Hd,Hd.ATTENUATION_DISTANCE),yc=Ui(Hd,Hd.ATTENUATION_COLOR),xc=Ui(Hd,Hd.LINE_SCALE),bc=Ui(Hd,Hd.LINE_DASH_SIZE),Tc=Ui(Hd,Hd.LINE_GAP_SIZE),_c=Ui(Hd,Hd.LINE_WIDTH),vc=Ui(Hd,Hd.LINE_DASH_OFFSET),Nc=Ui(Hd,Hd.POINT_SIZE),Sc=Ui(Hd,Hd.DISPERSION),wc=Ui(Hd,Hd.LIGHT_MAP),Ec=Ui(Hd,Hd.AO),Ac=Zn(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))})),Rc=ki((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Cc extends js{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===Cc.VERTEX)s=e.getVertexIndex();else if(r===Cc.INSTANCE)s=e.getInstanceIndex();else if(r===Cc.DRAW)s=e.getDrawIndex();else if(r===Cc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Cc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Cc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=nu(this).build(e,t)}return i}}Cc.VERTEX="vertex",Cc.INSTANCE="instance",Cc.SUBGROUP="subgroup",Cc.INVOCATION_LOCAL="invocationLocal",Cc.INVOCATION_SUBGROUP="invocationSubgroup",Cc.DRAW="draw";const Mc=Ui(Cc,Cc.VERTEX),Pc=Ui(Cc,Cc.INSTANCE),Lc=Ui(Cc,Cc.SUBGROUP),Fc=Ui(Cc,Cc.INVOCATION_SUBGROUP),Bc=Ui(Cc,Cc.INVOCATION_LOCAL),Dc=Ui(Cc,Cc.DRAW);class Ic extends js{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Us.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(Pc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?Au:Eu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=cn(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?Au:Eu;this.bufferColor=e,n=en(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Vl).xyz;if(Vl.assign(a),e.hasGeometryAttribute("normal")){const e=ed(ql,i);ql.assign(e)}null!==this.instanceColorNode&&fn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Vc=Vi(Ic).setParameterLength(2,3);class Uc extends Ic{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Oc=Vi(Uc).setParameterLength(1);class kc extends js{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=Pc:this.batchingIdNode=Dc);const t=ki((([e])=>{const t=qi(Xu(Ju(this.batchMesh._indirectTexture),0).x),r=qi(e).mod(t),s=qi(e).div(t);return Ju(this.batchMesh._indirectTexture,Qi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(qi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=qi(Xu(Ju(s),0).x),n=ji(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=cn(Ju(s,Qi(a,o)),Ju(s,Qi(a.add(1),o)),Ju(s,Qi(a.add(2),o)),Ju(s,Qi(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=ki((([e])=>{const t=qi(Xu(Ju(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Ju(l,Qi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);fn("vec3","vBatchColor").assign(t)}const d=dn(u);Vl.assign(u.mul(Vl));const c=ql.div(en(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;ql.assign(h),e.hasGeometryAttribute("tangent")&&Td.mulAssign(d)}}const Gc=Vi(kc).setParameterLength(1);class zc extends qs{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}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}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 Hc=Vi(zc).setParameterLength(2);class $c extends el{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Rs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ks.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,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 Hc(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ks.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Su(this.value),this._varying=nu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.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(null!==this.structTypeNode&&this.structTypeNode.build(e),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 Wc=(e,t=null,r=0)=>Bi(new $c(e,t,r)),jc=new WeakMap;class qc extends js{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Us.OBJECT,this.skinIndexNode=Wu("skinIndex","uvec4"),this.skinWeightNode=Wu("skinWeight","vec4"),this.bindMatrixNode=md("bindMatrix","mat4"),this.bindMatrixInverseNode=md("bindMatrixInverse","mat4"),this.boneMatricesNode=fd("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Vl,this.toPositionNode=Vl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=oa(a.mul(s.x).mul(d),o.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=ql){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=oa(s.x.mul(a),s.y.mul(o),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=fd("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ul)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Fs(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Ul.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();ql.assign(t),e.hasGeometryAttribute("tangent")&&Td.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;jc.get(t)!==e.frameId&&(jc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const Xc=e=>Bi(new qc(e));class Kc extends js{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+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(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\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;tBi(new Kc(Ii(e,"int"))).toStack(),Qc=()=>Uu("break").toStack(),Zc=new WeakMap,Jc=new s,eh=ki((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=qi(Mc).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Ju(e,Qi(u,o)).depth(i).xyz.mul(t)}));class th extends js{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Zn(1),this.updateType=Us.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,a=void 0!==n?n.length:0,{texture:o,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,a=void 0!==n?n.length:0;let o=Zc.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.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*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=ji(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Ju(this.mesh.morphTexture,Qi(qi(e).add(1),qi(Pc))).r):t.assign(md("morphTargetInfluences","float").element(e).toVar()),Hi(t.notEqual(0),(()=>{!0===s&&Vl.addAssign(eh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:qi(0)})),!0===i&&ql.addAssign(eh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:qi(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 rh=Vi(th).setParameterLength(1);class sh extends js{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class ih extends sh{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class nh extends Yo{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:en().toVar("directDiffuse"),directSpecular:en().toVar("directSpecular"),indirectDiffuse:en().toVar("indirectDiffuse"),indirectSpecular:en().toVar("indirectSpecular")};return{radiance:en().toVar("radiance"),irradiance:en().toVar("irradiance"),iblIrradiance:en().toVar("iblIrradiance"),ambientOcclusion:ji(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 ah=Vi(nh);class oh extends sh{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let uh,lh;class dh extends js{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===dh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Us.NONE;return this.scope!==dh.SIZE&&this.scope!==dh.VIEWPORT||(e=Us.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===dh.VIEWPORT?null!==t?lh.copy(t.viewport):(e.getViewport(lh),lh.multiplyScalar(e.getPixelRatio())):null!==t?(uh.width=t.width,uh.height=t.height):e.getDrawingBufferSize(uh)}setup(){const e=this.scope;let r=null;return r=e===dh.SIZE?Zn(uh||(uh=new t)):e===dh.VIEWPORT?Zn(lh||(lh=new s)):Yi(ph.div(hh)),r}generate(e){if(this.scope===dh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(hh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}dh.COORDINATE="coordinate",dh.VIEWPORT="viewport",dh.SIZE="size",dh.UV="uv";const ch=Ui(dh,dh.UV),hh=Ui(dh,dh.SIZE),ph=Ui(dh,dh.COORDINATE),gh=Ui(dh,dh.VIEWPORT),mh=gh.zw,fh=ph.sub(gh.xy),yh=fh.div(mh),xh=ki((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),hh)),"vec2").once()(),bh=ki((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),ch)),"vec2").once()(),Th=ki((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),ch.flipY())),"vec2").once()(),_h=new t;class vh extends Qu{static get type(){return"ViewportTextureNode"}constructor(e=ch,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Us.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(_h);const r=this.value;r.image.width===_h.width&&r.image.height===_h.height||(r.image.width=_h.width,r.image.height=_h.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 Nh=Vi(vh).setParameterLength(0,3),Sh=Vi(vh,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let wh=null;class Eh extends vh{static get type(){return"ViewportDepthTextureNode"}constructor(e=ch,t=null){null===wh&&(wh=new D),super(e,t,wh)}}const Ah=Vi(Eh).setParameterLength(0,2);class Rh extends js{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===Rh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Rh.DEPTH_BASE)null!==r&&(s=Fh().assign(r));else if(t===Rh.DEPTH)s=e.isPerspectiveCamera?Mh(Gl.z,ol,ul):Ch(Gl.z,ol,ul);else if(t===Rh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ph(r,ol,ul);s=Ch(e,ol,ul)}else s=r;else s=Ch(Gl.z,ol,ul);return s}}Rh.DEPTH_BASE="depthBase",Rh.DEPTH="depth",Rh.LINEAR_DEPTH="linearDepth";const Ch=(e,t,r)=>e.add(t).div(t.sub(r)),Mh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ph=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Lh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=ja(e.negate().div(t)),i=ja(r.div(t));return s.div(i)},Fh=Vi(Rh,Rh.DEPTH_BASE),Bh=Ui(Rh,Rh.DEPTH),Dh=Vi(Rh,Rh.LINEAR_DEPTH).setParameterLength(0,1),Ih=Dh(Ah());Bh.assign=e=>Fh(e);class Vh extends js{static get type(){return"ClippingNode"}constructor(e=Vh.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===Vh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Vh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return ki((()=>{const r=ji().toVar("distanceToPlane"),s=ji().toVar("distanceToGradient"),i=ji(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=il(t);Yc(n,(({i:t})=>{const n=e.element(t);r.assign(Gl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Oo(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=il(e),n=ji(1).toVar("intersectionClipOpacity");Yc(a,(({i:e})=>{const i=t.element(e);r.assign(Gl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Oo(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}yn.a.mulAssign(i),yn.a.equal(0).discard()}))()}setupDefault(e,t){return ki((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=il(t);Yc(r,(({i:t})=>{const r=e.element(t);Gl.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=il(e),r=Ki(!0).toVar("clipped");Yc(s,(({i:e})=>{const s=t.element(e);r.assign(Gl.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),ki((()=>{const s=il(e),i=nl(t.getClipDistance());Yc(r,(({i:e})=>{const t=s.element(e),r=Gl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Vh.ALPHA_TO_COVERAGE="alphaToCoverage",Vh.DEFAULT="default",Vh.HARDWARE="hardware";const Uh=ki((([e])=>Za(la(1e4,Ja(la(17,e.x).add(la(.1,e.y)))).mul(oa(.1,no(Ja(la(13,e.y).add(e.x)))))))),Oh=ki((([e])=>Uh(Yi(Uh(e.xy),e.z)))),kh=ki((([e])=>{const t=_o(oo(co(e.xyz)),oo(ho(e.xyz))),r=ji(1).div(ji(.05).mul(t)).toVar("pixScale"),s=Yi($a(Ka(ja(r))),$a(Ya(ja(r)))),i=Yi(Oh(Ka(s.x.mul(e.xyz))),Oh(Ka(s.y.mul(e.xyz)))),n=Za(ja(r)),a=oa(la(n.oneMinus(),i.x),la(n,i.y)),o=To(n,n.oneMinus()),u=en(a.mul(a).div(la(2,o).mul(ua(1,o))),a.sub(la(.5,o)).div(ua(1,o)),ua(1,ua(1,a).mul(ua(1,a)).div(la(2,o).mul(ua(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Io(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Gh extends $u{static get type(){return"VertexColorNode"}constructor(e){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}}const zh=(e=0)=>Bi(new Gh(e));class Hh extends I{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,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.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+Ss(this)}build(e){this.setup(e)}setupObserver(e){return new bs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=nn(s,yn.a).max(0);i=this.setupOutput(e,a),Dn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&Dn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=nn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=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=Bi(new Vh(Vh.ALPHA_TO_COVERAGE)):e.stack.add(Bi(new Vh))}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(Bi(new Vh(Vh.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?Lh(Gl.z,ol,ul):Ch(Gl.z,ol,ul))}null!==s&&Bh.assign(s).toStack()}setupPositionView(){return Ll.mul(Vl).xyz}setupModelViewProjection(){return ll.mul(Gl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Rc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&rh(t).toStack(),!0===t.isSkinnedMesh&&Xc(t).toStack(),this.displacementMap){const e=xd("displacementMap","texture"),t=xd("displacementScale","float"),r=xd("displacementBias","float");Vl.addAssign(ql.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Gc(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Oc(t).toStack(),null!==this.positionNode&&Vl.assign(this.positionNode.context({isPositionNodeInput:!0})),Vl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?nn(this.colorNode):Wd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(zh())),e.instanceColor){r=fn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=fn("vec3","vBatchColor").mul(r)}yn.assign(r);const s=this.opacityNode?ji(this.opacityNode):Xd;if(yn.a.assign(yn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?ji(this.alphaTestNode):$d;yn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&yn.a.lessThan(kh(Vl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&yn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?en(0):yn.rgb}setupNormal(){return this.normalNode?en(this.normalNode):rc}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xd("envMap","cubeTexture"):xd("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new oh(wc)),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:Ec;t.push(new ih(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 a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=ah(n,t,r,s)}else null!==r&&(a=en(null!==s?Do(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(xn.assign(en(i||qd)),a=a.add(xn)),a}setupFog(e,t){const r=e.fogNode;return r&&(Dn.assign(t),t=nn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),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=I.prototype.toJSON.call(this,e),s=ws(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.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,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 $h=new U;class Wh extends Hh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues($h),this.setValues(e)}}const jh=new O;class qh extends Hh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(jh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?ji(this.offsetNode):vc,t=this.dashScaleNode?ji(this.dashScaleNode):xc,r=this.dashSizeNode?ji(this.dashSizeNode):bc,s=this.gapSizeNode?ji(this.gapSizeNode):Tc;In.assign(r),Vn.assign(s);const i=nu(Wu("lineDistance").mul(t));(e?i.add(e):i).mod(In.add(Vn)).greaterThan(In).discard()}}let Xh=null;class Kh extends vh{static get type(){return"ViewportSharedTextureNode"}constructor(e=ch,t=null){null===Xh&&(Xh=new F),super(e,t,Xh)}updateReference(){return this}}const Yh=Vi(Kh).setParameterLength(0,2),Qh=new O;class Zh extends Hh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Qh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=k,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=ki((({start:e,end:t})=>{const r=ll.element(2).element(2),s=ll.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return nn(Do(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=ki((()=>{const e=Wu("instanceStart"),t=Wu("instanceEnd"),r=nn(Ll.mul(nn(e,1))).toVar("start"),s=nn(Ll.mul(nn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?ji(this.dashScaleNode):xc,t=this.offsetNode?ji(this.offsetNode):vc,r=Wu("instanceDistanceStart"),s=Wu("instanceDistanceEnd");let i=Il.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),fn("float","lineDistance").assign(i)}n&&(fn("vec3","worldStart").assign(r.xyz),fn("vec3","worldEnd").assign(s.xyz));const o=gh.z.div(gh.w),u=ll.element(2).element(3).equal(-1);Hi(u,(()=>{Hi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=ll.mul(r),d=ll.mul(s),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(o)),p.assign(p.normalize());const g=nn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Do(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=fn("vec4","worldPos");o.assign(Il.y.lessThan(.5).select(r,s));const u=_c.mul(.5);o.addAssign(nn(Il.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(nn(Il.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(nn(a.mul(u),0)),Hi(Il.y.greaterThan(1).or(Il.y.lessThan(0)),(()=>{o.subAssign(nn(a.mul(2).mul(u),0))}))),g.assign(ll.mul(o));const l=en().toVar();l.assign(Il.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Yi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Il.x.lessThan(0).select(e.negate(),e)),Hi(Il.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Il.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(_c)),e.assign(e.div(gh.w)),g.assign(Il.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(nn(e,0,0)))}return g}))();const o=ki((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return Yi(h,p)}));if(this.colorNode=ki((()=>{const e=ju();if(i){const t=this.dashSizeNode?ji(this.dashSizeNode):bc,r=this.gapSizeNode?ji(this.gapSizeNode):Tc;In.assign(t),Vn.assign(r);const s=fn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(In.add(Vn)).greaterThan(In).discard()}const a=ji(1).toVar("alpha");if(n){const e=fn("vec3","worldStart"),s=fn("vec3","worldEnd"),n=fn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:en(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(_c);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Oo(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=ji(s.fwidth()).toVar("dlen");Hi(e.y.abs().greaterThan(1),(()=>{a.assign(Oo(i.oneMinus(),i.add(1),s).oneMinus())}))}else Hi(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Wu("instanceColorStart"),t=Wu("instanceColorEnd");u=Il.y.lessThan(.5).select(e,t).mul(Wd)}else u=Wd;return nn(u,a)}))(),this.transparent){const e=this.opacityNode?ji(this.opacityNode):Xd;this.outputNode=nn(this.colorNode.rgb.mul(e).add(Yh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}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 Jh=e=>Bi(e).mul(.5).add(.5),ep=new G;class tp extends Hh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ep),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?ji(this.opacityNode):Xd;yn.assign(mu(nn(Jh(Ql),e),z))}}class rp extends Ks{static get type(){return"EquirectUVNode"}constructor(e=kl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Yi(t,r)}}const sp=Vi(rp).setParameterLength(0,1);class ip extends H{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 $(5,5,5),n=sp(kl),a=new Hh;a.colorNode=Zu(t,n,0),a.side=N,a.blending=k;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const np=new WeakMap;class ap extends Ks{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=hd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Us.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===Y||r===Q){if(np.has(e)){const t=np.get(e);up(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ip(r.height);s.fromEquirectangularTexture(t,e),up(s.texture,e.mapping),this._cubeTexture=s.texture,np.set(e,s.texture),e.addEventListener("dispose",op)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function op(e){const t=e.target;t.removeEventListener("dispose",op);const r=np.get(t);void 0!==r&&(np.delete(t),r.dispose())}function up(e,t){t===Y?e.mapping=w:t===Q&&(e.mapping=E)}const lp=Vi(ap).setParameterLength(1);class dp extends sh{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=lp(this.envNode)}}class cp extends sh{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=ji(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class hp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class pp extends hp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(nn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(nn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(yn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Do(s.rgb,s.rgb.mul(i.rgb),Zd.mul(Jd)));break;case J:s.rgb.assign(Do(s.rgb,i.rgb,Zd.mul(Jd)));break;case Z:s.rgb.addAssign(i.rgb.mul(Zd.mul(Jd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const gp=new te;class mp extends Hh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(gp),this.setValues(e)}setupNormal(){return Kl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new dp(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new cp(wc)),t}setupOutgoingLight(){return yn.rgb}setupLightingModel(){return new pp}}const fp=ki((({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))})),yp=ki((e=>e.diffuseColor.mul(1/Math.PI))),xp=ki((({dotNH:e})=>Bn.mul(ji(.5)).add(1).mul(ji(1/Math.PI)).mul(e.pow(Bn)))),bp=ki((({lightDirection:e})=>{const t=e.add(zl).normalize(),r=Ql.dot(t).clamp(),s=zl.dot(t).clamp(),i=fp({f0:Ln,f90:1,dotVH:s}),n=ji(.25),a=xp({dotNH:r});return i.mul(n).mul(a)}));class Tp extends pp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Ql.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(yp({diffuseColor:yn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(bp({lightDirection:e})).mul(Zd))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(yp({diffuseColor:yn}))),s.indirectDiffuse.mulAssign(t)}}const _p=new re;class vp extends Hh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(_p),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new dp(t):null}setupLightingModel(){return new Tp(!1)}}const Np=new se;class Sp extends Hh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Np),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new dp(t):null}setupLightingModel(){return new Tp}setupVariants(){const e=(this.shininessNode?ji(this.shininessNode):jd).max(1e-4);Bn.assign(e);const t=this.specularNode||Kd;Ln.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wp=ki((e=>{if(!1===e.geometry.hasAttribute("normal"))return ji(0);const t=Kl.dFdx().abs().max(Kl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Ep=ki((e=>{const{roughness:t}=e,r=wp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Ap=ki((({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 da(.5,i.add(n).max(Da))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Rp=ki((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(en(e.mul(r),t.mul(s),a).length()),l=a.mul(en(e.mul(i),t.mul(n),o).length());return da(.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"}]}),Cp=ki((({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"}]}),Mp=ji(1/Math.PI),Pp=ki((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=en(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Mp.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"}]}),Lp=ki((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||Ql,l=i.pow2(),d=t.add(zl).normalize(),c=u.dot(t).clamp(),h=u.dot(zl).clamp(),p=u.dot(d).clamp(),g=zl.dot(d).clamp();let m,f,y=fp({f0:r,f90:s,dotVH:g});if(Pi(a)&&(y=wn.mix(y,n)),Pi(o)){const e=Mn.dot(t),r=Mn.dot(zl),s=Mn.dot(d),i=Pn.dot(t),n=Pn.dot(zl),a=Pn.dot(d);m=Rp({alphaT:Rn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Pp({alphaT:Rn,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=Ap({alpha:l,dotNL:c,dotNV:h}),f=Cp({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Fp=ki((({roughness:e,dotNV:t})=>{const r=nn(-1,-.0275,-.572,.022),s=nn(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 Yi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Bp=ki((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Fp({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Dp=ki((({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(en(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"}]}),Ip=ki((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=ji(1).div(r),i=t.pow2().oneMinus().max(.0078125);return ji(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"}]}),Vp=ki((({dotNV:e,dotNL:t})=>ji(1).div(ji(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Up=ki((({lightDirection:e})=>{const t=e.add(zl).normalize(),r=Ql.dot(e).clamp(),s=Ql.dot(zl).clamp(),i=Ql.dot(t).clamp(),n=Ip({roughness:Sn,dotNH:i}),a=Vp({dotNV:s,dotNL:r});return Nn.mul(n).mul(a)})),Op=ki((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Yi(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"}]}),kp=ki((({f:e})=>{const t=e.length();return _o(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Gp=ki((({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(),a=i.div(n),o=r.greaterThan(0).select(a,_o(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),zp=ki((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=en().toVar();return Hi(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(dn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=en(0).toVar();f.addAssign(Gp({v1:h,v2:p})),f.addAssign(Gp({v1:p,v2:g})),f.addAssign(Gp({v1:g,v2:m})),f.addAssign(Gp({v1:m,v2:h})),c.assign(en(kp({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"}]}),Hp=ki((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=en().toVar();return Hi(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=en(0).toVar();d.addAssign(Gp({v1:n,v2:a})),d.addAssign(Gp({v1:a,v2:o})),d.addAssign(Gp({v1:o,v2:l})),d.addAssign(Gp({v1:l,v2:n})),u.assign(en(kp({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),$p=1/6,Wp=e=>la($p,la(e,la(e,e.negate().add(3)).sub(3)).add(1)),jp=e=>la($p,la(e,la(e,la(3,e).sub(6))).add(4)),qp=e=>la($p,la(e,la(e,la(-3,e).add(3)).add(3)).add(1)),Xp=e=>la($p,Ro(e,3)),Kp=e=>Wp(e).add(jp(e)),Yp=e=>qp(e).add(Xp(e)),Qp=e=>oa(-1,jp(e).div(Wp(e).add(jp(e)))),Zp=e=>oa(1,Xp(e).div(qp(e).add(Xp(e)))),Jp=(e,t,r)=>{const s=e.uvNode,i=la(s,t.zw).add(.5),n=Ka(i),a=Za(i),o=Kp(a.x),u=Yp(a.x),l=Qp(a.x),d=Zp(a.x),c=Qp(a.y),h=Zp(a.y),p=Yi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Yi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Yi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Yi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Kp(a.y).mul(oa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Yp(a.y).mul(oa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},eg=ki((([e,t=ji(3)])=>{const r=Yi(e.size(qi(t))),s=Yi(e.size(qi(t.add(1)))),i=da(1,r),n=da(1,s),a=Jp(e,nn(i,r),Ka(t)),o=Jp(e,nn(n,s),Ya(t));return Za(t).mix(a,o)})),tg=ki((([e,t,r,s,i])=>{const n=en(Uo(t.negate(),Qa(e),da(1,s))),a=en(oo(i[0].xyz),oo(i[1].xyz),oo(i[2].xyz));return Qa(n).mul(r.mul(a))})).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"}]}),rg=ki((([e,t])=>e.mul(Io(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),sg=Sh(),ig=Sh(),ng=ki((([e,t,r],{material:s})=>{const i=(s.side===N?sg:ig).sample(e),n=ja(hh.x).mul(rg(t,r));return eg(i,n)})),ag=ki((([e,t,r])=>(Hi(r.notEqual(0),(()=>{const s=Wa(t).negate().div(r);return Ha(s.negate().mul(e))})),en(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),og=ki((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=nn().toVar(),f=en().toVar();const i=d.sub(1).mul(g.mul(.025)),n=en(d.sub(i),d,d.add(i));Yc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=tg(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(nn(y,1))),b=Yi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Yi(b.x,b.y.oneMinus()));const T=ng(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(ag(oo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=tg(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(nn(n,1))),y=Yi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Yi(y.x,y.y.oneMinus())),m=ng(y,r,d),f=s.mul(ag(oo(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=en(Bp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return nn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),ug=dn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),lg=(e,t)=>e.sub(t).div(e.add(t)).pow2(),dg=ki((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Do(e,t,Oo(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Hi(a.lessThan(0),(()=>en(1)));const o=a.sqrt(),u=lg(n,e),l=fp({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=ji(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return en(1).add(t).div(en(1).sub(t))})(i.clamp(0,.9999)),g=lg(p,n.toVec3()),m=fp({f0:g,f90:1,dotVH:o}),f=en(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,o,2),x=en(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(en(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Yc({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=en(54856e-17,44201e-17,52481e-17),i=en(1681e3,1795300,2208400),n=en(43278e5,93046e5,66121e5),a=ji(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=en(o.x.add(a),o.y,o.z).div(1.0685e-7),ug.mul(o)})(ji(e).mul(y),ji(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(en(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"}]}),cg=ki((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Xo(r.lessThan(.25),ji(-339.2).mul(i).add(ji(161.4).mul(r)).sub(25.9),ji(-8.48).mul(i).add(ji(14.3).mul(r)).sub(9.95)),a=Xo(r.lessThan(.25),ji(44).mul(i).sub(ji(23.7).mul(r)).add(3.26),ji(1.97).mul(i).sub(ji(3.27).mul(r)).add(.72));return Xo(r.lessThan(.25),0,ji(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),hg=en(.04),pg=ji(1);class gg extends hp{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=en().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=en().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=en().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=en().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=en().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Ql.dot(zl).clamp();this.iridescenceFresnel=dg({outsideIOR:ji(1),eta2:En,cosTheta1:e,thinFilmThickness:An,baseF0:Ln}),this.iridescenceF0=Dp({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Ol,r=gl.sub(Ol).normalize(),s=Zl,i=e.context;i.backdrop=og(s,r,bn,yn,Ln,Fn,t,wl,cl,ll,On,Gn,Hn,zn,this.dispersion?$n:null),i.backdropAlpha=kn,yn.a.mulAssign(Do(1,i.backdrop.a,kn))}super.start(e)}computeMultiscattering(e,t,r){const s=Ql.dot(zl).clamp(),i=Fp({roughness:bn,dotNV:s}),n=(this.iridescenceF0?wn.mix(Ln,this.iridescenceF0):Ln).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Ln.add(Ln.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Ql.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Up({lightDirection:e}))),!0===this.clearcoat){const r=Jl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Lp({lightDirection:e,f0:hg,f90:pg,roughness:vn,normalView:Jl})))}r.directDiffuse.addAssign(s.mul(yp({diffuseColor:yn.rgb}))),r.directSpecular.addAssign(s.mul(Lp({lightDirection:e,f0:Ln,f90:1,roughness:bn,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:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Ql,h=zl,p=Gl.toVar(),g=Op({N:c,V:h,roughness:bn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=dn(en(m.x,0,m.y),en(0,1,0),en(m.z,0,m.w)).toVar(),x=Ln.mul(f.x).add(Ln.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(zp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(yn).mul(zp({N:c,V:h,P:p,mInv:dn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(yp({diffuseColor:yn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Nn,cg({normal:Ql,viewDir:zl,roughness:Sn}))),!0===this.clearcoat){const e=Jl.dot(zl).clamp(),t=Bp({dotNV:e,specularColor:hg,specularF90:pg,roughness:vn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=en().toVar("singleScattering"),n=en().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Fn);const o=i.add(n),u=yn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Ql.dot(zl).clamp().add(t),i=bn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Jl.dot(zl).clamp(),r=fp({dotVH:e,f0:hg,f90:pg}),s=t.mul(_n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(_n));t.assign(s)}if(!0===this.sheen){const e=Nn.r.max(Nn.g).max(Nn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const mg=ji(1),fg=ji(-2),yg=ji(.8),xg=ji(-1),bg=ji(.4),Tg=ji(2),_g=ji(.305),vg=ji(3),Ng=ji(.21),Sg=ji(4),wg=ji(4),Eg=ji(16),Ag=ki((([e])=>{const t=en(no(e)).toVar(),r=ji(-1).toVar();return Hi(t.x.greaterThan(t.z),(()=>{Hi(t.x.greaterThan(t.y),(()=>{r.assign(Xo(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Xo(e.y.greaterThan(0),1,4))}))})).Else((()=>{Hi(t.z.greaterThan(t.y),(()=>{r.assign(Xo(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Xo(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Rg=ki((([e,t])=>{const r=Yi().toVar();return Hi(t.equal(0),(()=>{r.assign(Yi(e.z,e.y).div(no(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Yi(e.x.negate(),e.z.negate()).div(no(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Yi(e.x.negate(),e.y).div(no(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Yi(e.z.negate(),e.y).div(no(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Yi(e.x.negate(),e.z).div(no(e.y)))})).Else((()=>{r.assign(Yi(e.x,e.y).div(no(e.z)))})),la(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Cg=ki((([e])=>{const t=ji(0).toVar();return Hi(e.greaterThanEqual(yg),(()=>{t.assign(mg.sub(e).mul(xg.sub(fg)).div(mg.sub(yg)).add(fg))})).ElseIf(e.greaterThanEqual(bg),(()=>{t.assign(yg.sub(e).mul(Tg.sub(xg)).div(yg.sub(bg)).add(xg))})).ElseIf(e.greaterThanEqual(_g),(()=>{t.assign(bg.sub(e).mul(vg.sub(Tg)).div(bg.sub(_g)).add(Tg))})).ElseIf(e.greaterThanEqual(Ng),(()=>{t.assign(_g.sub(e).mul(Sg.sub(vg)).div(_g.sub(Ng)).add(vg))})).Else((()=>{t.assign(ji(-2).mul(ja(la(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Mg=ki((([e,t])=>{const r=e.toVar();r.assign(la(2,r).sub(1));const s=en(r,1).toVar();return Hi(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"}]}),Pg=ki((([e,t,r,s,i,n])=>{const a=ji(r),o=en(t),u=Io(Cg(a),fg,n),l=Za(u),d=Ka(u),c=en(Lg(e,o,d,s,i,n)).toVar();return Hi(l.notEqual(0),(()=>{const t=en(Lg(e,o,d.add(1),s,i,n)).toVar();c.assign(Do(c,t,l))})),c})),Lg=ki((([e,t,r,s,i,n])=>{const a=ji(r).toVar(),o=en(t),u=ji(Ag(o)).toVar(),l=ji(_o(wg.sub(a),0)).toVar();a.assign(_o(a,wg));const d=ji($a(a)).toVar(),c=Yi(Rg(o,u).mul(d.sub(2)).add(1)).toVar();return Hi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(la(3,Eg))),c.y.addAssign(la(4,$a(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Yi(),Yi())})),Fg=ki((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=eo(s),l=r.mul(u).add(i.cross(r).mul(Ja(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Lg(e,l,t,n,a,o)})),Bg=ki((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=en(Xo(t,r,Ao(r,s))).toVar();Hi(h.equal(en(0)),(()=>{h.assign(en(s.z,0,s.x.negate()))})),h.assign(Qa(h));const p=en().toVar();return p.addAssign(i.element(0).mul(Fg({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Yc({start:qi(1),end:e},(({i:e})=>{Hi(e.greaterThanEqual(n),(()=>{Qc()}));const t=ji(a.mul(ji(e))).toVar();p.addAssign(i.element(e).mul(Fg({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Fg({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),nn(p,1)})),Dg=[.125,.215,.35,.446,.526,.582],Ig=20,Vg=new ie(-1,1,1,-1,0,1),Ug=new ne(90,1),Og=new e;let kg=null,Gg=0,zg=0;const Hg=(1+Math.sqrt(5))/2,$g=1/Hg,Wg=[new r(-Hg,$g,0),new r(Hg,$g,0),new r(-$g,0,Hg),new r($g,0,Hg),new r(0,Hg,-$g),new r(0,Hg,$g),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],jg=new r,qg=new WeakMap,Xg=[3,1,5,0,4,2],Kg=Mg(ju(),Wu("faceIndex")).normalize(),Yg=en(Kg.x,Kg.y,Kg.z);class Qg{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={}){const{size:n=256,position:a=jg,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}kg=this._renderer.getRenderTarget(),Gg=this._renderer.getActiveCubeFace(),zg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){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=tm(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=rm(),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===w||e.mapping===E?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=Dg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-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,x=new Float32Array(m*g*p),b=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=Xg[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=il(new Array(Ig).fill(0)),n=Zn(new r(0,1,0)),a=Zn(0),o=ji(Ig),u=Zn(0),l=Zn(1),d=Zu(null),c=Zn(0),h=ji(1/t),p=ji(1/s),g=ji(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Yg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=em("blur");return f.fragmentNode=Bg({...m,latitudinal:u.equal(1)}),qg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Vg)}_sceneToCubeUV(e,t,r,s,i){const n=Ug;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Og),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new $,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Og),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Jg(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===w||e.mapping===E;s?null===this._cubemapMaterial&&(this._cubemapMaterial=tm(e)):null===this._equirectMaterial&&(this._equirectMaterial=rm(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Jg(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Vg)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tIg&&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-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Vg)}}function Zg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function Jg(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function em(e){const t=new Hh;return t.depthTest=!1,t.depthWrite=!1,t.blending=k,t.name=`PMREM_${e}`,t}function tm(e){const t=em("cubemap");return t.fragmentNode=hd(e,Yg),t}function rm(e){const t=em("equirect");return t.fragmentNode=Zu(e,sp(Yg),0),t}const sm=new WeakMap;function im(e,t,r){const s=function(e){let t=sm.get(e);void 0===t&&(t=new WeakMap,sm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class nm extends Ks{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 pe;s.isRenderTargetTexture=!0,this._texture=Zu(s),this._width=Zn(0),this._height=Zn(0),this._maxMip=Zn(0),this.updateBeforeType=Us.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(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:im(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Qg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=ad.mul(en(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Pg(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const am=Vi(nm).setParameterLength(1,3),om=new WeakMap;class um extends sh{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=om.get(e);void 0===s&&(s=am(e),om.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Bd:Ql,i=r.context(lm(bn,s)).mul(nd),n=r.context(dm(Zl)).mul(Math.PI).mul(nd),a=Pu(i),o=Pu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(lm(vn,Jl)).mul(nd),t=Pu(e);u.addAssign(t)}}}const lm=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=zl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(cl)),r),getTextureLevel:()=>e}},dm=e=>({getUV:()=>e,getTextureLevel:()=>ji(1)}),cm=new ge;class hm extends Hh{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(cm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new um(t):null}setupLightingModel(){return new gg}setupSpecular(){const e=Do(en(.04),yn.rgb,Tn);Ln.assign(e),Fn.assign(1)}setupVariants(){const e=this.metalnessNode?ji(this.metalnessNode):tc;Tn.assign(e);let t=this.roughnessNode?ji(this.roughnessNode):ec;t=Ep({roughness:t}),bn.assign(t),this.setupSpecular(),yn.assign(nn(yn.rgb.mul(e.oneMinus()),yn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const pm=new me;class gm extends hm{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(pm),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?ji(this.iorNode):mc;On.assign(e),Ln.assign(Do(To(Co(On.sub(1).div(On.add(1))).mul(Qd),en(1)).mul(Yd),yn.rgb,Tn)),Fn.assign(Do(Yd,1,Tn))}setupLightingModel(){return new gg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?ji(this.clearcoatNode):sc,t=this.clearcoatRoughnessNode?ji(this.clearcoatRoughnessNode):ic;_n.assign(e),vn.assign(Ep({roughness:t}))}if(this.useSheen){const e=this.sheenNode?en(this.sheenNode):oc,t=this.sheenRoughnessNode?ji(this.sheenRoughnessNode):uc;Nn.assign(e),Sn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?ji(this.iridescenceNode):dc,t=this.iridescenceIORNode?ji(this.iridescenceIORNode):cc,r=this.iridescenceThicknessNode?ji(this.iridescenceThicknessNode):hc;wn.assign(e),En.assign(t),An.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Yi(this.anisotropyNode):lc).toVar();Cn.assign(e.length()),Hi(Cn.equal(0),(()=>{e.assign(Yi(1,0))})).Else((()=>{e.divAssign(Yi(Cn)),Cn.assign(Cn.saturate())})),Rn.assign(Cn.pow2().mix(bn.pow2(),1)),Mn.assign(Ld[0].mul(e.x).add(Ld[1].mul(e.y))),Pn.assign(Ld[1].mul(e.x).sub(Ld[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?ji(this.transmissionNode):pc,t=this.thicknessNode?ji(this.thicknessNode):gc,r=this.attenuationDistanceNode?ji(this.attenuationDistanceNode):fc,s=this.attenuationColorNode?en(this.attenuationColorNode):yc;if(kn.assign(e),Gn.assign(t),zn.assign(r),Hn.assign(s),this.useDispersion){const e=this.dispersionNode?ji(this.dispersionNode):Sc;$n.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?en(this.clearcoatNormalNode):nc}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 mm extends gg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(Ql.mul(a)).normalize(),h=ji(zl.dot(c.negate()).saturate().pow(l).mul(d)),p=en(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class fm extends gm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=ji(.1),this.thicknessAmbientNode=ji(0),this.thicknessAttenuationNode=ji(.1),this.thicknessPowerNode=ji(2),this.thicknessScaleNode=ji(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new mm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,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 ym=ki((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Yi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xd("gradientMap","texture").context({getUV:()=>i});return en(e.r)}{const e=i.fwidth().mul(.5);return Do(en(.7),en(1),Oo(ji(.7).sub(e.x),ji(.7).add(e.x),i.x))}}));class xm extends hp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=ym({normal:jl,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(yp({diffuseColor:yn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(yp({diffuseColor:yn}))),s.indirectDiffuse.mulAssign(t)}}const bm=new fe;class Tm extends Hh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(bm),this.setValues(e)}setupLightingModel(){return new xm}}class _m extends Ks{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=en(zl.z,0,zl.x.negate()).normalize(),t=zl.cross(e);return Yi(e.dot(Ql),t.dot(Ql)).mul(.495).add(.5)}}const vm=Ui(_m),Nm=new ye;class Sm extends Hh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Nm),this.setValues(e)}setupVariants(e){const t=vm;let r;r=e.material.matcap?xd("matcap","texture").context({getUV:()=>t}):en(Do(.2,.8,t.y)),yn.rgb.mulAssign(r.rgb)}}class wm extends Ks{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 ln(e,s,s.negate(),e).mul(r)}{const e=t,s=cn(nn(1,0,0,0),nn(0,eo(e.x),Ja(e.x).negate(),0),nn(0,Ja(e.x),eo(e.x),0),nn(0,0,0,1)),i=cn(nn(eo(e.y),0,Ja(e.y),0),nn(0,1,0,0),nn(Ja(e.y).negate(),0,eo(e.y),0),nn(0,0,0,1)),n=cn(nn(eo(e.z),Ja(e.z).negate(),0,0),nn(Ja(e.z),eo(e.z),0,0),nn(0,0,1,0),nn(0,0,0,1));return s.mul(i).mul(n).mul(nn(r,1)).xyz}}}const Em=Vi(wm).setParameterLength(2),Am=new xe;class Rm extends Hh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Am),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Ll.mul(en(i||0));let u=Yi(wl[0].xyz.length(),wl[1].xyz.length());if(null!==a&&(u=u.mul(Yi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=ji(2).div(ll.element(1).element(1));u=u.mul(e.mul(2))}let l=Il.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Bi(new yu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=ji(n||ac),c=Em(l,d);return nn(o.xy.add(c),o.zw)}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)}}const Cm=new be;class Mm extends Rm{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Cm),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ll.mul(en(e||Vl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Il.xy.toVar(),a=gh.z.div(gh.w);if(r&&r.isNode){const e=ji(r);n.assign(Em(n,e))}let o=null!==i?Yi(i):Nc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Gl.z.negate()))),s&&s.isNode&&(o=o.mul(Yi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(gh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(nn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class Pm extends hp{constructor(){super(),this.shadowNode=ji(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){yn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(yn.rgb)}}const Lm=new Te;class Fm extends Hh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(Lm),this.setValues(e)}setupLightingModel(){return new Pm}}const Bm=mn("vec3"),Dm=mn("vec3"),Im=mn("vec3");class Vm extends hp{constructor(){super()}start(e){const{material:t,context:r}=e,s=mn("vec3"),i=mn("vec3");Hi(gl.sub(Ol).length().greaterThan(Cl.mul(2)),(()=>{s.assign(gl),i.assign(Ol)})).Else((()=>{s.assign(Ol),i.assign(gl)}));const n=i.sub(s),a=Zn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=ji(0).toVar(),d=en(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),Yc(a,(()=>{const i=s.add(u.mul(l)),n=cl.mul(nn(i,1)).xyz;let a;null!==t.depthNode&&(Dm.assign(Dh(Mh(n.z,ol,ul))),r.sceneDepthNode=Dh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Bm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Bm.mulAssign(a);const c=Bm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),Im.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?Hi(r.greaterThanEqual(Dm),(()=>{Bm.addAssign(e)})):Bm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Hp({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Im)}}class Um extends Hh{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Vm}}class Om{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,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}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class km{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().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}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}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),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;o?p=a.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,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",_s(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Ns(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Ns(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Hm=[];class $m{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,a,o){const u=this.getChainMap(o);Hm[0]=e,Hm[1]=t,Hm[2]=n,Hm[3]=i;let l=u.get(Hm);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Hm,l)):(l.updateClipping(a),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,a,o)):l.version=t.version)),Hm.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new km)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new zm(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Wm{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=null;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 jm=1,qm=2,Xm=3,Km=4,Ym=16;class Qm extends Wm{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===jm?this.backend.createAttribute(e):t===qm?this.backend.createIndexAttribute(e):t===Xm?this.backend.createStorageAttribute(e):t===Km&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{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,Xm):this.updateAttribute(e,jm);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,qm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Km)}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=Jm(t),e.set(t,r)):r.version!==Zm(t)&&(this.attributes.delete(r),r=Jm(t),e.set(t,r)),s=r}return s}}class tf{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},this.compute={calls:0,frameCalls:0,timestamp: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.")}reset(){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 rf{constructor(e){this.cacheKey=e,this.usedTimes=0}}class sf extends rf{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class nf extends rf{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let af=0;class of{constructor(e,t,r,s=null,i=null){this.id=af++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class uf extends Wm{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 a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new of(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.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(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new of(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new of(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}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 nf(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 sf(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 lf extends Wm{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?Km:Xm;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Km:Xm;this.attributes.update(e,r)}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 o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,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,a)}}function df(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function cf(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 hf(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class pf{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,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(hf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(hf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||df),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||cf),this.transparent.length>1&&this.transparent.sort(t||cf)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=!0===e.multiview&&a.depth>1?new Ee:new D,l.format=e.stencilBuffer?Ae:Re,l.type=e.stencilBuffer?Ce:b,l.image.width=o,l.image.height=u,l.image.depth=a.depth,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isDepthArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.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};if(!0!==e.isXRRenderTarget){for(let t=0;t1,c&&(r.needsUpdate=!0),this.updateTexture(r,h)}l&&this.updateTexture(l,h)}if(!0!==r.initialized){r.initialized=!0;const t=()=>{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)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=Nf){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!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class wf 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 Ef extends gn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class Af extends js{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Fi(t);return this._currentCond=Xo(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Fi(t),s=Xo(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Fi(e),this}Switch(e){return this._expressionNode=Bi(e),this}Case(...e){const t=[];if(!(e.length>=2))throw new Error("TSL: Invalid parameter length. Case() requires at least two parameters.");for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=Ms(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Mf extends js{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class Pf extends js{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{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)})),Vf=(e,t)=>Ro(la(4,e.mul(ua(1,e))),t),Uf=ki((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Of=ki((([e])=>en(Uf(e.z.add(Uf(e.y.mul(1)))),Uf(e.z.add(Uf(e.x.mul(1)))),Uf(e.y.add(Uf(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),kf=ki((([e,t,r])=>{const s=en(e).toVar(),i=ji(1.4).toVar(),n=ji(0).toVar(),a=en(s).toVar();return Yc({start:ji(0),end:ji(3),type:"float",condition:"<="},(()=>{const e=en(Of(a.mul(2))).toVar();s.addAssign(e.add(r.mul(ji(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=ji(Uf(s.z.add(Uf(s.x.add(Uf(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Gf extends js{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 a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const zf=Vi(Gf),Hf=e=>(...t)=>zf(e,...t),$f=Zn(0).setGroup(Kn).onRenderUpdate((e=>e.time)),Wf=Zn(0).setGroup(Kn).onRenderUpdate((e=>e.deltaTime)),jf=Zn(0,"uint").setGroup(Kn).onRenderUpdate((e=>e.frameId)),qf=ki((([e,t,r=Yi(.5)])=>Em(e.sub(r),t).add(r))),Xf=ki((([e,t,r=Yi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Kf=ki((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=wl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=wl;const i=cl.mul(s);return Pi(t)&&(i[0][0]=wl[0].length(),i[0][1]=0,i[0][2]=0),Pi(r)&&(i[1][0]=0,i[1][1]=wl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ll.mul(i).mul(Vl)})),Yf=ki((([e=null])=>{const t=Dh();return Dh(Ah(e)).sub(t).lessThan(0).select(ch,e)}));class Qf extends js{static get type(){return"SpriteSheetUVNode"}constructor(e,t=ju(),r=ji(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(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Yi(a,o);return t.add(l).mul(u)}}const Zf=Vi(Qf).setParameterLength(3);class Jf extends js{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=ji(1),i=Vl,n=ql){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 a=n.abs().normalize();a=a.div(a.dot(en(1)));const o=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=Zu(d,o).mul(a.x),g=Zu(c,u).mul(a.y),m=Zu(h,l).mul(a.z);return oa(p,g,m)}}const ey=Vi(Jf).setParameterLength(1,6),ty=new Pe,ry=new r,sy=new r,iy=new r,ny=new a,ay=new r(0,0,-1),oy=new s,uy=new r,ly=new r,dy=new s,cy=new t,hy=new ae,py=ch.flipX();hy.depthTexture=new D(1,1);let gy=!1;class my extends Qu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||hy.texture,py),this._reflectorBaseNode=e.reflector||new fy(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=Bi(new my({defaultTexture:hy.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}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class fy extends js{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Le,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Us.RENDER:Us.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(cy),e.setSize(Math.round(cy.width*r),Math.round(cy.height*r))}setup(e){return this._updateResolution(hy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}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 ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Fe,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new D),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&gy)return!1;gy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(cy),this._updateResolution(o,s),sy.setFromMatrixPosition(n.matrixWorld),iy.setFromMatrixPosition(r.matrixWorld),ny.extractRotation(n.matrixWorld),ry.set(0,0,1),ry.applyMatrix4(ny),uy.subVectors(sy,iy);if(!0===uy.dot(ry)>0&&!1===this.forceUpdate)return;uy.reflect(ry).negate(),uy.add(sy),ny.extractRotation(r.matrixWorld),ay.set(0,0,-1),ay.applyMatrix4(ny),ay.add(iy),ly.subVectors(sy,ay),ly.reflect(ry).negate(),ly.add(sy),a.coordinateSystem=r.coordinateSystem,a.position.copy(uy),a.up.set(0,1,0),a.up.applyMatrix4(ny),a.up.reflect(ry),a.lookAt(ly),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),ty.setFromNormalAndCoplanarPoint(ry,sy),ty.applyMatrix4(a.matrixWorldInverse),oy.set(ty.normal.x,ty.normal.y,ty.normal.z,ty.constant);const u=a.projectionMatrix;dy.x=(Math.sign(oy.x)+u.elements[8])/u.elements[0],dy.y=(Math.sign(oy.y)+u.elements[9])/u.elements[5],dy.z=-1,dy.w=(1+u.elements[10])/u.elements[14],oy.multiplyScalar(1/oy.dot(dy));u.elements[2]=oy.x,u.elements[6]=oy.y,u.elements[10]=s.coordinateSystem===d?oy.z-0:oy.z+1-0,u.elements[14]=oy.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,gy=!1,this.forceUpdate=!1}}const yy=new ie(-1,1,1,-1,0,1);class xy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Be([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Be(t,2))}}const by=new xy;class Ty extends W{constructor(e=null){super(by,e),this.camera=yy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,yy)}render(e){e.render(this,yy)}}const _y=new t;class vy extends Qu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,ju()),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 Ty(new Hh),this.updateBeforeType=Us.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(_y);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 Qu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Ny=(e,...t)=>Bi(new vy(Bi(e),...t)),Sy=ki((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=Yi(e.x,e.y.oneMinus()).mul(2).sub(1),i=nn(en(e,t),1)):i=nn(en(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=nn(r.mul(i));return n.xyz.div(n.w)})),wy=ki((([e,t])=>{const r=t.mul(nn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Yi(s.x,s.y.oneMinus())})),Ey=ki((([e,t,r])=>{const s=Xu(Ju(t)),i=Qi(e.mul(s)).toVar(),n=Ju(t,i).toVar(),a=Ju(t,i.sub(Qi(2,0))).toVar(),o=Ju(t,i.sub(Qi(1,0))).toVar(),u=Ju(t,i.add(Qi(1,0))).toVar(),l=Ju(t,i.add(Qi(2,0))).toVar(),d=Ju(t,i.add(Qi(0,2))).toVar(),c=Ju(t,i.add(Qi(0,1))).toVar(),h=Ju(t,i.sub(Qi(0,1))).toVar(),p=Ju(t,i.sub(Qi(0,2))).toVar(),g=no(ua(ji(2).mul(o).sub(a),n)).toVar(),m=no(ua(ji(2).mul(u).sub(l),n)).toVar(),f=no(ua(ji(2).mul(c).sub(d),n)).toVar(),y=no(ua(ji(2).mul(h).sub(p),n)).toVar(),x=Sy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(Sy(e.sub(Yi(ji(1).div(s.x),0)),o,r)),x.negate().add(Sy(e.add(Yi(ji(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(Sy(e.add(Yi(0,ji(1).div(s.y))),c,r)),x.negate().add(Sy(e.sub(Yi(0,ji(1).div(s.y))),h,r)));return Qa(Ao(b,T))}));class Ay extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Ry extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Cy extends js{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const My=Ui(Cy),Py=new S,Ly=new a;class Fy extends js{static get type(){return"SceneNode"}constructor(e=Fy.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===Fy.BACKGROUND_BLURRINESS?s=md("backgroundBlurriness","float",r):t===Fy.BACKGROUND_INTENSITY?s=md("backgroundIntensity","float",r):t===Fy.BACKGROUND_ROTATION?s=Zn("mat4").label("backgroundRotation").setGroup(Kn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==De?(Py.copy(r.backgroundRotation),Py.x*=-1,Py.y*=-1,Py.z*=-1,Ly.makeRotationFromEuler(Py)):Ly.identity(),Ly})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Fy.BACKGROUND_BLURRINESS="backgroundBlurriness",Fy.BACKGROUND_INTENSITY="backgroundIntensity",Fy.BACKGROUND_ROTATION="backgroundRotation";const By=Ui(Fy,Fy.BACKGROUND_BLURRINESS),Dy=Ui(Fy,Fy.BACKGROUND_INTENSITY),Iy=Ui(Fy,Fy.BACKGROUND_ROTATION);class Vy extends Qu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=ks.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(ks.READ_WRITE)}toReadOnly(){return this.setAccess(ks.READ_ONLY)}toWriteOnly(){return this.setAccess(ks.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Uy=Vi(Vy).setParameterLength(1,3),Oy=ki((({texture:e,uv:t})=>{const r=1e-4,s=en().toVar();return Hi(t.x.lessThan(r),(()=>{s.assign(en(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(en(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(en(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(en(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(en(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(en(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(en(-.01,0,0))).r.sub(e.sample(t.add(en(r,0,0))).r),n=e.sample(t.add(en(0,-.01,0))).r.sub(e.sample(t.add(en(0,r,0))).r),a=e.sample(t.add(en(0,0,-.01))).r.sub(e.sample(t.add(en(0,0,r))).r);s.assign(en(i,n,a))})),s.normalize()}));class ky extends Qu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return en(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(qi(Xu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Oy({texture:this,uv:e})}}const Gy=Vi(ky).setParameterLength(1,3);class zy extends gd{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 Hy=new WeakMap;class $y extends Ks{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Us.OBJECT,this.updateAfterType=Us.OBJECT,this.previousModelWorldMatrix=Zn(new a),this.previousProjectionMatrix=Zn(new a).setGroup(Kn),this.previousCameraViewMatrix=Zn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=jy(r);this.previousModelWorldMatrix.value.copy(s);const i=Wy(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,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}){jy(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ll:Zn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ll).mul(Vl),s=this.previousProjectionMatrix.mul(t).mul(Ul),i=r.xy.div(r.w),n=s.xy.div(s.w);return ua(i,n)}}function Wy(e){let t=Hy.get(e);return void 0===t&&(t={},Hy.set(e,t)),t}function jy(e,t=0){const r=Wy(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const qy=Ui($y),Xy=ki((([e,t])=>To(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ky=ki((([e,t])=>To(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Yy=ki((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Qy=ki((([e,t])=>Do(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),vo(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Zy=ki((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return nn(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"}]}),Jy=ki((([e])=>sx(e.rgb))),ex=ki((([e,t=ji(1)])=>t.mix(sx(e.rgb),e.rgb))),tx=ki((([e,t=ji(1)])=>{const r=oa(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 Do(e.rgb,s,i)})),rx=ki((([e,t=ji(1)])=>{const r=en(.57735,.57735,.57735),s=t.cos();return en(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Eo(r,e.rgb).mul(s.oneMinus())))))})),sx=(e,t=en(c.getLuminanceCoefficients(new r)))=>Eo(e,t),ix=ki((([e,t=en(1),s=en(0),i=en(1),n=ji(1),a=en(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(en(a)),u=_o(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Hi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Hi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Hi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),nn(u.rgb,e.a)}));class nx extends Ks{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 ax=Vi(nx).setParameterLength(2),ox=new t;class ux extends Qu{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 lx extends ux{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 dx extends Ks{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 D;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...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=Zn(0),this._cameraFar=Zn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Us.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}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=Bi(new lx(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=Bi(new lx(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=Ph(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=Ch(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.texture.type=e.getColorBufferType(),this.scope===dx.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),ox.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(ox)),this._pixelRatio=i,this.setSize(ox.width,ox.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}dx.COLOR="color",dx.DEPTH="depth";class cx extends dx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(dx.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,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Hh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=ql.negate(),r=ll.mul(Ll),s=ji(1),i=r.mul(nn(Vl,1)),n=r.mul(nn(Vl.add(t),1)),a=Qa(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=nn(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 hx=ki((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),px=ki((([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"}]}),gx=ki((([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"}]}),mx=ki((([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)})),fx=ki((([e,t])=>{const r=dn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=dn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=mx(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),yx=dn(en(1.6605,-.1246,-.0182),en(-.5876,1.1329,-.1006),en(-.0728,-.0083,1.1187)),xx=dn(en(.6274,.0691,.0164),en(.3293,.9195,.088),en(.0433,.0113,.8956)),bx=ki((([e])=>{const t=en(e).toVar(),r=en(t.mul(t)).toVar(),s=en(r.mul(r)).toVar();return ji(15.5).mul(s.mul(r)).sub(la(40.14,s.mul(t))).add(la(31.96,s).sub(la(6.868,r.mul(t))).add(la(.4298,r).add(la(.1191,t).sub(.00232))))})),Tx=ki((([e,t])=>{const r=en(e).toVar(),s=dn(en(.856627153315983,.137318972929847,.11189821299995),en(.0951212405381588,.761241990602591,.0767994186031903),en(.0482516061458583,.101439036467562,.811302368396859)),i=dn(en(1.1271005818144368,-.1413297634984383,-.14132976349843826),en(-.11060664309660323,1.157823702216272,-.11060664309660294),en(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=ji(-12.47393),a=ji(4.026069);return r.mulAssign(t),r.assign(xx.mul(r)),r.assign(s.mul(r)),r.assign(_o(r,1e-10)),r.assign(ja(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Io(r,0,1)),r.assign(bx(r)),r.assign(i.mul(r)),r.assign(Ro(_o(en(0),r),en(2.2))),r.assign(yx.mul(r)),r.assign(Io(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),_x=ki((([e,t])=>{const r=ji(.76),s=ji(.15);e=e.mul(t);const i=To(e.r,To(e.g,e.b)),n=Xo(i.lessThan(.08),i.sub(la(6.25,i.mul(i))),.04);e.subAssign(n);const a=_o(e.r,_o(e.g,e.b));Hi(a.lessThan(r),(()=>e));const o=ua(1,r),u=ua(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ua(1,da(1,s.mul(a.sub(u)).add(1)));return Do(e,en(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class vx extends js{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 Nx=Vi(vx).setParameterLength(1,3);class Sx extends vx{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 a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const wx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Ex extends js{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:ji()}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?Ds(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 Ax=Vi(Ex).setParameterLength(1);class Rx 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 Cx{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 Mx=new Rx;class Px extends js{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Rx,this._output=Ax(null),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]=Ax(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]=Ax(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 Cx(this),t=Mx.get("THREE"),r=Mx.get("TSL"),s=this.getMethod(),i=[e,this._local,Mx,()=>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:ji()}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=[_s(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return vs(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 Lx=Vi(Px).setParameterLength(1,2);function Fx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Gl.z).negate()}const Bx=ki((([e,t],r)=>{const s=Fx(r);return Oo(e,t,s)})),Dx=ki((([e],t)=>{const r=Fx(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ix=ki((([e,t])=>nn(t.toFloat().mix(Dn.rgb,e.toVec3()),Dn.a)));let Vx=null,Ux=null;class Ox extends js{static get type(){return"RangeNode"}constructor(e=ji(),t=ji()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ps(this.minNode.value)),r=e.getTypeLength(Ps(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,a=e.getTypeLength(Ps(i)),o=e.getTypeLength(Ps(n));Vx=Vx||new s,Ux=Ux||new s,Vx.setScalar(0),Ux.setScalar(0),1===a?Vx.setScalar(i):i.isColor?Vx.set(i.r,i.g,i.b,1):Vx.set(i.x,i.y,i.z||0,i.w||0),1===o?Ux.setScalar(n):n.isColor?Ux.set(n.r,n.g,n.b,1):Ux.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;eBi(new Gx(e,t)),Hx=zx("numWorkgroups","uvec3"),$x=zx("workgroupId","uvec3"),Wx=zx("globalId","uvec3"),jx=zx("localId","uvec3"),qx=zx("subgroupSize","uint");const Xx=Vi(class extends js{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 Kx extends qs{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 Yx extends js{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Bi(new Kx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Qx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(1===r.length&&!0===r[0].isStackNode))return void 0===t.constNode&&(t.constNode=Uu(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}Qx.ATOMIC_LOAD="atomicLoad",Qx.ATOMIC_STORE="atomicStore",Qx.ATOMIC_ADD="atomicAdd",Qx.ATOMIC_SUB="atomicSub",Qx.ATOMIC_MAX="atomicMax",Qx.ATOMIC_MIN="atomicMin",Qx.ATOMIC_AND="atomicAnd",Qx.ATOMIC_OR="atomicOr",Qx.ATOMIC_XOR="atomicXor";const Zx=Vi(Qx),Jx=(e,t,r)=>Zx(e,t,r).toStack();let eb;function tb(e){eb=eb||new WeakMap;let t=eb.get(e);return void 0===t&&eb.set(e,t={}),t}function rb(e){const t=tb(e);return t.shadowMatrix||(t.shadowMatrix=Zn("mat4").setGroup(Kn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function sb(e,t=Ol){const r=rb(e).mul(t);return r.xyz.div(r.w)}function ib(e){const t=tb(e);return t.position||(t.position=Zn(new r).setGroup(Kn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function nb(e){const t=tb(e);return t.targetPosition||(t.targetPosition=Zn(new r).setGroup(Kn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function ab(e){const t=tb(e);return t.viewPosition||(t.viewPosition=Zn(new r).setGroup(Kn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const ob=e=>cl.transformDirection(ib(e).sub(nb(e))),ub=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},lb=new WeakMap;class db extends js{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=en().toVar(),this.totalSpecularNode=en().toVar(),this.outgoingLightNode=en().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Bi(e));else{let s=null;if(null!==r&&(s=ub(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;lb.has(e)?s=lb.get(e):(s=Bi(new r(e)),lb.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=en(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class cb extends js{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Us.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){hb.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Ol)}dispose(){this.updateBeforeType=Us.NONE}}const hb=mn("vec3","shadowPositionWorld");function pb(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 gb(e,t){return t=pb(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function mb(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 fb(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function yb(e,t){return t=fb(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function xb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function bb(e,t,r){return r=yb(t,r=gb(e,r))}function Tb(e,t,r){mb(e,r),xb(t,r)}var _b=Object.freeze({__proto__:null,resetRendererAndSceneState:bb,resetRendererState:gb,resetSceneState:yb,restoreRendererAndSceneState:Tb,restoreRendererState:mb,restoreSceneState:xb,saveRendererAndSceneState:function(e,t,r={}){return r=fb(t,r=pb(e,r))},saveRendererState:pb,saveSceneState:fb});const vb=new WeakMap,Nb=ki((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Zu(e,t.xy).label("t_basic");return e.isDepthArrayTexture&&(s=s.depth(r)),s.compare(t.z)})),Sb=ki((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Zu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=md("mapSize","vec2",r).setGroup(Kn),a=md("radius","float",r).setGroup(Kn),o=Yi(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return oa(i(t.xy.add(Yi(u,l)),t.z),i(t.xy.add(Yi(0,l)),t.z),i(t.xy.add(Yi(d,l)),t.z),i(t.xy.add(Yi(h,p)),t.z),i(t.xy.add(Yi(0,p)),t.z),i(t.xy.add(Yi(g,p)),t.z),i(t.xy.add(Yi(u,0)),t.z),i(t.xy.add(Yi(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(Yi(g,0)),t.z),i(t.xy.add(Yi(d,0)),t.z),i(t.xy.add(Yi(h,m)),t.z),i(t.xy.add(Yi(0,m)),t.z),i(t.xy.add(Yi(g,m)),t.z),i(t.xy.add(Yi(u,c)),t.z),i(t.xy.add(Yi(0,c)),t.z),i(t.xy.add(Yi(d,c)),t.z)).mul(1/17)})),wb=ki((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Zu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=md("mapSize","vec2",r).setGroup(Kn),a=Yi(1).div(n),o=a.x,u=a.y,l=t.xy,d=Za(l.mul(n).add(.5));return l.subAssign(d.mul(a)),oa(i(l,t.z),i(l.add(Yi(o,0)),t.z),i(l.add(Yi(0,u)),t.z),i(l.add(a),t.z),Do(i(l.add(Yi(o.negate(),0)),t.z),i(l.add(Yi(o.mul(2),0)),t.z),d.x),Do(i(l.add(Yi(o.negate(),u)),t.z),i(l.add(Yi(o.mul(2),u)),t.z),d.x),Do(i(l.add(Yi(0,u.negate())),t.z),i(l.add(Yi(0,u.mul(2))),t.z),d.y),Do(i(l.add(Yi(o,u.negate())),t.z),i(l.add(Yi(o,u.mul(2))),t.z),d.y),Do(Do(i(l.add(Yi(o.negate(),u.negate())),t.z),i(l.add(Yi(o.mul(2),u.negate())),t.z),d.x),Do(i(l.add(Yi(o.negate(),u.mul(2))),t.z),i(l.add(Yi(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)})),Eb=ki((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=ji(1).toVar();let i=Zu(e).sample(t.xy);(e.isDepthArrayTexture||e.isDataArrayTexture)&&(i=i.depth(r)),i=i.rg;const n=vo(t.z,i.x);return Hi(n.notEqual(ji(1)),(()=>{const e=t.z.sub(i.x),r=_o(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Io(ua(a,.3).div(.95-.3)),s.assign(Io(_o(n,a)))})),s})),Ab=ki((([e,t,r])=>{let s=Ol.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Rb=e=>{let t=vb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=md("near","float",t).setGroup(Kn),s=md("far","float",t).setGroup(Kn),i=bl(e);return Ab(i,r,s)})(e):null;t=new Hh,t.colorNode=nn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,vb.set(e,t)}return t},Cb=new km,Mb=[],Pb=(e,t,r,s)=>{Mb[0]=e,Mb[1]=t;let i=Cb.get(Mb);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Fs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,Cb.set(Mb,i)),Mb[0]=null,Mb[1]=null,i},Lb=ki((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=ji(0).toVar("meanVertical"),a=ji(0).toVar("squareMeanVertical"),o=e.lessThanEqual(ji(1)).select(ji(0),ji(2).div(e.sub(1))),u=e.lessThanEqual(ji(1)).select(ji(0),ji(-1));Yc({start:qi(0),end:qi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add(ji(e).mul(o));let d=s.sample(oa(ph.xy,Yi(0,l).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))})),n.divAssign(e),a.divAssign(e);const l=qa(a.sub(n.mul(n)));return Yi(n,l)})),Fb=ki((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=ji(0).toVar("meanHorizontal"),a=ji(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(ji(1)).select(ji(0),ji(2).div(e.sub(1))),u=e.lessThanEqual(ji(1)).select(ji(0),ji(-1));Yc({start:qi(0),end:qi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add(ji(e).mul(o));let d=s.sample(oa(ph.xy,Yi(l,0).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(oa(d.y.mul(d.y),d.x.mul(d.x)))})),n.divAssign(e),a.divAssign(e);const l=qa(a.sub(n.mul(n)));return Yi(n,l)})),Bb=[Nb,Sb,wb,Eb];let Db;const Ib=new Ty;class Vb extends cb{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._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=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,depthLayer:n});return a.select(o,ji(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=md("bias","float",r).setGroup(Kn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=md("near","float",r.camera).setGroup(Kn),s=md("far","float",r.camera).setGroup(Kn);n=Lh(e.negate(),t,s)}return a=en(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return Bb[e]}setupRenderTarget(e,t){const r=new D(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Ve;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie){n.compareFunction=null,a.isRenderTargetArray?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}));let t=Zu(n);n.isDepthArrayTexture&&(t=t.depth(this.depthLayer));let r=Zu(this.vsmShadowMapVertical.texture);n.isDepthArrayTexture&&(r=r.depth(this.depthLayer));const i=md("blurSamples","float",s).setGroup(Kn),o=md("radius","float",s).setGroup(Kn),u=md("mapSize","vec2",s).setGroup(Kn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Hh);l.fragmentNode=Lb({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Hh),l.fragmentNode=Fb({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=md("intensity","float",s).setGroup(Kn),u=md("normalBias","float",s).setGroup(Kn),l=rb(r).mul(hb.add(Zl.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===Ie?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=Zu(a.texture,d);n.isDepthArrayTexture&&(g=g.depth(this.depthLayer));const m=Do(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return ki((()=>{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,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");Db=bb(i,n,Db),n.overrideMaterial=Rb(r),i.setRenderObjectFunction(Pb(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),!0!==r.isPointLight&&o===Ie&&this.vsmPass(i),s.camera.layers.mask=l,Tb(i,n,Db)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),Ib.material=this.vsmMaterialVertical,Ib.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Ib.material=this.vsmMaterialHorizontal,Ib.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;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Ub=(e,t)=>Bi(new Vb(e,t)),Ob=new e,kb=ki((([e,t])=>{const r=e.toVar(),s=no(r),i=da(1,_o(s.x,_o(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Yi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return Hi(s.z.greaterThanEqual(a),(()=>{Hi(r.z.greaterThan(0),(()=>{n.x.assign(ua(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=ao(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{const e=ao(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Yi(.125,.25).mul(n).add(Yi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Gb=ki((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Zu(e,kb(t,s.y)).compare(r))),zb=ki((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=md("radius","float",i).setGroup(Kn),a=Yi(-1,1).mul(n).mul(s.y);return Zu(e,kb(t.add(a.xyy),s.y)).compare(r).add(Zu(e,kb(t.add(a.yyy),s.y)).compare(r)).add(Zu(e,kb(t.add(a.xyx),s.y)).compare(r)).add(Zu(e,kb(t.add(a.yyx),s.y)).compare(r)).add(Zu(e,kb(t,s.y)).compare(r)).add(Zu(e,kb(t.add(a.xxy),s.y)).compare(r)).add(Zu(e,kb(t.add(a.yxy),s.y)).compare(r)).add(Zu(e,kb(t.add(a.xxx),s.y)).compare(r)).add(Zu(e,kb(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),Hb=ki((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Zn("float").setGroup(Kn).onRenderUpdate((()=>s.camera.near)),o=Zn("float").setGroup(Kn).onRenderUpdate((()=>s.camera.far)),u=md("bias","float",s).setGroup(Kn),l=Zn(s.mapSize).setGroup(Kn),d=ji(1).toVar();return Hi(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=Yi(1).div(l.mul(Yi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),$b=new s,Wb=new t,jb=new t;class qb extends Vb{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Oe?Gb:zb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return Hb({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,a=t.getFrameExtents();jb.copy(t.mapSize),jb.multiply(a),r.setSize(jb.width,jb.height),Wb.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Ob),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eBi(new qb(e,t));class Kb extends sh{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Zn(this.color).setGroup(Kn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Us.FRAME}customCacheKey(){return Ns(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return ab(this.light).sub(e.context.positionView||Gl)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return Ub(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Bi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),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);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Yb=ki((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Qb=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Yb({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Zb extends Kb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Zn(0).setGroup(Kn),this.decayExponentNode=Zn(2).setGroup(Kn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Xb(this.light)}setupDirect(e){return Qb({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const Jb=ki((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),eT=ki((([e=ju()],{renderer:t,material:r})=>{const s=ji(1).toVar(),i=Bo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=ji(i.fwidth()).toVar();s.assign(Oo(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),tT=ki((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=Ki(e).toVar();return Xo(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),rT=ki((([e,t])=>{const r=Ki(t).toVar(),s=ji(e).toVar();return Xo(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),sT=ki((([e])=>{const t=ji(e).toVar();return qi(Ka(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),iT=ki((([e,t])=>{const r=ji(e).toVar();return t.assign(sT(r)),r.sub(ji(t))})),nT=Hf([ki((([e,t,r,s,i,n])=>{const a=ji(n).toVar(),o=ji(i).toVar(),u=ji(s).toVar(),l=ji(r).toVar(),d=ji(t).toVar(),c=ji(e).toVar(),h=ji(ua(1,o)).toVar();return ua(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]}),ki((([e,t,r,s,i,n])=>{const a=ji(n).toVar(),o=ji(i).toVar(),u=en(s).toVar(),l=en(r).toVar(),d=en(t).toVar(),c=en(e).toVar(),h=ji(ua(1,o)).toVar();return ua(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]})]),aT=Hf([ki((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=ji(d).toVar(),h=ji(l).toVar(),p=ji(u).toVar(),g=ji(o).toVar(),m=ji(a).toVar(),f=ji(n).toVar(),y=ji(i).toVar(),x=ji(s).toVar(),b=ji(r).toVar(),T=ji(t).toVar(),_=ji(e).toVar(),v=ji(ua(1,p)).toVar(),N=ji(ua(1,h)).toVar();return ji(ua(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),ki((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=ji(d).toVar(),h=ji(l).toVar(),p=ji(u).toVar(),g=en(o).toVar(),m=en(a).toVar(),f=en(n).toVar(),y=en(i).toVar(),x=en(s).toVar(),b=en(r).toVar(),T=en(t).toVar(),_=en(e).toVar(),v=ji(ua(1,p)).toVar(),N=ji(ua(1,h)).toVar();return ji(ua(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),oT=ki((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=Xi(e).toVar(),a=Xi(n.bitAnd(Xi(7))).toVar(),o=ji(tT(a.lessThan(Xi(4)),i,s)).toVar(),u=ji(la(2,tT(a.lessThan(Xi(4)),s,i))).toVar();return rT(o,Ki(a.bitAnd(Xi(1)))).add(rT(u,Ki(a.bitAnd(Xi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),uT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=ji(t).toVar(),o=Xi(e).toVar(),u=Xi(o.bitAnd(Xi(15))).toVar(),l=ji(tT(u.lessThan(Xi(8)),a,n)).toVar(),d=ji(tT(u.lessThan(Xi(4)),n,tT(u.equal(Xi(12)).or(u.equal(Xi(14))),a,i))).toVar();return rT(l,Ki(u.bitAnd(Xi(1)))).add(rT(d,Ki(u.bitAnd(Xi(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"}]}),lT=Hf([oT,uT]),dT=ki((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=rn(e).toVar();return en(lT(n.x,i,s),lT(n.y,i,s),lT(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"}]}),cT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=ji(t).toVar(),o=rn(e).toVar();return en(lT(o.x,a,n,i),lT(o.y,a,n,i),lT(o.z,a,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"}]}),hT=Hf([dT,cT]),pT=ki((([e])=>{const t=ji(e).toVar();return la(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),gT=ki((([e])=>{const t=ji(e).toVar();return la(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),mT=Hf([pT,ki((([e])=>{const t=en(e).toVar();return la(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),fT=Hf([gT,ki((([e])=>{const t=en(e).toVar();return la(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),yT=ki((([e,t])=>{const r=qi(t).toVar(),s=Xi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(qi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),xT=ki((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(yT(r,qi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(yT(e,qi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(yT(t,qi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(yT(r,qi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(yT(e,qi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(yT(t,qi(4))),t.addAssign(e)})),bT=ki((([e,t,r])=>{const s=Xi(r).toVar(),i=Xi(t).toVar(),n=Xi(e).toVar();return s.bitXorAssign(i),s.subAssign(yT(i,qi(14))),n.bitXorAssign(s),n.subAssign(yT(s,qi(11))),i.bitXorAssign(n),i.subAssign(yT(n,qi(25))),s.bitXorAssign(i),s.subAssign(yT(i,qi(16))),n.bitXorAssign(s),n.subAssign(yT(s,qi(4))),i.bitXorAssign(n),i.subAssign(yT(n,qi(14))),s.bitXorAssign(i),s.subAssign(yT(i,qi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),TT=ki((([e])=>{const t=Xi(e).toVar();return ji(t).div(ji(Xi(qi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),_T=ki((([e])=>{const t=ji(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"}]}),vT=Hf([ki((([e])=>{const t=qi(e).toVar(),r=Xi(Xi(1)).toVar(),s=Xi(Xi(qi(3735928559)).add(r.shiftLeft(Xi(2))).add(Xi(13))).toVar();return bT(s.add(Xi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),ki((([e,t])=>{const r=qi(t).toVar(),s=qi(e).toVar(),i=Xi(Xi(2)).toVar(),n=Xi().toVar(),a=Xi().toVar(),o=Xi().toVar();return n.assign(a.assign(o.assign(Xi(qi(3735928559)).add(i.shiftLeft(Xi(2))).add(Xi(13))))),n.addAssign(Xi(s)),a.addAssign(Xi(r)),bT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),ki((([e,t,r])=>{const s=qi(r).toVar(),i=qi(t).toVar(),n=qi(e).toVar(),a=Xi(Xi(3)).toVar(),o=Xi().toVar(),u=Xi().toVar(),l=Xi().toVar();return o.assign(u.assign(l.assign(Xi(qi(3735928559)).add(a.shiftLeft(Xi(2))).add(Xi(13))))),o.addAssign(Xi(n)),u.addAssign(Xi(i)),l.addAssign(Xi(s)),bT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),ki((([e,t,r,s])=>{const i=qi(s).toVar(),n=qi(r).toVar(),a=qi(t).toVar(),o=qi(e).toVar(),u=Xi(Xi(4)).toVar(),l=Xi().toVar(),d=Xi().toVar(),c=Xi().toVar();return l.assign(d.assign(c.assign(Xi(qi(3735928559)).add(u.shiftLeft(Xi(2))).add(Xi(13))))),l.addAssign(Xi(o)),d.addAssign(Xi(a)),c.addAssign(Xi(n)),xT(l,d,c),l.addAssign(Xi(i)),bT(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"}]}),ki((([e,t,r,s,i])=>{const n=qi(i).toVar(),a=qi(s).toVar(),o=qi(r).toVar(),u=qi(t).toVar(),l=qi(e).toVar(),d=Xi(Xi(5)).toVar(),c=Xi().toVar(),h=Xi().toVar(),p=Xi().toVar();return c.assign(h.assign(p.assign(Xi(qi(3735928559)).add(d.shiftLeft(Xi(2))).add(Xi(13))))),c.addAssign(Xi(l)),h.addAssign(Xi(u)),p.addAssign(Xi(o)),xT(c,h,p),c.addAssign(Xi(a)),h.addAssign(Xi(n)),bT(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"}]})]),NT=Hf([ki((([e,t])=>{const r=qi(t).toVar(),s=qi(e).toVar(),i=Xi(vT(s,r)).toVar(),n=rn().toVar();return n.x.assign(i.bitAnd(qi(255))),n.y.assign(i.shiftRight(qi(8)).bitAnd(qi(255))),n.z.assign(i.shiftRight(qi(16)).bitAnd(qi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),ki((([e,t,r])=>{const s=qi(r).toVar(),i=qi(t).toVar(),n=qi(e).toVar(),a=Xi(vT(n,i,s)).toVar(),o=rn().toVar();return o.x.assign(a.bitAnd(qi(255))),o.y.assign(a.shiftRight(qi(8)).bitAnd(qi(255))),o.z.assign(a.shiftRight(qi(16)).bitAnd(qi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),ST=Hf([ki((([e])=>{const t=Yi(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=ji(iT(t.x,r)).toVar(),n=ji(iT(t.y,s)).toVar(),a=ji(_T(i)).toVar(),o=ji(_T(n)).toVar(),u=ji(nT(lT(vT(r,s),i,n),lT(vT(r.add(qi(1)),s),i.sub(1),n),lT(vT(r,s.add(qi(1))),i,n.sub(1)),lT(vT(r.add(qi(1)),s.add(qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return mT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=qi().toVar(),n=ji(iT(t.x,r)).toVar(),a=ji(iT(t.y,s)).toVar(),o=ji(iT(t.z,i)).toVar(),u=ji(_T(n)).toVar(),l=ji(_T(a)).toVar(),d=ji(_T(o)).toVar(),c=ji(aT(lT(vT(r,s,i),n,a,o),lT(vT(r.add(qi(1)),s,i),n.sub(1),a,o),lT(vT(r,s.add(qi(1)),i),n,a.sub(1),o),lT(vT(r.add(qi(1)),s.add(qi(1)),i),n.sub(1),a.sub(1),o),lT(vT(r,s,i.add(qi(1))),n,a,o.sub(1)),lT(vT(r.add(qi(1)),s,i.add(qi(1))),n.sub(1),a,o.sub(1)),lT(vT(r,s.add(qi(1)),i.add(qi(1))),n,a.sub(1),o.sub(1)),lT(vT(r.add(qi(1)),s.add(qi(1)),i.add(qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return fT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wT=Hf([ki((([e])=>{const t=Yi(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=ji(iT(t.x,r)).toVar(),n=ji(iT(t.y,s)).toVar(),a=ji(_T(i)).toVar(),o=ji(_T(n)).toVar(),u=en(nT(hT(NT(r,s),i,n),hT(NT(r.add(qi(1)),s),i.sub(1),n),hT(NT(r,s.add(qi(1))),i,n.sub(1)),hT(NT(r.add(qi(1)),s.add(qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return mT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=qi().toVar(),n=ji(iT(t.x,r)).toVar(),a=ji(iT(t.y,s)).toVar(),o=ji(iT(t.z,i)).toVar(),u=ji(_T(n)).toVar(),l=ji(_T(a)).toVar(),d=ji(_T(o)).toVar(),c=en(aT(hT(NT(r,s,i),n,a,o),hT(NT(r.add(qi(1)),s,i),n.sub(1),a,o),hT(NT(r,s.add(qi(1)),i),n,a.sub(1),o),hT(NT(r.add(qi(1)),s.add(qi(1)),i),n.sub(1),a.sub(1),o),hT(NT(r,s,i.add(qi(1))),n,a,o.sub(1)),hT(NT(r.add(qi(1)),s,i.add(qi(1))),n.sub(1),a,o.sub(1)),hT(NT(r,s.add(qi(1)),i.add(qi(1))),n,a.sub(1),o.sub(1)),hT(NT(r.add(qi(1)),s.add(qi(1)),i.add(qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return fT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),ET=Hf([ki((([e])=>{const t=ji(e).toVar(),r=qi(sT(t)).toVar();return TT(vT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),ki((([e])=>{const t=Yi(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar();return TT(vT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar();return TT(vT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),ki((([e])=>{const t=nn(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar(),n=qi(sT(t.w)).toVar();return TT(vT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),AT=Hf([ki((([e])=>{const t=ji(e).toVar(),r=qi(sT(t)).toVar();return en(TT(vT(r,qi(0))),TT(vT(r,qi(1))),TT(vT(r,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),ki((([e])=>{const t=Yi(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar();return en(TT(vT(r,s,qi(0))),TT(vT(r,s,qi(1))),TT(vT(r,s,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar();return en(TT(vT(r,s,i,qi(0))),TT(vT(r,s,i,qi(1))),TT(vT(r,s,i,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),ki((([e])=>{const t=nn(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar(),n=qi(sT(t.w)).toVar();return en(TT(vT(r,s,i,n,qi(0))),TT(vT(r,s,i,n,qi(1))),TT(vT(r,s,i,n,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),RT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar(),u=ji(0).toVar(),l=ji(1).toVar();return Yc(a,(()=>{u.addAssign(l.mul(ST(o))),l.mulAssign(i),o.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"}]}),CT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar(),u=en(0).toVar(),l=ji(1).toVar();return Yc(a,(()=>{u.addAssign(l.mul(wT(o))),l.mulAssign(i),o.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"}]}),MT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar();return Yi(RT(o,a,n,i),RT(o.add(en(qi(19),qi(193),qi(17))),a,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"}]}),PT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar(),u=en(CT(o,a,n,i)).toVar(),l=ji(RT(o.add(en(qi(19),qi(193),qi(17))),a,n,i)).toVar();return nn(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"}]}),LT=Hf([ki((([e,t,r,s,i,n,a])=>{const o=qi(a).toVar(),u=ji(n).toVar(),l=qi(i).toVar(),d=qi(s).toVar(),c=qi(r).toVar(),h=qi(t).toVar(),p=Yi(e).toVar(),g=en(AT(Yi(h.add(d),c.add(l)))).toVar(),m=Yi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Yi(Yi(ji(h),ji(c)).add(m)).toVar(),y=Yi(f.sub(p)).toVar();return Hi(o.equal(qi(2)),(()=>no(y.x).add(no(y.y)))),Hi(o.equal(qi(3)),(()=>_o(no(y.x),no(y.y)))),Eo(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"}]}),ki((([e,t,r,s,i,n,a,o,u])=>{const l=qi(u).toVar(),d=ji(o).toVar(),c=qi(a).toVar(),h=qi(n).toVar(),p=qi(i).toVar(),g=qi(s).toVar(),m=qi(r).toVar(),f=qi(t).toVar(),y=en(e).toVar(),x=en(AT(en(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=en(en(ji(f),ji(m),ji(g)).add(x)).toVar(),T=en(b.sub(y)).toVar();return Hi(l.equal(qi(2)),(()=>no(T.x).add(no(T.y)).add(no(T.z)))),Hi(l.equal(qi(3)),(()=>_o(_o(no(T.x),no(T.y)),no(T.z)))),Eo(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"}]})]),FT=ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=Yi(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=Yi(iT(n.x,a),iT(n.y,o)).toVar(),l=ji(1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{const r=ji(LT(u,e,t,a,o,i,s)).toVar();l.assign(To(l,r))}))})),Hi(s.equal(qi(0)),(()=>{l.assign(qa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),BT=ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=Yi(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=Yi(iT(n.x,a),iT(n.y,o)).toVar(),l=Yi(1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{const r=ji(LT(u,e,t,a,o,i,s)).toVar();Hi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Hi(s.equal(qi(0)),(()=>{l.assign(qa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),DT=ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=Yi(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=Yi(iT(n.x,a),iT(n.y,o)).toVar(),l=en(1e6,1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{const r=ji(LT(u,e,t,a,o,i,s)).toVar();Hi(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)}))}))})),Hi(s.equal(qi(0)),(()=>{l.assign(qa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),IT=Hf([FT,ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=en(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=qi().toVar(),l=en(iT(n.x,a),iT(n.y,o),iT(n.z,u)).toVar(),d=ji(1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{Yc({start:-1,end:qi(1),name:"z",condition:"<="},(({z:r})=>{const n=ji(LT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(To(d,n))}))}))})),Hi(s.equal(qi(0)),(()=>{d.assign(qa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),VT=Hf([BT,ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=en(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=qi().toVar(),l=en(iT(n.x,a),iT(n.y,o),iT(n.z,u)).toVar(),d=Yi(1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{Yc({start:-1,end:qi(1),name:"z",condition:"<="},(({z:r})=>{const n=ji(LT(l,e,t,r,a,o,u,i,s)).toVar();Hi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Hi(s.equal(qi(0)),(()=>{d.assign(qa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),UT=Hf([DT,ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=en(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=qi().toVar(),l=en(iT(n.x,a),iT(n.y,o),iT(n.z,u)).toVar(),d=en(1e6,1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{Yc({start:-1,end:qi(1),name:"z",condition:"<="},(({z:r})=>{const n=ji(LT(l,e,t,r,a,o,u,i,s)).toVar();Hi(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)}))}))}))})),Hi(s.equal(qi(0)),(()=>{d.assign(qa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),OT=ki((([e])=>{const t=e.y,r=e.z,s=en().toVar();return Hi(t.lessThan(1e-4),(()=>{s.assign(en(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(Ka(i)).mul(6).toVar();const n=qi(mo(i)),a=i.sub(ji(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());Hi(n.equal(qi(0)),(()=>{s.assign(en(r,l,o))})).ElseIf(n.equal(qi(1)),(()=>{s.assign(en(u,r,o))})).ElseIf(n.equal(qi(2)),(()=>{s.assign(en(o,r,l))})).ElseIf(n.equal(qi(3)),(()=>{s.assign(en(o,u,r))})).ElseIf(n.equal(qi(4)),(()=>{s.assign(en(l,o,r))})).Else((()=>{s.assign(en(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),kT=ki((([e])=>{const t=en(e).toVar(),r=ji(t.x).toVar(),s=ji(t.y).toVar(),i=ji(t.z).toVar(),n=ji(To(r,To(s,i))).toVar(),a=ji(_o(r,_o(s,i))).toVar(),o=ji(a.sub(n)).toVar(),u=ji().toVar(),l=ji().toVar(),d=ji().toVar();return d.assign(a),Hi(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),Hi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Hi(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(oa(2,i.sub(r).div(o)))})).Else((()=>{u.assign(oa(4,r.sub(s).div(o)))})),u.mulAssign(1/6),Hi(u.lessThan(0),(()=>{u.addAssign(1)}))})),en(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),GT=ki((([e])=>{const t=en(e).toVar(),r=sn(ma(t,en(.04045))).toVar(),s=en(t.div(12.92)).toVar(),i=en(Ro(_o(t.add(en(.055)),en(0)).div(1.055),en(2.4))).toVar();return Do(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),zT=(e,t)=>{e=ji(e),t=ji(t);const r=Yi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Oo(e.sub(r),e.add(r),t)},HT=(e,t,r,s)=>Do(e,t,r[s].clamp()),$T=(e,t,r,s,i)=>Do(e,t,zT(r,s[i])),WT=ki((([e,t,r])=>{const s=Qa(e).toVar(),i=ua(ji(.5).mul(t.sub(r)),Ol).div(s).toVar(),n=ua(ji(-.5).mul(t.sub(r)),Ol).div(s).toVar(),a=en().toVar();a.x=s.x.greaterThan(ji(0)).select(i.x,n.x),a.y=s.y.greaterThan(ji(0)).select(i.y,n.y),a.z=s.z.greaterThan(ji(0)).select(i.z,n.z);const o=To(To(a.x,a.y),a.z).toVar();return Ol.add(s.mul(o)).toVar().sub(r)})),jT=ki((([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(la(r,r).sub(la(s,s)))),n}));var qT=Object.freeze({__proto__:null,BRDF_GGX:Lp,BRDF_Lambert:yp,BasicPointShadowFilter:Gb,BasicShadowFilter:Nb,Break:Qc,Const:ru,Continue:()=>Uu("continue").toStack(),DFGApprox:Fp,D_GGX:Cp,Discard:Ou,EPSILON:Da,F_Schlick:fp,Fn:ki,INFINITY:Ia,If:Hi,Loop:Yc,NodeAccess:ks,NodeShaderStage:Vs,NodeType:Os,NodeUpdateType:Us,PCFShadowFilter:Sb,PCFSoftShadowFilter:wb,PI:Va,PI2:Ua,PointShadowFilter:zb,Return:()=>Uu("return").toStack(),Schlick_to_F0:Dp,ScriptableNodeResources:Mx,ShaderNode:Fi,Stack:$i,Switch:(...e)=>ni.Switch(...e),TBNViewMatrix:Ld,VSMShadowFilter:Eb,V_GGX_SmithCorrelated:Ap,Var:tu,abs:no,acesFilmicToneMapping:fx,acos:so,add:oa,addMethodChaining:oi,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Tx,all:Oa,alphaT:Rn,and:xa,anisotropy:Cn,anisotropyB:Pn,anisotropyT:Mn,any:ka,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),$i(e)),array:ea,arrayBuffer:e=>Bi(new si(e,"ArrayBuffer")),asin:ro,assign:ra,atan:io,atan2:$o,atomicAdd:(e,t)=>Jx(Qx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Jx(Qx.ATOMIC_AND,e,t),atomicFunc:Jx,atomicLoad:e=>Jx(Qx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Jx(Qx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Jx(Qx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Jx(Qx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Jx(Qx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Jx(Qx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Jx(Qx.ATOMIC_XOR,e,t),attenuationColor:Hn,attenuationDistance:zn,attribute:Wu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Cs("float")):(r=Ms(t),s=Cs(t));const i=new Ry(e,r,s);return Wc(i,t,e)},backgroundBlurriness:By,backgroundIntensity:Dy,backgroundRotation:Iy,batch:Gc,billboarding:Kf,bitAnd:va,bitNot:Na,bitOr:Sa,bitXor:wa,bitangentGeometry:Ed,bitangentLocal:Ad,bitangentView:Rd,bitangentWorld:Cd,bitcast:xo,blendBurn:Xy,blendColor:Zy,blendDodge:Ky,blendOverlay:Qy,blendScreen:Yy,blur:Bg,bool:Ki,buffer:tl,bufferAttribute:Su,bumpMap:Gd,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Xy(e)),bvec2:Ji,bvec3:sn,bvec4:un,bypass:Fu,cache:Pu,call:ia,cameraFar:ul,cameraIndex:al,cameraNear:ol,cameraNormalMatrix:pl,cameraPosition:gl,cameraProjectionMatrix:ll,cameraProjectionMatrixInverse:dl,cameraViewMatrix:cl,cameraWorldMatrix:hl,cbrt:Fo,cdl:ix,ceil:Ya,checker:Jb,cineonToneMapping:gx,clamp:Io,clearcoat:_n,clearcoatRoughness:vn,code:Nx,color:Wi,colorSpaceToWorking:mu,colorToDirection:e=>Bi(e).mul(2).sub(1),compute:Cu,computeSkinning:(e,t=null)=>{const r=new qc(e);return r.positionNode=Wc(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Pc).toVar(),r.skinIndexNode=Wc(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Pc).toVar(),r.skinWeightNode=Wc(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Pc).toVar(),r.bindMatrixNode=Zn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Zn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=tl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Bi(r)},cond:Ko,context:Qo,convert:pn,convertColorSpace:(e,t,r)=>Bi(new cu(Bi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():Ny(e,...t),cos:eo,cross:Ao,cubeTexture:hd,cubeToUV:kb,dFdx:co,dFdy:ho,dashSize:In,debug:Hu,decrement:Pa,decrementBefore:Ca,defaultBuildStages:zs,defaultShaderStages:Gs,defined:Pi,degrees:za,deltaTime:Wf,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ix(e,Dx(t))},densityFogFactor:Dx,depth:Bh,depthPass:(e,t,r)=>Bi(new dx(dx.DEPTH,e,t,r)),difference:wo,diffuseColor:yn,directPointLight:Qb,directionToColor:Jh,dispersion:$n,distance:So,div:da,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Ky(e)),dot:Eo,drawIndex:Dc,dynamicBufferAttribute:wu,element:hn,emissive:xn,equal:ha,equals:bo,equirectUV:sp,exp:Ha,exp2:$a,expression:Uu,faceDirection:Wl,faceForward:ko,faceforward:Wo,float:ji,floor:Ka,fog:Ix,fract:Za,frameGroup:Xn,frameId:jf,frontFacing:$l,fwidth:fo,gain:(e,t)=>e.lessThan(.5)?Vf(e.mul(2),t).div(2):ua(1,Vf(la(ua(1,e),2),t).div(2)),gapSize:Vn,getConstNodeType:Li,getCurrentStack:zi,getDirection:Mg,getDistanceAttenuation:Yb,getGeometryRoughness:wp,getNormalFromDepth:Ey,getParallaxCorrectNormal:WT,getRoughness:Ep,getScreenPosition:wy,getShIrradianceAt:jT,getShadowMaterial:Rb,getShadowRenderObjectFunction:Pb,getTextureIndex:Ff,getViewPosition:Sy,globalId:Wx,glsl:(e,t)=>Nx(e,t,"glsl"),glslFn:(e,t)=>wx(e,t,"glsl"),grayscale:Jy,greaterThan:ma,greaterThanEqual:ya,hash:If,highpModelNormalViewMatrix:Dl,highpModelViewMatrix:Bl,hue:rx,increment:Ma,incrementBefore:Ra,instance:Vc,instanceIndex:Pc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Cs("float")):(r=Ms(t),s=Cs(t));const i=new Ay(e,r,s);return Wc(i,t,e)},instancedBufferAttribute:Eu,instancedDynamicBufferAttribute:Au,instancedMesh:Oc,int:qi,inverseSqrt:Xa,inversesqrt:jo,invocationLocalIndex:Bc,invocationSubgroupIndex:Fc,ior:On,iridescence:wn,iridescenceIOR:En,iridescenceThickness:An,ivec2:Qi,ivec3:tn,ivec4:an,js:(e,t)=>Nx(e,t,"js"),label:Zo,length:oo,lengthSq:Bo,lessThan:ga,lessThanEqual:fa,lightPosition:ib,lightProjectionUV:sb,lightShadowMatrix:rb,lightTargetDirection:ob,lightTargetPosition:nb,lightViewPosition:ab,lightingContext:ah,lights:(e=[])=>Bi(new db).setLights(e),linearDepth:Dh,linearToneMapping:hx,localId:jx,log:Wa,log2:ja,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Wa(r.div(t)));return ji(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),Yc(...e)),luminance:sx,mat2:ln,mat3:dn,mat4:cn,matcapUV:vm,materialAO:Ec,materialAlphaTest:$d,materialAnisotropy:lc,materialAnisotropyVector:Ac,materialAttenuationColor:yc,materialAttenuationDistance:fc,materialClearcoat:sc,materialClearcoatNormal:nc,materialClearcoatRoughness:ic,materialColor:Wd,materialDispersion:Sc,materialEmissive:qd,materialEnvIntensity:nd,materialEnvRotation:ad,materialIOR:mc,materialIridescence:dc,materialIridescenceIOR:cc,materialIridescenceThickness:hc,materialLightMap:wc,materialLineDashOffset:vc,materialLineDashSize:bc,materialLineGapSize:Tc,materialLineScale:xc,materialLineWidth:_c,materialMetalness:tc,materialNormal:rc,materialOpacity:Xd,materialPointSize:Nc,materialReference:xd,materialReflectivity:Jd,materialRefractionRatio:id,materialRotation:ac,materialRoughness:ec,materialSheen:oc,materialSheenRoughness:uc,materialShininess:jd,materialSpecular:Kd,materialSpecularColor:Qd,materialSpecularIntensity:Yd,materialSpecularStrength:Zd,materialThickness:gc,materialTransmission:pc,max:_o,maxMipLevel:Yu,mediumpModelViewMatrix:Fl,metalness:Tn,min:To,mix:Do,mixElement:zo,mod:ca,modInt:Fa,modelDirection:Sl,modelNormalMatrix:Ml,modelPosition:El,modelRadius:Cl,modelScale:Al,modelViewMatrix:Ll,modelViewPosition:Rl,modelViewProjection:Rc,modelWorldMatrix:wl,modelWorldMatrixInverse:Pl,morphReference:rh,mrt:Df,mul:la,mx_aastep:zT,mx_cell_noise_float:(e=ju())=>ET(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>ji(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=ju(),t=3,r=2,s=.5,i=1)=>RT(e,qi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=ju(),t=3,r=2,s=.5,i=1)=>MT(e,qi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=ju(),t=3,r=2,s=.5,i=1)=>CT(e,qi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=ju(),t=3,r=2,s=.5,i=1)=>PT(e,qi(t),r,s).mul(i),mx_hsvtorgb:OT,mx_noise_float:(e=ju(),t=1,r=0)=>ST(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=ju(),t=1,r=0)=>wT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=ju(),t=1,r=0)=>{e=e.convert("vec2|vec3");return nn(wT(e),ST(e.add(Yi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=ju())=>HT(e,t,r,"x"),mx_ramptb:(e,t,r=ju())=>HT(e,t,r,"y"),mx_rgbtohsv:kT,mx_safepower:(e,t=1)=>(e=ji(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=ju())=>$T(e,t,r,s,"x"),mx_splittb:(e,t,r,s=ju())=>$T(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:GT,mx_transform_uv:(e=1,t=0,r=ju())=>r.mul(e).add(t),mx_worley_noise_float:(e=ju(),t=1)=>IT(e.convert("vec2|vec3"),t,qi(1)),mx_worley_noise_vec2:(e=ju(),t=1)=>VT(e.convert("vec2|vec3"),t,qi(1)),mx_worley_noise_vec3:(e=ju(),t=1)=>UT(e.convert("vec2|vec3"),t,qi(1)),negate:uo,neutralToneMapping:_x,nodeArray:Ii,nodeImmutable:Ui,nodeObject:Bi,nodeObjects:Di,nodeProxy:Vi,normalFlat:Xl,normalGeometry:jl,normalLocal:ql,normalMap:Vd,normalView:Kl,normalWorld:Yl,normalize:Qa,not:Ta,notEqual:pa,numWorkgroups:Hx,objectDirection:yl,objectGroup:Yn,objectPosition:bl,objectRadius:vl,objectScale:Tl,objectViewPosition:_l,objectWorldMatrix:xl,oneMinus:lo,or:ba,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=$f)=>e.fract(),oscSine:(e=$f)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=$f)=>e.fract().round(),oscTriangle:(e=$f)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Dn,outputStruct:Lf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Qy(e)),overloadingFn:Hf,parabola:Vf,parallaxDirection:Fd,parallaxUV:(e,t)=>e.sub(Fd.mul(t)),parameter:(e,t)=>Bi(new Ef(e,t)),pass:(e,t,r)=>Bi(new dx(dx.COLOR,e,t,r)),passTexture:(e,t)=>Bi(new ux(e,t)),pcurve:(e,t,r)=>Ro(da(Ro(e,t),oa(Ro(e,t),Ro(ua(1,e),r))),1/t),perspectiveDepthToViewZ:Ph,pmremTexture:am,pointShadow:Xb,pointUV:My,pointWidth:Un,positionGeometry:Il,positionLocal:Vl,positionPrevious:Ul,positionView:Gl,positionViewDirection:zl,positionWorld:Ol,positionWorldDirection:kl,posterize:ax,pow:Ro,pow2:Co,pow3:Mo,pow4:Po,property:mn,radians:Ga,rand:Go,range:kx,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ix(e,Bx(t,r))},rangeFogFactor:Bx,reciprocal:go,reference:md,referenceBuffer:fd,reflect:No,reflectVector:ld,reflectView:od,reflector:e=>Bi(new my(e)),refract:Uo,refractVector:dd,refractView:ud,reinhardToneMapping:px,remainder:La,remap:Du,remapClamp:Iu,renderGroup:Kn,renderOutput:Gu,rendererReference:bu,rotate:Em,rotateUV:qf,roughness:bn,round:po,rtt:Ny,sRGBTransferEOTF:ou,sRGBTransferOETF:uu,sampler:e=>(!0===e.isNode?e:Zu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Zu(e)).convert("samplerComparison"),saturate:Vo,saturation:ex,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Yy(e)),screenCoordinate:ph,screenSize:hh,screenUV:ch,scriptable:Lx,scriptableValue:Ax,select:Xo,setCurrentStack:Gi,shaderStages:Hs,shadow:Ub,shadowPositionWorld:hb,shapeCircle:eT,sharedUniformGroup:qn,sheen:Nn,sheenRoughness:Sn,shiftLeft:Ea,shiftRight:Aa,shininess:Bn,sign:ao,sin:Ja,sinc:(e,t)=>Ja(Va.mul(t.mul(e).sub(1))).div(Va.mul(t.mul(e).sub(1))),skinning:Xc,smoothstep:Oo,smoothstepElement:Ho,specularColor:Ln,specularF90:Fn,spherizeUV:Xf,split:(e,t)=>Bi(new Zs(Bi(e),t)),spritesheetUV:Zf,sqrt:qa,stack:Rf,step:vo,storage:Wc,storageBarrier:()=>Xx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Wc(e,t,r).setPBO(!0)),storageTexture:Uy,string:(e="")=>Bi(new si(e,"string")),struct:(e,t=null)=>{const r=new Cf(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;eXx("texture").toStack(),textureBicubic:eg,textureCubeUV:Pg,textureLoad:Ju,textureSize:Xu,textureStore:(e,t,r)=>{const s=Uy(e,t,r);return null!==r&&s.toStack(),s},thickness:Gn,time:$f,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Wf.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),$f.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),$f.mul(e)),toOutputColorSpace:hu,toWorkingColorSpace:pu,toneMapping:_u,toneMappingExposure:vu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Bi(new cx(t,r,Bi(s),Bi(i),Bi(n))),transformDirection:Lo,transformNormal:ed,transformNormalToView:td,transformedBentNormalView:Bd,transformedBitangentView:Md,transformedBitangentWorld:Pd,transformedClearcoatNormalView:Jl,transformedNormalView:Ql,transformedNormalWorld:Zl,transformedTangentView:Nd,transformedTangentWorld:Sd,transmission:kn,transpose:yo,triNoise3D:kf,triplanarTexture:(...e)=>ey(...e),triplanarTextures:ey,trunc:mo,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),ki(...e)),uint:Xi,uniform:Zn,uniformArray:il,uniformGroup:jn,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Bi(new sl(e,t))),userData:(e,t,r)=>Bi(new zy(e,t,r)),uv:ju,uvec2:Zi,uvec3:rn,uvec4:on,varying:nu,varyingProperty:fn,vec2:Yi,vec3:en,vec4:nn,vectorComponents:$s,velocity:qy,vertexColor:zh,vertexIndex:Mc,vertexStage:au,vibrance:tx,viewZToLogarithmicDepth:Lh,viewZToOrthographicDepth:Ch,viewZToPerspectiveDepth:Mh,viewport:gh,viewportBottomLeft:Th,viewportCoordinate:fh,viewportDepthTexture:Ah,viewportLinearDepth:Ih,viewportMipTexture:Sh,viewportResolution:xh,viewportSafeUV:Yf,viewportSharedTexture:Yh,viewportSize:mh,viewportTexture:Nh,viewportTopLeft:bh,viewportUV:yh,wgsl:(e,t)=>Nx(e,t,"wgsl"),wgslFn:(e,t)=>wx(e,t,"wgsl"),workgroupArray:(e,t)=>Bi(new Yx("Workgroup",e,t)),workgroupBarrier:()=>Xx("workgroup").toStack(),workgroupId:$x,workingToColorSpace:gu,xor:_a});const XT=new wf;class KT extends Wm{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(XT),XT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(XT),XT.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;XT.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=Qo(nn(u).mul(Dy),{getUV:()=>Iy.mul(Yl),getTextureLevel:()=>By});let h=Rc;h=h.setZ(h.w);const p=new Hh;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=N,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new W(new ke(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=nn(u).mul(Dy),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?XT.set(0,0,0,1):"alpha-blend"===a&&XT.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=XT.r,m.g=XT.g,m.b=XT.b,m.a=XT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.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 YT=0;class QT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=YT++}}class ZT{constructor(e,t,r,s,i,n,a,o,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=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new QT(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 JT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class e_{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 t_{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class r_ extends t_{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class s_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let i_=0;class n_{constructor(e=null){this.id=i_++,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 a_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class o_{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 u_ extends o_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class l_ extends o_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class d_ extends o_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class c_ extends o_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class h_ extends o_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class p_ extends o_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class g_ extends o_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class m_ extends o_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class f_ extends u_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class y_ extends l_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class x_ extends d_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class b_ extends c_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class T_ extends h_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class __ extends p_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class v_ extends g_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class N_ extends m_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const S_=new WeakMap,w_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),E_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class A_{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.observer=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.declarations={},this.flow={code:""},this.chaining=[],this.stack=Rf(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new n_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=S_.get(this.renderer);return void 0===e&&(e=new km,S_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createRenderTargetArray(e,t,r,s){return new Ge(e,t,r,s)}createCubeRenderTarget(e,t){return new ip(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_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 QT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new QT(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 Hs)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")}( ${E_(n.r)}, ${E_(n.g)}, ${E_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>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 JT(e,t);return this.registerDeclaration(s),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||"samplerComparison"===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===T)return"int";if(t===b)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;let r=Rs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return w_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}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 $e||!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=Rf(this.stack),this.stacks.push(zi()||this.stack),Gi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Gi(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 JT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new a_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}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 a=this.uniforms.index++;n=new e_(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new t_(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any");let a=n.varying;if(void 0===a){const e=this.varyings,o=e.length;null===t&&(t="nodeVarying"+o),a=new r_(t,r,s,i),e.push(a),this.registerDeclaration(a),n.varying=a}return a}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}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 s_("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}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Sx,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 Ef(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.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new n_,this.stack=Rf();for(const r of zs)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}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,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):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 Hh),e.build(this)}else this.addFlow("compute",e);for(const e of zs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Hs){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 f_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new y_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new x_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new b_(e);if("color"===t)return new T_(e);if("mat2"===t)return new __(e);if("mat3"===t)return new v_(e);if("mat4"===t)return new N_(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?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,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${We} - Node System\n`}*[Symbol.iterator](){}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class R_{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===Us.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===Us.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===Us.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Us.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===Us.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===Us.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Us.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===Us.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===Us.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 C_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}C_.isNodeFunctionInput=!0;class M_ extends Kb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:ob(this.light),lightColor:e}}}const P_=new a,L_=new a;let F_=null;class B_ extends Kb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Zn(new r).setGroup(Kn),this.halfWidth=Zn(new r).setGroup(Kn),this.updateType=Us.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;L_.identity(),P_.copy(t.matrixWorld),P_.premultiply(r),L_.extractRotation(P_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(L_),this.halfHeight.value.applyMatrix4(L_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Zu(F_.LTC_FLOAT_1),r=Zu(F_.LTC_FLOAT_2)):(t=Zu(F_.LTC_HALF_1),r=Zu(F_.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:ab(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){F_=e}}class D_ extends Kb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Zn(0).setGroup(Kn),this.penumbraCosNode=Zn(0).setGroup(Kn),this.cutoffDistanceNode=Zn(0).setGroup(Kn),this.decayExponentNode=Zn(0).setGroup(Kn)}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 Oo(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(ob(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Yb({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=sb(i,e.context.positionWorld),r=Zu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class I_ extends D_{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=Zu(t,Yi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class V_ extends Kb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class U_ extends Kb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ib(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Zn(new e).setGroup(Kn)}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=Kl.dot(s).mul(.5).add(.5),n=Do(r,t,i);e.context.irradiance.addAssign(n)}}class O_ extends Kb{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=il(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=jT(Yl,this.lightProbe);e.context.irradiance.addAssign(t)}}class k_{parseFunction(){console.warn("Abstract function.")}}class G_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}G_.isNodeFunction=!0;const z_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,H_=/[a-z_0-9]+/gi,$_="#pragma main";class W_ extends G_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf($_),r=-1!==t?e.slice(t+12):e,s=r.match(z_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=H_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return am(r);{let e;return e=!0===r.isCubeTexture?hd(r):Zu(r),lp(e)}}if(!0===r.isTexture)return Zu(r,ch.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=md("color","color",r).setGroup(Kn),t=md("density","float",r).setGroup(Kn);return Ix(e,Dx(t))}if(r.isFog){const e=md("color","color",r).setGroup(Kn),t=md("near","float",r).setGroup(Kn),s=md("far","float",r).setGroup(Kn);return Ix(e,Bx(t,s))}console.error("THREE.Renderer: 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){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?hd(r):!0===r.isTexture?Zu(r):void 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+","+e.xr.isPresenting}hasOutputChange(e){return q_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isTextureArray?Gy(e,en(ch,nl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Zu(e,ch).renderOutput(t.toneMapping,t.currentColorSpace);return q_.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 R_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const Q_=new Pe;class Z_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new av(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Me,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;dv(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function gv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function mv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);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,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,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 Y_(this,r),this._animation=new Om(this._nodes,this.info),this._attributes=new Qm(r),this._background=new KT(this,this._nodes),this._geometries=new ef(this._attributes,this.info),this._textures=new Sf(this,r,this.info),this._pipelines=new uf(r,this._nodes),this._bindings=new lf(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new $m(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new mf(this.lighting),this._bundles=new tv,this._renderContexts=new vf,this._animation.start(),this._initialized=!0,e(this)}))),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,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:fv;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 Z_),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._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=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=Bl,this.overrideNodes.modelNormalViewMatrix=Dl):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===Bl&&this.overrideNodes.modelNormalViewMatrix===Dl}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_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,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),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=T,p.viewport=!1===p.viewportValue.equals(xv),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(xv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Z_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?Tv:bv;t.isArrayCamera||(_v.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(_v,g));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.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=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:w,transparent:E,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&E.length>0&&this._renderTransparents(E,w,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}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.xr&&this.xr.isPresenting||(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.xr&&this.xr.isPresenting||(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 a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.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);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}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)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}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(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.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}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}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,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(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){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=vv.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=vv.copy(t).floor()}else t=vv.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,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;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){const n=t.isArrayCamera?Tv:bv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&vv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(_v);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,vv.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){const n=t.isArrayCamera?Tv:bv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),vv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(_v)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Xe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Xe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class Sv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class wv extends Sv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Ym-e%Ym)%Ym;var e}get buffer(){return this._buffer}update(){return!0}}class Ev extends wv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let Av=0;class Rv extends Ev{constructor(e,t){super("UniformBuffer_"+Av++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Cv extends Ev{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?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 a=i.node.precision;if(null!==a&&(t=Uv[a]+" "+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!==T){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=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${kv[s.interpolationType]||s.interpolationType} ${Gv[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${kv[e.interpolationType]||e.interpolationType} ${Gv[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*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=Ov[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)}Ov[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} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}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 a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new Bv(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new Dv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Iv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new Rv(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new Pv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let $v=null,Wv=null;class jv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void mt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void mt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return $v=$v||new t,this.renderer.getDrawingBufferSize($v)}setScissorTest(){}getClearColor(){const e=this.renderer;return Wv=Wv||new wf,e.getClearColor(Wv),Wv.getRGB(Wv),Wv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:ft(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${We} 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 qv,Xv,Kv=0;class Yv{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 Qv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.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===T,id:Kv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Yv(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),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.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 eN,tN,rN,sN=!1;class iN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===sN&&(this._init(),sN=!0)}_init(){const e=this.gl;eN={[wr]:e.REPEAT,[Sr]:e.CLAMP_TO_EDGE,[Nr]:e.MIRRORED_REPEAT},tN={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[He]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[ze]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},rN={[Fr]:e.NEVER,[Lr]:e.ALWAYS,[Ve]:e.LESS,[Pr]:e.LEQUAL,[Mr]:e.EQUAL,[Cr]:e.GEQUAL,[Rr]:e.GREATER,[Ar]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDepthArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture||!0===e.isTextureArray?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:a}=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 o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}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,eN[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,eN[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||!0!==t.isDepthArrayTexture&&!1===t.isTextureArray&&r.texParameteri(e,r.TEXTURE_WRAP_R,eN[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,tN[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,tN[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,rN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==He&&t.minFilter!==B)return;if(t.type===L&&!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:a,depth:o}=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.isDepthArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture||e.isTextureArray?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),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:a,glType:o}=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,a,o,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:a,glFormat:o,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(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;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-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+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,a,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,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.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 nN{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 aN{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 oN={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",OVR_multiview2:"OVR_multiview2"};class uN{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:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class cN extends jv{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new nN(this),this.capabilities=new aN(this),this.attributeUtils=new Qv(this),this.textureUtils=new iN(this),this.bufferRenderer=new uN(this),this.state=new Zv(this),this.utils=new Jv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e.autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new dN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(mt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):mt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,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"),a=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"+a)}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:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),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,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eoN[t]===e)),r=this.extensions;for(let e=0;e0&&!1===x&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const hN="point-list",pN="line-list",gN="line-strip",mN="triangle-list",fN="triangle-strip",yN="never",xN="less",bN="equal",TN="less-equal",_N="greater",vN="not-equal",NN="greater-equal",SN="always",wN="store",EN="load",AN="clear",RN="ccw",CN="none",MN="front",PN="back",LN="uint16",FN="uint32",BN="r8unorm",DN="r8snorm",IN="r8uint",VN="r8sint",UN="r16uint",ON="r16sint",kN="r16float",GN="rg8unorm",zN="rg8snorm",HN="rg8uint",$N="rg8sint",WN="r32uint",jN="r32sint",qN="r32float",XN="rg16uint",KN="rg16sint",YN="rg16float",QN="rgba8unorm",ZN="rgba8unorm-srgb",JN="rgba8snorm",eS="rgba8uint",tS="rgba8sint",rS="bgra8unorm",sS="bgra8unorm-srgb",iS="rgb9e5ufloat",nS="rgb10a2unorm",aS="rg11b10ufloat",oS="rg32uint",uS="rg32sint",lS="rg32float",dS="rgba16uint",cS="rgba16sint",hS="rgba16float",pS="rgba32uint",gS="rgba32sint",mS="rgba32float",fS="depth16unorm",yS="depth24plus",xS="depth24plus-stencil8",bS="depth32float",TS="depth32float-stencil8",_S="bc1-rgba-unorm",vS="bc1-rgba-unorm-srgb",NS="bc2-rgba-unorm",SS="bc2-rgba-unorm-srgb",wS="bc3-rgba-unorm",ES="bc3-rgba-unorm-srgb",AS="bc4-r-unorm",RS="bc4-r-snorm",CS="bc5-rg-unorm",MS="bc5-rg-snorm",PS="bc6h-rgb-ufloat",LS="bc6h-rgb-float",FS="bc7-rgba-unorm",BS="bc7-rgba-unorm-srgb",DS="etc2-rgb8unorm",IS="etc2-rgb8unorm-srgb",VS="etc2-rgb8a1unorm",US="etc2-rgb8a1unorm-srgb",OS="etc2-rgba8unorm",kS="etc2-rgba8unorm-srgb",GS="eac-r11unorm",zS="eac-r11snorm",HS="eac-rg11unorm",$S="eac-rg11snorm",WS="astc-4x4-unorm",jS="astc-4x4-unorm-srgb",qS="astc-5x4-unorm",XS="astc-5x4-unorm-srgb",KS="astc-5x5-unorm",YS="astc-5x5-unorm-srgb",QS="astc-6x5-unorm",ZS="astc-6x5-unorm-srgb",JS="astc-6x6-unorm",ew="astc-6x6-unorm-srgb",tw="astc-8x5-unorm",rw="astc-8x5-unorm-srgb",sw="astc-8x6-unorm",iw="astc-8x6-unorm-srgb",nw="astc-8x8-unorm",aw="astc-8x8-unorm-srgb",ow="astc-10x5-unorm",uw="astc-10x5-unorm-srgb",lw="astc-10x6-unorm",dw="astc-10x6-unorm-srgb",cw="astc-10x8-unorm",hw="astc-10x8-unorm-srgb",pw="astc-10x10-unorm",gw="astc-10x10-unorm-srgb",mw="astc-12x10-unorm",fw="astc-12x10-unorm-srgb",yw="astc-12x12-unorm",xw="astc-12x12-unorm-srgb",bw="clamp-to-edge",Tw="repeat",_w="mirror-repeat",vw="linear",Nw="nearest",Sw="zero",ww="one",Ew="src",Aw="one-minus-src",Rw="src-alpha",Cw="one-minus-src-alpha",Mw="dst",Pw="one-minus-dst",Lw="dst-alpha",Fw="one-minus-dst-alpha",Bw="src-alpha-saturated",Dw="constant",Iw="one-minus-constant",Vw="add",Uw="subtract",Ow="reverse-subtract",kw="min",Gw="max",zw=0,Hw=15,$w="keep",Ww="zero",jw="replace",qw="invert",Xw="increment-clamp",Kw="decrement-clamp",Yw="increment-wrap",Qw="decrement-wrap",Zw="storage",Jw="read-only-storage",eE="write-only",tE="read-only",rE="read-write",sE="non-filtering",iE="comparison",nE="float",aE="unfilterable-float",oE="depth",uE="sint",lE="uint",dE="2d",cE="3d",hE="2d",pE="2d-array",gE="cube",mE="3d",fE="all",yE="vertex",xE="instance",bE={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class TE extends Sv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class _E extends TE{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class vE extends wv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let NE=0;class SE extends vE{constructor(e,t){super("StorageBuffer_"+NE++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ks.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class wE extends Wm{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:vw}),this.flipYSampler=e.createSampler({minFilter:Nw}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\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:fN,stripIndexFormat:FN},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:fN,stripIndexFormat:FN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=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:hE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:hE,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:AN,storeOp:wN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,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:hE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,PE=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,LE={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_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"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 FE extends G_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(ME);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=PE.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 BE extends k_{parseFunction(e){return new FE(e)}}const DE="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},IE={[ks.READ_ONLY]:"read",[ks.WRITE_ONLY]:"write",[ks.READ_WRITE]:"read_write"},VE={[wr]:"repeat",[Sr]:"clamp",[Nr]:"mirror"},UE={vertex:DE?DE.VERTEX:1,fragment:DE?DE.FRAGMENT:2,compute:DE?DE.COMPUTE:4},OE={instance:!0,swizzleAssign:!1,storageBuffer:!0},kE={"^^":"tsl_xor"},GE={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"},zE={},HE={tsl_xor:new vx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new vx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new vx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new vx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new vx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new vx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new vx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new vx("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 vx("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 vx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new vx("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 vx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new vx("\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")},$E={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)&&(HE.pow_float=new vx("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),HE.pow_vec2=new vx("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 ) ); }",[HE.pow_float]),HE.pow_vec3=new vx("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 ) ); }",[HE.pow_float]),HE.pow_vec4=new vx("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 ) ); }",[HE.pow_float]),$E.pow_float="tsl_pow_float",$E.pow_vec2="tsl_pow_vec2",$E.pow_vec3="tsl_pow_vec3",$E.pow_vec4="tsl_pow_vec4");let WE="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(WE+="diagnostic( off, derivative_uniformity );\n");class jE extends A_{constructor(e,t){super(e,t,new BE),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_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_${VE[e.wrapS]}S_${VE[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=zE[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===wr?(s.push(HE.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Sr?(s.push(HE.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Nr?(s.push(HE.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",zE[t]=r=new vx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${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,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Jo(new Vu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isDepthArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Jo(new Vu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Jo(new Vu("6u","u32")))}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=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return!0===e.isVideoTexture||!0===e.isStorageTexture?n=`textureLoad( ${t}, ${r} )`:s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}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===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||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 e.isDepthArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`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 a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}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?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=kE[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?ks.READ_ONLY:e.access}getStorageAccess(e,t){return IE[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 a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new Bv(i.name,i.node,o,n):"cubeTexture"===t?s=new Dv(i.name,i.node,o,n):"texture3D"===t&&(s=new Iv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(UE[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new _E(`${i.name}_sampler`,i.node,o);e.setVisibility(UE[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?Rv:SE)(e,o);n.setVisibility(UE[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new Pv(u,o),s.setVisibility(UE[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}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","globalId","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"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}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,e.count)};`);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;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;"fragment"!==e&&"compute"!==e||!1!==this.isUnfilterable(t)||!0===i.node.isStorageTextureNode||(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture||!0===t.isTextureArray)s="texture_2d_array";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isDepthArrayTexture?"_array":""}`;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<${CE(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.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 a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;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],a=n.outputNode,o=void 0!==a&&!0===a.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`),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(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",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;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,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 GE[e]||e}isAvailable(e){let t=OE[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),OE[e]=t),t}_getWGSLMethod(e){return void 0!==HE[e]&&this._include(e),$E[e]}_include(e){const t=HE[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// structs\n${e.structs}\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${WE}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\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// structs\n${e.structs}\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 = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.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 qE{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=xS:e.depth&&(t=yS),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?hN:e.isLineSegments||e.isMesh&&!0===t.wireframe?pN:e.isLine?gN:e.isMesh?mN: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(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Me)return rS;if(e===he)return hS;throw new Error("Unsupported outputType")}}const XE=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),KE=new Map([[$e,["float16"]]]),YE=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class QE{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 a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=aE)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=aE:s.sampleType=oE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=uE:e===b?s.sampleType=lE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=nE:s.sampleType=aE)}r.isSampledCubeTexture?s.viewDimension=gE:r.texture.isDataArrayTexture||r.texture.isDepthArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=pE:r.isSampledTexture3D&&(s.viewDimension=mE),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,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.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)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}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 a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=fE;let n;n=t.isSampledCubeTexture?gE:t.isSampledTexture3D?mE:t.texture.isDataArrayTexture||t.texture.isDepthArrayTexture||t.texture.isCompressedArrayTexture?pE:hE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class JE{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:a,fragmentProgram:o}=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;s.blending===k||s.blending===V&&!1===s.transparent||(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})},w={},E=e.context.depth,A=e.context.stencil;if(!0!==E&&!0!==A||(!0===E&&(w.format=v,w.depthWriteEnabled=s.depthWrite,w.depthCompare=_),!0===A&&(w.stencilFront=m,w.stencilBack={},w.stencilReadMask=s.stencilFuncMask,w.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(w.depthBias=s.polygonOffsetUnits,w.depthBiasSlopeScale=s.polygonOffsetFactor,w.depthBiasClamp=0),S.depthStencil=w),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,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===Ke){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:Vw},r={srcFactor:i,dstFactor:n,operation:Vw}};if(e.premultipliedAlpha)switch(s){case V:i(ww,Cw,ww,Cw);break;case Bt:i(ww,ww,ww,ww);break;case Ft:i(Sw,Aw,Sw,ww);break;case Lt:i(Sw,Ew,Sw,Rw)}else switch(s){case V:i(Rw,Cw,ww,Cw);break;case Bt:i(Rw,ww,Rw,ww);break;case Ft:i(Sw,Aw,Sw,ww);break;case Lt:i(Sw,Ew,Sw,Ew)}}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 Qe:t=Sw;break;case Rt:t=ww;break;case At:t=Ew;break;case vt:t=Aw;break;case Et:t=Rw;break;case _t:t=Cw;break;case St:t=Mw;break;case Tt:t=Pw;break;case Nt:t=Lw;break;case bt:t=Fw;break;case wt:t=Bw;break;case 211:t=Dw;break;case 212:t=Iw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Hr:t=yN;break;case zr:t=SN;break;case Gr:t=xN;break;case kr:t=TN;break;case Or:t=bN;break;case Ur:t=NN;break;case Vr:t=_N;break;case Ir:t=vN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Qr:t=$w;break;case Yr:t=Ww;break;case Kr:t=jw;break;case Xr:t=qw;break;case qr:t=Xw;break;case jr:t=Kw;break;case Wr:t=Yw;break;case $r:t=Qw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Ye:t=Vw;break;case xt:t=Uw;break;case yt:t=Ow;break;case Jr:t=kw;break;case Zr:t=Gw;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?LN:FN),r.side){case Xe:s.frontFace=RN,s.cullMode=PN;break;case N:s.frontFace=RN,s.cullMode=MN;break;case Se:s.frontFace=RN,s.cullMode=CN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?Hw:zw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=SN;else{const r=e.depthFunc;switch(r){case zt:t=yN;break;case Gt:t=SN;break;case kt:t=xN;break;case Ot:t=TN;break;case Ut:t=bN;break;case Vt:t=NN;break;case It:t=_N;break;case Dt:t=vN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class eA extends lN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class tA extends jv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new qE(this),this.attributeUtils=new QE(this),this.bindingUtils=new ZE(this),this.pipelineUtils=new JE(this),this.textureUtils=new RE(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,featureLevel:t.compatibilityMode?"compatibility":void 0},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(bE),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}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(bE.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 d}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}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.isDepthArrayTexture&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s0&&(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,{loadOp:EN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=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();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){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.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{t.setPipeline(u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&mt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new cN(e)));super(new t(e),e),this.library=new sA,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class nA extends ps{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class aA{constructor(e,t=nn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Hh;r.name="PostProcessing",this._quadMesh=new Ty(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Gu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class oA extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class uA extends Ry{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class lA extends gs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new ms(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),ji()):Bi(new this.nodes[e])}}class dA extends fs{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 cA extends ys{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 lA;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 dA;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.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.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 a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[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=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.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 bs=e=>xs(e),Ts=e=>xs(e),_s=(...e)=>xs(e);function vs(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of Ns(e))r.push(xs(s.slice(0,-4)),i.getCacheKey(t));return xs(r)}function*Ns(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 Bs=Object.freeze({__proto__:null,arrayBufferToBase64:Ls,base64ToArrayBuffer:Fs,getCacheKey:vs,getDataFromObject:Ps,getLengthFromType:Rs,getNodeChildren:Ns,getTypeFromLength:Es,getTypedArrayFromType:As,getValueFromType:Ms,getValueType:Cs,hash:_s,hashArray:Ts,hashString:bs});const Ds={VERTEX:"vertex",FRAGMENT:"fragment"},Is={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Vs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Us={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Os=["fragment","vertex"],ks=["setup","analyze","generate"],Gs=[...Os,"compute"],zs=["x","y","z","w"];let $s=0;class Hs extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Is.NONE,this.updateBeforeType=Is.NONE,this.updateAfterType=Is.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!1,this.isNode=!0,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:$s++})}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,Is.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Is.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Is.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 Ns(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=_s(vs(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)}getMemberType(){return"void"}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 t.outputNode||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){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}s&&r.build(e),t.outputNode=r}s=t.outputNode||null}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?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),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 Ns(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 Ws extends Hs{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){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class js extends Hs{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 qs extends Hs{static get type(){return"TempNode"}constructor(e=null){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),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Xs extends qs{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=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Ks=zs.join("");class Ys extends Hs{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(zs.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 a=r.build(e,n);i=this.components.length===s&&this.components===Ks.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${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 Qs extends qs{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)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),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"),oi=e=>ai(e).split("").sort().join(""),ui={setup(e,t){const r=t.shift();return e(Fi(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(si.assign(r,...e),r);if(ii.has(t)){const s=ii.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&ii.has(t.slice(0,t.length-6))){const s=ii.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=ai(t),Li(new Ys(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=oi(t.slice(3).toLowerCase()),r=>Li(new Qs(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=oi(t.slice(4).toLowerCase()),()=>Li(new Zs(Li(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Li(new Ys(e,t));if(!0===/^\d+$/.test(t))return Li(new Ws(r,new ti(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Li(new ri(r,e))}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)},li=new WeakMap,di=new WeakMap,ci=function(e,t=null){for(const r in e)e[r]=Li(e[r],t);return e},hi=function(e,t=null){const r=e.length;for(let s=0;sLi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Bi(l(t)))):null!==r?(r=Li(r),n=(...s)=>i(new e(t,...Bi(l(s)),r))):n=(...r)=>i(new e(t,...Bi(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},gi=function(e,...t){return Li(new e(...Bi(t)))};class mi extends Hs{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}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=di.get(e.constructor);void 0===s&&(s=new WeakMap,di.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Li(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Li(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Li(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 fi extends Hs{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 Fi(e),Li(new mi(this,e))}setup(){return this.call()}}const yi=[!1,!0],xi=[0,1,2,3],bi=[-1,-2],Ti=[.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],_i=new Map;for(const e of yi)_i.set(e,new ti(e));const vi=new Map;for(const e of xi)vi.set(e,new ti(e,"uint"));const Ni=new Map([...vi].map((e=>new ti(e.value,"int"))));for(const e of bi)Ni.set(e,new ti(e,"int"));const Si=new Map([...Ni].map((e=>new ti(e.value))));for(const e of Ti)Si.set(e,new ti(e));for(const e of Ti)Si.set(-e,new ti(-e));const wi={bool:_i,uint:vi,ints:Ni,float:Si},Ei=new Map([..._i,...Si]),Ai=(e,t)=>Ei.has(e)?Ei.get(e):!0===e.isNode?e:new ti(e,t),Ri=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ms(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Li(t.get(r[0]));if(1===r.length){const t=Ai(r[0],e);return(e=>{try{return e.getNodeType()}catch(e){return}})(t)===e?Li(t):Li(new js(t,e))}const s=r.map((e=>Ai(e)));return Li(new Xs(s,e))}},Ci=e=>"object"==typeof e&&null!==e?e.value:e,Mi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Pi(e,t){return new Proxy(new fi(e,t),ui)}const Li=(e,t=null)=>function(e,t=null){const r=Cs(e);if("node"===r){let t=li.get(e);return void 0===t&&(t=new Proxy(e,ui),li.set(e,t),li.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Li(Ai(e,t)):"shader"===r?Ui(e):e}(e,t),Fi=(e,t=null)=>new ci(e,t),Bi=(e,t=null)=>new hi(e,t),Di=(...e)=>new pi(...e),Ii=(...e)=>new gi(...e);let Vi=0;const Ui=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Pi(e,r),i=(...e)=>{let t;Fi(e),t=e[0]&&e[0].isNode?[...e]:e[0];const i=s.call(t);return"void"===r&&i.toStack(),i};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Vi++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};ni("toGlobal",(e=>(e.global=!0,e)));const Oi=e=>{si=e},ki=()=>si,Gi=(...e)=>si.If(...e);function zi(e){return si&&si.add(e),e}ni("toStack",zi);const $i=new Ri("color"),Hi=new Ri("float",wi.float),Wi=new Ri("int",wi.ints),ji=new Ri("uint",wi.uint),qi=new Ri("bool",wi.bool),Xi=new Ri("vec2"),Ki=new Ri("ivec2"),Yi=new Ri("uvec2"),Qi=new Ri("bvec2"),Zi=new Ri("vec3"),Ji=new Ri("ivec3"),en=new Ri("uvec3"),tn=new Ri("bvec3"),rn=new Ri("vec4"),sn=new Ri("ivec4"),nn=new Ri("uvec4"),an=new Ri("bvec4"),on=new Ri("mat2"),un=new Ri("mat3"),ln=new Ri("mat4");ni("toColor",$i),ni("toFloat",Hi),ni("toInt",Wi),ni("toUint",ji),ni("toBool",qi),ni("toVec2",Xi),ni("toIVec2",Ki),ni("toUVec2",Yi),ni("toBVec2",Qi),ni("toVec3",Zi),ni("toIVec3",Ji),ni("toUVec3",en),ni("toBVec3",tn),ni("toVec4",rn),ni("toIVec4",sn),ni("toUVec4",nn),ni("toBVec4",an),ni("toMat2",on),ni("toMat3",un),ni("toMat4",ln);const dn=Di(Ws).setParameterLength(2),cn=(e,t)=>Li(new js(Li(e),t));ni("element",dn),ni("convert",cn);ni("append",(e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),zi(e))));class hn extends Hs{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 pn=(e,t)=>Li(new hn(e,t)),gn=(e,t)=>Li(new hn(e,t,!0)),mn=Ii(hn,"vec4","DiffuseColor"),fn=Ii(hn,"vec3","EmissiveColor"),yn=Ii(hn,"float","Roughness"),xn=Ii(hn,"float","Metalness"),bn=Ii(hn,"float","Clearcoat"),Tn=Ii(hn,"float","ClearcoatRoughness"),_n=Ii(hn,"vec3","Sheen"),vn=Ii(hn,"float","SheenRoughness"),Nn=Ii(hn,"float","Iridescence"),Sn=Ii(hn,"float","IridescenceIOR"),wn=Ii(hn,"float","IridescenceThickness"),En=Ii(hn,"float","AlphaT"),An=Ii(hn,"float","Anisotropy"),Rn=Ii(hn,"vec3","AnisotropyT"),Cn=Ii(hn,"vec3","AnisotropyB"),Mn=Ii(hn,"color","SpecularColor"),Pn=Ii(hn,"float","SpecularF90"),Ln=Ii(hn,"float","Shininess"),Fn=Ii(hn,"vec4","Output"),Bn=Ii(hn,"float","dashSize"),Dn=Ii(hn,"float","gapSize"),In=Ii(hn,"float","pointWidth"),Vn=Ii(hn,"float","IOR"),Un=Ii(hn,"float","Transmission"),On=Ii(hn,"float","Thickness"),kn=Ii(hn,"float","AttenuationDistance"),Gn=Ii(hn,"color","AttenuationColor"),zn=Ii(hn,"float","Dispersion");class $n extends Hs{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 Hn=e=>new $n(e),Wn=(e,t=0)=>new $n(e,!0,t),jn=Wn("frame"),qn=Wn("render"),Xn=Hn("object");class Kn extends Js{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Xn}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),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Yn=(e,t)=>{const r=Mi(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Li(new Kn(s,r))};class Qn extends qs{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Zn=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Qn(null,r.length,r)}else{const r=e[0],s=e[1];t=new Qn(r,s)}return Li(t)};ni("toArray",((e,t)=>Zn(Array(t).fill(e))));class Jn extends qs{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 zs.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),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,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)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Bi(t):Fi(t[0]),Li(new ta(Li(e),t)));ni("call",ra);const sa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class ia extends qs{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new ia(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const na=Di(ia,"+").setParameterLength(2,1/0).setName("add"),aa=Di(ia,"-").setParameterLength(2,1/0).setName("sub"),oa=Di(ia,"*").setParameterLength(2,1/0).setName("mul"),ua=Di(ia,"/").setParameterLength(2,1/0).setName("div"),la=Di(ia,"%").setParameterLength(2).setName("mod"),da=Di(ia,"==").setParameterLength(2).setName("equal"),ca=Di(ia,"!=").setParameterLength(2).setName("notEqual"),ha=Di(ia,"<").setParameterLength(2).setName("lessThan"),pa=Di(ia,">").setParameterLength(2).setName("greaterThan"),ga=Di(ia,"<=").setParameterLength(2).setName("lessThanEqual"),ma=Di(ia,">=").setParameterLength(2).setName("greaterThanEqual"),fa=Di(ia,"&&").setParameterLength(2,1/0).setName("and"),ya=Di(ia,"||").setParameterLength(2,1/0).setName("or"),xa=Di(ia,"!").setParameterLength(1).setName("not"),ba=Di(ia,"^^").setParameterLength(2).setName("xor"),Ta=Di(ia,"&").setParameterLength(2).setName("bitAnd"),_a=Di(ia,"~").setParameterLength(2).setName("bitNot"),va=Di(ia,"|").setParameterLength(2).setName("bitOr"),Na=Di(ia,"^").setParameterLength(2).setName("bitXor"),Sa=Di(ia,"<<").setParameterLength(2).setName("shiftLeft"),wa=Di(ia,">>").setParameterLength(2).setName("shiftRight"),Ea=Ui((([e])=>(e.addAssign(1),e))),Aa=Ui((([e])=>(e.subAssign(1),e))),Ra=Ui((([e])=>{const t=Wi(e).toConst();return e.addAssign(1),t})),Ca=Ui((([e])=>{const t=Wi(e).toConst();return e.subAssign(1),t}));ni("add",na),ni("sub",aa),ni("mul",oa),ni("div",ua),ni("mod",la),ni("equal",da),ni("notEqual",ca),ni("lessThan",ha),ni("greaterThan",pa),ni("lessThanEqual",ga),ni("greaterThanEqual",ma),ni("and",fa),ni("or",ya),ni("not",xa),ni("xor",ba),ni("bitAnd",Ta),ni("bitNot",_a),ni("bitOr",va),ni("bitXor",Na),ni("shiftLeft",Sa),ni("shiftRight",wa),ni("incrementBefore",Ea),ni("decrementBefore",Aa),ni("increment",Ra),ni("decrement",Ca);const Ma=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),la(e,t)),Pa=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),la(Wi(e),Wi(t)));ni("remainder",Ma),ni("modInt",Pa);class La extends qs{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===La.MAX||e===La.MIN)&&arguments.length>3){let i=new La(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===La.LENGTH||t===La.DISTANCE||t===La.DOT?"float":t===La.CROSS?"vec3":t===La.ALL||t===La.ANY?"bool":t===La.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===La.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=rn(Zi(s),0):r=rn(Zi(r),0);const i=oa(r,s).xyz;return Ka(i).build(e,t)}if(r===La.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===La.ONE_MINUS)return aa(1,n).build(e,t);if(r===La.RECIPROCAL)return ua(1,n).build(e,t);if(r===La.DIFFERENCE)return so(aa(n,a)).build(e,t);{const c=[];return r===La.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===La.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==La.MIN&&r!==La.MAX?r===La.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===La.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===La.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==La.DFDX&&r!==La.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}La.ALL="all",La.ANY="any",La.RADIANS="radians",La.DEGREES="degrees",La.EXP="exp",La.EXP2="exp2",La.LOG="log",La.LOG2="log2",La.SQRT="sqrt",La.INVERSE_SQRT="inversesqrt",La.FLOOR="floor",La.CEIL="ceil",La.NORMALIZE="normalize",La.FRACT="fract",La.SIN="sin",La.COS="cos",La.TAN="tan",La.ASIN="asin",La.ACOS="acos",La.ATAN="atan",La.ABS="abs",La.SIGN="sign",La.LENGTH="length",La.NEGATE="negate",La.ONE_MINUS="oneMinus",La.DFDX="dFdx",La.DFDY="dFdy",La.ROUND="round",La.RECIPROCAL="reciprocal",La.TRUNC="trunc",La.FWIDTH="fwidth",La.TRANSPOSE="transpose",La.BITCAST="bitcast",La.EQUALS="equals",La.MIN="min",La.MAX="max",La.STEP="step",La.REFLECT="reflect",La.DISTANCE="distance",La.DIFFERENCE="difference",La.DOT="dot",La.CROSS="cross",La.POW="pow",La.TRANSFORM_DIRECTION="transformDirection",La.MIX="mix",La.CLAMP="clamp",La.REFRACT="refract",La.SMOOTHSTEP="smoothstep",La.FACEFORWARD="faceforward";const Fa=Hi(1e-6),Ba=Hi(1e6),Da=Hi(Math.PI),Ia=Hi(2*Math.PI),Va=Di(La,La.ALL).setParameterLength(1),Ua=Di(La,La.ANY).setParameterLength(1),Oa=Di(La,La.RADIANS).setParameterLength(1),ka=Di(La,La.DEGREES).setParameterLength(1),Ga=Di(La,La.EXP).setParameterLength(1),za=Di(La,La.EXP2).setParameterLength(1),$a=Di(La,La.LOG).setParameterLength(1),Ha=Di(La,La.LOG2).setParameterLength(1),Wa=Di(La,La.SQRT).setParameterLength(1),ja=Di(La,La.INVERSE_SQRT).setParameterLength(1),qa=Di(La,La.FLOOR).setParameterLength(1),Xa=Di(La,La.CEIL).setParameterLength(1),Ka=Di(La,La.NORMALIZE).setParameterLength(1),Ya=Di(La,La.FRACT).setParameterLength(1),Qa=Di(La,La.SIN).setParameterLength(1),Za=Di(La,La.COS).setParameterLength(1),Ja=Di(La,La.TAN).setParameterLength(1),eo=Di(La,La.ASIN).setParameterLength(1),to=Di(La,La.ACOS).setParameterLength(1),ro=Di(La,La.ATAN).setParameterLength(1,2),so=Di(La,La.ABS).setParameterLength(1),io=Di(La,La.SIGN).setParameterLength(1),no=Di(La,La.LENGTH).setParameterLength(1),ao=Di(La,La.NEGATE).setParameterLength(1),oo=Di(La,La.ONE_MINUS).setParameterLength(1),uo=Di(La,La.DFDX).setParameterLength(1),lo=Di(La,La.DFDY).setParameterLength(1),co=Di(La,La.ROUND).setParameterLength(1),ho=Di(La,La.RECIPROCAL).setParameterLength(1),po=Di(La,La.TRUNC).setParameterLength(1),go=Di(La,La.FWIDTH).setParameterLength(1),mo=Di(La,La.TRANSPOSE).setParameterLength(1),fo=Di(La,La.BITCAST).setParameterLength(2),yo=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),da(e,t)),xo=Di(La,La.MIN).setParameterLength(2,1/0),bo=Di(La,La.MAX).setParameterLength(2,1/0),To=Di(La,La.STEP).setParameterLength(2),_o=Di(La,La.REFLECT).setParameterLength(2),vo=Di(La,La.DISTANCE).setParameterLength(2),No=Di(La,La.DIFFERENCE).setParameterLength(2),So=Di(La,La.DOT).setParameterLength(2),wo=Di(La,La.CROSS).setParameterLength(2),Eo=Di(La,La.POW).setParameterLength(2),Ao=Di(La,La.POW,2).setParameterLength(1),Ro=Di(La,La.POW,3).setParameterLength(1),Co=Di(La,La.POW,4).setParameterLength(1),Mo=Di(La,La.TRANSFORM_DIRECTION).setParameterLength(2),Po=e=>oa(io(e),Eo(so(e),1/3)),Lo=e=>So(e,e),Fo=Di(La,La.MIX).setParameterLength(3),Bo=(e,t=0,r=1)=>Li(new La(La.CLAMP,Li(e),Li(t),Li(r))),Do=e=>Bo(e),Io=Di(La,La.REFRACT).setParameterLength(3),Vo=Di(La,La.SMOOTHSTEP).setParameterLength(3),Uo=Di(La,La.FACEFORWARD).setParameterLength(3),Oo=Ui((([e])=>{const t=So(e.xy,Xi(12.9898,78.233)),r=la(t,Da);return Ya(Qa(r).mul(43758.5453))})),ko=(e,t,r)=>Fo(t,r,e),Go=(e,t,r)=>Vo(t,r,e),zo=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),ro(e,t)),$o=Uo,Ho=ja;ni("all",Va),ni("any",Ua),ni("equals",yo),ni("radians",Oa),ni("degrees",ka),ni("exp",Ga),ni("exp2",za),ni("log",$a),ni("log2",Ha),ni("sqrt",Wa),ni("inverseSqrt",ja),ni("floor",qa),ni("ceil",Xa),ni("normalize",Ka),ni("fract",Ya),ni("sin",Qa),ni("cos",Za),ni("tan",Ja),ni("asin",eo),ni("acos",to),ni("atan",ro),ni("abs",so),ni("sign",io),ni("length",no),ni("lengthSq",Lo),ni("negate",ao),ni("oneMinus",oo),ni("dFdx",uo),ni("dFdy",lo),ni("round",co),ni("reciprocal",ho),ni("trunc",po),ni("fwidth",go),ni("atan2",zo),ni("min",xo),ni("max",bo),ni("step",To),ni("reflect",_o),ni("distance",vo),ni("dot",So),ni("cross",wo),ni("pow",Eo),ni("pow2",Ao),ni("pow3",Ro),ni("pow4",Co),ni("transformDirection",Mo),ni("mix",ko),ni("clamp",Bo),ni("refract",Io),ni("smoothstep",Go),ni("faceForward",Uo),ni("difference",No),ni("saturate",Do),ni("cbrt",Po),ni("transpose",mo),ni("rand",Oo);class Wo extends Hs{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}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:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?pn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const jo=Di(Wo).setParameterLength(2,3);ni("select",jo);const qo=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),jo(...e));ni("cond",qo);class Xo extends Hs{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 Ko=Di(Xo).setParameterLength(1,2),Yo=(e,t)=>Ko(e,{label:t});ni("context",Ko),ni("label",Yo);class Qo extends Hs{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const Zo=Di(Qo),Jo=(e,t=null)=>Zo(e,t).toStack(),eu=(e,t=null)=>Zo(e,t,!0).toStack();ni("toVar",Jo),ni("toConst",eu);const tu=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),Zo(e));ni("temp",tu);class ru extends Hs{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null}isGlobal(){return!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}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),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),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),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Ds.VERTEX);e.flowNodeFromShaderStage(Ds.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const su=Di(ru).setParameterLength(1,2),iu=e=>su(e);ni("toVarying",su),ni("toVertexStage",iu),ni("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),su(...e)))),ni("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),su(...e))));const nu=Ui((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Fo(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),au=Ui((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Fo(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),ou="WorkingColorSpace",uu="OutputColorSpace";class lu extends qs{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===ou?c.workingColorSpace:t===uu?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 i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=rn(nu(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=rn(un(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=rn(au(i.rgb),i.a)),i):i}}const du=e=>Li(new lu(Li(e),ou,uu)),cu=e=>Li(new lu(Li(e),uu,ou)),hu=(e,t)=>Li(new lu(Li(e),ou,t)),pu=(e,t)=>Li(new lu(Li(e),t,ou));ni("toOutputColorSpace",du),ni("toWorkingColorSpace",cu),ni("workingToColorSpace",hu),ni("colorSpaceToWorking",pu);let gu=class extends Ws{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 mu extends Hs{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=Is.OBJECT}setGroup(e){return this.group=e,this}element(e){return Li(new gu(this,Li(e)))}setNodeType(e){const t=Yn(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;eLi(new fu(e,t,r));class xu extends qs{static get type(){return"ToneMappingNode"}constructor(e,t=Tu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return _s(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=rn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const bu=(e,t,r)=>Li(new xu(e,Li(t),Li(r))),Tu=yu("toneMappingExposure","float");ni("toneMapping",((e,t,r)=>bu(t,r,e)));class _u extends Js{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=g,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,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,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=su(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 vu=(e,t=null,r=0,s=0)=>Li(new _u(e,t,r,s)),Nu=(e,t=null,r=0,s=0)=>vu(e,t,r,s).setUsage(y),Su=(e,t=null,r=0,s=0)=>vu(e,t,r,s).setInstanced(!0),wu=(e,t=null,r=0,s=0)=>Nu(e,t,r,s).setInstanced(!0);ni("toAttribute",(e=>vu(e.value)));class Eu extends Hs{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.name="",this.updateBeforeType=Is.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eLi(new Eu(Li(e),t,r));ni("compute",Au);class Ru extends Hs{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}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 Cu=(e,t)=>Li(new Ru(Li(e),t));ni("cache",Cu);class Mu extends Hs{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 Pu=Di(Mu).setParameterLength(2);ni("bypass",Pu);class Lu extends Hs{static get type(){return"RemapNode"}constructor(e,t,r,s=Hi(0),i=Hi(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 a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Fu=Di(Lu,null,null,{doClamp:!1}).setParameterLength(3,5),Bu=Di(Lu).setParameterLength(3,5);ni("remap",Fu),ni("remapClamp",Bu);class Du extends Hs{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 Iu=Di(Du).setParameterLength(1,2),Vu=e=>(e?jo(e,Iu("discard")):Iu("discard")).toStack();ni("discard",Vu);class Uu extends qs{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)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Ou=(e,t=null,r=null)=>Li(new Uu(Li(e),t,r));ni("renderOutput",Ou);class ku extends qs{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const Gu=(e,t=null)=>Li(new ku(Li(e),t));ni("debug",Gu);class zu extends Hs{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 su(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 $u=(e,t=null)=>Li(new zu(e,t)),Hu=(e=0)=>$u("uv"+(e>0?e:""),"vec2");class Wu extends Hs{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 ju=Di(Wu).setParameterLength(1,2);class qu extends Kn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Is.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 Xu=Di(qu).setParameterLength(1);class Ku extends Kn{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=Is.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===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Hu(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Yn(this.value.matrix)),this._matrixUniform.mul(Zi(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Is.OBJECT:Is.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(Wi(ju(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,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,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.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);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=pu(Iu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,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=Li(e),t.referenceNode=this.getSelf(),Li(t)}blur(e){const t=this.clone();t.biasNode=Li(e).mul(Xu(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Li(t)}level(e){const t=this.clone();return t.levelNode=Li(e),t.referenceNode=this.getSelf(),Li(t)}size(e){return ju(this,e)}bias(e){const t=this.clone();return t.biasNode=Li(e),t.referenceNode=this.getSelf(),Li(t)}compare(e){const t=this.clone();return t.compareNode=Li(e),t.referenceNode=this.getSelf(),Li(t)}grad(e,t){const r=this.clone();return r.gradNode=[Li(e),Li(t)],r.referenceNode=this.getSelf(),Li(r)}depth(e){const t=this.clone();return t.depthNode=Li(e),t.referenceNode=this.getSelf(),Li(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.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const Yu=Di(Ku).setParameterLength(1,4),Qu=(...e)=>Yu(...e).setSampler(!1);class Zu extends Kn{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 Ju=(e,t,r)=>Li(new Zu(e,t,r));class el extends Ws{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 tl extends Zu{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Cs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Is.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;rLi(new tl(e,t));const sl=Di(class extends Hs{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),il=Yn(0,"uint").label("u_cameraIndex").setGroup(Wn("cameraIndex")).toVarying("v_cameraIndex"),nl=Yn("float").label("cameraNear").setGroup(qn).onRenderUpdate((({camera:e})=>e.near)),al=Yn("float").label("cameraFar").setGroup(qn).onRenderUpdate((({camera:e})=>e.far)),ol=Ui((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=rl(r).setGroup(qn).label("cameraProjectionMatrices").element(e.isMultiViewCamera?sl("gl_ViewID_OVR"):il).toVar("cameraProjectionMatrix")}else t=Yn("mat4").label("cameraProjectionMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),ul=Ui((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=rl(r).setGroup(qn).label("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?sl("gl_ViewID_OVR"):il).toVar("cameraProjectionMatrixInverse")}else t=Yn("mat4").label("cameraProjectionMatrixInverse").setGroup(qn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse));return t})).once()(),ll=Ui((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=rl(r).setGroup(qn).label("cameraViewMatrices").element(e.isMultiViewCamera?sl("gl_ViewID_OVR"):il).toVar("cameraViewMatrix")}else t=Yn("mat4").label("cameraViewMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),dl=Yn("mat4").label("cameraWorldMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.matrixWorld)),cl=Yn("mat3").label("cameraNormalMatrix").setGroup(qn).onRenderUpdate((({camera:e})=>e.normalMatrix)),hl=Yn(new r).label("cameraPosition").setGroup(qn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),pl=new v;class gl extends Hs{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Is.OBJECT,this._uniformNode=new Kn(null)}getNodeType(){const e=this.scope;return e===gl.WORLD_MATRIX?"mat4":e===gl.POSITION||e===gl.VIEW_POSITION||e===gl.DIRECTION||e===gl.SCALE?"vec3":e===gl.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===gl.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===gl.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===gl.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===gl.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===gl.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===gl.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),pl.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=pl.radius}}generate(e){const t=this.scope;return t===gl.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===gl.POSITION||t===gl.VIEW_POSITION||t===gl.DIRECTION||t===gl.SCALE?this._uniformNode.nodeType="vec3":t===gl.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}gl.WORLD_MATRIX="worldMatrix",gl.POSITION="position",gl.SCALE="scale",gl.VIEW_POSITION="viewPosition",gl.DIRECTION="direction",gl.RADIUS="radius";const ml=Di(gl,gl.DIRECTION).setParameterLength(1),fl=Di(gl,gl.WORLD_MATRIX).setParameterLength(1),yl=Di(gl,gl.POSITION).setParameterLength(1),xl=Di(gl,gl.SCALE).setParameterLength(1),bl=Di(gl,gl.VIEW_POSITION).setParameterLength(1),Tl=Di(gl,gl.RADIUS).setParameterLength(1);class _l extends gl{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const vl=Ii(_l,_l.DIRECTION),Nl=Ii(_l,_l.WORLD_MATRIX),Sl=Ii(_l,_l.POSITION),wl=Ii(_l,_l.SCALE),El=Ii(_l,_l.VIEW_POSITION),Al=Ii(_l,_l.RADIUS),Rl=Yn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),Cl=Yn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Ml=Ui((e=>e.renderer.overrideNodes.modelViewMatrix||Pl)).once()().toVar("modelViewMatrix"),Pl=ll.mul(Nl),Ll=Ui((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Yn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),Fl=Ui((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Yn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Bl=$u("position","vec3"),Dl=Bl.toVarying("positionLocal"),Il=Bl.toVarying("positionPrevious"),Vl=Nl.mul(Dl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),Ul=Dl.transformDirection(Nl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Ol=Ui((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),kl=Ol.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class Gl extends Hs{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const zl=Ii(Gl),$l=Hi(zl).mul(2).sub(1),Hl=$u("normal","vec3"),Wl=Ui((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),Zi(0,1,0)):Hl),"vec3").once()().toVar("normalLocal"),jl=Ol.dFdx().cross(Ol.dFdy()).normalize().toVar("normalFlat"),ql=Ui((e=>{let t;return t=!0===e.material.flatShading?jl:su(Jl(Wl),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),Xl=Ui((e=>{let t=ql.transformDirection(ll);return!0!==e.material.flatShading&&(t=su(t,"v_normalWorld")),t}),"vec3").once()().normalize().toVar("normalWorld"),Kl=Ui((e=>{let t=e.context.setupNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul($l)),t}),"vec3").once()().toVar("transformedNormalView"),Yl=Kl.transformDirection(ll).toVar("transformedNormalWorld"),Ql=Ui((e=>{let t=e.context.setupClearcoatNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul($l)),t}),"vec3").once()().toVar("transformedClearcoatNormalView"),Zl=Ui((([e,t=Nl])=>{const r=un(t),s=e.div(Zi(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),Jl=Ui((([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Rl.mul(e);return ll.transformDirection(s)})),ed=new S,td=new a,rd=Yn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),sd=Yn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),id=Yn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(ed.copy(r),td.makeRotationFromEuler(ed)):td.identity(),td})),nd=kl.negate().reflect(Kl),ad=kl.negate().refract(Kl,rd),od=nd.transformDirection(ll).toVar("reflectVector"),ud=ad.transformDirection(ll).toVar("reflectVector");class ld extends Ku{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===w?od:e.mapping===E?ud:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),Zi(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=Zi(t.x.negate(),t.yz)),id.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const dd=Di(ld).setParameterLength(1,4).setName("cubeTexture");class cd extends Ws{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 hd extends Hs{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=Is.OBJECT}element(e){return Li(new cd(this,Li(e)))}setGroup(e){return this.group=e,this}label(e){return this.name=e,this}setNodeType(e){let t=null;t=null!==this.count?Ju(null,e,this.count):Array.isArray(this.getValueFromReference())?rl(null,e):"texture"===e?Yu(null):"cubeTexture"===e?dd(null):Yn(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;eLi(new hd(e,t,r)),gd=(e,t,r,s)=>Li(new hd(e,t,s,r));class md extends hd{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 fd=(e,t,r=null)=>Li(new md(e,t,r)),yd=Ui((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),$u("tangent","vec4"))))(),xd=yd.xyz.toVar("tangentLocal"),bd=Ml.mul(rn(xd,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),Td=bd.transformDirection(ll).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),_d=bd.toVar("transformedTangentView"),vd=_d.transformDirection(ll).normalize().toVar("transformedTangentWorld"),Nd=Ui((([e,t],r)=>{let s=e.mul(yd.w).xyz;return!0!==r.material.flatShading&&(s=su(e,t)),s})).once(),Sd=Nd(Hl.cross(yd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),wd=Nd(Wl.cross(xd),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Ed=Nd(ql.cross(bd),"v_bitangentView").normalize().toVar("bitangentView"),Ad=Nd(Xl.cross(Td),"v_bitangentWorld").normalize().toVar("bitangentWorld"),Rd=Nd(Kl.cross(_d),"v_transformedBitangentView").normalize().toVar("transformedBitangentView"),Cd=Rd.transformDirection(ll).normalize().toVar("transformedBitangentWorld"),Md=un(bd,Ed,ql),Pd=kl.mul(Md),Ld=(()=>{let e=Cn.cross(kl);return e=e.cross(Cn).normalize(),e=Fo(e,Kl,An.mul(yn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),Fd=Ui((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=$l.mul(g.inverseSqrt());return na(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Bd extends qs{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=Zi(s.xy.mul(r),s.z));let i=null;if(t===R)i=Jl(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Md.mul(s).normalize():Fd({eye_pos:Ol,surf_norm:ql,mapN:s,uv:Hu()})}return i}}const Dd=Di(Bd).setParameterLength(1,2),Id=Ui((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||Hu()),forceUVContext:!0}),s=Hi(r((e=>e)));return Xi(Hi(r((e=>e.add(e.dFdx())))).sub(s),Hi(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Vd=Ui((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul($l),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class Ud extends qs{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=Id({textureNode:this.textureNode,bumpScale:e});return Vd({surf_pos:Ol,surf_norm:ql,dHdxy:t})}}const Od=Di(Ud).setParameterLength(1,2),kd=new Map;class Gd extends Hs{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=kd.get(e);return void 0===r&&(r=fd(e,t),kd.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===Gd.COLOR){const e=void 0!==t.color?this.getColor(r):Zi();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Gd.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Gd.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:Hi(1);else if(r===Gd.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Gd.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Gd.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Gd.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Gd.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===Gd.NORMAL)t.normalMap?(s=Dd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Od(this.getTexture("bump").r,this.getFloat("bumpScale")):ql;else if(r===Gd.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Gd.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Gd.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Dd(this.getTexture(r),this.getCache(r+"Scale","vec2")):ql;else if(r===Gd.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===Gd.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===Gd.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=on(wc.x,wc.y,wc.y.negate(),wc.x).mul(e.rg.mul(2).sub(Xi(1)).normalize().mul(e.b))}else s=wc;else if(r===Gd.IRIDESCENCE_THICKNESS){const e=pd("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=pd("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Gd.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Gd.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Gd.IOR)s=this.getFloat(r);else if(r===Gd.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Gd.AO)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}}Gd.ALPHA_TEST="alphaTest",Gd.COLOR="color",Gd.OPACITY="opacity",Gd.SHININESS="shininess",Gd.SPECULAR="specular",Gd.SPECULAR_STRENGTH="specularStrength",Gd.SPECULAR_INTENSITY="specularIntensity",Gd.SPECULAR_COLOR="specularColor",Gd.REFLECTIVITY="reflectivity",Gd.ROUGHNESS="roughness",Gd.METALNESS="metalness",Gd.NORMAL="normal",Gd.CLEARCOAT="clearcoat",Gd.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Gd.CLEARCOAT_NORMAL="clearcoatNormal",Gd.EMISSIVE="emissive",Gd.ROTATION="rotation",Gd.SHEEN="sheen",Gd.SHEEN_ROUGHNESS="sheenRoughness",Gd.ANISOTROPY="anisotropy",Gd.IRIDESCENCE="iridescence",Gd.IRIDESCENCE_IOR="iridescenceIOR",Gd.IRIDESCENCE_THICKNESS="iridescenceThickness",Gd.IOR="ior",Gd.TRANSMISSION="transmission",Gd.THICKNESS="thickness",Gd.ATTENUATION_DISTANCE="attenuationDistance",Gd.ATTENUATION_COLOR="attenuationColor",Gd.LINE_SCALE="scale",Gd.LINE_DASH_SIZE="dashSize",Gd.LINE_GAP_SIZE="gapSize",Gd.LINE_WIDTH="linewidth",Gd.LINE_DASH_OFFSET="dashOffset",Gd.POINT_SIZE="size",Gd.DISPERSION="dispersion",Gd.LIGHT_MAP="light",Gd.AO="ao";const zd=Ii(Gd,Gd.ALPHA_TEST),$d=Ii(Gd,Gd.COLOR),Hd=Ii(Gd,Gd.SHININESS),Wd=Ii(Gd,Gd.EMISSIVE),jd=Ii(Gd,Gd.OPACITY),qd=Ii(Gd,Gd.SPECULAR),Xd=Ii(Gd,Gd.SPECULAR_INTENSITY),Kd=Ii(Gd,Gd.SPECULAR_COLOR),Yd=Ii(Gd,Gd.SPECULAR_STRENGTH),Qd=Ii(Gd,Gd.REFLECTIVITY),Zd=Ii(Gd,Gd.ROUGHNESS),Jd=Ii(Gd,Gd.METALNESS),ec=Ii(Gd,Gd.NORMAL),tc=Ii(Gd,Gd.CLEARCOAT),rc=Ii(Gd,Gd.CLEARCOAT_ROUGHNESS),sc=Ii(Gd,Gd.CLEARCOAT_NORMAL),ic=Ii(Gd,Gd.ROTATION),nc=Ii(Gd,Gd.SHEEN),ac=Ii(Gd,Gd.SHEEN_ROUGHNESS),oc=Ii(Gd,Gd.ANISOTROPY),uc=Ii(Gd,Gd.IRIDESCENCE),lc=Ii(Gd,Gd.IRIDESCENCE_IOR),dc=Ii(Gd,Gd.IRIDESCENCE_THICKNESS),cc=Ii(Gd,Gd.TRANSMISSION),hc=Ii(Gd,Gd.THICKNESS),pc=Ii(Gd,Gd.IOR),gc=Ii(Gd,Gd.ATTENUATION_DISTANCE),mc=Ii(Gd,Gd.ATTENUATION_COLOR),fc=Ii(Gd,Gd.LINE_SCALE),yc=Ii(Gd,Gd.LINE_DASH_SIZE),xc=Ii(Gd,Gd.LINE_GAP_SIZE),bc=Ii(Gd,Gd.LINE_WIDTH),Tc=Ii(Gd,Gd.LINE_DASH_OFFSET),_c=Ii(Gd,Gd.POINT_SIZE),vc=Ii(Gd,Gd.DISPERSION),Nc=Ii(Gd,Gd.LIGHT_MAP),Sc=Ii(Gd,Gd.AO),wc=Yn(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))})),Ec=Ui((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Ac extends Hs{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===Ac.VERTEX)s=e.getVertexIndex();else if(r===Ac.INSTANCE)s=e.getInstanceIndex();else if(r===Ac.DRAW)s=e.getDrawIndex();else if(r===Ac.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Ac.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Ac.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=su(this).build(e,t)}return i}}Ac.VERTEX="vertex",Ac.INSTANCE="instance",Ac.SUBGROUP="subgroup",Ac.INVOCATION_LOCAL="invocationLocal",Ac.INVOCATION_SUBGROUP="invocationSubgroup",Ac.DRAW="draw";const Rc=Ii(Ac,Ac.VERTEX),Cc=Ii(Ac,Ac.INSTANCE),Mc=Ii(Ac,Ac.SUBGROUP),Pc=Ii(Ac,Ac.INVOCATION_SUBGROUP),Lc=Ii(Ac,Ac.INVOCATION_LOCAL),Fc=Ii(Ac,Ac.DRAW);class Bc extends Hs{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Is.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=Ju(r.array,"mat4",Math.max(t,1)).element(Cc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?wu:Su,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=ln(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?wu:Su;this.bufferColor=e,n=Zi(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Dl).xyz;if(Dl.assign(a),e.hasGeometryAttribute("normal")){const e=Zl(Wl,i);Wl.assign(e)}null!==this.instanceColorNode&&gn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Dc=Di(Bc).setParameterLength(2,3);class Ic extends Bc{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Vc=Di(Ic).setParameterLength(1);class Uc extends Hs{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=Cc:this.batchingIdNode=Fc);const t=Ui((([e])=>{const t=Wi(ju(Qu(this.batchMesh._indirectTexture),0).x),r=Wi(e).mod(t),s=Wi(e).div(t);return Qu(this.batchMesh._indirectTexture,Ki(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(Wi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=Wi(ju(Qu(s),0).x),n=Hi(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=ln(Qu(s,Ki(a,o)),Qu(s,Ki(a.add(1),o)),Qu(s,Ki(a.add(2),o)),Qu(s,Ki(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=Ui((([e])=>{const t=Wi(ju(Qu(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Qu(l,Ki(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);gn("vec3","vBatchColor").assign(t)}const d=un(u);Dl.assign(u.mul(Dl));const c=Wl.div(Zi(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;Wl.assign(h),e.hasGeometryAttribute("tangent")&&xd.mulAssign(d)}}const Oc=Di(Uc).setParameterLength(1);class kc extends Ws{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}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}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 Gc=Di(kc).setParameterLength(2);class zc extends Zu{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Es(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Us.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,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 Gc(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Us.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=vu(this.value),this._varying=su(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.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(null!==this.structTypeNode&&this.structTypeNode.build(e),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 $c=(e,t=null,r=0)=>Li(new zc(e,t,r)),Hc=new WeakMap;class Wc extends Hs{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Is.OBJECT,this.skinIndexNode=$u("skinIndex","uvec4"),this.skinWeightNode=$u("skinWeight","vec4"),this.bindMatrixNode=pd("bindMatrix","mat4"),this.bindMatrixInverseNode=pd("bindMatrixInverse","mat4"),this.boneMatricesNode=gd("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Dl,this.toPositionNode=Dl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=na(a.mul(s.x).mul(d),o.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=Wl){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=na(s.x.mul(a),s.y.mul(o),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=gd("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Il)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Ps(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Il.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();Wl.assign(t),e.hasGeometryAttribute("tangent")&&xd.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;Hc.get(t)!==e.frameId&&(Hc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const jc=e=>Li(new Wc(e));class qc extends Hs{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+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(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\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;tLi(new qc(Bi(e,"int"))).toStack(),Kc=()=>Iu("break").toStack(),Yc=new WeakMap,Qc=new s,Zc=Ui((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=Wi(Rc).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Qu(e,Ki(u,o)).depth(i).xyz.mul(t)}));class Jc extends Hs{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Yn(1),this.updateType=Is.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,a=void 0!==n?n.length:0,{texture:o,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,a=void 0!==n?n.length:0;let o=Yc.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.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*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=Hi(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Qu(this.mesh.morphTexture,Ki(Wi(e).add(1),Wi(Cc))).r):t.assign(pd("morphTargetInfluences","float").element(e).toVar()),Gi(t.notEqual(0),(()=>{!0===s&&Dl.addAssign(Zc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Wi(0)})),!0===i&&Wl.addAssign(Zc({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:Wi(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 eh=Di(Jc).setParameterLength(1);class th extends Hs{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class rh extends th{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class sh extends Xo{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:Zi().toVar("directDiffuse"),directSpecular:Zi().toVar("directSpecular"),indirectDiffuse:Zi().toVar("indirectDiffuse"),indirectSpecular:Zi().toVar("indirectSpecular")};return{radiance:Zi().toVar("radiance"),irradiance:Zi().toVar("irradiance"),iblIrradiance:Zi().toVar("iblIrradiance"),ambientOcclusion:Hi(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 ih=Di(sh);class nh extends th{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let ah,oh;class uh extends Hs{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===uh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Is.NONE;return this.scope!==uh.SIZE&&this.scope!==uh.VIEWPORT||(e=Is.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===uh.VIEWPORT?null!==t?oh.copy(t.viewport):(e.getViewport(oh),oh.multiplyScalar(e.getPixelRatio())):null!==t?(ah.width=t.width,ah.height=t.height):e.getDrawingBufferSize(ah)}setup(){const e=this.scope;let r=null;return r=e===uh.SIZE?Yn(ah||(ah=new t)):e===uh.VIEWPORT?Yn(oh||(oh=new s)):Xi(ch.div(dh)),r}generate(e){if(this.scope===uh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(dh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}uh.COORDINATE="coordinate",uh.VIEWPORT="viewport",uh.SIZE="size",uh.UV="uv";const lh=Ii(uh,uh.UV),dh=Ii(uh,uh.SIZE),ch=Ii(uh,uh.COORDINATE),hh=Ii(uh,uh.VIEWPORT),ph=hh.zw,gh=ch.sub(hh.xy),mh=gh.div(ph),fh=Ui((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),dh)),"vec2").once()(),yh=Ui((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),lh)),"vec2").once()(),xh=Ui((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),lh.flipY())),"vec2").once()(),bh=new t;class Th extends Ku{static get type(){return"ViewportTextureNode"}constructor(e=lh,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Is.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(bh);const r=this.value;r.image.width===bh.width&&r.image.height===bh.height||(r.image.width=bh.width,r.image.height=bh.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 _h=Di(Th).setParameterLength(0,3),vh=Di(Th,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let Nh=null;class Sh extends Th{static get type(){return"ViewportDepthTextureNode"}constructor(e=lh,t=null){null===Nh&&(Nh=new D),super(e,t,Nh)}}const wh=Di(Sh).setParameterLength(0,2);class Eh extends Hs{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===Eh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Eh.DEPTH_BASE)null!==r&&(s=Ph().assign(r));else if(t===Eh.DEPTH)s=e.isPerspectiveCamera?Rh(Ol.z,nl,al):Ah(Ol.z,nl,al);else if(t===Eh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ch(r,nl,al);s=Ah(e,nl,al)}else s=r;else s=Ah(Ol.z,nl,al);return s}}Eh.DEPTH_BASE="depthBase",Eh.DEPTH="depth",Eh.LINEAR_DEPTH="linearDepth";const Ah=(e,t,r)=>e.add(t).div(t.sub(r)),Rh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ch=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Mh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=Ha(e.negate().div(t)),i=Ha(r.div(t));return s.div(i)},Ph=Di(Eh,Eh.DEPTH_BASE),Lh=Ii(Eh,Eh.DEPTH),Fh=Di(Eh,Eh.LINEAR_DEPTH).setParameterLength(0,1),Bh=Fh(wh());Lh.assign=e=>Ph(e);class Dh extends Hs{static get type(){return"ClippingNode"}constructor(e=Dh.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===Dh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Dh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return Ui((()=>{const r=Hi().toVar("distanceToPlane"),s=Hi().toVar("distanceToGradient"),i=Hi(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=rl(t);Xc(n,(({i:t})=>{const n=e.element(t);r.assign(Ol.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Vo(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=rl(e),n=Hi(1).toVar("intersectionClipOpacity");Xc(a,(({i:e})=>{const i=t.element(e);r.assign(Ol.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Vo(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}mn.a.mulAssign(i),mn.a.equal(0).discard()}))()}setupDefault(e,t){return Ui((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=rl(t);Xc(r,(({i:t})=>{const r=e.element(t);Ol.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=rl(e),r=qi(!0).toVar("clipped");Xc(s,(({i:e})=>{const s=t.element(e);r.assign(Ol.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),Ui((()=>{const s=rl(e),i=sl(t.getClipDistance());Xc(r,(({i:e})=>{const t=s.element(e),r=Ol.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Dh.ALPHA_TO_COVERAGE="alphaToCoverage",Dh.DEFAULT="default",Dh.HARDWARE="hardware";const Ih=Ui((([e])=>Ya(oa(1e4,Qa(oa(17,e.x).add(oa(.1,e.y)))).mul(na(.1,so(Qa(oa(13,e.y).add(e.x)))))))),Vh=Ui((([e])=>Ih(Xi(Ih(e.xy),e.z)))),Uh=Ui((([e])=>{const t=bo(no(uo(e.xyz)),no(lo(e.xyz))),r=Hi(1).div(Hi(.05).mul(t)).toVar("pixScale"),s=Xi(za(qa(Ha(r))),za(Xa(Ha(r)))),i=Xi(Vh(qa(s.x.mul(e.xyz))),Vh(qa(s.y.mul(e.xyz)))),n=Ya(Ha(r)),a=na(oa(n.oneMinus(),i.x),oa(n,i.y)),o=xo(n,n.oneMinus()),u=Zi(a.mul(a).div(oa(2,o).mul(aa(1,o))),a.sub(oa(.5,o)).div(aa(1,o)),aa(1,aa(1,a).mul(aa(1,a)).div(oa(2,o).mul(aa(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Bo(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Oh extends zu{static get type(){return"VertexColorNode"}constructor(e){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}}const kh=(e=0)=>Li(new Oh(e));class Gh extends I{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,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.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+vs(this)}build(e){this.setup(e)}setupObserver(e){return new ys(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=rn(s,mn.a).max(0);i=this.setupOutput(e,a),Fn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&Fn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=rn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=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=Li(new Dh(Dh.ALPHA_TO_COVERAGE)):e.stack.add(Li(new Dh))}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(Li(new Dh(Dh.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?Mh(Ol.z,nl,al):Ah(Ol.z,nl,al))}null!==s&&Lh.assign(s).toStack()}setupPositionView(){return Ml.mul(Dl).xyz}setupModelViewProjection(){return ol.mul(Ol)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Ec}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&eh(t).toStack(),!0===t.isSkinnedMesh&&jc(t).toStack(),this.displacementMap){const e=fd("displacementMap","texture"),t=fd("displacementScale","float"),r=fd("displacementBias","float");Dl.addAssign(Wl.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Oc(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Vc(t).toStack(),null!==this.positionNode&&Dl.assign(this.positionNode.context({isPositionNodeInput:!0})),Dl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?rn(this.colorNode):$d;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(kh())),e.instanceColor){r=gn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=gn("vec3","vBatchColor").mul(r)}mn.assign(r);const s=this.opacityNode?Hi(this.opacityNode):jd;if(mn.a.assign(mn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?Hi(this.alphaTestNode):zd;mn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&mn.a.lessThan(Uh(Dl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&mn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Zi(0):mn.rgb}setupNormal(){return this.normalNode?Zi(this.normalNode):ec}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?fd("envMap","cubeTexture"):fd("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new nh(Nc)),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:Sc;t.push(new rh(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 a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=ih(n,t,r,s)}else null!==r&&(a=Zi(null!==s?Fo(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(fn.assign(Zi(i||Wd)),a=a.add(fn)),a}setupFog(e,t){const r=e.fogNode;return r&&(Fn.assign(t),t=rn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),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=I.prototype.toJSON.call(this,e),s=Ns(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.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,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 zh=new U;class $h extends Gh{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(zh),this.setValues(e)}}const Hh=new O;class Wh extends Gh{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Hh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?Hi(this.offsetNode):Tc,t=this.dashScaleNode?Hi(this.dashScaleNode):fc,r=this.dashSizeNode?Hi(this.dashSizeNode):yc,s=this.gapSizeNode?Hi(this.gapSizeNode):xc;Bn.assign(r),Dn.assign(s);const i=su($u("lineDistance").mul(t));(e?i.add(e):i).mod(Bn.add(Dn)).greaterThan(Bn).discard()}}let jh=null;class qh extends Th{static get type(){return"ViewportSharedTextureNode"}constructor(e=lh,t=null){null===jh&&(jh=new F),super(e,t,jh)}updateReference(){return this}}const Xh=Di(qh).setParameterLength(0,2),Kh=new O;class Yh extends Gh{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Kh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=k,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=Ui((({start:e,end:t})=>{const r=ol.element(2).element(2),s=ol.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return rn(Fo(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=Ui((()=>{const e=$u("instanceStart"),t=$u("instanceEnd"),r=rn(Ml.mul(rn(e,1))).toVar("start"),s=rn(Ml.mul(rn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?Hi(this.dashScaleNode):fc,t=this.offsetNode?Hi(this.offsetNode):Tc,r=$u("instanceDistanceStart"),s=$u("instanceDistanceEnd");let i=Bl.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),gn("float","lineDistance").assign(i)}n&&(gn("vec3","worldStart").assign(r.xyz),gn("vec3","worldEnd").assign(s.xyz));const o=hh.z.div(hh.w),u=ol.element(2).element(3).equal(-1);Gi(u,(()=>{Gi(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=ol.mul(r),d=ol.mul(s),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(o)),p.assign(p.normalize());const g=rn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Fo(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=gn("vec4","worldPos");o.assign(Bl.y.lessThan(.5).select(r,s));const u=bc.mul(.5);o.addAssign(rn(Bl.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(rn(Bl.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(rn(a.mul(u),0)),Gi(Bl.y.greaterThan(1).or(Bl.y.lessThan(0)),(()=>{o.subAssign(rn(a.mul(2).mul(u),0))}))),g.assign(ol.mul(o));const l=Zi().toVar();l.assign(Bl.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Xi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bl.x.lessThan(0).select(e.negate(),e)),Gi(Bl.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Bl.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(bc)),e.assign(e.div(hh.w)),g.assign(Bl.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(rn(e,0,0)))}return g}))();const o=Ui((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return Xi(h,p)}));if(this.colorNode=Ui((()=>{const e=Hu();if(i){const t=this.dashSizeNode?Hi(this.dashSizeNode):yc,r=this.gapSizeNode?Hi(this.gapSizeNode):xc;Bn.assign(t),Dn.assign(r);const s=gn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(Bn.add(Dn)).greaterThan(Bn).discard()}const a=Hi(1).toVar("alpha");if(n){const e=gn("vec3","worldStart"),s=gn("vec3","worldEnd"),n=gn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Zi(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(bc);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Vo(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=Hi(s.fwidth()).toVar("dlen");Gi(e.y.abs().greaterThan(1),(()=>{a.assign(Vo(i.oneMinus(),i.add(1),s).oneMinus())}))}else Gi(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=$u("instanceColorStart"),t=$u("instanceColorEnd");u=Bl.y.lessThan(.5).select(e,t).mul($d)}else u=$d;return rn(u,a)}))(),this.transparent){const e=this.opacityNode?Hi(this.opacityNode):jd;this.outputNode=rn(this.colorNode.rgb.mul(e).add(Xh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}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 Qh=e=>Li(e).mul(.5).add(.5),Zh=new G;class Jh extends Gh{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(Zh),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?Hi(this.opacityNode):jd;mn.assign(pu(rn(Qh(Kl),e),z))}}class ep extends qs{static get type(){return"EquirectUVNode"}constructor(e=Ul){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Xi(t,r)}}const tp=Di(ep).setParameterLength(0,1);class rp extends ${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 H(5,5,5),n=tp(Ul),a=new Gh;a.colorNode=Yu(t,n,0),a.side=N,a.blending=k;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const sp=new WeakMap;class ip extends qs{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=dd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Is.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===Y||r===Q){if(sp.has(e)){const t=sp.get(e);ap(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new rp(r.height);s.fromEquirectangularTexture(t,e),ap(s.texture,e.mapping),this._cubeTexture=s.texture,sp.set(e,s.texture),e.addEventListener("dispose",np)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function np(e){const t=e.target;t.removeEventListener("dispose",np);const r=sp.get(t);void 0!==r&&(sp.delete(t),r.dispose())}function ap(e,t){t===Y?e.mapping=w:t===Q&&(e.mapping=E)}const op=Di(ip).setParameterLength(1);class up extends th{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=op(this.envNode)}}class lp extends th{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=Hi(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class dp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class cp extends dp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(rn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(rn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(mn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Fo(s.rgb,s.rgb.mul(i.rgb),Yd.mul(Qd)));break;case J:s.rgb.assign(Fo(s.rgb,i.rgb,Yd.mul(Qd)));break;case Z:s.rgb.addAssign(i.rgb.mul(Yd.mul(Qd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const hp=new te;class pp extends Gh{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(hp),this.setValues(e)}setupNormal(){return ql}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new up(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new lp(Nc)),t}setupOutgoingLight(){return mn.rgb}setupLightingModel(){return new cp}}const gp=Ui((({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))})),mp=Ui((e=>e.diffuseColor.mul(1/Math.PI))),fp=Ui((({dotNH:e})=>Ln.mul(Hi(.5)).add(1).mul(Hi(1/Math.PI)).mul(e.pow(Ln)))),yp=Ui((({lightDirection:e})=>{const t=e.add(kl).normalize(),r=Kl.dot(t).clamp(),s=kl.dot(t).clamp(),i=gp({f0:Mn,f90:1,dotVH:s}),n=Hi(.25),a=fp({dotNH:r});return i.mul(n).mul(a)}));class xp extends cp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Kl.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(mp({diffuseColor:mn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(yp({lightDirection:e})).mul(Yd))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(mp({diffuseColor:mn}))),s.indirectDiffuse.mulAssign(t)}}const bp=new re;class Tp extends Gh{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(bp),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new up(t):null}setupLightingModel(){return new xp(!1)}}const _p=new se;class vp extends Gh{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(_p),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new up(t):null}setupLightingModel(){return new xp}setupVariants(){const e=(this.shininessNode?Hi(this.shininessNode):Hd).max(1e-4);Ln.assign(e);const t=this.specularNode||qd;Mn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Np=Ui((e=>{if(!1===e.geometry.hasAttribute("normal"))return Hi(0);const t=ql.dFdx().abs().max(ql.dFdy().abs());return t.x.max(t.y).max(t.z)})),Sp=Ui((e=>{const{roughness:t}=e,r=Np();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),wp=Ui((({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 ua(.5,i.add(n).max(Fa))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Ep=Ui((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Zi(e.mul(r),t.mul(s),a).length()),l=a.mul(Zi(e.mul(i),t.mul(n),o).length());return ua(.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"}]}),Ap=Ui((({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"}]}),Rp=Hi(1/Math.PI),Cp=Ui((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Zi(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Rp.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"}]}),Mp=Ui((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||Kl,l=i.pow2(),d=t.add(kl).normalize(),c=u.dot(t).clamp(),h=u.dot(kl).clamp(),p=u.dot(d).clamp(),g=kl.dot(d).clamp();let m,f,y=gp({f0:r,f90:s,dotVH:g});if(Ci(a)&&(y=Nn.mix(y,n)),Ci(o)){const e=Rn.dot(t),r=Rn.dot(kl),s=Rn.dot(d),i=Cn.dot(t),n=Cn.dot(kl),a=Cn.dot(d);m=Ep({alphaT:En,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Cp({alphaT:En,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=wp({alpha:l,dotNL:c,dotNV:h}),f=Ap({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Pp=Ui((({roughness:e,dotNV:t})=>{const r=rn(-1,-.0275,-.572,.022),s=rn(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 Xi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Lp=Ui((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Pp({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Fp=Ui((({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(Zi(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"}]}),Bp=Ui((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=Hi(1).div(r),i=t.pow2().oneMinus().max(.0078125);return Hi(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"}]}),Dp=Ui((({dotNV:e,dotNL:t})=>Hi(1).div(Hi(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Ip=Ui((({lightDirection:e})=>{const t=e.add(kl).normalize(),r=Kl.dot(e).clamp(),s=Kl.dot(kl).clamp(),i=Kl.dot(t).clamp(),n=Bp({roughness:vn,dotNH:i}),a=Dp({dotNV:s,dotNL:r});return _n.mul(n).mul(a)})),Vp=Ui((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Xi(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"}]}),Up=Ui((({f:e})=>{const t=e.length();return bo(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Op=Ui((({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(),a=i.div(n),o=r.greaterThan(0).select(a,bo(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),kp=Ui((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=Zi().toVar();return Gi(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(un(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=Zi(0).toVar();f.addAssign(Op({v1:h,v2:p})),f.addAssign(Op({v1:p,v2:g})),f.addAssign(Op({v1:g,v2:m})),f.addAssign(Op({v1:m,v2:h})),c.assign(Zi(Up({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"}]}),Gp=Ui((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=Zi().toVar();return Gi(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=Zi(0).toVar();d.addAssign(Op({v1:n,v2:a})),d.addAssign(Op({v1:a,v2:o})),d.addAssign(Op({v1:o,v2:l})),d.addAssign(Op({v1:l,v2:n})),u.assign(Zi(Up({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),zp=1/6,$p=e=>oa(zp,oa(e,oa(e,e.negate().add(3)).sub(3)).add(1)),Hp=e=>oa(zp,oa(e,oa(e,oa(3,e).sub(6))).add(4)),Wp=e=>oa(zp,oa(e,oa(e,oa(-3,e).add(3)).add(3)).add(1)),jp=e=>oa(zp,Eo(e,3)),qp=e=>$p(e).add(Hp(e)),Xp=e=>Wp(e).add(jp(e)),Kp=e=>na(-1,Hp(e).div($p(e).add(Hp(e)))),Yp=e=>na(1,jp(e).div(Wp(e).add(jp(e)))),Qp=(e,t,r)=>{const s=e.uvNode,i=oa(s,t.zw).add(.5),n=qa(i),a=Ya(i),o=qp(a.x),u=Xp(a.x),l=Kp(a.x),d=Yp(a.x),c=Kp(a.y),h=Yp(a.y),p=Xi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Xi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Xi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Xi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=qp(a.y).mul(na(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Xp(a.y).mul(na(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},Zp=Ui((([e,t=Hi(3)])=>{const r=Xi(e.size(Wi(t))),s=Xi(e.size(Wi(t.add(1)))),i=ua(1,r),n=ua(1,s),a=Qp(e,rn(i,r),qa(t)),o=Qp(e,rn(n,s),Xa(t));return Ya(t).mix(a,o)})),Jp=Ui((([e,t,r,s,i])=>{const n=Zi(Io(t.negate(),Ka(e),ua(1,s))),a=Zi(no(i[0].xyz),no(i[1].xyz),no(i[2].xyz));return Ka(n).mul(r.mul(a))})).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"}]}),eg=Ui((([e,t])=>e.mul(Bo(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),tg=vh(),rg=vh(),sg=Ui((([e,t,r],{material:s})=>{const i=(s.side===N?tg:rg).sample(e),n=Ha(dh.x).mul(eg(t,r));return Zp(i,n)})),ig=Ui((([e,t,r])=>(Gi(r.notEqual(0),(()=>{const s=$a(t).negate().div(r);return Ga(s.negate().mul(e))})),Zi(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),ng=Ui((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=rn().toVar(),f=Zi().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Zi(d.sub(i),d,d.add(i));Xc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=Jp(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(rn(y,1))),b=Xi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Xi(b.x,b.y.oneMinus()));const T=sg(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(ig(no(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=Jp(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(rn(n,1))),y=Xi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Xi(y.x,y.y.oneMinus())),m=sg(y,r,d),f=s.mul(ig(no(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=Zi(Lp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return rn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),ag=un(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),og=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ug=Ui((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Fo(e,t,Vo(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();Gi(a.lessThan(0),(()=>Zi(1)));const o=a.sqrt(),u=og(n,e),l=gp({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=Hi(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Zi(1).add(t).div(Zi(1).sub(t))})(i.clamp(0,.9999)),g=og(p,n.toVec3()),m=gp({f0:g,f90:1,dotVH:o}),f=Zi(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,o,2),x=Zi(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(Zi(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Xc({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=Zi(54856e-17,44201e-17,52481e-17),i=Zi(1681e3,1795300,2208400),n=Zi(43278e5,93046e5,66121e5),a=Hi(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=Zi(o.x.add(a),o.y,o.z).div(1.0685e-7),ag.mul(o)})(Hi(e).mul(y),Hi(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(Zi(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"}]}),lg=Ui((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=jo(r.lessThan(.25),Hi(-339.2).mul(i).add(Hi(161.4).mul(r)).sub(25.9),Hi(-8.48).mul(i).add(Hi(14.3).mul(r)).sub(9.95)),a=jo(r.lessThan(.25),Hi(44).mul(i).sub(Hi(23.7).mul(r)).add(3.26),Hi(1.97).mul(i).sub(Hi(3.27).mul(r)).add(.72));return jo(r.lessThan(.25),0,Hi(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),dg=Zi(.04),cg=Hi(1);class hg extends dp{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=Zi().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Zi().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Zi().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Zi().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Zi().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Kl.dot(kl).clamp();this.iridescenceFresnel=ug({outsideIOR:Hi(1),eta2:Sn,cosTheta1:e,thinFilmThickness:wn,baseF0:Mn}),this.iridescenceF0=Fp({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Vl,r=hl.sub(Vl).normalize(),s=Yl,i=e.context;i.backdrop=ng(s,r,yn,mn,Mn,Pn,t,Nl,ll,ol,Vn,On,Gn,kn,this.dispersion?zn:null),i.backdropAlpha=Un,mn.a.mulAssign(Fo(1,i.backdrop.a,Un))}super.start(e)}computeMultiscattering(e,t,r){const s=Kl.dot(kl).clamp(),i=Pp({roughness:yn,dotNV:s}),n=(this.iridescenceF0?Nn.mix(Mn,this.iridescenceF0):Mn).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Mn.add(Mn.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Kl.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Ip({lightDirection:e}))),!0===this.clearcoat){const r=Ql.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Mp({lightDirection:e,f0:dg,f90:cg,roughness:Tn,normalView:Ql})))}r.directDiffuse.addAssign(s.mul(mp({diffuseColor:mn.rgb}))),r.directSpecular.addAssign(s.mul(Mp({lightDirection:e,f0:Mn,f90:1,roughness:yn,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:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Kl,h=kl,p=Ol.toVar(),g=Vp({N:c,V:h,roughness:yn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=un(Zi(m.x,0,m.y),Zi(0,1,0),Zi(m.z,0,m.w)).toVar(),x=Mn.mul(f.x).add(Mn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(kp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(mn).mul(kp({N:c,V:h,P:p,mInv:un(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(mp({diffuseColor:mn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(_n,lg({normal:Kl,viewDir:kl,roughness:vn}))),!0===this.clearcoat){const e=Ql.dot(kl).clamp(),t=Lp({dotNV:e,specularColor:dg,specularF90:cg,roughness:Tn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Zi().toVar("singleScattering"),n=Zi().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Pn);const o=i.add(n),u=mn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Kl.dot(kl).clamp().add(t),i=yn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Ql.dot(kl).clamp(),r=gp({dotVH:e,f0:dg,f90:cg}),s=t.mul(bn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(bn));t.assign(s)}if(!0===this.sheen){const e=_n.r.max(_n.g).max(_n.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const pg=Hi(1),gg=Hi(-2),mg=Hi(.8),fg=Hi(-1),yg=Hi(.4),xg=Hi(2),bg=Hi(.305),Tg=Hi(3),_g=Hi(.21),vg=Hi(4),Ng=Hi(4),Sg=Hi(16),wg=Ui((([e])=>{const t=Zi(so(e)).toVar(),r=Hi(-1).toVar();return Gi(t.x.greaterThan(t.z),(()=>{Gi(t.x.greaterThan(t.y),(()=>{r.assign(jo(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(jo(e.y.greaterThan(0),1,4))}))})).Else((()=>{Gi(t.z.greaterThan(t.y),(()=>{r.assign(jo(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(jo(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Eg=Ui((([e,t])=>{const r=Xi().toVar();return Gi(t.equal(0),(()=>{r.assign(Xi(e.z,e.y).div(so(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Xi(e.x.negate(),e.z.negate()).div(so(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Xi(e.x.negate(),e.y).div(so(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Xi(e.z.negate(),e.y).div(so(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Xi(e.x.negate(),e.z).div(so(e.y)))})).Else((()=>{r.assign(Xi(e.x,e.y).div(so(e.z)))})),oa(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Ag=Ui((([e])=>{const t=Hi(0).toVar();return Gi(e.greaterThanEqual(mg),(()=>{t.assign(pg.sub(e).mul(fg.sub(gg)).div(pg.sub(mg)).add(gg))})).ElseIf(e.greaterThanEqual(yg),(()=>{t.assign(mg.sub(e).mul(xg.sub(fg)).div(mg.sub(yg)).add(fg))})).ElseIf(e.greaterThanEqual(bg),(()=>{t.assign(yg.sub(e).mul(Tg.sub(xg)).div(yg.sub(bg)).add(xg))})).ElseIf(e.greaterThanEqual(_g),(()=>{t.assign(bg.sub(e).mul(vg.sub(Tg)).div(bg.sub(_g)).add(Tg))})).Else((()=>{t.assign(Hi(-2).mul(Ha(oa(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Rg=Ui((([e,t])=>{const r=e.toVar();r.assign(oa(2,r).sub(1));const s=Zi(r,1).toVar();return Gi(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"}]}),Cg=Ui((([e,t,r,s,i,n])=>{const a=Hi(r),o=Zi(t),u=Bo(Ag(a),gg,n),l=Ya(u),d=qa(u),c=Zi(Mg(e,o,d,s,i,n)).toVar();return Gi(l.notEqual(0),(()=>{const t=Zi(Mg(e,o,d.add(1),s,i,n)).toVar();c.assign(Fo(c,t,l))})),c})),Mg=Ui((([e,t,r,s,i,n])=>{const a=Hi(r).toVar(),o=Zi(t),u=Hi(wg(o)).toVar(),l=Hi(bo(Ng.sub(a),0)).toVar();a.assign(bo(a,Ng));const d=Hi(za(a)).toVar(),c=Xi(Eg(o,u).mul(d.sub(2)).add(1)).toVar();return Gi(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(oa(3,Sg))),c.y.addAssign(oa(4,za(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Xi(),Xi())})),Pg=Ui((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Za(s),l=r.mul(u).add(i.cross(r).mul(Qa(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Mg(e,l,t,n,a,o)})),Lg=Ui((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=Zi(jo(t,r,wo(r,s))).toVar();Gi(h.equal(Zi(0)),(()=>{h.assign(Zi(s.z,0,s.x.negate()))})),h.assign(Ka(h));const p=Zi().toVar();return p.addAssign(i.element(0).mul(Pg({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Xc({start:Wi(1),end:e},(({i:e})=>{Gi(e.greaterThanEqual(n),(()=>{Kc()}));const t=Hi(a.mul(Hi(e))).toVar();p.addAssign(i.element(e).mul(Pg({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Pg({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),rn(p,1)})),Fg=[.125,.215,.35,.446,.526,.582],Bg=20,Dg=new ie(-1,1,1,-1,0,1),Ig=new ne(90,1),Vg=new e;let Ug=null,Og=0,kg=0;const Gg=(1+Math.sqrt(5))/2,zg=1/Gg,$g=[new r(-Gg,zg,0),new r(Gg,zg,0),new r(-zg,0,Gg),new r(zg,0,Gg),new r(0,Gg,-zg),new r(0,Gg,zg),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],Hg=new r,Wg=new WeakMap,jg=[3,1,5,0,4,2],qg=Rg(Hu(),$u("faceIndex")).normalize(),Xg=Zi(qg.x,qg.y,qg.z);class Kg{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={}){const{size:n=256,position:a=Hg,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Ug=this._renderer.getRenderTarget(),Og=this._renderer.getActiveCubeFace(),kg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){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=Jg(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=em(),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===w||e.mapping===E?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=Fg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-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,x=new Float32Array(m*g*p),b=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=jg[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=rl(new Array(Bg).fill(0)),n=Yn(new r(0,1,0)),a=Yn(0),o=Hi(Bg),u=Yn(0),l=Yn(1),d=Yu(null),c=Yn(0),h=Hi(1/t),p=Hi(1/s),g=Hi(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Xg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=Zg("blur");return f.fragmentNode=Lg({...m,latitudinal:u.equal(1)}),Wg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Dg)}_sceneToCubeUV(e,t,r,s,i){const n=Ig;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Vg),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new H,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Vg),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Qg(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===w||e.mapping===E;s?null===this._cubemapMaterial&&(this._cubemapMaterial=Jg(e)):null===this._equirectMaterial&&(this._equirectMaterial=em(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Qg(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Dg)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tBg&&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-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Dg)}}function Yg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function Qg(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function Zg(e){const t=new Gh;return t.depthTest=!1,t.depthWrite=!1,t.blending=k,t.name=`PMREM_${e}`,t}function Jg(e){const t=Zg("cubemap");return t.fragmentNode=dd(e,Xg),t}function em(e){const t=Zg("equirect");return t.fragmentNode=Yu(e,tp(Xg),0),t}const tm=new WeakMap;function rm(e,t,r){const s=function(e){let t=tm.get(e);void 0===t&&(t=new WeakMap,tm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class sm extends qs{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 pe;s.isRenderTargetTexture=!0,this._texture=Yu(s),this._width=Yn(0),this._height=Yn(0),this._maxMip=Yn(0),this.updateBeforeType=Is.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(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:rm(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Kg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=id.mul(Zi(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Cg(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const im=Di(sm).setParameterLength(1,3),nm=new WeakMap;class am extends th{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=nm.get(e);void 0===s&&(s=im(e),nm.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Ld:Kl,i=r.context(om(yn,s)).mul(sd),n=r.context(um(Yl)).mul(Math.PI).mul(sd),a=Cu(i),o=Cu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(om(Tn,Ql)).mul(sd),t=Cu(e);u.addAssign(t)}}}const om=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=kl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(ll)),r),getTextureLevel:()=>e}},um=e=>({getUV:()=>e,getTextureLevel:()=>Hi(1)}),lm=new ge;class dm extends Gh{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(lm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new am(t):null}setupLightingModel(){return new hg}setupSpecular(){const e=Fo(Zi(.04),mn.rgb,xn);Mn.assign(e),Pn.assign(1)}setupVariants(){const e=this.metalnessNode?Hi(this.metalnessNode):Jd;xn.assign(e);let t=this.roughnessNode?Hi(this.roughnessNode):Zd;t=Sp({roughness:t}),yn.assign(t),this.setupSpecular(),mn.assign(rn(mn.rgb.mul(e.oneMinus()),mn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const cm=new me;class hm extends dm{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(cm),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?Hi(this.iorNode):pc;Vn.assign(e),Mn.assign(Fo(xo(Ao(Vn.sub(1).div(Vn.add(1))).mul(Kd),Zi(1)).mul(Xd),mn.rgb,xn)),Pn.assign(Fo(Xd,1,xn))}setupLightingModel(){return new hg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?Hi(this.clearcoatNode):tc,t=this.clearcoatRoughnessNode?Hi(this.clearcoatRoughnessNode):rc;bn.assign(e),Tn.assign(Sp({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Zi(this.sheenNode):nc,t=this.sheenRoughnessNode?Hi(this.sheenRoughnessNode):ac;_n.assign(e),vn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?Hi(this.iridescenceNode):uc,t=this.iridescenceIORNode?Hi(this.iridescenceIORNode):lc,r=this.iridescenceThicknessNode?Hi(this.iridescenceThicknessNode):dc;Nn.assign(e),Sn.assign(t),wn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Xi(this.anisotropyNode):oc).toVar();An.assign(e.length()),Gi(An.equal(0),(()=>{e.assign(Xi(1,0))})).Else((()=>{e.divAssign(Xi(An)),An.assign(An.saturate())})),En.assign(An.pow2().mix(yn.pow2(),1)),Rn.assign(Md[0].mul(e.x).add(Md[1].mul(e.y))),Cn.assign(Md[1].mul(e.x).sub(Md[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?Hi(this.transmissionNode):cc,t=this.thicknessNode?Hi(this.thicknessNode):hc,r=this.attenuationDistanceNode?Hi(this.attenuationDistanceNode):gc,s=this.attenuationColorNode?Zi(this.attenuationColorNode):mc;if(Un.assign(e),On.assign(t),kn.assign(r),Gn.assign(s),this.useDispersion){const e=this.dispersionNode?Hi(this.dispersionNode):vc;zn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Zi(this.clearcoatNormalNode):sc}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 pm extends hg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(Kl.mul(a)).normalize(),h=Hi(kl.dot(c.negate()).saturate().pow(l).mul(d)),p=Zi(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class gm extends hm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=Hi(.1),this.thicknessAmbientNode=Hi(0),this.thicknessAttenuationNode=Hi(.1),this.thicknessPowerNode=Hi(2),this.thicknessScaleNode=Hi(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new pm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,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 mm=Ui((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Xi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=fd("gradientMap","texture").context({getUV:()=>i});return Zi(e.r)}{const e=i.fwidth().mul(.5);return Fo(Zi(.7),Zi(1),Vo(Hi(.7).sub(e.x),Hi(.7).add(e.x),i.x))}}));class fm extends dp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=mm({normal:Hl,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(mp({diffuseColor:mn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(mp({diffuseColor:mn}))),s.indirectDiffuse.mulAssign(t)}}const ym=new fe;class xm extends Gh{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(ym),this.setValues(e)}setupLightingModel(){return new fm}}class bm extends qs{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=Zi(kl.z,0,kl.x.negate()).normalize(),t=kl.cross(e);return Xi(e.dot(Kl),t.dot(Kl)).mul(.495).add(.5)}}const Tm=Ii(bm),_m=new ye;class vm extends Gh{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(_m),this.setValues(e)}setupVariants(e){const t=Tm;let r;r=e.material.matcap?fd("matcap","texture").context({getUV:()=>t}):Zi(Fo(.2,.8,t.y)),mn.rgb.mulAssign(r.rgb)}}class Nm extends qs{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 on(e,s,s.negate(),e).mul(r)}{const e=t,s=ln(rn(1,0,0,0),rn(0,Za(e.x),Qa(e.x).negate(),0),rn(0,Qa(e.x),Za(e.x),0),rn(0,0,0,1)),i=ln(rn(Za(e.y),0,Qa(e.y),0),rn(0,1,0,0),rn(Qa(e.y).negate(),0,Za(e.y),0),rn(0,0,0,1)),n=ln(rn(Za(e.z),Qa(e.z).negate(),0,0),rn(Qa(e.z),Za(e.z),0,0),rn(0,0,1,0),rn(0,0,0,1));return s.mul(i).mul(n).mul(rn(r,1)).xyz}}}const Sm=Di(Nm).setParameterLength(2),wm=new xe;class Em extends Gh{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(wm),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Ml.mul(Zi(i||0));let u=Xi(Nl[0].xyz.length(),Nl[1].xyz.length());if(null!==a&&(u=u.mul(Xi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=Hi(2).div(ol.element(1).element(1));u=u.mul(e.mul(2))}let l=Bl.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Li(new mu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=Hi(n||ic),c=Sm(l,d);return rn(o.xy.add(c),o.zw)}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)}}const Am=new be;class Rm extends Em{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Am),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ml.mul(Zi(e||Dl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Bl.xy.toVar(),a=hh.z.div(hh.w);if(r&&r.isNode){const e=Hi(r);n.assign(Sm(n,e))}let o=null!==i?Xi(i):_c;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Ol.z.negate()))),s&&s.isNode&&(o=o.mul(Xi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(hh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(rn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class Cm extends dp{constructor(){super(),this.shadowNode=Hi(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){mn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(mn.rgb)}}const Mm=new Te;class Pm extends Gh{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(Mm),this.setValues(e)}setupLightingModel(){return new Cm}}const Lm=pn("vec3"),Fm=pn("vec3"),Bm=pn("vec3");class Dm extends dp{constructor(){super()}start(e){const{material:t,context:r}=e,s=pn("vec3"),i=pn("vec3");Gi(hl.sub(Vl).length().greaterThan(Al.mul(2)),(()=>{s.assign(hl),i.assign(Vl)})).Else((()=>{s.assign(Vl),i.assign(hl)}));const n=i.sub(s),a=Yn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=Hi(0).toVar(),d=Zi(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),Xc(a,(()=>{const i=s.add(u.mul(l)),n=ll.mul(rn(i,1)).xyz;let a;null!==t.depthNode&&(Fm.assign(Fh(Rh(n.z,nl,al))),r.sceneDepthNode=Fh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Lm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Lm.mulAssign(a);const c=Lm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),Bm.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?Gi(r.greaterThanEqual(Fm),(()=>{Lm.addAssign(e)})):Lm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Gp({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Bm)}}class Im extends Gh{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Dm}}class Vm{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,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}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Um{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().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}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}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),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;o?p=a.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,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",bs(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=_s(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=_s(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const Gm=[];class zm{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,a,o){const u=this.getChainMap(o);Gm[0]=e,Gm[1]=t,Gm[2]=n,Gm[3]=i;let l=u.get(Gm);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Gm,l)):(l.updateClipping(a),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,a,o)):l.version=t.version)),Gm.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Um)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new km(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class $m{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=null;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 Hm=1,Wm=2,jm=3,qm=4,Xm=16;class Km extends $m{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===Hm?this.backend.createAttribute(e):t===Wm?this.backend.createIndexAttribute(e):t===jm?this.backend.createStorageAttribute(e):t===qm&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{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,jm):this.updateAttribute(e,Hm);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,Wm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,qm)}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=Qm(t),e.set(t,r)):r.version!==Ym(t)&&(this.attributes.delete(r),r=Qm(t),e.set(t,r)),s=r}return s}}class Jm{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},this.compute={calls:0,frameCalls:0,timestamp: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.")}reset(){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 ef{constructor(e){this.cacheKey=e,this.usedTimes=0}}class tf extends ef{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class rf extends ef{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let sf=0;class nf{constructor(e,t,r,s=null,i=null){this.id=sf++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class af extends $m{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 a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new nf(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.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(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new nf(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new nf(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}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 rf(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 tf(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 of extends $m{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?qm:jm;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?qm:jm;this.attributes.update(e,r)}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 o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,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,a)}}function uf(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function lf(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 df(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class cf{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,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(df(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(df(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||uf),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||lf),this.transparent.length>1&&this.transparent.sort(t||lf)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=!0===e.multiview&&a.depth>1?new Ee:new D,l.format=e.stencilBuffer?Ae:Re,l.type=e.stencilBuffer?Ce:b,l.image.width=o,l.image.height=u,l.image.depth=a.depth,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isDepthArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.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};if(!0!==e.isXRRenderTarget){for(let t=0;t1,c&&(r.needsUpdate=!0),this.updateTexture(r,h)}l&&this.updateTexture(l,h)}if(!0!==r.initialized){r.initialized=!0;const t=()=>{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)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=_f){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!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class Nf 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 Sf extends hn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class wf extends Hs{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Pi(t);return this._currentCond=jo(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Pi(t),s=jo(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Pi(e),this}Switch(e){return this._expressionNode=Li(e),this}Case(...e){const t=[];if(!(e.length>=2))throw new Error("TSL: Invalid parameter length. Case() requires at least two parameters.");for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=Rs(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Rf extends Hs{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class Cf extends Hs{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{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)})),Df=(e,t)=>Eo(oa(4,e.mul(aa(1,e))),t),If=Ui((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Vf=Ui((([e])=>Zi(If(e.z.add(If(e.y.mul(1)))),If(e.z.add(If(e.x.mul(1)))),If(e.y.add(If(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Uf=Ui((([e,t,r])=>{const s=Zi(e).toVar(),i=Hi(1.4).toVar(),n=Hi(0).toVar(),a=Zi(s).toVar();return Xc({start:Hi(0),end:Hi(3),type:"float",condition:"<="},(()=>{const e=Zi(Vf(a.mul(2))).toVar();s.addAssign(e.add(r.mul(Hi(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=Hi(If(s.z.add(If(s.x.add(If(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Of extends Hs{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 a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const kf=Di(Of),Gf=e=>(...t)=>kf(e,...t),zf=Yn(0).setGroup(qn).onRenderUpdate((e=>e.time)),$f=Yn(0).setGroup(qn).onRenderUpdate((e=>e.deltaTime)),Hf=Yn(0,"uint").setGroup(qn).onRenderUpdate((e=>e.frameId)),Wf=Ui((([e,t,r=Xi(.5)])=>Sm(e.sub(r),t).add(r))),jf=Ui((([e,t,r=Xi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),qf=Ui((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=Nl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=Nl;const i=ll.mul(s);return Ci(t)&&(i[0][0]=Nl[0].length(),i[0][1]=0,i[0][2]=0),Ci(r)&&(i[1][0]=0,i[1][1]=Nl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ol.mul(i).mul(Dl)})),Xf=Ui((([e=null])=>{const t=Fh();return Fh(wh(e)).sub(t).lessThan(0).select(lh,e)}));class Kf extends Hs{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Hu(),r=Hi(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(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Xi(a,o);return t.add(l).mul(u)}}const Yf=Di(Kf).setParameterLength(3);class Qf extends Hs{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=Hi(1),i=Dl,n=Wl){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 a=n.abs().normalize();a=a.div(a.dot(Zi(1)));const o=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=Yu(d,o).mul(a.x),g=Yu(c,u).mul(a.y),m=Yu(h,l).mul(a.z);return na(p,g,m)}}const Zf=Di(Qf).setParameterLength(1,6),Jf=new Pe,ey=new r,ty=new r,ry=new r,sy=new a,iy=new r(0,0,-1),ny=new s,ay=new r,oy=new r,uy=new s,ly=new t,dy=new ae,cy=lh.flipX();dy.depthTexture=new D(1,1);let hy=!1;class py extends Ku{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||dy.texture,cy),this._reflectorBaseNode=e.reflector||new gy(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=Li(new py({defaultTexture:dy.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}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class gy extends Hs{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Le,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Is.RENDER:Is.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(ly),e.setSize(Math.round(ly.width*r),Math.round(ly.height*r))}setup(e){return this._updateResolution(dy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}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 ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Fe,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new D),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&hy)return!1;hy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(ly),this._updateResolution(o,s),ty.setFromMatrixPosition(n.matrixWorld),ry.setFromMatrixPosition(r.matrixWorld),sy.extractRotation(n.matrixWorld),ey.set(0,0,1),ey.applyMatrix4(sy),ay.subVectors(ty,ry);if(!0===ay.dot(ey)>0&&!1===this.forceUpdate)return;ay.reflect(ey).negate(),ay.add(ty),sy.extractRotation(r.matrixWorld),iy.set(0,0,-1),iy.applyMatrix4(sy),iy.add(ry),oy.subVectors(ty,iy),oy.reflect(ey).negate(),oy.add(ty),a.coordinateSystem=r.coordinateSystem,a.position.copy(ay),a.up.set(0,1,0),a.up.applyMatrix4(sy),a.up.reflect(ey),a.lookAt(oy),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Jf.setFromNormalAndCoplanarPoint(ey,ty),Jf.applyMatrix4(a.matrixWorldInverse),ny.set(Jf.normal.x,Jf.normal.y,Jf.normal.z,Jf.constant);const u=a.projectionMatrix;uy.x=(Math.sign(ny.x)+u.elements[8])/u.elements[0],uy.y=(Math.sign(ny.y)+u.elements[9])/u.elements[5],uy.z=-1,uy.w=(1+u.elements[10])/u.elements[14],ny.multiplyScalar(1/ny.dot(uy));u.elements[2]=ny.x,u.elements[6]=ny.y,u.elements[10]=s.coordinateSystem===d?ny.z-0:ny.z+1-0,u.elements[14]=ny.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,hy=!1,this.forceUpdate=!1}}const my=new ie(-1,1,1,-1,0,1);class fy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Be([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Be(t,2))}}const yy=new fy;class xy extends W{constructor(e=null){super(yy,e),this.camera=my,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,my)}render(e){e.render(this,my)}}const by=new t;class Ty extends Ku{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,Hu()),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 xy(new Gh),this.updateBeforeType=Is.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(by);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 Ku(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const _y=(e,...t)=>Li(new Ty(Li(e),...t)),vy=Ui((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=Xi(e.x,e.y.oneMinus()).mul(2).sub(1),i=rn(Zi(e,t),1)):i=rn(Zi(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=rn(r.mul(i));return n.xyz.div(n.w)})),Ny=Ui((([e,t])=>{const r=t.mul(rn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Xi(s.x,s.y.oneMinus())})),Sy=Ui((([e,t,r])=>{const s=ju(Qu(t)),i=Ki(e.mul(s)).toVar(),n=Qu(t,i).toVar(),a=Qu(t,i.sub(Ki(2,0))).toVar(),o=Qu(t,i.sub(Ki(1,0))).toVar(),u=Qu(t,i.add(Ki(1,0))).toVar(),l=Qu(t,i.add(Ki(2,0))).toVar(),d=Qu(t,i.add(Ki(0,2))).toVar(),c=Qu(t,i.add(Ki(0,1))).toVar(),h=Qu(t,i.sub(Ki(0,1))).toVar(),p=Qu(t,i.sub(Ki(0,2))).toVar(),g=so(aa(Hi(2).mul(o).sub(a),n)).toVar(),m=so(aa(Hi(2).mul(u).sub(l),n)).toVar(),f=so(aa(Hi(2).mul(c).sub(d),n)).toVar(),y=so(aa(Hi(2).mul(h).sub(p),n)).toVar(),x=vy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(vy(e.sub(Xi(Hi(1).div(s.x),0)),o,r)),x.negate().add(vy(e.add(Xi(Hi(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(vy(e.add(Xi(0,Hi(1).div(s.y))),c,r)),x.negate().add(vy(e.sub(Xi(0,Hi(1).div(s.y))),h,r)));return Ka(wo(b,T))}));class wy extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Ey extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Ay extends Hs{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const Ry=Ii(Ay),Cy=new S,My=new a;class Py extends Hs{static get type(){return"SceneNode"}constructor(e=Py.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===Py.BACKGROUND_BLURRINESS?s=pd("backgroundBlurriness","float",r):t===Py.BACKGROUND_INTENSITY?s=pd("backgroundIntensity","float",r):t===Py.BACKGROUND_ROTATION?s=Yn("mat4").label("backgroundRotation").setGroup(qn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==De?(Cy.copy(r.backgroundRotation),Cy.x*=-1,Cy.y*=-1,Cy.z*=-1,My.makeRotationFromEuler(Cy)):My.identity(),My})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Py.BACKGROUND_BLURRINESS="backgroundBlurriness",Py.BACKGROUND_INTENSITY="backgroundIntensity",Py.BACKGROUND_ROTATION="backgroundRotation";const Ly=Ii(Py,Py.BACKGROUND_BLURRINESS),Fy=Ii(Py,Py.BACKGROUND_INTENSITY),By=Ii(Py,Py.BACKGROUND_ROTATION);class Dy extends Ku{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=Us.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(Us.READ_WRITE)}toReadOnly(){return this.setAccess(Us.READ_ONLY)}toWriteOnly(){return this.setAccess(Us.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Iy=Di(Dy).setParameterLength(1,3),Vy=Ui((({texture:e,uv:t})=>{const r=1e-4,s=Zi().toVar();return Gi(t.x.lessThan(r),(()=>{s.assign(Zi(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(Zi(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(Zi(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(Zi(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(Zi(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(Zi(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(Zi(-.01,0,0))).r.sub(e.sample(t.add(Zi(r,0,0))).r),n=e.sample(t.add(Zi(0,-.01,0))).r.sub(e.sample(t.add(Zi(0,r,0))).r),a=e.sample(t.add(Zi(0,0,-.01))).r.sub(e.sample(t.add(Zi(0,0,r))).r);s.assign(Zi(i,n,a))})),s.normalize()}));class Uy extends Ku{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Zi(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(Wi(ju(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Vy({texture:this,uv:e})}}const Oy=Di(Uy).setParameterLength(1,3);class ky extends hd{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 Gy=new WeakMap;class zy extends qs{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Is.OBJECT,this.updateAfterType=Is.OBJECT,this.previousModelWorldMatrix=Yn(new a),this.previousProjectionMatrix=Yn(new a).setGroup(qn),this.previousCameraViewMatrix=Yn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Hy(r);this.previousModelWorldMatrix.value.copy(s);const i=$y(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,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}){Hy(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ol:Yn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ml).mul(Dl),s=this.previousProjectionMatrix.mul(t).mul(Il),i=r.xy.div(r.w),n=s.xy.div(s.w);return aa(i,n)}}function $y(e){let t=Gy.get(e);return void 0===t&&(t={},Gy.set(e,t)),t}function Hy(e,t=0){const r=$y(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const Wy=Ii(zy),jy=Ui((([e,t])=>xo(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qy=Ui((([e,t])=>xo(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xy=Ui((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ky=Ui((([e,t])=>Fo(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),To(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Yy=Ui((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return rn(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"}]}),Qy=Ui((([e])=>tx(e.rgb))),Zy=Ui((([e,t=Hi(1)])=>t.mix(tx(e.rgb),e.rgb))),Jy=Ui((([e,t=Hi(1)])=>{const r=na(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 Fo(e.rgb,s,i)})),ex=Ui((([e,t=Hi(1)])=>{const r=Zi(.57735,.57735,.57735),s=t.cos();return Zi(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(So(r,e.rgb).mul(s.oneMinus())))))})),tx=(e,t=Zi(c.getLuminanceCoefficients(new r)))=>So(e,t),rx=Ui((([e,t=Zi(1),s=Zi(0),i=Zi(1),n=Hi(1),a=Zi(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(Zi(a)),u=bo(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return Gi(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),Gi(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),Gi(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),rn(u.rgb,e.a)}));class sx extends qs{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 ix=Di(sx).setParameterLength(2),nx=new t;class ax extends Ku{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 ox extends ax{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 ux extends qs{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 D;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...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=Yn(0),this._cameraFar=Yn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Is.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}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=Li(new ox(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=Li(new ox(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=Ch(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=Ah(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.texture.type=e.getColorBufferType(),this.scope===ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),nx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(nx)),this._pixelRatio=i,this.setSize(nx.width,nx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}ux.COLOR="color",ux.DEPTH="depth";class lx extends ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(ux.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,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Gh;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=Wl.negate(),r=ol.mul(Ml),s=Hi(1),i=r.mul(rn(Dl,1)),n=r.mul(rn(Dl.add(t),1)),a=Ka(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=rn(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 dx=Ui((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),cx=Ui((([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"}]}),hx=Ui((([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"}]}),px=Ui((([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)})),gx=Ui((([e,t])=>{const r=un(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=un(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=px(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),mx=un(Zi(1.6605,-.1246,-.0182),Zi(-.5876,1.1329,-.1006),Zi(-.0728,-.0083,1.1187)),fx=un(Zi(.6274,.0691,.0164),Zi(.3293,.9195,.088),Zi(.0433,.0113,.8956)),yx=Ui((([e])=>{const t=Zi(e).toVar(),r=Zi(t.mul(t)).toVar(),s=Zi(r.mul(r)).toVar();return Hi(15.5).mul(s.mul(r)).sub(oa(40.14,s.mul(t))).add(oa(31.96,s).sub(oa(6.868,r.mul(t))).add(oa(.4298,r).add(oa(.1191,t).sub(.00232))))})),xx=Ui((([e,t])=>{const r=Zi(e).toVar(),s=un(Zi(.856627153315983,.137318972929847,.11189821299995),Zi(.0951212405381588,.761241990602591,.0767994186031903),Zi(.0482516061458583,.101439036467562,.811302368396859)),i=un(Zi(1.1271005818144368,-.1413297634984383,-.14132976349843826),Zi(-.11060664309660323,1.157823702216272,-.11060664309660294),Zi(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=Hi(-12.47393),a=Hi(4.026069);return r.mulAssign(t),r.assign(fx.mul(r)),r.assign(s.mul(r)),r.assign(bo(r,1e-10)),r.assign(Ha(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Bo(r,0,1)),r.assign(yx(r)),r.assign(i.mul(r)),r.assign(Eo(bo(Zi(0),r),Zi(2.2))),r.assign(mx.mul(r)),r.assign(Bo(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),bx=Ui((([e,t])=>{const r=Hi(.76),s=Hi(.15);e=e.mul(t);const i=xo(e.r,xo(e.g,e.b)),n=jo(i.lessThan(.08),i.sub(oa(6.25,i.mul(i))),.04);e.subAssign(n);const a=bo(e.r,bo(e.g,e.b));Gi(a.lessThan(r),(()=>e));const o=aa(1,r),u=aa(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=aa(1,ua(1,s.mul(a.sub(u)).add(1)));return Fo(e,Zi(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Tx extends Hs{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 _x=Di(Tx).setParameterLength(1,3);class vx extends Tx{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 a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Nx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Sx extends Hs{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:Hi()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ls(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?Fs(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 wx=Di(Sx).setParameterLength(1);class Ex 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 Ax{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 Rx=new Ex;class Cx extends Hs{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Ex,this._output=wx(null),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]=wx(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]=wx(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 Ax(this),t=Rx.get("THREE"),r=Rx.get("TSL"),s=this.getMethod(),i=[e,this._local,Rx,()=>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:Hi()}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=[bs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ts(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 Mx=Di(Cx).setParameterLength(1,2);function Px(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ol.z).negate()}const Lx=Ui((([e,t],r)=>{const s=Px(r);return Vo(e,t,s)})),Fx=Ui((([e],t)=>{const r=Px(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Bx=Ui((([e,t])=>rn(t.toFloat().mix(Fn.rgb,e.toVec3()),Fn.a)));let Dx=null,Ix=null;class Vx extends Hs{static get type(){return"RangeNode"}constructor(e=Hi(),t=Hi()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Cs(this.minNode.value)),r=e.getTypeLength(Cs(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,a=e.getTypeLength(Cs(i)),o=e.getTypeLength(Cs(n));Dx=Dx||new s,Ix=Ix||new s,Dx.setScalar(0),Ix.setScalar(0),1===a?Dx.setScalar(i):i.isColor?Dx.set(i.r,i.g,i.b,1):Dx.set(i.x,i.y,i.z||0,i.w||0),1===o?Ix.setScalar(n):n.isColor?Ix.set(n.r,n.g,n.b,1):Ix.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;eLi(new Ox(e,t)),Gx=kx("numWorkgroups","uvec3"),zx=kx("workgroupId","uvec3"),$x=kx("globalId","uvec3"),Hx=kx("localId","uvec3"),Wx=kx("subgroupSize","uint");const jx=Di(class extends Hs{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 qx extends Ws{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 Xx extends Hs{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Li(new qx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Kx extends Hs{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(1===r.length&&!0===r[0].isStackNode))return void 0===t.constNode&&(t.constNode=Iu(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}Kx.ATOMIC_LOAD="atomicLoad",Kx.ATOMIC_STORE="atomicStore",Kx.ATOMIC_ADD="atomicAdd",Kx.ATOMIC_SUB="atomicSub",Kx.ATOMIC_MAX="atomicMax",Kx.ATOMIC_MIN="atomicMin",Kx.ATOMIC_AND="atomicAnd",Kx.ATOMIC_OR="atomicOr",Kx.ATOMIC_XOR="atomicXor";const Yx=Di(Kx),Qx=(e,t,r)=>Yx(e,t,r).toStack();let Zx;function Jx(e){Zx=Zx||new WeakMap;let t=Zx.get(e);return void 0===t&&Zx.set(e,t={}),t}function eb(e){const t=Jx(e);return t.shadowMatrix||(t.shadowMatrix=Yn("mat4").setGroup(qn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function tb(e,t=Vl){const r=eb(e).mul(t);return r.xyz.div(r.w)}function rb(e){const t=Jx(e);return t.position||(t.position=Yn(new r).setGroup(qn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function sb(e){const t=Jx(e);return t.targetPosition||(t.targetPosition=Yn(new r).setGroup(qn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function ib(e){const t=Jx(e);return t.viewPosition||(t.viewPosition=Yn(new r).setGroup(qn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const nb=e=>ll.transformDirection(rb(e).sub(sb(e))),ab=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},ob=new WeakMap;class ub extends Hs{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Zi().toVar(),this.totalSpecularNode=Zi().toVar(),this.outgoingLightNode=Zi().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Li(e));else{let s=null;if(null!==r&&(s=ab(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;ob.has(e)?s=ob.get(e):(s=Li(new r(e)),ob.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=Zi(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class lb extends Hs{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Is.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){db.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Vl)}dispose(){this.updateBeforeType=Is.NONE}}const db=pn("vec3","shadowPositionWorld");function cb(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 hb(e,t){return t=cb(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function pb(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 gb(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function mb(e,t){return t=gb(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function fb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function yb(e,t,r){return r=mb(t,r=hb(e,r))}function xb(e,t,r){pb(e,r),fb(t,r)}var bb=Object.freeze({__proto__:null,resetRendererAndSceneState:yb,resetRendererState:hb,resetSceneState:mb,restoreRendererAndSceneState:xb,restoreRendererState:pb,restoreSceneState:fb,saveRendererAndSceneState:function(e,t,r={}){return r=gb(t,r=cb(e,r))},saveRendererState:cb,saveSceneState:gb});const Tb=new WeakMap,_b=Ui((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Yu(e,t.xy).label("t_basic");return e.isDepthArrayTexture&&(s=s.depth(r)),s.compare(t.z)})),vb=Ui((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Yu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pd("mapSize","vec2",r).setGroup(qn),a=pd("radius","float",r).setGroup(qn),o=Xi(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return na(i(t.xy.add(Xi(u,l)),t.z),i(t.xy.add(Xi(0,l)),t.z),i(t.xy.add(Xi(d,l)),t.z),i(t.xy.add(Xi(h,p)),t.z),i(t.xy.add(Xi(0,p)),t.z),i(t.xy.add(Xi(g,p)),t.z),i(t.xy.add(Xi(u,0)),t.z),i(t.xy.add(Xi(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(Xi(g,0)),t.z),i(t.xy.add(Xi(d,0)),t.z),i(t.xy.add(Xi(h,m)),t.z),i(t.xy.add(Xi(0,m)),t.z),i(t.xy.add(Xi(g,m)),t.z),i(t.xy.add(Xi(u,c)),t.z),i(t.xy.add(Xi(0,c)),t.z),i(t.xy.add(Xi(d,c)),t.z)).mul(1/17)})),Nb=Ui((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Yu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pd("mapSize","vec2",r).setGroup(qn),a=Xi(1).div(n),o=a.x,u=a.y,l=t.xy,d=Ya(l.mul(n).add(.5));return l.subAssign(d.mul(a)),na(i(l,t.z),i(l.add(Xi(o,0)),t.z),i(l.add(Xi(0,u)),t.z),i(l.add(a),t.z),Fo(i(l.add(Xi(o.negate(),0)),t.z),i(l.add(Xi(o.mul(2),0)),t.z),d.x),Fo(i(l.add(Xi(o.negate(),u)),t.z),i(l.add(Xi(o.mul(2),u)),t.z),d.x),Fo(i(l.add(Xi(0,u.negate())),t.z),i(l.add(Xi(0,u.mul(2))),t.z),d.y),Fo(i(l.add(Xi(o,u.negate())),t.z),i(l.add(Xi(o,u.mul(2))),t.z),d.y),Fo(Fo(i(l.add(Xi(o.negate(),u.negate())),t.z),i(l.add(Xi(o.mul(2),u.negate())),t.z),d.x),Fo(i(l.add(Xi(o.negate(),u.mul(2))),t.z),i(l.add(Xi(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)})),Sb=Ui((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=Hi(1).toVar();let i=Yu(e).sample(t.xy);(e.isDepthArrayTexture||e.isDataArrayTexture)&&(i=i.depth(r)),i=i.rg;const n=To(t.z,i.x);return Gi(n.notEqual(Hi(1)),(()=>{const e=t.z.sub(i.x),r=bo(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Bo(aa(a,.3).div(.95-.3)),s.assign(Bo(bo(n,a)))})),s})),wb=Ui((([e,t,r])=>{let s=Vl.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Eb=e=>{let t=Tb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=pd("near","float",t).setGroup(qn),s=pd("far","float",t).setGroup(qn),i=yl(e);return wb(i,r,s)})(e):null;t=new Gh,t.colorNode=rn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,Tb.set(e,t)}return t},Ab=new Um,Rb=[],Cb=(e,t,r,s)=>{Rb[0]=e,Rb[1]=t;let i=Ab.get(Rb);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Ps(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,Ab.set(Rb,i)),Rb[0]=null,Rb[1]=null,i},Mb=Ui((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Hi(0).toVar("meanVertical"),a=Hi(0).toVar("squareMeanVertical"),o=e.lessThanEqual(Hi(1)).select(Hi(0),Hi(2).div(e.sub(1))),u=e.lessThanEqual(Hi(1)).select(Hi(0),Hi(-1));Xc({start:Wi(0),end:Wi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add(Hi(e).mul(o));let d=s.sample(na(ch.xy,Xi(0,l).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))})),n.divAssign(e),a.divAssign(e);const l=Wa(a.sub(n.mul(n)));return Xi(n,l)})),Pb=Ui((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=Hi(0).toVar("meanHorizontal"),a=Hi(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(Hi(1)).select(Hi(0),Hi(2).div(e.sub(1))),u=e.lessThanEqual(Hi(1)).select(Hi(0),Hi(-1));Xc({start:Wi(0),end:Wi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add(Hi(e).mul(o));let d=s.sample(na(ch.xy,Xi(l,0).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(na(d.y.mul(d.y),d.x.mul(d.x)))})),n.divAssign(e),a.divAssign(e);const l=Wa(a.sub(n.mul(n)));return Xi(n,l)})),Lb=[_b,vb,Nb,Sb];let Fb;const Bb=new xy;class Db extends lb{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._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=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,depthLayer:n});return a.select(o,Hi(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=pd("bias","float",r).setGroup(qn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=pd("near","float",r.camera).setGroup(qn),s=pd("far","float",r.camera).setGroup(qn);n=Mh(e.negate(),t,s)}return a=Zi(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return Lb[e]}setupRenderTarget(e,t){const r=new D(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Ve;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie){n.compareFunction=null,a.isRenderTargetArray?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}));let t=Yu(n);n.isDepthArrayTexture&&(t=t.depth(this.depthLayer));let r=Yu(this.vsmShadowMapVertical.texture);n.isDepthArrayTexture&&(r=r.depth(this.depthLayer));const i=pd("blurSamples","float",s).setGroup(qn),o=pd("radius","float",s).setGroup(qn),u=pd("mapSize","vec2",s).setGroup(qn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Gh);l.fragmentNode=Mb({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Gh),l.fragmentNode=Pb({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=pd("intensity","float",s).setGroup(qn),u=pd("normalBias","float",s).setGroup(qn),l=eb(r).mul(db.add(Yl.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===Ie?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=Yu(a.texture,d);n.isDepthArrayTexture&&(g=g.depth(this.depthLayer));const m=Fo(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return Ui((()=>{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,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");Fb=yb(i,n,Fb),n.overrideMaterial=Eb(r),i.setRenderObjectFunction(Cb(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),!0!==r.isPointLight&&o===Ie&&this.vsmPass(i),s.camera.layers.mask=l,xb(i,n,Fb)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),Bb.material=this.vsmMaterialVertical,Bb.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Bb.material=this.vsmMaterialHorizontal,Bb.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;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Ib=(e,t)=>Li(new Db(e,t)),Vb=new e,Ub=Ui((([e,t])=>{const r=e.toVar(),s=so(r),i=ua(1,bo(s.x,bo(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Xi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return Gi(s.z.greaterThanEqual(a),(()=>{Gi(r.z.greaterThan(0),(()=>{n.x.assign(aa(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=io(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{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))})),Xi(.125,.25).mul(n).add(Xi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Ob=Ui((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Yu(e,Ub(t,s.y)).compare(r))),kb=Ui((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=pd("radius","float",i).setGroup(qn),a=Xi(-1,1).mul(n).mul(s.y);return Yu(e,Ub(t.add(a.xyy),s.y)).compare(r).add(Yu(e,Ub(t.add(a.yyy),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.xyx),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.yyx),s.y)).compare(r)).add(Yu(e,Ub(t,s.y)).compare(r)).add(Yu(e,Ub(t.add(a.xxy),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.yxy),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.xxx),s.y)).compare(r)).add(Yu(e,Ub(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),Gb=Ui((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Yn("float").setGroup(qn).onRenderUpdate((()=>s.camera.near)),o=Yn("float").setGroup(qn).onRenderUpdate((()=>s.camera.far)),u=pd("bias","float",s).setGroup(qn),l=Yn(s.mapSize).setGroup(qn),d=Hi(1).toVar();return Gi(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=Xi(1).div(l.mul(Xi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),zb=new s,$b=new t,Hb=new t;class Wb extends Db{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Oe?Ob:kb}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,a=t.getFrameExtents();Hb.copy(t.mapSize),Hb.multiply(a),r.setSize(Hb.width,Hb.height),$b.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Vb),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eLi(new Wb(e,t));class qb extends th{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Yn(this.color).setGroup(qn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Is.FRAME}customCacheKey(){return _s(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return ib(this.light).sub(e.context.positionView||Ol)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return Ib(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Li(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),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);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Xb=Ui((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Kb=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Xb({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Yb extends qb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Yn(0).setGroup(qn),this.decayExponentNode=Yn(2).setGroup(qn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return jb(this.light)}setupDirect(e){return Kb({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const Qb=Ui((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),Zb=Ui((([e=Hu()],{renderer:t,material:r})=>{const s=Hi(1).toVar(),i=Lo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=Hi(i.fwidth()).toVar();s.assign(Vo(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),Jb=Ui((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=qi(e).toVar();return jo(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),eT=Ui((([e,t])=>{const r=qi(t).toVar(),s=Hi(e).toVar();return jo(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),tT=Ui((([e])=>{const t=Hi(e).toVar();return Wi(qa(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),rT=Ui((([e,t])=>{const r=Hi(e).toVar();return t.assign(tT(r)),r.sub(Hi(t))})),sT=Gf([Ui((([e,t,r,s,i,n])=>{const a=Hi(n).toVar(),o=Hi(i).toVar(),u=Hi(s).toVar(),l=Hi(r).toVar(),d=Hi(t).toVar(),c=Hi(e).toVar(),h=Hi(aa(1,o)).toVar();return aa(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]}),Ui((([e,t,r,s,i,n])=>{const a=Hi(n).toVar(),o=Hi(i).toVar(),u=Zi(s).toVar(),l=Zi(r).toVar(),d=Zi(t).toVar(),c=Zi(e).toVar(),h=Hi(aa(1,o)).toVar();return aa(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]})]),iT=Gf([Ui((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Hi(d).toVar(),h=Hi(l).toVar(),p=Hi(u).toVar(),g=Hi(o).toVar(),m=Hi(a).toVar(),f=Hi(n).toVar(),y=Hi(i).toVar(),x=Hi(s).toVar(),b=Hi(r).toVar(),T=Hi(t).toVar(),_=Hi(e).toVar(),v=Hi(aa(1,p)).toVar(),N=Hi(aa(1,h)).toVar();return Hi(aa(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),Ui((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=Hi(d).toVar(),h=Hi(l).toVar(),p=Hi(u).toVar(),g=Zi(o).toVar(),m=Zi(a).toVar(),f=Zi(n).toVar(),y=Zi(i).toVar(),x=Zi(s).toVar(),b=Zi(r).toVar(),T=Zi(t).toVar(),_=Zi(e).toVar(),v=Hi(aa(1,p)).toVar(),N=Hi(aa(1,h)).toVar();return Hi(aa(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),nT=Ui((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=ji(e).toVar(),a=ji(n.bitAnd(ji(7))).toVar(),o=Hi(Jb(a.lessThan(ji(4)),i,s)).toVar(),u=Hi(oa(2,Jb(a.lessThan(ji(4)),s,i))).toVar();return eT(o,qi(a.bitAnd(ji(1)))).add(eT(u,qi(a.bitAnd(ji(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),aT=Ui((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Hi(t).toVar(),o=ji(e).toVar(),u=ji(o.bitAnd(ji(15))).toVar(),l=Hi(Jb(u.lessThan(ji(8)),a,n)).toVar(),d=Hi(Jb(u.lessThan(ji(4)),n,Jb(u.equal(ji(12)).or(u.equal(ji(14))),a,i))).toVar();return eT(l,qi(u.bitAnd(ji(1)))).add(eT(d,qi(u.bitAnd(ji(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"}]}),oT=Gf([nT,aT]),uT=Ui((([e,t,r])=>{const s=Hi(r).toVar(),i=Hi(t).toVar(),n=en(e).toVar();return Zi(oT(n.x,i,s),oT(n.y,i,s),oT(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"}]}),lT=Ui((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Hi(t).toVar(),o=en(e).toVar();return Zi(oT(o.x,a,n,i),oT(o.y,a,n,i),oT(o.z,a,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"}]}),dT=Gf([uT,lT]),cT=Ui((([e])=>{const t=Hi(e).toVar();return oa(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),hT=Ui((([e])=>{const t=Hi(e).toVar();return oa(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),pT=Gf([cT,Ui((([e])=>{const t=Zi(e).toVar();return oa(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),gT=Gf([hT,Ui((([e])=>{const t=Zi(e).toVar();return oa(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),mT=Ui((([e,t])=>{const r=Wi(t).toVar(),s=ji(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(Wi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),fT=Ui((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(mT(r,Wi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(mT(e,Wi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(mT(t,Wi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(mT(r,Wi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(mT(e,Wi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(mT(t,Wi(4))),t.addAssign(e)})),yT=Ui((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=ji(e).toVar();return s.bitXorAssign(i),s.subAssign(mT(i,Wi(14))),n.bitXorAssign(s),n.subAssign(mT(s,Wi(11))),i.bitXorAssign(n),i.subAssign(mT(n,Wi(25))),s.bitXorAssign(i),s.subAssign(mT(i,Wi(16))),n.bitXorAssign(s),n.subAssign(mT(s,Wi(4))),i.bitXorAssign(n),i.subAssign(mT(n,Wi(14))),s.bitXorAssign(i),s.subAssign(mT(i,Wi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),xT=Ui((([e])=>{const t=ji(e).toVar();return Hi(t).div(Hi(ji(Wi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),bT=Ui((([e])=>{const t=Hi(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"}]}),TT=Gf([Ui((([e])=>{const t=Wi(e).toVar(),r=ji(ji(1)).toVar(),s=ji(ji(Wi(3735928559)).add(r.shiftLeft(ji(2))).add(ji(13))).toVar();return yT(s.add(ji(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),Ui((([e,t])=>{const r=Wi(t).toVar(),s=Wi(e).toVar(),i=ji(ji(2)).toVar(),n=ji().toVar(),a=ji().toVar(),o=ji().toVar();return n.assign(a.assign(o.assign(ji(Wi(3735928559)).add(i.shiftLeft(ji(2))).add(ji(13))))),n.addAssign(ji(s)),a.addAssign(ji(r)),yT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar(),a=ji(ji(3)).toVar(),o=ji().toVar(),u=ji().toVar(),l=ji().toVar();return o.assign(u.assign(l.assign(ji(Wi(3735928559)).add(a.shiftLeft(ji(2))).add(ji(13))))),o.addAssign(ji(n)),u.addAssign(ji(i)),l.addAssign(ji(s)),yT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),Ui((([e,t,r,s])=>{const i=Wi(s).toVar(),n=Wi(r).toVar(),a=Wi(t).toVar(),o=Wi(e).toVar(),u=ji(ji(4)).toVar(),l=ji().toVar(),d=ji().toVar(),c=ji().toVar();return l.assign(d.assign(c.assign(ji(Wi(3735928559)).add(u.shiftLeft(ji(2))).add(ji(13))))),l.addAssign(ji(o)),d.addAssign(ji(a)),c.addAssign(ji(n)),fT(l,d,c),l.addAssign(ji(i)),yT(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"}]}),Ui((([e,t,r,s,i])=>{const n=Wi(i).toVar(),a=Wi(s).toVar(),o=Wi(r).toVar(),u=Wi(t).toVar(),l=Wi(e).toVar(),d=ji(ji(5)).toVar(),c=ji().toVar(),h=ji().toVar(),p=ji().toVar();return c.assign(h.assign(p.assign(ji(Wi(3735928559)).add(d.shiftLeft(ji(2))).add(ji(13))))),c.addAssign(ji(l)),h.addAssign(ji(u)),p.addAssign(ji(o)),fT(c,h,p),c.addAssign(ji(a)),h.addAssign(ji(n)),yT(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"}]})]),_T=Gf([Ui((([e,t])=>{const r=Wi(t).toVar(),s=Wi(e).toVar(),i=ji(TT(s,r)).toVar(),n=en().toVar();return n.x.assign(i.bitAnd(Wi(255))),n.y.assign(i.shiftRight(Wi(8)).bitAnd(Wi(255))),n.z.assign(i.shiftRight(Wi(16)).bitAnd(Wi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Wi(t).toVar(),n=Wi(e).toVar(),a=ji(TT(n,i,s)).toVar(),o=en().toVar();return o.x.assign(a.bitAnd(Wi(255))),o.y.assign(a.shiftRight(Wi(8)).bitAnd(Wi(255))),o.z.assign(a.shiftRight(Wi(16)).bitAnd(Wi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),vT=Gf([Ui((([e])=>{const t=Xi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=Hi(rT(t.x,r)).toVar(),n=Hi(rT(t.y,s)).toVar(),a=Hi(bT(i)).toVar(),o=Hi(bT(n)).toVar(),u=Hi(sT(oT(TT(r,s),i,n),oT(TT(r.add(Wi(1)),s),i.sub(1),n),oT(TT(r,s.add(Wi(1))),i,n.sub(1)),oT(TT(r.add(Wi(1)),s.add(Wi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return pT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=Wi().toVar(),n=Hi(rT(t.x,r)).toVar(),a=Hi(rT(t.y,s)).toVar(),o=Hi(rT(t.z,i)).toVar(),u=Hi(bT(n)).toVar(),l=Hi(bT(a)).toVar(),d=Hi(bT(o)).toVar(),c=Hi(iT(oT(TT(r,s,i),n,a,o),oT(TT(r.add(Wi(1)),s,i),n.sub(1),a,o),oT(TT(r,s.add(Wi(1)),i),n,a.sub(1),o),oT(TT(r.add(Wi(1)),s.add(Wi(1)),i),n.sub(1),a.sub(1),o),oT(TT(r,s,i.add(Wi(1))),n,a,o.sub(1)),oT(TT(r.add(Wi(1)),s,i.add(Wi(1))),n.sub(1),a,o.sub(1)),oT(TT(r,s.add(Wi(1)),i.add(Wi(1))),n,a.sub(1),o.sub(1)),oT(TT(r.add(Wi(1)),s.add(Wi(1)),i.add(Wi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return gT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),NT=Gf([Ui((([e])=>{const t=Xi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=Hi(rT(t.x,r)).toVar(),n=Hi(rT(t.y,s)).toVar(),a=Hi(bT(i)).toVar(),o=Hi(bT(n)).toVar(),u=Zi(sT(dT(_T(r,s),i,n),dT(_T(r.add(Wi(1)),s),i.sub(1),n),dT(_T(r,s.add(Wi(1))),i,n.sub(1)),dT(_T(r.add(Wi(1)),s.add(Wi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return pT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi().toVar(),s=Wi().toVar(),i=Wi().toVar(),n=Hi(rT(t.x,r)).toVar(),a=Hi(rT(t.y,s)).toVar(),o=Hi(rT(t.z,i)).toVar(),u=Hi(bT(n)).toVar(),l=Hi(bT(a)).toVar(),d=Hi(bT(o)).toVar(),c=Zi(iT(dT(_T(r,s,i),n,a,o),dT(_T(r.add(Wi(1)),s,i),n.sub(1),a,o),dT(_T(r,s.add(Wi(1)),i),n,a.sub(1),o),dT(_T(r.add(Wi(1)),s.add(Wi(1)),i),n.sub(1),a.sub(1),o),dT(_T(r,s,i.add(Wi(1))),n,a,o.sub(1)),dT(_T(r.add(Wi(1)),s,i.add(Wi(1))),n.sub(1),a,o.sub(1)),dT(_T(r,s.add(Wi(1)),i.add(Wi(1))),n,a.sub(1),o.sub(1)),dT(_T(r.add(Wi(1)),s.add(Wi(1)),i.add(Wi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return gT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),ST=Gf([Ui((([e])=>{const t=Hi(e).toVar(),r=Wi(tT(t)).toVar();return xT(TT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),Ui((([e])=>{const t=Xi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar();return xT(TT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar();return xT(TT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),Ui((([e])=>{const t=rn(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar(),n=Wi(tT(t.w)).toVar();return xT(TT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),wT=Gf([Ui((([e])=>{const t=Hi(e).toVar(),r=Wi(tT(t)).toVar();return Zi(xT(TT(r,Wi(0))),xT(TT(r,Wi(1))),xT(TT(r,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),Ui((([e])=>{const t=Xi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar();return Zi(xT(TT(r,s,Wi(0))),xT(TT(r,s,Wi(1))),xT(TT(r,s,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),Ui((([e])=>{const t=Zi(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar();return Zi(xT(TT(r,s,i,Wi(0))),xT(TT(r,s,i,Wi(1))),xT(TT(r,s,i,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),Ui((([e])=>{const t=rn(e).toVar(),r=Wi(tT(t.x)).toVar(),s=Wi(tT(t.y)).toVar(),i=Wi(tT(t.z)).toVar(),n=Wi(tT(t.w)).toVar();return Zi(xT(TT(r,s,i,n,Wi(0))),xT(TT(r,s,i,n,Wi(1))),xT(TT(r,s,i,n,Wi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),ET=Ui((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar(),u=Hi(0).toVar(),l=Hi(1).toVar();return Xc(a,(()=>{u.addAssign(l.mul(vT(o))),l.mulAssign(i),o.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"}]}),AT=Ui((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar(),u=Zi(0).toVar(),l=Hi(1).toVar();return Xc(a,(()=>{u.addAssign(l.mul(NT(o))),l.mulAssign(i),o.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"}]}),RT=Ui((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar();return Xi(ET(o,a,n,i),ET(o.add(Zi(Wi(19),Wi(193),Wi(17))),a,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"}]}),CT=Ui((([e,t,r,s])=>{const i=Hi(s).toVar(),n=Hi(r).toVar(),a=Wi(t).toVar(),o=Zi(e).toVar(),u=Zi(AT(o,a,n,i)).toVar(),l=Hi(ET(o.add(Zi(Wi(19),Wi(193),Wi(17))),a,n,i)).toVar();return rn(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"}]}),MT=Gf([Ui((([e,t,r,s,i,n,a])=>{const o=Wi(a).toVar(),u=Hi(n).toVar(),l=Wi(i).toVar(),d=Wi(s).toVar(),c=Wi(r).toVar(),h=Wi(t).toVar(),p=Xi(e).toVar(),g=Zi(wT(Xi(h.add(d),c.add(l)))).toVar(),m=Xi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Xi(Xi(Hi(h),Hi(c)).add(m)).toVar(),y=Xi(f.sub(p)).toVar();return Gi(o.equal(Wi(2)),(()=>so(y.x).add(so(y.y)))),Gi(o.equal(Wi(3)),(()=>bo(so(y.x),so(y.y)))),So(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"}]}),Ui((([e,t,r,s,i,n,a,o,u])=>{const l=Wi(u).toVar(),d=Hi(o).toVar(),c=Wi(a).toVar(),h=Wi(n).toVar(),p=Wi(i).toVar(),g=Wi(s).toVar(),m=Wi(r).toVar(),f=Wi(t).toVar(),y=Zi(e).toVar(),x=Zi(wT(Zi(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=Zi(Zi(Hi(f),Hi(m),Hi(g)).add(x)).toVar(),T=Zi(b.sub(y)).toVar();return Gi(l.equal(Wi(2)),(()=>so(T.x).add(so(T.y)).add(so(T.z)))),Gi(l.equal(Wi(3)),(()=>bo(bo(so(T.x),so(T.y)),so(T.z)))),So(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"}]})]),PT=Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Hi(t).toVar(),n=Xi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Xi(rT(n.x,a),rT(n.y,o)).toVar(),l=Hi(1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{const r=Hi(MT(u,e,t,a,o,i,s)).toVar();l.assign(xo(l,r))}))})),Gi(s.equal(Wi(0)),(()=>{l.assign(Wa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),LT=Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Hi(t).toVar(),n=Xi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Xi(rT(n.x,a),rT(n.y,o)).toVar(),l=Xi(1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{const r=Hi(MT(u,e,t,a,o,i,s)).toVar();Gi(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),Gi(s.equal(Wi(0)),(()=>{l.assign(Wa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),FT=Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Hi(t).toVar(),n=Xi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Xi(rT(n.x,a),rT(n.y,o)).toVar(),l=Zi(1e6,1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{const r=Hi(MT(u,e,t,a,o,i,s)).toVar();Gi(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)}))}))})),Gi(s.equal(Wi(0)),(()=>{l.assign(Wa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),BT=Gf([PT,Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Hi(t).toVar(),n=Zi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Zi(rT(n.x,a),rT(n.y,o),rT(n.z,u)).toVar(),d=Hi(1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{Xc({start:-1,end:Wi(1),name:"z",condition:"<="},(({z:r})=>{const n=Hi(MT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(xo(d,n))}))}))})),Gi(s.equal(Wi(0)),(()=>{d.assign(Wa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),DT=Gf([LT,Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Hi(t).toVar(),n=Zi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Zi(rT(n.x,a),rT(n.y,o),rT(n.z,u)).toVar(),d=Xi(1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{Xc({start:-1,end:Wi(1),name:"z",condition:"<="},(({z:r})=>{const n=Hi(MT(l,e,t,r,a,o,u,i,s)).toVar();Gi(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),Gi(s.equal(Wi(0)),(()=>{d.assign(Wa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),IT=Gf([FT,Ui((([e,t,r])=>{const s=Wi(r).toVar(),i=Hi(t).toVar(),n=Zi(e).toVar(),a=Wi().toVar(),o=Wi().toVar(),u=Wi().toVar(),l=Zi(rT(n.x,a),rT(n.y,o),rT(n.z,u)).toVar(),d=Zi(1e6,1e6,1e6).toVar();return Xc({start:-1,end:Wi(1),name:"x",condition:"<="},(({x:e})=>{Xc({start:-1,end:Wi(1),name:"y",condition:"<="},(({y:t})=>{Xc({start:-1,end:Wi(1),name:"z",condition:"<="},(({z:r})=>{const n=Hi(MT(l,e,t,r,a,o,u,i,s)).toVar();Gi(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)}))}))}))})),Gi(s.equal(Wi(0)),(()=>{d.assign(Wa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),VT=Ui((([e])=>{const t=e.y,r=e.z,s=Zi().toVar();return Gi(t.lessThan(1e-4),(()=>{s.assign(Zi(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(qa(i)).mul(6).toVar();const n=Wi(po(i)),a=i.sub(Hi(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());Gi(n.equal(Wi(0)),(()=>{s.assign(Zi(r,l,o))})).ElseIf(n.equal(Wi(1)),(()=>{s.assign(Zi(u,r,o))})).ElseIf(n.equal(Wi(2)),(()=>{s.assign(Zi(o,r,l))})).ElseIf(n.equal(Wi(3)),(()=>{s.assign(Zi(o,u,r))})).ElseIf(n.equal(Wi(4)),(()=>{s.assign(Zi(l,o,r))})).Else((()=>{s.assign(Zi(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),UT=Ui((([e])=>{const t=Zi(e).toVar(),r=Hi(t.x).toVar(),s=Hi(t.y).toVar(),i=Hi(t.z).toVar(),n=Hi(xo(r,xo(s,i))).toVar(),a=Hi(bo(r,bo(s,i))).toVar(),o=Hi(a.sub(n)).toVar(),u=Hi().toVar(),l=Hi().toVar(),d=Hi().toVar();return d.assign(a),Gi(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),Gi(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{Gi(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(na(2,i.sub(r).div(o)))})).Else((()=>{u.assign(na(4,r.sub(s).div(o)))})),u.mulAssign(1/6),Gi(u.lessThan(0),(()=>{u.addAssign(1)}))})),Zi(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),OT=Ui((([e])=>{const t=Zi(e).toVar(),r=tn(pa(t,Zi(.04045))).toVar(),s=Zi(t.div(12.92)).toVar(),i=Zi(Eo(bo(t.add(Zi(.055)),Zi(0)).div(1.055),Zi(2.4))).toVar();return Fo(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),kT=(e,t)=>{e=Hi(e),t=Hi(t);const r=Xi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Vo(e.sub(r),e.add(r),t)},GT=(e,t,r,s)=>Fo(e,t,r[s].clamp()),zT=(e,t,r,s,i)=>Fo(e,t,kT(r,s[i])),$T=Ui((([e,t,r])=>{const s=Ka(e).toVar(),i=aa(Hi(.5).mul(t.sub(r)),Vl).div(s).toVar(),n=aa(Hi(-.5).mul(t.sub(r)),Vl).div(s).toVar(),a=Zi().toVar();a.x=s.x.greaterThan(Hi(0)).select(i.x,n.x),a.y=s.y.greaterThan(Hi(0)).select(i.y,n.y),a.z=s.z.greaterThan(Hi(0)).select(i.z,n.z);const o=xo(xo(a.x,a.y),a.z).toVar();return Vl.add(s.mul(o)).toVar().sub(r)})),HT=Ui((([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(oa(r,r).sub(oa(s,s)))),n}));var WT=Object.freeze({__proto__:null,BRDF_GGX:Mp,BRDF_Lambert:mp,BasicPointShadowFilter:Ob,BasicShadowFilter:_b,Break:Kc,Const:eu,Continue:()=>Iu("continue").toStack(),DFGApprox:Pp,D_GGX:Ap,Discard:Vu,EPSILON:Fa,F_Schlick:gp,Fn:Ui,INFINITY:Ba,If:Gi,Loop:Xc,NodeAccess:Us,NodeShaderStage:Ds,NodeType:Vs,NodeUpdateType:Is,PCFShadowFilter:vb,PCFSoftShadowFilter:Nb,PI:Da,PI2:Ia,PointShadowFilter:kb,Return:()=>Iu("return").toStack(),Schlick_to_F0:Fp,ScriptableNodeResources:Rx,ShaderNode:Pi,Stack:zi,Switch:(...e)=>si.Switch(...e),TBNViewMatrix:Md,VSMShadowFilter:Sb,V_GGX_SmithCorrelated:wp,Var:Jo,abs:so,acesFilmicToneMapping:gx,acos:to,add:na,addMethodChaining:ni,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:xx,all:Va,alphaT:En,and:fa,anisotropy:An,anisotropyB:Cn,anisotropyT:Rn,any:Ua,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),zi(e)),array:Zn,arrayBuffer:e=>Li(new ti(e,"ArrayBuffer")),asin:eo,assign:ea,atan:ro,atan2:zo,atomicAdd:(e,t)=>Qx(Kx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Qx(Kx.ATOMIC_AND,e,t),atomicFunc:Qx,atomicLoad:e=>Qx(Kx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Qx(Kx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Qx(Kx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Qx(Kx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Qx(Kx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Qx(Kx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Qx(Kx.ATOMIC_XOR,e,t),attenuationColor:Gn,attenuationDistance:kn,attribute:$u,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new Ey(e,r,s);return $c(i,t,e)},backgroundBlurriness:Ly,backgroundIntensity:Fy,backgroundRotation:By,batch:Oc,billboarding:qf,bitAnd:Ta,bitNot:_a,bitOr:va,bitXor:Na,bitangentGeometry:Sd,bitangentLocal:wd,bitangentView:Ed,bitangentWorld:Ad,bitcast:fo,blendBurn:jy,blendColor:Yy,blendDodge:qy,blendOverlay:Ky,blendScreen:Xy,blur:Lg,bool:qi,buffer:Ju,bufferAttribute:vu,bumpMap:Od,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),jy(e)),bvec2:Qi,bvec3:tn,bvec4:an,bypass:Pu,cache:Cu,call:ra,cameraFar:al,cameraIndex:il,cameraNear:nl,cameraNormalMatrix:cl,cameraPosition:hl,cameraProjectionMatrix:ol,cameraProjectionMatrixInverse:ul,cameraViewMatrix:ll,cameraWorldMatrix:dl,cbrt:Po,cdl:rx,ceil:Xa,checker:Qb,cineonToneMapping:hx,clamp:Bo,clearcoat:bn,clearcoatRoughness:Tn,code:_x,color:$i,colorSpaceToWorking:pu,colorToDirection:e=>Li(e).mul(2).sub(1),compute:Au,computeSkinning:(e,t=null)=>{const r=new Wc(e);return r.positionNode=$c(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Cc).toVar(),r.skinIndexNode=$c(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Cc).toVar(),r.skinWeightNode=$c(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Cc).toVar(),r.bindMatrixNode=Yn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Yn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ju(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Li(r)},cond:qo,context:Ko,convert:cn,convertColorSpace:(e,t,r)=>Li(new lu(Li(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():_y(e,...t),cos:Za,cross:wo,cubeTexture:dd,cubeToUV:Ub,dFdx:uo,dFdy:lo,dashSize:Bn,debug:Gu,decrement:Ca,decrementBefore:Aa,defaultBuildStages:ks,defaultShaderStages:Os,defined:Ci,degrees:ka,deltaTime:$f,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Bx(e,Fx(t))},densityFogFactor:Fx,depth:Lh,depthPass:(e,t,r)=>Li(new ux(ux.DEPTH,e,t,r)),difference:No,diffuseColor:mn,directPointLight:Kb,directionToColor:Qh,dispersion:zn,distance:vo,div:ua,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),qy(e)),dot:So,drawIndex:Fc,dynamicBufferAttribute:Nu,element:dn,emissive:fn,equal:da,equals:yo,equirectUV:tp,exp:Ga,exp2:za,expression:Iu,faceDirection:$l,faceForward:Uo,faceforward:$o,float:Hi,floor:qa,fog:Bx,fract:Ya,frameGroup:jn,frameId:Hf,frontFacing:zl,fwidth:go,gain:(e,t)=>e.lessThan(.5)?Df(e.mul(2),t).div(2):aa(1,Df(oa(aa(1,e),2),t).div(2)),gapSize:Dn,getConstNodeType:Mi,getCurrentStack:ki,getDirection:Rg,getDistanceAttenuation:Xb,getGeometryRoughness:Np,getNormalFromDepth:Sy,getParallaxCorrectNormal:$T,getRoughness:Sp,getScreenPosition:Ny,getShIrradianceAt:HT,getShadowMaterial:Eb,getShadowRenderObjectFunction:Cb,getTextureIndex:Pf,getViewPosition:vy,globalId:$x,glsl:(e,t)=>_x(e,t,"glsl"),glslFn:(e,t)=>Nx(e,t,"glsl"),grayscale:Qy,greaterThan:pa,greaterThanEqual:ma,hash:Bf,highpModelNormalViewMatrix:Fl,highpModelViewMatrix:Ll,hue:ex,increment:Ra,incrementBefore:Ea,instance:Dc,instanceIndex:Cc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=As("float")):(r=Rs(t),s=As(t));const i=new wy(e,r,s);return $c(i,t,e)},instancedBufferAttribute:Su,instancedDynamicBufferAttribute:wu,instancedMesh:Vc,int:Wi,inverseSqrt:ja,inversesqrt:Ho,invocationLocalIndex:Lc,invocationSubgroupIndex:Pc,ior:Vn,iridescence:Nn,iridescenceIOR:Sn,iridescenceThickness:wn,ivec2:Ki,ivec3:Ji,ivec4:sn,js:(e,t)=>_x(e,t,"js"),label:Yo,length:no,lengthSq:Lo,lessThan:ha,lessThanEqual:ga,lightPosition:rb,lightProjectionUV:tb,lightShadowMatrix:eb,lightTargetDirection:nb,lightTargetPosition:sb,lightViewPosition:ib,lightingContext:ih,lights:(e=[])=>Li(new ub).setLights(e),linearDepth:Fh,linearToneMapping:dx,localId:Hx,log:$a,log2:Ha,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul($a(r.div(t)));return Hi(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),Xc(...e)),luminance:tx,mat2:on,mat3:un,mat4:ln,matcapUV:Tm,materialAO:Sc,materialAlphaTest:zd,materialAnisotropy:oc,materialAnisotropyVector:wc,materialAttenuationColor:mc,materialAttenuationDistance:gc,materialClearcoat:tc,materialClearcoatNormal:sc,materialClearcoatRoughness:rc,materialColor:$d,materialDispersion:vc,materialEmissive:Wd,materialEnvIntensity:sd,materialEnvRotation:id,materialIOR:pc,materialIridescence:uc,materialIridescenceIOR:lc,materialIridescenceThickness:dc,materialLightMap:Nc,materialLineDashOffset:Tc,materialLineDashSize:yc,materialLineGapSize:xc,materialLineScale:fc,materialLineWidth:bc,materialMetalness:Jd,materialNormal:ec,materialOpacity:jd,materialPointSize:_c,materialReference:fd,materialReflectivity:Qd,materialRefractionRatio:rd,materialRotation:ic,materialRoughness:Zd,materialSheen:nc,materialSheenRoughness:ac,materialShininess:Hd,materialSpecular:qd,materialSpecularColor:Kd,materialSpecularIntensity:Xd,materialSpecularStrength:Yd,materialThickness:hc,materialTransmission:cc,max:bo,maxMipLevel:Xu,mediumpModelViewMatrix:Pl,metalness:xn,min:xo,mix:Fo,mixElement:ko,mod:la,modInt:Pa,modelDirection:vl,modelNormalMatrix:Rl,modelPosition:Sl,modelRadius:Al,modelScale:wl,modelViewMatrix:Ml,modelViewPosition:El,modelViewProjection:Ec,modelWorldMatrix:Nl,modelWorldMatrixInverse:Cl,morphReference:eh,mrt:Ff,mul:oa,mx_aastep:kT,mx_cell_noise_float:(e=Hu())=>ST(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>Hi(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=Hu(),t=3,r=2,s=.5,i=1)=>ET(e,Wi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Hu(),t=3,r=2,s=.5,i=1)=>RT(e,Wi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Hu(),t=3,r=2,s=.5,i=1)=>AT(e,Wi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Hu(),t=3,r=2,s=.5,i=1)=>CT(e,Wi(t),r,s).mul(i),mx_hsvtorgb:VT,mx_noise_float:(e=Hu(),t=1,r=0)=>vT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Hu(),t=1,r=0)=>NT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Hu(),t=1,r=0)=>{e=e.convert("vec2|vec3");return rn(NT(e),vT(e.add(Xi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=Hu())=>GT(e,t,r,"x"),mx_ramptb:(e,t,r=Hu())=>GT(e,t,r,"y"),mx_rgbtohsv:UT,mx_safepower:(e,t=1)=>(e=Hi(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=Hu())=>zT(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Hu())=>zT(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:OT,mx_transform_uv:(e=1,t=0,r=Hu())=>r.mul(e).add(t),mx_worley_noise_float:(e=Hu(),t=1)=>BT(e.convert("vec2|vec3"),t,Wi(1)),mx_worley_noise_vec2:(e=Hu(),t=1)=>DT(e.convert("vec2|vec3"),t,Wi(1)),mx_worley_noise_vec3:(e=Hu(),t=1)=>IT(e.convert("vec2|vec3"),t,Wi(1)),negate:ao,neutralToneMapping:bx,nodeArray:Bi,nodeImmutable:Ii,nodeObject:Li,nodeObjects:Fi,nodeProxy:Di,normalFlat:jl,normalGeometry:Hl,normalLocal:Wl,normalMap:Dd,normalView:ql,normalWorld:Xl,normalize:Ka,not:xa,notEqual:ca,numWorkgroups:Gx,objectDirection:ml,objectGroup:Xn,objectPosition:yl,objectRadius:Tl,objectScale:xl,objectViewPosition:bl,objectWorldMatrix:fl,oneMinus:oo,or:ya,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=zf)=>e.fract(),oscSine:(e=zf)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=zf)=>e.fract().round(),oscTriangle:(e=zf)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Fn,outputStruct:Mf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Ky(e)),overloadingFn:Gf,parabola:Df,parallaxDirection:Pd,parallaxUV:(e,t)=>e.sub(Pd.mul(t)),parameter:(e,t)=>Li(new Sf(e,t)),pass:(e,t,r)=>Li(new ux(ux.COLOR,e,t,r)),passTexture:(e,t)=>Li(new ax(e,t)),pcurve:(e,t,r)=>Eo(ua(Eo(e,t),na(Eo(e,t),Eo(aa(1,e),r))),1/t),perspectiveDepthToViewZ:Ch,pmremTexture:im,pointShadow:jb,pointUV:Ry,pointWidth:In,positionGeometry:Bl,positionLocal:Dl,positionPrevious:Il,positionView:Ol,positionViewDirection:kl,positionWorld:Vl,positionWorldDirection:Ul,posterize:ix,pow:Eo,pow2:Ao,pow3:Ro,pow4:Co,property:pn,radians:Oa,rand:Oo,range:Ux,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Bx(e,Lx(t,r))},rangeFogFactor:Lx,reciprocal:ho,reference:pd,referenceBuffer:gd,reflect:_o,reflectVector:od,reflectView:nd,reflector:e=>Li(new py(e)),refract:Io,refractVector:ud,refractView:ad,reinhardToneMapping:cx,remainder:Ma,remap:Fu,remapClamp:Bu,renderGroup:qn,renderOutput:Ou,rendererReference:yu,rotate:Sm,rotateUV:Wf,roughness:yn,round:co,rtt:_y,sRGBTransferEOTF:nu,sRGBTransferOETF:au,sampler:e=>(!0===e.isNode?e:Yu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Yu(e)).convert("samplerComparison"),saturate:Do,saturation:Zy,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Xy(e)),screenCoordinate:ch,screenSize:dh,screenUV:lh,scriptable:Mx,scriptableValue:wx,select:jo,setCurrentStack:Oi,shaderStages:Gs,shadow:Ib,shadowPositionWorld:db,shapeCircle:Zb,sharedUniformGroup:Wn,sheen:_n,sheenRoughness:vn,shiftLeft:Sa,shiftRight:wa,shininess:Ln,sign:io,sin:Qa,sinc:(e,t)=>Qa(Da.mul(t.mul(e).sub(1))).div(Da.mul(t.mul(e).sub(1))),skinning:jc,smoothstep:Vo,smoothstepElement:Go,specularColor:Mn,specularF90:Pn,spherizeUV:jf,split:(e,t)=>Li(new Ys(Li(e),t)),spritesheetUV:Yf,sqrt:Wa,stack:Ef,step:To,storage:$c,storageBarrier:()=>jx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),$c(e,t,r).setPBO(!0)),storageTexture:Iy,string:(e="")=>Li(new ti(e,"string")),struct:(e,t=null)=>{const r=new Af(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;ejx("texture").toStack(),textureBicubic:Zp,textureCubeUV:Cg,textureLoad:Qu,textureSize:ju,textureStore:(e,t,r)=>{const s=Iy(e,t,r);return null!==r&&s.toStack(),s},thickness:On,time:zf,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),$f.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),zf.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),zf.mul(e)),toOutputColorSpace:du,toWorkingColorSpace:cu,toneMapping:bu,toneMappingExposure:Tu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Li(new lx(t,r,Li(s),Li(i),Li(n))),transformDirection:Mo,transformNormal:Zl,transformNormalToView:Jl,transformedBentNormalView:Ld,transformedBitangentView:Rd,transformedBitangentWorld:Cd,transformedClearcoatNormalView:Ql,transformedNormalView:Kl,transformedNormalWorld:Yl,transformedTangentView:_d,transformedTangentWorld:vd,transmission:Un,transpose:mo,triNoise3D:Uf,triplanarTexture:(...e)=>Zf(...e),triplanarTextures:Zf,trunc:po,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),Ui(...e)),uint:ji,uniform:Yn,uniformArray:rl,uniformGroup:Hn,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Li(new tl(e,t))),userData:(e,t,r)=>Li(new ky(e,t,r)),uv:Hu,uvec2:Yi,uvec3:en,uvec4:nn,varying:su,varyingProperty:gn,vec2:Xi,vec3:Zi,vec4:rn,vectorComponents:zs,velocity:Wy,vertexColor:kh,vertexIndex:Rc,vertexStage:iu,vibrance:Jy,viewZToLogarithmicDepth:Mh,viewZToOrthographicDepth:Ah,viewZToPerspectiveDepth:Rh,viewport:hh,viewportBottomLeft:xh,viewportCoordinate:gh,viewportDepthTexture:wh,viewportLinearDepth:Bh,viewportMipTexture:vh,viewportResolution:fh,viewportSafeUV:Xf,viewportSharedTexture:Xh,viewportSize:ph,viewportTexture:_h,viewportTopLeft:yh,viewportUV:mh,wgsl:(e,t)=>_x(e,t,"wgsl"),wgslFn:(e,t)=>Nx(e,t,"wgsl"),workgroupArray:(e,t)=>Li(new Xx("Workgroup",e,t)),workgroupBarrier:()=>jx("workgroup").toStack(),workgroupId:zx,workingToColorSpace:hu,xor:ba});const jT=new Nf;class qT extends $m{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(jT),jT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(jT),jT.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;jT.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=Ko(rn(u).mul(Fy),{getUV:()=>By.mul(Xl),getTextureLevel:()=>Ly});let h=Ec;h=h.setZ(h.w);const p=new Gh;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=N,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new W(new ke(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=rn(u).mul(Fy),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?jT.set(0,0,0,1):"alpha-blend"===a&&jT.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=jT.r,m.g=jT.g,m.b=jT.b,m.a=jT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.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 XT=0;class KT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=XT++}}class YT{constructor(e,t,r,s,i,n,a,o,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=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new KT(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 QT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class ZT{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 JT{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class e_ extends JT{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class t_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let r_=0;class s_{constructor(e=null){this.id=r_++,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 i_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class n_{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 a_ extends n_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class o_ extends n_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class u_ extends n_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class l_ extends n_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class d_ extends n_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class c_ extends n_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class h_ extends n_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class p_ extends n_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class g_ extends a_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class m_ extends o_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class f_ extends u_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class y_ extends l_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class x_ extends d_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class b_ extends c_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class T_ extends h_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class __ extends p_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const v_=new WeakMap,N_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),S_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class w_{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.observer=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.declarations={},this.flow={code:""},this.chaining=[],this.stack=Ef(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new s_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=v_.get(this.renderer);return void 0===e&&(e=new Um,v_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createRenderTargetArray(e,t,r,s){return new Ge(e,t,r,s)}createCubeRenderTarget(e,t){return new rp(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_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 KT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new KT(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 Gs)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")}( ${S_(n.r)}, ${S_(n.g)}, ${S_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>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 QT(e,t);return this.registerDeclaration(s),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||"samplerComparison"===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===T)return"int";if(t===b)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;let r=Es(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return N_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}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 He||!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=Ef(this.stack),this.stacks.push(ki()||this.stack),Oi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Oi(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 QT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new i_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}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 a=this.uniforms.index++;n=new ZT(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new JT(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any");let a=n.varying;if(void 0===a){const e=this.varyings,o=e.length;null===t&&(t="nodeVarying"+o),a=new e_(t,r,s,i),e.push(a),this.registerDeclaration(a),n.varying=a}return a}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}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 t_("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}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new vx,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 Sf(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.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new s_,this.stack=Ef();for(const r of ks)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}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,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):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 Gh),e.build(this)}else this.addFlow("compute",e);for(const e of ks){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of Gs){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 g_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new m_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new f_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new y_(e);if("color"===t)return new x_(e);if("mat2"===t)return new b_(e);if("mat3"===t)return new T_(e);if("mat4"===t)return new __(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?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,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${We} - Node System\n`}*[Symbol.iterator](){}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class E_{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===Is.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===Is.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===Is.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Is.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===Is.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===Is.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Is.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===Is.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===Is.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 A_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}A_.isNodeFunctionInput=!0;class R_ extends qb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:nb(this.light),lightColor:e}}}const C_=new a,M_=new a;let P_=null;class L_ extends qb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Yn(new r).setGroup(qn),this.halfWidth=Yn(new r).setGroup(qn),this.updateType=Is.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;M_.identity(),C_.copy(t.matrixWorld),C_.premultiply(r),M_.extractRotation(C_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(M_),this.halfHeight.value.applyMatrix4(M_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Yu(P_.LTC_FLOAT_1),r=Yu(P_.LTC_FLOAT_2)):(t=Yu(P_.LTC_HALF_1),r=Yu(P_.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:ib(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){P_=e}}class F_ extends qb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Yn(0).setGroup(qn),this.penumbraCosNode=Yn(0).setGroup(qn),this.cutoffDistanceNode=Yn(0).setGroup(qn),this.decayExponentNode=Yn(0).setGroup(qn)}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 Vo(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(nb(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Xb({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=tb(i,e.context.positionWorld),r=Yu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class B_ extends F_{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=Yu(t,Xi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class D_ extends qb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class I_ extends qb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=rb(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Yn(new e).setGroup(qn)}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=ql.dot(s).mul(.5).add(.5),n=Fo(r,t,i);e.context.irradiance.addAssign(n)}}class V_ extends qb{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=rl(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=HT(Xl,this.lightProbe);e.context.irradiance.addAssign(t)}}class U_{parseFunction(){console.warn("Abstract function.")}}class O_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}O_.isNodeFunction=!0;const k_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,G_=/[a-z_0-9]+/gi,z_="#pragma main";class $_ extends O_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(z_),r=-1!==t?e.slice(t+12):e,s=r.match(k_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=G_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return im(r);{let e;return e=!0===r.isCubeTexture?dd(r):Yu(r),op(e)}}if(!0===r.isTexture)return Yu(r,lh.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=pd("color","color",r).setGroup(qn),t=pd("density","float",r).setGroup(qn);return Bx(e,Fx(t))}if(r.isFog){const e=pd("color","color",r).setGroup(qn),t=pd("near","float",r).setGroup(qn),s=pd("far","float",r).setGroup(qn);return Bx(e,Lx(t,s))}console.error("THREE.Renderer: 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){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?dd(r):!0===r.isTexture?Yu(r):void 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+","+e.xr.isPresenting}hasOutputChange(e){return W_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isTextureArray?Oy(e,Zi(lh,sl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Yu(e,lh).renderOutput(t.toneMapping,t.currentColorSpace);return W_.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 E_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const K_=new Pe;class Y_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new iv(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Me,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;uv(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function hv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function pv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);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,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,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 X_(this,r),this._animation=new Vm(this._nodes,this.info),this._attributes=new Km(r),this._background=new qT(this,this._nodes),this._geometries=new Zm(this._attributes,this.info),this._textures=new vf(this,r,this.info),this._pipelines=new af(r,this._nodes),this._bindings=new of(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new zm(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new pf(this.lighting),this._bundles=new J_,this._renderContexts=new Tf,this._animation.start(),this._initialized=!0,e(this)}))),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,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:gv;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 Y_),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._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=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=Ll,this.overrideNodes.modelNormalViewMatrix=Fl):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===Ll&&this.overrideNodes.modelNormalViewMatrix===Fl}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_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,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),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=T,p.viewport=!1===p.viewportValue.equals(fv),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(fv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Y_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?xv:yv;t.isArrayCamera||(bv.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(bv,g));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.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=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:w,transparent:E,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&E.length>0&&this._renderTransparents(E,w,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}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.xr&&this.xr.isPresenting||(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.xr&&this.xr.isPresenting||(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 a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.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);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}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)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}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(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.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}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}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,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(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){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=Tv.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=Tv.copy(t).floor()}else t=Tv.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,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;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){const n=t.isArrayCamera?xv:yv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&Tv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(bv);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,Tv.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){const n=t.isArrayCamera?xv:yv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),Tv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(bv)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Xe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Xe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class vv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class Nv extends vv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Xm-e%Xm)%Xm;var e}get buffer(){return this._buffer}update(){return!0}}class Sv extends Nv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let wv=0;class Ev extends Sv{constructor(e,t){super("UniformBuffer_"+wv++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Av extends Sv{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?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 a=i.node.precision;if(null!==a&&(t=Iv[a]+" "+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!==T){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=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${Uv[s.interpolationType]||s.interpolationType} ${Ov[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${Uv[e.interpolationType]||e.interpolationType} ${Ov[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*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=Vv[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)}Vv[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} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}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 a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new Lv(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new Fv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Bv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new Ev(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new Cv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let zv=null,$v=null;class Hv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void mt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void mt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return zv=zv||new t,this.renderer.getDrawingBufferSize(zv)}setScissorTest(){}getClearColor(){const e=this.renderer;return $v=$v||new Nf,e.getClearColor($v),$v.getRGB($v),$v}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:ft(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${We} 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 Wv,jv,qv=0;class Xv{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 Kv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.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===T,id:qv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Xv(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),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.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 Zv,Jv,eN,tN=!1;class rN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===tN&&(this._init(),tN=!0)}_init(){const e=this.gl;Zv={[wr]:e.REPEAT,[Sr]:e.CLAMP_TO_EDGE,[Nr]:e.MIRRORED_REPEAT},Jv={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[$e]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[ze]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},eN={[Fr]:e.NEVER,[Lr]:e.ALWAYS,[Ve]:e.LESS,[Pr]:e.LEQUAL,[Mr]:e.EQUAL,[Cr]:e.GEQUAL,[Rr]:e.GREATER,[Ar]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDepthArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture||!0===e.isTextureArray?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:a}=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 o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}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,Zv[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,Zv[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||!0!==t.isDepthArrayTexture&&!1===t.isTextureArray&&r.texParameteri(e,r.TEXTURE_WRAP_R,Zv[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,Jv[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,Jv[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,eN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==$e&&t.minFilter!==B)return;if(t.type===L&&!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:a,depth:o}=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.isDepthArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture||e.isTextureArray?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),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:a,glType:o}=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,a,o,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:a,glFormat:o,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(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;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-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+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,a,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,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.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 sN{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 iN{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 nN={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",OVR_multiview2:"OVR_multiview2"};class aN{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:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class lN extends Hv{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new sN(this),this.capabilities=new iN(this),this.attributeUtils=new Kv(this),this.textureUtils=new rN(this),this.bufferRenderer=new aN(this),this.state=new Yv(this),this.utils=new Qv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e.autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new uN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(mt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):mt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,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"),a=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"+a)}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:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),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,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;enN[t]===e)),r=this.extensions;for(let e=0;e0&&!1===x&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const dN="point-list",cN="line-list",hN="line-strip",pN="triangle-list",gN="triangle-strip",mN="never",fN="less",yN="equal",xN="less-equal",bN="greater",TN="not-equal",_N="greater-equal",vN="always",NN="store",SN="load",wN="clear",EN="ccw",AN="none",RN="front",CN="back",MN="uint16",PN="uint32",LN="r8unorm",FN="r8snorm",BN="r8uint",DN="r8sint",IN="r16uint",VN="r16sint",UN="r16float",ON="rg8unorm",kN="rg8snorm",GN="rg8uint",zN="rg8sint",$N="r32uint",HN="r32sint",WN="r32float",jN="rg16uint",qN="rg16sint",XN="rg16float",KN="rgba8unorm",YN="rgba8unorm-srgb",QN="rgba8snorm",ZN="rgba8uint",JN="rgba8sint",eS="bgra8unorm",tS="bgra8unorm-srgb",rS="rgb9e5ufloat",sS="rgb10a2unorm",iS="rgb10a2unorm",nS="rg32uint",aS="rg32sint",oS="rg32float",uS="rgba16uint",lS="rgba16sint",dS="rgba16float",cS="rgba32uint",hS="rgba32sint",pS="rgba32float",gS="depth16unorm",mS="depth24plus",fS="depth24plus-stencil8",yS="depth32float",xS="depth32float-stencil8",bS="bc1-rgba-unorm",TS="bc1-rgba-unorm-srgb",_S="bc2-rgba-unorm",vS="bc2-rgba-unorm-srgb",NS="bc3-rgba-unorm",SS="bc3-rgba-unorm-srgb",wS="bc4-r-unorm",ES="bc4-r-snorm",AS="bc5-rg-unorm",RS="bc5-rg-snorm",CS="bc6h-rgb-ufloat",MS="bc6h-rgb-float",PS="bc7-rgba-unorm",LS="bc7-rgba-srgb",FS="etc2-rgb8unorm",BS="etc2-rgb8unorm-srgb",DS="etc2-rgb8a1unorm",IS="etc2-rgb8a1unorm-srgb",VS="etc2-rgba8unorm",US="etc2-rgba8unorm-srgb",OS="eac-r11unorm",kS="eac-r11snorm",GS="eac-rg11unorm",zS="eac-rg11snorm",$S="astc-4x4-unorm",HS="astc-4x4-unorm-srgb",WS="astc-5x4-unorm",jS="astc-5x4-unorm-srgb",qS="astc-5x5-unorm",XS="astc-5x5-unorm-srgb",KS="astc-6x5-unorm",YS="astc-6x5-unorm-srgb",QS="astc-6x6-unorm",ZS="astc-6x6-unorm-srgb",JS="astc-8x5-unorm",ew="astc-8x5-unorm-srgb",tw="astc-8x6-unorm",rw="astc-8x6-unorm-srgb",sw="astc-8x8-unorm",iw="astc-8x8-unorm-srgb",nw="astc-10x5-unorm",aw="astc-10x5-unorm-srgb",ow="astc-10x6-unorm",uw="astc-10x6-unorm-srgb",lw="astc-10x8-unorm",dw="astc-10x8-unorm-srgb",cw="astc-10x10-unorm",hw="astc-10x10-unorm-srgb",pw="astc-12x10-unorm",gw="astc-12x10-unorm-srgb",mw="astc-12x12-unorm",fw="astc-12x12-unorm-srgb",yw="clamp-to-edge",xw="repeat",bw="mirror-repeat",Tw="linear",_w="nearest",vw="zero",Nw="one",Sw="src",ww="one-minus-src",Ew="src-alpha",Aw="one-minus-src-alpha",Rw="dst",Cw="one-minus-dst",Mw="dst-alpha",Pw="one-minus-dst-alpha",Lw="src-alpha-saturated",Fw="constant",Bw="one-minus-constant",Dw="add",Iw="subtract",Vw="reverse-subtract",Uw="min",Ow="max",kw=0,Gw=15,zw="keep",$w="zero",Hw="replace",Ww="invert",jw="increment-clamp",qw="decrement-clamp",Xw="increment-wrap",Kw="decrement-wrap",Yw="storage",Qw="read-only-storage",Zw="write-only",Jw="read-only",eE="read-write",tE="non-filtering",rE="comparison",sE="float",iE="unfilterable-float",nE="depth",aE="sint",oE="uint",uE="2d",lE="3d",dE="2d",cE="2d-array",hE="cube",pE="3d",gE="all",mE="vertex",fE="instance",yE={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class xE extends vv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class bE extends xE{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class TE extends Nv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let _E=0;class vE extends TE{constructor(e,t){super("StorageBuffer_"+_E++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Us.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class NE extends $m{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:Tw}),this.flipYSampler=e.createSampler({minFilter:_w}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\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:gN,stripIndexFormat:PN},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:gN,stripIndexFormat:PN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=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:dE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:dE,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:wN,storeOp:NN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,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:dE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,CE=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,ME={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_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"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 PE extends O_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(RE);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=CE.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 LE extends U_{parseFunction(e){return new PE(e)}}const FE="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},BE={[Us.READ_ONLY]:"read",[Us.WRITE_ONLY]:"write",[Us.READ_WRITE]:"read_write"},DE={[wr]:"repeat",[Sr]:"clamp",[Nr]:"mirror"},IE={vertex:FE?FE.VERTEX:1,fragment:FE?FE.FRAGMENT:2,compute:FE?FE.COMPUTE:4},VE={instance:!0,swizzleAssign:!1,storageBuffer:!0},UE={"^^":"tsl_xor"},OE={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"},kE={},GE={tsl_xor:new Tx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Tx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Tx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Tx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Tx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Tx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Tx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Tx("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 Tx("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 Tx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Tx("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 Tx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Tx("\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")},zE={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)&&(GE.pow_float=new Tx("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),GE.pow_vec2=new Tx("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 ) ); }",[GE.pow_float]),GE.pow_vec3=new Tx("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 ) ); }",[GE.pow_float]),GE.pow_vec4=new Tx("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 ) ); }",[GE.pow_float]),zE.pow_float="tsl_pow_float",zE.pow_vec2="tsl_pow_vec2",zE.pow_vec3="tsl_pow_vec3",zE.pow_vec4="tsl_pow_vec4");let $E="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&($E+="diagnostic( off, derivative_uniformity );\n");class HE extends w_{constructor(e,t){super(e,t,new LE),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_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_${DE[e.wrapS]}S_${DE[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=kE[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===wr?(s.push(GE.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Sr?(s.push(GE.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Nr?(s.push(GE.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",kE[t]=r=new Tx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${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,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Qo(new Du(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isDepthArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Qo(new Du(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Qo(new Du("6u","u32")))}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=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return!0===e.isVideoTexture||!0===e.isStorageTexture?n=`textureLoad( ${t}, ${r} )`:s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}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===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||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 e.isDepthArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`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 a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}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?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=UE[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?Us.READ_ONLY:e.access}getStorageAccess(e,t){return BE[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 a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new Lv(i.name,i.node,o,n):"cubeTexture"===t?s=new Fv(i.name,i.node,o,n):"texture3D"===t&&(s=new Bv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(IE[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new bE(`${i.name}_sampler`,i.node,o);e.setVisibility(IE[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?Ev:vE)(e,o);n.setVisibility(IE[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new Cv(u,o),s.setVisibility(IE[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}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","globalId","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"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}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,e.count)};`);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;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;"fragment"!==e&&"compute"!==e||!1!==this.isUnfilterable(t)||!0===i.node.isStorageTextureNode||(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture||!0===t.isTextureArray)s="texture_2d_array";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isDepthArrayTexture?"_array":""}`;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<${AE(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.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 a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;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],a=n.outputNode,o=void 0!==a&&!0===a.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`),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(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",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;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,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 OE[e]||e}isAvailable(e){let t=VE[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),VE[e]=t),t}_getWGSLMethod(e){return void 0!==GE[e]&&this._include(e),zE[e]}_include(e){const t=GE[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// structs\n${e.structs}\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${$E}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\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// structs\n${e.structs}\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 = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.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 WE{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=fS:e.depth&&(t=mS),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?dN:e.isLineSegments||e.isMesh&&!0===t.wireframe?cN:e.isLine?hN:e.isMesh?pN: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(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Me)return eS;if(e===he)return dS;throw new Error("Unsupported outputType")}}const jE=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),qE=new Map([[He,["float16"]]]),XE=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class KE{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 a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=iE)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=iE:s.sampleType=nE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=aE:e===b?s.sampleType=oE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=sE:s.sampleType=iE)}r.isSampledCubeTexture?s.viewDimension=hE:r.texture.isDataArrayTexture||r.texture.isDepthArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=cE:r.isSampledTexture3D&&(s.viewDimension=pE),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,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.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)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}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 a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=gE;let n;n=t.isSampledCubeTexture?hE:t.isSampledTexture3D?pE:t.texture.isDataArrayTexture||t.texture.isDepthArrayTexture||t.texture.isCompressedArrayTexture?cE:dE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class QE{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:a,fragmentProgram:o}=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;s.blending===k||s.blending===V&&!1===s.transparent||(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})},w={},E=e.context.depth,A=e.context.stencil;if(!0!==E&&!0!==A||(!0===E&&(w.format=v,w.depthWriteEnabled=s.depthWrite,w.depthCompare=_),!0===A&&(w.stencilFront=m,w.stencilBack={},w.stencilReadMask=s.stencilFuncMask,w.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(w.depthBias=s.polygonOffsetUnits,w.depthBiasSlopeScale=s.polygonOffsetFactor,w.depthBiasClamp=0),S.depthStencil=w),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,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===Ke){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:Dw},r={srcFactor:i,dstFactor:n,operation:Dw}};if(e.premultipliedAlpha)switch(s){case V:i(Nw,Aw,Nw,Aw);break;case Bt:i(Nw,Nw,Nw,Nw);break;case Ft:i(vw,ww,vw,Nw);break;case Lt:i(vw,Sw,vw,Ew)}else switch(s){case V:i(Ew,Aw,Nw,Aw);break;case Bt:i(Ew,Nw,Ew,Nw);break;case Ft:i(vw,ww,vw,Nw);break;case Lt:i(vw,Sw,vw,Sw)}}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 Qe:t=vw;break;case Rt:t=Nw;break;case At:t=Sw;break;case vt:t=ww;break;case Et:t=Ew;break;case _t:t=Aw;break;case St:t=Rw;break;case Tt:t=Cw;break;case Nt:t=Mw;break;case bt:t=Pw;break;case wt:t=Lw;break;case 211:t=Fw;break;case 212:t=Bw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case Gr:t=mN;break;case kr:t=vN;break;case Or:t=fN;break;case Ur:t=xN;break;case Vr:t=yN;break;case Ir:t=_N;break;case Dr:t=bN;break;case Br:t=TN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Kr:t=zw;break;case Xr:t=$w;break;case qr:t=Hw;break;case jr:t=Ww;break;case Wr:t=jw;break;case Hr:t=qw;break;case $r:t=Xw;break;case zr:t=Kw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Ye:t=Dw;break;case xt:t=Iw;break;case yt:t=Vw;break;case Qr:t=Uw;break;case Yr:t=Ow;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?MN:PN),r.side){case Xe:s.frontFace=EN,s.cullMode=CN;break;case N:s.frontFace=EN,s.cullMode=RN;break;case Se:s.frontFace=EN,s.cullMode=AN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?Gw:kw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=vN;else{const r=e.depthFunc;switch(r){case zt:t=mN;break;case Gt:t=vN;break;case kt:t=fN;break;case Ot:t=xN;break;case Ut:t=yN;break;case Vt:t=_N;break;case It:t=bN;break;case Dt:t=TN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class ZE extends oN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class JE extends Hv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new WE(this),this.attributeUtils=new KE(this),this.bindingUtils=new YE(this),this.pipelineUtils=new QE(this),this.textureUtils=new EE(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,featureLevel:t.compatibilityMode?"compatibility":void 0},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(yE),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}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(yE.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 d}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}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.isDepthArrayTexture&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s0&&(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,{loadOp:SN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=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();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){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.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{t.setPipeline(u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&mt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new lN(e)));super(new t(e),e),this.library=new tA,this.isWebGPURenderer=!0}}class sA extends cs{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class iA{constructor(e,t=rn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Gh;r.name="PostProcessing",this._quadMesh=new xy(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Ou(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class nA extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class aA extends Ey{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class oA extends hs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new ps(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),Hi()):Li(new this.nodes[e])}}class uA extends gs{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 lA extends ms{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 oA;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 uA;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.overrideNodes.modelViewMatrix||null!==e.renderer.overrideNodes.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 a=i.geometry,o=s.attributes,u=a.attributes,l=Object.keys(u),d=Object.keys(o);if(a.id!==s.id)return a.id=s.id,!1;if(l.length!==d.length)return i.geometry.attributes=this.getAttributesData(o),!1;for(const e of l){const t=u[e],r=o[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=a.indexVersion,p=c?c.version:null;if(h!==p)return a.indexVersion=p,!1;if(a.drawRange.start!==s.drawRange.start||a.drawRange.count!==s.drawRange.count)return a.drawRange.start=s.drawRange.start,a.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 _s=e=>Ts(e),vs=e=>Ts(e),Ns=(...e)=>Ts(e);function Ss(e,t=!1){const r=[];!0===e.isNode&&(r.push(e.id),e=e.getSelf());for(const{property:s,childNode:i}of ws(e))r.push(Ts(s.slice(0,-4)),i.getCacheKey(t));return Ts(r)}function*ws(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 Is=Object.freeze({__proto__:null,arrayBufferToBase64:Bs,base64ToArrayBuffer:Ds,getCacheKey:Ss,getDataFromObject:Fs,getLengthFromType:Ms,getNodeChildren:ws,getTypeFromLength:Rs,getTypedArrayFromType:Cs,getValueFromType:Ls,getValueType:Ps,hash:Ns,hashArray:vs,hashString:_s});const Vs={VERTEX:"vertex",FRAGMENT:"fragment"},Us={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Os={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ks={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},Gs=["fragment","vertex"],zs=["setup","analyze","generate"],$s=[...Gs,"compute"],Hs=["x","y","z","w"];let Ws=0;class js extends o{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Us.NONE,this.updateBeforeType=Us.NONE,this.updateAfterType=Us.NONE,this.uuid=u.generateUUID(),this.version=0,this.global=!1,this.parents=!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,Us.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Us.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Us.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 ws(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=Ns(Ss(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)}getMemberType(){return"void"}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 t.outputNode||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){t.initialized=!0;const r=this.setup(e),s=r&&!0===r.isNode;for(const r of Object.values(t))if(r&&!0===r.isNode){if(!0===r.parents){const t=e.getNodeProperties(r);t.parents=t.parents||[],t.parents.push(this)}r.build(e)}s&&r.build(e),t.outputNode=r}s=t.outputNode||null}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?void 0===i.generated?(i.generated=!0,s=this.generate(e)||"",i.snippet=s):(console.warn("THREE.Node: Recursion detected.",this),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 ws(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 qs extends js{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){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class Xs extends js{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 Ks extends js{static get type(){return"TempNode"}constructor(e=null){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),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class Ys extends Ks{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=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let o=0;for(const t of i){if(o>=s){console.error(`THREE.TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,u=t.getNodeType(e),l=e.getTypeLength(u);o+l>s&&(console.error(`THREE.TSL: Length of '${r}()' data exceeds maximum length of output type.`),l=s-o,u=e.getTypeFromLength(l)),o+=l,i=t.build(e,u);const d=e.getComponentType(u);d!==n&&(i=e.format(i,d,n)),a.push(i)}const u=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(u,r,t)}}const Qs=Hs.join("");class Zs extends js{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(Hs.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 a=r.build(e,n);i=this.components.length===s&&this.components===Qs.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${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 Js extends Ks{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)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),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"),li=e=>ui(e).split("").sort().join(""),di={setup(e,t){const r=t.shift();return e(Di(r),...t)},get(e,t,r){if("string"==typeof t&&void 0===e[t]){if(!0!==e.isStackNode&&"assign"===t)return(...e)=>(ni.assign(r,...e),r);if(ai.has(t)){const s=ai.get(t);return e.isStackNode?(...e)=>r.add(s(...e)):(...e)=>s(r,...e)}if("self"===t)return e;if(t.endsWith("Assign")&&ai.has(t.slice(0,t.length-6))){const s=ai.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=ui(t),Bi(new Zs(r,t));if(!0===/^set[XYZWRGBASTPQ]{1,4}$/.test(t))return t=li(t.slice(3).toLowerCase()),r=>Bi(new Js(e,t,r));if(!0===/^flip[XYZWRGBASTPQ]{1,4}$/.test(t))return t=li(t.slice(4).toLowerCase()),()=>Bi(new ei(Bi(e),t));if("width"===t||"height"===t||"depth"===t)return"width"===t?t="x":"height"===t?t="y":"depth"===t&&(t="z"),Bi(new Zs(e,t));if(!0===/^\d+$/.test(t))return Bi(new qs(r,new si(Number(t),"uint")));if(!0===/^get$/.test(t))return e=>Bi(new ii(r,e))}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)},ci=new WeakMap,hi=new WeakMap,pi=function(e,t=null){for(const r in e)e[r]=Bi(e[r],t);return e},gi=function(e,t=null){const r=e.length;for(let s=0;sBi(null!==s?Object.assign(e,s):e);let n,a,o,u=t;function l(t){let r;return r=u?/[a-z]/i.test(u)?u+"()":u:e.type,void 0!==a&&t.lengtho?(console.error(`THREE.TSL: "${r}" parameter length exceeds limit.`),t.slice(0,o)):t}return null===t?n=(...t)=>i(new e(...Ii(l(t)))):null!==r?(r=Bi(r),n=(...s)=>i(new e(t,...Ii(l(s)),r))):n=(...r)=>i(new e(t,...Ii(l(r)))),n.setParameterLength=(...e)=>(1===e.length?a=o=e[0]:2===e.length&&([a,o]=e),n),n.setName=e=>(u=e,n),n},fi=function(e,...t){return Bi(new e(...Ii(t)))};class yi extends js{constructor(e,t){super(),this.shaderNode=e,this.inputNodes=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}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=hi.get(e.constructor);void 0===s&&(s=new WeakMap,hi.set(e.constructor,s));let n=s.get(t);void 0===n&&(n=Bi(e.buildFunctionNode(t)),s.set(t,n)),e.addInclude(n),i=Bi(n.call(r))}else{const s=t.jsFunc,n=null!==r||s.length>1?s(r||[],e):s(e);i=Bi(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 xi extends js{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 Di(e),Bi(new yi(this,e))}setup(){return this.call()}}const bi=[!1,!0],Ti=[0,1,2,3],_i=[-1,-2],vi=[.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 bi)Ni.set(e,new si(e));const Si=new Map;for(const e of Ti)Si.set(e,new si(e,"uint"));const wi=new Map([...Si].map((e=>new si(e.value,"int"))));for(const e of _i)wi.set(e,new si(e,"int"));const Ei=new Map([...wi].map((e=>new si(e.value))));for(const e of vi)Ei.set(e,new si(e));for(const e of vi)Ei.set(-e,new si(-e));const Ai={bool:Ni,uint:Si,ints:wi,float:Ei},Ri=new Map([...Ni,...Ei]),Ci=(e,t)=>Ri.has(e)?Ri.get(e):!0===e.isNode?e:new si(e,t),Mi=function(e,t=null){return(...r)=>{if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every((e=>"object"!=typeof e)))&&(r=[Ls(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Bi(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?Bi(t):Bi(new Xs(t,e))}const s=r.map((e=>Ci(e)));return Bi(new Ys(s,e))}},Pi=e=>"object"==typeof e&&null!==e?e.value:e,Li=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Fi(e,t){return new Proxy(new xi(e,t),di)}const Bi=(e,t=null)=>function(e,t=null){const r=Ps(e);if("node"===r){let t=ci.get(e);return void 0===t&&(t=new Proxy(e,di),ci.set(e,t),ci.set(t,t)),t}return null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Bi(Ci(e,t)):"shader"===r?ki(e):e}(e,t),Di=(e,t=null)=>new pi(e,t),Ii=(e,t=null)=>new gi(e,t),Vi=(...e)=>new mi(...e),Ui=(...e)=>new fi(...e);let Oi=0;const ki=(e,t=null)=>{let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:console.error("THREE.TSL: Invalid layout type."),t=null));const s=new Fi(e,r),i=(...e)=>{let t;Di(e),t=e[0]&&e[0].isNode?[...e]:e[0];const i=s.call(t);return"void"===r&&i.toStack(),i};if(i.shaderNode=s,i.setLayout=e=>(s.setLayout(e),i),i.once=()=>(s.once=!0,i),null!==t){if("object"!=typeof t.inputs){const e={name:"fn"+Oi++,type:r,inputs:[]};for(const r in t)"return"!==r&&e.inputs.push({name:r,type:t[r]});t=e}i.setLayout(t)}return i};oi("toGlobal",(e=>(e.global=!0,e)));const Gi=e=>{ni=e},zi=()=>ni,$i=(...e)=>ni.If(...e);function Hi(e){return ni&&ni.add(e),e}oi("toStack",Hi);const Wi=new Mi("color"),ji=new Mi("float",Ai.float),qi=new Mi("int",Ai.ints),Xi=new Mi("uint",Ai.uint),Ki=new Mi("bool",Ai.bool),Yi=new Mi("vec2"),Qi=new Mi("ivec2"),Zi=new Mi("uvec2"),Ji=new Mi("bvec2"),en=new Mi("vec3"),tn=new Mi("ivec3"),rn=new Mi("uvec3"),sn=new Mi("bvec3"),nn=new Mi("vec4"),an=new Mi("ivec4"),on=new Mi("uvec4"),un=new Mi("bvec4"),ln=new Mi("mat2"),dn=new Mi("mat3"),cn=new Mi("mat4");oi("toColor",Wi),oi("toFloat",ji),oi("toInt",qi),oi("toUint",Xi),oi("toBool",Ki),oi("toVec2",Yi),oi("toIVec2",Qi),oi("toUVec2",Zi),oi("toBVec2",Ji),oi("toVec3",en),oi("toIVec3",tn),oi("toUVec3",rn),oi("toBVec3",sn),oi("toVec4",nn),oi("toIVec4",an),oi("toUVec4",on),oi("toBVec4",un),oi("toMat2",ln),oi("toMat3",dn),oi("toMat4",cn);const hn=Vi(qs).setParameterLength(2),pn=(e,t)=>Bi(new Xs(Bi(e),t));oi("element",hn),oi("convert",pn);oi("append",(e=>(console.warn("THREE.TSL: .append() has been renamed to .toStack()."),Hi(e))));class gn extends js{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 mn=(e,t)=>Bi(new gn(e,t)),fn=(e,t)=>Bi(new gn(e,t,!0)),yn=Ui(gn,"vec4","DiffuseColor"),xn=Ui(gn,"vec3","EmissiveColor"),bn=Ui(gn,"float","Roughness"),Tn=Ui(gn,"float","Metalness"),_n=Ui(gn,"float","Clearcoat"),vn=Ui(gn,"float","ClearcoatRoughness"),Nn=Ui(gn,"vec3","Sheen"),Sn=Ui(gn,"float","SheenRoughness"),wn=Ui(gn,"float","Iridescence"),En=Ui(gn,"float","IridescenceIOR"),An=Ui(gn,"float","IridescenceThickness"),Rn=Ui(gn,"float","AlphaT"),Cn=Ui(gn,"float","Anisotropy"),Mn=Ui(gn,"vec3","AnisotropyT"),Pn=Ui(gn,"vec3","AnisotropyB"),Ln=Ui(gn,"color","SpecularColor"),Fn=Ui(gn,"float","SpecularF90"),Bn=Ui(gn,"float","Shininess"),Dn=Ui(gn,"vec4","Output"),In=Ui(gn,"float","dashSize"),Vn=Ui(gn,"float","gapSize"),Un=Ui(gn,"float","pointWidth"),On=Ui(gn,"float","IOR"),kn=Ui(gn,"float","Transmission"),Gn=Ui(gn,"float","Thickness"),zn=Ui(gn,"float","AttenuationDistance"),$n=Ui(gn,"color","AttenuationColor"),Hn=Ui(gn,"float","Dispersion");class Wn extends js{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 jn=e=>new Wn(e),qn=(e,t=0)=>new Wn(e,!0,t),Xn=qn("frame"),Kn=qn("render"),Yn=jn("object");class Qn extends ti{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=Yn}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),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.label),o=e.getPropertyName(a);return void 0!==e.context.label&&delete e.context.label,e.format(o,r,t)}}const Zn=(e,t)=>{const r=Li(t||e),s=e&&!0===e.isNode?e.node&&e.node.value||e.value:e;return Bi(new Qn(s,r))};class Jn extends Ks{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getNodeType(e){return null===this.nodeType&&(this.nodeType=this.values[0].getNodeType(e)),this.nodeType}getElementType(e){return this.getNodeType(e)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const ea=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Jn(null,r.length,r)}else{const r=e[0],s=e[1];t=new Jn(r,s)}return Bi(t)};oi("toArray",((e,t)=>ea(Array(t).fill(e))));class ta extends Ks{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 Hs.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),a=r.context({assign:!0}).build(e),o=s.build(e,n),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=a);else if(i){const s=e.getVarFromNode(this,null,n),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,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)){if(i.length>s.length)console.error("THREE.TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?Ii(t):Di(t[0]),Bi(new sa(Bi(e),t)));oi("call",ia);const na={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class aa extends Ks{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new aa(e,t,r);for(let t=0;t>"===t||"<<"===t)return e.getIntegerType(i);if("!"===t||"&&"===t||"||"===t||"^^"===t)return"bool";if("=="===t||"!="===t||"<"===t||">"===t||"<="===t||">="===t){const t=Math.max(e.getTypeLength(i),e.getTypeLength(n));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(i)){if("float"===n)return i;if(e.isVector(n))return e.getVectorFromMatrix(i);if(e.isMatrix(n))return i}else if(e.isMatrix(n)){if("float"===i)return n;if(e.isVector(i))return e.getVectorFromMatrix(n)}return e.getTypeLength(n)>e.getTypeLength(i)?n:i}generate(e,t){const r=this.op,s=this.aNode,i=this.bNode,n=this.getNodeType(e);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=void 0!==i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),d=void 0!==i?i.build(e,o):null,c=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===l;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${d} )`,n,t):e.format(`( ${u} ${r} ${d} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${d} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${d} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(c)return e.format(`${c}( ${u}, ${d} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${d} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${d}`,n,t);{let i=`( ${u} ${r} ${d} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return c?e.format(`${c}( ${u}, ${d} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${d} ${r} ${u}`,n,t):e.format(`${u} ${r} ${d}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const oa=Vi(aa,"+").setParameterLength(2,1/0).setName("add"),ua=Vi(aa,"-").setParameterLength(2,1/0).setName("sub"),la=Vi(aa,"*").setParameterLength(2,1/0).setName("mul"),da=Vi(aa,"/").setParameterLength(2,1/0).setName("div"),ca=Vi(aa,"%").setParameterLength(2).setName("mod"),ha=Vi(aa,"==").setParameterLength(2).setName("equal"),pa=Vi(aa,"!=").setParameterLength(2).setName("notEqual"),ga=Vi(aa,"<").setParameterLength(2).setName("lessThan"),ma=Vi(aa,">").setParameterLength(2).setName("greaterThan"),fa=Vi(aa,"<=").setParameterLength(2).setName("lessThanEqual"),ya=Vi(aa,">=").setParameterLength(2).setName("greaterThanEqual"),xa=Vi(aa,"&&").setParameterLength(2,1/0).setName("and"),ba=Vi(aa,"||").setParameterLength(2,1/0).setName("or"),Ta=Vi(aa,"!").setParameterLength(1).setName("not"),_a=Vi(aa,"^^").setParameterLength(2).setName("xor"),va=Vi(aa,"&").setParameterLength(2).setName("bitAnd"),Na=Vi(aa,"~").setParameterLength(2).setName("bitNot"),Sa=Vi(aa,"|").setParameterLength(2).setName("bitOr"),wa=Vi(aa,"^").setParameterLength(2).setName("bitXor"),Ea=Vi(aa,"<<").setParameterLength(2).setName("shiftLeft"),Aa=Vi(aa,">>").setParameterLength(2).setName("shiftRight"),Ra=ki((([e])=>(e.addAssign(1),e))),Ca=ki((([e])=>(e.subAssign(1),e))),Ma=ki((([e])=>{const t=qi(e).toConst();return e.addAssign(1),t})),Pa=ki((([e])=>{const t=qi(e).toConst();return e.subAssign(1),t}));oi("add",oa),oi("sub",ua),oi("mul",la),oi("div",da),oi("mod",ca),oi("equal",ha),oi("notEqual",pa),oi("lessThan",ga),oi("greaterThan",ma),oi("lessThanEqual",fa),oi("greaterThanEqual",ya),oi("and",xa),oi("or",ba),oi("not",Ta),oi("xor",_a),oi("bitAnd",va),oi("bitNot",Na),oi("bitOr",Sa),oi("bitXor",wa),oi("shiftLeft",Ea),oi("shiftRight",Aa),oi("incrementBefore",Ra),oi("decrementBefore",Ca),oi("increment",Ma),oi("decrement",Pa);const La=(e,t)=>(console.warn('THREE.TSL: "remainder()" is deprecated. Use "mod( int( ... ) )" instead.'),ca(e,t)),Fa=(e,t)=>(console.warn('THREE.TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),ca(qi(e),qi(t)));oi("remainder",La),oi("modInt",Fa);class Ba extends Ks{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===Ba.MAX||e===Ba.MIN)&&arguments.length>3){let i=new Ba(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===Ba.LENGTH||t===Ba.DISTANCE||t===Ba.DOT?"float":t===Ba.CROSS?"vec3":t===Ba.ALL||t===Ba.ANY?"bool":t===Ba.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}generate(e,t){let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===Ba.TRANSFORM_DIRECTION){let r=n,s=a;e.isMatrix(r.getNodeType(e))?s=nn(en(s),0):r=nn(en(r),0);const i=la(r,s).xyz;return Qa(i).build(e,t)}if(r===Ba.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);if(r===Ba.ONE_MINUS)return ua(1,n).build(e,t);if(r===Ba.RECIPROCAL)return da(1,n).build(e,t);if(r===Ba.DIFFERENCE)return no(ua(n,a)).build(e,t);{const c=[];return r===Ba.CROSS?c.push(n.build(e,s),a.build(e,s)):u===l&&r===Ba.STEP?c.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==l||r!==Ba.MIN&&r!==Ba.MAX?r===Ba.REFRACT?c.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===Ba.MIX?c.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===d&&r===Ba.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==Ba.DFDX&&r!==Ba.DFDY||(console.warn(`THREE.TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),c.push(n.build(e,i)),null!==a&&c.push(a.build(e,i)),null!==o&&c.push(o.build(e,i))):c.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${c.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}Ba.ALL="all",Ba.ANY="any",Ba.RADIANS="radians",Ba.DEGREES="degrees",Ba.EXP="exp",Ba.EXP2="exp2",Ba.LOG="log",Ba.LOG2="log2",Ba.SQRT="sqrt",Ba.INVERSE_SQRT="inversesqrt",Ba.FLOOR="floor",Ba.CEIL="ceil",Ba.NORMALIZE="normalize",Ba.FRACT="fract",Ba.SIN="sin",Ba.COS="cos",Ba.TAN="tan",Ba.ASIN="asin",Ba.ACOS="acos",Ba.ATAN="atan",Ba.ABS="abs",Ba.SIGN="sign",Ba.LENGTH="length",Ba.NEGATE="negate",Ba.ONE_MINUS="oneMinus",Ba.DFDX="dFdx",Ba.DFDY="dFdy",Ba.ROUND="round",Ba.RECIPROCAL="reciprocal",Ba.TRUNC="trunc",Ba.FWIDTH="fwidth",Ba.TRANSPOSE="transpose",Ba.BITCAST="bitcast",Ba.EQUALS="equals",Ba.MIN="min",Ba.MAX="max",Ba.STEP="step",Ba.REFLECT="reflect",Ba.DISTANCE="distance",Ba.DIFFERENCE="difference",Ba.DOT="dot",Ba.CROSS="cross",Ba.POW="pow",Ba.TRANSFORM_DIRECTION="transformDirection",Ba.MIX="mix",Ba.CLAMP="clamp",Ba.REFRACT="refract",Ba.SMOOTHSTEP="smoothstep",Ba.FACEFORWARD="faceforward";const Da=ji(1e-6),Ia=ji(1e6),Va=ji(Math.PI),Ua=ji(2*Math.PI),Oa=Vi(Ba,Ba.ALL).setParameterLength(1),ka=Vi(Ba,Ba.ANY).setParameterLength(1),Ga=Vi(Ba,Ba.RADIANS).setParameterLength(1),za=Vi(Ba,Ba.DEGREES).setParameterLength(1),$a=Vi(Ba,Ba.EXP).setParameterLength(1),Ha=Vi(Ba,Ba.EXP2).setParameterLength(1),Wa=Vi(Ba,Ba.LOG).setParameterLength(1),ja=Vi(Ba,Ba.LOG2).setParameterLength(1),qa=Vi(Ba,Ba.SQRT).setParameterLength(1),Xa=Vi(Ba,Ba.INVERSE_SQRT).setParameterLength(1),Ka=Vi(Ba,Ba.FLOOR).setParameterLength(1),Ya=Vi(Ba,Ba.CEIL).setParameterLength(1),Qa=Vi(Ba,Ba.NORMALIZE).setParameterLength(1),Za=Vi(Ba,Ba.FRACT).setParameterLength(1),Ja=Vi(Ba,Ba.SIN).setParameterLength(1),eo=Vi(Ba,Ba.COS).setParameterLength(1),to=Vi(Ba,Ba.TAN).setParameterLength(1),ro=Vi(Ba,Ba.ASIN).setParameterLength(1),so=Vi(Ba,Ba.ACOS).setParameterLength(1),io=Vi(Ba,Ba.ATAN).setParameterLength(1,2),no=Vi(Ba,Ba.ABS).setParameterLength(1),ao=Vi(Ba,Ba.SIGN).setParameterLength(1),oo=Vi(Ba,Ba.LENGTH).setParameterLength(1),uo=Vi(Ba,Ba.NEGATE).setParameterLength(1),lo=Vi(Ba,Ba.ONE_MINUS).setParameterLength(1),co=Vi(Ba,Ba.DFDX).setParameterLength(1),ho=Vi(Ba,Ba.DFDY).setParameterLength(1),po=Vi(Ba,Ba.ROUND).setParameterLength(1),go=Vi(Ba,Ba.RECIPROCAL).setParameterLength(1),mo=Vi(Ba,Ba.TRUNC).setParameterLength(1),fo=Vi(Ba,Ba.FWIDTH).setParameterLength(1),yo=Vi(Ba,Ba.TRANSPOSE).setParameterLength(1),xo=Vi(Ba,Ba.BITCAST).setParameterLength(2),bo=(e,t)=>(console.warn('THREE.TSL: "equals" is deprecated. Use "equal" inside a vector instead, like: "bvec*( equal( ... ) )"'),ha(e,t)),To=Vi(Ba,Ba.MIN).setParameterLength(2,1/0),_o=Vi(Ba,Ba.MAX).setParameterLength(2,1/0),vo=Vi(Ba,Ba.STEP).setParameterLength(2),No=Vi(Ba,Ba.REFLECT).setParameterLength(2),So=Vi(Ba,Ba.DISTANCE).setParameterLength(2),wo=Vi(Ba,Ba.DIFFERENCE).setParameterLength(2),Eo=Vi(Ba,Ba.DOT).setParameterLength(2),Ao=Vi(Ba,Ba.CROSS).setParameterLength(2),Ro=Vi(Ba,Ba.POW).setParameterLength(2),Co=Vi(Ba,Ba.POW,2).setParameterLength(1),Mo=Vi(Ba,Ba.POW,3).setParameterLength(1),Po=Vi(Ba,Ba.POW,4).setParameterLength(1),Lo=Vi(Ba,Ba.TRANSFORM_DIRECTION).setParameterLength(2),Fo=e=>la(ao(e),Ro(no(e),1/3)),Bo=e=>Eo(e,e),Do=Vi(Ba,Ba.MIX).setParameterLength(3),Io=(e,t=0,r=1)=>Bi(new Ba(Ba.CLAMP,Bi(e),Bi(t),Bi(r))),Vo=e=>Io(e),Uo=Vi(Ba,Ba.REFRACT).setParameterLength(3),Oo=Vi(Ba,Ba.SMOOTHSTEP).setParameterLength(3),ko=Vi(Ba,Ba.FACEFORWARD).setParameterLength(3),Go=ki((([e])=>{const t=Eo(e.xy,Yi(12.9898,78.233)),r=ca(t,Va);return Za(Ja(r).mul(43758.5453))})),zo=(e,t,r)=>Do(t,r,e),$o=(e,t,r)=>Oo(t,r,e),Ho=(e,t)=>(console.warn('THREE.TSL: "atan2" is overloaded. Use "atan" instead.'),io(e,t)),Wo=ko,jo=Xa;oi("all",Oa),oi("any",ka),oi("equals",bo),oi("radians",Ga),oi("degrees",za),oi("exp",$a),oi("exp2",Ha),oi("log",Wa),oi("log2",ja),oi("sqrt",qa),oi("inverseSqrt",Xa),oi("floor",Ka),oi("ceil",Ya),oi("normalize",Qa),oi("fract",Za),oi("sin",Ja),oi("cos",eo),oi("tan",to),oi("asin",ro),oi("acos",so),oi("atan",io),oi("abs",no),oi("sign",ao),oi("length",oo),oi("lengthSq",Bo),oi("negate",uo),oi("oneMinus",lo),oi("dFdx",co),oi("dFdy",ho),oi("round",po),oi("reciprocal",go),oi("trunc",mo),oi("fwidth",fo),oi("atan2",Ho),oi("min",To),oi("max",_o),oi("step",vo),oi("reflect",No),oi("distance",So),oi("dot",Eo),oi("cross",Ao),oi("pow",Ro),oi("pow2",Co),oi("pow3",Mo),oi("pow4",Po),oi("transformDirection",Lo),oi("mix",zo),oi("clamp",Io),oi("refract",Uo),oi("smoothstep",$o),oi("faceForward",ko),oi("difference",wo),oi("saturate",Vo),oi("cbrt",Fo),oi("transpose",yo),oi("rand",Go);class qo extends js{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return this.setup(e),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}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:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?mn(r).build(e):"";s.nodeProperty=l;const d=i.build(e,"bool");e.addFlowCode(`\n${e.tab}if ( ${d} ) {\n\n`).addFlowTab();let c=n.build(e,r);if(c&&(u?c=l+" = "+c+";":(c="return "+c+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),c="// "+c))),e.removeFlowTab().addFlowCode(e.tab+"\t"+c+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(console.warn("THREE.TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const Xo=Vi(qo).setParameterLength(2,3);oi("select",Xo);const Ko=(...e)=>(console.warn("THREE.TSL: cond() has been renamed to select()."),Xo(...e));oi("cond",Ko);class Yo extends js{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 Qo=Vi(Yo).setParameterLength(1,2),Zo=(e,t)=>Qo(e,{label:t});oi("context",Qo),oi("label",Zo);class Jo extends js{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,o=!1;s&&(a=e.isDeterministic(t),o=n?s:a);const u=e.getVectorType(this.getNodeType(e)),l=t.build(e,u),d=e.getVarFromNode(this,r,u,void 0,o),c=e.getPropertyName(d);let h=c;if(o)if(n)h=a?`const ${c}`:`let ${c}`;else{const r=e.getArrayCount(t);h=`const ${e.getVar(d.type,c,r)}`}return e.addLineFlowCode(`${h} = ${l}`,this),c}}const eu=Vi(Jo),tu=(e,t=null)=>eu(e,t).toStack(),ru=(e,t=null)=>eu(e,t,!0).toStack();oi("toVar",tu),oi("toConst",ru);const su=e=>(console.warn('TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.'),eu(e));oi("temp",su);class iu extends js{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=e,this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null}isGlobal(){return!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}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),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),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),s="fragment"===e.shaderStage&&!0===t.reassignPosition&&e.context.needsPositionReassign;if(void 0===t.propertyName||s){const i=this.getNodeType(e),n=e.getPropertyName(r,Vs.VERTEX);e.flowNodeFromShaderStage(Vs.VERTEX,this.node,i,n),t.propertyName=n,s?t.reassignPosition=!1:void 0===t.reassignPosition&&e.context.isPositionNodeInput&&(t.reassignPosition=!0)}return e.getPropertyName(r)}}const nu=Vi(iu).setParameterLength(1,2),au=e=>nu(e);oi("toVarying",nu),oi("toVertexStage",au),oi("varying",((...e)=>(console.warn("THREE.TSL: .varying() has been renamed to .toVarying()."),nu(...e)))),oi("vertexStage",((...e)=>(console.warn("THREE.TSL: .vertexStage() has been renamed to .toVertexStage()."),nu(...e))));const ou=ki((([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return Do(t,r,s)})).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),uu=ki((([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return Do(t,r,s)})).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),lu="WorkingColorSpace",du="OutputColorSpace";class cu extends Ks{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===lu?c.workingColorSpace:t===du?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 i=t;return!1!==c.enabled&&r!==s&&r&&s?(c.getTransfer(r)===h&&(i=nn(ou(i.rgb),i.a)),c.getPrimaries(r)!==c.getPrimaries(s)&&(i=nn(dn(c._getMatrix(new n,r,s)).mul(i.rgb),i.a)),c.getTransfer(s)===h&&(i=nn(uu(i.rgb),i.a)),i):i}}const hu=e=>Bi(new cu(Bi(e),lu,du)),pu=e=>Bi(new cu(Bi(e),du,lu)),gu=(e,t)=>Bi(new cu(Bi(e),lu,t)),mu=(e,t)=>Bi(new cu(Bi(e),t,lu));oi("toOutputColorSpace",hu),oi("toWorkingColorSpace",pu),oi("workingToColorSpace",gu),oi("colorSpaceToWorking",mu);let fu=class extends qs{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 yu extends js{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=Us.OBJECT}setGroup(e){return this.group=e,this}element(e){return Bi(new fu(this,Bi(e)))}setNodeType(e){const t=Zn(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;eBi(new xu(e,t,r));class Tu extends Ks{static get type(){return"ToneMappingNode"}constructor(e,t=vu,r=null){super("vec3"),this.toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Ns(this.toneMapping)}setup(e){const t=this.colorNode||e.context.color,r=this.toneMapping;if(r===p)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=nn(i(t.rgb,this.exposureNode),t.a):(console.error("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const _u=(e,t,r)=>Bi(new Tu(e,Bi(t),Bi(r))),vu=bu("toneMappingExposure","float");oi("toneMapping",((e,t,r)=>_u(t,r,e)));class Nu extends ti{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=g,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,a=!0===r.isInterleavedBuffer?r:new m(r,i),o=new f(a,s,n);a.setUsage(this.usage),this.attribute=o,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=nu(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 Su=(e,t=null,r=0,s=0)=>Bi(new Nu(e,t,r,s)),wu=(e,t=null,r=0,s=0)=>Su(e,t,r,s).setUsage(y),Eu=(e,t=null,r=0,s=0)=>Su(e,t,r,s).setInstanced(!0),Au=(e,t=null,r=0,s=0)=>wu(e,t,r,s).setInstanced(!0);oi("toAttribute",(e=>Su(e.value)));class Ru extends js{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.name="",this.updateBeforeType=Us.OBJECT,this.onInitFunction=null,this.updateDispatchCount()}dispose(){this.dispatchEvent({type:"dispose"})}label(e){return this.name=e,this}updateDispatchCount(){const{count:e,workgroupSize:t}=this;let r=t[0];for(let e=1;eBi(new Ru(Bi(e),t,r));oi("compute",Cu);class Mu extends js{static get type(){return"CacheNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isCacheNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}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 Pu=(e,t)=>Bi(new Mu(Bi(e),t));oi("cache",Pu);class Lu extends js{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 Fu=Vi(Lu).setParameterLength(2);oi("bypass",Fu);class Bu extends js{static get type(){return"RemapNode"}constructor(e,t,r,s=ji(0),i=ji(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 a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const Du=Vi(Bu,null,null,{doClamp:!1}).setParameterLength(3,5),Iu=Vi(Bu).setParameterLength(3,5);oi("remap",Du),oi("remapClamp",Iu);class Vu extends js{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 Uu=Vi(Vu).setParameterLength(1,2),Ou=e=>(e?Xo(e,Uu("discard")):Uu("discard")).toStack();oi("discard",Ou);class ku extends Ks{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)||p,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||x;return r!==p&&(t=t.toneMapping(r)),s!==x&&s!==c.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const Gu=(e,t=null,r=null)=>Bi(new ku(Bi(e),t,r));oi("renderOutput",Gu);class zu extends Ks{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e),s="--- TSL debug - "+e.shaderStage+" shader ---",i="-".repeat(s.length);let n="";return n+="// #"+s+"#\n",n+=e.flow.code.replace(/^\t/gm,"")+"\n",n+="/* ... */ "+r+" /* ... */\n",n+="// #"+i+"#\n",null!==t?t(e,n):console.log(n),r}}const $u=(e,t=null)=>Bi(new zu(Bi(e),t));oi("debug",$u);class Hu extends js{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 nu(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 Wu=(e,t=null)=>Bi(new Hu(e,t)),ju=(e=0)=>Wu("uv"+(e>0?e:""),"vec2");class qu extends js{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 Xu=Vi(qu).setParameterLength(1,2);class Ku extends Qn{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Us.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=Vi(Ku).setParameterLength(1);class Qu extends Qn{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=Us.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===b?"uvec4":this.value.type===T?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return ju(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=Zn(this.value.matrix)),this._matrixUniform.mul(en(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this.updateType=e?Us.OBJECT:Us.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(qi(Xu(this,this.levelNode).y).sub(t.y).sub(1))),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");let s=this.uvNode;null!==s&&!0!==e.context.forceUVContext||!e.context.getUV||(s=e.context.getUV(this,e)),s||(s=this.getDefaultUV()),!0===this.updateMatrix&&(s=this.getTransformedUV(s)),s=this.setupUV(e,s);let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this)),t.uvNode=s,t.levelNode=i,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,a,o){const u=this.value;let l;return l=s?e.generateTextureLevel(u,t,r,s,n):i?e.generateTextureBias(u,t,r,i,n):o?e.generateTextureGrad(u,t,r,o,n):a?e.generateTextureCompare(u,t,r,a,n):!1===this.sampler?e.generateTextureLoad(u,t,r,n):e.generateTexture(u,t,r,n),l}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this);let a=n.propertyName;if(void 0===a){const{uvNode:t,levelNode:r,biasNode:o,compareNode:u,depthNode:l,gradNode:d}=s,c=this.generateUV(e,t),h=r?r.build(e,"float"):null,p=o?o.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);a=e.getPropertyName(y);const x=this.generateSnippet(e,i,c,h,p,g,m,f);e.addLineFlowCode(`${a} = ${x}`,this),n.snippet=x,n.propertyName=a}let o=a;const u=this.getNodeType(e);return e.needsToWorkingColorSpace(r)&&(o=mu(Uu(o,u),r.colorSpace).setup(e).build(e,u)),e.format(o,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=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}blur(e){const t=this.clone();t.biasNode=Bi(e).mul(Yu(t)),t.referenceNode=this.getSelf();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===_||r.magFilter===_)&&(console.warn("THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Bi(t)}level(e){const t=this.clone();return t.levelNode=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}size(e){return Xu(this,e)}bias(e){const t=this.clone();return t.biasNode=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}compare(e){const t=this.clone();return t.compareNode=Bi(e),t.referenceNode=this.getSelf(),Bi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Bi(e),Bi(t)],r.referenceNode=this.getSelf(),Bi(r)}depth(e){const t=this.clone();return t.depthNode=Bi(e),t.referenceNode=this.getSelf(),Bi(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.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e}}const Zu=Vi(Qu).setParameterLength(1,4),Ju=(...e)=>Zu(...e).setSampler(!1);class el extends Qn{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)=>Bi(new el(e,t,r));class rl extends qs{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 sl extends el{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ps(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Us.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;rBi(new sl(e,t));const nl=Vi(class extends js{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1),al=Zn(0,"uint").label("u_cameraIndex").setGroup(qn("cameraIndex")).toVarying("v_cameraIndex"),ol=Zn("float").label("cameraNear").setGroup(Kn).onRenderUpdate((({camera:e})=>e.near)),ul=Zn("float").label("cameraFar").setGroup(Kn).onRenderUpdate((({camera:e})=>e.far)),ll=ki((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=il(r).setGroup(Kn).label("cameraProjectionMatrices").element(e.isMultiViewCamera?nl("gl_ViewID_OVR"):al).toVar("cameraProjectionMatrix")}else t=Zn("mat4").label("cameraProjectionMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.projectionMatrix));return t})).once()(),dl=ki((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=il(r).setGroup(Kn).label("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?nl("gl_ViewID_OVR"):al).toVar("cameraProjectionMatrixInverse")}else t=Zn("mat4").label("cameraProjectionMatrixInverse").setGroup(Kn).onRenderUpdate((({camera:e})=>e.projectionMatrixInverse));return t})).once()(),cl=ki((({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=il(r).setGroup(Kn).label("cameraViewMatrices").element(e.isMultiViewCamera?nl("gl_ViewID_OVR"):al).toVar("cameraViewMatrix")}else t=Zn("mat4").label("cameraViewMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.matrixWorldInverse));return t})).once()(),hl=Zn("mat4").label("cameraWorldMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.matrixWorld)),pl=Zn("mat3").label("cameraNormalMatrix").setGroup(Kn).onRenderUpdate((({camera:e})=>e.normalMatrix)),gl=Zn(new r).label("cameraPosition").setGroup(Kn).onRenderUpdate((({camera:e},t)=>t.value.setFromMatrixPosition(e.matrixWorld))),ml=new v;class fl extends js{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Us.OBJECT,this._uniformNode=new Qn(null)}getNodeType(){const e=this.scope;return e===fl.WORLD_MATRIX?"mat4":e===fl.POSITION||e===fl.VIEW_POSITION||e===fl.DIRECTION||e===fl.SCALE?"vec3":e===fl.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this._uniformNode,i=this.scope;if(i===fl.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===fl.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===fl.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===fl.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===fl.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===fl.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ml.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ml.radius}}generate(e){const t=this.scope;return t===fl.WORLD_MATRIX?this._uniformNode.nodeType="mat4":t===fl.POSITION||t===fl.VIEW_POSITION||t===fl.DIRECTION||t===fl.SCALE?this._uniformNode.nodeType="vec3":t===fl.RADIUS&&(this._uniformNode.nodeType="float"),this._uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}fl.WORLD_MATRIX="worldMatrix",fl.POSITION="position",fl.SCALE="scale",fl.VIEW_POSITION="viewPosition",fl.DIRECTION="direction",fl.RADIUS="radius";const yl=Vi(fl,fl.DIRECTION).setParameterLength(1),xl=Vi(fl,fl.WORLD_MATRIX).setParameterLength(1),bl=Vi(fl,fl.POSITION).setParameterLength(1),Tl=Vi(fl,fl.SCALE).setParameterLength(1),_l=Vi(fl,fl.VIEW_POSITION).setParameterLength(1),vl=Vi(fl,fl.RADIUS).setParameterLength(1);class Nl extends fl{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const Sl=Ui(Nl,Nl.DIRECTION),wl=Ui(Nl,Nl.WORLD_MATRIX),El=Ui(Nl,Nl.POSITION),Al=Ui(Nl,Nl.SCALE),Rl=Ui(Nl,Nl.VIEW_POSITION),Cl=Ui(Nl,Nl.RADIUS),Ml=Zn(new n).onObjectUpdate((({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld))),Pl=Zn(new a).onObjectUpdate((({object:e},t)=>t.value.copy(e.matrixWorld).invert())),Ll=ki((e=>e.renderer.overrideNodes.modelViewMatrix||Fl)).once()().toVar("modelViewMatrix"),Fl=cl.mul(wl),Bl=ki((e=>(e.context.isHighPrecisionModelViewMatrix=!0,Zn("mat4").onObjectUpdate((({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))))).once()().toVar("highpModelViewMatrix"),Dl=ki((e=>{const t=e.context.isHighPrecisionModelViewMatrix;return Zn("mat3").onObjectUpdate((({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix))))})).once()().toVar("highpModelNormalViewMatrix"),Il=Wu("position","vec3"),Vl=Il.toVarying("positionLocal"),Ul=Il.toVarying("positionPrevious"),Ol=wl.mul(Vl).xyz.toVarying("v_positionWorld").context({needsPositionReassign:!0}),kl=Vl.transformDirection(wl).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection").context({needsPositionReassign:!0}),Gl=ki((e=>e.context.setupPositionView()),"vec3").once()().toVarying("v_positionView").context({needsPositionReassign:!0}),zl=Gl.negate().toVarying("v_positionViewDirection").normalize().toVar("positionViewDirection");class $l extends js{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){const{renderer:t,material:r}=e;return t.coordinateSystem===l&&r.side===N?"false":e.getFrontFacing()}}const Hl=Ui($l),Wl=ji(Hl).mul(2).sub(1),jl=Wu("normal","vec3"),ql=ki((e=>!1===e.geometry.hasAttribute("normal")?(console.warn('THREE.TSL: Vertex attribute "normal" not found on geometry.'),en(0,1,0)):jl),"vec3").once()().toVar("normalLocal"),Xl=Gl.dFdx().cross(Gl.dFdy()).normalize().toVar("normalFlat"),Kl=ki((e=>{let t;return t=!0===e.material.flatShading?Xl:nu(td(ql),"v_normalView").normalize(),t}),"vec3").once()().toVar("normalView"),Yl=ki((e=>{let t=Kl.transformDirection(cl);return!0!==e.material.flatShading&&(t=nu(t,"v_normalWorld")),t}),"vec3").once()().normalize().toVar("normalWorld"),Ql=ki((e=>{let t=e.context.setupNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul(Wl)),t}),"vec3").once()().toVar("transformedNormalView"),Zl=Ql.transformDirection(cl).toVar("transformedNormalWorld"),Jl=ki((e=>{let t=e.context.setupClearcoatNormal().context({getUV:null});return!0!==e.material.flatShading&&(t=t.mul(Wl)),t}),"vec3").once()().toVar("transformedClearcoatNormalView"),ed=ki((([e,t=wl])=>{const r=dn(t),s=e.div(en(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz})),td=ki((([e],t)=>{const r=t.renderer.overrideNodes.modelNormalViewMatrix;if(null!==r)return r.transformDirection(e);const s=Ml.mul(e);return cl.transformDirection(s)})),rd=new S,sd=new a,id=Zn(0).onReference((({material:e})=>e)).onObjectUpdate((({material:e})=>e.refractionRatio)),nd=Zn(1).onReference((({material:e})=>e)).onObjectUpdate((function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity})),ad=Zn(new a).onReference((function(e){return e.material})).onObjectUpdate((function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(rd.copy(r),sd.makeRotationFromEuler(rd)):sd.identity(),sd})),od=zl.negate().reflect(Ql),ud=zl.negate().refract(Ql,id),ld=od.transformDirection(cl).toVar("reflectVector"),dd=ud.transformDirection(cl).toVar("reflectVector");class cd extends Qu{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===w?ld:e.mapping===E?dd:(console.error('THREE.CubeTextureNode: Mapping "%s" not supported.',e.mapping),en(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return e.renderer.coordinateSystem!==d&&r.isRenderTargetTexture||(t=en(t.x.negate(),t.yz)),ad.mul(t)}generateUV(e,t){return t.build(e,"vec3")}}const hd=Vi(cd).setParameterLength(1,4).setName("cubeTexture");class pd extends qs{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 gd extends js{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=Us.OBJECT}element(e){return Bi(new pd(this,Bi(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())?il(null,e):"texture"===e?Zu(null):"cubeTexture"===e?hd(null):Zn(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;eBi(new gd(e,t,r)),fd=(e,t,r,s)=>Bi(new gd(e,t,s,r));class yd extends gd{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 xd=(e,t,r=null)=>Bi(new yd(e,t,r)),bd=ki((e=>(!1===e.geometry.hasAttribute("tangent")&&e.geometry.computeTangents(),Wu("tangent","vec4"))))(),Td=bd.xyz.toVar("tangentLocal"),_d=Ll.mul(nn(Td,0)).xyz.toVarying("v_tangentView").normalize().toVar("tangentView"),vd=_d.transformDirection(cl).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Nd=_d.toVar("transformedTangentView"),Sd=Nd.transformDirection(cl).normalize().toVar("transformedTangentWorld"),wd=ki((([e,t],r)=>{let s=e.mul(bd.w).xyz;return!0!==r.material.flatShading&&(s=nu(e,t)),s})).once(),Ed=wd(jl.cross(bd),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Ad=wd(ql.cross(Td),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Rd=wd(Kl.cross(_d),"v_bitangentView").normalize().toVar("bitangentView"),Cd=wd(Yl.cross(vd),"v_bitangentWorld").normalize().toVar("bitangentWorld"),Md=wd(Ql.cross(Nd),"v_transformedBitangentView").normalize().toVar("transformedBitangentView"),Pd=Md.transformDirection(cl).normalize().toVar("transformedBitangentWorld"),Ld=dn(_d,Rd,Kl),Fd=zl.mul(Ld),Bd=(()=>{let e=Pn.cross(zl);return e=e.cross(Pn).normalize(),e=Do(e,Ql,Cn.mul(bn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e})(),Dd=ki((e=>{const{eye_pos:t,surf_norm:r,mapN:s,uv:i}=e,n=t.dFdx(),a=t.dFdy(),o=i.dFdx(),u=i.dFdy(),l=r,d=a.cross(l),c=l.cross(n),h=d.mul(o.x).add(c.mul(u.x)),p=d.mul(o.y).add(c.mul(u.y)),g=h.dot(h).max(p.dot(p)),m=Wl.mul(g.inverseSqrt());return oa(h.mul(s.x,m),p.mul(s.y,m),l.mul(s.z)).normalize()}));class Id extends Ks{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=A}setup(e){const{normalMapType:t,scaleNode:r}=this;let s=this.node.mul(2).sub(1);null!==r&&(s=en(s.xy.mul(r),s.z));let i=null;if(t===R)i=td(s);else if(t===A){i=!0===e.hasGeometryAttribute("tangent")?Ld.mul(s).normalize():Dd({eye_pos:Gl,surf_norm:Kl,mapN:s,uv:ju()})}return i}}const Vd=Vi(Id).setParameterLength(1,2),Ud=ki((({textureNode:e,bumpScale:t})=>{const r=t=>e.cache().context({getUV:e=>t(e.uvNode||ju()),forceUVContext:!0}),s=ji(r((e=>e)));return Yi(ji(r((e=>e.add(e.dFdx())))).sub(s),ji(r((e=>e.add(e.dFdy())))).sub(s)).mul(t)})),Od=ki((e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(Wl),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()}));class kd extends Ks{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=Ud({textureNode:this.textureNode,bumpScale:e});return Od({surf_pos:Gl,surf_norm:Kl,dHdxy:t})}}const Gd=Vi(kd).setParameterLength(1,2),zd=new Map;class $d extends js{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=zd.get(e);return void 0===r&&(r=xd(e,t),zd.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===$d.COLOR){const e=void 0!==t.color?this.getColor(r):en();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===$d.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===$d.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:ji(1);else if(r===$d.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===$d.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===$d.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===$d.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===$d.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===$d.NORMAL)t.normalMap?(s=Vd(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType):s=t.bumpMap?Gd(this.getTexture("bump").r,this.getFloat("bumpScale")):Kl;else if(r===$d.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===$d.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===$d.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Vd(this.getTexture(r),this.getCache(r+"Scale","vec2")):Kl;else if(r===$d.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===$d.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===$d.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=ln(Ac.x,Ac.y,Ac.y.negate(),Ac.x).mul(e.rg.mul(2).sub(Yi(1)).normalize().mul(e.b))}else s=Ac;else if(r===$d.IRIDESCENCE_THICKNESS){const e=md("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=md("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===$d.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===$d.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===$d.IOR)s=this.getFloat(r);else if(r===$d.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===$d.AO)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}}$d.ALPHA_TEST="alphaTest",$d.COLOR="color",$d.OPACITY="opacity",$d.SHININESS="shininess",$d.SPECULAR="specular",$d.SPECULAR_STRENGTH="specularStrength",$d.SPECULAR_INTENSITY="specularIntensity",$d.SPECULAR_COLOR="specularColor",$d.REFLECTIVITY="reflectivity",$d.ROUGHNESS="roughness",$d.METALNESS="metalness",$d.NORMAL="normal",$d.CLEARCOAT="clearcoat",$d.CLEARCOAT_ROUGHNESS="clearcoatRoughness",$d.CLEARCOAT_NORMAL="clearcoatNormal",$d.EMISSIVE="emissive",$d.ROTATION="rotation",$d.SHEEN="sheen",$d.SHEEN_ROUGHNESS="sheenRoughness",$d.ANISOTROPY="anisotropy",$d.IRIDESCENCE="iridescence",$d.IRIDESCENCE_IOR="iridescenceIOR",$d.IRIDESCENCE_THICKNESS="iridescenceThickness",$d.IOR="ior",$d.TRANSMISSION="transmission",$d.THICKNESS="thickness",$d.ATTENUATION_DISTANCE="attenuationDistance",$d.ATTENUATION_COLOR="attenuationColor",$d.LINE_SCALE="scale",$d.LINE_DASH_SIZE="dashSize",$d.LINE_GAP_SIZE="gapSize",$d.LINE_WIDTH="linewidth",$d.LINE_DASH_OFFSET="dashOffset",$d.POINT_SIZE="size",$d.DISPERSION="dispersion",$d.LIGHT_MAP="light",$d.AO="ao";const Hd=Ui($d,$d.ALPHA_TEST),Wd=Ui($d,$d.COLOR),jd=Ui($d,$d.SHININESS),qd=Ui($d,$d.EMISSIVE),Xd=Ui($d,$d.OPACITY),Kd=Ui($d,$d.SPECULAR),Yd=Ui($d,$d.SPECULAR_INTENSITY),Qd=Ui($d,$d.SPECULAR_COLOR),Zd=Ui($d,$d.SPECULAR_STRENGTH),Jd=Ui($d,$d.REFLECTIVITY),ec=Ui($d,$d.ROUGHNESS),tc=Ui($d,$d.METALNESS),rc=Ui($d,$d.NORMAL),sc=Ui($d,$d.CLEARCOAT),ic=Ui($d,$d.CLEARCOAT_ROUGHNESS),nc=Ui($d,$d.CLEARCOAT_NORMAL),ac=Ui($d,$d.ROTATION),oc=Ui($d,$d.SHEEN),uc=Ui($d,$d.SHEEN_ROUGHNESS),lc=Ui($d,$d.ANISOTROPY),dc=Ui($d,$d.IRIDESCENCE),cc=Ui($d,$d.IRIDESCENCE_IOR),hc=Ui($d,$d.IRIDESCENCE_THICKNESS),pc=Ui($d,$d.TRANSMISSION),gc=Ui($d,$d.THICKNESS),mc=Ui($d,$d.IOR),fc=Ui($d,$d.ATTENUATION_DISTANCE),yc=Ui($d,$d.ATTENUATION_COLOR),xc=Ui($d,$d.LINE_SCALE),bc=Ui($d,$d.LINE_DASH_SIZE),Tc=Ui($d,$d.LINE_GAP_SIZE),_c=Ui($d,$d.LINE_WIDTH),vc=Ui($d,$d.LINE_DASH_OFFSET),Nc=Ui($d,$d.POINT_SIZE),Sc=Ui($d,$d.DISPERSION),wc=Ui($d,$d.LIGHT_MAP),Ec=Ui($d,$d.AO),Ac=Zn(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))})),Rc=ki((e=>e.context.setupModelViewProjection()),"vec4").once()().toVarying("v_modelViewProjection");class Cc extends js{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===Cc.VERTEX)s=e.getVertexIndex();else if(r===Cc.INSTANCE)s=e.getInstanceIndex();else if(r===Cc.DRAW)s=e.getDrawIndex();else if(r===Cc.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Cc.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Cc.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=nu(this).build(e,t)}return i}}Cc.VERTEX="vertex",Cc.INSTANCE="instance",Cc.SUBGROUP="subgroup",Cc.INVOCATION_LOCAL="invocationLocal",Cc.INVOCATION_SUBGROUP="invocationSubgroup",Cc.DRAW="draw";const Mc=Ui(Cc,Cc.VERTEX),Pc=Ui(Cc,Cc.INSTANCE),Lc=Ui(Cc,Cc.SUBGROUP),Fc=Ui(Cc,Cc.INVOCATION_SUBGROUP),Bc=Ui(Cc,Cc.INVOCATION_LOCAL),Dc=Ui(Cc,Cc.DRAW);class Ic extends js{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Us.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(Pc);else{const e=new C(r.array,16,1);this.buffer=e;const t=r.usage===y?Au:Eu,s=[t(e,"vec4",16,0),t(e,"vec4",16,4),t(e,"vec4",16,8),t(e,"vec4",16,12)];i=cn(...s)}this.instanceMatrixNode=i}if(s&&null===n){const e=new M(s.array,3),t=s.usage===y?Au:Eu;this.bufferColor=e,n=en(t(e,"vec3",3,0)),this.instanceColorNode=n}const a=i.mul(Vl).xyz;if(Vl.assign(a),e.hasGeometryAttribute("normal")){const e=ed(ql,i);ql.assign(e)}null!==this.instanceColorNode&&fn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){this.instanceMatrix.usage!==y&&null!==this.buffer&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version),this.instanceColor&&this.instanceColor.usage!==y&&null!==this.bufferColor&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)}}const Vc=Vi(Ic).setParameterLength(2,3);class Uc extends Ic{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Oc=Vi(Uc).setParameterLength(1);class kc extends js{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=Pc:this.batchingIdNode=Dc);const t=ki((([e])=>{const t=qi(Xu(Ju(this.batchMesh._indirectTexture),0).x),r=qi(e).mod(t),s=qi(e).div(t);return Ju(this.batchMesh._indirectTexture,Qi(r,s)).x})).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(qi(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=qi(Xu(Ju(s),0).x),n=ji(r).mul(4).toInt().toVar(),a=n.mod(i),o=n.div(i),u=cn(Ju(s,Qi(a,o)),Ju(s,Qi(a.add(1),o)),Ju(s,Qi(a.add(2),o)),Ju(s,Qi(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=ki((([e])=>{const t=qi(Xu(Ju(l),0).x),r=e,s=r.mod(t),i=r.div(t);return Ju(l,Qi(s,i)).rgb})).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);fn("vec3","vBatchColor").assign(t)}const d=dn(u);Vl.assign(u.mul(Vl));const c=ql.div(en(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;ql.assign(h),e.hasGeometryAttribute("tangent")&&Td.mulAssign(d)}}const Gc=Vi(kc).setParameterLength(1);class zc extends qs{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}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}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 $c=Vi(zc).setParameterLength(2);class Hc extends el{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Rs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ks.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,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 $c(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ks.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Su(this.value),this._varying=nu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.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(null!==this.structTypeNode&&this.structTypeNode.build(e),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 Wc=(e,t=null,r=0)=>Bi(new Hc(e,t,r)),jc=new WeakMap;class qc extends js{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Us.OBJECT,this.skinIndexNode=Wu("skinIndex","uvec4"),this.skinWeightNode=Wu("skinWeight","vec4"),this.bindMatrixNode=md("bindMatrix","mat4"),this.bindMatrixInverseNode=md("bindMatrixInverse","mat4"),this.boneMatricesNode=fd("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Vl,this.toPositionNode=Vl,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=oa(a.mul(s.x).mul(d),o.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=ql){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w);let d=oa(s.x.mul(a),s.y.mul(o),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=fd("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Ul)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===Fs(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Ul.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();ql.assign(t),e.hasGeometryAttribute("tangent")&&Td.assign(t)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;jc.get(t)!==e.frameId&&(jc.set(t,e.frameId),null!==this.previousBoneMatricesNode&&t.previousBoneMatrices.set(t.boneMatrices),t.update())}}const Xc=e=>Bi(new qc(e));class Kc extends js{static get type(){return"LoopNode"}constructor(e=[]){super(),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+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(u)?">=":"<")),a)n=`while ( ${u} )`;else{const r={start:o,end:u},s=r.start,i=r.end;let a;const p=()=>c.includes("<")?"+=":"-=";if(null!=h)switch(typeof h){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=l+" "+p()+" "+e.generateConst(d,h);break;case"string":a=l+" "+h;break;default:h.isNode?a=l+" "+p()+" "+h.build(e):(console.error("THREE.TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else h="int"===d||"uint"===d?c.includes("<")?"++":"--":p()+" 1.",a=l+" "+h;n=`for ( ${e.getVar(d,l)+" = "+s}; ${l+" "+c+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\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;tBi(new Kc(Ii(e,"int"))).toStack(),Qc=()=>Uu("break").toStack(),Zc=new WeakMap,Jc=new s,eh=ki((({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=qi(Mc).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Ju(e,Qi(u,o)).depth(i).xyz.mul(t)}));class th extends js{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=Zn(1),this.updateType=Us.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,a=void 0!==n?n.length:0,{texture:o,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,a=void 0!==n?n.length:0;let o=Zc.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.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*a),f=new P(m,h,p,a);f.type=L,f.needsUpdate=!0;const y=4*c;for(let b=0;b{const t=ji(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Ju(this.mesh.morphTexture,Qi(qi(e).add(1),qi(Pc))).r):t.assign(md("morphTargetInfluences","float").element(e).toVar()),$i(t.notEqual(0),(()=>{!0===s&&Vl.addAssign(eh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:qi(0)})),!0===i&&ql.addAssign(eh({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:qi(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 rh=Vi(th).setParameterLength(1);class sh extends js{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class ih extends sh{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class nh extends Yo{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:en().toVar("directDiffuse"),directSpecular:en().toVar("directSpecular"),indirectDiffuse:en().toVar("indirectDiffuse"),indirectSpecular:en().toVar("indirectSpecular")};return{radiance:en().toVar("radiance"),irradiance:en().toVar("irradiance"),iblIrradiance:en().toVar("iblIrradiance"),ambientOcclusion:ji(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 ah=Vi(nh);class oh extends sh{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}let uh,lh;class dh extends js{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this.isViewportNode=!0}getNodeType(){return this.scope===dh.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Us.NONE;return this.scope!==dh.SIZE&&this.scope!==dh.VIEWPORT||(e=Us.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===dh.VIEWPORT?null!==t?lh.copy(t.viewport):(e.getViewport(lh),lh.multiplyScalar(e.getPixelRatio())):null!==t?(uh.width=t.width,uh.height=t.height):e.getDrawingBufferSize(uh)}setup(){const e=this.scope;let r=null;return r=e===dh.SIZE?Zn(uh||(uh=new t)):e===dh.VIEWPORT?Zn(lh||(lh=new s)):Yi(ph.div(hh)),r}generate(e){if(this.scope===dh.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(hh).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}dh.COORDINATE="coordinate",dh.VIEWPORT="viewport",dh.SIZE="size",dh.UV="uv";const ch=Ui(dh,dh.UV),hh=Ui(dh,dh.SIZE),ph=Ui(dh,dh.COORDINATE),gh=Ui(dh,dh.VIEWPORT),mh=gh.zw,fh=ph.sub(gh.xy),yh=fh.div(mh),xh=ki((()=>(console.warn('THREE.TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),hh)),"vec2").once()(),bh=ki((()=>(console.warn('THREE.TSL: "viewportTopLeft" is deprecated. Use "screenUV" instead.'),ch)),"vec2").once()(),Th=ki((()=>(console.warn('THREE.TSL: "viewportBottomLeft" is deprecated. Use "screenUV.flipY()" instead.'),ch.flipY())),"vec2").once()(),_h=new t;class vh extends Qu{static get type(){return"ViewportTextureNode"}constructor(e=ch,t=null,r=null){null===r&&((r=new F).minFilter=B),super(r,e,t),this.generateMipmaps=!1,this.isOutputTextureNode=!0,this.updateBeforeType=Us.FRAME}updateBefore(e){const t=e.renderer;t.getDrawingBufferSize(_h);const r=this.value;r.image.width===_h.width&&r.image.height===_h.height||(r.image.width=_h.width,r.image.height=_h.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 Nh=Vi(vh).setParameterLength(0,3),Sh=Vi(vh,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let wh=null;class Eh extends vh{static get type(){return"ViewportDepthTextureNode"}constructor(e=ch,t=null){null===wh&&(wh=new D),super(e,t,wh)}}const Ah=Vi(Eh).setParameterLength(0,2);class Rh extends js{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===Rh.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Rh.DEPTH_BASE)null!==r&&(s=Fh().assign(r));else if(t===Rh.DEPTH)s=e.isPerspectiveCamera?Mh(Gl.z,ol,ul):Ch(Gl.z,ol,ul);else if(t===Rh.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ph(r,ol,ul);s=Ch(e,ol,ul)}else s=r;else s=Ch(Gl.z,ol,ul);return s}}Rh.DEPTH_BASE="depthBase",Rh.DEPTH="depth",Rh.LINEAR_DEPTH="linearDepth";const Ch=(e,t,r)=>e.add(t).div(t.sub(r)),Mh=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ph=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Lh=(e,t,r)=>{t=t.max(1e-6).toVar();const s=ja(e.negate().div(t)),i=ja(r.div(t));return s.div(i)},Fh=Vi(Rh,Rh.DEPTH_BASE),Bh=Ui(Rh,Rh.DEPTH),Dh=Vi(Rh,Rh.LINEAR_DEPTH).setParameterLength(0,1),Ih=Dh(Ah());Bh.assign=e=>Fh(e);class Vh extends js{static get type(){return"ClippingNode"}constructor(e=Vh.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===Vh.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Vh.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return ki((()=>{const r=ji().toVar("distanceToPlane"),s=ji().toVar("distanceToGradient"),i=ji(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=il(t);Yc(n,(({i:t})=>{const n=e.element(t);r.assign(Gl.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(Oo(s.negate(),s,r))}))}const a=e.length;if(a>0){const t=il(e),n=ji(1).toVar("intersectionClipOpacity");Yc(a,(({i:e})=>{const i=t.element(e);r.assign(Gl.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(Oo(s.negate(),s,r).oneMinus())})),i.mulAssign(n.oneMinus())}yn.a.mulAssign(i),yn.a.equal(0).discard()}))()}setupDefault(e,t){return ki((()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=il(t);Yc(r,(({i:t})=>{const r=e.element(t);Gl.dot(r.xyz).greaterThan(r.w).discard()}))}const s=e.length;if(s>0){const t=il(e),r=Ki(!0).toVar("clipped");Yc(s,(({i:e})=>{const s=t.element(e);r.assign(Gl.dot(s.xyz).greaterThan(s.w).and(r))})),r.discard()}}))()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),ki((()=>{const s=il(e),i=nl(t.getClipDistance());Yc(r,(({i:e})=>{const t=s.element(e),r=Gl.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)}))}))()}}Vh.ALPHA_TO_COVERAGE="alphaToCoverage",Vh.DEFAULT="default",Vh.HARDWARE="hardware";const Uh=ki((([e])=>Za(la(1e4,Ja(la(17,e.x).add(la(.1,e.y)))).mul(oa(.1,no(Ja(la(13,e.y).add(e.x)))))))),Oh=ki((([e])=>Uh(Yi(Uh(e.xy),e.z)))),kh=ki((([e])=>{const t=_o(oo(co(e.xyz)),oo(ho(e.xyz))),r=ji(1).div(ji(.05).mul(t)).toVar("pixScale"),s=Yi(Ha(Ka(ja(r))),Ha(Ya(ja(r)))),i=Yi(Oh(Ka(s.x.mul(e.xyz))),Oh(Ka(s.y.mul(e.xyz)))),n=Za(ja(r)),a=oa(la(n.oneMinus(),i.x),la(n,i.y)),o=To(n,n.oneMinus()),u=en(a.mul(a).div(la(2,o).mul(ua(1,o))),a.sub(la(.5,o)).div(ua(1,o)),ua(1,ua(1,a).mul(ua(1,a)).div(la(2,o).mul(ua(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return Io(l,1e-6,1)})).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Gh extends Hu{static get type(){return"VertexColorNode"}constructor(e){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}}const zh=(e=0)=>Bi(new Gh(e));class $h extends I{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,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.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{console.warn('THREE.NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}customProgramCacheKey(){return this.type+Ss(this)}build(e){this.setup(e)}setupObserver(e){return new bs(e)}setup(e){e.context.setupNormal=()=>this.setupNormal(e),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();e.addStack();const s=this.vertexNode||this.setupVertex(e);let i;e.stack.outputNode=s,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const n=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==n&&e.stack.add(n);const a=nn(s,yn.a).max(0);i=this.setupOutput(e,a),Dn.assign(i);const o=null!==this.outputNode;if(o&&(i=this.outputNode),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&Dn.assign(i),i=e,null!==r&&(i=e.merge(r))):null!==r&&(i=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=nn(t)),i=this.setupOutput(e,t)}e.stack.outputNode=i,e.addFlow("fragment",e.removeStack()),e.observer=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=Bi(new Vh(Vh.ALPHA_TO_COVERAGE)):e.stack.add(Bi(new Vh))}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(Bi(new Vh(Vh.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?Lh(Gl.z,ol,ul):Ch(Gl.z,ol,ul))}null!==s&&Bh.assign(s).toStack()}setupPositionView(){return Ll.mul(Vl).xyz}setupModelViewProjection(){return ll.mul(Gl)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Rc}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&rh(t).toStack(),!0===t.isSkinnedMesh&&Xc(t).toStack(),this.displacementMap){const e=xd("displacementMap","texture"),t=xd("displacementScale","float"),r=xd("displacementBias","float");Vl.addAssign(ql.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&Gc(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Oc(t).toStack(),null!==this.positionNode&&Vl.assign(this.positionNode.context({isPositionNodeInput:!0})),Vl}setupDiffuseColor({object:e,geometry:t}){let r=this.colorNode?nn(this.colorNode):Wd;if(!0===this.vertexColors&&t.hasAttribute("color")&&(r=r.mul(zh())),e.instanceColor){r=fn("vec3","vInstanceColor").mul(r)}if(e.isBatchedMesh&&e._colorsTexture){r=fn("vec3","vBatchColor").mul(r)}yn.assign(r);const s=this.opacityNode?ji(this.opacityNode):Xd;if(yn.a.assign(yn.a.mul(s)),null!==this.alphaTestNode||this.alphaTest>0){const e=null!==this.alphaTestNode?ji(this.alphaTestNode):Hd;yn.a.lessThanEqual(e).discard()}!0===this.alphaHash&&yn.a.lessThan(kh(Vl)).discard(),!1===this.transparent&&this.blending===V&&!1===this.alphaToCoverage&&yn.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?en(0):yn.rgb}setupNormal(){return this.normalNode?en(this.normalNode):rc}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xd("envMap","cubeTexture"):xd("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new oh(wc)),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:Ec;t.push(new ih(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 a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=ah(n,t,r,s)}else null!==r&&(a=en(null!==s?Do(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(xn.assign(en(i||qd)),a=a.add(xn)),a}setupFog(e,t){const r=e.fogNode;return r&&(Dn.assign(t),t=nn(r)),t}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),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=I.prototype.toJSON.call(this,e),s=ws(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.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,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 Hh=new U;class Wh extends $h{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Hh),this.setValues(e)}}const jh=new O;class qh extends $h{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(jh),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?ji(this.offsetNode):vc,t=this.dashScaleNode?ji(this.dashScaleNode):xc,r=this.dashSizeNode?ji(this.dashSizeNode):bc,s=this.gapSizeNode?ji(this.gapSizeNode):Tc;In.assign(r),Vn.assign(s);const i=nu(Wu("lineDistance").mul(t));(e?i.add(e):i).mod(In.add(Vn)).greaterThan(In).discard()}}let Xh=null;class Kh extends vh{static get type(){return"ViewportSharedTextureNode"}constructor(e=ch,t=null){null===Xh&&(Xh=new F),super(e,t,Xh)}updateReference(){return this}}const Yh=Vi(Kh).setParameterLength(0,2),Qh=new O;class Zh extends $h{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(Qh),this.useColor=e.vertexColors,this.dashOffset=0,this.lineWidth=1,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=k,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.useColor,i=this._useDash,n=this._useWorldUnits,a=ki((({start:e,end:t})=>{const r=ll.element(2).element(2),s=ll.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return nn(Do(e.xyz,t.xyz,s),t.w)})).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=ki((()=>{const e=Wu("instanceStart"),t=Wu("instanceEnd"),r=nn(Ll.mul(nn(e,1))).toVar("start"),s=nn(Ll.mul(nn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?ji(this.dashScaleNode):xc,t=this.offsetNode?ji(this.offsetNode):vc,r=Wu("instanceDistanceStart"),s=Wu("instanceDistanceEnd");let i=Il.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),fn("float","lineDistance").assign(i)}n&&(fn("vec3","worldStart").assign(r.xyz),fn("vec3","worldEnd").assign(s.xyz));const o=gh.z.div(gh.w),u=ll.element(2).element(3).equal(-1);$i(u,(()=>{$i(r.z.lessThan(0).and(s.z.greaterThan(0)),(()=>{s.assign(a({start:r,end:s}))})).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),(()=>{r.assign(a({start:s,end:r}))}))}));const l=ll.mul(r),d=ll.mul(s),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(o)),p.assign(p.normalize());const g=nn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=Do(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=fn("vec4","worldPos");o.assign(Il.y.lessThan(.5).select(r,s));const u=_c.mul(.5);o.addAssign(nn(Il.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(nn(Il.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(nn(a.mul(u),0)),$i(Il.y.greaterThan(1).or(Il.y.lessThan(0)),(()=>{o.subAssign(nn(a.mul(2).mul(u),0))}))),g.assign(ll.mul(o));const l=en().toVar();l.assign(Il.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=Yi(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Il.x.lessThan(0).select(e.negate(),e)),$i(Il.y.lessThan(0),(()=>{e.assign(e.sub(p))})).ElseIf(Il.y.greaterThan(1),(()=>{e.assign(e.add(p))})),e.assign(e.mul(_c)),e.assign(e.div(gh.w)),g.assign(Il.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(nn(e,0,0)))}return g}))();const o=ki((({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return Yi(h,p)}));if(this.colorNode=ki((()=>{const e=ju();if(i){const t=this.dashSizeNode?ji(this.dashSizeNode):bc,r=this.gapSizeNode?ji(this.gapSizeNode):Tc;In.assign(t),Vn.assign(r);const s=fn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(In.add(Vn)).greaterThan(In).discard()}const a=ji(1).toVar("alpha");if(n){const e=fn("vec3","worldStart"),s=fn("vec3","worldEnd"),n=fn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:en(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(_c);if(!i)if(r&&t.samples>1){const e=h.fwidth();a.assign(Oo(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.samples>1){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=ji(s.fwidth()).toVar("dlen");$i(e.y.abs().greaterThan(1),(()=>{a.assign(Oo(i.oneMinus(),i.add(1),s).oneMinus())}))}else $i(e.y.abs().greaterThan(1),(()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()}));let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Wu("instanceColorStart"),t=Wu("instanceColorEnd");u=Il.y.lessThan(.5).select(e,t).mul(Wd)}else u=Wd;return nn(u,a)}))(),this.transparent){const e=this.opacityNode?ji(this.opacityNode):Xd;this.outputNode=nn(this.colorNode.rgb.mul(e).add(Yh().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}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 Jh=e=>Bi(e).mul(.5).add(.5),ep=new G;class tp extends $h{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ep),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?ji(this.opacityNode):Xd;yn.assign(mu(nn(Jh(Ql),e),z))}}class rp extends Ks{static get type(){return"EquirectUVNode"}constructor(e=kl){super("vec2"),this.dirNode=e}setup(){const e=this.dirNode,t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return Yi(t,r)}}const sp=Vi(rp).setParameterLength(0,1);class ip extends ${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 H(5,5,5),n=sp(kl),a=new $h;a.colorNode=Zu(t,n,0),a.side=N,a.blending=k;const o=new W(i,a),u=new j;u.add(o),t.minFilter===B&&(t.minFilter=q);const l=new X(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const np=new WeakMap;class ap extends Ks{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=hd(null);const t=new K;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Us.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===Y||r===Q){if(np.has(e)){const t=np.get(e);up(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ip(r.height);s.fromEquirectangularTexture(t,e),up(s.texture,e.mapping),this._cubeTexture=s.texture,np.set(e,s.texture),e.addEventListener("dispose",op)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function op(e){const t=e.target;t.removeEventListener("dispose",op);const r=np.get(t);void 0!==r&&(np.delete(t),r.dispose())}function up(e,t){t===Y?e.mapping=w:t===Q&&(e.mapping=E)}const lp=Vi(ap).setParameterLength(1);class dp extends sh{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=lp(this.envNode)}}class cp extends sh{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=ji(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class hp{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class pp extends hp{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(nn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(nn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(yn.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case ee:s.rgb.assign(Do(s.rgb,s.rgb.mul(i.rgb),Zd.mul(Jd)));break;case J:s.rgb.assign(Do(s.rgb,i.rgb,Zd.mul(Jd)));break;case Z:s.rgb.addAssign(i.rgb.mul(Zd.mul(Jd)));break;default:console.warn("THREE.BasicLightingModel: Unsupported .combine value:",t.combine)}}}const gp=new te;class mp extends $h{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(gp),this.setValues(e)}setupNormal(){return Kl}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new dp(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new cp(wc)),t}setupOutgoingLight(){return yn.rgb}setupLightingModel(){return new pp}}const fp=ki((({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))})),yp=ki((e=>e.diffuseColor.mul(1/Math.PI))),xp=ki((({dotNH:e})=>Bn.mul(ji(.5)).add(1).mul(ji(1/Math.PI)).mul(e.pow(Bn)))),bp=ki((({lightDirection:e})=>{const t=e.add(zl).normalize(),r=Ql.dot(t).clamp(),s=zl.dot(t).clamp(),i=fp({f0:Ln,f90:1,dotVH:s}),n=ji(.25),a=xp({dotNH:r});return i.mul(n).mul(a)}));class Tp extends pp{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Ql.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(yp({diffuseColor:yn.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(bp({lightDirection:e})).mul(Zd))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(yp({diffuseColor:yn}))),s.indirectDiffuse.mulAssign(t)}}const _p=new re;class vp extends $h{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(_p),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new dp(t):null}setupLightingModel(){return new Tp(!1)}}const Np=new se;class Sp extends $h{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Np),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new dp(t):null}setupLightingModel(){return new Tp}setupVariants(){const e=(this.shininessNode?ji(this.shininessNode):jd).max(1e-4);Bn.assign(e);const t=this.specularNode||Kd;Ln.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wp=ki((e=>{if(!1===e.geometry.hasAttribute("normal"))return ji(0);const t=Kl.dFdx().abs().max(Kl.dFdy().abs());return t.x.max(t.y).max(t.z)})),Ep=ki((e=>{const{roughness:t}=e,r=wp();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s})),Ap=ki((({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 da(.5,i.add(n).max(Da))})).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Rp=ki((({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(en(e.mul(r),t.mul(s),a).length()),l=a.mul(en(e.mul(i),t.mul(n),o).length());return da(.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"}]}),Cp=ki((({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"}]}),Mp=ji(1/Math.PI),Pp=ki((({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=en(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Mp.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"}]}),Lp=ki((e=>{const{lightDirection:t,f0:r,f90:s,roughness:i,f:n,USE_IRIDESCENCE:a,USE_ANISOTROPY:o}=e,u=e.normalView||Ql,l=i.pow2(),d=t.add(zl).normalize(),c=u.dot(t).clamp(),h=u.dot(zl).clamp(),p=u.dot(d).clamp(),g=zl.dot(d).clamp();let m,f,y=fp({f0:r,f90:s,dotVH:g});if(Pi(a)&&(y=wn.mix(y,n)),Pi(o)){const e=Mn.dot(t),r=Mn.dot(zl),s=Mn.dot(d),i=Pn.dot(t),n=Pn.dot(zl),a=Pn.dot(d);m=Rp({alphaT:Rn,alphaB:l,dotTV:r,dotBV:n,dotTL:e,dotBL:i,dotNV:h,dotNL:c}),f=Pp({alphaT:Rn,alphaB:l,dotNH:p,dotTH:s,dotBH:a})}else m=Ap({alpha:l,dotNL:c,dotNV:h}),f=Cp({alpha:l,dotNH:p});return y.mul(m).mul(f)})),Fp=ki((({roughness:e,dotNV:t})=>{const r=nn(-1,-.0275,-.572,.022),s=nn(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 Yi(-1.04,1.04).mul(n).add(i.zw)})).setLayout({name:"DFGApprox",type:"vec2",inputs:[{name:"roughness",type:"float"},{name:"dotNV",type:"vec3"}]}),Bp=ki((e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Fp({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))})),Dp=ki((({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(en(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"}]}),Ip=ki((({roughness:e,dotNH:t})=>{const r=e.pow2(),s=ji(1).div(r),i=t.pow2().oneMinus().max(.0078125);return ji(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"}]}),Vp=ki((({dotNV:e,dotNL:t})=>ji(1).div(ji(4).mul(t.add(e).sub(t.mul(e)))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Up=ki((({lightDirection:e})=>{const t=e.add(zl).normalize(),r=Ql.dot(e).clamp(),s=Ql.dot(zl).clamp(),i=Ql.dot(t).clamp(),n=Ip({roughness:Sn,dotNH:i}),a=Vp({dotNV:s,dotNL:r});return Nn.mul(n).mul(a)})),Op=ki((({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=Yi(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"}]}),kp=ki((({f:e})=>{const t=e.length();return _o(t.mul(t).add(e.z).div(t.add(1)),0)})).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),Gp=ki((({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(),a=i.div(n),o=r.greaterThan(0).select(a,_o(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)})).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),zp=ki((({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=en().toVar();return $i(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(dn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=en(0).toVar();f.addAssign(Gp({v1:h,v2:p})),f.addAssign(Gp({v1:p,v2:g})),f.addAssign(Gp({v1:g,v2:m})),f.addAssign(Gp({v1:m,v2:h})),c.assign(en(kp({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"}]}),$p=ki((({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=en().toVar();return $i(o.dot(e.sub(t)).greaterThanEqual(0),(()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=en(0).toVar();d.addAssign(Gp({v1:n,v2:a})),d.addAssign(Gp({v1:a,v2:o})),d.addAssign(Gp({v1:o,v2:l})),d.addAssign(Gp({v1:l,v2:n})),u.assign(en(kp({f:d.abs()})))})),u})).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Hp=1/6,Wp=e=>la(Hp,la(e,la(e,e.negate().add(3)).sub(3)).add(1)),jp=e=>la(Hp,la(e,la(e,la(3,e).sub(6))).add(4)),qp=e=>la(Hp,la(e,la(e,la(-3,e).add(3)).add(3)).add(1)),Xp=e=>la(Hp,Ro(e,3)),Kp=e=>Wp(e).add(jp(e)),Yp=e=>qp(e).add(Xp(e)),Qp=e=>oa(-1,jp(e).div(Wp(e).add(jp(e)))),Zp=e=>oa(1,Xp(e).div(qp(e).add(Xp(e)))),Jp=(e,t,r)=>{const s=e.uvNode,i=la(s,t.zw).add(.5),n=Ka(i),a=Za(i),o=Kp(a.x),u=Yp(a.x),l=Qp(a.x),d=Zp(a.x),c=Qp(a.y),h=Zp(a.y),p=Yi(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=Yi(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=Yi(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=Yi(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Kp(a.y).mul(oa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),x=Yp(a.y).mul(oa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(x)},eg=ki((([e,t=ji(3)])=>{const r=Yi(e.size(qi(t))),s=Yi(e.size(qi(t.add(1)))),i=da(1,r),n=da(1,s),a=Jp(e,nn(i,r),Ka(t)),o=Jp(e,nn(n,s),Ya(t));return Za(t).mix(a,o)})),tg=ki((([e,t,r,s,i])=>{const n=en(Uo(t.negate(),Qa(e),da(1,s))),a=en(oo(i[0].xyz),oo(i[1].xyz),oo(i[2].xyz));return Qa(n).mul(r.mul(a))})).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"}]}),rg=ki((([e,t])=>e.mul(Io(t.mul(2).sub(2),0,1)))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),sg=Sh(),ig=Sh(),ng=ki((([e,t,r],{material:s})=>{const i=(s.side===N?sg:ig).sample(e),n=ja(hh.x).mul(rg(t,r));return eg(i,n)})),ag=ki((([e,t,r])=>($i(r.notEqual(0),(()=>{const s=Wa(t).negate().div(r);return $a(s.negate().mul(e))})),en(1)))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),og=ki((([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=nn().toVar(),f=en().toVar();const i=d.sub(1).mul(g.mul(.025)),n=en(d.sub(i),d,d.add(i));Yc({start:0,end:3},(({i:i})=>{const d=n.element(i),g=tg(e,t,c,d,o),y=a.add(g),x=l.mul(u.mul(nn(y,1))),b=Yi(x.xy.div(x.w)).toVar();b.addAssign(1),b.divAssign(2),b.assign(Yi(b.x,b.y.oneMinus()));const T=ng(b,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(ag(oo(g),h,p).element(i)))})),m.a.divAssign(3)}else{const i=tg(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(nn(n,1))),y=Yi(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(Yi(y.x,y.y.oneMinus())),m=ng(y,r,d),f=s.mul(ag(oo(i),h,p))}const y=f.rgb.mul(m.rgb),x=e.dot(t).clamp(),b=en(Bp({dotNV:x,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return nn(b.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())})),ug=dn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),lg=(e,t)=>e.sub(t).div(e.add(t)).pow2(),dg=ki((({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=Do(e,t,Oo(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();$i(a.lessThan(0),(()=>en(1)));const o=a.sqrt(),u=lg(n,e),l=fp({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=ji(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return en(1).add(t).div(en(1).sub(t))})(i.clamp(0,.9999)),g=lg(p,n.toVec3()),m=fp({f0:g,f90:1,dotVH:o}),f=en(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,o,2),x=en(h).add(f),b=l.mul(m).clamp(1e-5,.9999),T=b.sqrt(),_=d.pow2().mul(m).div(en(1).sub(b)),v=l.add(_).toVar(),N=_.sub(d).toVar();return Yc({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=en(54856e-17,44201e-17,52481e-17),i=en(1681e3,1795300,2208400),n=en(43278e5,93046e5,66121e5),a=ji(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=en(o.x.add(a),o.y,o.z).div(1.0685e-7),ug.mul(o)})(ji(e).mul(y),ji(e).mul(x)).mul(2);v.addAssign(N.mul(t))})),v.max(en(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"}]}),cg=ki((({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.pow2(),n=Xo(r.lessThan(.25),ji(-339.2).mul(i).add(ji(161.4).mul(r)).sub(25.9),ji(-8.48).mul(i).add(ji(14.3).mul(r)).sub(9.95)),a=Xo(r.lessThan(.25),ji(44).mul(i).sub(ji(23.7).mul(r)).add(3.26),ji(1.97).mul(i).sub(ji(3.27).mul(r)).add(.72));return Xo(r.lessThan(.25),0,ji(.1).mul(r).sub(.025)).add(n.mul(s).add(a).exp()).mul(1/Math.PI).saturate()})),hg=en(.04),pg=ji(1);class gg extends hp{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=en().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=en().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=en().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=en().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=en().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Ql.dot(zl).clamp();this.iridescenceFresnel=dg({outsideIOR:ji(1),eta2:En,cosTheta1:e,thinFilmThickness:An,baseF0:Ln}),this.iridescenceF0=Dp({f:this.iridescenceFresnel,f90:1,dotVH:e})}if(!0===this.transmission){const t=Ol,r=gl.sub(Ol).normalize(),s=Zl,i=e.context;i.backdrop=og(s,r,bn,yn,Ln,Fn,t,wl,cl,ll,On,Gn,$n,zn,this.dispersion?Hn:null),i.backdropAlpha=kn,yn.a.mulAssign(Do(1,i.backdrop.a,kn))}super.start(e)}computeMultiscattering(e,t,r){const s=Ql.dot(zl).clamp(),i=Fp({roughness:bn,dotNV:s}),n=(this.iridescenceF0?wn.mix(Ln,this.iridescenceF0):Ln).mul(i.x).add(r.mul(i.y)),a=i.x.add(i.y).oneMinus(),o=Ln.add(Ln.oneMinus().mul(.047619)),u=n.mul(o).div(a.mul(o).oneMinus());e.addAssign(n),t.addAssign(u.mul(a))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Ql.dot(e).clamp().mul(t);if(!0===this.sheen&&this.sheenSpecularDirect.addAssign(s.mul(Up({lightDirection:e}))),!0===this.clearcoat){const r=Jl.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Lp({lightDirection:e,f0:hg,f90:pg,roughness:vn,normalView:Jl})))}r.directDiffuse.addAssign(s.mul(yp({diffuseColor:yn.rgb}))),r.directSpecular.addAssign(s.mul(Lp({lightDirection:e,f0:Ln,f90:1,roughness:bn,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:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=Ql,h=zl,p=Gl.toVar(),g=Op({N:c,V:h,roughness:bn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=dn(en(m.x,0,m.y),en(0,1,0),en(m.z,0,m.w)).toVar(),x=Ln.mul(f.x).add(Ln.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(x).mul(zp({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(yn).mul(zp({N:c,V:h,P:p,mInv:dn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(yp({diffuseColor:yn})))}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Nn,cg({normal:Ql,viewDir:zl,roughness:Sn}))),!0===this.clearcoat){const e=Jl.dot(zl).clamp(),t=Bp({dotNV:e,specularColor:hg,specularF90:pg,roughness:vn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=en().toVar("singleScattering"),n=en().toVar("multiScattering"),a=r.mul(1/Math.PI);this.computeMultiscattering(i,n,Fn);const o=i.add(n),u=yn.mul(o.r.max(o.g).max(o.b).oneMinus());s.indirectSpecular.addAssign(t.mul(i)),s.indirectSpecular.addAssign(n.mul(a)),s.indirectDiffuse.addAssign(u.mul(a))}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Ql.dot(zl).clamp().add(t),i=bn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Jl.dot(zl).clamp(),r=fp({dotVH:e,f0:hg,f90:pg}),s=t.mul(_n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(_n));t.assign(s)}if(!0===this.sheen){const e=Nn.r.max(Nn.g).max(Nn.b).mul(.157).oneMinus(),r=t.mul(e).add(this.sheenSpecularDirect,this.sheenSpecularIndirect);t.assign(r)}}}const mg=ji(1),fg=ji(-2),yg=ji(.8),xg=ji(-1),bg=ji(.4),Tg=ji(2),_g=ji(.305),vg=ji(3),Ng=ji(.21),Sg=ji(4),wg=ji(4),Eg=ji(16),Ag=ki((([e])=>{const t=en(no(e)).toVar(),r=ji(-1).toVar();return $i(t.x.greaterThan(t.z),(()=>{$i(t.x.greaterThan(t.y),(()=>{r.assign(Xo(e.x.greaterThan(0),0,3))})).Else((()=>{r.assign(Xo(e.y.greaterThan(0),1,4))}))})).Else((()=>{$i(t.z.greaterThan(t.y),(()=>{r.assign(Xo(e.z.greaterThan(0),2,5))})).Else((()=>{r.assign(Xo(e.y.greaterThan(0),1,4))}))})),r})).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Rg=ki((([e,t])=>{const r=Yi().toVar();return $i(t.equal(0),(()=>{r.assign(Yi(e.z,e.y).div(no(e.x)))})).ElseIf(t.equal(1),(()=>{r.assign(Yi(e.x.negate(),e.z.negate()).div(no(e.y)))})).ElseIf(t.equal(2),(()=>{r.assign(Yi(e.x.negate(),e.y).div(no(e.z)))})).ElseIf(t.equal(3),(()=>{r.assign(Yi(e.z.negate(),e.y).div(no(e.x)))})).ElseIf(t.equal(4),(()=>{r.assign(Yi(e.x.negate(),e.z).div(no(e.y)))})).Else((()=>{r.assign(Yi(e.x,e.y).div(no(e.z)))})),la(.5,r.add(1))})).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Cg=ki((([e])=>{const t=ji(0).toVar();return $i(e.greaterThanEqual(yg),(()=>{t.assign(mg.sub(e).mul(xg.sub(fg)).div(mg.sub(yg)).add(fg))})).ElseIf(e.greaterThanEqual(bg),(()=>{t.assign(yg.sub(e).mul(Tg.sub(xg)).div(yg.sub(bg)).add(xg))})).ElseIf(e.greaterThanEqual(_g),(()=>{t.assign(bg.sub(e).mul(vg.sub(Tg)).div(bg.sub(_g)).add(Tg))})).ElseIf(e.greaterThanEqual(Ng),(()=>{t.assign(_g.sub(e).mul(Sg.sub(vg)).div(_g.sub(Ng)).add(vg))})).Else((()=>{t.assign(ji(-2).mul(ja(la(1.16,e))))})),t})).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Mg=ki((([e,t])=>{const r=e.toVar();r.assign(la(2,r).sub(1));const s=en(r,1).toVar();return $i(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"}]}),Pg=ki((([e,t,r,s,i,n])=>{const a=ji(r),o=en(t),u=Io(Cg(a),fg,n),l=Za(u),d=Ka(u),c=en(Lg(e,o,d,s,i,n)).toVar();return $i(l.notEqual(0),(()=>{const t=en(Lg(e,o,d.add(1),s,i,n)).toVar();c.assign(Do(c,t,l))})),c})),Lg=ki((([e,t,r,s,i,n])=>{const a=ji(r).toVar(),o=en(t),u=ji(Ag(o)).toVar(),l=ji(_o(wg.sub(a),0)).toVar();a.assign(_o(a,wg));const d=ji(Ha(a)).toVar(),c=Yi(Rg(o,u).mul(d.sub(2)).add(1)).toVar();return $i(u.greaterThan(2),(()=>{c.y.addAssign(d),u.subAssign(3)})),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(la(3,Eg))),c.y.addAssign(la(4,Ha(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(Yi(),Yi())})),Fg=ki((({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=eo(s),l=r.mul(u).add(i.cross(r).mul(Ja(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Lg(e,l,t,n,a,o)})),Bg=ki((({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=en(Xo(t,r,Ao(r,s))).toVar();$i(h.equal(en(0)),(()=>{h.assign(en(s.z,0,s.x.negate()))})),h.assign(Qa(h));const p=en().toVar();return p.addAssign(i.element(0).mul(Fg({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),Yc({start:qi(1),end:e},(({i:e})=>{$i(e.greaterThanEqual(n),(()=>{Qc()}));const t=ji(a.mul(ji(e))).toVar();p.addAssign(i.element(e).mul(Fg({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(Fg({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))})),nn(p,1)})),Dg=[.125,.215,.35,.446,.526,.582],Ig=20,Vg=new ie(-1,1,1,-1,0,1),Ug=new ne(90,1),Og=new e;let kg=null,Gg=0,zg=0;const $g=(1+Math.sqrt(5))/2,Hg=1/$g,Wg=[new r(-$g,Hg,0),new r($g,Hg,0),new r(-Hg,0,$g),new r(Hg,0,$g),new r(0,$g,-Hg),new r(0,$g,Hg),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],jg=new r,qg=new WeakMap,Xg=[3,1,5,0,4,2],Kg=Mg(ju(),Wu("faceIndex")).normalize(),Yg=en(Kg.x,Kg.y,Kg.z);class Qg{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={}){const{size:n=256,position:a=jg,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){console.warn("THREE.PMREMGenerator: .fromScene() called before the backend is initialized. Try using .fromSceneAsync() instead.");const n=o||this._allocateTargets();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}kg=this._renderer.getRenderTarget(),Gg=this._renderer.getActiveCubeFace(),zg=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTargets();return u.depthBuffer=!0,this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){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=tm(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=rm(),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===w||e.mapping===E?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=Dg[o-e+4-1]:0===o&&(u=0),s.push(u);const l=1/(a-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,x=new Float32Array(m*g*p),b=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=Xg[e];x.set(s,m*g*i),b.set(h,f*g*i);const n=[i,i,i,i,i,i];T.set(n,y*g*i)}const _=new ue;_.setAttribute("position",new le(x,m)),_.setAttribute("uv",new le(b,f)),_.setAttribute("faceIndex",new le(T,y)),t.push(_),i.push(new W(_,null)),n>4&&n--}return{lodPlanes:t,sizeLods:r,sigmas:s,lodMeshes:i}}(i)),this._blurMaterial=function(e,t,s){const i=il(new Array(Ig).fill(0)),n=Zn(new r(0,1,0)),a=Zn(0),o=ji(Ig),u=Zn(0),l=Zn(1),d=Zu(null),c=Zn(0),h=ji(1/t),p=ji(1/s),g=ji(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:Yg,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=em("blur");return f.fragmentNode=Bg({...m,latitudinal:u.equal(1)}),qg.set(f,m),f}(i,e,t)}return i}async _compileMaterial(e){const t=new W(this._lodPlanes[0],e);await this._renderer.compile(t,Vg)}_sceneToCubeUV(e,t,r,s,i){const n=Ug;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Og),u.autoClear=!1;let d=this._backgroundBox;if(null===d){const e=new te({name:"PMREM.Background",side:N,depthWrite:!1,depthTest:!1});d=new W(new H,e)}let c=!1;const h=e.background;h?h.isColor&&(d.material.color.copy(h),e.background=null,c=!0):(d.material.color.copy(Og),c=!0),u.setRenderTarget(s),u.clear(),c&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;Jg(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=h}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===w||e.mapping===E;s?null===this._cubemapMaterial&&(this._cubemapMaterial=tm(e)):null===this._equirectMaterial&&(this._equirectMaterial=rm(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;Jg(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Vg)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodPlanes.length;for(let t=1;tIg&&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-x),3*x,2*x),o.setRenderTarget(t),o.render(l,Vg)}}function Zg(e,t,r){const s=new ae(e,t,r);return s.texture.mapping=oe,s.texture.name="PMREM.cubeUv",s.texture.isPMREMTexture=!0,s.scissorTest=!0,s}function Jg(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function em(e){const t=new $h;return t.depthTest=!1,t.depthWrite=!1,t.blending=k,t.name=`PMREM_${e}`,t}function tm(e){const t=em("cubemap");return t.fragmentNode=hd(e,Yg),t}function rm(e){const t=em("equirect");return t.fragmentNode=Zu(e,sp(Yg),0),t}const sm=new WeakMap;function im(e,t,r){const s=function(e){let t=sm.get(e);void 0===t&&(t=new WeakMap,sm.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class nm extends Ks{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 pe;s.isRenderTargetTexture=!0,this._texture=Zu(s),this._width=Zn(0),this._height=Zn(0),this._maxMip=Zn(0),this.updateBeforeType=Us.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(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:im(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new Qg(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this)),t=ad.mul(en(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Pg(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const am=Vi(nm).setParameterLength(1,3),om=new WeakMap;class um extends sh{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=om.get(e);void 0===s&&(s=am(e),om.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Bd:Ql,i=r.context(lm(bn,s)).mul(nd),n=r.context(dm(Zl)).mul(Math.PI).mul(nd),a=Pu(i),o=Pu(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(lm(vn,Jl)).mul(nd),t=Pu(e);u.addAssign(t)}}}const lm=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=zl.negate().reflect(t),r=e.mul(e).mix(r,t).normalize(),r=r.transformDirection(cl)),r),getTextureLevel:()=>e}},dm=e=>({getUV:()=>e,getTextureLevel:()=>ji(1)}),cm=new ge;class hm extends $h{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(cm),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new um(t):null}setupLightingModel(){return new gg}setupSpecular(){const e=Do(en(.04),yn.rgb,Tn);Ln.assign(e),Fn.assign(1)}setupVariants(){const e=this.metalnessNode?ji(this.metalnessNode):tc;Tn.assign(e);let t=this.roughnessNode?ji(this.roughnessNode):ec;t=Ep({roughness:t}),bn.assign(t),this.setupSpecular(),yn.assign(nn(yn.rgb.mul(e.oneMinus()),yn.a))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const pm=new me;class gm extends hm{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(pm),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?ji(this.iorNode):mc;On.assign(e),Ln.assign(Do(To(Co(On.sub(1).div(On.add(1))).mul(Qd),en(1)).mul(Yd),yn.rgb,Tn)),Fn.assign(Do(Yd,1,Tn))}setupLightingModel(){return new gg(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?ji(this.clearcoatNode):sc,t=this.clearcoatRoughnessNode?ji(this.clearcoatRoughnessNode):ic;_n.assign(e),vn.assign(Ep({roughness:t}))}if(this.useSheen){const e=this.sheenNode?en(this.sheenNode):oc,t=this.sheenRoughnessNode?ji(this.sheenRoughnessNode):uc;Nn.assign(e),Sn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?ji(this.iridescenceNode):dc,t=this.iridescenceIORNode?ji(this.iridescenceIORNode):cc,r=this.iridescenceThicknessNode?ji(this.iridescenceThicknessNode):hc;wn.assign(e),En.assign(t),An.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?Yi(this.anisotropyNode):lc).toVar();Cn.assign(e.length()),$i(Cn.equal(0),(()=>{e.assign(Yi(1,0))})).Else((()=>{e.divAssign(Yi(Cn)),Cn.assign(Cn.saturate())})),Rn.assign(Cn.pow2().mix(bn.pow2(),1)),Mn.assign(Ld[0].mul(e.x).add(Ld[1].mul(e.y))),Pn.assign(Ld[1].mul(e.x).sub(Ld[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?ji(this.transmissionNode):pc,t=this.thicknessNode?ji(this.thicknessNode):gc,r=this.attenuationDistanceNode?ji(this.attenuationDistanceNode):fc,s=this.attenuationColorNode?en(this.attenuationColorNode):yc;if(kn.assign(e),Gn.assign(t),zn.assign(r),$n.assign(s),this.useDispersion){const e=this.dispersionNode?ji(this.dispersionNode):Sc;Hn.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?en(this.clearcoatNormalNode):nc}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 mm extends gg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(Ql.mul(a)).normalize(),h=ji(zl.dot(c.negate()).saturate().pow(l).mul(d)),p=en(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class fm extends gm{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=ji(.1),this.thicknessAmbientNode=ji(0),this.thicknessAttenuationNode=ji(.1),this.thicknessPowerNode=ji(2),this.thicknessScaleNode=ji(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new mm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,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 ym=ki((({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=Yi(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xd("gradientMap","texture").context({getUV:()=>i});return en(e.r)}{const e=i.fwidth().mul(.5);return Do(en(.7),en(1),Oo(ji(.7).sub(e.x),ji(.7).add(e.x),i.x))}}));class xm extends hp{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=ym({normal:jl,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(yp({diffuseColor:yn.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(yp({diffuseColor:yn}))),s.indirectDiffuse.mulAssign(t)}}const bm=new fe;class Tm extends $h{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(bm),this.setValues(e)}setupLightingModel(){return new xm}}class _m extends Ks{static get type(){return"MatcapUVNode"}constructor(){super("vec2")}setup(){const e=en(zl.z,0,zl.x.negate()).normalize(),t=zl.cross(e);return Yi(e.dot(Ql),t.dot(Ql)).mul(.495).add(.5)}}const vm=Ui(_m),Nm=new ye;class Sm extends $h{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Nm),this.setValues(e)}setupVariants(e){const t=vm;let r;r=e.material.matcap?xd("matcap","texture").context({getUV:()=>t}):en(Do(.2,.8,t.y)),yn.rgb.mulAssign(r.rgb)}}class wm extends Ks{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 ln(e,s,s.negate(),e).mul(r)}{const e=t,s=cn(nn(1,0,0,0),nn(0,eo(e.x),Ja(e.x).negate(),0),nn(0,Ja(e.x),eo(e.x),0),nn(0,0,0,1)),i=cn(nn(eo(e.y),0,Ja(e.y),0),nn(0,1,0,0),nn(Ja(e.y).negate(),0,eo(e.y),0),nn(0,0,0,1)),n=cn(nn(eo(e.z),Ja(e.z).negate(),0,0),nn(Ja(e.z),eo(e.z),0,0),nn(0,0,1,0),nn(0,0,0,1));return s.mul(i).mul(n).mul(nn(r,1)).xyz}}}const Em=Vi(wm).setParameterLength(2),Am=new xe;class Rm extends $h{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Am),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,s=this.sizeAttenuation,{positionNode:i,rotationNode:n,scaleNode:a}=this,o=Ll.mul(en(i||0));let u=Yi(wl[0].xyz.length(),wl[1].xyz.length());if(null!==a&&(u=u.mul(Yi(a))),!1===s)if(r.isPerspectiveCamera)u=u.mul(o.z.negate());else{const e=ji(2).div(ll.element(1).element(1));u=u.mul(e.mul(2))}let l=Il.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>Bi(new yu(e,t,r)))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=ji(n||ac),c=Em(l,d);return nn(o.xy.add(c),o.zw)}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)}}const Cm=new be;class Mm extends Rm{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Cm),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ll.mul(en(e||Vl)).xyz}setupVertex(e){const t=super.setupVertex(e);if(!0!==e.material.isNodeMaterial)return t;const{rotationNode:r,scaleNode:s,sizeNode:i}=this,n=Il.xy.toVar(),a=gh.z.div(gh.w);if(r&&r.isNode){const e=ji(r);n.assign(Em(n,e))}let o=null!==i?Yi(i):Nc;return!0===this.sizeAttenuation&&(o=o.mul(o.div(Gl.z.negate()))),s&&s.isNode&&(o=o.mul(Yi(s))),n.mulAssign(o.mul(2)),n.assign(n.div(gh.z)),n.y.assign(n.y.mul(a)),n.assign(n.mul(t.w)),t.addAssign(nn(n,0,0)),t}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}class Pm extends hp{constructor(){super(),this.shadowNode=ji(1).toVar("shadowMask")}direct({lightNode:e}){this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){yn.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(yn.rgb)}}const Lm=new Te;class Fm extends $h{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(Lm),this.setValues(e)}setupLightingModel(){return new Pm}}const Bm=mn("vec3"),Dm=mn("vec3"),Im=mn("vec3");class Vm extends hp{constructor(){super()}start(e){const{material:t,context:r}=e,s=mn("vec3"),i=mn("vec3");$i(gl.sub(Ol).length().greaterThan(Cl.mul(2)),(()=>{s.assign(gl),i.assign(Ol)})).Else((()=>{s.assign(Ol),i.assign(gl)}));const n=i.sub(s),a=Zn("int").onRenderUpdate((({material:e})=>e.steps)),o=n.length().div(a).toVar(),u=n.normalize().toVar(),l=ji(0).toVar(),d=en(1).toVar();t.offsetNode&&l.addAssign(t.offsetNode.mul(o)),Yc(a,(()=>{const i=s.add(u.mul(l)),n=cl.mul(nn(i,1)).xyz;let a;null!==t.depthNode&&(Dm.assign(Dh(Mh(n.z,ol,ul))),r.sceneDepthNode=Dh(t.depthNode).toVar()),r.positionWorld=i,r.shadowPositionWorld=i,r.positionView=n,Bm.assign(0),t.scatteringNode&&(a=t.scatteringNode({positionRay:i})),super.start(e),a&&Bm.mulAssign(a);const c=Bm.mul(.01).negate().mul(o).exp();d.mulAssign(c),l.addAssign(o)})),Im.addAssign(d.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?$i(r.greaterThanEqual(Dm),(()=>{Bm.addAssign(e)})):Bm.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul($p({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Im)}}class Um extends $h{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=N,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Vm}}class Om{constructor(e,t){this.nodes=e,this.info=t,this._context="undefined"!=typeof self?self:null,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}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class km{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().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}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}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),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;o?p=a.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,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1&&(r+=e.uuid+","),r+=e.receiveShadow+",",_s(r)}get needsGeometryUpdate(){return this.geometry.id!==this.object.geometry.id}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Ns(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Ns(e,1)),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.onDispose()}}const $m=[];class Hm{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,a,o){const u=this.getChainMap(o);$m[0]=e,$m[1]=t,$m[2]=n,$m[3]=i;let l=u.get($m);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set($m,l)):(l.updateClipping(a),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,a,o)):l.version=t.version)),$m.length=0,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new km)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new zm(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.delete(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Wm{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=null;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 jm=1,qm=2,Xm=3,Km=4,Ym=16;class Qm extends Wm{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===jm?this.backend.createAttribute(e):t===qm?this.backend.createIndexAttribute(e):t===Xm?this.backend.createStorageAttribute(e):t===Km&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{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,Xm):this.updateAttribute(e,jm);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,qm);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,Km)}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=Jm(t),e.set(t,r)):r.version!==Zm(t)&&(this.attributes.delete(r),r=Jm(t),e.set(t,r)),s=r}return s}}class tf{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},this.compute={calls:0,frameCalls:0,timestamp: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.")}reset(){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 rf{constructor(e){this.cacheKey=e,this.usedTimes=0}}class sf extends rf{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class nf extends rf{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let af=0;class of{constructor(e,t,r,s=null,i=null){this.id=af++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class uf extends Wm{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 a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new of(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.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(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new of(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new of(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}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 nf(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 sf(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 lf extends Wm{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?Km:Xm;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(t.isNodeUniformsGroup){if(!1===this.nodes.updateGroup(t))continue}if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?Km:Xm;this.attributes.update(e,r)}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 o=t.update(),u=t.texture;o&&this.textures.updateTexture(u);const l=r.get(u);if(void 0!==l.externalTexture||e.isDefaultTexture?i=!1:(n=10*n+u.id,a+=u.version),!0===r.isWebGPUBackend&&void 0===l.texture&&void 0===l.externalTexture&&(console.error("Bindings._update: binding should be available:",t,o,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,a)}}function df(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function cf(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 hf(e){return(e.transmission>0||e.transmissionNode)&&e.side===Se&&!1===e.forceSinglePass}class pf{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,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0?(hf(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0?(hf(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||df),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||cf),this.transparent.length>1&&this.transparent.sort(t||cf)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=!0===e.multiview&&a.depth>1?new Ee:new D,l.format=e.stencilBuffer?Ae:Re,l.type=e.stencilBuffer?Ce:b,l.image.width=o,l.image.height=u,l.image.depth=a.depth,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isDepthArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.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};if(!0!==e.isXRRenderTarget){for(let t=0;t1,c&&(r.needsUpdate=!0),this.updateTexture(r,h)}l&&this.updateTexture(l,h)}if(!0!==r.initialized){r.initialized=!0;const t=()=>{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)};e.addEventListener("dispose",t)}r.version=e.version}getSize(e,t=Nf){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!0===e.isCompressedTexture||e.generateMipmaps}_destroyTexture(e){!0===this.has(e)&&(this.backend.destroySampler(e),this.backend.destroyTexture(e),this.delete(e),this.info.memory.textures--)}}class wf 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 Ef extends gn{static get type(){return"ParameterNode"}constructor(e,t=null){super(e,t),this.isParameterNode=!0}getHash(){return this.uuid}generate(){return this.name}}class Af extends js{static get type(){return"StackNode"}constructor(e=null){super(),this.nodes=[],this.outputNode=null,this.parent=e,this._currentCond=null,this._expressionNode=null,this.isStackNode=!0}getNodeType(e){return this.outputNode?this.outputNode.getNodeType(e):"void"}getMemberType(e,t){return this.outputNode?this.outputNode.getMemberType(e,t):"void"}add(e){return this.nodes.push(e),this}If(e,t){const r=new Fi(t);return this._currentCond=Xo(e,r),this.add(this._currentCond)}ElseIf(e,t){const r=new Fi(t),s=Xo(e,r);return this._currentCond.elseNode=s,this._currentCond=s,this}Else(e){return this._currentCond.elseNode=new Fi(e),this}Switch(e){return this._expressionNode=Bi(e),this}Case(...e){const t=[];if(!(e.length>=2))throw new Error("TSL: Invalid parameter length. Case() requires at least two parameters.");for(let r=0;r"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1}))),this.name=t,this.isStructLayoutNode=!0}getLength(){let e=0;for(const t of this.membersLayout)e+=Ms(t.type);return e}getMemberType(e,t){const r=this.membersLayout.find((e=>e.name===t));return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Mf extends js{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structLayoutNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structLayoutNode.getNodeType(e)}getMemberType(e,t){return this.structLayoutNode.getMemberType(e,t)}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structLayoutNode.membersLayout,this.values)}`,this),t.name}}class Pf extends js{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(e){const t=e.getNodeProperties(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;t{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)})),Vf=(e,t)=>Ro(la(4,e.mul(ua(1,e))),t),Uf=ki((([e])=>e.fract().sub(.5).abs())).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),Of=ki((([e])=>en(Uf(e.z.add(Uf(e.y.mul(1)))),Uf(e.z.add(Uf(e.x.mul(1)))),Uf(e.y.add(Uf(e.x.mul(1))))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),kf=ki((([e,t,r])=>{const s=en(e).toVar(),i=ji(1.4).toVar(),n=ji(0).toVar(),a=en(s).toVar();return Yc({start:ji(0),end:ji(3),type:"float",condition:"<="},(()=>{const e=en(Of(a.mul(2))).toVar();s.addAssign(e.add(r.mul(ji(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=ji(Uf(s.z.add(Uf(s.x.add(Uf(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)})),n})).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class Gf extends js{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 a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFnCall=r=s(...t)}return r}}const zf=Vi(Gf),$f=e=>(...t)=>zf(e,...t),Hf=Zn(0).setGroup(Kn).onRenderUpdate((e=>e.time)),Wf=Zn(0).setGroup(Kn).onRenderUpdate((e=>e.deltaTime)),jf=Zn(0,"uint").setGroup(Kn).onRenderUpdate((e=>e.frameId)),qf=ki((([e,t,r=Yi(.5)])=>Em(e.sub(r),t).add(r))),Xf=ki((([e,t,r=Yi(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))})),Kf=ki((({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=wl.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=wl;const i=cl.mul(s);return Pi(t)&&(i[0][0]=wl[0].length(),i[0][1]=0,i[0][2]=0),Pi(r)&&(i[1][0]=0,i[1][1]=wl[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ll.mul(i).mul(Vl)})),Yf=ki((([e=null])=>{const t=Dh();return Dh(Ah(e)).sub(t).lessThan(0).select(ch,e)}));class Qf extends js{static get type(){return"SpriteSheetUVNode"}constructor(e,t=ju(),r=ji(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(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=r.reciprocal(),l=Yi(a,o);return t.add(l).mul(u)}}const Zf=Vi(Qf).setParameterLength(3);class Jf extends js{static get type(){return"TriplanarTexturesNode"}constructor(e,t=null,r=null,s=ji(1),i=Vl,n=ql){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 a=n.abs().normalize();a=a.div(a.dot(en(1)));const o=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=Zu(d,o).mul(a.x),g=Zu(c,u).mul(a.y),m=Zu(h,l).mul(a.z);return oa(p,g,m)}}const ey=Vi(Jf).setParameterLength(1,6),ty=new Pe,ry=new r,sy=new r,iy=new r,ny=new a,ay=new r(0,0,-1),oy=new s,uy=new r,ly=new r,dy=new s,cy=new t,hy=new ae,py=ch.flipX();hy.depthTexture=new D(1,1);let gy=!1;class my extends Qu{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||hy.texture,py),this._reflectorBaseNode=e.reflector||new fy(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=Bi(new my({defaultTexture:hy.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}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class fy extends js{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Le,resolution:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1}=t;this.textureNode=e,this.target=r,this.resolution=s,this.generateMipmaps=i,this.bounces=n,this.depth=a,this.updateBeforeType=n?Us.RENDER:Us.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1}_updateResolution(e,t){const r=this.resolution;t.getDrawingBufferSize(cy),e.setSize(Math.round(cy.width*r),Math.round(cy.height*r))}setup(e){return this._updateResolution(hy,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}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 ae(0,0,{type:he}),!0===this.generateMipmaps&&(t.texture.minFilter=Fe,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new D),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&gy)return!1;gy=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(cy),this._updateResolution(o,s),sy.setFromMatrixPosition(n.matrixWorld),iy.setFromMatrixPosition(r.matrixWorld),ny.extractRotation(n.matrixWorld),ry.set(0,0,1),ry.applyMatrix4(ny),uy.subVectors(sy,iy);if(!0===uy.dot(ry)>0&&!1===this.forceUpdate)return;uy.reflect(ry).negate(),uy.add(sy),ny.extractRotation(r.matrixWorld),ay.set(0,0,-1),ay.applyMatrix4(ny),ay.add(iy),ly.subVectors(sy,ay),ly.reflect(ry).negate(),ly.add(sy),a.coordinateSystem=r.coordinateSystem,a.position.copy(uy),a.up.set(0,1,0),a.up.applyMatrix4(ny),a.up.reflect(ry),a.lookAt(ly),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),ty.setFromNormalAndCoplanarPoint(ry,sy),ty.applyMatrix4(a.matrixWorldInverse),oy.set(ty.normal.x,ty.normal.y,ty.normal.z,ty.constant);const u=a.projectionMatrix;dy.x=(Math.sign(oy.x)+u.elements[8])/u.elements[0],dy.y=(Math.sign(oy.y)+u.elements[9])/u.elements[5],dy.z=-1,dy.w=(1+u.elements[10])/u.elements[14],oy.multiplyScalar(1/oy.dot(dy));u.elements[2]=oy.x,u.elements[6]=oy.y,u.elements[10]=s.coordinateSystem===d?oy.z-0:oy.z+1-0,u.elements[14]=oy.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const l=s.getRenderTarget(),c=s.getMRT(),h=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0,s.render(t,a),s.setMRT(c),s.setRenderTarget(l),s.autoClear=h,i.visible=!0,gy=!1,this.forceUpdate=!1}}const yy=new ie(-1,1,1,-1,0,1);class xy extends ue{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Be([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Be(t,2))}}const by=new xy;class Ty extends W{constructor(e=null){super(by,e),this.camera=yy,this.isQuadMesh=!0}async renderAsync(e){return e.renderAsync(this,yy)}render(e){e.render(this,yy)}}const _y=new t;class vy extends Qu{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:he}){const i=new ae(t,r,s);super(i.texture,ju()),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 Ty(new $h),this.updateBeforeType=Us.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(_y);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 Qu(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const Ny=(e,...t)=>Bi(new vy(Bi(e),...t)),Sy=ki((([e,t,r],s)=>{let i;s.renderer.coordinateSystem===d?(e=Yi(e.x,e.y.oneMinus()).mul(2).sub(1),i=nn(en(e,t),1)):i=nn(en(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=nn(r.mul(i));return n.xyz.div(n.w)})),wy=ki((([e,t])=>{const r=t.mul(nn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return Yi(s.x,s.y.oneMinus())})),Ey=ki((([e,t,r])=>{const s=Xu(Ju(t)),i=Qi(e.mul(s)).toVar(),n=Ju(t,i).toVar(),a=Ju(t,i.sub(Qi(2,0))).toVar(),o=Ju(t,i.sub(Qi(1,0))).toVar(),u=Ju(t,i.add(Qi(1,0))).toVar(),l=Ju(t,i.add(Qi(2,0))).toVar(),d=Ju(t,i.add(Qi(0,2))).toVar(),c=Ju(t,i.add(Qi(0,1))).toVar(),h=Ju(t,i.sub(Qi(0,1))).toVar(),p=Ju(t,i.sub(Qi(0,2))).toVar(),g=no(ua(ji(2).mul(o).sub(a),n)).toVar(),m=no(ua(ji(2).mul(u).sub(l),n)).toVar(),f=no(ua(ji(2).mul(c).sub(d),n)).toVar(),y=no(ua(ji(2).mul(h).sub(p),n)).toVar(),x=Sy(e,n,r).toVar(),b=g.lessThan(m).select(x.sub(Sy(e.sub(Yi(ji(1).div(s.x),0)),o,r)),x.negate().add(Sy(e.add(Yi(ji(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(x.sub(Sy(e.add(Yi(0,ji(1).div(s.y))),c,r)),x.negate().add(Sy(e.sub(Yi(0,ji(1).div(s.y))),h,r)));return Qa(Ao(b,T))}));class Ay extends M{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Ry extends le{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Cy extends js{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const My=Ui(Cy),Py=new S,Ly=new a;class Fy extends js{static get type(){return"SceneNode"}constructor(e=Fy.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===Fy.BACKGROUND_BLURRINESS?s=md("backgroundBlurriness","float",r):t===Fy.BACKGROUND_INTENSITY?s=md("backgroundIntensity","float",r):t===Fy.BACKGROUND_ROTATION?s=Zn("mat4").label("backgroundRotation").setGroup(Kn).onRenderUpdate((()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==De?(Py.copy(r.backgroundRotation),Py.x*=-1,Py.y*=-1,Py.z*=-1,Ly.makeRotationFromEuler(Py)):Ly.identity(),Ly})):console.error("THREE.SceneNode: Unknown scope:",t),s}}Fy.BACKGROUND_BLURRINESS="backgroundBlurriness",Fy.BACKGROUND_INTENSITY="backgroundIntensity",Fy.BACKGROUND_ROTATION="backgroundRotation";const By=Ui(Fy,Fy.BACKGROUND_BLURRINESS),Dy=Ui(Fy,Fy.BACKGROUND_INTENSITY),Iy=Ui(Fy,Fy.BACKGROUND_ROTATION);class Vy extends Qu{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.isStorageTextureNode=!0,this.access=ks.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(ks.READ_WRITE)}toReadOnly(){return this.setAccess(ks.READ_ONLY)}toWriteOnly(){return this.setAccess(ks.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s}=t,i=super.generate(e,"property"),n=r.build(e,"uvec2"),a=s.build(e,"vec4"),o=e.generateTextureStore(e,i,n,a);e.addLineFlowCode(o,this)}}const Uy=Vi(Vy).setParameterLength(1,3),Oy=ki((({texture:e,uv:t})=>{const r=1e-4,s=en().toVar();return $i(t.x.lessThan(r),(()=>{s.assign(en(1,0,0))})).ElseIf(t.y.lessThan(r),(()=>{s.assign(en(0,1,0))})).ElseIf(t.z.lessThan(r),(()=>{s.assign(en(0,0,1))})).ElseIf(t.x.greaterThan(.9999),(()=>{s.assign(en(-1,0,0))})).ElseIf(t.y.greaterThan(.9999),(()=>{s.assign(en(0,-1,0))})).ElseIf(t.z.greaterThan(.9999),(()=>{s.assign(en(0,0,-1))})).Else((()=>{const r=.01,i=e.sample(t.add(en(-.01,0,0))).r.sub(e.sample(t.add(en(r,0,0))).r),n=e.sample(t.add(en(0,-.01,0))).r.sub(e.sample(t.add(en(0,r,0))).r),a=e.sample(t.add(en(0,0,-.01))).r.sub(e.sample(t.add(en(0,0,r))).r);s.assign(en(i,n,a))})),s.normalize()}));class ky extends Qu{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return en(.5,.5,.5)}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!e.isFlipY()||!0!==r.isRenderTargetTexture&&!0!==r.isFramebufferTexture||(t=this.sampler?t.flipY():t.setY(qi(Xu(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,"vec3")}normal(e){return Oy({texture:this,uv:e})}}const Gy=Vi(ky).setParameterLength(1,3);class zy extends gd{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 $y=new WeakMap;class Hy extends Ks{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Us.OBJECT,this.updateAfterType=Us.OBJECT,this.previousModelWorldMatrix=Zn(new a),this.previousProjectionMatrix=Zn(new a).setGroup(Kn),this.previousCameraViewMatrix=Zn(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=jy(r);this.previousModelWorldMatrix.value.copy(s);const i=Wy(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,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}){jy(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ll:Zn(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ll).mul(Vl),s=this.previousProjectionMatrix.mul(t).mul(Ul),i=r.xy.div(r.w),n=s.xy.div(s.w);return ua(i,n)}}function Wy(e){let t=$y.get(e);return void 0===t&&(t={},$y.set(e,t)),t}function jy(e,t=0){const r=Wy(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const qy=Ui(Hy),Xy=ki((([e,t])=>To(1,e.oneMinus().div(t)).oneMinus())).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Ky=ki((([e,t])=>To(e.div(t.oneMinus()),1))).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Yy=ki((([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus())).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Qy=ki((([e,t])=>Do(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),vo(.5,e)))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Zy=ki((([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return nn(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"}]}),Jy=ki((([e])=>sx(e.rgb))),ex=ki((([e,t=ji(1)])=>t.mix(sx(e.rgb),e.rgb))),tx=ki((([e,t=ji(1)])=>{const r=oa(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 Do(e.rgb,s,i)})),rx=ki((([e,t=ji(1)])=>{const r=en(.57735,.57735,.57735),s=t.cos();return en(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Eo(r,e.rgb).mul(s.oneMinus())))))})),sx=(e,t=en(c.getLuminanceCoefficients(new r)))=>Eo(e,t),ix=ki((([e,t=en(1),s=en(0),i=en(1),n=ji(1),a=en(c.getLuminanceCoefficients(new r,de))])=>{const o=e.rgb.dot(en(a)),u=_o(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return $i(u.r.greaterThan(0),(()=>{u.r.assign(l.r)})),$i(u.g.greaterThan(0),(()=>{u.g.assign(l.g)})),$i(u.b.greaterThan(0),(()=>{u.b.assign(l.b)})),u.assign(o.add(u.sub(o).mul(n))),nn(u.rgb,e.a)}));class nx extends Ks{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 ax=Vi(nx).setParameterLength(2),ox=new t;class ux extends Qu{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 lx extends ux{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 dx extends Ks{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 D;i.isRenderTargetTexture=!0,i.name="depth";const n=new ae(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:he,...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=Zn(0),this._cameraFar=Zn(0),this._mrt=null,this._layers=null,this._resolution=1,this.isPassNode=!0,this.updateBeforeType=Us.FRAME}setResolution(e){return this._resolution=e,this}getResolution(){return this._resolution}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}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=Bi(new lx(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=Bi(new lx(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=Ph(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=Ch(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.texture.type=e.getColorBufferType(),this.scope===dx.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),ox.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(ox)),this._pixelRatio=i,this.setSize(ox.width,ox.height);const a=t.getRenderTarget(),o=t.getMRT(),u=s.layers.mask;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.render(r,s),t.setRenderTarget(a),t.setMRT(o),s.layers.mask=u}setSize(e,t){this._width=e,this._height=t;const r=this._width*this._pixelRatio*this._resolution,s=this._height*this._pixelRatio*this._resolution;this.renderTarget.setSize(r,s)}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}dx.COLOR="color",dx.DEPTH="depth";class cx extends dx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(dx.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,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)})),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new $h;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=N;const t=ql.negate(),r=ll.mul(Ll),s=ji(1),i=r.mul(nn(Vl,1)),n=r.mul(nn(Vl.add(t),1)),a=Qa(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=nn(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 hx=ki((([e,t])=>e.mul(t).clamp())).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),px=ki((([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"}]}),gx=ki((([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"}]}),mx=ki((([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)})),fx=ki((([e,t])=>{const r=dn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=dn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=mx(e),(e=s.mul(e)).clamp()})).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),yx=dn(en(1.6605,-.1246,-.0182),en(-.5876,1.1329,-.1006),en(-.0728,-.0083,1.1187)),xx=dn(en(.6274,.0691,.0164),en(.3293,.9195,.088),en(.0433,.0113,.8956)),bx=ki((([e])=>{const t=en(e).toVar(),r=en(t.mul(t)).toVar(),s=en(r.mul(r)).toVar();return ji(15.5).mul(s.mul(r)).sub(la(40.14,s.mul(t))).add(la(31.96,s).sub(la(6.868,r.mul(t))).add(la(.4298,r).add(la(.1191,t).sub(.00232))))})),Tx=ki((([e,t])=>{const r=en(e).toVar(),s=dn(en(.856627153315983,.137318972929847,.11189821299995),en(.0951212405381588,.761241990602591,.0767994186031903),en(.0482516061458583,.101439036467562,.811302368396859)),i=dn(en(1.1271005818144368,-.1413297634984383,-.14132976349843826),en(-.11060664309660323,1.157823702216272,-.11060664309660294),en(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=ji(-12.47393),a=ji(4.026069);return r.mulAssign(t),r.assign(xx.mul(r)),r.assign(s.mul(r)),r.assign(_o(r,1e-10)),r.assign(ja(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(Io(r,0,1)),r.assign(bx(r)),r.assign(i.mul(r)),r.assign(Ro(_o(en(0),r),en(2.2))),r.assign(yx.mul(r)),r.assign(Io(r,0,1)),r})).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),_x=ki((([e,t])=>{const r=ji(.76),s=ji(.15);e=e.mul(t);const i=To(e.r,To(e.g,e.b)),n=Xo(i.lessThan(.08),i.sub(la(6.25,i.mul(i))),.04);e.subAssign(n);const a=_o(e.r,_o(e.g,e.b));$i(a.lessThan(r),(()=>e));const o=ua(1,r),u=ua(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=ua(1,da(1,s.mul(a.sub(u)).add(1)));return Do(e,en(u),l)})).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class vx extends js{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 Nx=Vi(vx).setParameterLength(1,3);class Sx extends vx{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 a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const wx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Ex extends js{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:ji()}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?Ds(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 Ax=Vi(Ex).setParameterLength(1);class Rx 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 Cx{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 Mx=new Rx;class Px extends js{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new Rx,this._output=Ax(null),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]=Ax(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]=Ax(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 Cx(this),t=Mx.get("THREE"),r=Mx.get("TSL"),s=this.getMethod(),i=[e,this._local,Mx,()=>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:ji()}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=[_s(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return vs(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 Lx=Vi(Px).setParameterLength(1,2);function Fx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Gl.z).negate()}const Bx=ki((([e,t],r)=>{const s=Fx(r);return Oo(e,t,s)})),Dx=ki((([e],t)=>{const r=Fx(t);return e.mul(e,r,r).negate().exp().oneMinus()})),Ix=ki((([e,t])=>nn(t.toFloat().mix(Dn.rgb,e.toVec3()),Dn.a)));let Vx=null,Ux=null;class Ox extends js{static get type(){return"RangeNode"}constructor(e=ji(),t=ji()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=e.getTypeLength(Ps(this.minNode.value)),r=e.getTypeLength(Ps(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,a=e.getTypeLength(Ps(i)),o=e.getTypeLength(Ps(n));Vx=Vx||new s,Ux=Ux||new s,Vx.setScalar(0),Ux.setScalar(0),1===a?Vx.setScalar(i):i.isColor?Vx.set(i.r,i.g,i.b,1):Vx.set(i.x,i.y,i.z||0,i.w||0),1===o?Ux.setScalar(n):n.isColor?Ux.set(n.r,n.g,n.b,1):Ux.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;eBi(new Gx(e,t)),$x=zx("numWorkgroups","uvec3"),Hx=zx("workgroupId","uvec3"),Wx=zx("globalId","uvec3"),jx=zx("localId","uvec3"),qx=zx("subgroupSize","uint");const Xx=Vi(class extends js{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 Kx extends qs{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 Yx extends js{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e}label(e){return this.name=e,this}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return Bi(new Kx(this,e))}generate(e){return e.getScopedArray(this.name||`${this.scope}Array_${this.id}`,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class Qx extends js{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(1===r.length&&!0===r[0].isStackNode))return void 0===t.constNode&&(t.constNode=Uu(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}Qx.ATOMIC_LOAD="atomicLoad",Qx.ATOMIC_STORE="atomicStore",Qx.ATOMIC_ADD="atomicAdd",Qx.ATOMIC_SUB="atomicSub",Qx.ATOMIC_MAX="atomicMax",Qx.ATOMIC_MIN="atomicMin",Qx.ATOMIC_AND="atomicAnd",Qx.ATOMIC_OR="atomicOr",Qx.ATOMIC_XOR="atomicXor";const Zx=Vi(Qx),Jx=(e,t,r)=>Zx(e,t,r).toStack();let eb;function tb(e){eb=eb||new WeakMap;let t=eb.get(e);return void 0===t&&eb.set(e,t={}),t}function rb(e){const t=tb(e);return t.shadowMatrix||(t.shadowMatrix=Zn("mat4").setGroup(Kn).onRenderUpdate((()=>(!0!==e.castShadow&&e.shadow.updateMatrices(e),e.shadow.matrix))))}function sb(e,t=Ol){const r=rb(e).mul(t);return r.xyz.div(r.w)}function ib(e){const t=tb(e);return t.position||(t.position=Zn(new r).setGroup(Kn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld))))}function nb(e){const t=tb(e);return t.targetPosition||(t.targetPosition=Zn(new r).setGroup(Kn).onRenderUpdate(((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld))))}function ab(e){const t=tb(e);return t.viewPosition||(t.viewPosition=Zn(new r).setGroup(Kn).onRenderUpdate((({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)})))}const ob=e=>cl.transformDirection(ib(e).sub(nb(e))),ub=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},lb=new WeakMap;class db extends js{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=en().toVar(),this.totalSpecularNode=en().toVar(),this.outgoingLightNode=en().toVar(),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=[],t=this._lights;for(let r=0;re.sort(((e,t)=>e.id-t.id)))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Bi(e));else{let s=null;if(null!==r&&(s=ub(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;lb.has(e)?s=lb.get(e):(s=Bi(new r(e)),lb.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getDataFromNode(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=en(null!==l?l.mix(g,u):u),s.material.transparent=!0),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class cb extends js{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Us.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){hb.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Ol)}dispose(){this.updateBeforeType=Us.NONE}}const hb=mn("vec3","shadowPositionWorld");function pb(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 gb(e,t){return t=pb(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function mb(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 fb(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function yb(e,t){return t=fb(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function xb(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function bb(e,t,r){return r=yb(t,r=gb(e,r))}function Tb(e,t,r){mb(e,r),xb(t,r)}var _b=Object.freeze({__proto__:null,resetRendererAndSceneState:bb,resetRendererState:gb,resetSceneState:yb,restoreRendererAndSceneState:Tb,restoreRendererState:mb,restoreSceneState:xb,saveRendererAndSceneState:function(e,t,r={}){return r=fb(t,r=pb(e,r))},saveRendererState:pb,saveSceneState:fb});const vb=new WeakMap,Nb=ki((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Zu(e,t.xy).label("t_basic");return e.isDepthArrayTexture&&(s=s.depth(r)),s.compare(t.z)})),Sb=ki((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Zu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=md("mapSize","vec2",r).setGroup(Kn),a=md("radius","float",r).setGroup(Kn),o=Yi(1).div(n),u=o.x.negate().mul(a),l=o.y.negate().mul(a),d=o.x.mul(a),c=o.y.mul(a),h=u.div(2),p=l.div(2),g=d.div(2),m=c.div(2);return oa(i(t.xy.add(Yi(u,l)),t.z),i(t.xy.add(Yi(0,l)),t.z),i(t.xy.add(Yi(d,l)),t.z),i(t.xy.add(Yi(h,p)),t.z),i(t.xy.add(Yi(0,p)),t.z),i(t.xy.add(Yi(g,p)),t.z),i(t.xy.add(Yi(u,0)),t.z),i(t.xy.add(Yi(h,0)),t.z),i(t.xy,t.z),i(t.xy.add(Yi(g,0)),t.z),i(t.xy.add(Yi(d,0)),t.z),i(t.xy.add(Yi(h,m)),t.z),i(t.xy.add(Yi(0,m)),t.z),i(t.xy.add(Yi(g,m)),t.z),i(t.xy.add(Yi(u,c)),t.z),i(t.xy.add(Yi(0,c)),t.z),i(t.xy.add(Yi(d,c)),t.z)).mul(1/17)})),wb=ki((({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Zu(e,t);return e.isDepthArrayTexture&&(i=i.depth(s)),i.compare(r)},n=md("mapSize","vec2",r).setGroup(Kn),a=Yi(1).div(n),o=a.x,u=a.y,l=t.xy,d=Za(l.mul(n).add(.5));return l.subAssign(d.mul(a)),oa(i(l,t.z),i(l.add(Yi(o,0)),t.z),i(l.add(Yi(0,u)),t.z),i(l.add(a),t.z),Do(i(l.add(Yi(o.negate(),0)),t.z),i(l.add(Yi(o.mul(2),0)),t.z),d.x),Do(i(l.add(Yi(o.negate(),u)),t.z),i(l.add(Yi(o.mul(2),u)),t.z),d.x),Do(i(l.add(Yi(0,u.negate())),t.z),i(l.add(Yi(0,u.mul(2))),t.z),d.y),Do(i(l.add(Yi(o,u.negate())),t.z),i(l.add(Yi(o,u.mul(2))),t.z),d.y),Do(Do(i(l.add(Yi(o.negate(),u.negate())),t.z),i(l.add(Yi(o.mul(2),u.negate())),t.z),d.x),Do(i(l.add(Yi(o.negate(),u.mul(2))),t.z),i(l.add(Yi(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)})),Eb=ki((({depthTexture:e,shadowCoord:t,depthLayer:r})=>{const s=ji(1).toVar();let i=Zu(e).sample(t.xy);(e.isDepthArrayTexture||e.isDataArrayTexture)&&(i=i.depth(r)),i=i.rg;const n=vo(t.z,i.x);return $i(n.notEqual(ji(1)),(()=>{const e=t.z.sub(i.x),r=_o(0,i.y.mul(i.y));let a=r.div(r.add(e.mul(e)));a=Io(ua(a,.3).div(.95-.3)),s.assign(Io(_o(n,a)))})),s})),Ab=ki((([e,t,r])=>{let s=Ol.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s})),Rb=e=>{let t=vb.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=md("near","float",t).setGroup(Kn),s=md("far","float",t).setGroup(Kn),i=bl(e);return Ab(i,r,s)})(e):null;t=new $h,t.colorNode=nn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,vb.set(e,t)}return t},Cb=new km,Mb=[],Pb=(e,t,r,s)=>{Mb[0]=e,Mb[1]=t;let i=Cb.get(Mb);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ie)&&(s&&(Fs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,Cb.set(Mb,i)),Mb[0]=null,Mb[1]=null,i},Lb=ki((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=ji(0).toVar("meanVertical"),a=ji(0).toVar("squareMeanVertical"),o=e.lessThanEqual(ji(1)).select(ji(0),ji(2).div(e.sub(1))),u=e.lessThanEqual(ji(1)).select(ji(0),ji(-1));Yc({start:qi(0),end:qi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add(ji(e).mul(o));let d=s.sample(oa(ph.xy,Yi(0,l).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))})),n.divAssign(e),a.divAssign(e);const l=qa(a.sub(n.mul(n)));return Yi(n,l)})),Fb=ki((({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=ji(0).toVar("meanHorizontal"),a=ji(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(ji(1)).select(ji(0),ji(2).div(e.sub(1))),u=e.lessThanEqual(ji(1)).select(ji(0),ji(-1));Yc({start:qi(0),end:qi(e),type:"int",condition:"<"},(({i:e})=>{const l=u.add(ji(e).mul(o));let d=s.sample(oa(ph.xy,Yi(l,0).mul(t)).div(r));(s.value.isDepthArrayTexture||s.value.isDataArrayTexture)&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(oa(d.y.mul(d.y),d.x.mul(d.x)))})),n.divAssign(e),a.divAssign(e);const l=qa(a.sub(n.mul(n)));return Yi(n,l)})),Bb=[Nb,Sb,wb,Eb];let Db;const Ib=new Ty;class Vb extends cb{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._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=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,depthLayer:n});return a.select(o,ji(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=md("bias","float",r).setGroup(Kn);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===d&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=md("near","float",r.camera).setGroup(Kn),s=md("far","float",r.camera).setGroup(Kn);n=Lh(e.negate(),t,s)}return a=en(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return Bb[e]}setupRenderTarget(e,t){const r=new D(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Ve;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t}=e,{light:r,shadow:s}=this,i=t.shadowMap.type,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(s,e);if(s.camera.updateProjectionMatrix(),i===Ie){n.compareFunction=null,a.isRenderTargetArray?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTargetArray(s.mapSize.width,s.mapSize.height,a.depth,{format:Ue,type:he,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(s.mapSize.width,s.mapSize.height,{format:Ue,type:he,depthBuffer:!1}));let t=Zu(n);n.isDepthArrayTexture&&(t=t.depth(this.depthLayer));let r=Zu(this.vsmShadowMapVertical.texture);n.isDepthArrayTexture&&(r=r.depth(this.depthLayer));const i=md("blurSamples","float",s).setGroup(Kn),o=md("radius","float",s).setGroup(Kn),u=md("mapSize","vec2",s).setGroup(Kn);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new $h);l.fragmentNode=Lb({samples:i,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new $h),l.fragmentNode=Fb({samples:i,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const o=md("intensity","float",s).setGroup(Kn),u=md("normalBias","float",s).setGroup(Kn),l=rb(r).mul(hb.add(Zl.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===Ie?this.vsmShadowMapHorizontal.texture:n,p=this.setupShadowFilter(e,{filterFn:c,shadowTexture:a.texture,depthTexture:h,shadowCoord:d,shadow:s,depthLayer:this.depthLayer});let g=Zu(a.texture,d);n.isDepthArrayTexture&&(g=g.depth(this.depthLayer));const m=Do(1,p.rgb.mix(g,1),o.mul(g.a)).toVar();return this.shadowMap=a,this.shadow.map=a,m}setup(e){if(!1!==e.renderer.shadowMap.enabled)return ki((()=>{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,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth),i.render(n,t.camera)}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");Db=bb(i,n,Db),n.overrideMaterial=Rb(r),i.setRenderObjectFunction(Pb(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),!0!==r.isPointLight&&o===Ie&&this.vsmPass(i),s.camera.layers.mask=l,Tb(i,n,Db)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),Ib.material=this.vsmMaterialVertical,Ib.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),Ib.material=this.vsmMaterialHorizontal,Ib.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;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const Ub=(e,t)=>Bi(new Vb(e,t)),Ob=new e,kb=ki((([e,t])=>{const r=e.toVar(),s=no(r),i=da(1,_o(s.x,_o(s.y,s.z)));s.mulAssign(i),r.mulAssign(i.mul(t.mul(2).oneMinus()));const n=Yi(r.xy).toVar(),a=t.mul(1.5).oneMinus();return $i(s.z.greaterThanEqual(a),(()=>{$i(r.z.greaterThan(0),(()=>{n.x.assign(ua(4,r.x))}))})).ElseIf(s.x.greaterThanEqual(a),(()=>{const e=ao(r.x);n.x.assign(r.z.mul(e).add(e.mul(2)))})).ElseIf(s.y.greaterThanEqual(a),(()=>{const e=ao(r.y);n.x.assign(r.x.add(e.mul(2)).add(2)),n.y.assign(r.z.mul(e).sub(2))})),Yi(.125,.25).mul(n).add(Yi(.375,.75)).flipY()})).setLayout({name:"cubeToUV",type:"vec2",inputs:[{name:"pos",type:"vec3"},{name:"texelSizeY",type:"float"}]}),Gb=ki((({depthTexture:e,bd3D:t,dp:r,texelSize:s})=>Zu(e,kb(t,s.y)).compare(r))),zb=ki((({depthTexture:e,bd3D:t,dp:r,texelSize:s,shadow:i})=>{const n=md("radius","float",i).setGroup(Kn),a=Yi(-1,1).mul(n).mul(s.y);return Zu(e,kb(t.add(a.xyy),s.y)).compare(r).add(Zu(e,kb(t.add(a.yyy),s.y)).compare(r)).add(Zu(e,kb(t.add(a.xyx),s.y)).compare(r)).add(Zu(e,kb(t.add(a.yyx),s.y)).compare(r)).add(Zu(e,kb(t,s.y)).compare(r)).add(Zu(e,kb(t.add(a.xxy),s.y)).compare(r)).add(Zu(e,kb(t.add(a.yxy),s.y)).compare(r)).add(Zu(e,kb(t.add(a.xxx),s.y)).compare(r)).add(Zu(e,kb(t.add(a.yxx),s.y)).compare(r)).mul(1/9)})),$b=ki((({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=Zn("float").setGroup(Kn).onRenderUpdate((()=>s.camera.near)),o=Zn("float").setGroup(Kn).onRenderUpdate((()=>s.camera.far)),u=md("bias","float",s).setGroup(Kn),l=Zn(s.mapSize).setGroup(Kn),d=ji(1).toVar();return $i(n.sub(o).lessThanEqual(0).and(n.sub(a).greaterThanEqual(0)),(()=>{const r=n.sub(a).div(o.sub(a)).toVar();r.addAssign(u);const c=i.normalize(),h=Yi(1).div(l.mul(Yi(4,2)));d.assign(e({depthTexture:t,bd3D:c,dp:r,texelSize:h,shadow:s}))})),d})),Hb=new s,Wb=new t,jb=new t;class qb extends Vb{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Oe?Gb:zb}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,shadowTexture:r,depthTexture:s,shadowCoord:i,shadow:n}){return $b({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,a=t.getFrameExtents();jb.copy(t.mapSize),jb.multiply(a),r.setSize(jb.width,jb.height),Wb.copy(t.mapSize);const o=i.autoClear,u=i.getClearColor(Ob),l=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha),i.clear();const d=t.getViewportCount();for(let e=0;eBi(new qb(e,t));class Kb extends sh{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||Zn(this.color).setGroup(Kn),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Us.FRAME}customCacheKey(){return Ns(this.light.id,this.light.castShadow?1:0)}getHash(){return this.light.uuid}getLightVector(e){return ab(this.light).sub(e.context.positionView||Gl)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return Ub(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Bi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),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);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const Yb=ki((({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)})),Qb=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=Yb({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class Zb extends Kb{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=Zn(0).setGroup(Kn),this.decayExponentNode=Zn(2).setGroup(Kn)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Xb(this.light)}setupDirect(e){return Qb({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const Jb=ki((([e=t()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()})),eT=ki((([e=ju()],{renderer:t,material:r})=>{const s=ji(1).toVar(),i=Bo(e.mul(2).sub(1));if(r.alphaToCoverage&&t.samples>1){const e=ji(i.fwidth()).toVar();s.assign(Oo(e.oneMinus(),e.add(1),i).oneMinus())}else i.greaterThan(1).discard();return s})),tT=ki((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=Ki(e).toVar();return Xo(n,i,s)})).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),rT=ki((([e,t])=>{const r=Ki(t).toVar(),s=ji(e).toVar();return Xo(r,s.negate(),s)})).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),sT=ki((([e])=>{const t=ji(e).toVar();return qi(Ka(t))})).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),iT=ki((([e,t])=>{const r=ji(e).toVar();return t.assign(sT(r)),r.sub(ji(t))})),nT=$f([ki((([e,t,r,s,i,n])=>{const a=ji(n).toVar(),o=ji(i).toVar(),u=ji(s).toVar(),l=ji(r).toVar(),d=ji(t).toVar(),c=ji(e).toVar(),h=ji(ua(1,o)).toVar();return ua(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]}),ki((([e,t,r,s,i,n])=>{const a=ji(n).toVar(),o=ji(i).toVar(),u=en(s).toVar(),l=en(r).toVar(),d=en(t).toVar(),c=en(e).toVar(),h=ji(ua(1,o)).toVar();return ua(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))})).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"}]})]),aT=$f([ki((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=ji(d).toVar(),h=ji(l).toVar(),p=ji(u).toVar(),g=ji(o).toVar(),m=ji(a).toVar(),f=ji(n).toVar(),y=ji(i).toVar(),x=ji(s).toVar(),b=ji(r).toVar(),T=ji(t).toVar(),_=ji(e).toVar(),v=ji(ua(1,p)).toVar(),N=ji(ua(1,h)).toVar();return ji(ua(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]}),ki((([e,t,r,s,i,n,a,o,u,l,d])=>{const c=ji(d).toVar(),h=ji(l).toVar(),p=ji(u).toVar(),g=en(o).toVar(),m=en(a).toVar(),f=en(n).toVar(),y=en(i).toVar(),x=en(s).toVar(),b=en(r).toVar(),T=en(t).toVar(),_=en(e).toVar(),v=ji(ua(1,p)).toVar(),N=ji(ua(1,h)).toVar();return ji(ua(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(b.mul(v).add(x.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"}]})]),oT=ki((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=Xi(e).toVar(),a=Xi(n.bitAnd(Xi(7))).toVar(),o=ji(tT(a.lessThan(Xi(4)),i,s)).toVar(),u=ji(la(2,tT(a.lessThan(Xi(4)),s,i))).toVar();return rT(o,Ki(a.bitAnd(Xi(1)))).add(rT(u,Ki(a.bitAnd(Xi(2)))))})).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),uT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=ji(t).toVar(),o=Xi(e).toVar(),u=Xi(o.bitAnd(Xi(15))).toVar(),l=ji(tT(u.lessThan(Xi(8)),a,n)).toVar(),d=ji(tT(u.lessThan(Xi(4)),n,tT(u.equal(Xi(12)).or(u.equal(Xi(14))),a,i))).toVar();return rT(l,Ki(u.bitAnd(Xi(1)))).add(rT(d,Ki(u.bitAnd(Xi(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"}]}),lT=$f([oT,uT]),dT=ki((([e,t,r])=>{const s=ji(r).toVar(),i=ji(t).toVar(),n=rn(e).toVar();return en(lT(n.x,i,s),lT(n.y,i,s),lT(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"}]}),cT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=ji(t).toVar(),o=rn(e).toVar();return en(lT(o.x,a,n,i),lT(o.y,a,n,i),lT(o.z,a,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"}]}),hT=$f([dT,cT]),pT=ki((([e])=>{const t=ji(e).toVar();return la(.6616,t)})).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),gT=ki((([e])=>{const t=ji(e).toVar();return la(.982,t)})).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),mT=$f([pT,ki((([e])=>{const t=en(e).toVar();return la(.6616,t)})).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),fT=$f([gT,ki((([e])=>{const t=en(e).toVar();return la(.982,t)})).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),yT=ki((([e,t])=>{const r=qi(t).toVar(),s=Xi(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(qi(32).sub(r)))})).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),xT=ki((([e,t,r])=>{e.subAssign(r),e.bitXorAssign(yT(r,qi(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(yT(e,qi(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(yT(t,qi(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(yT(r,qi(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(yT(e,qi(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(yT(t,qi(4))),t.addAssign(e)})),bT=ki((([e,t,r])=>{const s=Xi(r).toVar(),i=Xi(t).toVar(),n=Xi(e).toVar();return s.bitXorAssign(i),s.subAssign(yT(i,qi(14))),n.bitXorAssign(s),n.subAssign(yT(s,qi(11))),i.bitXorAssign(n),i.subAssign(yT(n,qi(25))),s.bitXorAssign(i),s.subAssign(yT(i,qi(16))),n.bitXorAssign(s),n.subAssign(yT(s,qi(4))),i.bitXorAssign(n),i.subAssign(yT(n,qi(14))),s.bitXorAssign(i),s.subAssign(yT(i,qi(24))),s})).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),TT=ki((([e])=>{const t=Xi(e).toVar();return ji(t).div(ji(Xi(qi(4294967295))))})).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),_T=ki((([e])=>{const t=ji(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"}]}),vT=$f([ki((([e])=>{const t=qi(e).toVar(),r=Xi(Xi(1)).toVar(),s=Xi(Xi(qi(3735928559)).add(r.shiftLeft(Xi(2))).add(Xi(13))).toVar();return bT(s.add(Xi(t)),s,s)})).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),ki((([e,t])=>{const r=qi(t).toVar(),s=qi(e).toVar(),i=Xi(Xi(2)).toVar(),n=Xi().toVar(),a=Xi().toVar(),o=Xi().toVar();return n.assign(a.assign(o.assign(Xi(qi(3735928559)).add(i.shiftLeft(Xi(2))).add(Xi(13))))),n.addAssign(Xi(s)),a.addAssign(Xi(r)),bT(n,a,o)})).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),ki((([e,t,r])=>{const s=qi(r).toVar(),i=qi(t).toVar(),n=qi(e).toVar(),a=Xi(Xi(3)).toVar(),o=Xi().toVar(),u=Xi().toVar(),l=Xi().toVar();return o.assign(u.assign(l.assign(Xi(qi(3735928559)).add(a.shiftLeft(Xi(2))).add(Xi(13))))),o.addAssign(Xi(n)),u.addAssign(Xi(i)),l.addAssign(Xi(s)),bT(o,u,l)})).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),ki((([e,t,r,s])=>{const i=qi(s).toVar(),n=qi(r).toVar(),a=qi(t).toVar(),o=qi(e).toVar(),u=Xi(Xi(4)).toVar(),l=Xi().toVar(),d=Xi().toVar(),c=Xi().toVar();return l.assign(d.assign(c.assign(Xi(qi(3735928559)).add(u.shiftLeft(Xi(2))).add(Xi(13))))),l.addAssign(Xi(o)),d.addAssign(Xi(a)),c.addAssign(Xi(n)),xT(l,d,c),l.addAssign(Xi(i)),bT(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"}]}),ki((([e,t,r,s,i])=>{const n=qi(i).toVar(),a=qi(s).toVar(),o=qi(r).toVar(),u=qi(t).toVar(),l=qi(e).toVar(),d=Xi(Xi(5)).toVar(),c=Xi().toVar(),h=Xi().toVar(),p=Xi().toVar();return c.assign(h.assign(p.assign(Xi(qi(3735928559)).add(d.shiftLeft(Xi(2))).add(Xi(13))))),c.addAssign(Xi(l)),h.addAssign(Xi(u)),p.addAssign(Xi(o)),xT(c,h,p),c.addAssign(Xi(a)),h.addAssign(Xi(n)),bT(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"}]})]),NT=$f([ki((([e,t])=>{const r=qi(t).toVar(),s=qi(e).toVar(),i=Xi(vT(s,r)).toVar(),n=rn().toVar();return n.x.assign(i.bitAnd(qi(255))),n.y.assign(i.shiftRight(qi(8)).bitAnd(qi(255))),n.z.assign(i.shiftRight(qi(16)).bitAnd(qi(255))),n})).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),ki((([e,t,r])=>{const s=qi(r).toVar(),i=qi(t).toVar(),n=qi(e).toVar(),a=Xi(vT(n,i,s)).toVar(),o=rn().toVar();return o.x.assign(a.bitAnd(qi(255))),o.y.assign(a.shiftRight(qi(8)).bitAnd(qi(255))),o.z.assign(a.shiftRight(qi(16)).bitAnd(qi(255))),o})).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),ST=$f([ki((([e])=>{const t=Yi(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=ji(iT(t.x,r)).toVar(),n=ji(iT(t.y,s)).toVar(),a=ji(_T(i)).toVar(),o=ji(_T(n)).toVar(),u=ji(nT(lT(vT(r,s),i,n),lT(vT(r.add(qi(1)),s),i.sub(1),n),lT(vT(r,s.add(qi(1))),i,n.sub(1)),lT(vT(r.add(qi(1)),s.add(qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return mT(u)})).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=qi().toVar(),n=ji(iT(t.x,r)).toVar(),a=ji(iT(t.y,s)).toVar(),o=ji(iT(t.z,i)).toVar(),u=ji(_T(n)).toVar(),l=ji(_T(a)).toVar(),d=ji(_T(o)).toVar(),c=ji(aT(lT(vT(r,s,i),n,a,o),lT(vT(r.add(qi(1)),s,i),n.sub(1),a,o),lT(vT(r,s.add(qi(1)),i),n,a.sub(1),o),lT(vT(r.add(qi(1)),s.add(qi(1)),i),n.sub(1),a.sub(1),o),lT(vT(r,s,i.add(qi(1))),n,a,o.sub(1)),lT(vT(r.add(qi(1)),s,i.add(qi(1))),n.sub(1),a,o.sub(1)),lT(vT(r,s.add(qi(1)),i.add(qi(1))),n,a.sub(1),o.sub(1)),lT(vT(r.add(qi(1)),s.add(qi(1)),i.add(qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return fT(c)})).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wT=$f([ki((([e])=>{const t=Yi(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=ji(iT(t.x,r)).toVar(),n=ji(iT(t.y,s)).toVar(),a=ji(_T(i)).toVar(),o=ji(_T(n)).toVar(),u=en(nT(hT(NT(r,s),i,n),hT(NT(r.add(qi(1)),s),i.sub(1),n),hT(NT(r,s.add(qi(1))),i,n.sub(1)),hT(NT(r.add(qi(1)),s.add(qi(1))),i.sub(1),n.sub(1)),a,o)).toVar();return mT(u)})).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi().toVar(),s=qi().toVar(),i=qi().toVar(),n=ji(iT(t.x,r)).toVar(),a=ji(iT(t.y,s)).toVar(),o=ji(iT(t.z,i)).toVar(),u=ji(_T(n)).toVar(),l=ji(_T(a)).toVar(),d=ji(_T(o)).toVar(),c=en(aT(hT(NT(r,s,i),n,a,o),hT(NT(r.add(qi(1)),s,i),n.sub(1),a,o),hT(NT(r,s.add(qi(1)),i),n,a.sub(1),o),hT(NT(r.add(qi(1)),s.add(qi(1)),i),n.sub(1),a.sub(1),o),hT(NT(r,s,i.add(qi(1))),n,a,o.sub(1)),hT(NT(r.add(qi(1)),s,i.add(qi(1))),n.sub(1),a,o.sub(1)),hT(NT(r,s.add(qi(1)),i.add(qi(1))),n,a.sub(1),o.sub(1)),hT(NT(r.add(qi(1)),s.add(qi(1)),i.add(qi(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return fT(c)})).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),ET=$f([ki((([e])=>{const t=ji(e).toVar(),r=qi(sT(t)).toVar();return TT(vT(r))})).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),ki((([e])=>{const t=Yi(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar();return TT(vT(r,s))})).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar();return TT(vT(r,s,i))})).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),ki((([e])=>{const t=nn(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar(),n=qi(sT(t.w)).toVar();return TT(vT(r,s,i,n))})).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),AT=$f([ki((([e])=>{const t=ji(e).toVar(),r=qi(sT(t)).toVar();return en(TT(vT(r,qi(0))),TT(vT(r,qi(1))),TT(vT(r,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),ki((([e])=>{const t=Yi(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar();return en(TT(vT(r,s,qi(0))),TT(vT(r,s,qi(1))),TT(vT(r,s,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),ki((([e])=>{const t=en(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar();return en(TT(vT(r,s,i,qi(0))),TT(vT(r,s,i,qi(1))),TT(vT(r,s,i,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),ki((([e])=>{const t=nn(e).toVar(),r=qi(sT(t.x)).toVar(),s=qi(sT(t.y)).toVar(),i=qi(sT(t.z)).toVar(),n=qi(sT(t.w)).toVar();return en(TT(vT(r,s,i,n,qi(0))),TT(vT(r,s,i,n,qi(1))),TT(vT(r,s,i,n,qi(2))))})).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),RT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar(),u=ji(0).toVar(),l=ji(1).toVar();return Yc(a,(()=>{u.addAssign(l.mul(ST(o))),l.mulAssign(i),o.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"}]}),CT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar(),u=en(0).toVar(),l=ji(1).toVar();return Yc(a,(()=>{u.addAssign(l.mul(wT(o))),l.mulAssign(i),o.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"}]}),MT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar();return Yi(RT(o,a,n,i),RT(o.add(en(qi(19),qi(193),qi(17))),a,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"}]}),PT=ki((([e,t,r,s])=>{const i=ji(s).toVar(),n=ji(r).toVar(),a=qi(t).toVar(),o=en(e).toVar(),u=en(CT(o,a,n,i)).toVar(),l=ji(RT(o.add(en(qi(19),qi(193),qi(17))),a,n,i)).toVar();return nn(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"}]}),LT=$f([ki((([e,t,r,s,i,n,a])=>{const o=qi(a).toVar(),u=ji(n).toVar(),l=qi(i).toVar(),d=qi(s).toVar(),c=qi(r).toVar(),h=qi(t).toVar(),p=Yi(e).toVar(),g=en(AT(Yi(h.add(d),c.add(l)))).toVar(),m=Yi(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=Yi(Yi(ji(h),ji(c)).add(m)).toVar(),y=Yi(f.sub(p)).toVar();return $i(o.equal(qi(2)),(()=>no(y.x).add(no(y.y)))),$i(o.equal(qi(3)),(()=>_o(no(y.x),no(y.y)))),Eo(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"}]}),ki((([e,t,r,s,i,n,a,o,u])=>{const l=qi(u).toVar(),d=ji(o).toVar(),c=qi(a).toVar(),h=qi(n).toVar(),p=qi(i).toVar(),g=qi(s).toVar(),m=qi(r).toVar(),f=qi(t).toVar(),y=en(e).toVar(),x=en(AT(en(f.add(p),m.add(h),g.add(c)))).toVar();x.subAssign(.5),x.mulAssign(d),x.addAssign(.5);const b=en(en(ji(f),ji(m),ji(g)).add(x)).toVar(),T=en(b.sub(y)).toVar();return $i(l.equal(qi(2)),(()=>no(T.x).add(no(T.y)).add(no(T.z)))),$i(l.equal(qi(3)),(()=>_o(_o(no(T.x),no(T.y)),no(T.z)))),Eo(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"}]})]),FT=ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=Yi(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=Yi(iT(n.x,a),iT(n.y,o)).toVar(),l=ji(1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{const r=ji(LT(u,e,t,a,o,i,s)).toVar();l.assign(To(l,r))}))})),$i(s.equal(qi(0)),(()=>{l.assign(qa(l))})),l})).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),BT=ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=Yi(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=Yi(iT(n.x,a),iT(n.y,o)).toVar(),l=Yi(1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{const r=ji(LT(u,e,t,a,o,i,s)).toVar();$i(r.lessThan(l.x),(()=>{l.y.assign(l.x),l.x.assign(r)})).ElseIf(r.lessThan(l.y),(()=>{l.y.assign(r)}))}))})),$i(s.equal(qi(0)),(()=>{l.assign(qa(l))})),l})).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),DT=ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=Yi(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=Yi(iT(n.x,a),iT(n.y,o)).toVar(),l=en(1e6,1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{const r=ji(LT(u,e,t,a,o,i,s)).toVar();$i(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)}))}))})),$i(s.equal(qi(0)),(()=>{l.assign(qa(l))})),l})).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),IT=$f([FT,ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=en(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=qi().toVar(),l=en(iT(n.x,a),iT(n.y,o),iT(n.z,u)).toVar(),d=ji(1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{Yc({start:-1,end:qi(1),name:"z",condition:"<="},(({z:r})=>{const n=ji(LT(l,e,t,r,a,o,u,i,s)).toVar();d.assign(To(d,n))}))}))})),$i(s.equal(qi(0)),(()=>{d.assign(qa(d))})),d})).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),VT=$f([BT,ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=en(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=qi().toVar(),l=en(iT(n.x,a),iT(n.y,o),iT(n.z,u)).toVar(),d=Yi(1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{Yc({start:-1,end:qi(1),name:"z",condition:"<="},(({z:r})=>{const n=ji(LT(l,e,t,r,a,o,u,i,s)).toVar();$i(n.lessThan(d.x),(()=>{d.y.assign(d.x),d.x.assign(n)})).ElseIf(n.lessThan(d.y),(()=>{d.y.assign(n)}))}))}))})),$i(s.equal(qi(0)),(()=>{d.assign(qa(d))})),d})).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),UT=$f([DT,ki((([e,t,r])=>{const s=qi(r).toVar(),i=ji(t).toVar(),n=en(e).toVar(),a=qi().toVar(),o=qi().toVar(),u=qi().toVar(),l=en(iT(n.x,a),iT(n.y,o),iT(n.z,u)).toVar(),d=en(1e6,1e6,1e6).toVar();return Yc({start:-1,end:qi(1),name:"x",condition:"<="},(({x:e})=>{Yc({start:-1,end:qi(1),name:"y",condition:"<="},(({y:t})=>{Yc({start:-1,end:qi(1),name:"z",condition:"<="},(({z:r})=>{const n=ji(LT(l,e,t,r,a,o,u,i,s)).toVar();$i(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)}))}))}))})),$i(s.equal(qi(0)),(()=>{d.assign(qa(d))})),d})).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),OT=ki((([e])=>{const t=e.y,r=e.z,s=en().toVar();return $i(t.lessThan(1e-4),(()=>{s.assign(en(r,r,r))})).Else((()=>{let i=e.x;i=i.sub(Ka(i)).mul(6).toVar();const n=qi(mo(i)),a=i.sub(ji(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());$i(n.equal(qi(0)),(()=>{s.assign(en(r,l,o))})).ElseIf(n.equal(qi(1)),(()=>{s.assign(en(u,r,o))})).ElseIf(n.equal(qi(2)),(()=>{s.assign(en(o,r,l))})).ElseIf(n.equal(qi(3)),(()=>{s.assign(en(o,u,r))})).ElseIf(n.equal(qi(4)),(()=>{s.assign(en(l,o,r))})).Else((()=>{s.assign(en(r,o,u))}))})),s})).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),kT=ki((([e])=>{const t=en(e).toVar(),r=ji(t.x).toVar(),s=ji(t.y).toVar(),i=ji(t.z).toVar(),n=ji(To(r,To(s,i))).toVar(),a=ji(_o(r,_o(s,i))).toVar(),o=ji(a.sub(n)).toVar(),u=ji().toVar(),l=ji().toVar(),d=ji().toVar();return d.assign(a),$i(a.greaterThan(0),(()=>{l.assign(o.div(a))})).Else((()=>{l.assign(0)})),$i(l.lessThanEqual(0),(()=>{u.assign(0)})).Else((()=>{$i(r.greaterThanEqual(a),(()=>{u.assign(s.sub(i).div(o))})).ElseIf(s.greaterThanEqual(a),(()=>{u.assign(oa(2,i.sub(r).div(o)))})).Else((()=>{u.assign(oa(4,r.sub(s).div(o)))})),u.mulAssign(1/6),$i(u.lessThan(0),(()=>{u.addAssign(1)}))})),en(u,l,d)})).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),GT=ki((([e])=>{const t=en(e).toVar(),r=sn(ma(t,en(.04045))).toVar(),s=en(t.div(12.92)).toVar(),i=en(Ro(_o(t.add(en(.055)),en(0)).div(1.055),en(2.4))).toVar();return Do(s,i,r)})).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),zT=(e,t)=>{e=ji(e),t=ji(t);const r=Yi(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return Oo(e.sub(r),e.add(r),t)},$T=(e,t,r,s)=>Do(e,t,r[s].clamp()),HT=(e,t,r,s,i)=>Do(e,t,zT(r,s[i])),WT=ki((([e,t,r])=>{const s=Qa(e).toVar(),i=ua(ji(.5).mul(t.sub(r)),Ol).div(s).toVar(),n=ua(ji(-.5).mul(t.sub(r)),Ol).div(s).toVar(),a=en().toVar();a.x=s.x.greaterThan(ji(0)).select(i.x,n.x),a.y=s.y.greaterThan(ji(0)).select(i.y,n.y),a.z=s.z.greaterThan(ji(0)).select(i.z,n.z);const o=To(To(a.x,a.y),a.z).toVar();return Ol.add(s.mul(o)).toVar().sub(r)})),jT=ki((([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(la(r,r).sub(la(s,s)))),n}));var qT=Object.freeze({__proto__:null,BRDF_GGX:Lp,BRDF_Lambert:yp,BasicPointShadowFilter:Gb,BasicShadowFilter:Nb,Break:Qc,Const:ru,Continue:()=>Uu("continue").toStack(),DFGApprox:Fp,D_GGX:Cp,Discard:Ou,EPSILON:Da,F_Schlick:fp,Fn:ki,INFINITY:Ia,If:$i,Loop:Yc,NodeAccess:ks,NodeShaderStage:Vs,NodeType:Os,NodeUpdateType:Us,PCFShadowFilter:Sb,PCFSoftShadowFilter:wb,PI:Va,PI2:Ua,PointShadowFilter:zb,Return:()=>Uu("return").toStack(),Schlick_to_F0:Dp,ScriptableNodeResources:Mx,ShaderNode:Fi,Stack:Hi,Switch:(...e)=>ni.Switch(...e),TBNViewMatrix:Ld,VSMShadowFilter:Eb,V_GGX_SmithCorrelated:Ap,Var:tu,abs:no,acesFilmicToneMapping:fx,acos:so,add:oa,addMethodChaining:oi,addNodeElement:function(e){console.warn("THREE.TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Tx,all:Oa,alphaT:Rn,and:xa,anisotropy:Cn,anisotropyB:Pn,anisotropyT:Mn,any:ka,append:e=>(console.warn("THREE.TSL: append() has been renamed to Stack()."),Hi(e)),array:ea,arrayBuffer:e=>Bi(new si(e,"ArrayBuffer")),asin:ro,assign:ra,atan:io,atan2:Ho,atomicAdd:(e,t)=>Jx(Qx.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>Jx(Qx.ATOMIC_AND,e,t),atomicFunc:Jx,atomicLoad:e=>Jx(Qx.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>Jx(Qx.ATOMIC_MAX,e,t),atomicMin:(e,t)=>Jx(Qx.ATOMIC_MIN,e,t),atomicOr:(e,t)=>Jx(Qx.ATOMIC_OR,e,t),atomicStore:(e,t)=>Jx(Qx.ATOMIC_STORE,e,t),atomicSub:(e,t)=>Jx(Qx.ATOMIC_SUB,e,t),atomicXor:(e,t)=>Jx(Qx.ATOMIC_XOR,e,t),attenuationColor:$n,attenuationDistance:zn,attribute:Wu,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Cs("float")):(r=Ms(t),s=Cs(t));const i=new Ry(e,r,s);return Wc(i,t,e)},backgroundBlurriness:By,backgroundIntensity:Dy,backgroundRotation:Iy,batch:Gc,billboarding:Kf,bitAnd:va,bitNot:Na,bitOr:Sa,bitXor:wa,bitangentGeometry:Ed,bitangentLocal:Ad,bitangentView:Rd,bitangentWorld:Cd,bitcast:xo,blendBurn:Xy,blendColor:Zy,blendDodge:Ky,blendOverlay:Qy,blendScreen:Yy,blur:Bg,bool:Ki,buffer:tl,bufferAttribute:Su,bumpMap:Gd,burn:(...e)=>(console.warn('THREE.TSL: "burn" has been renamed. Use "blendBurn" instead.'),Xy(e)),bvec2:Ji,bvec3:sn,bvec4:un,bypass:Fu,cache:Pu,call:ia,cameraFar:ul,cameraIndex:al,cameraNear:ol,cameraNormalMatrix:pl,cameraPosition:gl,cameraProjectionMatrix:ll,cameraProjectionMatrixInverse:dl,cameraViewMatrix:cl,cameraWorldMatrix:hl,cbrt:Fo,cdl:ix,ceil:Ya,checker:Jb,cineonToneMapping:gx,clamp:Io,clearcoat:_n,clearcoatRoughness:vn,code:Nx,color:Wi,colorSpaceToWorking:mu,colorToDirection:e=>Bi(e).mul(2).sub(1),compute:Cu,computeSkinning:(e,t=null)=>{const r=new qc(e);return r.positionNode=Wc(new M(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Pc).toVar(),r.skinIndexNode=Wc(new M(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Pc).toVar(),r.skinWeightNode=Wc(new M(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Pc).toVar(),r.bindMatrixNode=Zn(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=Zn(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=tl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Bi(r)},cond:Ko,context:Qo,convert:pn,convertColorSpace:(e,t,r)=>Bi(new cu(Bi(e),t,r)),convertToTexture:(e,...t)=>e.isTextureNode?e:e.isPassNode?e.getTextureNode():Ny(e,...t),cos:eo,cross:Ao,cubeTexture:hd,cubeToUV:kb,dFdx:co,dFdy:ho,dashSize:In,debug:$u,decrement:Pa,decrementBefore:Ca,defaultBuildStages:zs,defaultShaderStages:Gs,defined:Pi,degrees:za,deltaTime:Wf,densityFog:function(e,t){return console.warn('THREE.TSL: "densityFog( color, density )" is deprecated. Use "fog( color, densityFogFactor( density ) )" instead.'),Ix(e,Dx(t))},densityFogFactor:Dx,depth:Bh,depthPass:(e,t,r)=>Bi(new dx(dx.DEPTH,e,t,r)),difference:wo,diffuseColor:yn,directPointLight:Qb,directionToColor:Jh,dispersion:Hn,distance:So,div:da,dodge:(...e)=>(console.warn('THREE.TSL: "dodge" has been renamed. Use "blendDodge" instead.'),Ky(e)),dot:Eo,drawIndex:Dc,dynamicBufferAttribute:wu,element:hn,emissive:xn,equal:ha,equals:bo,equirectUV:sp,exp:$a,exp2:Ha,expression:Uu,faceDirection:Wl,faceForward:ko,faceforward:Wo,float:ji,floor:Ka,fog:Ix,fract:Za,frameGroup:Xn,frameId:jf,frontFacing:Hl,fwidth:fo,gain:(e,t)=>e.lessThan(.5)?Vf(e.mul(2),t).div(2):ua(1,Vf(la(ua(1,e),2),t).div(2)),gapSize:Vn,getConstNodeType:Li,getCurrentStack:zi,getDirection:Mg,getDistanceAttenuation:Yb,getGeometryRoughness:wp,getNormalFromDepth:Ey,getParallaxCorrectNormal:WT,getRoughness:Ep,getScreenPosition:wy,getShIrradianceAt:jT,getShadowMaterial:Rb,getShadowRenderObjectFunction:Pb,getTextureIndex:Ff,getViewPosition:Sy,globalId:Wx,glsl:(e,t)=>Nx(e,t,"glsl"),glslFn:(e,t)=>wx(e,t,"glsl"),grayscale:Jy,greaterThan:ma,greaterThanEqual:ya,hash:If,highpModelNormalViewMatrix:Dl,highpModelViewMatrix:Bl,hue:rx,increment:Ma,incrementBefore:Ra,instance:Vc,instanceIndex:Pc,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=Cs("float")):(r=Ms(t),s=Cs(t));const i=new Ay(e,r,s);return Wc(i,t,e)},instancedBufferAttribute:Eu,instancedDynamicBufferAttribute:Au,instancedMesh:Oc,int:qi,inverseSqrt:Xa,inversesqrt:jo,invocationLocalIndex:Bc,invocationSubgroupIndex:Fc,ior:On,iridescence:wn,iridescenceIOR:En,iridescenceThickness:An,ivec2:Qi,ivec3:tn,ivec4:an,js:(e,t)=>Nx(e,t,"js"),label:Zo,length:oo,lengthSq:Bo,lessThan:ga,lessThanEqual:fa,lightPosition:ib,lightProjectionUV:sb,lightShadowMatrix:rb,lightTargetDirection:ob,lightTargetPosition:nb,lightViewPosition:ab,lightingContext:ah,lights:(e=[])=>Bi(new db).setLights(e),linearDepth:Dh,linearToneMapping:hx,localId:jx,log:Wa,log2:ja,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(Wa(r.div(t)));return ji(Math.E).pow(s).mul(t).negate()},loop:(...e)=>(console.warn("THREE.TSL: loop() has been renamed to Loop()."),Yc(...e)),luminance:sx,mat2:ln,mat3:dn,mat4:cn,matcapUV:vm,materialAO:Ec,materialAlphaTest:Hd,materialAnisotropy:lc,materialAnisotropyVector:Ac,materialAttenuationColor:yc,materialAttenuationDistance:fc,materialClearcoat:sc,materialClearcoatNormal:nc,materialClearcoatRoughness:ic,materialColor:Wd,materialDispersion:Sc,materialEmissive:qd,materialEnvIntensity:nd,materialEnvRotation:ad,materialIOR:mc,materialIridescence:dc,materialIridescenceIOR:cc,materialIridescenceThickness:hc,materialLightMap:wc,materialLineDashOffset:vc,materialLineDashSize:bc,materialLineGapSize:Tc,materialLineScale:xc,materialLineWidth:_c,materialMetalness:tc,materialNormal:rc,materialOpacity:Xd,materialPointSize:Nc,materialReference:xd,materialReflectivity:Jd,materialRefractionRatio:id,materialRotation:ac,materialRoughness:ec,materialSheen:oc,materialSheenRoughness:uc,materialShininess:jd,materialSpecular:Kd,materialSpecularColor:Qd,materialSpecularIntensity:Yd,materialSpecularStrength:Zd,materialThickness:gc,materialTransmission:pc,max:_o,maxMipLevel:Yu,mediumpModelViewMatrix:Fl,metalness:Tn,min:To,mix:Do,mixElement:zo,mod:ca,modInt:Fa,modelDirection:Sl,modelNormalMatrix:Ml,modelPosition:El,modelRadius:Cl,modelScale:Al,modelViewMatrix:Ll,modelViewPosition:Rl,modelViewProjection:Rc,modelWorldMatrix:wl,modelWorldMatrixInverse:Pl,morphReference:rh,mrt:Df,mul:la,mx_aastep:zT,mx_cell_noise_float:(e=ju())=>ET(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>ji(e).sub(r).mul(t).add(r),mx_fractal_noise_float:(e=ju(),t=3,r=2,s=.5,i=1)=>RT(e,qi(t),r,s).mul(i),mx_fractal_noise_vec2:(e=ju(),t=3,r=2,s=.5,i=1)=>MT(e,qi(t),r,s).mul(i),mx_fractal_noise_vec3:(e=ju(),t=3,r=2,s=.5,i=1)=>CT(e,qi(t),r,s).mul(i),mx_fractal_noise_vec4:(e=ju(),t=3,r=2,s=.5,i=1)=>PT(e,qi(t),r,s).mul(i),mx_hsvtorgb:OT,mx_noise_float:(e=ju(),t=1,r=0)=>ST(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=ju(),t=1,r=0)=>wT(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=ju(),t=1,r=0)=>{e=e.convert("vec2|vec3");return nn(wT(e),ST(e.add(Yi(19,73)))).mul(t).add(r)},mx_ramplr:(e,t,r=ju())=>$T(e,t,r,"x"),mx_ramptb:(e,t,r=ju())=>$T(e,t,r,"y"),mx_rgbtohsv:kT,mx_safepower:(e,t=1)=>(e=ji(e)).abs().pow(t).mul(e.sign()),mx_splitlr:(e,t,r,s=ju())=>HT(e,t,r,s,"x"),mx_splittb:(e,t,r,s=ju())=>HT(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:GT,mx_transform_uv:(e=1,t=0,r=ju())=>r.mul(e).add(t),mx_worley_noise_float:(e=ju(),t=1)=>IT(e.convert("vec2|vec3"),t,qi(1)),mx_worley_noise_vec2:(e=ju(),t=1)=>VT(e.convert("vec2|vec3"),t,qi(1)),mx_worley_noise_vec3:(e=ju(),t=1)=>UT(e.convert("vec2|vec3"),t,qi(1)),negate:uo,neutralToneMapping:_x,nodeArray:Ii,nodeImmutable:Ui,nodeObject:Bi,nodeObjects:Di,nodeProxy:Vi,normalFlat:Xl,normalGeometry:jl,normalLocal:ql,normalMap:Vd,normalView:Kl,normalWorld:Yl,normalize:Qa,not:Ta,notEqual:pa,numWorkgroups:$x,objectDirection:yl,objectGroup:Yn,objectPosition:bl,objectRadius:vl,objectScale:Tl,objectViewPosition:_l,objectWorldMatrix:xl,oneMinus:lo,or:ba,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=Hf)=>e.fract(),oscSine:(e=Hf)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=Hf)=>e.fract().round(),oscTriangle:(e=Hf)=>e.add(.5).fract().mul(2).sub(1).abs(),output:Dn,outputStruct:Lf,overlay:(...e)=>(console.warn('THREE.TSL: "overlay" has been renamed. Use "blendOverlay" instead.'),Qy(e)),overloadingFn:$f,parabola:Vf,parallaxDirection:Fd,parallaxUV:(e,t)=>e.sub(Fd.mul(t)),parameter:(e,t)=>Bi(new Ef(e,t)),pass:(e,t,r)=>Bi(new dx(dx.COLOR,e,t,r)),passTexture:(e,t)=>Bi(new ux(e,t)),pcurve:(e,t,r)=>Ro(da(Ro(e,t),oa(Ro(e,t),Ro(ua(1,e),r))),1/t),perspectiveDepthToViewZ:Ph,pmremTexture:am,pointShadow:Xb,pointUV:My,pointWidth:Un,positionGeometry:Il,positionLocal:Vl,positionPrevious:Ul,positionView:Gl,positionViewDirection:zl,positionWorld:Ol,positionWorldDirection:kl,posterize:ax,pow:Ro,pow2:Co,pow3:Mo,pow4:Po,property:mn,radians:Ga,rand:Go,range:kx,rangeFog:function(e,t,r){return console.warn('THREE.TSL: "rangeFog( color, near, far )" is deprecated. Use "fog( color, rangeFogFactor( near, far ) )" instead.'),Ix(e,Bx(t,r))},rangeFogFactor:Bx,reciprocal:go,reference:md,referenceBuffer:fd,reflect:No,reflectVector:ld,reflectView:od,reflector:e=>Bi(new my(e)),refract:Uo,refractVector:dd,refractView:ud,reinhardToneMapping:px,remainder:La,remap:Du,remapClamp:Iu,renderGroup:Kn,renderOutput:Gu,rendererReference:bu,rotate:Em,rotateUV:qf,roughness:bn,round:po,rtt:Ny,sRGBTransferEOTF:ou,sRGBTransferOETF:uu,sampler:e=>(!0===e.isNode?e:Zu(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Zu(e)).convert("samplerComparison"),saturate:Vo,saturation:ex,screen:(...e)=>(console.warn('THREE.TSL: "screen" has been renamed. Use "blendScreen" instead.'),Yy(e)),screenCoordinate:ph,screenSize:hh,screenUV:ch,scriptable:Lx,scriptableValue:Ax,select:Xo,setCurrentStack:Gi,shaderStages:$s,shadow:Ub,shadowPositionWorld:hb,shapeCircle:eT,sharedUniformGroup:qn,sheen:Nn,sheenRoughness:Sn,shiftLeft:Ea,shiftRight:Aa,shininess:Bn,sign:ao,sin:Ja,sinc:(e,t)=>Ja(Va.mul(t.mul(e).sub(1))).div(Va.mul(t.mul(e).sub(1))),skinning:Xc,smoothstep:Oo,smoothstepElement:$o,specularColor:Ln,specularF90:Fn,spherizeUV:Xf,split:(e,t)=>Bi(new Zs(Bi(e),t)),spritesheetUV:Zf,sqrt:qa,stack:Rf,step:vo,storage:Wc,storageBarrier:()=>Xx("storage").toStack(),storageObject:(e,t,r)=>(console.warn('THREE.TSL: "storageObject()" is deprecated. Use "storage().setPBO( true )" instead.'),Wc(e,t,r).setPBO(!0)),storageTexture:Uy,string:(e="")=>Bi(new si(e,"string")),struct:(e,t=null)=>{const r=new Cf(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;eXx("texture").toStack(),textureBicubic:eg,textureCubeUV:Pg,textureLoad:Ju,textureSize:Xu,textureStore:(e,t,r)=>{const s=Uy(e,t,r);return null!==r&&s.toStack(),s},thickness:Gn,time:Hf,timerDelta:(e=1)=>(console.warn('TSL: timerDelta() is deprecated. Use "deltaTime" instead.'),Wf.mul(e)),timerGlobal:(e=1)=>(console.warn('TSL: timerGlobal() is deprecated. Use "time" instead.'),Hf.mul(e)),timerLocal:(e=1)=>(console.warn('TSL: timerLocal() is deprecated. Use "time" instead.'),Hf.mul(e)),toOutputColorSpace:hu,toWorkingColorSpace:pu,toneMapping:_u,toneMappingExposure:vu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Bi(new cx(t,r,Bi(s),Bi(i),Bi(n))),transformDirection:Lo,transformNormal:ed,transformNormalToView:td,transformedBentNormalView:Bd,transformedBitangentView:Md,transformedBitangentWorld:Pd,transformedClearcoatNormalView:Jl,transformedNormalView:Ql,transformedNormalWorld:Zl,transformedTangentView:Nd,transformedTangentWorld:Sd,transmission:kn,transpose:yo,triNoise3D:kf,triplanarTexture:(...e)=>ey(...e),triplanarTextures:ey,trunc:mo,tslFn:(...e)=>(console.warn("THREE.TSL: tslFn() has been renamed to Fn()."),ki(...e)),uint:Xi,uniform:Zn,uniformArray:il,uniformGroup:jn,uniforms:(e,t)=>(console.warn("THREE.TSL: uniforms() has been renamed to uniformArray()."),Bi(new sl(e,t))),userData:(e,t,r)=>Bi(new zy(e,t,r)),uv:ju,uvec2:Zi,uvec3:rn,uvec4:on,varying:nu,varyingProperty:fn,vec2:Yi,vec3:en,vec4:nn,vectorComponents:Hs,velocity:qy,vertexColor:zh,vertexIndex:Mc,vertexStage:au,vibrance:tx,viewZToLogarithmicDepth:Lh,viewZToOrthographicDepth:Ch,viewZToPerspectiveDepth:Mh,viewport:gh,viewportBottomLeft:Th,viewportCoordinate:fh,viewportDepthTexture:Ah,viewportLinearDepth:Ih,viewportMipTexture:Sh,viewportResolution:xh,viewportSafeUV:Yf,viewportSharedTexture:Yh,viewportSize:mh,viewportTexture:Nh,viewportTopLeft:bh,viewportUV:yh,wgsl:(e,t)=>Nx(e,t,"wgsl"),wgslFn:(e,t)=>wx(e,t,"wgsl"),workgroupArray:(e,t)=>Bi(new Yx("Workgroup",e,t)),workgroupBarrier:()=>Xx("workgroup").toStack(),workgroupId:Hx,workingToColorSpace:gu,xor:_a});const XT=new wf;class KT extends Wm{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(XT),XT.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(XT),XT.a=1,n=!0;else if(!0===i.isNode){const o=this.get(e),u=i;XT.copy(s._clearColor);let l=o.backgroundMesh;if(void 0===l){const c=Qo(nn(u).mul(Dy),{getUV:()=>Iy.mul(Yl),getTextureLevel:()=>By});let h=Rc;h=h.setZ(h.w);const p=new $h;function g(){i.removeEventListener("dispose",g),l.material.dispose(),l.geometry.dispose()}p.name="Background.material",p.side=N,p.depthTest=!1,p.depthWrite=!1,p.allowOverride=!1,p.fog=!1,p.lights=!1,p.vertexNode=h,p.colorNode=c,o.backgroundMeshNode=c,o.backgroundMesh=l=new W(new ke(1,32,32),p),l.frustumCulled=!1,l.name="Background.mesh",l.onBeforeRender=function(e,t,r){this.matrixWorld.copyPosition(r.matrixWorld)},i.addEventListener("dispose",g)}const d=u.getCacheKey();o.backgroundCacheKey!==d&&(o.backgroundMeshNode.node=nn(u).mul(Dy),o.backgroundMeshNode.needsUpdate=!0,l.material.needsUpdate=!0,o.backgroundCacheKey=d),t.unshift(l,l.geometry,l.material,0,0,null,null)}else console.error("THREE.Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?XT.set(0,0,0,1):"alpha-blend"===a&&XT.set(0,0,0,0),!0===s.autoClear||!0===n){const m=r.clearColorValue;m.r=XT.r,m.g=XT.g,m.b=XT.b,m.a=XT.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(m.r*=m.a,m.g*=m.a,m.b*=m.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 YT=0;class QT{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=YT++}}class ZT{constructor(e,t,r,s,i,n,a,o,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=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new QT(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 JT{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class e_{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 t_{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class r_ extends t_{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class s_{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let i_=0;class n_{constructor(e=null){this.id=i_++,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 a_{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class o_{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 u_ extends o_{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class l_ extends o_{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class d_ extends o_{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class c_ extends o_{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class h_ extends o_{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class p_ extends o_{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=16,this.itemSize=4}}class g_ extends o_{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class m_ extends o_{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class f_ extends u_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class y_ extends l_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class x_ extends d_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class b_ extends c_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class T_ extends h_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class __ extends p_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class v_ extends g_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class N_ extends m_{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}const S_=new WeakMap,w_=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),E_=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class A_{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.observer=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.declarations={},this.flow={code:""},this.chaining=[],this.stack=Rf(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new n_,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null}getBindGroupsCache(){let e=S_.get(this.renderer);return void 0===e&&(e=new km,S_.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new ae(e,t,r)}createRenderTargetArray(e,t,r,s){return new Ge(e,t,r,s)}createCubeRenderTarget(e,t){return new ip(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_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 QT(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new QT(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 $s)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")}( ${E_(n.r)}, ${E_(n.g)}, ${E_(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>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 JT(e,t);return this.registerDeclaration(s),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||"samplerComparison"===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===T)return"int";if(t===b)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;let r=Rs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return w_.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}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 He||!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=Rf(this.stack),this.stacks.push(zi()||this.stack),Gi(this.stack),this.stack}removeStack(){const e=this.stack;return this.stack=e.parent,Gi(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 JT("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const e=this.structs.index++;null===r&&(r="StructType"+e),n=new a_(r,t),this.structs[s].push(n),i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}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 a=this.uniforms.index++;n=new e_(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getArrayCount(e){let t=null;return e.isArrayNode?t=e.count:e.isVarNode&&e.node.isArrayNode&&(t=e.node.count),t}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s);let a=n.variable;if(void 0===a){const o=i?"_const":"_var",u=this.vars[s]||(this.vars[s]=[]),l=this.vars[o]||(this.vars[o]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+l,this.vars[o]++);const d=this.getArrayCount(e);a=new t_(t,r,i,d),i||u.push(a),this.registerDeclaration(a),n.variable=a}return a}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any");let a=n.varying;if(void 0===a){const e=this.varyings,o=e.length;null===t&&(t="nodeVarying"+o),a=new r_(t,r,s,i),e.push(a),this.registerDeclaration(a),n.varying=a}return a}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,console.warn(`THREE.TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}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 s_("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}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Sx,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 Ef(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.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new n_,this.stack=Rf();for(const r of zs)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){console.warn("Abstract function.")}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,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):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 $h),e.build(this)}else this.addFlow("compute",e);for(const e of zs){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of $s){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 f_(e);if("vec2"===t||"ivec2"===t||"uvec2"===t)return new y_(e);if("vec3"===t||"ivec3"===t||"uvec3"===t)return new x_(e);if("vec4"===t||"ivec4"===t||"uvec4"===t)return new b_(e);if("color"===t)return new T_(e);if("mat2"===t)return new __(e);if("mat3"===t)return new v_(e);if("mat4"===t)return new N_(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?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,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${We} - Node System\n`}*[Symbol.iterator](){}createNodeMaterial(e="NodeMaterial"){throw new Error(`THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${e}() instead.`)}}class R_{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===Us.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===Us.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===Us.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Us.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===Us.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===Us.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Us.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===Us.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===Us.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 C_{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}C_.isNodeFunctionInput=!0;class M_ extends Kb{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:ob(this.light),lightColor:e}}}const P_=new a,L_=new a;let F_=null;class B_ extends Kb{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=Zn(new r).setGroup(Kn),this.halfWidth=Zn(new r).setGroup(Kn),this.updateType=Us.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;L_.identity(),P_.copy(t.matrixWorld),P_.premultiply(r),L_.extractRotation(P_),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(L_),this.halfHeight.value.applyMatrix4(L_)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Zu(F_.LTC_FLOAT_1),r=Zu(F_.LTC_FLOAT_2)):(t=Zu(F_.LTC_HALF_1),r=Zu(F_.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:ab(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){F_=e}}class D_ extends Kb{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=Zn(0).setGroup(Kn),this.penumbraCosNode=Zn(0).setGroup(Kn),this.cutoffDistanceNode=Zn(0).setGroup(Kn),this.decayExponentNode=Zn(0).setGroup(Kn)}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 Oo(t,r,e)}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(ob(i)),u=this.getSpotAttenuation(o),l=n.length(),d=Yb({lightDistance:l,cutoffDistance:r,decayExponent:s});let c=t.mul(u).mul(d);if(i.map){const t=sb(i,e.context.positionWorld),r=Zu(i.map,t.xy).onRenderUpdate((()=>i.map));c=t.mul(2).sub(1).abs().lessThan(1).all().select(c.mul(r),c)}return{lightColor:c,lightDirection:a}}}class I_ extends D_{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=Zu(t,Yi(s,0),0).r}else r=super.getSpotAttenuation(e);return r}}class V_ extends Kb{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class U_ extends Kb{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=ib(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=Zn(new e).setGroup(Kn)}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=Kl.dot(s).mul(.5).add(.5),n=Do(r,t,i);e.context.irradiance.addAssign(n)}}class O_ extends Kb{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=il(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=jT(Yl,this.lightProbe);e.context.irradiance.addAssign(t)}}class k_{parseFunction(){console.warn("Abstract function.")}}class G_{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){console.warn("Abstract function.")}}G_.isNodeFunction=!0;const z_=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,$_=/[a-z_0-9]+/gi,H_="#pragma main";class W_ extends G_{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(H_),r=-1!==t?e.slice(t+12):e,s=r.match(z_);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=$_.exec(i));)n.push(a);const o=[];let u=0;for(;u0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,(()=>{if(!0===r.isCubeTexture||r.mapping===Y||r.mapping===Q||r.mapping===oe){if(e.backgroundBlurriness>0||r.mapping===oe)return am(r);{let e;return e=!0===r.isCubeTexture?hd(r):Zu(r),lp(e)}}if(!0===r.isTexture)return Zu(r,ch.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&console.error("WebGPUNodes: Unsupported background configuration.",r)}),s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,(()=>{if(r.isFogExp2){const e=md("color","color",r).setGroup(Kn),t=md("density","float",r).setGroup(Kn);return Ix(e,Dx(t))}if(r.isFog){const e=md("color","color",r).setGroup(Kn),t=md("near","float",r).setGroup(Kn),s=md("far","float",r).setGroup(Kn);return Ix(e,Bx(t,s))}console.error("THREE.Renderer: 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){const e=this.getCacheNode("environment",r,(()=>!0===r.isCubeTexture?hd(r):!0===r.isTexture?Zu(r):void 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+","+e.xr.isPresenting}hasOutputChange(e){return q_.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isTextureArray?Gy(e,en(ch,nl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Zu(e,ch).renderOutput(t.toneMapping,t.currentColorSpace);return q_.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 R_,this.nodeBuilderCache=new Map,this.cacheLib={}}}const Q_=new Pe;class Z_{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t.setSize(i.framebufferWidth,i.framebufferHeight,!1),this._xrRenderTarget=new av(i.framebufferWidth,i.framebufferHeight,{format:ce,type:Me,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),n.layers.mask=2|e.layers.mask,a.layers.mask=4|e.layers.mask,i.layers.mask=n.layers.mask|a.layers.mask;const o=e.parent,u=i.cameras;dv(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function gv(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),depthFormat:this._gl.DEPTH_COMPONENT,radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight})}function mv(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);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,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,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 Y_(this,r),this._animation=new Om(this._nodes,this.info),this._attributes=new Qm(r),this._background=new KT(this,this._nodes),this._geometries=new ef(this._attributes,this.info),this._textures=new Sf(this,r,this.info),this._pipelines=new uf(r,this._nodes),this._bindings=new lf(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Hm(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new mf(this.lighting),this._bundles=new tv,this._renderContexts=new vf,this._animation.start(),this._initialized=!0,e(this)}))),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,a=this._currentRenderObjectFunction,o=this._compilationPromises,u=!0===e.isScene?e:fv;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 Z_),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._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=a,this._compilationPromises=o,this._handleObjectFunction=this._renderObjectDirect,await Promise.all(h)}async renderAsync(e,t){!1===this._initialized&&await this.init(),this._renderScene(e,t)}async waitForGPU(){await this.backend.waitForGPU()}set highPrecision(e){!0===e?(this.overrideNodes.modelViewMatrix=Bl,this.overrideNodes.modelNormalViewMatrix=Dl):this.highPrecision&&(this.overrideNodes.modelViewMatrix=null,this.overrideNodes.modelNormalViewMatrix=null)}get highPrecision(){return this.overrideNodes.modelViewMatrix===Bl&&this.overrideNodes.modelNormalViewMatrix===Dl}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getColorBufferType(){return this._colorBufferType}_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,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),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=T,p.viewport=!1===p.viewportValue.equals(xv),p.scissorValue.copy(y).multiplyScalar(x).floor(),p.scissor=this._scissorTest&&!1===p.scissorValue.equals(xv),p.scissorValue.width>>=c,p.scissorValue.height>>=c,p.clippingContext||(p.clippingContext=new Z_),p.clippingContext.updateGlobal(u,t),u.onBeforeRender(this,e,t,h);const _=t.isArrayCamera?Tv:bv;t.isArrayCamera||(_v.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),_.setFromProjectionMatrix(_v,g));const v=this._renderLists.get(e,t);if(v.begin(),this._projectObject(e,t,0,v,p.clippingContext),v.finish(),!0===this.sortObjects&&v.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=v.occlusionQueryCount,this._background.update(u,v,p),p.camera=t,this.backend.beginRender(p);const{bundles:N,lightsNode:S,transparentDoublePass:w,transparent:E,opaque:A}=v;return N.length>0&&this._renderBundles(N,u,S),!0===this.opaque&&A.length>0&&this._renderObjects(A,t,u,S),!0===this.transparent&&E.length>0&&this._renderTransparents(E,w,t,u,S),this.backend.finishRender(p),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,null!==s&&(this.setRenderTarget(l,d,c),this._renderOutput(h)),u.onAfterRender(this,e,t,h),p}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}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.xr&&this.xr.isPresenting||(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.xr&&this.xr.isPresenting||(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 a=this._viewport;e.isVector4?a.copy(e):a.set(e,t,r,s),a.minDepth=i,a.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);const e=this._textures.get(s);i=this._renderContexts.getForClear(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer,i.clearColorValue=this.backend.getClearColor(),i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}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)}async clearColorAsync(){this.clearAsync(!0,!1,!1)}async clearDepthAsync(){this.clearAsync(!1,!0,!1)}async clearStencilAsync(){this.clearAsync(!1,!1,!0)}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:p}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:de}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}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(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach((e=>{null!==e&&e.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}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}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,a=this._nodes,o=Array.isArray(e)?e:[e];if(void 0===o[0]||!0!==o[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");s.beginCompute(e);for(const t of o){if(!1===i.has(t)){const e=()=>{t.removeEventListener("dispose",e),i.delete(t),n.delete(t),a.delete(t)};t.addEventListener("dispose",e);const r=t.onInitFunction;null!==r&&r.call(t,{renderer:this})}a.updateForCompute(t),n.updateForCompute(t);const r=n.getForCompute(t),o=i.getForCompute(t,r);s.compute(e,t,r,o)}s.finishCompute(e),t.renderId=r}async computeAsync(e){!1===this._initialized&&await this.init(),this.compute(e)}async hasFeatureAsync(e){return!1===this._initialized&&await this.init(),this.backend.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(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){!1===this._initialized&&console.warn("THREE.Renderer: .initTexture() called before the backend is initialized. Try using .initTextureAsync() instead."),this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=vv.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=vv.copy(t).floor()}else t=vv.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,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;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){const n=t.isArrayCamera?Tv:bv;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&vv.setFromMatrixPosition(e.matrixWorld).applyMatrix4(_v);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,vv.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){const n=t.isArrayCamera?Tv:bv;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),vv.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(_v)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=N;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=Xe;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=Se}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0,e.isShadowPassMaterial&&(e.side=null===i.shadowSide?i.side:i.shadowSide,i.depthNode&&i.depthNode.isNode&&(c=e.depthNode,e.depthNode=i.depthNode),i.castShadowNode&&i.castShadowNode.isNode&&(d=e.colorNode,e.colorNode=i.castShadowNode),i.castShadowPositionNode&&i.castShadowPositionNode.isNode&&(l=e.positionNode,e.positionNode=i.castShadowPositionNode)),i=e}!0===i.transparent&&i.side===Se&&!1===i.forceSinglePass?(i.side=N,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=Xe,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=Se):this._handleObjectFunction(e,i,t,r,a,n,o,u),void 0!==l&&(t.overrideMaterial.positionNode=l),void 0!==c&&(t.overrideMaterial.depthNode=c),void 0!==d&&(t.overrideMaterial.colorNode=d),e.onAfterRender(this,t,r,s,i,n)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}get compile(){return this.compileAsync}}class Sv{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}clone(){return Object.assign(new this.constructor,this)}}class wv extends Sv{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t}get byteLength(){return(e=this._buffer.byteLength)+(Ym-e%Ym)%Ym;var e}get buffer(){return this._buffer}update(){return!0}}class Ev extends wv{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let Av=0;class Rv extends Ev{constructor(e,t){super("UniformBuffer_"+Av++,e?e.value:null),this.nodeUniform=e,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Cv extends Ev{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[]}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){let e=0;for(let t=0,r=this.uniforms.length;t0?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 a=i.node.precision;if(null!==a&&(t=Uv[a]+" "+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!==T){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=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${kv[s.interpolationType]||s.interpolationType} ${Gv[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${kv[e.interpolationType]||e.interpolationType} ${Gv[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce(((e,t)=>e*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=Ov[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)}Ov[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} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}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 a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new Bv(i.name,i.node,s),u.push(a);else if("cubeTexture"===t)a=new Dv(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new Iv(i.name,i.node,s),u.push(a);else if("buffer"===t){e.name=`NodeBuffer_${e.id}`,i.name=`buffer${e.id}`;const t=new Rv(e,s);t.name=e.name,u.push(t),a=t}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let n=e[o];void 0===n&&(n=new Pv(r+"_"+o,s),e[o]=n,u.push(n)),a=this.getNodeUniform(i,t),n.addUniform(a)}n.uniformGPU=a}return i}}let Hv=null,Wv=null;class jv{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={render:null,compute:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}createSampler(){}destroySampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void mt("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return void mt(`WebGPURenderer: No timestamp query pool for type '${e}' found.`);const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async waitForGPU(){}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return Hv=Hv||new t,this.renderer.getDrawingBufferSize(Hv)}setScissorTest(){}getClearColor(){const e=this.renderer;return Wv=Wv||new wf,e.getClearColor(Wv),Wv.getRGB(Wv),Wv}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:ft(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${We} 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 qv,Xv,Kv=0;class Yv{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 Qv{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.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===T,id:Kv++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new Yv(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),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.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 eN,tN,rN,sN=!1;class iN{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},!1===sN&&(this._init(),sN=!0)}_init(){const e=this.gl;eN={[wr]:e.REPEAT,[Sr]:e.CLAMP_TO_EDGE,[Nr]:e.MIRRORED_REPEAT},tN={[_]:e.NEAREST,[Er]:e.NEAREST_MIPMAP_NEAREST,[$e]:e.NEAREST_MIPMAP_LINEAR,[q]:e.LINEAR,[ze]:e.LINEAR_MIPMAP_NEAREST,[B]:e.LINEAR_MIPMAP_LINEAR},rN={[Fr]:e.NEVER,[Lr]:e.ALWAYS,[Ve]:e.LESS,[Pr]:e.LEQUAL,[Mr]:e.EQUAL,[Cr]:e.GEQUAL,[Rr]:e.GREATER,[Ar]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isDepthArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture||!0===e.isTextureArray?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:a}=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 o=t;return t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB&&(r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5)),t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA&&(r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=s===z&&!1===i?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)),t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}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,eN[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,eN[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||!0!==t.isDepthArrayTexture&&!1===t.isTextureArray&&r.texParameteri(e,r.TEXTURE_WRAP_R,eN[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,tN[t.magFilter]);const n=void 0!==t.mipmaps&&t.mipmaps.length>0,a=t.minFilter===q&&n?B:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,tN[a]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,rN[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===_)return;if(t.minFilter!==$e&&t.minFilter!==B)return;if(t.type===L&&!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:a,depth:o}=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.isDepthArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture||e.isTextureArray?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),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:a,glType:o}=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,a,o,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:a,glFormat:o,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(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;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-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+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,a,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,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e))}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();o.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),o.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 nN{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 aN{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 oN={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",OVR_multiview2:"OVR_multiview2"};class uN{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:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e.id,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){console.error("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e.id);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){console.error("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=[];for(const[t,r]of this.queryStates)if("ended"===r){const r=this.queries[t];e.push(this.resolveQuery(r))}if(0===e.length)return this.lastValue;const t=(await Promise.all(e)).reduce(((e,t)=>e+t),0);return this.lastValue=t,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,t}catch(e){return console.error("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise((t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){console.error("Error checking query:",e),t(this.lastValue)}};n()}))}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class cN extends jv{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.samples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new nN(this),this.capabilities=new aN(this),this.attributeUtils=new Qv(this),this.textureUtils=new iN(this),this.bufferRenderer=new uN(this),this.state=new Zv(this),this.utils=new Jv(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile")}get coordinateSystem(){return l}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async waitForGPU(){await this.utils._clientWaitAsync()}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e.autoAllocateDepthBuffer&&!1===e.multiview&&console.warn("THREE.WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e.autoAllocateDepthBuffer=!1}}initTimestampQuery(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t]||(this.timestampQueryPool[t]=new dN(this.gl,t,2048));const r=this.timestampQueryPool[t];null!==r.allocateQueriesForContext(e)&&r.beginQuery(e)}prepareTimestampBuffer(e){if(!this.disjoint||!this.trackTimestamp)return;const t=e.isComputeNode?"compute":"render";this.timestampQueryPool[t].endQuery(e)}getContext(){return this.gl}beginRender(e){const{state:t,gl:r}=this,s=this.get(e);if(e.viewport?this.updateViewport(e):t.viewport(0,0,r.drawingBufferWidth,r.drawingBufferHeight),e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(e),s.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const i=e.occlusionQueryCount;i>0&&(s.currentOcclusionQueries=s.occlusionQueries,s.currentOcclusionQueryObjects=s.occlusionQueryObjects,s.lastOcclusionObject=null,s.occlusionQueries=new Array(i),s.occlusionQueryObjects=new Array(i),s.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e0&&!1===this._useMultisampledExtension(e.renderTarget)){const i=s.framebuffers[e.getCacheKey()],n=t.COLOR_BUFFER_BIT,a=s.msaaFrameBuffer,o=e.textures;r.bindFramebuffer(t.READ_FRAMEBUFFER,a),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,i);for(let r=0;r{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(mt("THREE.WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),y.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?y.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):mt("THREE.WebGLRenderer: WEBGL_multi_draw not supported."):b>1?y.renderInstances(T,x,b):y.render(T,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,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"),a=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"+a)}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:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),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,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;eoN[t]===e)),r=this.extensions;for(let e=0;e0&&!1===x&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e.autoAllocateDepthBuffer}dispose(){const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const hN="point-list",pN="line-list",gN="line-strip",mN="triangle-list",fN="triangle-strip",yN="never",xN="less",bN="equal",TN="less-equal",_N="greater",vN="not-equal",NN="greater-equal",SN="always",wN="store",EN="load",AN="clear",RN="ccw",CN="none",MN="front",PN="back",LN="uint16",FN="uint32",BN="r8unorm",DN="r8snorm",IN="r8uint",VN="r8sint",UN="r16uint",ON="r16sint",kN="r16float",GN="rg8unorm",zN="rg8snorm",$N="rg8uint",HN="rg8sint",WN="r32uint",jN="r32sint",qN="r32float",XN="rg16uint",KN="rg16sint",YN="rg16float",QN="rgba8unorm",ZN="rgba8unorm-srgb",JN="rgba8snorm",eS="rgba8uint",tS="rgba8sint",rS="bgra8unorm",sS="bgra8unorm-srgb",iS="rgb9e5ufloat",nS="rgb10a2unorm",aS="rg11b10ufloat",oS="rg32uint",uS="rg32sint",lS="rg32float",dS="rgba16uint",cS="rgba16sint",hS="rgba16float",pS="rgba32uint",gS="rgba32sint",mS="rgba32float",fS="depth16unorm",yS="depth24plus",xS="depth24plus-stencil8",bS="depth32float",TS="depth32float-stencil8",_S="bc1-rgba-unorm",vS="bc1-rgba-unorm-srgb",NS="bc2-rgba-unorm",SS="bc2-rgba-unorm-srgb",wS="bc3-rgba-unorm",ES="bc3-rgba-unorm-srgb",AS="bc4-r-unorm",RS="bc4-r-snorm",CS="bc5-rg-unorm",MS="bc5-rg-snorm",PS="bc6h-rgb-ufloat",LS="bc6h-rgb-float",FS="bc7-rgba-unorm",BS="bc7-rgba-unorm-srgb",DS="etc2-rgb8unorm",IS="etc2-rgb8unorm-srgb",VS="etc2-rgb8a1unorm",US="etc2-rgb8a1unorm-srgb",OS="etc2-rgba8unorm",kS="etc2-rgba8unorm-srgb",GS="eac-r11unorm",zS="eac-r11snorm",$S="eac-rg11unorm",HS="eac-rg11snorm",WS="astc-4x4-unorm",jS="astc-4x4-unorm-srgb",qS="astc-5x4-unorm",XS="astc-5x4-unorm-srgb",KS="astc-5x5-unorm",YS="astc-5x5-unorm-srgb",QS="astc-6x5-unorm",ZS="astc-6x5-unorm-srgb",JS="astc-6x6-unorm",ew="astc-6x6-unorm-srgb",tw="astc-8x5-unorm",rw="astc-8x5-unorm-srgb",sw="astc-8x6-unorm",iw="astc-8x6-unorm-srgb",nw="astc-8x8-unorm",aw="astc-8x8-unorm-srgb",ow="astc-10x5-unorm",uw="astc-10x5-unorm-srgb",lw="astc-10x6-unorm",dw="astc-10x6-unorm-srgb",cw="astc-10x8-unorm",hw="astc-10x8-unorm-srgb",pw="astc-10x10-unorm",gw="astc-10x10-unorm-srgb",mw="astc-12x10-unorm",fw="astc-12x10-unorm-srgb",yw="astc-12x12-unorm",xw="astc-12x12-unorm-srgb",bw="clamp-to-edge",Tw="repeat",_w="mirror-repeat",vw="linear",Nw="nearest",Sw="zero",ww="one",Ew="src",Aw="one-minus-src",Rw="src-alpha",Cw="one-minus-src-alpha",Mw="dst",Pw="one-minus-dst",Lw="dst-alpha",Fw="one-minus-dst-alpha",Bw="src-alpha-saturated",Dw="constant",Iw="one-minus-constant",Vw="add",Uw="subtract",Ow="reverse-subtract",kw="min",Gw="max",zw=0,$w=15,Hw="keep",Ww="zero",jw="replace",qw="invert",Xw="increment-clamp",Kw="decrement-clamp",Yw="increment-wrap",Qw="decrement-wrap",Zw="storage",Jw="read-only-storage",eE="write-only",tE="read-only",rE="read-write",sE="non-filtering",iE="comparison",nE="float",aE="unfilterable-float",oE="depth",uE="sint",lE="uint",dE="2d",cE="3d",hE="2d",pE="2d-array",gE="cube",mE="3d",fE="all",yE="vertex",xE="instance",bE={DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups"};class TE extends Sv{constructor(e,t){super(e),this.texture=t,this.version=t?t.version:0,this.isSampler=!0}}class _E extends TE{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){this.texture=this.textureNode.value}}class vE extends wv{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let NE=0;class SE extends vE{constructor(e,t){super("StorageBuffer_"+NE++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ks.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class wE extends Wm{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:vw}),this.flipYSampler=e.createSampler({minFilter:Nw}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\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:fN,stripIndexFormat:FN},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:fN,stripIndexFormat:FN},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=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:hE,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:hE,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:AN,storeOp:wN,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,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:hE,baseArrayLayer:r});const a=[];for(let o=1;o1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,PE=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,LE={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_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"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 FE extends G_{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(ME);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=PE.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 BE extends k_{parseFunction(e){return new FE(e)}}const DE="undefined"!=typeof self?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},IE={[ks.READ_ONLY]:"read",[ks.WRITE_ONLY]:"write",[ks.READ_WRITE]:"read_write"},VE={[wr]:"repeat",[Sr]:"clamp",[Nr]:"mirror"},UE={vertex:DE?DE.VERTEX:1,fragment:DE?DE.FRAGMENT:2,compute:DE?DE.COMPUTE:4},OE={instance:!0,swizzleAssign:!1,storageBuffer:!0},kE={"^^":"tsl_xor"},GE={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"},zE={},$E={tsl_xor:new vx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new vx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new vx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new vx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new vx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new vx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new vx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new vx("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 vx("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 vx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new vx("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 vx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new vx("\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")},HE={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)&&($E.pow_float=new vx("fn tsl_pow_float( a : f32, b : f32 ) -> f32 { return select( -pow( -a, b ), pow( a, b ), a > 0.0 ); }"),$E.pow_vec2=new vx("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 ) ); }",[$E.pow_float]),$E.pow_vec3=new vx("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 ) ); }",[$E.pow_float]),$E.pow_vec4=new vx("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 ) ); }",[$E.pow_float]),HE.pow_float="tsl_pow_float",HE.pow_vec2="tsl_pow_vec2",HE.pow_vec3="tsl_pow_vec3",HE.pow_vec4="tsl_pow_vec4");let WE="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(WE+="diagnostic( off, derivative_uniformity );\n");class jE extends A_{constructor(e,t){super(e,t,new BE),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==x}_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_${VE[e.wrapS]}S_${VE[e.wrapT]}_${e.isData3DTexture?"3d":"2d"}T`;let r=zE[t];if(void 0===r){const s=[],i=e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===wr?(s.push($E.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===Sr?(s.push($E.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Nr?(s.push($E.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,console.warn(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),e.isData3DTexture&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",zE[t]=r=new vx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${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,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.isData3DTexture?"vec3":"vec2",n=u||e.isVideoTexture||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Jo(new Vu(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isDataArrayTexture||e.isDepthArrayTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Jo(new Vu(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Jo(new Vu("6u","u32")))}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=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i),o=e.isData3DTexture?"vec3":"vec2",u=`${o}( ${n}( ${r} ) * ${o}( ${a} ) )`;return this.generateTextureLoad(e,t,u,s,i)}generateTextureLoad(e,t,r,s,i="0u"){let n;return!0===e.isVideoTexture||!0===e.isStorageTexture?n=`textureLoad( ${t}, ${r} )`:s?n=`textureLoad( ${t}, ${r}, ${s}, u32( ${i} ) )`:(n=`textureLoad( ${t}, ${r}, u32( ${i} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(n+=".x")),n}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===L||!1===this.isSampleCompare(e)&&e.minFilter===_&&e.magFilter===_||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 e.isDepthArrayTexture?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:`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 a=null;return a=!0===e.isVideoTexture?this._generateVideoSample(t,r,n):this._generateTextureSampleLevel(e,t,r,s,i,n),a}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?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=kE[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?ks.READ_ONLY:e.access}getStorageAccess(e,t){return IE[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 a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);if("texture"===t||"storageTexture"===t?s=new Bv(i.name,i.node,o,n):"cubeTexture"===t?s=new Dv(i.name,i.node,o,n):"texture3D"===t&&(s=new Iv(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.setVisibility(UE[r]),"fragment"!==r&&"compute"!==r||!1!==this.isUnfilterable(e.value)||!1!==s.store)l.push(s),a=[s];else{const e=new _E(`${i.name}_sampler`,i.node,o);e.setVisibility(UE[r]),l.push(e,s),a=[e,s]}}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=new("buffer"===t?Rv:SE)(e,o);n.setVisibility(UE[r]),l.push(n),a=n,i.name=s||"NodeBuffer_"+i.id}else{const e=this.uniformGroups[r]||(this.uniformGroups[r]={});let s=e[u];void 0===s&&(s=new Pv(u,o),s.setVisibility(UE[r]),e[u]=s,l.push(s)),a=this.getNodeUniform(i,t),s.addUniform(a)}n.uniformGPU=a}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","globalId","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"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}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,e.count)};`);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;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;"fragment"!==e&&"compute"!==e||!1!==this.isUnfilterable(t)||!0===i.node.isStorageTextureNode||(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture||!0===t.isTextureArray)s="texture_2d_array";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isDepthArrayTexture?"_array":""}`;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<${CE(t)}, ${this.getStorageAccess(i.node,e)}>`}else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=this.getType(this.getVectorType(i.type)),t=i.groupNode.name;(n[t]||(n[t]={index:a.binding++,id:a.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 a=r.join("\n");return a+=s.join("\n"),a+=i.join("\n"),a}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;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],a=n.outputNode,o=void 0!==a&&!0===a.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`),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(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",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;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}this.shaderStage=null,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 GE[e]||e}isAvailable(e){let t=OE[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),OE[e]=t),t}_getWGSLMethod(e){return void 0!==$E[e]&&this._include(e),HE[e]}_include(e){const t=$E[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// structs\n${e.structs}\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${WE}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\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// structs\n${e.structs}\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 = globalId.x + globalId.y * numWorkgroups.x * u32(${t}) + globalId.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 qE{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=xS:e.depth&&(t=yS),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?hN:e.isLineSegments||e.isMesh&&!0===t.wireframe?pN:e.isLine?gN:e.isMesh?mN: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(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Me)return rS;if(e===he)return hS;throw new Error("Unsupported outputType")}}const XE=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]),KE=new Map([[He,["float16"]]]),YE=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class QE{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 a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e1&&(s.multisampled=!0,r.texture.isDepthTexture||(s.sampleType=aE)),r.texture.isDepthTexture)t.compatibilityMode&&null===r.texture.compareFunction?s.sampleType=aE:s.sampleType=oE;else if(r.texture.isDataTexture||r.texture.isDataArrayTexture||r.texture.isData3DTexture){const e=r.texture.type;e===T?s.sampleType=uE:e===b?s.sampleType=lE:e===L&&(this.backend.hasFeature("float32-filterable")?s.sampleType=nE:s.sampleType=aE)}r.isSampledCubeTexture?s.viewDimension=gE:r.texture.isDataArrayTexture||r.texture.isDepthArrayTexture||r.texture.isCompressedArrayTexture?s.viewDimension=pE:r.isSampledTexture3D&&(s.viewDimension=mE),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,a=i.get(e);let o,u=n.get(e.bindingsReference);void 0===u&&(u=this.createBindingsLayout(e),n.set(e.bindingsReference,u)),r>0&&(void 0===a.groups&&(a.groups=[],a.versions=[]),a.versions[r]===s&&(o=a.groups[r])),void 0===o&&(o=this.createBindGroup(e,u),r>0&&(a.groups[r]=o,a.versions[r]=s)),a.group=o,a.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)}createBindGroupIndex(e,t){const r=this.backend.device,s=GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST,i=e[0],n=r.createBuffer({label:"bindingCameraIndex_"+i,size:16,usage:s});r.queue.writeBuffer(n,0,e,0);const a=[{binding:0,resource:{buffer:n}}];return r.createBindGroup({label:"bindGroupCameraIndex_"+i,layout:t,entries:a})}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 a;if(void 0!==e.externalTexture)a=s.importExternalTexture({source:e.externalTexture});else{const r=t.store?1:e.texture.mipLevelCount,s=`view-${e.texture.width}-${e.texture.height}-${r}`;if(a=e[s],void 0===a){const i=fE;let n;n=t.isSampledCubeTexture?gE:t.isSampledTexture3D?mE:t.texture.isDataArrayTexture||t.texture.isDepthArrayTexture||t.texture.isCompressedArrayTexture?pE:hE,a=e[s]=e.texture.createView({aspect:i,dimension:n,mipLevelCount:r})}}n.push({binding:i,resource:a})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}}class JE{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:a,fragmentProgram:o}=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;s.blending===k||s.blending===V&&!1===s.transparent||(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})},w={},E=e.context.depth,A=e.context.stencil;if(!0!==E&&!0!==A||(!0===E&&(w.format=v,w.depthWriteEnabled=s.depthWrite,w.depthCompare=_),!0===A&&(w.stencilFront=m,w.stencilBack={},w.stencilReadMask=s.stencilFuncMask,w.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(w.depthBias=s.polygonOffsetUnits,w.depthBiasSlopeScale=s.polygonOffsetFactor,w.depthBiasClamp=0),S.depthStencil=w),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,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:[s.getCurrentColorFormat(e)],depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e);a.push(t.layout)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===Ke){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:Vw},r={srcFactor:i,dstFactor:n,operation:Vw}};if(e.premultipliedAlpha)switch(s){case V:i(ww,Cw,ww,Cw);break;case Bt:i(ww,ww,ww,ww);break;case Ft:i(Sw,Aw,Sw,ww);break;case Lt:i(Sw,Ew,Sw,Rw)}else switch(s){case V:i(Rw,Cw,ww,Cw);break;case Bt:i(Rw,ww,Rw,ww);break;case Ft:i(Sw,Aw,Sw,ww);break;case Lt:i(Sw,Ew,Sw,Ew)}}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 Qe:t=Sw;break;case Rt:t=ww;break;case At:t=Ew;break;case vt:t=Aw;break;case Et:t=Rw;break;case _t:t=Cw;break;case St:t=Mw;break;case Tt:t=Pw;break;case Nt:t=Lw;break;case bt:t=Fw;break;case wt:t=Bw;break;case 211:t=Dw;break;case 212:t=Iw;break;default:console.error("THREE.WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case $r:t=yN;break;case zr:t=SN;break;case Gr:t=xN;break;case kr:t=TN;break;case Or:t=bN;break;case Ur:t=NN;break;case Vr:t=_N;break;case Ir:t=vN;break;default:console.error("THREE.WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case Qr:t=Hw;break;case Yr:t=Ww;break;case Kr:t=jw;break;case Xr:t=qw;break;case qr:t=Xw;break;case jr:t=Kw;break;case Wr:t=Yw;break;case Hr:t=Qw;break;default:console.error("THREE.WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case Ye:t=Vw;break;case xt:t=Uw;break;case yt:t=Ow;break;case Jr:t=kw;break;case Zr:t=Gw;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?LN:FN),r.side){case Xe:s.frontFace=RN,s.cullMode=PN;break;case N:s.frontFace=RN,s.cullMode=MN;break;case Se:s.frontFace=RN,s.cullMode=CN;break;default:console.error("THREE.WebGPUPipelineUtils: Unknown material.side value.",r.side)}return s}_getColorWriteMask(e){return!0===e.colorWrite?$w:zw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=SN;else{const r=e.depthFunc;switch(r){case zt:t=yN;break;case Gt:t=SN;break;case kt:t=xN;break;case Ot:t=TN;break;case Ut:t=bN;break;case Vt:t=NN;break;case It:t=_N;break;case Dt:t=vN;break;default:console.error("THREE.WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class eA extends lN{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return mt(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e.id,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r));let a=0;for(const[,t]of e){const e=n[t],r=n[t+1];a+=Number(r-e)/1e6}return this.resultBuffer.unmap(),this.lastValue=a,a}catch(e){return console.error("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){console.error("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){console.error("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class tA extends jv{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.context=null,this.colorBuffer=null,this.defaultRenderPassdescriptor=null,this.utils=new qE(this),this.attributeUtils=new QE(this),this.bindingUtils=new ZE(this),this.pipelineUtils=new JE(this),this.textureUtils=new RE(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,featureLevel:t.compatibilityMode?"compatibility":void 0},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(bE),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}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(bE.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 d}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}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.isDepthArrayTexture&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;if(void 0===i||s.width!==r.width||s.height!==r.height||s.dimensions!==r.dimensions||s.activeMipmapLevel!==e.activeMipmapLevel||s.activeCubeFace!==e.activeCubeFace||s.samples!==r.samples){i={},s.descriptors=i;const e=()=>{r.removeEventListener("dispose",e),this.delete(r)};!1===r.hasEventListener("dispose",e)&&r.addEventListener("dispose",e)}const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s0&&(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,{loadOp:EN}),this.initTimestampQuery(e,n),n.occlusionQuerySet=i;const a=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();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){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.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;ea?(u.x=Math.min(t.dispatchCount,a),u.y=Math.ceil(t.dispatchCount/a)):u.x=t.dispatchCount,i.dispatchWorkgroups(u.x,u.y,u.z)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}async waitForGPU(){await this.device.queue.onSubmittedWorkDone()}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n).pipeline,l=e.getIndex(),d=null!==l,c=e.getDrawParameters();if(null===c)return;const h=(t,r)=>{t.setPipeline(u),r.pipeline=u;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(h(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&mt("THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===d?s.drawIndexed(i[o],n,e[o]/l.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===d){const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndexedIndirect(e,0)}else s.drawIndexed(i,n,a,0,0);t.update(r,i,n)}else{const{vertexCount:i,instanceCount:n,firstVertex:a}=c,o=e.getIndirect();if(null!==o){const e=this.get(o).buffer;s.drawIndirect(e,0)}else s.draw(i,n,a,0);t.update(r,i,n)}};if(e.camera.isArrayCamera&&e.camera.cameras.length>0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(console.warn("THREE.WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new cN(e)));super(new t(e),e),this.library=new sA,this.isWebGPURenderer=!0}}class nA extends ps{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class aA{constructor(e,t=nn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new $h;r.name="PostProcessing",this._quadMesh=new Ty(r)}render(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;this._quadMesh.material.fragmentNode=!0===this.outputColorTransform?Gu(this.outputNode,t,r):this.outputNode.context({toneMapping:t,outputColorSpace:r}),this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){this._update();const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=p,e.outputColorSpace=de;const s=e.xr.enabled;e.xr.enabled=!1,await this._quadMesh.renderAsync(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r}}class oA extends pe{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=q,this.minFilter=q,this.isStorageTexture=!0}}class uA extends Ry{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class lA extends gs{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new ms(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),ji()):Bi(new this.nodes[e])}}class dA extends fs{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 cA extends ys{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 lA;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 dA;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;tتنسيق القوام المضغوط ASTC [link:https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/ WEBGL_compressed_texture_astc].

-

تنسيق القوام المضغوط BPTC

+

تنسيقات القوام المضغوط BPTC

THREE.RGBA_BPTC_Format + THREE.RGB_BPTC_SIGNED_Format + THREE.RGB_BPTC_UNSIGNED_Format

للاستخدام مع خاصية [page:Texture.format format] لـ [page:CompressedTexture CompressedTexture] ، هذه تتطلب دعمًا للتمديد - [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].

+ [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].
+ RGBA_BPTC_Format يوفر ضغط RGBA عالي الجودة، بينما RGB_BPTC_SIGNED_Format و RGB_BPTC_UNSIGNED_Format + يُستخدمان لقوام HDR مع قيم float موقعة وغير موقعة على التوالي.

+

+ +

تنسيقات القوام المضغوط RGTC

+ + THREE.RED_RGTC1_Format + THREE.SIGNED_RED_RGTC1_Format + THREE.RED_GREEN_RGTC2_Format + THREE.SIGNED_RED_GREEN_RGTC2_Format + +

+ للاستخدام مع خاصية [page:Texture.format format] لـ [page:CompressedTexture CompressedTexture] ، + هذه تتطلب دعمًا للتمديد + [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_rgtc/ EXT_texture_compression_rgtc].
+ تنسيقات RGTC توفر ضغطًا فعالًا لقوام القناة الواحدة (أحمر) والقناة المزدوجة (أحمر-أخضر).

وظائف مقارنة القوام (Texture Comparison functions)

diff --git a/docs/api/en/constants/Textures.html b/docs/api/en/constants/Textures.html index 254f604ac94c4c..c46fa5f4d1bdda 100644 --- a/docs/api/en/constants/Textures.html +++ b/docs/api/en/constants/Textures.html @@ -293,14 +293,32 @@

ASTC Compressed Texture Format

[link:https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/ WEBGL_compressed_texture_astc] extension.

-

BPTC Compressed Texture Format

+

BPTC Compressed Texture Formats

THREE.RGBA_BPTC_Format + THREE.RGB_BPTC_SIGNED_Format + THREE.RGB_BPTC_UNSIGNED_Format

For use with a [page:CompressedTexture CompressedTexture]'s [page:Texture.format format] property, these require support for the - [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc] extension.

+ [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc] extension.
+ RGBA_BPTC_Format provides high-quality RGBA compression, while RGB_BPTC_SIGNED_Format and RGB_BPTC_UNSIGNED_Format + are used for HDR textures with signed and unsigned float values respectively.

+

+ +

RGTC Compressed Texture Formats

+ + THREE.RED_RGTC1_Format + THREE.SIGNED_RED_RGTC1_Format + THREE.RED_GREEN_RGTC2_Format + THREE.SIGNED_RED_GREEN_RGTC2_Format + +

+ For use with a [page:CompressedTexture CompressedTexture]'s + [page:Texture.format format] property, these require support for the + [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_rgtc/ EXT_texture_compression_rgtc] extension.
+ RGTC formats provide efficient compression for single-channel (red) and dual-channel (red-green) textures.

Texture Comparison functions

diff --git a/docs/api/fr/constants/Textures.html b/docs/api/fr/constants/Textures.html index f44c13465115f9..d093586ffff400 100644 --- a/docs/api/fr/constants/Textures.html +++ b/docs/api/fr/constants/Textures.html @@ -263,10 +263,27 @@

Formats de Textures Compressées ASTC

Formats de Textures Compressées BPTC

THREE.RGBA_BPTC_Format + THREE.RGB_BPTC_SIGNED_Format + THREE.RGB_BPTC_UNSIGNED_Format

À utiliser avec la propriété [page:Texture.format format] d'une [page:CompressedTexture CompressedTexture], - ceux-ci doivent supporter les extensions [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].

+ ceux-ci doivent supporter l'extension [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].
+ RGBA_BPTC_Format fournit une compression RGBA de haute qualité, tandis que RGB_BPTC_SIGNED_Format et RGB_BPTC_UNSIGNED_Format + sont utilisés pour les textures HDR avec des valeurs float signées et non signées respectivement.

+

+ +

Formats de Textures Compressées RGTC

+ + THREE.RED_RGTC1_Format + THREE.SIGNED_RED_RGTC1_Format + THREE.RED_GREEN_RGTC2_Format + THREE.SIGNED_RED_GREEN_RGTC2_Format + +

+ À utiliser avec la propriété [page:Texture.format format] d'une [page:CompressedTexture CompressedTexture], + ceux-ci doivent supporter l'extension [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_rgtc/ EXT_texture_compression_rgtc].
+ Les formats RGTC fournissent une compression efficace pour les textures à canal unique (rouge) et double canal (rouge-vert).

Formats Internes

diff --git a/docs/api/it/constants/Textures.html b/docs/api/it/constants/Textures.html index 0f812c4a52e3ea..ba323ea65b12df 100644 --- a/docs/api/it/constants/Textures.html +++ b/docs/api/it/constants/Textures.html @@ -259,14 +259,32 @@

Formati Texture Compressi ASTC

[link:https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/ WEBGL_compressed_texture_astc].

-

Formato Texture Compresso BPTCt

+

Formati Texture Compressi BPTC

THREE.RGBA_BPTC_Format + THREE.RGB_BPTC_SIGNED_Format + THREE.RGB_BPTC_UNSIGNED_Format

Da usare con la prorietà del [page:Texture.format formato] della [page:CompressedTexture CompressedTexture], - questi richiedono il supporto per l'estensione - [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].
+ questi richiedono il supporto per l'estensione + [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].
+ RGBA_BPTC_Format fornisce compressione RGBA di alta qualità, mentre RGB_BPTC_SIGNED_Format e RGB_BPTC_UNSIGNED_Format + sono utilizzati per texture HDR con valori float con segno e senza segno rispettivamente.
+

+ +

Formati Texture Compressi RGTC

+ + THREE.RED_RGTC1_Format + THREE.SIGNED_RED_RGTC1_Format + THREE.RED_GREEN_RGTC2_Format + THREE.SIGNED_RED_GREEN_RGTC2_Format + +

+ Da usare con la prorietà del [page:Texture.format formato] della [page:CompressedTexture CompressedTexture], + questi richiedono il supporto per l'estensione + [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_rgtc/ EXT_texture_compression_rgtc].
+ I formati RGTC forniscono compressione efficiente per texture a canale singolo (rosso) e doppio canale (rosso-verde).

Formati Interni

diff --git a/docs/api/pt-br/constants/Textures.html b/docs/api/pt-br/constants/Textures.html index 572119e41f9189..03fe3e1bb29edb 100644 --- a/docs/api/pt-br/constants/Textures.html +++ b/docs/api/pt-br/constants/Textures.html @@ -259,13 +259,30 @@

Formato de Textura Compactado ASTC

requerem suporte para a extensão [link:https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_astc/ WEBGL_compressed_texture_astc].

-

BPTC Compressed Texture Format

+

Formatos de Textura Compactados BPTC

THREE.RGBA_BPTC_Format + THREE.RGB_BPTC_SIGNED_Format + THREE.RGB_BPTC_UNSIGNED_Format

Para uso com a propriedade [page:Texture.format format] de uma [page:CompressedTexture CompressedTexture], - requerem suporte para a extensão [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].

+ requerem suporte para a extensão [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_bptc/ EXT_texture_compression_bptc].
+ RGBA_BPTC_Format fornece compressão RGBA de alta qualidade, enquanto RGB_BPTC_SIGNED_Format e RGB_BPTC_UNSIGNED_Format + são usados para texturas HDR com valores float assinados e não assinados respectivamente.

+

+ +

Formatos de Textura Compactados RGTC

+ + THREE.RED_RGTC1_Format + THREE.SIGNED_RED_RGTC1_Format + THREE.RED_GREEN_RGTC2_Format + THREE.SIGNED_RED_GREEN_RGTC2_Format + +

+ Para uso com a propriedade [page:Texture.format format] de uma [page:CompressedTexture CompressedTexture], + requerem suporte para a extensão [link:https://www.khronos.org/registry/webgl/extensions/EXT_texture_compression_rgtc/ EXT_texture_compression_rgtc].
+ Os formatos RGTC fornecem compressão eficiente para texturas de canal único (vermelho) e canal duplo (vermelho-verde).

Formatos Internos

diff --git a/package-lock.json b/package-lock.json index 66b64f7f8f9cdc..5de0756332e4cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "three", - "version": "0.175.0", + "version": "0.176.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "three", - "version": "0.175.0", + "version": "0.176.0", "license": "MIT", "devDependencies": { "@rollup/plugin-node-resolve": "^16.0.0", diff --git a/src/renderers/webgl/WebGLUtils.js b/src/renderers/webgl/WebGLUtils.js index f0200d12afcd8e..135009fe4866b2 100644 --- a/src/renderers/webgl/WebGLUtils.js +++ b/src/renderers/webgl/WebGLUtils.js @@ -181,7 +181,7 @@ function WebGLUtils( gl, extensions ) { if ( extension !== null ) { - if ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; + if ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT; if ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT; if ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT; if ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; diff --git a/src/renderers/webgpu/utils/WebGPUConstants.js b/src/renderers/webgpu/utils/WebGPUConstants.js index b657ccc6d9c02a..3512235d0a73d5 100644 --- a/src/renderers/webgpu/utils/WebGPUConstants.js +++ b/src/renderers/webgpu/utils/WebGPUConstants.js @@ -112,8 +112,9 @@ export const GPUTextureFormat = { BGRA8UnormSRGB: 'bgra8unorm-srgb', // Packed 32-bit formats RGB9E5UFloat: 'rgb9e5ufloat', + RGB10A2Uint: 'rgb10a2uint', RGB10A2Unorm: 'rgb10a2unorm', - RG11B10UFloat: 'rgb10a2unorm', + RG11B10UFloat: 'rg11b10ufloat', // 64-bit formats @@ -158,7 +159,7 @@ export const GPUTextureFormat = { BC6HRGBUFloat: 'bc6h-rgb-ufloat', BC6HRGBFloat: 'bc6h-rgb-float', BC7RGBAUnorm: 'bc7-rgba-unorm', - BC7RGBAUnormSRGB: 'bc7-rgba-srgb', + BC7RGBAUnormSRGB: 'bc7-rgba-unorm-srgb', // ETC2 compressed formats usable if 'texture-compression-etc2' is both // supported by the device/user agent and enabled in requestDevice. diff --git a/src/renderers/webgpu/utils/WebGPUTextureUtils.js b/src/renderers/webgpu/utils/WebGPUTextureUtils.js index 76e0c14d464533..df92f2ce9eb7ff 100644 --- a/src/renderers/webgpu/utils/WebGPUTextureUtils.js +++ b/src/renderers/webgpu/utils/WebGPUTextureUtils.js @@ -13,7 +13,9 @@ import { 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_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, UnsignedIntType, UnsignedShortType, UnsignedInt248Type, UnsignedInt5999Type, NeverCompare, AlwaysCompare, LessCompare, LessEqualCompare, EqualCompare, GreaterEqualCompare, GreaterCompare, NotEqualCompare, IntType, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, - CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping + CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping, + RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, + RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format } from '../../../constants.js'; import { CubeTexture } from '../../../textures/CubeTexture.js'; import { DepthTexture } from '../../../textures/DepthTexture.js'; @@ -1202,6 +1204,34 @@ export function getFormat( texture, device = null ) { formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.ASTC12x12UnormSRGB : GPUTextureFormat.ASTC12x12Unorm; break; + case RGBA_BPTC_Format: + formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.BC7RGBAUnormSRGB : GPUTextureFormat.BC7RGBAUnorm; + break; + + case RGB_BPTC_SIGNED_Format: + formatGPU = GPUTextureFormat.BC6HRGBFloat; + break; + + case RGB_BPTC_UNSIGNED_Format: + formatGPU = GPUTextureFormat.BC6HRGBUFloat; + break; + + case RED_RGTC1_Format: + formatGPU = GPUTextureFormat.BC4RUnorm; + break; + + case SIGNED_RED_RGTC1_Format: + formatGPU = GPUTextureFormat.BC4RSnorm; + break; + + case RED_GREEN_RGTC2_Format: + formatGPU = GPUTextureFormat.BC5RGUnorm; + break; + + case SIGNED_RED_GREEN_RGTC2_Format: + formatGPU = GPUTextureFormat.BC5RGSnorm; + break; + case RGBAFormat: formatGPU = ( colorSpace === SRGBColorSpace ) ? GPUTextureFormat.RGBA8UnormSRGB : GPUTextureFormat.RGBA8Unorm; break;