diff --git a/build/three.cjs b/build/three.cjs index b13470862bf5c2..96368e2594eb9c 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -49106,11 +49106,16 @@ const _errorMap = new WeakMap(); * textures for rendering. * * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps. - * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU. + * These options need to be configured via {@link ImageBitmapLoader#setOptions} prior to loading, + * unlike regular images which can be configured on the Texture to set these options on GPU upload instead. * - * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead. + * To match the default behaviour of {@link Texture}, the following options are needed: * - * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled. + * ```js + * { imageOrientation: 'flipY', premultiplyAlpha: 'none' } + * ``` + * + * Also note that unlike {@link FileLoader}, this loader will only avoid multiple concurrent requests to the same URL if {@link Cache} is enabled. * * ```js * const loader = new THREE.ImageBitmapLoader(); @@ -77262,16 +77267,6 @@ class WebGLRenderer { } - // https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512 - - if ( material.isMeshGouraudMaterial && material.envMap !== null ) { - - m_uniforms.envMap.value = envMap; - - m_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1; - - } - if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) { m_uniforms.envMapIntensity.value = scene.environmentIntensity; diff --git a/build/three.core.js b/build/three.core.js index 8246021c2c1fb6..d4e043a77ef603 100644 --- a/build/three.core.js +++ b/build/three.core.js @@ -49104,11 +49104,16 @@ const _errorMap = new WeakMap(); * textures for rendering. * * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps. - * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU. + * These options need to be configured via {@link ImageBitmapLoader#setOptions} prior to loading, + * unlike regular images which can be configured on the Texture to set these options on GPU upload instead. * - * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead. + * To match the default behaviour of {@link Texture}, the following options are needed: * - * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled. + * ```js + * { imageOrientation: 'flipY', premultiplyAlpha: 'none' } + * ``` + * + * Also note that unlike {@link FileLoader}, this loader will only avoid multiple concurrent requests to the same URL if {@link Cache} is enabled. * * ```js * const loader = new THREE.ImageBitmapLoader(); diff --git a/build/three.module.js b/build/three.module.js index 0b5d8b538ae787..1d66a694c21488 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -18207,16 +18207,6 @@ class WebGLRenderer { } - // https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512 - - if ( material.isMeshGouraudMaterial && material.envMap !== null ) { - - m_uniforms.envMap.value = envMap; - - m_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1; - - } - if ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) { m_uniforms.envMapIntensity.value = scene.environmentIntensity; diff --git a/build/three.module.min.js b/build/three.module.min.js index 66ddab641c1d26..2e547495e27a2f 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,warn as E,HalfFloatType as S,UnsignedByteType as T,FloatType as M,RGBAFormat as x,Plane as A,EquirectangularReflectionMapping as R,EquirectangularRefractionMapping as b,WebGLCubeRenderTarget as C,CubeReflectionMapping as P,CubeRefractionMapping as L,BufferGeometry as U,OrthographicCamera as D,PerspectiveCamera as w,NoToneMapping as I,MeshBasicMaterial as N,error as y,NoBlending as O,WebGLRenderTarget as F,BufferAttribute as B,LinearSRGBColorSpace as G,LinearFilter as H,warnOnce as V,Uint32BufferAttribute as W,Uint16BufferAttribute as k,arrayNeedsUint32 as z,Vector4 as X,DataArrayTexture as Y,Float32BufferAttribute as K,RawShaderMaterial as j,CustomToneMapping as q,NeutralToneMapping as Z,AgXToneMapping as $,ACESFilmicToneMapping as Q,CineonToneMapping as J,ReinhardToneMapping as ee,LinearToneMapping as te,CubeTexture as ne,Data3DTexture as ie,GreaterEqualCompare as re,LessEqualCompare as ae,DepthTexture as oe,Texture as se,GLSL3 as le,VSMShadowMap as ce,PCFShadowMap as de,AddOperation as ue,MixOperation as fe,MultiplyOperation as pe,LinearTransfer as me,UniformsUtils as he,DoubleSide as _e,NormalBlending as ge,TangentSpaceNormalMap as ve,ObjectSpaceNormalMap as Ee,Layers as Se,RGFormat as Te,Frustum as Me,MeshDepthMaterial as xe,MeshDistanceMaterial as Ae,PCFSoftShadowMap as Re,DepthFormat as be,NearestFilter as Ce,CubeDepthTexture as Pe,UnsignedIntType as Le,LessEqualDepth as Ue,ReverseSubtractEquation as De,SubtractEquation as we,AddEquation as Ie,OneMinusConstantAlphaFactor as Ne,ConstantAlphaFactor as ye,OneMinusConstantColorFactor as Oe,ConstantColorFactor as Fe,OneMinusDstAlphaFactor as Be,OneMinusDstColorFactor as Ge,OneMinusSrcAlphaFactor as He,OneMinusSrcColorFactor as Ve,DstAlphaFactor as We,DstColorFactor as ke,SrcAlphaSaturateFactor as ze,SrcAlphaFactor as Xe,SrcColorFactor as Ye,OneFactor as Ke,ZeroFactor as je,NotEqualDepth as qe,GreaterDepth as Ze,GreaterEqualDepth as $e,EqualDepth as Qe,LessDepth as Je,AlwaysDepth as et,NeverDepth as tt,CullFaceNone as nt,CullFaceBack as it,CullFaceFront as rt,CustomBlending as at,MultiplyBlending as ot,SubtractiveBlending as st,AdditiveBlending as lt,MinEquation as ct,MaxEquation as dt,MirroredRepeatWrapping as ut,ClampToEdgeWrapping as ft,RepeatWrapping as pt,LinearMipmapLinearFilter as mt,LinearMipmapNearestFilter as ht,NearestMipmapLinearFilter as _t,NearestMipmapNearestFilter as gt,NotEqualCompare as vt,GreaterCompare as Et,EqualCompare as St,LessCompare as Tt,AlwaysCompare as Mt,NeverCompare as xt,NoColorSpace as At,DepthStencilFormat as Rt,getByteLength as bt,UnsignedInt248Type as Ct,UnsignedShortType as Pt,createElementNS as Lt,UnsignedShort4444Type as Ut,UnsignedShort5551Type as Dt,UnsignedInt5999Type as wt,UnsignedInt101111Type as It,ByteType as Nt,ShortType as yt,AlphaFormat as Ot,RGBFormat as Ft,RedFormat as Bt,RedIntegerFormat as Gt,RGIntegerFormat as Ht,RGBAIntegerFormat as Vt,RGB_S3TC_DXT1_Format as Wt,RGBA_S3TC_DXT1_Format as kt,RGBA_S3TC_DXT3_Format as zt,RGBA_S3TC_DXT5_Format as Xt,RGB_PVRTC_4BPPV1_Format as Yt,RGB_PVRTC_2BPPV1_Format as Kt,RGBA_PVRTC_4BPPV1_Format as jt,RGBA_PVRTC_2BPPV1_Format as qt,RGB_ETC1_Format as Zt,RGB_ETC2_Format as $t,RGBA_ETC2_EAC_Format as Qt,R11_EAC_Format as Jt,SIGNED_R11_EAC_Format as en,RG11_EAC_Format as tn,SIGNED_RG11_EAC_Format as nn,RGBA_ASTC_4x4_Format as rn,RGBA_ASTC_5x4_Format as an,RGBA_ASTC_5x5_Format as on,RGBA_ASTC_6x5_Format as sn,RGBA_ASTC_6x6_Format as ln,RGBA_ASTC_8x5_Format as cn,RGBA_ASTC_8x6_Format as dn,RGBA_ASTC_8x8_Format as un,RGBA_ASTC_10x5_Format as fn,RGBA_ASTC_10x6_Format as pn,RGBA_ASTC_10x8_Format as mn,RGBA_ASTC_10x10_Format as hn,RGBA_ASTC_12x10_Format as _n,RGBA_ASTC_12x12_Format as gn,RGBA_BPTC_Format as vn,RGB_BPTC_SIGNED_Format as En,RGB_BPTC_UNSIGNED_Format as Sn,RED_RGTC1_Format as Tn,SIGNED_RED_RGTC1_Format as Mn,RED_GREEN_RGTC2_Format as xn,SIGNED_RED_GREEN_RGTC2_Format as An,ExternalTexture as Rn,EventDispatcher as bn,ArrayCamera as Cn,WebXRController as Pn,RAD2DEG as Ln,DataTexture as Un,createCanvasElement as Dn,SRGBColorSpace as wn,REVISION as In,log as Nn,WebGLCoordinateSystem as yn,probeAsync as On}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,Compatibility,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,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,NoNormalPacking,NormalAnimationBlendMode,NormalGAPacking,NormalRGPacking,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,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,Timer,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,UVMapping,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGPUCoordinateSystem,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,ZeroStencilOp,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";function Fn(){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 Bn(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}\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#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, pow4( 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;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = 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 = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, 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.0001, 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:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\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\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\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 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.specularColorBlended;\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 * transpose( 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 rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\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.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * 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 \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\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\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\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 ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\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.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\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 ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow 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\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube 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\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\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 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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.diffuseContribution, material.specularColorBlended, 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\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\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}",distance_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}",distance_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 \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 = vec4( dist, 0.0, 0.0, 1.0 );\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 \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 \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( normalize( normal ) * 0.5 + 0.5, 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 \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 \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 \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \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 \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 \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \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}"},Hn={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},dfgLUT:{value:null}},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}}},Vn={basic:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.fog]),vertexShader:Gn.meshbasic_vert,fragmentShader:Gn.meshbasic_frag},lambert:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshlambert_vert,fragmentShader:Gn.meshlambert_frag},phong:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Gn.meshphong_vert,fragmentShader:Gn.meshphong_frag},standard:{uniforms:i([Hn.common,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.roughnessmap,Hn.metalnessmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag},toon:{uniforms:i([Hn.common,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.gradientmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshtoon_vert,fragmentShader:Gn.meshtoon_frag},matcap:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,{matcap:{value:null}}]),vertexShader:Gn.meshmatcap_vert,fragmentShader:Gn.meshmatcap_frag},points:{uniforms:i([Hn.points,Hn.fog]),vertexShader:Gn.points_vert,fragmentShader:Gn.points_frag},dashed:{uniforms:i([Hn.common,Hn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Gn.linedashed_vert,fragmentShader:Gn.linedashed_frag},depth:{uniforms:i([Hn.common,Hn.displacementmap]),vertexShader:Gn.depth_vert,fragmentShader:Gn.depth_frag},normal:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,{opacity:{value:1}}]),vertexShader:Gn.meshnormal_vert,fragmentShader:Gn.meshnormal_frag},sprite:{uniforms:i([Hn.sprite,Hn.fog]),vertexShader:Gn.sprite_vert,fragmentShader:Gn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Gn.background_vert,fragmentShader:Gn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Gn.backgroundCube_vert,fragmentShader:Gn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Gn.cube_vert,fragmentShader:Gn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Gn.equirect_vert,fragmentShader:Gn.equirect_frag},distance:{uniforms:i([Hn.common,Hn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Gn.distance_vert,fragmentShader:Gn.distance_frag},shadow:{uniforms:i([Hn.lights,Hn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Gn.shadow_vert,fragmentShader:Gn.shadow_frag}};Vn.physical={uniforms:i([Vn.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:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag};const Wn={r:0,b:0,g:0},kn=new u,zn=new f;function Xn(e,t,i,r,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,A=0,R=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(Wn,g(e)),r.buffers.color.setClear(Wn.r,Wn.g,Wn.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(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Vn.backgroundCube.uniforms),vertexShader:Vn.backgroundCube.vertexShader,fragmentShader:Vn.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)),kn.copy(n.backgroundRotation),kn.x*=-1,kn.y*=-1,kn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(kn.y*=-1,kn.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(zn.makeRotationFromEuler(kn)),T.material.toneMapped=p.getTransfer(i.colorSpace)!==m,x===i&&A===i.version&&R===e.toneMapping||(T.material.needsUpdate=!0,x=i,A=i.version,R=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(Vn.background.uniforms),vertexShader:Vn.background.vertexShader,fragmentShader:Vn.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&&A===i.version&&R===e.toneMapping||(S.material.needsUpdate=!0,x=i,A=i.version,R=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 Yn(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&&(E("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);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===x||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==T&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),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),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new A,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 Zn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=P:t===b&&(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===b){if(t.has(r)){return n(t.get(r).texture,r.mapping)}{const a=r.image;if(a&&a.height>0){const o=new C(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 $n=[.125,.215,.35,.446,.526,.582],Qn=20,Jn=new D,ei=new n;let ti=null,ni=0,ii=0,ri=!1;const ai=new r;class oi{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ai}=r;ti=this._renderer.getRenderTarget(),ni=this._renderer.getActiveCubeFace(),ii=this._renderer.getActiveMipmapLevel(),ri=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=di(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ci(),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())}_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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=$n[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);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];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const T=new U;T.setAttribute("position",new B(v,h)),T.setAttribute("uv",new B(E,_)),T.setAttribute("faceIndex",new B(S,g)),i.push(new o(T,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Qn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Qn,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:ui(),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:O,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ui(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:O,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new U,e);this._renderer.compile(t,Jn)}_sceneToCubeUV(e,t,n,i,r){const a=new w(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(ei),u.toneMapping=I,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new N({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(ei),_=!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;li(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===P||e.mapping===L;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=di()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ci());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;li(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,Jn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,li(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,Jn),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,li(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,Jn)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&y("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):Qn;m>Qn&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;eg-4?i-g+4:0),4*(this._cubeSize-v),3*v,2*v),s.setRenderTarget(t),s.render(c,Jn)}}function si(e,t,n){const i=new F(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function li(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function ci(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ui(),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:O,depthTest:!1,depthWrite:!1})}function di(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ui(),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:O,depthTest:!1,depthWrite:!1})}function ui(){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 fi(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===b,s=a===P||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 oi(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&&(T=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*T*4*u),A=new Y(x,S,T,u);A.type=M,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new D(-1,1,1,-1,0,1);let f,h=null,_=null,g=!1,v=null,E=[],T=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===E[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=bi[r];if(void 0===a&&(a=new Float32Array(r),bi[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 wi(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function br(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let Cr=0;const Pr=new e;function Lr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Ur(e,t){const n=function(e){p._getMatrix(Pr,p.workingColorSpace,e);const t=`mat3( ${Pr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case me:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return E("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")}const Dr={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[q]:"Custom"};function wr(e,t){const n=Dr[t];return void 0===n?(E("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ir=new r;function Nr(){p.getLuminanceCoefficients(Ir);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ir.x.toFixed(4)}, ${Ir.y.toFixed(4)}, ${Ir.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function yr(e){return""!==e}function Or(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 Fr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Br=/^[ \t]*#include +<([\w\d./]+)>/gm;function Gr(e){return e.replace(Br,Vr)}const Hr=new Map;function Vr(e,t){let n=Gn[t];if(void 0===n){const e=Hr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Gn[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Gr(n)}const Wr=/#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 kr(e){return e.replace(Wr,zr)}function zr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(yr).join("\n"),g.length>0&&(g+="\n")):(_=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+d:"",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 "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","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(yr).join("\n"),g=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.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 "+l:"",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_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==I?"#define TONE_MAPPING":"",n.toneMapping!==I?Gn.tonemapping_pars_fragment:"",n.toneMapping!==I?wr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Gn.colorspace_pars_fragment,Ur("linearToOutputTexel",n.outputColorSpace),Nr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(yr).join("\n")),o=Gr(o),o=Or(o,n),o=Fr(o,n),s=Gr(s),s=Or(s,n),s=Fr(s,n),o=kr(o),s=kr(s),!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===le?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===le?"":"#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"+g);const S=v+_+o,T=v+g+s,M=br(r,r.VERTEX_SHADER,S),x=br(r,r.FRAGMENT_SHADER,T);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(M)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,M,x);else{const e=Lr(r,M,"vertex"),n=Lr(r,x,"fragment");y("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?E("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(M),r.deleteShader(x),R=new Rr(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,ie=o.transmission>0,re=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,fe=!!o.specularMap,pe=!!o.specularColorMap,me=!!o.specularIntensityMap,he=ie&&!!o.transmissionMap,Se=ie&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Ae=!!o.alphaHash,Re=!!o.extensions;let be=I;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:D,defines:o.defines,customVertexShaderID:w,customFragmentShaderID:N,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:H,batchingColor:H&&null!==T._colorsTexture,instancing:B,instancingColor:B&&null!==T.instanceColor,instancingMorph:B&&null!==T.morphTexture,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:W,envMap:k,envMapMode:k&&R.mapping,envMapCubeUVHeight:b,aoMap:z,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===Ee,normalMapTangentSpace:K&&o.normalMapType===ve,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:re,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:fe,specularColorMap:pe,specularIntensityMap:me,transmission:ie,transmissionMap:he,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===ge&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Ae,combine:o.combine,mapUv:V&&S(o.map.channel),aoMapUv:z&&S(o.aoMap.channel),lightMapUv:X&&S(o.lightMap.channel),bumpMapUv:Y&&S(o.bumpMap.channel),normalMapUv:K&&S(o.normalMap.channel),displacementMapUv:j&&S(o.displacementMap.channel),emissiveMapUv:q&&S(o.emissiveMap.channel),metalnessMapUv:Z&&S(o.metalnessMap.channel),roughnessMapUv:$&&S(o.roughnessMap.channel),anisotropyMapUv:re&&S(o.anisotropyMap.channel),clearcoatMapUv:ae&&S(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&S(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&S(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&S(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&S(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&S(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&S(o.sheenRoughnessMap.channel),specularMapUv:fe&&S(o.specularMap.channel),specularColorMapUv:pe&&S(o.specularColorMap.channel),specularIntensityMapUv:me&&S(o.specularIntensityMap.channel),transmissionMapUv:he&&S(o.transmissionMap.channel),thicknessMapUv:Se&&S(o.thicknessMap.channel),alphaMapUv:Me&&S(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:_,reversedDepthBuffer:F,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:L,morphTextureStride:y,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:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===_e,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Re&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Re&&!0===o.extensions.multiDraw||H)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},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.instancing&&l.enable(0);t.instancingColor&&l.enable(1);t.instancingMorph&&l.enable(2);t.matcap&&l.enable(3);t.envMap&&l.enable(4);t.normalMapObjectSpace&&l.enable(5);t.normalMapTangentSpace&&l.enable(6);t.clearcoat&&l.enable(7);t.iridescence&&l.enable(8);t.alphaTest&&l.enable(9);t.vertexColors&&l.enable(10);t.vertexAlphas&&l.enable(11);t.vertexUv1s&&l.enable(12);t.vertexUv2s&&l.enable(13);t.vertexUv3s&&l.enable(14);t.vertexTangents&&l.enable(15);t.anisotropy&&l.enable(16);t.alphaHash&&l.enable(17);t.batching&&l.enable(18);t.dispersion&&l.enable(19);t.batchingColor&&l.enable(20);t.gradientMap&&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.reversedDepthBuffer&&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);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=Vn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=h.get(n);return void 0!==i?++i.usedTimes:(i=new Zr(e,n,t,o),f.push(i),h.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=f.indexOf(e);f[t]=f[f.length-1],f.pop(),h.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){d.remove(e)},programs:f,dispose:function(){d.dispose()}}}function ta(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function na(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function ia(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 ra(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||na),i.length>1&&i.sort(t||ia),r.length>1&&r.sort(t||ia)}}}function aa(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ra,e.set(t,[r])):n>=i.length?(r=new ra,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function oa(){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 sa=0;function la(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function ca(e){const n=new oa,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(la);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Hn.LTC_FLOAT_1,a.rectAreaLTC2=Hn.LTC_FLOAT_2):(a.rectAreaLTC1=Hn.LTC_HALF_1,a.rectAreaLTC2=Hn.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=sa++)},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 da(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const fa=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],pa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],ma=new f,ha=new r,_a=new r;function ga(e,n,i){let r=new Me;const a=new t,s=new t,d=new X,u=new xe,f=new Ae,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[_e]:_e},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;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\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( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const T=new U;T.setAttribute("position",new B(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(T,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=de;let R=this.type;function b(t,i){const r=n.update(x);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 F(a.x,a.y,{format:Te,type:S})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,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,x,null)}function P(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",D)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===ce?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 L(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===ce)&&(!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;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y)),null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===ce){if(l.isPointLight){E("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new F(a.x,a.y,{format:Te,type:S,minFilter:H,magFilter:H,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new oe(a.x,a.y,M),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=be,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce}else{l.isPointLight?(c.map=new C(a.x),c.map.depthTexture=new Pe(a.x,Le)):(c.map=new F(a.x,a.y),c.map.depthTexture=new oe(a.x,a.y,Le)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=be;const t=e.state.buffers.depth.getReversed();this.type===de?(c.map.depthTexture.compareFunction=t?re:ae,c.map.depthTexture.minFilter=H,c.map.depthTexture.magFilter=H):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce)}c.camera.updateProjectionMatrix()}const h=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,F={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new X).fromArray(B),V=(new X).fromArray(G);function W(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===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),E("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&E("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function S(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function R(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 b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];E("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),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?me: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 C(t,n){let i;return t?null===n||n===Le||n===Ct?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Pt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Le||n===Ct?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Pt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Ce&&e.minFilter!==H?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 L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),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;i0&&a.__version!==t.version){const e=t.image;if(null===e)E("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void k(a,t,n);E("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const N={[pt]:e.REPEAT,[ft]:e.CLAMP_TO_EDGE,[ut]:e.MIRRORED_REPEAT},O={[Ce]:e.NEAREST,[gt]:e.NEAREST_MIPMAP_NEAREST,[_t]:e.NEAREST_MIPMAP_LINEAR,[H]:e.LINEAR,[ht]:e.LINEAR_MIPMAP_NEAREST,[mt]:e.LINEAR_MIPMAP_LINEAR},F={[xt]:e.NEVER,[Mt]:e.ALWAYS,[Tt]:e.LESS,[ae]:e.LEQUAL,[St]:e.EQUAL,[re]:e.GEQUAL,[Et]:e.GREATER,[vt]:e.NOTEQUAL};function B(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==H&&i.magFilter!==ht&&i.magFilter!==_t&&i.magFilter!==mt&&i.minFilter!==H&&i.minFilter!==ht&&i.minFilter!==_t&&i.minFilter!==mt||E("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,N[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,N[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,N[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,O[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,O[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,F[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Ce)return;if(i.minFilter!==_t&&i.minFilter!==mt)return;if(i.type===M&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||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 V(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.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 W(e,t,n){return Math.floor(Math.floor(e/n)/t)}function k(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=V(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===At?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===At||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=v(n.image,!1,a.maxTextureSize);m=Q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,T=b(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);B(l,n);const M=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,U=d.dataReady,D=P(n,m);if(n.isDepthTexture)T=C(n.format===Rt,n.type),L&&(R?i.texStorage2D(e.TEXTURE_2D,1,T,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,T,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(M.length>0){R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,n=M.length;te.start-t.start);let s=0;for(let e=1;e0){const r=bt(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,T,g.width,g.height,m.depth,0,g.data,0,0);else E("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?U&&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,T,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,r=M.length;t0){const t=bt(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,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&i.texStorage3D(e.TEXTURE_3D,D,T,m.width,m.height,m.depth),U&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)i.texStorage2D(e.TEXTURE_2D,D,T,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(M.length>0){if(R&&L){const t=J(M[0]);i.texStorage2D(e.TEXTURE_2D,D,T,t.width,t.height)}for(let t=0,n=M.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),$(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,Z(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),i.bindFramebuffer(e.FRAMEBUFFER,null)}function X(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;$(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,Z(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,Z(n),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;r{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)for(let e=0;e<6;e++)Y(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t,0):Y(n.__webglFramebuffer,t,0)}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(),X(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(),X(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)}const j=[],q=[];function Z(e){return Math.min(a.maxSamples,e.samples)}function $(e){const t=r.get(e);return e.samples>0&&!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!==G&&n!==At&&(p.getTransfer(n)===m?i===x&&r===T||E("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):y("WebGLTextures: Unsupported texture color space:",n)),t}function J(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=w;return e>=a.maxTextures&&E("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),w+=1,e},this.resetTextureUnits=function(){w=0},this.setTexture2D=I,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=V(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===At?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===At||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]:v(n.image[e],!0,a.maxCubemapSize),h[e]=Q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),T=o.convert(n.type),M=b(n.internalFormat,g,T,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(B(e.TEXTURE_CUBE_MAP,n),f){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=J(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,T,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,M,h[t].width,h[t].height,0,g,T,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===$(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===$(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,d=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 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 xa extends bn{constructor(e,n){super();const i=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _="undefined"!=typeof XRWebGLBinding,g=new Ma,v={},S=n.getContextAttributes();let M=null,A=null;const R=[],b=[],C=new t;let P=null;const L=new w;L.viewport=new X;const U=new w;U.viewport=new X;const D=[L,U],I=new Cn;let N=null,y=null;function O(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",O),a.removeEventListener("selectstart",O),a.removeEventListener("selectend",O),a.removeEventListener("squeeze",O),a.removeEventListener("squeezestart",O),a.removeEventListener("squeezeend",O),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[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.getController=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&E("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&E("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){M=e.getRenderTarget(),a.addEventListener("select",O),a.addEventListener("selectstart",O),a.addEventListener("selectend",O),a.addEventListener("squeeze",O),a.addEventListener("squeezestart",O),a.addEventListener("squeezeend",O),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),P=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;S.depth&&(r=S.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=S.stencil?Rt:be,i=S.stencil?Ct:Le);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new F(p.textureWidth,p.textureHeight,{format:x,type:T,depthTexture:new oe(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:S.stencil,colorSpace:e.outputColorSpace,samples:S.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:S.antialias,alpha:!0,depth:S.depth,stencil:S.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new F(m.framebufferWidth,m.framebufferHeight,{format:x,type:T,colorSpace:e.outputColorSpace,stencilBuffer:S.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(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===a)return;let t=e.near,n=e.far;null!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),I.near=U.near=L.near=t,I.far=U.far=L.far=n,N===I.near&&y===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),N=I.near,y=I.far),I.layers.mask=6|e.layers.mask,L.layers.mask=3&I.layers.mask,U.layers.mask=5&I.layers.mask;const i=e.parent,r=I.cameras;W(I,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,Aa.copy(o),Aa.x*=-1,Aa.y*=-1,Aa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(Aa.y*=-1,Aa.z*=-1),e.envMapRotation.value.setFromMatrix4(Ra.makeRotationFromEuler(Aa)),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?E("WebGLRenderer: Texture samplers can not be part of an uniforms group."):E("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=I;i.toneMapped&&(null!==k&&!0!==k.isXRRenderTarget||(m=N.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=Se.get(i),v=L.state.lights;if(!0===se&&(!0===le||e!==Y)){const t=e===Y&&i.id===z;Ne.setState(i,e,t)}let E=!1;i.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||r.isBatchedMesh&&!1===g.batching?E=!0:r.isBatchedMesh||!0!==g.batching?r.isBatchedMesh&&!0===g.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===g.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===g.instancing?E=!0:r.isInstancedMesh||!0!==g.instancing?r.isSkinnedMesh&&!1===g.skinning?E=!0:r.isSkinnedMesh||!0!==g.skinning?r.isInstancedMesh&&!0===g.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===g.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===g.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===g.instancingMorph&&null!==r.morphTexture||g.envMap!==l||!0===i.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ne.numPlanes&&g.numIntersection===Ne.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=i.version);let T=g.currentProgram;!0===E&&(T=st(i,t,r));let M=!1,x=!1,A=!1;const R=T.getUniforms(),b=g.uniforms;ve.useProgram(T.program)&&(M=!0,x=!0,A=!0);i.id!==z&&(z=i.id,x=!0);if(M||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),R.setValue(ke,"projectionMatrix",e.projectionMatrix),R.setValue(ke,"viewMatrix",e.matrixWorldInverse);const t=R.map.cameraPosition;void 0!==t&&t.setValue(ke,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&R.setValue(ke,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&R.setValue(ke,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,x=!0,A=!0)}g.needsLights&&(v.state.directionalShadowMap.length>0&&R.setValue(ke,"directionalShadowMap",v.state.directionalShadowMap,xe),v.state.spotShadowMap.length>0&&R.setValue(ke,"spotShadowMap",v.state.spotShadowMap,xe),v.state.pointShadowMap.length>0&&R.setValue(ke,"pointShadowMap",v.state.pointShadowMap,xe));if(r.isSkinnedMesh){R.setOptional(ke,r,"bindMatrix"),R.setOptional(ke,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),R.setValue(ke,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(R.setOptional(ke,r,"batchingTexture"),R.setValue(ke,"batchingTexture",r._matricesTexture,xe),R.setOptional(ke,r,"batchingIdTexture"),R.setValue(ke,"batchingIdTexture",r._indirectTexture,xe),R.setOptional(ke,r,"batchingColorTexture"),null!==r._colorsTexture&&R.setValue(ke,"batchingColorTexture",r._colorsTexture,xe));const C=n.morphAttributes;void 0===C.position&&void 0===C.normal&&void 0===C.color||Fe.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,R.setValue(ke,"receiveShadow",r.receiveShadow));i.isMeshGouraudMaterial&&null!==i.envMap&&(b.envMap.value=l,b.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);void 0!==b.dfgLUT&&(b.dfgLUT.value=(null===La&&(La=new Un(Pa,16,16,Te,S),La.name="DFG_LUT",La.minFilter=H,La.magFilter=H,La.wrapS=ft,La.wrapT=ft,La.generateMipmaps=!1,La.needsUpdate=!0),La));x&&(R.setValue(ke,"toneMappingExposure",N.toneMappingExposure),g.needsLights&&(U=A,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===i.fog&&De.refreshFogUniforms(b,a),De.refreshMaterialUniforms(b,i,ee,J,L.state.transmissionRenderTarget[e.id]),Rr.upload(ke,lt(g),b,xe));var P,U;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Rr.upload(ke,lt(g),b,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&R.setValue(ke,"center",r.center);if(R.setValue(ke,"modelViewMatrix",r.modelViewMatrix),R.setValue(ke,"normalMatrix",r.normalMatrix),R.setValue(ke,"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){Se.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==he.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Qe=null;function Je(){tt.stop()}function et(){tt.start()}const tt=new Fn;function nt(e,t,n,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)L.pushLight(e),e.castShadow&&L.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||oe.intersectsSprite(e)){i&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=Pe.update(e),r=e.material;r.visible&&P.push(e,t,r,n,ue.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||oe.intersectsObject(e))){const t=Pe.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ue.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ue.copy(t.boundingSphere.center)),ue.applyMatrix4(e.matrixWorld).applyMatrix4(ce)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&at(r,t,n),a.length>0&&at(a,t,n),o.length>0&&at(o,t,n),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function rt(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===L.state.transmissionRenderTarget[i.id]){const e=he.has("EXT_color_buffer_half_float")||he.has("EXT_color_buffer_float");L.state.transmissionRenderTarget[i.id]=new F(1,1,{generateMipmaps:!0,type:e?S:T,minFilter:mt,samples:ge.samples,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace})}const r=L.state.transmissionRenderTarget[i.id],a=i.viewport||K;r.setSize(a.z*N.transmissionResolutionScale,a.w*N.transmissionResolutionScale);const s=N.getRenderTarget(),l=N.getActiveCubeFace(),d=N.getActiveMipmapLevel();N.setRenderTarget(r),N.getClearColor(Z),$=N.getClearAlpha(),$<1&&N.setClearColor(16777215,.5),N.clear(),pe&&Oe.render(n);const u=N.toneMapping;N.toneMapping=I;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),L.setupLightsView(i),!0===se&&Ne.setGlobalState(N.clippingPlanes,i),at(e,n,i),xe.updateMultisampleRenderTarget(r),xe.updateRenderTargetMipmap(r),!1===he.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&rt(n,i,e,t),pe&&Oe.render(e),it(P,e,t)}null!==k&&0===W&&(xe.updateMultisampleRenderTarget(k),xe.updateRenderTargetMipmap(k)),i&&w.end(N),!0===e.isScene&&e.onAfterRender(N,e,t),Ve.resetDefaultState(),z=-1,Y=null,D.pop(),D.length>0?(L=D[D.length-1],!0===se&&Ne.setGlobalState(N.clippingPlanes,L.state.camera)):L=null,U.pop(),P=U.length>0?U[U.length-1]:null},this.getActiveCubeFace=function(){return B},this.getActiveMipmapLevel=function(){return W},this.getRenderTarget=function(){return k},this.setRenderTargetTextures=function(e,t,n){const i=Se.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Se.get(e.texture).__webglTexture=t,Se.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Se.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const dt=ke.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){k=e,B=t,W=n;let i=null,r=!1,a=!1;if(e){const o=Se.get(e);if(void 0!==o.__useDefaultFramebuffer)return ve.bindFramebuffer(ke.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest,ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),void(z=-1);if(void 0===o.__webglFramebuffer)xe.setupRenderTarget(e);else if(o.__hasExternalTextures)xe.rebindTextures(e,Se.get(e.texture).__webglTexture,Se.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Se.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");xe.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Se.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===xe.useMultisampledRTT(e)?Se.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest}else K.copy(ie).multiplyScalar(ee).floor(),j.copy(re).multiplyScalar(ee).floor(),q=ae;0!==n&&(i=dt);if(ve.bindFramebuffer(ke.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),r){const i=Se.get(e.texture);ke.framebufferTexture2D(ke.FRAMEBUFFER,ke.COLOR_ATTACHMENT0,ke.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&(e.textures.length>1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),ke.readPixels(t,n,i,r,He.convert(l),He.convert(c),a))}finally{const e=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Se.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ve.bindFramebuffer(ke.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(!ge.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ke.createBuffer();ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.bufferData(ke.PIXEL_PACK_BUFFER,a.byteLength,ke.STREAM_READ),e.textures.length>1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),ke.readPixels(t,n,i,r,He.convert(c),He.convert(d),0);const f=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,f);const p=ke.fenceSync(ke.SYNC_GPU_COMMANDS_COMPLETE,0);return ke.flush(),await On(ke,p,4),ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.getBufferSubData(ke.PIXEL_PACK_BUFFER,0,a),ke.deleteBuffer(u),ke.deleteSync(p),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;xe.setTexture2D(e,0),ke.copyTexSubImage2D(ke.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const ut=ke.createFramebuffer(),pt=ke.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;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 _=He.convert(t.format),g=He.convert(t.type);let v;t.isData3DTexture?(xe.setTexture3D(t,0),v=ke.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=ke.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=ke.TEXTURE_2D),ke.pixelStorei(ke.UNPACK_FLIP_Y_WEBGL,t.flipY),ke.pixelStorei(ke.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ke.pixelStorei(ke.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ke.getParameter(ke.UNPACK_ROW_LENGTH),S=ke.getParameter(ke.UNPACK_IMAGE_HEIGHT),T=ke.getParameter(ke.UNPACK_SKIP_PIXELS),M=ke.getParameter(ke.UNPACK_SKIP_ROWS),x=ke.getParameter(ke.UNPACK_SKIP_IMAGES);ke.pixelStorei(ke.UNPACK_ROW_LENGTH,h.width),ke.pixelStorei(ke.UNPACK_IMAGE_HEIGHT,h.height),ke.pixelStorei(ke.UNPACK_SKIP_PIXELS,c),ke.pixelStorei(ke.UNPACK_SKIP_ROWS,d),ke.pixelStorei(ke.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Se.get(e),i=Se.get(t),h=Se.get(n.__renderTarget),_=Se.get(i.__renderTarget);ve.bindFramebuffer(ke.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(ke.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}\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#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, pow4( 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;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = 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 = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, 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.0001, 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:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\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\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\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 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.specularColorBlended;\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 * transpose( 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 rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\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}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\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.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * 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 \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\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\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\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 ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\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.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\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 ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\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\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow 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\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube 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\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\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 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\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.diffuseContribution, material.specularColorBlended, 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\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\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}",distance_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}",distance_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 \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 = vec4( dist, 0.0, 0.0, 1.0 );\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 \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 \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( normalize( normal ) * 0.5 + 0.5, 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 \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 \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 \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \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 \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 \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \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}"},Hn={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},dfgLUT:{value:null}},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}}},Vn={basic:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.fog]),vertexShader:Gn.meshbasic_vert,fragmentShader:Gn.meshbasic_frag},lambert:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshlambert_vert,fragmentShader:Gn.meshlambert_frag},phong:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Gn.meshphong_vert,fragmentShader:Gn.meshphong_frag},standard:{uniforms:i([Hn.common,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.roughnessmap,Hn.metalnessmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag},toon:{uniforms:i([Hn.common,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.gradientmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshtoon_vert,fragmentShader:Gn.meshtoon_frag},matcap:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,{matcap:{value:null}}]),vertexShader:Gn.meshmatcap_vert,fragmentShader:Gn.meshmatcap_frag},points:{uniforms:i([Hn.points,Hn.fog]),vertexShader:Gn.points_vert,fragmentShader:Gn.points_frag},dashed:{uniforms:i([Hn.common,Hn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Gn.linedashed_vert,fragmentShader:Gn.linedashed_frag},depth:{uniforms:i([Hn.common,Hn.displacementmap]),vertexShader:Gn.depth_vert,fragmentShader:Gn.depth_frag},normal:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,{opacity:{value:1}}]),vertexShader:Gn.meshnormal_vert,fragmentShader:Gn.meshnormal_frag},sprite:{uniforms:i([Hn.sprite,Hn.fog]),vertexShader:Gn.sprite_vert,fragmentShader:Gn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Gn.background_vert,fragmentShader:Gn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Gn.backgroundCube_vert,fragmentShader:Gn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Gn.cube_vert,fragmentShader:Gn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Gn.equirect_vert,fragmentShader:Gn.equirect_frag},distance:{uniforms:i([Hn.common,Hn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Gn.distance_vert,fragmentShader:Gn.distance_frag},shadow:{uniforms:i([Hn.lights,Hn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Gn.shadow_vert,fragmentShader:Gn.shadow_frag}};Vn.physical={uniforms:i([Vn.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:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag};const Wn={r:0,b:0,g:0},kn=new u,zn=new f;function Xn(e,t,i,r,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,A=0,R=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(Wn,g(e)),r.buffers.color.setClear(Wn.r,Wn.g,Wn.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(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Vn.backgroundCube.uniforms),vertexShader:Vn.backgroundCube.vertexShader,fragmentShader:Vn.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)),kn.copy(n.backgroundRotation),kn.x*=-1,kn.y*=-1,kn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(kn.y*=-1,kn.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(zn.makeRotationFromEuler(kn)),T.material.toneMapped=p.getTransfer(i.colorSpace)!==m,x===i&&A===i.version&&R===e.toneMapping||(T.material.needsUpdate=!0,x=i,A=i.version,R=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(Vn.background.uniforms),vertexShader:Vn.background.vertexShader,fragmentShader:Vn.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&&A===i.version&&R===e.toneMapping||(S.material.needsUpdate=!0,x=i,A=i.version,R=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 Yn(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&&(E("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);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===x||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==T&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),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),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new A,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 Zn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=P:t===b&&(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===b){if(t.has(r)){return n(t.get(r).texture,r.mapping)}{const a=r.image;if(a&&a.height>0){const o=new C(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 $n=[.125,.215,.35,.446,.526,.582],Qn=20,Jn=new D,ei=new n;let ti=null,ni=0,ii=0,ri=!1;const ai=new r;class oi{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ai}=r;ti=this._renderer.getRenderTarget(),ni=this._renderer.getActiveCubeFace(),ii=this._renderer.getActiveMipmapLevel(),ri=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=di(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ci(),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())}_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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=$n[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);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];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const T=new U;T.setAttribute("position",new B(v,h)),T.setAttribute("uv",new B(E,_)),T.setAttribute("faceIndex",new B(S,g)),i.push(new o(T,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Qn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Qn,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:ui(),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:O,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ui(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:O,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new U,e);this._renderer.compile(t,Jn)}_sceneToCubeUV(e,t,n,i,r){const a=new w(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(ei),u.toneMapping=I,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new N({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(ei),_=!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;li(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===P||e.mapping===L;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=di()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ci());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;li(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,Jn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,li(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,Jn),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,li(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,Jn)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&y("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):Qn;m>Qn&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;eg-4?i-g+4:0),4*(this._cubeSize-v),3*v,2*v),s.setRenderTarget(t),s.render(c,Jn)}}function si(e,t,n){const i=new F(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function li(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function ci(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ui(),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:O,depthTest:!1,depthWrite:!1})}function di(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ui(),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:O,depthTest:!1,depthWrite:!1})}function ui(){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 fi(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===b,s=a===P||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 oi(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&&(T=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*T*4*u),A=new Y(x,S,T,u);A.type=M,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new D(-1,1,1,-1,0,1);let f,h=null,_=null,g=!1,v=null,E=[],T=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===E[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=bi[r];if(void 0===a&&(a=new Float32Array(r),bi[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 wi(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function br(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let Cr=0;const Pr=new e;function Lr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Ur(e,t){const n=function(e){p._getMatrix(Pr,p.workingColorSpace,e);const t=`mat3( ${Pr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case me:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return E("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")}const Dr={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[q]:"Custom"};function wr(e,t){const n=Dr[t];return void 0===n?(E("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ir=new r;function Nr(){p.getLuminanceCoefficients(Ir);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ir.x.toFixed(4)}, ${Ir.y.toFixed(4)}, ${Ir.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function yr(e){return""!==e}function Or(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 Fr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Br=/^[ \t]*#include +<([\w\d./]+)>/gm;function Gr(e){return e.replace(Br,Vr)}const Hr=new Map;function Vr(e,t){let n=Gn[t];if(void 0===n){const e=Hr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Gn[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Gr(n)}const Wr=/#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 kr(e){return e.replace(Wr,zr)}function zr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(yr).join("\n"),g.length>0&&(g+="\n")):(_=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+d:"",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 "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","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(yr).join("\n"),g=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,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 "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.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 "+l:"",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_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==I?"#define TONE_MAPPING":"",n.toneMapping!==I?Gn.tonemapping_pars_fragment:"",n.toneMapping!==I?wr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Gn.colorspace_pars_fragment,Ur("linearToOutputTexel",n.outputColorSpace),Nr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(yr).join("\n")),o=Gr(o),o=Or(o,n),o=Fr(o,n),s=Gr(s),s=Or(s,n),s=Fr(s,n),o=kr(o),s=kr(s),!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===le?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===le?"":"#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"+g);const S=v+_+o,T=v+g+s,M=br(r,r.VERTEX_SHADER,S),x=br(r,r.FRAGMENT_SHADER,T);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(M)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,M,x);else{const e=Lr(r,M,"vertex"),n=Lr(r,x,"fragment");y("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?E("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(M),r.deleteShader(x),R=new Rr(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,ie=o.transmission>0,re=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,fe=!!o.specularMap,pe=!!o.specularColorMap,me=!!o.specularIntensityMap,he=ie&&!!o.transmissionMap,Se=ie&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Ae=!!o.alphaHash,Re=!!o.extensions;let be=I;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:D,defines:o.defines,customVertexShaderID:w,customFragmentShaderID:N,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:H,batchingColor:H&&null!==T._colorsTexture,instancing:B,instancingColor:B&&null!==T.instanceColor,instancingMorph:B&&null!==T.morphTexture,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:W,envMap:k,envMapMode:k&&R.mapping,envMapCubeUVHeight:b,aoMap:z,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===Ee,normalMapTangentSpace:K&&o.normalMapType===ve,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:re,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:fe,specularColorMap:pe,specularIntensityMap:me,transmission:ie,transmissionMap:he,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===ge&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Ae,combine:o.combine,mapUv:V&&S(o.map.channel),aoMapUv:z&&S(o.aoMap.channel),lightMapUv:X&&S(o.lightMap.channel),bumpMapUv:Y&&S(o.bumpMap.channel),normalMapUv:K&&S(o.normalMap.channel),displacementMapUv:j&&S(o.displacementMap.channel),emissiveMapUv:q&&S(o.emissiveMap.channel),metalnessMapUv:Z&&S(o.metalnessMap.channel),roughnessMapUv:$&&S(o.roughnessMap.channel),anisotropyMapUv:re&&S(o.anisotropyMap.channel),clearcoatMapUv:ae&&S(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&S(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&S(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&S(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&S(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&S(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&S(o.sheenRoughnessMap.channel),specularMapUv:fe&&S(o.specularMap.channel),specularColorMapUv:pe&&S(o.specularColorMap.channel),specularIntensityMapUv:me&&S(o.specularIntensityMap.channel),transmissionMapUv:he&&S(o.transmissionMap.channel),thicknessMapUv:Se&&S(o.thicknessMap.channel),alphaMapUv:Me&&S(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:_,reversedDepthBuffer:F,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:L,morphTextureStride:y,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:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===_e,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Re&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Re&&!0===o.extensions.multiDraw||H)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},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.instancing&&l.enable(0);t.instancingColor&&l.enable(1);t.instancingMorph&&l.enable(2);t.matcap&&l.enable(3);t.envMap&&l.enable(4);t.normalMapObjectSpace&&l.enable(5);t.normalMapTangentSpace&&l.enable(6);t.clearcoat&&l.enable(7);t.iridescence&&l.enable(8);t.alphaTest&&l.enable(9);t.vertexColors&&l.enable(10);t.vertexAlphas&&l.enable(11);t.vertexUv1s&&l.enable(12);t.vertexUv2s&&l.enable(13);t.vertexUv3s&&l.enable(14);t.vertexTangents&&l.enable(15);t.anisotropy&&l.enable(16);t.alphaHash&&l.enable(17);t.batching&&l.enable(18);t.dispersion&&l.enable(19);t.batchingColor&&l.enable(20);t.gradientMap&&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.reversedDepthBuffer&&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);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=Vn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=h.get(n);return void 0!==i?++i.usedTimes:(i=new Zr(e,n,t,o),f.push(i),h.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=f.indexOf(e);f[t]=f[f.length-1],f.pop(),h.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){d.remove(e)},programs:f,dispose:function(){d.dispose()}}}function ta(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function na(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function ia(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 ra(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||na),i.length>1&&i.sort(t||ia),r.length>1&&r.sort(t||ia)}}}function aa(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ra,e.set(t,[r])):n>=i.length?(r=new ra,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function oa(){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 sa=0;function la(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function ca(e){const n=new oa,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(la);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Hn.LTC_FLOAT_1,a.rectAreaLTC2=Hn.LTC_FLOAT_2):(a.rectAreaLTC1=Hn.LTC_HALF_1,a.rectAreaLTC2=Hn.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=sa++)},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 da(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const fa=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],pa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],ma=new f,ha=new r,_a=new r;function ga(e,n,i){let r=new Me;const a=new t,s=new t,d=new X,u=new xe,f=new Ae,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[_e]:_e},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;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\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 = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\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( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const T=new U;T.setAttribute("position",new B(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(T,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=de;let R=this.type;function b(t,i){const r=n.update(x);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 F(a.x,a.y,{format:Te,type:S})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,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,x,null)}function P(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",D)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===ce?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 L(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===ce)&&(!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;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y)),null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===ce){if(l.isPointLight){E("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new F(a.x,a.y,{format:Te,type:S,minFilter:H,magFilter:H,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new oe(a.x,a.y,M),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=be,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce}else{l.isPointLight?(c.map=new C(a.x),c.map.depthTexture=new Pe(a.x,Le)):(c.map=new F(a.x,a.y),c.map.depthTexture=new oe(a.x,a.y,Le)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=be;const t=e.state.buffers.depth.getReversed();this.type===de?(c.map.depthTexture.compareFunction=t?re:ae,c.map.depthTexture.minFilter=H,c.map.depthTexture.magFilter=H):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce)}c.camera.updateProjectionMatrix()}const h=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,F={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new X).fromArray(B),V=(new X).fromArray(G);function W(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===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),E("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&E("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function S(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function R(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 b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];E("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),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?me: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 C(t,n){let i;return t?null===n||n===Le||n===Ct?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Pt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Le||n===Ct?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Pt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Ce&&e.minFilter!==H?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 L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),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;i0&&a.__version!==t.version){const e=t.image;if(null===e)E("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void k(a,t,n);E("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const N={[pt]:e.REPEAT,[ft]:e.CLAMP_TO_EDGE,[ut]:e.MIRRORED_REPEAT},O={[Ce]:e.NEAREST,[gt]:e.NEAREST_MIPMAP_NEAREST,[_t]:e.NEAREST_MIPMAP_LINEAR,[H]:e.LINEAR,[ht]:e.LINEAR_MIPMAP_NEAREST,[mt]:e.LINEAR_MIPMAP_LINEAR},F={[xt]:e.NEVER,[Mt]:e.ALWAYS,[Tt]:e.LESS,[ae]:e.LEQUAL,[St]:e.EQUAL,[re]:e.GEQUAL,[Et]:e.GREATER,[vt]:e.NOTEQUAL};function B(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==H&&i.magFilter!==ht&&i.magFilter!==_t&&i.magFilter!==mt&&i.minFilter!==H&&i.minFilter!==ht&&i.minFilter!==_t&&i.minFilter!==mt||E("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,N[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,N[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,N[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,O[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,O[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,F[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Ce)return;if(i.minFilter!==_t&&i.minFilter!==mt)return;if(i.type===M&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||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 V(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.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 W(e,t,n){return Math.floor(Math.floor(e/n)/t)}function k(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=V(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===At?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===At||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=v(n.image,!1,a.maxTextureSize);m=Q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,T=b(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);B(l,n);const M=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,U=d.dataReady,D=P(n,m);if(n.isDepthTexture)T=C(n.format===Rt,n.type),L&&(R?i.texStorage2D(e.TEXTURE_2D,1,T,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,T,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(M.length>0){R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,n=M.length;te.start-t.start);let s=0;for(let e=1;e0){const r=bt(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,T,g.width,g.height,m.depth,0,g.data,0,0);else E("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?U&&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,T,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,r=M.length;t0){const t=bt(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,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&i.texStorage3D(e.TEXTURE_3D,D,T,m.width,m.height,m.depth),U&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)i.texStorage2D(e.TEXTURE_2D,D,T,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(M.length>0){if(R&&L){const t=J(M[0]);i.texStorage2D(e.TEXTURE_2D,D,T,t.width,t.height)}for(let t=0,n=M.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),$(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,Z(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),i.bindFramebuffer(e.FRAMEBUFFER,null)}function X(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;$(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,Z(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,Z(n),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;r{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)for(let e=0;e<6;e++)Y(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t,0):Y(n.__webglFramebuffer,t,0)}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(),X(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(),X(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)}const j=[],q=[];function Z(e){return Math.min(a.maxSamples,e.samples)}function $(e){const t=r.get(e);return e.samples>0&&!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!==G&&n!==At&&(p.getTransfer(n)===m?i===x&&r===T||E("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):y("WebGLTextures: Unsupported texture color space:",n)),t}function J(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=w;return e>=a.maxTextures&&E("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),w+=1,e},this.resetTextureUnits=function(){w=0},this.setTexture2D=I,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=V(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===At?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===At||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]:v(n.image[e],!0,a.maxCubemapSize),h[e]=Q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),T=o.convert(n.type),M=b(n.internalFormat,g,T,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(B(e.TEXTURE_CUBE_MAP,n),f){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=J(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,T,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,M,h[t].width,h[t].height,0,g,T,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===$(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===$(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,d=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 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 xa extends bn{constructor(e,n){super();const i=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _="undefined"!=typeof XRWebGLBinding,g=new Ma,v={},S=n.getContextAttributes();let M=null,A=null;const R=[],b=[],C=new t;let P=null;const L=new w;L.viewport=new X;const U=new w;U.viewport=new X;const D=[L,U],I=new Cn;let N=null,y=null;function O(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",O),a.removeEventListener("selectstart",O),a.removeEventListener("selectend",O),a.removeEventListener("squeeze",O),a.removeEventListener("squeezestart",O),a.removeEventListener("squeezeend",O),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[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.getController=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&E("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&E("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){M=e.getRenderTarget(),a.addEventListener("select",O),a.addEventListener("selectstart",O),a.addEventListener("selectend",O),a.addEventListener("squeeze",O),a.addEventListener("squeezestart",O),a.addEventListener("squeezeend",O),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),P=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;S.depth&&(r=S.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=S.stencil?Rt:be,i=S.stencil?Ct:Le);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new F(p.textureWidth,p.textureHeight,{format:x,type:T,depthTexture:new oe(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:S.stencil,colorSpace:e.outputColorSpace,samples:S.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:S.antialias,alpha:!0,depth:S.depth,stencil:S.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new F(m.framebufferWidth,m.framebufferHeight,{format:x,type:T,colorSpace:e.outputColorSpace,stencilBuffer:S.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(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===a)return;let t=e.near,n=e.far;null!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),I.near=U.near=L.near=t,I.far=U.far=L.far=n,N===I.near&&y===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),N=I.near,y=I.far),I.layers.mask=6|e.layers.mask,L.layers.mask=3&I.layers.mask,U.layers.mask=5&I.layers.mask;const i=e.parent,r=I.cameras;W(I,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,Aa.copy(o),Aa.x*=-1,Aa.y*=-1,Aa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(Aa.y*=-1,Aa.z*=-1),e.envMapRotation.value.setFromMatrix4(Ra.makeRotationFromEuler(Aa)),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?E("WebGLRenderer: Texture samplers can not be part of an uniforms group."):E("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=I;i.toneMapped&&(null!==k&&!0!==k.isXRRenderTarget||(m=N.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=Se.get(i),v=L.state.lights;if(!0===se&&(!0===le||e!==Y)){const t=e===Y&&i.id===z;Ne.setState(i,e,t)}let E=!1;i.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||r.isBatchedMesh&&!1===g.batching?E=!0:r.isBatchedMesh||!0!==g.batching?r.isBatchedMesh&&!0===g.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===g.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===g.instancing?E=!0:r.isInstancedMesh||!0!==g.instancing?r.isSkinnedMesh&&!1===g.skinning?E=!0:r.isSkinnedMesh||!0!==g.skinning?r.isInstancedMesh&&!0===g.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===g.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===g.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===g.instancingMorph&&null!==r.morphTexture||g.envMap!==l||!0===i.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ne.numPlanes&&g.numIntersection===Ne.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=i.version);let T=g.currentProgram;!0===E&&(T=st(i,t,r));let M=!1,x=!1,A=!1;const R=T.getUniforms(),b=g.uniforms;ve.useProgram(T.program)&&(M=!0,x=!0,A=!0);i.id!==z&&(z=i.id,x=!0);if(M||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),R.setValue(ke,"projectionMatrix",e.projectionMatrix),R.setValue(ke,"viewMatrix",e.matrixWorldInverse);const t=R.map.cameraPosition;void 0!==t&&t.setValue(ke,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&R.setValue(ke,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&R.setValue(ke,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,x=!0,A=!0)}g.needsLights&&(v.state.directionalShadowMap.length>0&&R.setValue(ke,"directionalShadowMap",v.state.directionalShadowMap,xe),v.state.spotShadowMap.length>0&&R.setValue(ke,"spotShadowMap",v.state.spotShadowMap,xe),v.state.pointShadowMap.length>0&&R.setValue(ke,"pointShadowMap",v.state.pointShadowMap,xe));if(r.isSkinnedMesh){R.setOptional(ke,r,"bindMatrix"),R.setOptional(ke,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),R.setValue(ke,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(R.setOptional(ke,r,"batchingTexture"),R.setValue(ke,"batchingTexture",r._matricesTexture,xe),R.setOptional(ke,r,"batchingIdTexture"),R.setValue(ke,"batchingIdTexture",r._indirectTexture,xe),R.setOptional(ke,r,"batchingColorTexture"),null!==r._colorsTexture&&R.setValue(ke,"batchingColorTexture",r._colorsTexture,xe));const C=n.morphAttributes;void 0===C.position&&void 0===C.normal&&void 0===C.color||Fe.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,R.setValue(ke,"receiveShadow",r.receiveShadow));i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);void 0!==b.dfgLUT&&(b.dfgLUT.value=(null===La&&(La=new Un(Pa,16,16,Te,S),La.name="DFG_LUT",La.minFilter=H,La.magFilter=H,La.wrapS=ft,La.wrapT=ft,La.generateMipmaps=!1,La.needsUpdate=!0),La));x&&(R.setValue(ke,"toneMappingExposure",N.toneMappingExposure),g.needsLights&&(U=A,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===i.fog&&De.refreshFogUniforms(b,a),De.refreshMaterialUniforms(b,i,ee,J,L.state.transmissionRenderTarget[e.id]),Rr.upload(ke,lt(g),b,xe));var P,U;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Rr.upload(ke,lt(g),b,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&R.setValue(ke,"center",r.center);if(R.setValue(ke,"modelViewMatrix",r.modelViewMatrix),R.setValue(ke,"normalMatrix",r.normalMatrix),R.setValue(ke,"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){Se.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==he.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Qe=null;function Je(){tt.stop()}function et(){tt.start()}const tt=new Fn;function nt(e,t,n,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)L.pushLight(e),e.castShadow&&L.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||oe.intersectsSprite(e)){i&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=Pe.update(e),r=e.material;r.visible&&P.push(e,t,r,n,ue.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||oe.intersectsObject(e))){const t=Pe.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ue.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ue.copy(t.boundingSphere.center)),ue.applyMatrix4(e.matrixWorld).applyMatrix4(ce)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&at(r,t,n),a.length>0&&at(a,t,n),o.length>0&&at(o,t,n),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function rt(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===L.state.transmissionRenderTarget[i.id]){const e=he.has("EXT_color_buffer_half_float")||he.has("EXT_color_buffer_float");L.state.transmissionRenderTarget[i.id]=new F(1,1,{generateMipmaps:!0,type:e?S:T,minFilter:mt,samples:ge.samples,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace})}const r=L.state.transmissionRenderTarget[i.id],a=i.viewport||K;r.setSize(a.z*N.transmissionResolutionScale,a.w*N.transmissionResolutionScale);const s=N.getRenderTarget(),l=N.getActiveCubeFace(),d=N.getActiveMipmapLevel();N.setRenderTarget(r),N.getClearColor(Z),$=N.getClearAlpha(),$<1&&N.setClearColor(16777215,.5),N.clear(),pe&&Oe.render(n);const u=N.toneMapping;N.toneMapping=I;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),L.setupLightsView(i),!0===se&&Ne.setGlobalState(N.clippingPlanes,i),at(e,n,i),xe.updateMultisampleRenderTarget(r),xe.updateRenderTargetMipmap(r),!1===he.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&rt(n,i,e,t),pe&&Oe.render(e),it(P,e,t)}null!==k&&0===W&&(xe.updateMultisampleRenderTarget(k),xe.updateRenderTargetMipmap(k)),i&&w.end(N),!0===e.isScene&&e.onAfterRender(N,e,t),Ve.resetDefaultState(),z=-1,Y=null,D.pop(),D.length>0?(L=D[D.length-1],!0===se&&Ne.setGlobalState(N.clippingPlanes,L.state.camera)):L=null,U.pop(),P=U.length>0?U[U.length-1]:null},this.getActiveCubeFace=function(){return B},this.getActiveMipmapLevel=function(){return W},this.getRenderTarget=function(){return k},this.setRenderTargetTextures=function(e,t,n){const i=Se.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Se.get(e.texture).__webglTexture=t,Se.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Se.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const dt=ke.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){k=e,B=t,W=n;let i=null,r=!1,a=!1;if(e){const o=Se.get(e);if(void 0!==o.__useDefaultFramebuffer)return ve.bindFramebuffer(ke.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest,ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),void(z=-1);if(void 0===o.__webglFramebuffer)xe.setupRenderTarget(e);else if(o.__hasExternalTextures)xe.rebindTextures(e,Se.get(e.texture).__webglTexture,Se.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Se.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");xe.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Se.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===xe.useMultisampledRTT(e)?Se.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest}else K.copy(ie).multiplyScalar(ee).floor(),j.copy(re).multiplyScalar(ee).floor(),q=ae;0!==n&&(i=dt);if(ve.bindFramebuffer(ke.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),r){const i=Se.get(e.texture);ke.framebufferTexture2D(ke.FRAMEBUFFER,ke.COLOR_ATTACHMENT0,ke.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&(e.textures.length>1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),ke.readPixels(t,n,i,r,He.convert(l),He.convert(c),a))}finally{const e=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Se.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ve.bindFramebuffer(ke.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(!ge.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ke.createBuffer();ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.bufferData(ke.PIXEL_PACK_BUFFER,a.byteLength,ke.STREAM_READ),e.textures.length>1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),ke.readPixels(t,n,i,r,He.convert(c),He.convert(d),0);const f=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,f);const p=ke.fenceSync(ke.SYNC_GPU_COMMANDS_COMPLETE,0);return ke.flush(),await On(ke,p,4),ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.getBufferSubData(ke.PIXEL_PACK_BUFFER,0,a),ke.deleteBuffer(u),ke.deleteSync(p),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;xe.setTexture2D(e,0),ke.copyTexSubImage2D(ke.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const ut=ke.createFramebuffer(),pt=ke.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;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 _=He.convert(t.format),g=He.convert(t.type);let v;t.isData3DTexture?(xe.setTexture3D(t,0),v=ke.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=ke.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=ke.TEXTURE_2D),ke.pixelStorei(ke.UNPACK_FLIP_Y_WEBGL,t.flipY),ke.pixelStorei(ke.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ke.pixelStorei(ke.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ke.getParameter(ke.UNPACK_ROW_LENGTH),S=ke.getParameter(ke.UNPACK_IMAGE_HEIGHT),T=ke.getParameter(ke.UNPACK_SKIP_PIXELS),M=ke.getParameter(ke.UNPACK_SKIP_ROWS),x=ke.getParameter(ke.UNPACK_SKIP_IMAGES);ke.pixelStorei(ke.UNPACK_ROW_LENGTH,h.width),ke.pixelStorei(ke.UNPACK_IMAGE_HEIGHT,h.height),ke.pixelStorei(ke.UNPACK_SKIP_PIXELS,c),ke.pixelStorei(ke.UNPACK_SKIP_ROWS,d),ke.pixelStorei(ke.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Se.get(e),i=Se.get(t),h=Se.get(n.__renderTarget),_=Se.get(i.__renderTarget);ve.bindFramebuffer(ke.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(ke.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n varying( node ); addMethodChaining( 'toVarying', varying ); addMethodChaining( 'toVertexStage', vertexStage ); -// Deprecated - -addMethodChaining( 'varying', ( ...params ) => { // @deprecated, r173 - - warn( 'TSL: .varying() has been renamed to .toVarying().' ); - return varying( ...params ); - -} ); - -addMethodChaining( 'vertexStage', ( ...params ) => { // @deprecated, r173 - - warn( 'TSL: .vertexStage() has been renamed to .toVertexStage().' ); - return varying( ...params ); - -} ); - /** * Converts the given color value from sRGB to linear-sRGB color space. * diff --git a/build/three.webgpu.min.js b/build/three.webgpu.min.js index b0a3b9e8652086..2e82d7c7b90cb0 100644 --- a/build/three.webgpu.min.js +++ b/build/three.webgpu.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,error as o,EventDispatcher as u,MathUtils as l,warn as d,WebGLCoordinateSystem as c,WebGPUCoordinateSystem as h,ColorManagement as p,SRGBTransfer as g,NoToneMapping as m,StaticDrawUsage as f,InterleavedBufferAttribute as y,InterleavedBuffer as b,DynamicDrawUsage as x,NoColorSpace as T,log as _,warnOnce as v,Texture as N,UnsignedIntType as S,IntType as R,Compatibility as A,LessCompare as E,NearestFilter as w,Sphere as C,BackSide as M,DoubleSide as B,Euler as L,CubeTexture as P,CubeReflectionMapping as F,CubeRefractionMapping as D,TangentSpaceNormalMap as U,NoNormalPacking as I,NormalRGPacking as O,NormalGAPacking as V,ObjectSpaceNormalMap as k,RGFormat as G,RED_GREEN_RGTC2_Format as z,RG11_EAC_Format as $,InstancedInterleavedBuffer as W,InstancedBufferAttribute as H,DataArrayTexture as j,FloatType as q,FramebufferTexture as X,LinearMipmapLinearFilter as K,DepthTexture as Y,Material as Q,LineBasicMaterial as Z,LineDashedMaterial as J,NoBlending as ee,MeshNormalMaterial as te,SRGBColorSpace as re,WebGLCubeRenderTarget as se,BoxGeometry as ie,Mesh as ne,Scene as ae,LinearFilter as oe,CubeCamera as ue,EquirectangularReflectionMapping as le,EquirectangularRefractionMapping as de,AddOperation as ce,MixOperation as he,MultiplyOperation as pe,MeshBasicMaterial as ge,MeshLambertMaterial as me,MeshPhongMaterial as fe,DataTexture as ye,HalfFloatType as be,ClampToEdgeWrapping as xe,BufferGeometry as Te,OrthographicCamera as _e,PerspectiveCamera as ve,RenderTarget as Ne,LinearSRGBColorSpace as Se,RGBAFormat as Re,CubeUVReflectionMapping as Ae,BufferAttribute as Ee,MeshStandardMaterial as we,MeshPhysicalMaterial as Ce,MeshToonMaterial as Me,MeshMatcapMaterial as Be,SpriteMaterial as Le,PointsMaterial as Pe,ShadowMaterial as Fe,Uint32BufferAttribute as De,Uint16BufferAttribute as Ue,arrayNeedsUint32 as Ie,DepthStencilFormat as Oe,DepthFormat as Ve,UnsignedInt248Type as ke,UnsignedByteType as Ge,Plane as ze,Object3D as $e,LinearMipMapLinearFilter as We,Float32BufferAttribute as He,UVMapping as je,VSMShadowMap as qe,BasicShadowMap as Xe,CubeDepthTexture as Ke,SphereGeometry as Ye,NormalBlending as Qe,LinearMipmapNearestFilter as Ze,NearestMipmapLinearFilter as Je,Float16BufferAttribute as et,REVISION as tt,ArrayCamera as rt,PlaneGeometry as st,FrontSide as it,CustomBlending as nt,AddEquation as at,ZeroFactor as ot,CylinderGeometry as ut,Quaternion as lt,WebXRController as dt,RAD2DEG as ct,PCFShadowMap as ht,FrustumArray as pt,Frustum as gt,RedIntegerFormat as mt,RedFormat as ft,ShortType as yt,ByteType as bt,UnsignedShortType as xt,RGIntegerFormat as Tt,RGBIntegerFormat as _t,RGBFormat as vt,RGBAIntegerFormat as Nt,TimestampQuery as St,createCanvasElement as Rt,ReverseSubtractEquation as At,SubtractEquation as Et,OneMinusDstAlphaFactor as wt,OneMinusDstColorFactor as Ct,OneMinusSrcAlphaFactor as Mt,OneMinusSrcColorFactor as Bt,DstAlphaFactor as Lt,DstColorFactor as Pt,SrcAlphaSaturateFactor as Ft,SrcAlphaFactor as Dt,SrcColorFactor as Ut,OneFactor as It,CullFaceNone as Ot,CullFaceBack as Vt,CullFaceFront as kt,MultiplyBlending as Gt,SubtractiveBlending as zt,AdditiveBlending as $t,NotEqualDepth as Wt,GreaterDepth as Ht,GreaterEqualDepth as jt,EqualDepth as qt,LessEqualDepth as Xt,LessDepth as Kt,AlwaysDepth as Yt,NeverDepth as Qt,UnsignedShort4444Type as Zt,UnsignedShort5551Type as Jt,UnsignedInt5999Type as er,UnsignedInt101111Type as tr,AlphaFormat as rr,RGB_S3TC_DXT1_Format as sr,RGBA_S3TC_DXT1_Format as ir,RGBA_S3TC_DXT3_Format as nr,RGBA_S3TC_DXT5_Format as ar,RGB_PVRTC_4BPPV1_Format as or,RGB_PVRTC_2BPPV1_Format as ur,RGBA_PVRTC_4BPPV1_Format as lr,RGBA_PVRTC_2BPPV1_Format as dr,RGB_ETC1_Format as cr,RGB_ETC2_Format as hr,RGBA_ETC2_EAC_Format as pr,R11_EAC_Format as gr,SIGNED_R11_EAC_Format as mr,SIGNED_RG11_EAC_Format as fr,RGBA_ASTC_4x4_Format as yr,RGBA_ASTC_5x4_Format as br,RGBA_ASTC_5x5_Format as xr,RGBA_ASTC_6x5_Format as Tr,RGBA_ASTC_6x6_Format as _r,RGBA_ASTC_8x5_Format as vr,RGBA_ASTC_8x6_Format as Nr,RGBA_ASTC_8x8_Format as Sr,RGBA_ASTC_10x5_Format as Rr,RGBA_ASTC_10x6_Format as Ar,RGBA_ASTC_10x8_Format as Er,RGBA_ASTC_10x10_Format as wr,RGBA_ASTC_12x10_Format as Cr,RGBA_ASTC_12x12_Format as Mr,RGBA_BPTC_Format as Br,RED_RGTC1_Format as Lr,SIGNED_RED_RGTC1_Format as Pr,SIGNED_RED_GREEN_RGTC2_Format as Fr,MirroredRepeatWrapping as Dr,RepeatWrapping as Ur,NearestMipmapNearestFilter as Ir,NotEqualCompare as Or,GreaterCompare as Vr,GreaterEqualCompare as kr,EqualCompare as Gr,LessEqualCompare as zr,AlwaysCompare as $r,NeverCompare as Wr,LinearTransfer as Hr,getByteLength as jr,isTypedArray as qr,NotEqualStencilFunc as Xr,GreaterStencilFunc as Kr,GreaterEqualStencilFunc as Yr,EqualStencilFunc as Qr,LessEqualStencilFunc as Zr,LessStencilFunc as Jr,AlwaysStencilFunc as es,NeverStencilFunc as ts,DecrementWrapStencilOp as rs,IncrementWrapStencilOp as ss,DecrementStencilOp as is,IncrementStencilOp as ns,InvertStencilOp as as,ReplaceStencilOp as os,ZeroStencilOp as us,KeepStencilOp as ls,MaxEquation as ds,MinEquation as cs,SpotLight as hs,PointLight as ps,DirectionalLight as gs,RectAreaLight as ms,AmbientLight as fs,HemisphereLight as ys,LightProbe as bs,LinearToneMapping as xs,ReinhardToneMapping as Ts,CineonToneMapping as _s,ACESFilmicToneMapping as vs,AgXToneMapping as Ns,NeutralToneMapping as Ss,Group as Rs,Loader as As,FileLoader as Es,MaterialLoader as ws,ObjectLoader as Cs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExternalTexture,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";const Ms=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","aoMapIntensity","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveIntensity","emissiveMap","envMap","envMapIntensity","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","lightMapIntensity","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"],Bs=new WeakMap;class Ls{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Ms,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}needsVelocity(e){const t=e.getMRT();return null!==t&&t.has("velocity")}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>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 Fs=e=>Ps(e),Ds=e=>Ps(e),Us=(...e)=>Ps(e),Is=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),Os=new WeakMap;function Vs(e){return Is.get(e)}function ks(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Gs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function zs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function $s(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Hs(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Xs(u[0]):null}function js(e){let t=Os.get(e);return void 0===t&&(t={},Os.set(e,t)),t}function qs(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Ks=Object.freeze({__proto__:null,arrayBufferToBase64:qs,base64ToArrayBuffer:Xs,getAlignmentFromType:$s,getDataFromObject:js,getLengthFromType:Gs,getMemoryLengthFromType:zs,getTypeFromLength:Vs,getTypedArrayFromType:ks,getValueFromType:Hs,getValueType:Ws,hash:Us,hashArray:Ds,hashString:Fs});const Ys={VERTEX:"vertex",FRAGMENT:"fragment"},Qs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Zs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Js={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ei=["fragment","vertex"],ti=["setup","analyze","generate"],ri=[...ei,"compute"],si=["x","y","z","w"],ii={analyze:"setup",generate:"analyze"};let ni=0;class ai extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Qs.NONE,this.updateBeforeType=Qs.NONE,this.updateAfterType=Qs.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ni++})}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),this}onFrameUpdate(e){return this.onUpdate(e,Qs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Qs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Qs.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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.7,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 oi extends ai{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)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 ui extends ai{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 li extends ai{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 di extends li{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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const ci=si.join("");class hi extends ai{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(si.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))}getScope(){return this.node.getScope()}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===ci.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 pi extends li{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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ai.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==xi?xi.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=Ti.get("assign");return this.addToStack(t(...e))}},ai.prototype.toVarIntent=function(){return this},ai.prototype.get=function(e){return new bi(this,e)};const Ni={};function Si(e,t,r){Ni[e]=Ni[t]=Ni[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new hi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ai.prototype["set"+s]=ai.prototype["set"+i]=ai.prototype["set"+n]=function(t){const r=vi(e);return new pi(this,r,Yi(t))},ai.prototype["flip"+s]=ai.prototype["flip"+i]=ai.prototype["flip"+n]=function(){const t=vi(e);return new gi(this,t)}}const Ri=["x","y","z","w"],Ai=["r","g","b","a"],Ei=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ri[e],r=Ai[e],s=Ei[e];Si(t,r,s);for(let i=0;i<4;i++){t=Ri[e]+Ri[i],r=Ai[e]+Ai[i],s=Ei[e]+Ei[i],Si(t,r,s);for(let n=0;n<4;n++){t=Ri[e]+Ri[i]+Ri[n],r=Ai[e]+Ai[i]+Ai[n],s=Ei[e]+Ei[i]+Ei[n],Si(t,r,s);for(let a=0;a<4;a++)t=Ri[e]+Ri[i]+Ri[n]+Ri[a],r=Ai[e]+Ai[i]+Ai[n]+Ai[a],s=Ei[e]+Ei[i]+Ei[n]+Ei[a],Si(t,r,s)}}}for(let e=0;e<32;e++)Ni[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new oi(this,new yi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};Object.defineProperties(ai.prototype,Ni);const wi=new WeakMap,Ci=function(e,t=null){for(const r in e)e[r]=Yi(e[r],t);return e},Mi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...Ji(d(t)))):null!==r?(r=Yi(r),n=(...s)=>i(new e(t,...Ji(d(s)),r))):n=(...r)=>i(new e(t,...Ji(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Li=function(e,...t){return new e(...Ji(t))};class Pi extends ai{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=wi.get(e.constructor);void 0===s&&(s=new WeakMap,wi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Yi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;Zi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Yi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return Zi(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Yi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ai&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Yi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Yi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Fi extends ai{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Pi(this,e)}setup(){return this.call()}}const Di=[!1,!0],Ui=[0,1,2,3],Ii=[-1,-2],Oi=[.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],Vi=new Map;for(const e of Di)Vi.set(e,new yi(e));const ki=new Map;for(const e of Ui)ki.set(e,new yi(e,"uint"));const Gi=new Map([...ki].map(e=>new yi(e.value,"int")));for(const e of Ii)Gi.set(e,new yi(e,"int"));const zi=new Map([...Gi].map(e=>new yi(e.value)));for(const e of Oi)zi.set(e,new yi(e));for(const e of Oi)zi.set(-e,new yi(-e));const $i={bool:Vi,uint:ki,ints:Gi,float:zi},Wi=new Map([...Vi,...zi]),Hi=(e,t)=>Wi.has(e)?Wi.get(e):!0===e.isNode?e:new yi(e,t),ji=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new yi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Hs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Qi(t.get(r[0]));if(1===r.length){const t=Hi(r[0],e);return t.nodeType===e?Qi(t):Qi(new ui(t,e))}const s=r.map(e=>Hi(e));return Qi(new di(s,e))}},qi=e=>"object"==typeof e&&null!==e?e.value:e,Xi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ki(e,t){return new Fi(e,t)}const Yi=(e,t=null)=>function(e,t=null){const r=Ws(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Yi(Hi(e,t)):"shader"===r?e.isFn?e:an(e):e}(e,t),Qi=(e,t=null)=>Yi(e,t).toVarIntent(),Zi=(e,t=null)=>new Ci(e,t),Ji=(e,t=null)=>new Mi(e,t),en=(e,t=null,r=null,s=null)=>new Bi(e,t,r,s),tn=(e,...t)=>new Li(e,...t),rn=(e,t=null,r=null,s={})=>new Bi(e,t,r,{...s,intent:!0});let sn=0;class nn extends ai{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Ki(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+sn++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function an(e,t=null){const r=new nn(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const on=e=>{xi=e},un=()=>xi,ln=(...e)=>xi.If(...e);function dn(e){return xi&&xi.addToStack(e),e}_i("toStack",dn);const cn=new ji("color"),hn=new ji("float",$i.float),pn=new ji("int",$i.ints),gn=new ji("uint",$i.uint),mn=new ji("bool",$i.bool),fn=new ji("vec2"),yn=new ji("ivec2"),bn=new ji("uvec2"),xn=new ji("bvec2"),Tn=new ji("vec3"),_n=new ji("ivec3"),vn=new ji("uvec3"),Nn=new ji("bvec3"),Sn=new ji("vec4"),Rn=new ji("ivec4"),An=new ji("uvec4"),En=new ji("bvec4"),wn=new ji("mat2"),Cn=new ji("mat3"),Mn=new ji("mat4");_i("toColor",cn),_i("toFloat",hn),_i("toInt",pn),_i("toUint",gn),_i("toBool",mn),_i("toVec2",fn),_i("toIVec2",yn),_i("toUVec2",bn),_i("toBVec2",xn),_i("toVec3",Tn),_i("toIVec3",_n),_i("toUVec3",vn),_i("toBVec3",Nn),_i("toVec4",Sn),_i("toIVec4",Rn),_i("toUVec4",An),_i("toBVec4",En),_i("toMat2",wn),_i("toMat3",Cn),_i("toMat4",Mn);const Bn=en(oi).setParameterLength(2),Ln=(e,t)=>Yi(new ui(Yi(e),t));_i("element",Bn),_i("convert",Ln);_i("append",e=>(d("TSL: .append() has been renamed to .toStack()."),dn(e)));class Pn extends ai{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Fs(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}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 Fn=(e,t)=>new Pn(e,t),Dn=(e,t)=>new Pn(e,t,!0),Un=tn(Pn,"vec4","DiffuseColor"),In=tn(Pn,"vec3","DiffuseContribution"),On=tn(Pn,"vec3","EmissiveColor"),Vn=tn(Pn,"float","Roughness"),kn=tn(Pn,"float","Metalness"),Gn=tn(Pn,"float","Clearcoat"),zn=tn(Pn,"float","ClearcoatRoughness"),$n=tn(Pn,"vec3","Sheen"),Wn=tn(Pn,"float","SheenRoughness"),Hn=tn(Pn,"float","Iridescence"),jn=tn(Pn,"float","IridescenceIOR"),qn=tn(Pn,"float","IridescenceThickness"),Xn=tn(Pn,"float","AlphaT"),Kn=tn(Pn,"float","Anisotropy"),Yn=tn(Pn,"vec3","AnisotropyT"),Qn=tn(Pn,"vec3","AnisotropyB"),Zn=tn(Pn,"color","SpecularColor"),Jn=tn(Pn,"color","SpecularColorBlended"),ea=tn(Pn,"float","SpecularF90"),ta=tn(Pn,"float","Shininess"),ra=tn(Pn,"vec4","Output"),sa=tn(Pn,"float","dashSize"),ia=tn(Pn,"float","gapSize"),na=tn(Pn,"float","pointWidth"),aa=tn(Pn,"float","IOR"),oa=tn(Pn,"float","Transmission"),ua=tn(Pn,"float","Thickness"),la=tn(Pn,"float","AttenuationDistance"),da=tn(Pn,"color","AttenuationColor"),ca=tn(Pn,"float","Dispersion");class ha extends ai{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 pa=e=>new ha(e),ga=(e,t=0)=>new ha(e,!0,t),ma=ga("frame"),fa=ga("render"),ya=pa("object");class ba extends mi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ya}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),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.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const xa=(e,t)=>{const r=Xi(t||e);if(r===e&&(e=Hs(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new ba(e,r)};class Ta extends li{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const _a=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Ta(null,r.length,r)}else{const r=e[0],s=e[1];t=new Ta(r,s)}return Yi(t)};_i("toArray",(e,t)=>_a(Array(t).fill(e)));class va extends li{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}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 si.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.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)o("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?Ji(t):Zi(t[0]),new Sa(Yi(e),t));_i("call",Ra);const Aa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ea extends li{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ea(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const wa=rn(Ea,"+").setParameterLength(2,1/0).setName("add"),Ca=rn(Ea,"-").setParameterLength(2,1/0).setName("sub"),Ma=rn(Ea,"*").setParameterLength(2,1/0).setName("mul"),Ba=rn(Ea,"/").setParameterLength(2,1/0).setName("div"),La=rn(Ea,"%").setParameterLength(2).setName("mod"),Pa=rn(Ea,"==").setParameterLength(2).setName("equal"),Fa=rn(Ea,"!=").setParameterLength(2).setName("notEqual"),Da=rn(Ea,"<").setParameterLength(2).setName("lessThan"),Ua=rn(Ea,">").setParameterLength(2).setName("greaterThan"),Ia=rn(Ea,"<=").setParameterLength(2).setName("lessThanEqual"),Oa=rn(Ea,">=").setParameterLength(2).setName("greaterThanEqual"),Va=rn(Ea,"&&").setParameterLength(2,1/0).setName("and"),ka=rn(Ea,"||").setParameterLength(2,1/0).setName("or"),Ga=rn(Ea,"!").setParameterLength(1).setName("not"),za=rn(Ea,"^^").setParameterLength(2).setName("xor"),$a=rn(Ea,"&").setParameterLength(2).setName("bitAnd"),Wa=rn(Ea,"~").setParameterLength(1).setName("bitNot"),Ha=rn(Ea,"|").setParameterLength(2).setName("bitOr"),ja=rn(Ea,"^").setParameterLength(2).setName("bitXor"),qa=rn(Ea,"<<").setParameterLength(2).setName("shiftLeft"),Xa=rn(Ea,">>").setParameterLength(2).setName("shiftRight"),Ka=an(([e])=>(e.addAssign(1),e)),Ya=an(([e])=>(e.subAssign(1),e)),Qa=an(([e])=>{const t=pn(e).toConst();return e.addAssign(1),t}),Za=an(([e])=>{const t=pn(e).toConst();return e.subAssign(1),t});_i("add",wa),_i("sub",Ca),_i("mul",Ma),_i("div",Ba),_i("mod",La),_i("equal",Pa),_i("notEqual",Fa),_i("lessThan",Da),_i("greaterThan",Ua),_i("lessThanEqual",Ia),_i("greaterThanEqual",Oa),_i("and",Va),_i("or",ka),_i("not",Ga),_i("xor",za),_i("bitAnd",$a),_i("bitNot",Wa),_i("bitOr",Ha),_i("bitXor",ja),_i("shiftLeft",qa),_i("shiftRight",Xa),_i("incrementBefore",Ka),_i("decrementBefore",Ya),_i("increment",Qa),_i("decrement",Za);const Ja=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),La(pn(e),pn(t)));_i("modInt",Ja);class eo extends li{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===eo.MAX||e===eo.MIN)&&arguments.length>3){let i=new eo(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===eo.LENGTH||t===eo.DISTANCE||t===eo.DOT?"float":t===eo.CROSS?"vec3":t===eo.ALL||t===eo.ANY?"bool":t===eo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===eo.ONE_MINUS)i=Ca(1,t);else if(s===eo.RECIPROCAL)i=Ba(1,t);else if(s===eo.DIFFERENCE)i=wo(Ca(t,r));else if(s===eo.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=Sn(Tn(n),0):s=Sn(Tn(s),0);const a=Ma(s,n).xyz;i=To(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.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===eo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===eo.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===eo.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==eo.MIN&&r!==eo.MAX?r===eo.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===eo.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===eo.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==eo.DFDX&&r!==eo.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}eo.ALL="all",eo.ANY="any",eo.RADIANS="radians",eo.DEGREES="degrees",eo.EXP="exp",eo.EXP2="exp2",eo.LOG="log",eo.LOG2="log2",eo.SQRT="sqrt",eo.INVERSE_SQRT="inversesqrt",eo.FLOOR="floor",eo.CEIL="ceil",eo.NORMALIZE="normalize",eo.FRACT="fract",eo.SIN="sin",eo.COS="cos",eo.TAN="tan",eo.ASIN="asin",eo.ACOS="acos",eo.ATAN="atan",eo.ABS="abs",eo.SIGN="sign",eo.LENGTH="length",eo.NEGATE="negate",eo.ONE_MINUS="oneMinus",eo.DFDX="dFdx",eo.DFDY="dFdy",eo.ROUND="round",eo.RECIPROCAL="reciprocal",eo.TRUNC="trunc",eo.FWIDTH="fwidth",eo.TRANSPOSE="transpose",eo.DETERMINANT="determinant",eo.INVERSE="inverse",eo.EQUALS="equals",eo.MIN="min",eo.MAX="max",eo.STEP="step",eo.REFLECT="reflect",eo.DISTANCE="distance",eo.DIFFERENCE="difference",eo.DOT="dot",eo.CROSS="cross",eo.POW="pow",eo.TRANSFORM_DIRECTION="transformDirection",eo.MIX="mix",eo.CLAMP="clamp",eo.REFRACT="refract",eo.SMOOTHSTEP="smoothstep",eo.FACEFORWARD="faceforward";const to=hn(1e-6),ro=hn(1e6),so=hn(Math.PI),io=hn(2*Math.PI),no=hn(2*Math.PI),ao=hn(.5*Math.PI),oo=rn(eo,eo.ALL).setParameterLength(1),uo=rn(eo,eo.ANY).setParameterLength(1),lo=rn(eo,eo.RADIANS).setParameterLength(1),co=rn(eo,eo.DEGREES).setParameterLength(1),ho=rn(eo,eo.EXP).setParameterLength(1),po=rn(eo,eo.EXP2).setParameterLength(1),go=rn(eo,eo.LOG).setParameterLength(1),mo=rn(eo,eo.LOG2).setParameterLength(1),fo=rn(eo,eo.SQRT).setParameterLength(1),yo=rn(eo,eo.INVERSE_SQRT).setParameterLength(1),bo=rn(eo,eo.FLOOR).setParameterLength(1),xo=rn(eo,eo.CEIL).setParameterLength(1),To=rn(eo,eo.NORMALIZE).setParameterLength(1),_o=rn(eo,eo.FRACT).setParameterLength(1),vo=rn(eo,eo.SIN).setParameterLength(1),No=rn(eo,eo.COS).setParameterLength(1),So=rn(eo,eo.TAN).setParameterLength(1),Ro=rn(eo,eo.ASIN).setParameterLength(1),Ao=rn(eo,eo.ACOS).setParameterLength(1),Eo=rn(eo,eo.ATAN).setParameterLength(1,2),wo=rn(eo,eo.ABS).setParameterLength(1),Co=rn(eo,eo.SIGN).setParameterLength(1),Mo=rn(eo,eo.LENGTH).setParameterLength(1),Bo=rn(eo,eo.NEGATE).setParameterLength(1),Lo=rn(eo,eo.ONE_MINUS).setParameterLength(1),Po=rn(eo,eo.DFDX).setParameterLength(1),Fo=rn(eo,eo.DFDY).setParameterLength(1),Do=rn(eo,eo.ROUND).setParameterLength(1),Uo=rn(eo,eo.RECIPROCAL).setParameterLength(1),Io=rn(eo,eo.TRUNC).setParameterLength(1),Oo=rn(eo,eo.FWIDTH).setParameterLength(1),Vo=rn(eo,eo.TRANSPOSE).setParameterLength(1),ko=rn(eo,eo.DETERMINANT).setParameterLength(1),Go=rn(eo,eo.INVERSE).setParameterLength(1),zo=rn(eo,eo.MIN).setParameterLength(2,1/0),$o=rn(eo,eo.MAX).setParameterLength(2,1/0),Wo=rn(eo,eo.STEP).setParameterLength(2),Ho=rn(eo,eo.REFLECT).setParameterLength(2),jo=rn(eo,eo.DISTANCE).setParameterLength(2),qo=rn(eo,eo.DIFFERENCE).setParameterLength(2),Xo=rn(eo,eo.DOT).setParameterLength(2),Ko=rn(eo,eo.CROSS).setParameterLength(2),Yo=rn(eo,eo.POW).setParameterLength(2),Qo=e=>Ma(e,e),Zo=e=>Ma(e,e,e),Jo=e=>Ma(e,e,e,e),eu=rn(eo,eo.TRANSFORM_DIRECTION).setParameterLength(2),tu=e=>Ma(Co(e),Yo(wo(e),1/3)),ru=e=>Xo(e,e),su=rn(eo,eo.MIX).setParameterLength(3),iu=(e,t=0,r=1)=>Yi(new eo(eo.CLAMP,Yi(e),Yi(t),Yi(r))),nu=e=>iu(e),au=rn(eo,eo.REFRACT).setParameterLength(3),ou=rn(eo,eo.SMOOTHSTEP).setParameterLength(3),uu=rn(eo,eo.FACEFORWARD).setParameterLength(3),lu=an(([e])=>{const t=Xo(e.xy,fn(12.9898,78.233)),r=La(t,so);return _o(vo(r).mul(43758.5453))}),du=(e,t,r)=>su(t,r,e),cu=(e,t,r)=>ou(t,r,e),hu=(e,t)=>Wo(t,e),pu=uu,gu=yo;_i("all",oo),_i("any",uo),_i("radians",lo),_i("degrees",co),_i("exp",ho),_i("exp2",po),_i("log",go),_i("log2",mo),_i("sqrt",fo),_i("inverseSqrt",yo),_i("floor",bo),_i("ceil",xo),_i("normalize",To),_i("fract",_o),_i("sin",vo),_i("cos",No),_i("tan",So),_i("asin",Ro),_i("acos",Ao),_i("atan",Eo),_i("abs",wo),_i("sign",Co),_i("length",Mo),_i("lengthSq",ru),_i("negate",Bo),_i("oneMinus",Lo),_i("dFdx",Po),_i("dFdy",Fo),_i("round",Do),_i("reciprocal",Uo),_i("trunc",Io),_i("fwidth",Oo),_i("min",zo),_i("max",$o),_i("step",hu),_i("reflect",Ho),_i("distance",jo),_i("dot",Xo),_i("cross",Ko),_i("pow",Yo),_i("pow2",Qo),_i("pow3",Zo),_i("pow4",Jo),_i("transformDirection",eu),_i("mix",du),_i("clamp",iu),_i("refract",au),_i("smoothstep",cu),_i("faceForward",uu),_i("difference",qo),_i("saturate",nu),_i("cbrt",tu),_i("transpose",Vo),_i("determinant",ko),_i("inverse",Go),_i("rand",lu);class mu extends ai{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 e.flowBuildStage(this,"setup"),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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?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?Fn(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("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 fu=en(mu).setParameterLength(2,3);_i("select",fu);class yu extends ai{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const bu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new yu(r,t)},xu=e=>bu(e,{uniformFlow:!0}),Tu=(e,t)=>bu(e,{nodeName:t});function _u(e,t,r=null){return bu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function vu(e,t=null){return bu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Nu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Tu(e,t)}_i("context",bu),_i("label",Nu),_i("uniformFlow",xu),_i("setName",Tu),_i("builtinShadowContext",(e,t,r)=>_u(t,r,e)),_i("builtinAOContext",(e,t)=>vu(t,e));class Su extends ai{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,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Ru=en(Su),Au=(e,t=null)=>Ru(e,t).toStack(),Eu=(e,t=null)=>Ru(e,t,!0).toStack(),wu=e=>Ru(e).setIntent(!0).toStack();_i("toVar",Au),_i("toConst",Eu),_i("toVarIntent",wu);class Cu extends ai{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Mu=(e,t,r=null)=>Yi(new Cu(Yi(e),t,r));class Bu extends ai{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,this.global=!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=Mu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Ys.VERTEX);e.flowNodeFromShaderStage(Ys.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Lu=en(Bu).setParameterLength(1,2),Pu=e=>Lu(e);_i("toVarying",Lu),_i("toVertexStage",Pu),_i("varying",(...e)=>(d("TSL: .varying() has been renamed to .toVarying()."),Lu(...e))),_i("vertexStage",(...e)=>(d("TSL: .vertexStage() has been renamed to .toVertexStage()."),Lu(...e)));const Fu=an(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return su(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Du=an(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return su(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Uu="WorkingColorSpace";class Iu extends li{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===Uu?p.workingColorSpace:"OutputColorSpace"===t?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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=Sn(Fu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=Sn(Cn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=Sn(Du(i.rgb),i.a)),i):i}}const Ou=(e,t)=>Yi(new Iu(Yi(e),Uu,t)),Vu=(e,t)=>Yi(new Iu(Yi(e),t,Uu));_i("workingToColorSpace",Ou),_i("colorSpaceToWorking",Vu);let ku=class extends oi{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 Gu extends ai{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=Qs.OBJECT}setGroup(e){return this.group=e,this}element(e){return new ku(this,Yi(e))}setNodeType(e){const t=xa(null,e);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;enew zu(e,t,r);class Wu extends li{static get type(){return"ToneMappingNode"}constructor(e,t=ju,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Us(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Sn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Hu=(e,t,r)=>Yi(new Wu(e,Yi(t),Yi(r))),ju=$u("toneMappingExposure","float");_i("toneMapping",(e,t,r)=>Hu(t,r,e));const qu=new WeakMap;function Xu(e,t){let r=qu.get(e);return void 0===r&&(r=new b(e,t),qu.set(e,r)),r}class Ku extends mi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Xu(s.array,i):Xu(s,i);const o=new y(a,r,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=Lu(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}}function Yu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Cn(new Ku(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Mn(new Ku(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ku(e,t,r,s)}const Qu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s),Zu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,f,!0),Ju=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x,!0);_i("toAttribute",e=>Qu(e.value));class el extends ai{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Qs.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const tl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;etl(e,r).setCount(t);_i("compute",rl),_i("computeKernel",tl);class sl extends ai{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const il=e=>new sl(Yi(e));function nl(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),il(e).setParent(t)}_i("cache",nl),_i("isolate",il);class al extends ai{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 ol=en(al).setParameterLength(2);_i("bypass",ol);class ul extends ai{static get type(){return"RemapNode"}constructor(e,t,r,s=hn(0),i=hn(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 ll=en(ul,null,null,{doClamp:!1}).setParameterLength(3,5),dl=en(ul).setParameterLength(3,5);_i("remap",ll),_i("remapClamp",dl);class cl extends ai{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 hl=en(cl).setParameterLength(1,2),pl=e=>(e?fu(e,hl("discard")):hl("discard")).toStack();_i("discard",pl);class gl extends li{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const ml=(e,t=null,r=null)=>Yi(new gl(Yi(e),t,r));_i("renderOutput",ml);class fl extends li{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):_(n),r}}const yl=(e,t=null)=>Yi(new fl(Yi(e),t)).toStack();_i("debug",yl);class bl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class xl extends ai{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Qs.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==bl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function Tl(e,t="",r=null){return(e=Yi(e)).before(new xl(e,t,r))}_i("toInspector",Tl);class _l extends ai{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 Lu(this).build(e,r)}return d(`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 vl=(e,t=null)=>new _l(e,t),Nl=(e=0)=>vl("uv"+(e>0?e:""),"vec2");class Sl extends ai{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 Rl=en(Sl).setParameterLength(1,2);class Al extends ba{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Qs.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 El=en(Al).setParameterLength(1),wl=new N;class Cl extends ba{static get type(){return"TextureNode"}constructor(e=wl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Qs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Nl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=xa(this.value.matrix)),this._matrixUniform.mul(Tn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=xa(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1)),t)),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().");const s=an(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Qs.OBJECT:Qs.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=Wo(hl(x,"float"),hl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Vu(hl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Yi(e).mul(El(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Yi(t)}level(e){const t=this.clone();return t.levelNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}size(e){return Rl(this,e)}bias(e){const t=this.clone();return t.biasNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Yi(e),Yi(t)],r.referenceNode=this.getBase(),Yi(r)}depth(e){const t=this.clone();return t.depthNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}offset(e){const t=this.clone();return t.offsetNode=Yi(e),t.referenceNode=this.getBase(),Yi(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Ml=en(Cl).setParameterLength(1,4).setName("texture"),Bl=(e=wl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Yi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=Ml(e,t,r,s),i},Ll=(...e)=>Bl(...e).setSampler(!1);class Pl extends ba{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Fl=(e,t,r)=>new Pl(e,t,r);class Dl extends oi{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 Ul extends Pl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ws(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Qs.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;rnew Ul(e,t);const Ol=en(class extends ai{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Vl,kl;class Gl extends ai{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===Gl.DPR?"float":this.scope===Gl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Qs.NONE;return this.scope!==Gl.SIZE&&this.scope!==Gl.VIEWPORT&&this.scope!==Gl.DPR||(e=Qs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Gl.VIEWPORT?null!==t?kl.copy(t.viewport):(e.getViewport(kl),kl.multiplyScalar(e.getPixelRatio())):this.scope===Gl.DPR?this._output.value=e.getPixelRatio():null!==t?(Vl.width=t.width,Vl.height=t.height):e.getDrawingBufferSize(Vl)}setup(){const e=this.scope;let r=null;return r=e===Gl.SIZE?xa(Vl||(Vl=new t)):e===Gl.VIEWPORT?xa(kl||(kl=new s)):e===Gl.DPR?xa(1):fn(Hl.div(Wl)),this._output=r,r}generate(e){if(this.scope===Gl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Wl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Gl.COORDINATE="coordinate",Gl.VIEWPORT="viewport",Gl.SIZE="size",Gl.UV="uv",Gl.DPR="dpr";const zl=tn(Gl,Gl.DPR),$l=tn(Gl,Gl.UV),Wl=tn(Gl,Gl.SIZE),Hl=tn(Gl,Gl.COORDINATE),jl=tn(Gl,Gl.VIEWPORT),ql=jl.zw,Xl=Hl.sub(jl.xy),Kl=Xl.div(ql),Yl=an(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Wl),"vec2").once()(),Ql=xa(0,"uint").setName("u_cameraIndex").setGroup(ga("cameraIndex")).toVarying("v_cameraIndex"),Zl=xa("float").setName("cameraNear").setGroup(fa).onRenderUpdate(({camera:e})=>e.near),Jl=xa("float").setName("cameraFar").setGroup(fa).onRenderUpdate(({camera:e})=>e.far),ed=an(({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(fa).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrix")}else t=xa("mat4").setName("cameraProjectionMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),td=an(({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(fa).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrixInverse")}else t=xa("mat4").setName("cameraProjectionMatrixInverse").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),rd=an(({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(fa).setName("cameraViewMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraViewMatrix")}else t=xa("mat4").setName("cameraViewMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),sd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Il(r).setGroup(fa).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraWorldMatrix")}else t=xa("mat4").setName("cameraWorldMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),id=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Il(r).setGroup(fa).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraNormalMatrix")}else t=xa("mat3").setName("cameraNormalMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),nd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ad=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Il(r,"vec4").setGroup(fa).setName("cameraViewports").element(Ql).toConst("cameraViewport")}else t=Sn(0,0,Wl.x,Wl.y).toConst("cameraViewport");return t}).once()(),od=new C;class ud extends ai{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Qs.OBJECT,this.uniformNode=new ba(null)}getNodeType(){const e=this.scope;return e===ud.WORLD_MATRIX?"mat4":e===ud.POSITION||e===ud.VIEW_POSITION||e===ud.DIRECTION||e===ud.SCALE?"vec3":e===ud.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===ud.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ud.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ud.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ud.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ud.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===ud.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),od.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=od.radius}}generate(e){const t=this.scope;return t===ud.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===ud.POSITION||t===ud.VIEW_POSITION||t===ud.DIRECTION||t===ud.SCALE?this.uniformNode.nodeType="vec3":t===ud.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}}ud.WORLD_MATRIX="worldMatrix",ud.POSITION="position",ud.SCALE="scale",ud.VIEW_POSITION="viewPosition",ud.DIRECTION="direction",ud.RADIUS="radius";const ld=en(ud,ud.DIRECTION).setParameterLength(1),dd=en(ud,ud.WORLD_MATRIX).setParameterLength(1),cd=en(ud,ud.POSITION).setParameterLength(1),hd=en(ud,ud.SCALE).setParameterLength(1),pd=en(ud,ud.VIEW_POSITION).setParameterLength(1),gd=en(ud,ud.RADIUS).setParameterLength(1);class md extends ud{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const fd=tn(md,md.DIRECTION),yd=tn(md,md.WORLD_MATRIX),bd=tn(md,md.POSITION),xd=tn(md,md.SCALE),Td=tn(md,md.VIEW_POSITION),_d=tn(md,md.RADIUS),vd=xa(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Nd=xa(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Sd=an(e=>e.context.modelViewMatrix||Rd).once()().toVar("modelViewMatrix"),Rd=rd.mul(yd),Ad=an(e=>(e.context.isHighPrecisionModelViewMatrix=!0,xa("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Ed=an(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return xa("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),wd=vl("position","vec3"),Cd=wd.toVarying("positionLocal"),Md=wd.toVarying("positionPrevious"),Bd=an(e=>yd.mul(Cd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Ld=an(()=>Cd.transformDirection(yd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Pd=an(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Fd=an(e=>{let t;return t=e.camera.isOrthographicCamera?Tn(0,0,1):Pd.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Dd extends ai{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Ud=tn(Dd),Id=hn(Ud).mul(2).sub(1),Od=an(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Id)),e}),Vd=vl("normal","vec3"),kd=an(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Tn(0,1,0)):Vd,"vec3").once()().toVar("normalLocal"),Gd=Pd.dFdx().cross(Pd.dFdy()).normalize().toVar("normalFlat"),zd=an(e=>{let t;return t=!0===e.material.flatShading?Gd:Xd(kd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),$d=an(e=>{let t=zd.transformDirection(rd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),Wd=an(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=zd,!0!==t.flatShading&&(s=Od(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Hd=Wd.transformDirection(rd).toVar("normalWorld"),jd=an(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?Wd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),qd=an(([e,t=yd])=>{const r=Cn(t),s=e.div(Tn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Xd=an(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=vd.mul(e);return rd.transformDirection(s)}),Kd=an(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),Wd)).once(["NORMAL","VERTEX"])(),Yd=an(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Hd)).once(["NORMAL","VERTEX"])(),Qd=an(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Zd=new L,Jd=new a,ec=xa(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),tc=xa(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),rc=xa(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?(Zd.copy(r),Jd.makeRotationFromEuler(Zd)):Jd.identity(),Jd}),sc=Fd.negate().reflect(Wd),ic=Fd.negate().refract(Wd,ec),nc=sc.transformDirection(rd).toVar("reflectVector"),ac=ic.transformDirection(rd).toVar("reflectVector"),oc=new P;class uc extends Cl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===F?nc:e.mapping===D?ac:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Tn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Tn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Tn(t.x.negate(),t.yz)),rc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const lc=en(uc).setParameterLength(1,4).setName("cubeTexture"),dc=(e=oc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Yi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=lc(e,t,r,s),i};class cc extends oi{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 hc extends ai{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=Qs.OBJECT}element(e){return new cc(this,Yi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Fl(null,e,this.count):Array.isArray(this.getValueFromReference())?Il(null,e):"texture"===e?Bl(null):"cubeTexture"===e?dc(null):xa(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),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;enew hc(e,t,r),gc=(e,t,r,s)=>new hc(e,t,s,r);class mc extends hc{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 fc=(e,t,r=null)=>new mc(e,t,r),yc=Nl(),bc=Pd.dFdx(),xc=Pd.dFdy(),Tc=yc.dFdx(),_c=yc.dFdy(),vc=Wd,Nc=xc.cross(vc),Sc=vc.cross(bc),Rc=Nc.mul(Tc.x).add(Sc.mul(_c.x)),Ac=Nc.mul(Tc.y).add(Sc.mul(_c.y)),Ec=Rc.dot(Rc).max(Ac.dot(Ac)),wc=Ec.equal(0).select(0,Ec.inverseSqrt()),Cc=Rc.mul(wc).toVar("tangentViewFrame"),Mc=Ac.mul(wc).toVar("bitangentViewFrame"),Bc=vl("tangent","vec4"),Lc=Bc.xyz.toVar("tangentLocal"),Pc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Sd.mul(Sn(Lc,0)).xyz.toVarying("v_tangentView").normalize():Cc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Fc=Pc.transformDirection(rd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Dc=an(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Bc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Uc=Dc(Vd.cross(Bc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Ic=Dc(kd.cross(Lc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Oc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Dc(Wd.cross(Pc),"v_bitangentView").normalize():Mc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),Vc=Dc(Hd.cross(Fc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kc=Cn(Pc,Oc,Wd).toVar("TBNViewMatrix"),Gc=Fd.mul(kc),zc=an(()=>{let e=Qn.cross(Fd);return e=e.cross(Qn).normalize(),e=su(e,Wd,Kn.mul(Vn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),$c=e=>Yi(e).mul(.5).add(.5),Wc=e=>Tn(e,fo(nu(hn(1).sub(Xo(e,e)))));class Hc extends li{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=Wc(i.xy):s===V?i=Wc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Od(t)),i=Tn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Xd(i):t===U?n=kc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=Wd),n}}const jc=en(Hc).setParameterLength(1,2),qc=an(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Nl()),forceUVContext:!0}),s=hn(r(e=>e));return fn(hn(r(e=>e.add(e.dFdx()))).sub(s),hn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Xc=an(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(Id),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Kc extends li{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=qc({textureNode:this.textureNode,bumpScale:e});return Xc({surf_pos:Pd,surf_norm:Wd,dHdxy:t})}}const Yc=en(Kc).setParameterLength(1,2),Qc=new Map;class Zc extends ai{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Qc.get(e);return void 0===r&&(r=fc(e,t),Qc.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===Zc.COLOR){const e=void 0!==t.color?this.getColor(r):Tn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Zc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Zc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:hn(1);else if(r===Zc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Zc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Zc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Zc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Zc.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===Zc.NORMAL)t.normalMap?(s=jc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Yc(this.getTexture("bump").r,this.getFloat("bumpScale")):Wd;else if(r===Zc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?jc(this.getTexture(r),this.getCache(r+"Scale","vec2")):Wd;else if(r===Zc.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===Zc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===Zc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=wn(Uh.x,Uh.y,Uh.y.negate(),Uh.x).mul(e.rg.mul(2).sub(fn(1)).normalize().mul(e.b))}else s=Uh;else if(r===Zc.IRIDESCENCE_THICKNESS){const e=pc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=pc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Zc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Zc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Zc.IOR)s=this.getFloat(r);else if(r===Zc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Zc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===Zc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):hn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Zc.ALPHA_TEST="alphaTest",Zc.COLOR="color",Zc.OPACITY="opacity",Zc.SHININESS="shininess",Zc.SPECULAR="specular",Zc.SPECULAR_STRENGTH="specularStrength",Zc.SPECULAR_INTENSITY="specularIntensity",Zc.SPECULAR_COLOR="specularColor",Zc.REFLECTIVITY="reflectivity",Zc.ROUGHNESS="roughness",Zc.METALNESS="metalness",Zc.NORMAL="normal",Zc.CLEARCOAT="clearcoat",Zc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Zc.CLEARCOAT_NORMAL="clearcoatNormal",Zc.EMISSIVE="emissive",Zc.ROTATION="rotation",Zc.SHEEN="sheen",Zc.SHEEN_ROUGHNESS="sheenRoughness",Zc.ANISOTROPY="anisotropy",Zc.IRIDESCENCE="iridescence",Zc.IRIDESCENCE_IOR="iridescenceIOR",Zc.IRIDESCENCE_THICKNESS="iridescenceThickness",Zc.IOR="ior",Zc.TRANSMISSION="transmission",Zc.THICKNESS="thickness",Zc.ATTENUATION_DISTANCE="attenuationDistance",Zc.ATTENUATION_COLOR="attenuationColor",Zc.LINE_SCALE="scale",Zc.LINE_DASH_SIZE="dashSize",Zc.LINE_GAP_SIZE="gapSize",Zc.LINE_WIDTH="linewidth",Zc.LINE_DASH_OFFSET="dashOffset",Zc.POINT_SIZE="size",Zc.DISPERSION="dispersion",Zc.LIGHT_MAP="light",Zc.AO="ao";const Jc=tn(Zc,Zc.ALPHA_TEST),eh=tn(Zc,Zc.COLOR),th=tn(Zc,Zc.SHININESS),rh=tn(Zc,Zc.EMISSIVE),sh=tn(Zc,Zc.OPACITY),ih=tn(Zc,Zc.SPECULAR),nh=tn(Zc,Zc.SPECULAR_INTENSITY),ah=tn(Zc,Zc.SPECULAR_COLOR),oh=tn(Zc,Zc.SPECULAR_STRENGTH),uh=tn(Zc,Zc.REFLECTIVITY),lh=tn(Zc,Zc.ROUGHNESS),dh=tn(Zc,Zc.METALNESS),ch=tn(Zc,Zc.NORMAL),hh=tn(Zc,Zc.CLEARCOAT),ph=tn(Zc,Zc.CLEARCOAT_ROUGHNESS),gh=tn(Zc,Zc.CLEARCOAT_NORMAL),mh=tn(Zc,Zc.ROTATION),fh=tn(Zc,Zc.SHEEN),yh=tn(Zc,Zc.SHEEN_ROUGHNESS),bh=tn(Zc,Zc.ANISOTROPY),xh=tn(Zc,Zc.IRIDESCENCE),Th=tn(Zc,Zc.IRIDESCENCE_IOR),_h=tn(Zc,Zc.IRIDESCENCE_THICKNESS),vh=tn(Zc,Zc.TRANSMISSION),Nh=tn(Zc,Zc.THICKNESS),Sh=tn(Zc,Zc.IOR),Rh=tn(Zc,Zc.ATTENUATION_DISTANCE),Ah=tn(Zc,Zc.ATTENUATION_COLOR),Eh=tn(Zc,Zc.LINE_SCALE),wh=tn(Zc,Zc.LINE_DASH_SIZE),Ch=tn(Zc,Zc.LINE_GAP_SIZE),Mh=tn(Zc,Zc.LINE_WIDTH),Bh=tn(Zc,Zc.LINE_DASH_OFFSET),Lh=tn(Zc,Zc.POINT_SIZE),Ph=tn(Zc,Zc.DISPERSION),Fh=tn(Zc,Zc.LIGHT_MAP),Dh=tn(Zc,Zc.AO),Uh=xa(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))}),Ih=an(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Oh extends oi{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 Vh=en(Oh).setParameterLength(2);class kh extends Pl{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=Vs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Js.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 Vh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Js.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Qu(this.value),this._varying=Lu(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)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}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 Gh=(e,t=null,r=0)=>new kh(e,t,r);class zh extends ai{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===zh.VERTEX)s=e.getVertexIndex();else if(r===zh.INSTANCE)s=e.getInstanceIndex();else if(r===zh.DRAW)s=e.getDrawIndex();else if(r===zh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===zh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==zh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Lu(this).build(e,t)}return i}}zh.VERTEX="vertex",zh.INSTANCE="instance",zh.SUBGROUP="subgroup",zh.INVOCATION_LOCAL="invocationLocal",zh.INVOCATION_SUBGROUP="invocationSubgroup",zh.DRAW="draw";const $h=tn(zh,zh.VERTEX),Wh=tn(zh,zh.INSTANCE),Hh=tn(zh,zh.SUBGROUP),jh=tn(zh,zh.INVOCATION_SUBGROUP),qh=tn(zh,zh.INVOCATION_LOCAL),Xh=tn(zh,zh.DRAW);class Kh extends ai{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=Qs.FRAME,this.buffer=null,this.bufferColor=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){const{instanceMatrix:t,instanceColor:r,isStorageMatrix:s,isStorageColor:i}=this,{count:n}=t;let{instanceMatrixNode:a,instanceColorNode:o}=this;if(null===a){if(s)a=Gh(t,"mat4",Math.max(n,1)).element(Wh);else if(n<=1e3)a=Fl(t.array,"mat4",Math.max(n,1)).element(Wh);else{const e=new W(t.array,16,1);this.buffer=e;const r=t.usage===x?Ju:Zu,s=[r(e,"vec4",16,0),r(e,"vec4",16,4),r(e,"vec4",16,8),r(e,"vec4",16,12)];a=Mn(...s)}this.instanceMatrixNode=a}if(r&&null===o){if(i)o=Gh(r,"vec3",Math.max(r.count,1)).element(Wh);else{const e=new H(r.array,3),t=r.usage===x?Ju:Zu;this.bufferColor=e,o=Tn(t(e,"vec3",3,0))}this.instanceColorNode=o}const u=a.mul(Cd).xyz;if(Cd.assign(u),e.hasGeometryAttribute("normal")){const e=qd(kd,a);kd.assign(e)}null!==this.instanceColorNode&&Dn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.usage!==x&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.usage!==x&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version))}}const Yh=en(Kh).setParameterLength(2,3);class Qh extends Kh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Zh=en(Qh).setParameterLength(1);class Jh extends ai{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=Wh:this.batchingIdNode=Xh);const t=an(([e])=>{const t=pn(Rl(Ll(this.batchMesh._indirectTexture),0).x).toConst(),r=pn(e).mod(t).toConst(),s=pn(e).div(t).toConst();return Ll(this.batchMesh._indirectTexture,yn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(pn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=pn(Rl(Ll(s),0).x).toConst(),n=hn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Mn(Ll(s,yn(a,o)),Ll(s,yn(a.add(1),o)),Ll(s,yn(a.add(2),o)),Ll(s,yn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=an(([e])=>{const t=pn(Rl(Ll(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Ll(l,yn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Dn("vec3","vBatchColor").assign(t)}const d=Cn(u);Cd.assign(u.mul(Cd));const c=kd.div(Tn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;kd.assign(h),e.hasGeometryAttribute("tangent")&&Lc.mulAssign(d)}}const ep=en(Jh).setParameterLength(1),tp=new WeakMap;class rp extends ai{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Qs.OBJECT,this.skinIndexNode=vl("skinIndex","uvec4"),this.skinWeightNode=vl("skinWeight","vec4"),this.bindMatrixNode=pc("bindMatrix","mat4"),this.bindMatrixInverseNode=pc("bindMatrixInverse","mat4"),this.boneMatricesNode=gc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Cd,this.toPositionNode=Cd,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=wa(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=kd){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=wa(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=gc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Md)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===js(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Md.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();kd.assign(t),e.hasGeometryAttribute("tangent")&&Lc.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;tp.get(t)!==e.frameId&&(tp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const sp=e=>new rp(e);class ip extends ai{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew ip(Ji(e,"int")).toStack(),ap=()=>hl("break").toStack(),op=new WeakMap,up=new s,lp=an(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=pn($h).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Ll(e,yn(u,o)).depth(i).xyz.mul(t)});class dp extends ai{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=xa(1),this.updateType=Qs.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=op.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 j(m,h,p,a);f.type=q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=hn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Ll(this.mesh.morphTexture,yn(pn(e).add(1),pn(Wh))).r):t.assign(pc("morphTargetInfluences","float").element(e).toVar()),ln(t.notEqual(0),()=>{!0===s&&Cd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(0)})),!0===i&&kd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(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 cp=en(dp).setParameterLength(1);class hp extends ai{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class pp extends hp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class gp extends yu{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:Tn().toVar("directDiffuse"),directSpecular:Tn().toVar("directSpecular"),indirectDiffuse:Tn().toVar("indirectDiffuse"),indirectSpecular:Tn().toVar("indirectSpecular")};return{radiance:Tn().toVar("radiance"),irradiance:Tn().toVar("irradiance"),iblIrradiance:Tn().toVar("iblIrradiance"),ambientOcclusion:hn(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 mp=en(gp);class fp extends hp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const yp=new t;class bp extends Cl{static get type(){return"ViewportTextureNode"}constructor(e=$l,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Qs.FRAME,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(yp):yp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===yp.width&&s.image.height===yp.height||(s.image.width=yp.width,s.image.height=yp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const xp=en(bp).setParameterLength(0,3),Tp=en(bp,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let _p=null;class vp extends bp{static get type(){return"ViewportDepthTextureNode"}constructor(e=$l,t=null){null===_p&&(_p=new Y),super(e,t,_p)}getTextureForReference(){return _p}}const Np=en(vp).setParameterLength(0,2);class Sp extends ai{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===Sp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Sp.DEPTH_BASE)null!==r&&(s=Cp().assign(r));else if(t===Sp.DEPTH)s=e.isPerspectiveCamera?Ap(Pd.z,Zl,Jl):Rp(Pd.z,Zl,Jl);else if(t===Sp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ep(r,Zl,Jl);s=Rp(e,Zl,Jl)}else s=r;else s=Rp(Pd.z,Zl,Jl);return s}}Sp.DEPTH_BASE="depthBase",Sp.DEPTH="depth",Sp.LINEAR_DEPTH="linearDepth";const Rp=(e,t,r)=>e.add(t).div(t.sub(r)),Ap=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ep=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),wp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=mo(e.negate().div(t)),i=mo(r.div(t));return s.div(i)},Cp=en(Sp,Sp.DEPTH_BASE),Mp=tn(Sp,Sp.DEPTH),Bp=en(Sp,Sp.LINEAR_DEPTH).setParameterLength(0,1),Lp=Bp(Np());Mp.assign=e=>Cp(e);class Pp extends ai{static get type(){return"ClippingNode"}constructor(e=Pp.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===Pp.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Pp.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return an(()=>{const r=hn().toVar("distanceToPlane"),s=hn().toVar("distanceToGradient"),i=hn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Il(t).setGroup(fa);np(n,({i:t})=>{const n=e.element(t);r.assign(Pd.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ou(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Il(e).setGroup(fa),n=hn(1).toVar("intersectionClipOpacity");np(a,({i:e})=>{const i=t.element(e);r.assign(Pd.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ou(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}Un.a.mulAssign(i),Un.a.equal(0).discard()})()}setupDefault(e,t){return an(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Il(t).setGroup(fa);np(r,({i:t})=>{const r=e.element(t);Pd.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Il(e).setGroup(fa),r=mn(!0).toVar("clipped");np(s,({i:e})=>{const s=t.element(e);r.assign(Pd.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),an(()=>{const s=Il(e).setGroup(fa),i=Ol(t.getClipDistance());np(r,({i:e})=>{const t=s.element(e),r=Pd.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Pp.ALPHA_TO_COVERAGE="alphaToCoverage",Pp.DEFAULT="default",Pp.HARDWARE="hardware";const Fp=an(([e])=>_o(Ma(1e4,vo(Ma(17,e.x).add(Ma(.1,e.y)))).mul(wa(.1,wo(vo(Ma(13,e.y).add(e.x))))))),Dp=an(([e])=>Fp(fn(Fp(e.xy),e.z))),Up=an(([e])=>{const t=$o(Mo(Po(e.xyz)),Mo(Fo(e.xyz))),r=hn(1).div(hn(.05).mul(t)).toVar("pixScale"),s=fn(po(bo(mo(r))),po(xo(mo(r)))),i=fn(Dp(bo(s.x.mul(e.xyz))),Dp(bo(s.y.mul(e.xyz)))),n=_o(mo(r)),a=wa(Ma(n.oneMinus(),i.x),Ma(n,i.y)),o=zo(n,n.oneMinus()),u=Tn(a.mul(a).div(Ma(2,o).mul(Ca(1,o))),a.sub(Ma(.5,o)).div(Ca(1,o)),Ca(1,Ca(1,a).mul(Ca(1,a)).div(Ma(2,o).mul(Ca(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return iu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Ip extends _l{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 Op=(e=0)=>new Ip(e),Vp=an(([e,t])=>zo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),kp=an(([e,t])=>zo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gp=an(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zp=an(([e,t])=>su(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Wo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$p=an(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Sn(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"}]}),Wp=an(([e])=>Sn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Hp=an(([e])=>(ln(e.a.equal(0),()=>Sn(0)),Sn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class jp extends Q{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.maskNode=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,this.contextNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{d('NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Fs(t.slice(0,-4)),r.getCacheKey());return this.type+Ds(e)}build(e){this.setup(e)}setupObserver(e){return new Ls(e)}setup(e){e.context.setupNormal=()=>Mu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=Mu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=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!==a&&e.stack.addToStack(a);const i=Sn(s,Un.a).max(0);n=this.setupOutput(e,i),ra.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ra.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Sn(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,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.currentSamples;this.alphaToCoverage&&t>1?s=new Pp(Pp.ALPHA_TO_COVERAGE):e.stack.addToStack(new Pp)}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.addToStack(new Pp(Pp.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?wp(Pd.z,Zl,Jl):Rp(Pd.z,Zl,Jl))}null!==s&&Mp.assign(s).toStack()}setupPositionView(){return Sd.mul(Cd).xyz}setupModelViewProjection(){return ed.mul(Pd)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Ih}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&cp(t).toStack(),!0===t.isSkinnedMesh&&sp(t).toStack(),this.displacementMap){const e=fc("displacementMap","texture"),t=fc("displacementScale","float"),r=fc("displacementBias","float");Cd.addAssign(kd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ep(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Zh(t).toStack(),null!==this.positionNode&&Cd.assign(Mu(this.positionNode,"POSITION","vec3")),Cd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&mn(this.maskNode).not().discard();let s=this.colorNode?Sn(this.colorNode):eh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(Op())),t.instanceColor){s=Dn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Dn("vec3","vBatchColor").mul(s)}Un.assign(s);const i=this.opacityNode?hn(this.opacityNode):sh;Un.a.assign(Un.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?hn(this.alphaTestNode):Jc,!0===this.alphaToCoverage?(Un.a=ou(n,n.add(Oo(Un.a)),Un.a),Un.a.lessThanEqual(0).discard()):Un.a.lessThanEqual(n).discard()),!0===this.alphaHash&&Un.a.lessThan(Up(Cd)).discard(),e.isOpaque()&&Un.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Tn(0):Un.rgb}setupNormal(){return this.normalNode?Tn(this.normalNode):ch}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?fc("envMap","cubeTexture"):fc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new fp(Fh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Dh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new pp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=mp(n,t,r,s)}else null!==r&&(a=Tn(null!==s?su(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(On.assign(Tn(i||rh)),a=a.add(On)),a}setupFog(e,t){const r=e.fogNode;return r&&(ra.assign(t),t=Sn(r.toVar())),t}setupPremultipliedAlpha(e,t){return Wp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(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=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskNode=e.maskNode,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,this.contextNode=e.contextNode,super.copy(e)}}const qp=new Z;class Xp extends jp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(qp),this.setValues(e)}}const Kp=new J;class Yp extends jp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Kp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?hn(this.offsetNode):Bh,t=this.dashScaleNode?hn(this.dashScaleNode):Eh,r=this.dashSizeNode?hn(this.dashSizeNode):wh,s=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(r),ia.assign(s);const i=Lu(vl("lineDistance").mul(t));(e?i.add(e):i).mod(sa.add(ia)).greaterThan(sa).discard()}}let Qp=null;class Zp extends bp{static get type(){return"ViewportSharedTextureNode"}constructor(e=$l,t=null){null===Qp&&(Qp=new X),super(e,t,Qp)}getTextureForReference(){return Qp}updateReference(){return this}}const Jp=en(Zp).setParameterLength(0,2),eg=new J;class tg extends jp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(eg),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,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=an(({start:e,end:t})=>{const r=ed.element(2).element(2),s=ed.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Sn(su(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=an(()=>{const e=vl("instanceStart"),t=vl("instanceEnd"),r=Sn(Sd.mul(Sn(e,1))).toVar("start"),s=Sn(Sd.mul(Sn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?hn(this.dashScaleNode):Eh,t=this.offsetNode?hn(this.offsetNode):Bh,r=vl("instanceDistanceStart"),s=vl("instanceDistanceEnd");let i=wd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Dn("float","lineDistance").assign(i)}n&&(Dn("vec3","worldStart").assign(r.xyz),Dn("vec3","worldEnd").assign(s.xyz));const o=jl.z.div(jl.w),u=ed.element(2).element(3).equal(-1);ln(u,()=>{ln(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=ed.mul(r),d=ed.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=Sn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=su(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Dn("vec4","worldPos");o.assign(wd.y.lessThan(.5).select(r,s));const u=Mh.mul(.5);o.addAssign(Sn(wd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(Sn(wd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(Sn(a.mul(u),0)),ln(wd.y.greaterThan(1).or(wd.y.lessThan(0)),()=>{o.subAssign(Sn(a.mul(2).mul(u),0))})),g.assign(ed.mul(o));const l=Tn().toVar();l.assign(wd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=fn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(wd.x.lessThan(0).select(e.negate(),e)),ln(wd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(wd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Mh)),e.assign(e.div(jl.w.div(zl))),g.assign(wd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Sn(e,0,0)))}return g})();const o=an(({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 fn(h,p)});if(this.colorNode=an(()=>{const e=Nl();if(i){const t=this.dashSizeNode?hn(this.dashSizeNode):wh,r=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(t),ia.assign(r);const s=Dn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(sa.add(ia)).greaterThan(sa).discard()}const a=hn(1).toVar("alpha");if(n){const e=Dn("vec3","worldStart"),s=Dn("vec3","worldEnd"),n=Dn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Tn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Mh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(ou(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=hn(s.fwidth()).toVar("dlen");ln(e.y.abs().greaterThan(1),()=>{a.assign(ou(i.oneMinus(),i.add(1),s).oneMinus())})}else ln(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=vl("instanceColorStart"),t=vl("instanceColorEnd");u=wd.y.lessThan(.5).select(e,t).mul(eh)}else u=eh;return Sn(u,a)})(),this.transparent){const e=this.opacityNode?hn(this.opacityNode):sh;this.outputNode=Sn(this.colorNode.rgb.mul(e).add(Jp().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 rg=new te;class sg extends jp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(rg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?hn(this.opacityNode):sh;Un.assign(Vu(Sn($c(Wd),e),re))}}const ig=an(([e=Ld])=>{const 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 fn(t,r)});class ng extends se{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 ie(5,5,5),n=ig(Ld),a=new jp;a.colorNode=Bl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(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 ag=new WeakMap;class og extends li{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=dc(null);const t=new P;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Qs.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===le||r===de){if(ag.has(e)){const t=ag.get(e);lg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ng(r.height);s.fromEquirectangularTexture(t,e),lg(s.texture,e.mapping),this._cubeTexture=s.texture,ag.set(e,s.texture),e.addEventListener("dispose",ug)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function ug(e){const t=e.target;t.removeEventListener("dispose",ug);const r=ag.get(t);void 0!==r&&(ag.delete(t),r.dispose())}function lg(e,t){t===le?e.mapping=F:t===de&&(e.mapping=D)}const dg=en(og).setParameterLength(1);class cg extends hp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=dg(this.envNode)}}class hg extends hp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=hn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class pg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class gg extends pg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(Sn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(Sn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Un.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(su(s.rgb,s.rgb.mul(i.rgb),oh.mul(uh)));break;case he:s.rgb.assign(su(s.rgb,i.rgb,oh.mul(uh)));break;case ce:s.rgb.addAssign(i.rgb.mul(oh.mul(uh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const mg=new ge;class fg extends jp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(mg),this.setValues(e)}setupNormal(){return Od(zd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new hg(Fh)),t}setupOutgoingLight(){return Un.rgb}setupLightingModel(){return new gg}}const yg=an(({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))}),bg=an(e=>e.diffuseColor.mul(1/Math.PI)),xg=an(({dotNH:e})=>ta.mul(hn(.5)).add(1).mul(hn(1/Math.PI)).mul(e.pow(ta))),Tg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(t).clamp(),s=Fd.dot(t).clamp(),i=yg({f0:Zn,f90:1,dotVH:s}),n=hn(.25),a=xg({dotNH:r});return i.mul(n).mul(a)});class _g extends gg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(bg({diffuseColor:Un.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Tg({lightDirection:e})).mul(oh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const vg=new me;class Ng extends jp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(vg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g(!1)}}const Sg=new fe;class Rg extends jp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g}setupVariants(){const e=(this.shininessNode?hn(this.shininessNode):th).max(1e-4);ta.assign(e);const t=this.specularNode||ih;Zn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ag=an(e=>{if(!1===e.geometry.hasAttribute("normal"))return hn(0);const t=zd.dFdx().abs().max(zd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Eg=an(e=>{const{roughness:t}=e,r=Ag();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),wg=an(({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 Ba(.5,i.add(n).max(to))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Cg=an(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Tn(e.mul(r),t.mul(s),a).length()),l=a.mul(Tn(e.mul(i),t.mul(n),o).length());return Ba(.5,u.add(l))}).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"}]}),Mg=an(({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"}]}),Bg=hn(1/Math.PI),Lg=an(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Tn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Bg.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"}]}),Pg=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=Wd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Fd).normalize(),d=n.dot(e).clamp(),c=n.dot(Fd).clamp(),h=n.dot(l).clamp(),p=Fd.dot(l).clamp();let g,m,f=yg({f0:t,f90:r,dotVH:p});if(qi(a)&&(f=Hn.mix(f,i)),qi(o)){const t=Yn.dot(e),r=Yn.dot(Fd),s=Yn.dot(l),i=Qn.dot(e),n=Qn.dot(Fd),a=Qn.dot(l);g=Cg({alphaT:Xn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Lg({alphaT:Xn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=wg({alpha:u,dotNL:d,dotNV:c}),m=Mg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Fg=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Dg=null;const Ug=an(({roughness:e,dotNV:t})=>{null===Dg&&(Dg=new ye(Fg,16,16,G,be),Dg.name="DFG_LUT",Dg.minFilter=oe,Dg.magFilter=oe,Dg.wrapS=xe,Dg.wrapT=xe,Dg.generateMipmaps=!1,Dg.needsUpdate=!0);const r=fn(e,t);return Bl(Dg,r).rg}),Ig=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Pg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=Wd.dot(e).clamp(),l=Wd.dot(Fd).clamp(),d=Ug({roughness:s,dotNV:l}),c=Ug({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=hn(1).sub(g),y=hn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(hn(1).sub(f.mul(y).mul(b).mul(b)).add(to)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Og=an(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Ug({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Vg=an(({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(Tn(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"}]}),kg=an(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=hn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return hn(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"}]}),Gg=an(({dotNV:e,dotNL:t})=>hn(1).div(hn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),zg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(e).clamp(),s=Wd.dot(Fd).clamp(),i=Wd.dot(t).clamp(),n=kg({roughness:Wn,dotNH:i}),a=Gg({dotNV:s,dotNL:r});return $n.mul(n).mul(a)}),$g=an(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=fn(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"}]}),Wg=an(({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"}]}),Hg=an(({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"}]}),jg=an(({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=Tn().toVar();return ln(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(Cn(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=Tn(0).toVar();f.addAssign(Hg({v1:h,v2:p})),f.addAssign(Hg({v1:p,v2:g})),f.addAssign(Hg({v1:g,v2:m})),f.addAssign(Hg({v1:m,v2:h})),c.assign(Tn(Wg({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"}]}),qg=an(({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=Tn().toVar();return ln(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=Tn(0).toVar();d.addAssign(Hg({v1:n,v2:a})),d.addAssign(Hg({v1:a,v2:o})),d.addAssign(Hg({v1:o,v2:l})),d.addAssign(Hg({v1:l,v2:n})),u.assign(Tn(Wg({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"}]}),Xg=1/6,Kg=e=>Ma(Xg,Ma(e,Ma(e,e.negate().add(3)).sub(3)).add(1)),Yg=e=>Ma(Xg,Ma(e,Ma(e,Ma(3,e).sub(6))).add(4)),Qg=e=>Ma(Xg,Ma(e,Ma(e,Ma(-3,e).add(3)).add(3)).add(1)),Zg=e=>Ma(Xg,Yo(e,3)),Jg=e=>Kg(e).add(Yg(e)),em=e=>Qg(e).add(Zg(e)),tm=e=>wa(-1,Yg(e).div(Kg(e).add(Yg(e)))),rm=e=>wa(1,Zg(e).div(Qg(e).add(Zg(e)))),sm=(e,t,r)=>{const s=e.uvNode,i=Ma(s,t.zw).add(.5),n=bo(i),a=_o(i),o=Jg(a.x),u=em(a.x),l=tm(a.x),d=rm(a.x),c=tm(a.y),h=rm(a.y),p=fn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=fn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=fn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=fn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Jg(a.y).mul(wa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=em(a.y).mul(wa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},im=an(([e,t])=>{const r=fn(e.size(pn(t))),s=fn(e.size(pn(t.add(1)))),i=Ba(1,r),n=Ba(1,s),a=sm(e,Sn(i,r),bo(t)),o=sm(e,Sn(n,s),xo(t));return _o(t).mix(a,o)}),nm=an(([e,t])=>{const r=t.mul(El(e));return im(e,r)}),am=an(([e,t,r,s,i])=>{const n=Tn(au(t.negate(),To(e),Ba(1,s))),a=Tn(Mo(i[0].xyz),Mo(i[1].xyz),Mo(i[2].xyz));return To(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"}]}),om=an(([e,t])=>e.mul(iu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),um=Tp(),lm=Tp(),dm=an(([e,t,r],{material:s})=>{const i=(s.side===M?um:lm).sample(e),n=mo(Wl.x).mul(om(t,r));return im(i,n)}),cm=an(([e,t,r])=>(ln(r.notEqual(0),()=>{const s=go(t).negate().div(r);return ho(s.negate().mul(e))}),Tn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),hm=an(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Sn().toVar(),f=Tn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Tn(d.sub(i),d,d.add(i));np({start:0,end:3},({i:i})=>{const d=n.element(i),g=am(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(Sn(y,1))),x=fn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(fn(x.x,x.y.oneMinus()));const T=dm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(cm(Mo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=am(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(Sn(n,1))),y=fn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(fn(y.x,y.y.oneMinus())),m=dm(y,r,d),f=s.mul(cm(Mo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Tn(Og({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Sn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),pm=Cn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),gm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),mm=an(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=su(e,t,ou(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ln(a.lessThan(0),()=>Tn(1));const o=a.sqrt(),u=gm(n,e),l=yg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=hn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Tn(1).add(t).div(Tn(1).sub(t))})(i.clamp(0,.9999)),g=gm(p,n.toVec3()),m=yg({f0:g,f90:1,dotVH:o}),f=Tn(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),b=Tn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Tn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return np({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=Tn(54856e-17,44201e-17,52481e-17),i=Tn(1681e3,1795300,2208400),n=Tn(43278e5,93046e5,66121e5),a=hn(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=Tn(o.x.add(a),o.y,o.z).div(1.0685e-7),pm.mul(o)})(hn(e).mul(y),hn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Tn(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"}]}),fm=an(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=hn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=hn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),ym=Tn(.04),bm=hn(1);class xm extends pg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Tn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Tn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Tn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Tn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Tn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Wd.dot(Fd).clamp(),t=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Zn}),r=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Un.rgb});this.iridescenceFresnel=su(t,r,kn),this.iridescenceF0Dielectric=Vg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Vg({f:r,f90:1,dotVH:e}),this.iridescenceF0=su(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,kn)}if(!0===this.transmission){const t=Bd,r=nd.sub(Bd).normalize(),s=Hd,i=e.context;i.backdrop=hm(s,r,Vn,In,Jn,ea,t,yd,rd,ed,aa,ua,da,la,this.dispersion?ca:null),i.backdropAlpha=oa,Un.a.mulAssign(su(1,i.backdrop.a,oa))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=Wd.dot(Fd).clamp(),a=Ug({roughness:Vn,dotNV:n}),o=i?Hn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(zg({lightDirection:e})));const t=fm({normal:Wd,viewDir:Fd,roughness:Wn}),r=fm({normal:Wd,viewDir:e,roughness:Wn}),i=$n.r.max($n.g).max($n.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=jd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Pg({lightDirection:e,f0:ym,f90:bm,roughness:zn,normalView:jd})))}r.directDiffuse.addAssign(s.mul(bg({diffuseColor:In}))),r.directSpecular.addAssign(s.mul(Ig({lightDirection:e,f0:Jn,f90:1,roughness:Vn,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=Wd,h=Fd,p=Pd.toVar(),g=$g({N:c,V:h,roughness:Vn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Cn(Tn(m.x,0,m.y),Tn(0,1,0),Tn(m.z,0,m.w)).toVar(),b=Jn.mul(f.x).add(Jn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(jg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(In).mul(jg({N:c,V:h,P:p,mInv:Cn(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,s=t.mul(bg({diffuseColor:In})).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul($n,fm({normal:Wd,viewDir:Fd,roughness:Wn}))),!0===this.clearcoat){const e=jd.dot(Fd).clamp(),t=Og({dotNV:e,specularColor:ym,specularF90:bm,roughness:zn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Tn().toVar("singleScatteringDielectric"),n=Tn().toVar("multiScatteringDielectric"),a=Tn().toVar("singleScatteringMetallic"),o=Tn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ea,Zn,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ea,Un.rgb,this.iridescenceF0Metallic);const u=su(i,a,kn),l=su(n,o,kn),d=i.add(n),c=In.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Wd.dot(Fd).clamp().add(t),i=Vn.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=jd.dot(Fd).clamp(),r=yg({dotVH:e,f0:ym,f90:bm}),s=t.mul(Gn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Gn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Tm=hn(1),_m=hn(-2),vm=hn(.8),Nm=hn(-1),Sm=hn(.4),Rm=hn(2),Am=hn(.305),Em=hn(3),wm=hn(.21),Cm=hn(4),Mm=hn(4),Bm=hn(16),Lm=an(([e])=>{const t=Tn(wo(e)).toVar(),r=hn(-1).toVar();return ln(t.x.greaterThan(t.z),()=>{ln(t.x.greaterThan(t.y),()=>{r.assign(fu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}).Else(()=>{ln(t.z.greaterThan(t.y),()=>{r.assign(fu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Pm=an(([e,t])=>{const r=fn().toVar();return ln(t.equal(0),()=>{r.assign(fn(e.z,e.y).div(wo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(fn(e.x.negate(),e.z.negate()).div(wo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(fn(e.x.negate(),e.y).div(wo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(fn(e.z.negate(),e.y).div(wo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(fn(e.x.negate(),e.z).div(wo(e.y)))}).Else(()=>{r.assign(fn(e.x,e.y).div(wo(e.z)))}),Ma(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Fm=an(([e])=>{const t=hn(0).toVar();return ln(e.greaterThanEqual(vm),()=>{t.assign(Tm.sub(e).mul(Nm.sub(_m)).div(Tm.sub(vm)).add(_m))}).ElseIf(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Sm.sub(e).mul(Em.sub(Rm)).div(Sm.sub(Am)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Am.sub(e).mul(Cm.sub(Em)).div(Am.sub(wm)).add(Em))}).Else(()=>{t.assign(hn(-2).mul(mo(Ma(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Dm=an(([e,t])=>{const r=e.toVar();r.assign(Ma(2,r).sub(1));const s=Tn(r,1).toVar();return ln(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"}]}),Um=an(([e,t,r,s,i,n])=>{const a=hn(r),o=Tn(t),u=iu(Fm(a),_m,n),l=_o(u),d=bo(u),c=Tn(Im(e,o,d,s,i,n)).toVar();return ln(l.notEqual(0),()=>{const t=Tn(Im(e,o,d.add(1),s,i,n)).toVar();c.assign(su(c,t,l))}),c}),Im=an(([e,t,r,s,i,n])=>{const a=hn(r).toVar(),o=Tn(t),u=hn(Lm(o)).toVar(),l=hn($o(Mm.sub(a),0)).toVar();a.assign($o(a,Mm));const d=hn(po(a)).toVar(),c=fn(Pm(o,u).mul(d.sub(2)).add(1)).toVar();return ln(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Ma(3,Bm))),c.y.addAssign(Ma(4,po(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(fn(),fn())}),Om=an(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=No(s),l=r.mul(u).add(i.cross(r).mul(vo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Im(e,l,t,n,a,o)}),Vm=an(({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=Tn(fu(t,r,Ko(r,s))).toVar();ln(h.equal(Tn(0)),()=>{h.assign(Tn(s.z,0,s.x.negate()))}),h.assign(To(h));const p=Tn().toVar();return p.addAssign(i.element(0).mul(Om({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),np({start:pn(1),end:e},({i:e})=>{ln(e.greaterThanEqual(n),()=>{ap()});const t=hn(a.mul(hn(e))).toVar();p.addAssign(i.element(e).mul(Om({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(Om({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),Sn(p,1)}),km=an(([e])=>{const t=gn(e).toVar();return t.assign(t.shiftLeft(gn(16)).bitOr(t.shiftRight(gn(16)))),t.assign(t.bitAnd(gn(1431655765)).shiftLeft(gn(1)).bitOr(t.bitAnd(gn(2863311530)).shiftRight(gn(1)))),t.assign(t.bitAnd(gn(858993459)).shiftLeft(gn(2)).bitOr(t.bitAnd(gn(3435973836)).shiftRight(gn(2)))),t.assign(t.bitAnd(gn(252645135)).shiftLeft(gn(4)).bitOr(t.bitAnd(gn(4042322160)).shiftRight(gn(4)))),t.assign(t.bitAnd(gn(16711935)).shiftLeft(gn(8)).bitOr(t.bitAnd(gn(4278255360)).shiftRight(gn(8)))),hn(t).mul(2.3283064365386963e-10)}),Gm=an(([e,t])=>fn(hn(e).div(hn(t)),km(e))),zm=an(([e,t,r])=>{const s=Tn(t).toVar(),i=hn(r),n=i.mul(i).toVar(),a=To(Tn(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=fu(o.greaterThan(0),Tn(a.y.negate(),a.x,0).div(fo(o)),Tn(1,0,0)).toVar(),l=Ko(a,u).toVar(),d=fo(e.x),c=Ma(2,3.14159265359).mul(e.y),h=d.mul(No(c)).toVar(),p=d.mul(vo(c)).toVar(),g=Ma(.5,a.z.add(1));p.assign(g.oneMinus().mul(fo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(fo($o(0,h.mul(h).add(p.mul(p)).oneMinus()))));return To(Tn(n.mul(m.x),n.mul(m.y),$o(0,m.z)))}),$m=an(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Tn(s).toVar(),l=Tn(0).toVar(),d=hn(0).toVar();return ln(e.lessThan(.001),()=>{l.assign(Im(r,u,t,n,a,o))}).Else(()=>{const s=fu(wo(u.z).lessThan(.999),Tn(0,0,1),Tn(1,0,0)),c=To(Ko(s,u)).toVar(),h=Ko(u,c).toVar();np({start:gn(0),end:i},({i:s})=>{const p=Gm(s,i),g=zm(p,Tn(0,0,1),e),m=To(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=To(m.mul(Xo(u,m).mul(2)).sub(u)),y=$o(Xo(u,f),0);ln(y.greaterThan(0),()=>{const e=Im(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),ln(d.greaterThan(0),()=>{l.assign(l.div(d))})}),Sn(l,1)}),Wm=[.125,.215,.35,.446,.526,.582],Hm=20,jm=new _e(-1,1,1,-1,0,1),qm=new ve(90,1),Xm=new e;let Km=null,Ym=0,Qm=0;const Zm=new r,Jm=new WeakMap,ef=[3,1,5,0,4,2],tf=Dm(Nl(),vl("faceIndex")).normalize(),rf=Tn(tf.x,tf.y,tf.z);class sf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=Zm,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Km=this._renderer.getRenderTarget(),Ym=this._renderer.getActiveCubeFace(),Qm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=uf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=lf(),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===F||e.mapping===D?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=Wm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=ef[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Il(new Array(Hm).fill(0)),n=xa(new r(0,1,0)),a=xa(0),o=hn(Hm),u=xa(0),l=xa(1),d=Bl(),c=xa(0),h=hn(1/t),p=hn(1/s),g=hn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:rf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=of("blur");return f.fragmentNode=Vm({...m,latitudinal:u.equal(1)}),Jm.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Bl(),i=xa(0),n=xa(0),a=hn(1/t),o=hn(1/r),u=hn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=of("ggx");return d.fragmentNode=$m({...l,N_immutable:rf,GGX_SAMPLES:gn(512)}),Jm.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,jm)}_sceneToCubeUV(e,t,r,s,i){const n=qm;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(Xm),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Xm),h=!0),u.setRenderTarget(s),u.clear(),h&&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;af(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===F||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=uf(e)):null===this._equirectMaterial&&(this._equirectMaterial=lf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;af(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,jm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,af(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,jm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,af(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,jm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=Jm.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):Hm;f>Hm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,jm)}}function nf(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function af(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function of(e){const t=new jp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function uf(e){const t=of("cubemap");return t.fragmentNode=dc(e,rf),t}function lf(e){const t=of("equirect");return t.fragmentNode=Bl(e,ig(rf),0),t}const df=new WeakMap;function cf(e,t,r){const s=function(e){let t=df.get(e);void 0===t&&(t=new WeakMap,df.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 hf extends li{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 N;s.isRenderTargetTexture=!0,this._texture=Bl(s),this._width=xa(0),this._height=xa(0),this._maxMip=xa(0),this.updateBeforeType=Qs.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:cf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new sf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=rc.mul(Tn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Um(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const pf=en(hf).setParameterLength(1,3),gf=new WeakMap;class mf extends hp{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=gf.get(e);void 0===s&&(s=pf(e),gf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?zc:Wd,i=r.context(ff(Vn,s)).mul(tc),n=r.context(yf(Hd)).mul(Math.PI).mul(tc),a=il(i),o=il(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(ff(zn,jd)).mul(tc),t=il(e);u.addAssign(t)}}}const ff=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fd.negate().reflect(t),r=Jo(e).mix(r,t).normalize(),r=r.transformDirection(rd)),r),getTextureLevel:()=>e}},yf=e=>({getUV:()=>e,getTextureLevel:()=>hn(1)}),bf=new we;class xf extends jp{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(bf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new mf(t):null}setupLightingModel(){return new xm}setupSpecular(){const e=su(Tn(.04),Un.rgb,kn);Zn.assign(Tn(.04)),Jn.assign(e),ea.assign(1)}setupVariants(){const e=this.metalnessNode?hn(this.metalnessNode):dh;kn.assign(e);let t=this.roughnessNode?hn(this.roughnessNode):lh;t=Eg({roughness:t}),Vn.assign(t),this.setupSpecular(),In.assign(Un.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Tf=new Ce;class _f extends xf{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(Tf),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?hn(this.iorNode):Sh;aa.assign(e),Zn.assign(zo(Qo(aa.sub(1).div(aa.add(1))).mul(ah),Tn(1)).mul(nh)),Jn.assign(su(Zn,Un.rgb,kn)),ea.assign(su(nh,1,kn))}setupLightingModel(){return new xm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?hn(this.clearcoatNode):hh,t=this.clearcoatRoughnessNode?hn(this.clearcoatRoughnessNode):ph;Gn.assign(e),zn.assign(Eg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Tn(this.sheenNode):fh,t=this.sheenRoughnessNode?hn(this.sheenRoughnessNode):yh;$n.assign(e),Wn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?hn(this.iridescenceNode):xh,t=this.iridescenceIORNode?hn(this.iridescenceIORNode):Th,r=this.iridescenceThicknessNode?hn(this.iridescenceThicknessNode):_h;Hn.assign(e),jn.assign(t),qn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?fn(this.anisotropyNode):bh).toVar();Kn.assign(e.length()),ln(Kn.equal(0),()=>{e.assign(fn(1,0))}).Else(()=>{e.divAssign(fn(Kn)),Kn.assign(Kn.saturate())}),Xn.assign(Kn.pow2().mix(Vn.pow2(),1)),Yn.assign(kc[0].mul(e.x).add(kc[1].mul(e.y))),Qn.assign(kc[1].mul(e.x).sub(kc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?hn(this.transmissionNode):vh,t=this.thicknessNode?hn(this.thicknessNode):Nh,r=this.attenuationDistanceNode?hn(this.attenuationDistanceNode):Rh,s=this.attenuationColorNode?Tn(this.attenuationColorNode):Ah;if(oa.assign(e),ua.assign(t),la.assign(r),da.assign(s),this.useDispersion){const e=this.dispersionNode?hn(this.dispersionNode):Ph;ca.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Tn(this.clearcoatNormalNode):gh}setup(e){e.context.setupClearcoatNormal=()=>Mu(this.setupClearcoatNormal(e),"NORMAL","vec3"),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 vf extends xm{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(Wd.mul(a)).normalize(),h=hn(Fd.dot(c.negate()).saturate().pow(l).mul(d)),p=Tn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Nf extends _f{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=hn(.1),this.thicknessAmbientNode=hn(0),this.thicknessAttenuationNode=hn(.1),this.thicknessPowerNode=hn(2),this.thicknessScaleNode=hn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new vf(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 Sf=an(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=fn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=fc("gradientMap","texture").context({getUV:()=>i});return Tn(e.r)}{const e=i.fwidth().mul(.5);return su(Tn(.7),Tn(1),ou(hn(.7).sub(e.x),hn(.7).add(e.x),i.x))}});class Rf extends pg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Sf({normal:Vd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(bg({diffuseColor:Un.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const Af=new Me;class Ef extends jp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Af),this.setValues(e)}setupLightingModel(){return new Rf}}const wf=an(()=>{const e=Tn(Fd.z,0,Fd.x.negate()).normalize(),t=Fd.cross(e);return fn(e.dot(Wd),t.dot(Wd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Cf=new Be;class Mf extends jp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Cf),this.setValues(e)}setupVariants(e){const t=wf;let r;r=e.material.matcap?fc("matcap","texture").context({getUV:()=>t}):Tn(su(.2,.8,t.y)),Un.rgb.mulAssign(r.rgb)}}class Bf extends li{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 wn(e,s,s.negate(),e).mul(r)}{const e=t,s=Mn(Sn(1,0,0,0),Sn(0,No(e.x),vo(e.x).negate(),0),Sn(0,vo(e.x),No(e.x),0),Sn(0,0,0,1)),i=Mn(Sn(No(e.y),0,vo(e.y),0),Sn(0,1,0,0),Sn(vo(e.y).negate(),0,No(e.y),0),Sn(0,0,0,1)),n=Mn(Sn(No(e.z),vo(e.z).negate(),0,0),Sn(vo(e.z),No(e.z),0,0),Sn(0,0,1,0),Sn(0,0,0,1));return s.mul(i).mul(n).mul(Sn(r,1)).xyz}}}const Lf=en(Bf).setParameterLength(2),Pf=new Le;class Ff extends jp{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(Pf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Sd.mul(Tn(s||0));let u=fn(yd[0].xyz.length(),yd[1].xyz.length());null!==n&&(u=u.mul(fn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=wd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Gu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=hn(i||mh),c=Lf(l,d);return Sn(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 Df=new Pe,Uf=new t;class If extends Ff{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Sd.mul(Tn(e||Cd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?fn(n):Lh;u=u.mul(zl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Of.div(Pd.z.negate()))),i&&i.isNode&&(u=u.mul(fn(i)));let l=wd.xy;if(s&&s.isNode){const e=hn(s);l=Lf(l,e)}return l=l.mul(u),l=l.div(ql.div(2)),l=l.mul(o.w),o=o.add(Sn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Of=xa(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Uf);this.value=.5*t.y});class Vf extends pg{constructor(){super(),this.shadowNode=hn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Un.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Un.rgb)}}const kf=new Fe;class Gf extends jp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(kf),this.setValues(e)}setupLightingModel(){return new Vf}}const zf=Fn("vec3"),$f=Fn("vec3"),Wf=Fn("vec3");class Hf extends pg{constructor(){super()}start(e){const{material:t}=e,r=Fn("vec3"),s=Fn("vec3");ln(nd.sub(Bd).length().greaterThan(_d.mul(2)),()=>{r.assign(nd),s.assign(Bd)}).Else(()=>{r.assign(Bd),s.assign(nd)});const i=s.sub(r),n=xa("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=hn(0).toVar(),l=Tn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),np(n,()=>{const s=r.add(o.mul(u)),i=rd.mul(Sn(s,1)).xyz;let n;null!==t.depthNode&&($f.assign(Bp(Ap(i.z,Zl,Jl))),e.context.sceneDepthNode=Bp(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,zf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&zf.mulAssign(n);const d=zf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),Wf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ln(r.greaterThanEqual($f),()=>{zf.addAssign(e)}):zf.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(qg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Wf)}}class jf extends jp{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=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Hf}}class qf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};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 Xf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}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)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Fs(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}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=Us(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Us(e,1)),e=Us(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Qf=[];class Zf{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);Qf[0]=e,Qf[1]=t,Qf[2]=n,Qf[3]=i;let l=u.get(Qf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Qf,l)):(l.camera=s,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)),Qf[0]=null,Qf[1]=null,Qf[2]=null,Qf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Xf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Yf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Jf{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 ey=1,ty=2,ry=3,sy=4,iy=16;class ny extends Jf{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===ey?this.backend.createAttribute(e):t===ty?this.backend.createIndexAttribute(e):t===ry?this.backend.createStorageAttribute(e):t===sy&&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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,ry):this.updateAttribute(e,ey);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,ty);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,sy)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=oy(t),e.set(t,r)):r.version!==ay(t)&&(this.attributes.delete(r),r=oy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class ly{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):o("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 dy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class cy extends dy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class hy extends dy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let py=0;class gy{constructor(e,t,r,s=null,i=null){this.id=py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class my extends Jf{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 gy(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 gy(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 gy(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 hy(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 cy(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 fy extends Jf{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function yy(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 by(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 xy(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class Ty{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||yy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||by),this.transparent.length>1&&this.transparent.sort(t||by)}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=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,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.isArrayTexture?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 e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Ey){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput?this.outputNode.build(e,...t):super.build(e,...t),on(r),e.removeActiveStack(this),o}}const Ly=en(By).setParameterLength(0,1);class Py extends ai{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=zs(i),a=$s(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}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.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Fy extends ai{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.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.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Dy extends ai{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;tnew ky(e,"uint","float"),$y={};class Wy extends eo{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(Gy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return gn;case"int":return pn;case"uvec2":return bn;case"uvec3":return vn;case"uvec4":return An;case"ivec2":return yn;case"ivec3":return _n;case"ivec4":return Rn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t);const i=hn(s.bitAnd(Bo(s))),n=zy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{ln(e.equal(gn(0)),()=>gn(32));const s=gn(0),i=gn(0);return this._resolveElementType(e,s,t),ln(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),ln(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),ln(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),ln(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),ln(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(gn(1)).bitAnd(gn(1431655765)))),s.assign(s.bitAnd(gn(858993459)).add(s.shiftRight(gn(2)).bitAnd(gn(858993459))));const i=s.add(s.shiftRight(gn(4))).bitAnd(gn(252645135)).mul(gn(16843009)).shiftRight(gn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return an(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Wy.COUNT_TRAILING_ZEROS="countTrailingZeros",Wy.COUNT_LEADING_ZEROS="countLeadingZeros",Wy.COUNT_ONE_BITS="countOneBits";const Hy=rn(Wy,Wy.COUNT_TRAILING_ZEROS).setParameterLength(1),jy=rn(Wy,Wy.COUNT_LEADING_ZEROS).setParameterLength(1),qy=rn(Wy,Wy.COUNT_ONE_BITS).setParameterLength(1),Xy=an(([e])=>{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)}),Ky=(e,t)=>Yo(Ma(4,e.mul(Ca(1,e))),t);class Yy extends li{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const Qy=rn(Yy,"snorm").setParameterLength(1),Zy=rn(Yy,"unorm").setParameterLength(1),Jy=rn(Yy,"float16").setParameterLength(1);class eb extends li{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const tb=rn(eb,"snorm").setParameterLength(1),rb=rn(eb,"unorm").setParameterLength(1),sb=rn(eb,"float16").setParameterLength(1),ib=an(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),nb=an(([e])=>Tn(ib(e.z.add(ib(e.y.mul(1)))),ib(e.z.add(ib(e.x.mul(1)))),ib(e.y.add(ib(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),ab=an(([e,t,r])=>{const s=Tn(e).toVar(),i=hn(1.4).toVar(),n=hn(0).toVar(),a=Tn(s).toVar();return np({start:hn(0),end:hn(3),type:"float",condition:"<="},()=>{const e=Tn(nb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(hn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=hn(ib(s.z.add(ib(s.x.add(ib(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 ob extends ai{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const ub=en(ob),lb=e=>(...t)=>ub(e,...t),db=xa(0).setGroup(fa).onRenderUpdate(e=>e.time),cb=xa(0).setGroup(fa).onRenderUpdate(e=>e.deltaTime),hb=xa(0,"uint").setGroup(fa).onRenderUpdate(e=>e.frameId);const pb=an(([e,t,r=fn(.5)])=>Lf(e.sub(r),t).add(r)),gb=an(([e,t,r=fn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),mb=an(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=yd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=yd;const i=rd.mul(s);return qi(t)&&(i[0][0]=yd[0].length(),i[0][1]=0,i[0][2]=0),qi(r)&&(i[1][0]=0,i[1][1]=yd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ed.mul(i).mul(Cd)}),fb=an(([e=null])=>{const t=Bp();return Bp(Np(e)).sub(t).lessThan(0).select($l,e)});class yb extends ai{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Nl(),r=hn(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=fn(a,o);return t.add(l).mul(u)}}const bb=en(yb).setParameterLength(3),xb=an(([e,t=null,r=null,s=hn(1),i=Cd,n=kd])=>{let a=n.abs().normalize();a=a.div(a.dot(Tn(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=Bl(d,o).mul(a.x),g=Bl(c,u).mul(a.y),m=Bl(h,l).mul(a.z);return wa(p,g,m)}),Tb=new ze,_b=new r,vb=new r,Nb=new r,Sb=new a,Rb=new r(0,0,-1),Ab=new s,Eb=new r,wb=new r,Cb=new s,Mb=new t,Bb=new Ne,Lb=$l.flipX();Bb.depthTexture=new Y(1,1);let Pb=!1;class Fb extends Cl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Bb.texture,Lb),this._reflectorBaseNode=e.reflector||new Db(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=Yi(new Fb({defaultTexture:Bb.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.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Db extends ai{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new $e,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Qs.RENDER:Qs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Mb),e.setSize(Math.round(Mb.width*r),Math.round(Mb.height*r))}setup(e){return this._updateResolution(Bb,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 Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=We,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Pb)return!1;Pb=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Mb),this._updateResolution(o,s),vb.setFromMatrixPosition(n.matrixWorld),Nb.setFromMatrixPosition(r.matrixWorld),Sb.extractRotation(n.matrixWorld),_b.set(0,0,1),_b.applyMatrix4(Sb),Eb.subVectors(vb,Nb);let u=!1;if(!0===Eb.dot(_b)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Pb=!1);u=!0}Eb.reflect(_b).negate(),Eb.add(vb),Sb.extractRotation(r.matrixWorld),Rb.set(0,0,-1),Rb.applyMatrix4(Sb),Rb.add(Nb),wb.subVectors(vb,Rb),wb.reflect(_b).negate(),wb.add(vb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Eb),a.up.set(0,1,0),a.up.applyMatrix4(Sb),a.up.reflect(_b),a.lookAt(wb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Tb.setFromNormalAndCoplanarPoint(_b,vb),Tb.applyMatrix4(a.matrixWorldInverse),Ab.set(Tb.normal.x,Tb.normal.y,Tb.normal.z,Tb.constant);const l=a.projectionMatrix;Cb.x=(Math.sign(Ab.x)+l.elements[8])/l.elements[0],Cb.y=(Math.sign(Ab.y)+l.elements[9])/l.elements[5],Cb.z=-1,Cb.w=(1+l.elements[10])/l.elements[14],Ab.multiplyScalar(1/Ab.dot(Cb));l.elements[2]=Ab.x,l.elements[6]=Ab.y,l.elements[10]=s.coordinateSystem===h?Ab.z-0:Ab.z+1-0,l.elements[14]=Ab.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Pb=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const Ub=new _e(-1,1,1,-1,0,1);class Ib extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new He([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new He(t,2))}}const Ob=new Ib;class Vb extends ne{constructor(e=null){super(Ob,e),this.camera=Ub,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,Ub)}render(e){e.render(this,Ub)}}const kb=new t;class Gb extends Cl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Nl()),this.isRTTNode=!0,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 Vb(new jp),this.updateBeforeType=Qs.RENDER}get autoResize(){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.autoResize){const t=e.getPixelRatio(),r=e.getSize(kb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Cl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const zb=(e,...t)=>Yi(new Gb(Yi(e),...t)),$b=an(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=fn(e.x,e.y.oneMinus()).mul(2).sub(1),i=Sn(Tn(e,t),1)):i=Sn(Tn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Sn(r.mul(i));return n.xyz.div(n.w)}),Wb=an(([e,t])=>{const r=t.mul(Sn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return fn(s.x,s.y.oneMinus())}),Hb=an(([e,t,r])=>{const s=Rl(Ll(t)),i=yn(e.mul(s)).toVar(),n=Ll(t,i).toVar(),a=Ll(t,i.sub(yn(2,0))).toVar(),o=Ll(t,i.sub(yn(1,0))).toVar(),u=Ll(t,i.add(yn(1,0))).toVar(),l=Ll(t,i.add(yn(2,0))).toVar(),d=Ll(t,i.add(yn(0,2))).toVar(),c=Ll(t,i.add(yn(0,1))).toVar(),h=Ll(t,i.sub(yn(0,1))).toVar(),p=Ll(t,i.sub(yn(0,2))).toVar(),g=wo(Ca(hn(2).mul(o).sub(a),n)).toVar(),m=wo(Ca(hn(2).mul(u).sub(l),n)).toVar(),f=wo(Ca(hn(2).mul(c).sub(d),n)).toVar(),y=wo(Ca(hn(2).mul(h).sub(p),n)).toVar(),b=$b(e,n,r).toVar(),x=g.lessThan(m).select(b.sub($b(e.sub(fn(hn(1).div(s.x),0)),o,r)),b.negate().add($b(e.add(fn(hn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub($b(e.add(fn(0,hn(1).div(s.y))),c,r)),b.negate().add($b(e.sub(fn(0,hn(1).div(s.y))),h,r)));return To(Ko(x,T))}),jb=an(([e])=>_o(hn(52.9829189).mul(_o(Xo(e,fn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),qb=an(([e,t,r])=>{const s=hn(2.399963229728653),i=fo(hn(e).add(.5).div(hn(t))),n=hn(e).mul(s).add(r);return fn(No(n),vo(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Xb extends ai{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Nl())}sample(e){return this.callback(e)}}class Kb extends ai{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Kb.OBJECT?this.updateType=Qs.OBJECT:e===Kb.MATERIAL?this.updateType=Qs.RENDER:e===Kb.BEFORE_OBJECT?this.updateBeforeType=Qs.OBJECT:e===Kb.BEFORE_MATERIAL&&(this.updateBeforeType=Qs.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Kb.OBJECT="object",Kb.MATERIAL="material",Kb.BEFORE_OBJECT="beforeObject",Kb.BEFORE_MATERIAL="beforeMaterial";const Yb=(e,t)=>new Kb(e,t).toStack();class Qb extends H{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Zb extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Jb extends ai{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ex=tn(Jb),tx=new L,rx=new a;class sx extends ai{static get type(){return"SceneNode"}constructor(e=sx.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===sx.BACKGROUND_BLURRINESS?s=pc("backgroundBlurriness","float",r):t===sx.BACKGROUND_INTENSITY?s=pc("backgroundIntensity","float",r):t===sx.BACKGROUND_ROTATION?s=xa("mat4").setName("backgroundRotation").setGroup(fa).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==je?(tx.copy(r.backgroundRotation),tx.x*=-1,tx.y*=-1,tx.z*=-1,rx.makeRotationFromEuler(tx)):rx.identity(),rx}):o("SceneNode: Unknown scope:",t),s}}sx.BACKGROUND_BLURRINESS="backgroundBlurriness",sx.BACKGROUND_INTENSITY="backgroundIntensity",sx.BACKGROUND_ROTATION="backgroundRotation";const ix=tn(sx,sx.BACKGROUND_BLURRINESS),nx=tn(sx,sx.BACKGROUND_INTENSITY),ax=tn(sx,sx.BACKGROUND_ROTATION);class ox extends Cl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=Js.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Js.READ_WRITE)}toReadOnly(){return this.setAccess(Js.READ_ONLY)}toWriteOnly(){return this.setAccess(Js.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const ux=en(ox).setParameterLength(1,3),lx=an(({texture:e,uv:t})=>{const r=1e-4,s=Tn().toVar();return ln(t.x.lessThan(r),()=>{s.assign(Tn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Tn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Tn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Tn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Tn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Tn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Tn(-.01,0,0))).r.sub(e.sample(t.add(Tn(r,0,0))).r),n=e.sample(t.add(Tn(0,-.01,0))).r.sub(e.sample(t.add(Tn(0,r,0))).r),a=e.sample(t.add(Tn(0,0,-.01))).r.sub(e.sample(t.add(Tn(0,0,r))).r);s.assign(Tn(i,n,a))}),s.normalize()});class dx extends Cl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Tn(.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(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return lx({texture:this,uv:e})}}const cx=en(dx).setParameterLength(1,3);class hx extends hc{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 px=new WeakMap;class gx extends li{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Qs.OBJECT,this.updateAfterType=Qs.OBJECT,this.previousModelWorldMatrix=xa(new a),this.previousProjectionMatrix=xa(new a).setGroup(fa),this.previousCameraViewMatrix=xa(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=fx(r);this.previousModelWorldMatrix.value.copy(s);const i=mx(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}){fx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ed:xa(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Sd).mul(Cd),s=this.previousProjectionMatrix.mul(t).mul(Md),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ca(i,n)}}function mx(e){let t=px.get(e);return void 0===t&&(t={},px.set(e,t)),t}function fx(e,t=0){const r=mx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const yx=tn(gx),bx=an(([e])=>vx(e.rgb)),xx=an(([e,t=hn(1)])=>t.mix(vx(e.rgb),e.rgb)),Tx=an(([e,t=hn(1)])=>{const r=wa(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 su(e.rgb,s,i)}),_x=an(([e,t=hn(1)])=>{const r=Tn(.57735,.57735,.57735),s=t.cos();return Tn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Xo(r,e.rgb).mul(s.oneMinus())))))}),vx=(e,t=Tn(p.getLuminanceCoefficients(new r)))=>Xo(e,t),Nx=an(([e,t=Tn(1),s=Tn(0),i=Tn(1),n=hn(1),a=Tn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(Tn(a)),u=$o(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ln(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ln(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ln(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),Sn(u.rgb,e.a)});class Sx extends li{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 Rx=en(Sx).setParameterLength(2),Ax=new t;class Ex extends Cl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class wx extends Ex{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(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Cx extends li{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 Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=xa(0),this._cameraFar=xa(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Qs.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}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=new wx(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=new wx(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=Ep(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=Rp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Cx.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),Ax.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Ax)),this._pixelRatio=i,this.setSize(Ax.width,Ax.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:bu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Cx.COLOR="color",Cx.DEPTH="depth";class Mx extends Cx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Cx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 jp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=kd.negate(),r=ed.mul(Sd),s=hn(1),i=r.mul(Sn(Cd,1)),n=r.mul(Sn(Cd.add(t),1)),a=To(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Sn(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 Bx=an(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Lx=an(([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"}]}),Px=an(([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"}]}),Fx=an(([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)}),Dx=an(([e,t])=>{const r=Cn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Cn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Fx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ux=Cn(Tn(1.6605,-.1246,-.0182),Tn(-.5876,1.1329,-.1006),Tn(-.0728,-.0083,1.1187)),Ix=Cn(Tn(.6274,.0691,.0164),Tn(.3293,.9195,.088),Tn(.0433,.0113,.8956)),Ox=an(([e])=>{const t=Tn(e).toVar(),r=Tn(t.mul(t)).toVar(),s=Tn(r.mul(r)).toVar();return hn(15.5).mul(s.mul(r)).sub(Ma(40.14,s.mul(t))).add(Ma(31.96,s).sub(Ma(6.868,r.mul(t))).add(Ma(.4298,r).add(Ma(.1191,t).sub(.00232))))}),Vx=an(([e,t])=>{const r=Tn(e).toVar(),s=Cn(Tn(.856627153315983,.137318972929847,.11189821299995),Tn(.0951212405381588,.761241990602591,.0767994186031903),Tn(.0482516061458583,.101439036467562,.811302368396859)),i=Cn(Tn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Tn(-.11060664309660323,1.157823702216272,-.11060664309660294),Tn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=hn(-12.47393),a=hn(4.026069);return r.mulAssign(t),r.assign(Ix.mul(r)),r.assign(s.mul(r)),r.assign($o(r,1e-10)),r.assign(mo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(iu(r,0,1)),r.assign(Ox(r)),r.assign(i.mul(r)),r.assign(Yo($o(Tn(0),r),Tn(2.2))),r.assign(Ux.mul(r)),r.assign(iu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=an(([e,t])=>{const r=hn(.76),s=hn(.15);e=e.mul(t);const i=zo(e.r,zo(e.g,e.b)),n=fu(i.lessThan(.08),i.sub(Ma(6.25,i.mul(i))),.04);e.subAssign(n);const a=$o(e.r,$o(e.g,e.b));ln(a.lessThan(r),()=>e);const o=Ca(1,r),u=Ca(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ca(1,Ba(1,s.mul(a.sub(u)).add(1)));return su(e,Tn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Gx extends ai{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}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 zx=en(Gx).setParameterLength(1,3);class $x extends Gx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 Hx extends ai{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,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:hn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=qs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const jx=en(Hx).setParameterLength(1);class qx 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 Xx{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 Kx=new qx;class Yx extends ai{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new qx,this._output=jx(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]=jx(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]=jx(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 Xx(this),t=Kx.get("THREE"),r=Kx.get("TSL"),s=this.getMethod(),i=[e,this._local,Kx,()=>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:hn()}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=[Fs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ds(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 Qx=en(Yx).setParameterLength(1,2);function Zx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Pd.z).negate()}const Jx=an(([e,t],r)=>{const s=Zx(r);return ou(e,t,s)}),eT=an(([e],t)=>{const r=Zx(t);return e.mul(e,r,r).negate().exp().oneMinus()}),tT=an(([e,t])=>Sn(t.toFloat().mix(ra.rgb,e.toVec3()),ra.a));let rT=null,sT=null;class iT extends ai{static get type(){return"RangeNode"}constructor(e=hn(),t=hn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Ws(t.value)),i=e.getTypeLength(Ws(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Ws(a)),d=e.getTypeLength(Ws(o));rT=rT||new s,sT=sT||new s,rT.setScalar(0),sT.setScalar(0),1===u?rT.setScalar(a):a.isColor?rT.set(a.r,a.g,a.b,1):rT.set(a.x,a.y,a.z||0,a.w||0),1===d?sT.setScalar(o):o.isColor?sT.set(o.r,o.g,o.b,1):sT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew aT(e,t),uT=oT("numWorkgroups","uvec3"),lT=oT("workgroupId","uvec3"),dT=oT("globalId","uvec3"),cT=oT("localId","uvec3"),hT=oT("subgroupSize","uint");const pT=en(class extends ai{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 gT extends oi{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 mT extends ai{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new gT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class fT extends ai{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(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=hl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}fT.ATOMIC_LOAD="atomicLoad",fT.ATOMIC_STORE="atomicStore",fT.ATOMIC_ADD="atomicAdd",fT.ATOMIC_SUB="atomicSub",fT.ATOMIC_MAX="atomicMax",fT.ATOMIC_MIN="atomicMin",fT.ATOMIC_AND="atomicAnd",fT.ATOMIC_OR="atomicOr",fT.ATOMIC_XOR="atomicXor";const yT=en(fT),bT=(e,t,r)=>yT(e,t,r).toStack();class xT extends li{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===xT.SUBGROUP_ELECT?"bool":t===xT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===xT.SUBGROUP_BROADCAST||r===xT.SUBGROUP_SHUFFLE||r===xT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===xT.SUBGROUP_SHUFFLE_XOR||r===xT.SUBGROUP_SHUFFLE_DOWN||r===xT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}xT.SUBGROUP_ELECT="subgroupElect",xT.SUBGROUP_BALLOT="subgroupBallot",xT.SUBGROUP_ADD="subgroupAdd",xT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",xT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",xT.SUBGROUP_MUL="subgroupMul",xT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",xT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",xT.SUBGROUP_AND="subgroupAnd",xT.SUBGROUP_OR="subgroupOr",xT.SUBGROUP_XOR="subgroupXor",xT.SUBGROUP_MIN="subgroupMin",xT.SUBGROUP_MAX="subgroupMax",xT.SUBGROUP_ALL="subgroupAll",xT.SUBGROUP_ANY="subgroupAny",xT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",xT.QUAD_SWAP_X="quadSwapX",xT.QUAD_SWAP_Y="quadSwapY",xT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",xT.SUBGROUP_BROADCAST="subgroupBroadcast",xT.SUBGROUP_SHUFFLE="subgroupShuffle",xT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",xT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",xT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",xT.QUAD_BROADCAST="quadBroadcast";const TT=rn(xT,xT.SUBGROUP_ELECT).setParameterLength(0),_T=rn(xT,xT.SUBGROUP_BALLOT).setParameterLength(1),vT=rn(xT,xT.SUBGROUP_ADD).setParameterLength(1),NT=rn(xT,xT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),ST=rn(xT,xT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),RT=rn(xT,xT.SUBGROUP_MUL).setParameterLength(1),AT=rn(xT,xT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),ET=rn(xT,xT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),wT=rn(xT,xT.SUBGROUP_AND).setParameterLength(1),CT=rn(xT,xT.SUBGROUP_OR).setParameterLength(1),MT=rn(xT,xT.SUBGROUP_XOR).setParameterLength(1),BT=rn(xT,xT.SUBGROUP_MIN).setParameterLength(1),LT=rn(xT,xT.SUBGROUP_MAX).setParameterLength(1),PT=rn(xT,xT.SUBGROUP_ALL).setParameterLength(0),FT=rn(xT,xT.SUBGROUP_ANY).setParameterLength(0),DT=rn(xT,xT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),UT=rn(xT,xT.QUAD_SWAP_X).setParameterLength(1),IT=rn(xT,xT.QUAD_SWAP_Y).setParameterLength(1),OT=rn(xT,xT.QUAD_SWAP_DIAGONAL).setParameterLength(1),VT=rn(xT,xT.SUBGROUP_BROADCAST).setParameterLength(2),kT=rn(xT,xT.SUBGROUP_SHUFFLE).setParameterLength(2),GT=rn(xT,xT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),zT=rn(xT,xT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),$T=rn(xT,xT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),WT=rn(xT,xT.QUAD_BROADCAST).setParameterLength(1);let HT;function jT(e){HT=HT||new WeakMap;let t=HT.get(e);return void 0===t&&HT.set(e,t={}),t}function qT(e){const t=jT(e);return t.shadowMatrix||(t.shadowMatrix=xa("mat4").setGroup(fa).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function XT(e,t=Bd){const r=qT(e).mul(t);return r.xyz.div(r.w)}function KT(e){const t=jT(e);return t.position||(t.position=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function YT(e){const t=jT(e);return t.targetPosition||(t.targetPosition=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function QT(e){const t=jT(e);return t.viewPosition||(t.viewPosition=xa(new r).setGroup(fa).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const ZT=e=>rd.transformDirection(KT(e).sub(YT(e))),JT=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},e_=new WeakMap,t_=[];class r_ extends ai{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Fn("vec3","totalDiffuse"),this.totalSpecularNode=Fn("vec3","totalSpecular"),this.outgoingLightNode=Fn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Yi(e));else{let s=null;if(null!==r&&(s=JT(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;e_.has(e)?s=e_.get(e):(s=new r(e),e_.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.getNodeProperties(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=Tn(null!==l?l.mix(g,u):u)),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 s_ extends ai{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Qs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){i_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Bd)}}const i_=Fn("vec3","shadowPositionWorld");function n_(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 a_(e,t){return t=n_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function o_(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 u_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function l_(e,t){return t=u_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function d_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function c_(e,t,r){return r=l_(t,r=a_(e,r))}function h_(e,t,r){o_(e,r),d_(t,r)}var p_=Object.freeze({__proto__:null,resetRendererAndSceneState:c_,resetRendererState:a_,resetSceneState:l_,restoreRendererAndSceneState:h_,restoreRendererState:o_,restoreSceneState:d_,saveRendererAndSceneState:function(e,t,r={}){return r=u_(t,r=n_(e,r))},saveRendererState:n_,saveSceneState:u_});const g_=new WeakMap,m_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),f_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=pc("radius","float",r).setGroup(fa),o=fn(1).div(n),u=a.mul(o.x),l=jb(Hl.xy).mul(6.28318530718);return wa(i(t.xy.add(qb(0,5,l).mul(u)),t.z),i(t.xy.add(qb(1,5,l).mul(u)),t.z),i(t.xy.add(qb(2,5,l).mul(u)),t.z),i(t.xy.add(qb(3,5,l).mul(u)),t.z),i(t.xy.add(qb(4,5,l).mul(u)),t.z)).mul(.2)}),y_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=fn(1).div(n),o=a.x,u=a.y,l=t.xy,d=_o(l.mul(n).add(.5));return l.subAssign(d.mul(a)),wa(i(l,t.z),i(l.add(fn(o,0)),t.z),i(l.add(fn(0,u)),t.z),i(l.add(a),t.z),su(i(l.add(fn(o.negate(),0)),t.z),i(l.add(fn(o.mul(2),0)),t.z),d.x),su(i(l.add(fn(o.negate(),u)),t.z),i(l.add(fn(o.mul(2),u)),t.z),d.x),su(i(l.add(fn(0,u.negate())),t.z),i(l.add(fn(0,u.mul(2))),t.z),d.y),su(i(l.add(fn(o,u.negate())),t.z),i(l.add(fn(o,u.mul(2))),t.z),d.y),su(su(i(l.add(fn(o.negate(),u.negate())),t.z),i(l.add(fn(o.mul(2),u.negate())),t.z),d.x),su(i(l.add(fn(o.negate(),u.mul(2))),t.z),i(l.add(fn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),b_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=$o(1e-7,s.y.mul(s.y)),a=Wo(t.z,i);ln(a.equal(1),()=>hn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=iu(Ca(u,.3).div(.65)),$o(a,u)}),x_=an(([e,t,r])=>{let s=Bd.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),T_=e=>{let t=g_.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=pc("near","float",t).setGroup(fa),s=pc("far","float",t).setGroup(fa),i=cd(e);return x_(i,r,s)})(e):null;t=new jp,t.colorNode=Sn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,g_.set(e,t)}return t},__=e=>{const t=g_.get(e);void 0!==t&&(t.dispose(),g_.delete(e))},v_=new Xf,N_=[],S_=(e,t,r,s)=>{N_[0]=e,N_[1]=t;let i=v_.get(N_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===qe)&&(s&&(js(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,v_.set(N_,i)),N_[0]=null,N_[1]=null,i},R_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanVertical"),a=hn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),A_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanHorizontal"),a=hn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(wa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),E_=[m_,f_,y_,b_];let w_;const C_=new Vb;class M_ extends s_{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._currentShadowType=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,hn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=pc("bias","float",r).setGroup(fa);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=pc("near","float",r.camera).setGroup(fa),s=pc("far","float",r.camera).setGroup(fa);n=wp(e.negate(),t,s)}return a=Tn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return E_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=E;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,camera:r}=e,{light:s,shadow:i}=this,n=t.shadowMap.type,{depthTexture:a,shadowMap:o}=this.setupRenderTarget(i,e);if(i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),n===qe&&!0!==i.isPointLightShadow){a.compareFunction=null,o.depth>1?(o._vsmShadowMapVertical||(o._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=o._vsmShadowMapVertical,o._vsmShadowMapHorizontal||(o._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=o._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Bl(a);a.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Bl(this.vsmShadowMapVertical.texture);a.isArrayTexture&&(r=r.depth(this.depthLayer));const s=pc("blurSamples","float",i).setGroup(fa),n=pc("radius","float",i).setGroup(fa),u=pc("mapSize","vec2",i).setGroup(fa);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new jp);l.fragmentNode=R_({samples:s,radius:n,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new jp),l.fragmentNode=A_({samples:s,radius:n,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=pc("intensity","float",i).setGroup(fa),l=pc("normalBias","float",i).setGroup(fa),d=qT(s).mul(i_.add(Hd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=n===qe&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:a,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:o.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m;o.texture.isCubeTexture?m=dc(o.texture,c.xyz):(m=Bl(o.texture,c),a.isArrayTexture&&(m=m.depth(this.depthLayer)));const f=su(1,g.rgb.mix(m,1),u.mul(m.a)).toVar();this.shadowMap=o,this.shadow.map=o;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture):Bl(this.shadowMap.texture)).toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture).r.oneMinus():Ll(this.shadowMap.depthTexture,Nl().mul(Rl(Bl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return an(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");w_=c_(i,n,w_),n.overrideMaterial=T_(r),i.setRenderObjectFunction(S_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===qe&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,h_(i,n,w_)}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),C_.material=this.vsmMaterialVertical,C_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),C_.material=this.vsmMaterialHorizontal,C_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,__(this.light),this.shadowMap&&(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)}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 B_=(e,t)=>new M_(e,t),L_=new e,P_=new a,F_=new r,D_=new r,U_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],I_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],O_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],V_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],k_=an(({depthTexture:e,bd3D:t,dp:r})=>dc(e,t).compare(r)),G_=an(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=pc("radius","float",s).setGroup(fa),n=pc("mapSize","vec2",s).setGroup(fa),a=i.div(n.x),o=wo(t),u=To(Ko(t,o.x.greaterThan(o.z).select(Tn(0,1,0),Tn(1,0,0)))),l=Ko(t,u),d=jb(Hl.xy).mul(6.28318530718),c=qb(0,5,d),h=qb(1,5,d),p=qb(2,5,d),g=qb(3,5,d),m=qb(4,5,d);return dc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(dc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),z_=an(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.near),o=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.far),u=pc("bias","float",s).setGroup(fa),l=hn(1).toVar();return ln(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 d=i.normalize();l.assign(e({depthTexture:t,bd3D:d,dp:r,shadow:s}))}),l});class $_ extends M_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Xe?k_:G_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return z_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new Ke(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=E;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?U_:O_,d=u?I_:V_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(L_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),F_.setFromMatrixPosition(s.matrixWorld),a.position.copy(F_),D_.copy(a.position),D_.add(l[e]),a.up.copy(d[e]),a.lookAt(D_),a.updateMatrixWorld(),o.makeTranslation(-F_.x,-F_.y,-F_.z),P_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(P_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const W_=(e,t)=>new $_(e,t);class H_ extends hp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||xa(this.color).setGroup(fa),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Qs.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return QT(this.light).sub(e.context.positionView||Pd)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return B_(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?Yi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 j_=an(({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)}),q_=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=j_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class X_ extends H_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(2).setGroup(fa)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return W_(this.light)}setupDirect(e){return q_({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const K_=an(([e=Nl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),Y_=an(([e=Nl()],{renderer:t,material:r})=>{const s=ru(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=hn(s.fwidth()).toVar();i=ou(e.oneMinus(),e.add(1),s).oneMinus()}else i=fu(s.greaterThan(1),0,1);return i}),Q_=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=mn(e).toVar();return fu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Z_=an(([e,t])=>{const r=mn(t).toVar(),s=hn(e).toVar();return fu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),J_=an(([e])=>{const t=hn(e).toVar();return pn(bo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ev=an(([e,t])=>{const r=hn(e).toVar();return t.assign(J_(r)),r.sub(hn(t))}),tv=lb([an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=hn(s).toVar(),l=hn(r).toVar(),d=hn(t).toVar(),c=hn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]}),an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=Tn(s).toVar(),l=Tn(r).toVar(),d=Tn(t).toVar(),c=Tn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]})]),rv=lb([an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=hn(o).toVar(),m=hn(a).toVar(),f=hn(n).toVar(),y=hn(i).toVar(),b=hn(s).toVar(),x=hn(r).toVar(),T=hn(t).toVar(),_=hn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=Tn(o).toVar(),m=Tn(a).toVar(),f=Tn(n).toVar(),y=Tn(i).toVar(),b=Tn(s).toVar(),x=Tn(r).toVar(),T=Tn(t).toVar(),_=Tn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),sv=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=gn(e).toVar(),a=gn(n.bitAnd(gn(7))).toVar(),o=hn(Q_(a.lessThan(gn(4)),i,s)).toVar(),u=hn(Ma(2,Q_(a.lessThan(gn(4)),s,i))).toVar();return Z_(o,mn(a.bitAnd(gn(1)))).add(Z_(u,mn(a.bitAnd(gn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),iv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=gn(e).toVar(),u=gn(o.bitAnd(gn(15))).toVar(),l=hn(Q_(u.lessThan(gn(8)),a,n)).toVar(),d=hn(Q_(u.lessThan(gn(4)),n,Q_(u.equal(gn(12)).or(u.equal(gn(14))),a,i))).toVar();return Z_(l,mn(u.bitAnd(gn(1)))).add(Z_(d,mn(u.bitAnd(gn(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"}]}),nv=lb([sv,iv]),av=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=vn(e).toVar();return Tn(nv(n.x,i,s),nv(n.y,i,s),nv(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"}]}),ov=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=vn(e).toVar();return Tn(nv(o.x,a,n,i),nv(o.y,a,n,i),nv(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"}]}),uv=lb([av,ov]),lv=an(([e])=>{const t=hn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),dv=an(([e])=>{const t=hn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),cv=lb([lv,an(([e])=>{const t=Tn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),hv=lb([dv,an(([e])=>{const t=Tn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),pv=an(([e,t])=>{const r=pn(t).toVar(),s=gn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(pn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),gv=an(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(pv(r,pn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(pv(r,pn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(4))),t.addAssign(e)}),mv=an(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar();return s.bitXorAssign(i),s.subAssign(pv(i,pn(14))),n.bitXorAssign(s),n.subAssign(pv(s,pn(11))),i.bitXorAssign(n),i.subAssign(pv(n,pn(25))),s.bitXorAssign(i),s.subAssign(pv(i,pn(16))),n.bitXorAssign(s),n.subAssign(pv(s,pn(4))),i.bitXorAssign(n),i.subAssign(pv(n,pn(14))),s.bitXorAssign(i),s.subAssign(pv(i,pn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),fv=an(([e])=>{const t=gn(e).toVar();return hn(t).div(hn(gn(pn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),yv=an(([e])=>{const t=hn(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"}]}),bv=lb([an(([e])=>{const t=pn(e).toVar(),r=gn(gn(1)).toVar(),s=gn(gn(pn(3735928559)).add(r.shiftLeft(gn(2))).add(gn(13))).toVar();return mv(s.add(gn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(gn(2)).toVar(),n=gn().toVar(),a=gn().toVar(),o=gn().toVar();return n.assign(a.assign(o.assign(gn(pn(3735928559)).add(i.shiftLeft(gn(2))).add(gn(13))))),n.addAssign(gn(s)),a.addAssign(gn(r)),mv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(gn(3)).toVar(),o=gn().toVar(),u=gn().toVar(),l=gn().toVar();return o.assign(u.assign(l.assign(gn(pn(3735928559)).add(a.shiftLeft(gn(2))).add(gn(13))))),o.addAssign(gn(n)),u.addAssign(gn(i)),l.addAssign(gn(s)),mv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),an(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=pn(e).toVar(),u=gn(gn(4)).toVar(),l=gn().toVar(),d=gn().toVar(),c=gn().toVar();return l.assign(d.assign(c.assign(gn(pn(3735928559)).add(u.shiftLeft(gn(2))).add(gn(13))))),l.addAssign(gn(o)),d.addAssign(gn(a)),c.addAssign(gn(n)),gv(l,d,c),l.addAssign(gn(i)),mv(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"}]}),an(([e,t,r,s,i])=>{const n=pn(i).toVar(),a=pn(s).toVar(),o=pn(r).toVar(),u=pn(t).toVar(),l=pn(e).toVar(),d=gn(gn(5)).toVar(),c=gn().toVar(),h=gn().toVar(),p=gn().toVar();return c.assign(h.assign(p.assign(gn(pn(3735928559)).add(d.shiftLeft(gn(2))).add(gn(13))))),c.addAssign(gn(l)),h.addAssign(gn(u)),p.addAssign(gn(o)),gv(c,h,p),c.addAssign(gn(a)),h.addAssign(gn(n)),mv(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"}]})]),xv=lb([an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(bv(s,r)).toVar(),n=vn().toVar();return n.x.assign(i.bitAnd(pn(255))),n.y.assign(i.shiftRight(pn(8)).bitAnd(pn(255))),n.z.assign(i.shiftRight(pn(16)).bitAnd(pn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(bv(n,i,s)).toVar(),o=vn().toVar();return o.x.assign(a.bitAnd(pn(255))),o.y.assign(a.shiftRight(pn(8)).bitAnd(pn(255))),o.z.assign(a.shiftRight(pn(16)).bitAnd(pn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Tv=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=hn(tv(nv(bv(r,s),i,n),nv(bv(r.add(pn(1)),s),i.sub(1),n),nv(bv(r,s.add(pn(1))),i,n.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=hn(rv(nv(bv(r,s,i),n,a,o),nv(bv(r.add(pn(1)),s,i),n.sub(1),a,o),nv(bv(r,s.add(pn(1)),i),n,a.sub(1),o),nv(bv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),nv(bv(r,s,i.add(pn(1))),n,a,o.sub(1)),nv(bv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),nv(bv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),_v=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=Tn(tv(uv(xv(r,s),i,n),uv(xv(r.add(pn(1)),s),i.sub(1),n),uv(xv(r,s.add(pn(1))),i,n.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=Tn(rv(uv(xv(r,s,i),n,a,o),uv(xv(r.add(pn(1)),s,i),n.sub(1),a,o),uv(xv(r,s.add(pn(1)),i),n,a.sub(1),o),uv(xv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),uv(xv(r,s,i.add(pn(1))),n,a,o.sub(1)),uv(xv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),uv(xv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),vv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return fv(bv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return fv(bv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return fv(bv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return fv(bv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Nv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return Tn(fv(bv(r,pn(0))),fv(bv(r,pn(1))),fv(bv(r,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return Tn(fv(bv(r,s,pn(0))),fv(bv(r,s,pn(1))),fv(bv(r,s,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return Tn(fv(bv(r,s,i,pn(0))),fv(bv(r,s,i,pn(1))),fv(bv(r,s,i,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return Tn(fv(bv(r,s,i,n,pn(0))),fv(bv(r,s,i,n,pn(1))),fv(bv(r,s,i,n,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Sv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=hn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(Tv(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"}]}),Rv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(_v(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"}]}),Av=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar();return fn(Sv(o,a,n,i),Sv(o.add(Tn(pn(19),pn(193),pn(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"}]}),Ev=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(Rv(o,a,n,i)).toVar(),l=hn(Sv(o.add(Tn(pn(19),pn(193),pn(17))),a,n,i)).toVar();return Sn(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"}]}),wv=lb([an(([e,t,r,s,i,n,a])=>{const o=pn(a).toVar(),u=hn(n).toVar(),l=pn(i).toVar(),d=pn(s).toVar(),c=pn(r).toVar(),h=pn(t).toVar(),p=fn(e).toVar(),g=Tn(Nv(fn(h.add(d),c.add(l)))).toVar(),m=fn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=fn(fn(hn(h),hn(c)).add(m)).toVar(),y=fn(f.sub(p)).toVar();return ln(o.equal(pn(2)),()=>wo(y.x).add(wo(y.y))),ln(o.equal(pn(3)),()=>$o(wo(y.x),wo(y.y))),Xo(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"}]}),an(([e,t,r,s,i,n,a,o,u])=>{const l=pn(u).toVar(),d=hn(o).toVar(),c=pn(a).toVar(),h=pn(n).toVar(),p=pn(i).toVar(),g=pn(s).toVar(),m=pn(r).toVar(),f=pn(t).toVar(),y=Tn(e).toVar(),b=Tn(Nv(Tn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Tn(Tn(hn(f),hn(m),hn(g)).add(b)).toVar(),T=Tn(x.sub(y)).toVar();return ln(l.equal(pn(2)),()=>wo(T.x).add(wo(T.y)).add(wo(T.z))),ln(l.equal(pn(3)),()=>$o(wo(T.x),wo(T.y),wo(T.z))),Xo(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"}]})]),Cv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();l.assign(zo(l,r))})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Mv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Bv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(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)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Lv=lb([Cv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(zo(d,n))})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Pv=lb([Mv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Fv=lb([Bv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(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)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Dv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=fn(t).toVar(),p=fn(r).toVar(),g=fn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(Tn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Uv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Iv=an(([e])=>{const t=e.y,r=e.z,s=Tn().toVar();return ln(t.lessThan(1e-4),()=>{s.assign(Tn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(bo(i)).mul(6).toVar();const n=pn(Io(i)),a=i.sub(hn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ln(n.equal(pn(0)),()=>{s.assign(Tn(r,l,o))}).ElseIf(n.equal(pn(1)),()=>{s.assign(Tn(u,r,o))}).ElseIf(n.equal(pn(2)),()=>{s.assign(Tn(o,r,l))}).ElseIf(n.equal(pn(3)),()=>{s.assign(Tn(o,u,r))}).ElseIf(n.equal(pn(4)),()=>{s.assign(Tn(l,o,r))}).Else(()=>{s.assign(Tn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Ov=an(([e])=>{const t=Tn(e).toVar(),r=hn(t.x).toVar(),s=hn(t.y).toVar(),i=hn(t.z).toVar(),n=hn(zo(r,zo(s,i))).toVar(),a=hn($o(r,$o(s,i))).toVar(),o=hn(a.sub(n)).toVar(),u=hn().toVar(),l=hn().toVar(),d=hn().toVar();return d.assign(a),ln(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ln(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ln(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(wa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(wa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ln(u.lessThan(0),()=>{u.addAssign(1)})}),Tn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Vv=an(([e])=>{const t=Tn(e).toVar(),r=Nn(Ua(t,Tn(.04045))).toVar(),s=Tn(t.div(12.92)).toVar(),i=Tn(Yo($o(t.add(Tn(.055)),Tn(0)).div(1.055),Tn(2.4))).toVar();return su(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),kv=(e,t)=>{e=hn(e),t=hn(t);const r=fn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ou(e.sub(r),e.add(r),t)},Gv=(e,t,r,s)=>su(e,t,r[s].clamp()),zv=(e,t,r,s,i)=>su(e,t,kv(r,s[i])),$v=an(([e,t,r])=>{const s=To(e).toVar(),i=Ca(hn(.5).mul(t.sub(r)),Bd).div(s).toVar(),n=Ca(hn(-.5).mul(t.sub(r)),Bd).div(s).toVar(),a=Tn().toVar();a.x=s.x.greaterThan(hn(0)).select(i.x,n.x),a.y=s.y.greaterThan(hn(0)).select(i.y,n.y),a.z=s.z.greaterThan(hn(0)).select(i.z,n.z);const o=zo(a.x,a.y,a.z).toVar();return Bd.add(s.mul(o)).toVar().sub(r)}),Wv=an(([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(Ma(r,r).sub(Ma(s,s)))),n});var Hv=Object.freeze({__proto__:null,BRDF_GGX:Pg,BRDF_Lambert:bg,BasicPointShadowFilter:k_,BasicShadowFilter:m_,Break:ap,Const:Eu,Continue:()=>hl("continue").toStack(),DFGLUT:Ug,D_GGX:Mg,Discard:pl,EPSILON:to,F_Schlick:yg,Fn:an,HALF_PI:ao,INFINITY:ro,If:ln,Loop:np,NodeAccess:Js,NodeShaderStage:Ys,NodeType:Zs,NodeUpdateType:Qs,OnBeforeMaterialUpdate:e=>Yb(Kb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>Yb(Kb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>Yb(Kb.MATERIAL,e),OnObjectUpdate:e=>Yb(Kb.OBJECT,e),PCFShadowFilter:f_,PCFSoftShadowFilter:y_,PI:so,PI2:io,PointShadowFilter:G_,Return:()=>hl("return").toStack(),Schlick_to_F0:Vg,ScriptableNodeResources:Kx,ShaderNode:Ki,Stack:dn,Switch:(...e)=>xi.Switch(...e),TBNViewMatrix:kc,TWO_PI:no,VSMShadowFilter:b_,V_GGX_SmithCorrelated:wg,Var:Au,VarIntent:wu,abs:wo,acesFilmicToneMapping:Dx,acos:Ao,add:wa,addMethodChaining:_i,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Vx,all:oo,alphaT:Xn,and:Va,anisotropy:Kn,anisotropyB:Qn,anisotropyT:Yn,any:uo,append:e=>(d("TSL: append() has been renamed to Stack()."),dn(e)),array:_a,arrayBuffer:e=>new yi(e,"ArrayBuffer"),asin:Ro,assign:Na,atan:Eo,atomicAdd:(e,t)=>bT(fT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>bT(fT.ATOMIC_AND,e,t),atomicFunc:bT,atomicLoad:e=>bT(fT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>bT(fT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>bT(fT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>bT(fT.ATOMIC_OR,e,t),atomicStore:(e,t)=>bT(fT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>bT(fT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>bT(fT.ATOMIC_XOR,e,t),attenuationColor:da,attenuationDistance:la,attribute:vl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Zb(e,r,s);return Gh(i,t,e)},backgroundBlurriness:ix,backgroundIntensity:nx,backgroundRotation:ax,batch:ep,bentNormalView:zc,billboarding:mb,bitAnd:$a,bitNot:Wa,bitOr:Ha,bitXor:ja,bitangentGeometry:Uc,bitangentLocal:Ic,bitangentView:Oc,bitangentWorld:Vc,bitcast:Gy,blendBurn:Vp,blendColor:$p,blendDodge:kp,blendOverlay:zp,blendScreen:Gp,blur:Vm,bool:mn,buffer:Fl,bufferAttribute:Qu,builtin:Ol,builtinAOContext:vu,builtinShadowContext:_u,bumpMap:Yc,bvec2:xn,bvec3:Nn,bvec4:En,bypass:ol,cache:nl,call:Ra,cameraFar:Jl,cameraIndex:Ql,cameraNear:Zl,cameraNormalMatrix:id,cameraPosition:nd,cameraProjectionMatrix:ed,cameraProjectionMatrixInverse:td,cameraViewMatrix:rd,cameraViewport:ad,cameraWorldMatrix:sd,cbrt:tu,cdl:Nx,ceil:xo,checker:K_,cineonToneMapping:Px,clamp:iu,clearcoat:Gn,clearcoatNormalView:jd,clearcoatRoughness:zn,code:zx,color:cn,colorSpaceToWorking:Vu,colorToDirection:e=>Yi(e).mul(2).sub(1),compute:rl,computeKernel:tl,computeSkinning:(e,t=null)=>{const r=new rp(e);return r.positionNode=Gh(new H(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinIndexNode=Gh(new H(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinWeightNode=Gh(new H(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.bindMatrixNode=xa(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=xa(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Fl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Yi(r)},context:bu,convert:Ln,convertColorSpace:(e,t,r)=>Yi(new Iu(Yi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():zb(e,...t),cos:No,countLeadingZeros:jy,countOneBits:qy,countTrailingZeros:Hy,cross:Ko,cubeTexture:dc,cubeTextureBase:lc,dFdx:Po,dFdy:Fo,dashSize:sa,debug:yl,decrement:Za,decrementBefore:Ya,defaultBuildStages:ti,defaultShaderStages:ei,defined:qi,degrees:co,deltaTime:cb,densityFogFactor:eT,depth:Mp,depthPass:(e,t,r)=>new Cx(Cx.DEPTH,e,t,r),determinant:ko,difference:qo,diffuseColor:Un,diffuseContribution:In,directPointLight:q_,directionToColor:$c,directionToFaceDirection:Od,dispersion:ca,disposeShadowMaterial:__,distance:jo,div:Ba,dot:Xo,drawIndex:Xh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x),element:Bn,emissive:On,equal:Pa,equirectUV:ig,exp:ho,exp2:po,expression:hl,faceDirection:Id,faceForward:uu,faceforward:pu,float:hn,floatBitsToInt:e=>new ky(e,"int","float"),floatBitsToUint:zy,floor:bo,fog:tT,fract:_o,frameGroup:ma,frameId:hb,frontFacing:Ud,fwidth:Oo,gain:(e,t)=>e.lessThan(.5)?Ky(e.mul(2),t).div(2):Ca(1,Ky(Ma(Ca(1,e),2),t).div(2)),gapSize:ia,getConstNodeType:Xi,getCurrentStack:un,getDirection:Dm,getDistanceAttenuation:j_,getGeometryRoughness:Ag,getNormalFromDepth:Hb,getParallaxCorrectNormal:$v,getRoughness:Eg,getScreenPosition:Wb,getShIrradianceAt:Wv,getShadowMaterial:T_,getShadowRenderObjectFunction:S_,getTextureIndex:Iy,getViewPosition:$b,ggxConvolution:$m,globalId:dT,glsl:(e,t)=>zx(e,t,"glsl"),glslFn:(e,t)=>Wx(e,t,"glsl"),grayscale:bx,greaterThan:Ua,greaterThanEqual:Oa,hash:Xy,highpModelNormalViewMatrix:Ed,highpModelViewMatrix:Ad,hue:_x,increment:Qa,incrementBefore:Ka,inspector:Tl,instance:Yh,instanceIndex:Wh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Qb(e,r,s);return Gh(i,t,e)},instancedBufferAttribute:Zu,instancedDynamicBufferAttribute:Ju,instancedMesh:Zh,int:pn,intBitsToFloat:e=>new ky(e,"float","int"),interleavedGradientNoise:jb,inverse:Go,inverseSqrt:yo,inversesqrt:gu,invocationLocalIndex:qh,invocationSubgroupIndex:jh,ior:aa,iridescence:Hn,iridescenceIOR:jn,iridescenceThickness:qn,isolate:il,ivec2:yn,ivec3:_n,ivec4:Rn,js:(e,t)=>zx(e,t,"js"),label:Nu,length:Mo,lengthSq:ru,lessThan:Da,lessThanEqual:Ia,lightPosition:KT,lightProjectionUV:XT,lightShadowMatrix:qT,lightTargetDirection:ZT,lightTargetPosition:YT,lightViewPosition:QT,lightingContext:mp,lights:(e=[])=>(new r_).setLights(e),linearDepth:Bp,linearToneMapping:Bx,localId:cT,log:go,log2:mo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(go(r.div(t)));return hn(Math.E).pow(s).mul(t).negate()},luminance:vx,mat2:wn,mat3:Cn,mat4:Mn,matcapUV:wf,materialAO:Dh,materialAlphaTest:Jc,materialAnisotropy:bh,materialAnisotropyVector:Uh,materialAttenuationColor:Ah,materialAttenuationDistance:Rh,materialClearcoat:hh,materialClearcoatNormal:gh,materialClearcoatRoughness:ph,materialColor:eh,materialDispersion:Ph,materialEmissive:rh,materialEnvIntensity:tc,materialEnvRotation:rc,materialIOR:Sh,materialIridescence:xh,materialIridescenceIOR:Th,materialIridescenceThickness:_h,materialLightMap:Fh,materialLineDashOffset:Bh,materialLineDashSize:wh,materialLineGapSize:Ch,materialLineScale:Eh,materialLineWidth:Mh,materialMetalness:dh,materialNormal:ch,materialOpacity:sh,materialPointSize:Lh,materialReference:fc,materialReflectivity:uh,materialRefractionRatio:ec,materialRotation:mh,materialRoughness:lh,materialSheen:fh,materialSheenRoughness:yh,materialShininess:th,materialSpecular:ih,materialSpecularColor:ah,materialSpecularIntensity:nh,materialSpecularStrength:oh,materialThickness:Nh,materialTransmission:vh,max:$o,maxMipLevel:El,mediumpModelViewMatrix:Rd,metalness:kn,min:zo,mix:su,mixElement:du,mod:La,modInt:Ja,modelDirection:fd,modelNormalMatrix:vd,modelPosition:bd,modelRadius:_d,modelScale:xd,modelViewMatrix:Sd,modelViewPosition:Td,modelViewProjection:Ih,modelWorldMatrix:yd,modelWorldMatrixInverse:Nd,morphReference:cp,mrt:Vy,mul:Ma,mx_aastep:kv,mx_add:(e,t=hn(0))=>wa(e,t),mx_atan2:(e=hn(0),t=hn(1))=>Eo(e,t),mx_cell_noise_float:(e=Nl())=>vv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>hn(e).sub(r).mul(t).add(r),mx_divide:(e,t=hn(1))=>Ba(e,t),mx_fractal_noise_float:(e=Nl(),t=3,r=2,s=.5,i=1)=>Sv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Nl(),t=3,r=2,s=.5,i=1)=>Av(e,pn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Nl(),t=3,r=2,s=.5,i=1)=>Rv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Nl(),t=3,r=2,s=.5,i=1)=>Ev(e,pn(t),r,s).mul(i),mx_frame:()=>hb,mx_heighttonormal:(e,t)=>(e=Tn(e),t=hn(t),Yc(e,t)),mx_hsvtorgb:Iv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=hn(1))=>Ca(t,e),mx_modulo:(e,t=hn(1))=>La(e,t),mx_multiply:(e,t=hn(1))=>Ma(e,t),mx_noise_float:(e=Nl(),t=1,r=0)=>Tv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Nl(),t=1,r=0)=>_v(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Nl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Sn(_v(e),Tv(e.add(fn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=fn(.5,.5),r=fn(1,1),s=hn(0),i=fn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=fn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=hn(1))=>Yo(e,t),mx_ramp4:(e,t,r,s,i=Nl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=su(e,t,n),u=su(r,s,n);return su(o,u,a)},mx_ramplr:(e,t,r=Nl())=>Gv(e,t,r,"x"),mx_ramptb:(e,t,r=Nl())=>Gv(e,t,r,"y"),mx_rgbtohsv:Ov,mx_rotate2d:(e,t)=>{e=fn(e);const r=(t=hn(t)).mul(Math.PI/180);return Lf(e,r)},mx_rotate3d:(e,t,r)=>{e=Tn(e),t=hn(t),r=Tn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=hn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=hn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Nl())=>zv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Nl())=>zv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Vv,mx_subtract:(e,t=hn(0))=>Ca(e,t),mx_timer:()=>db,mx_transform_uv:(e=1,t=0,r=Nl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Dv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Uv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Nl(),t=1)=>Lv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec2:(e=Nl(),t=1)=>Pv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec3:(e=Nl(),t=1)=>Fv(e.convert("vec2|vec3"),t,pn(1)),negate:Bo,neutralToneMapping:kx,nodeArray:Ji,nodeImmutable:tn,nodeObject:Yi,nodeObjectIntent:Qi,nodeObjects:Zi,nodeProxy:en,nodeProxyIntent:rn,normalFlat:Gd,normalGeometry:Vd,normalLocal:kd,normalMap:jc,normalView:Wd,normalViewGeometry:zd,normalWorld:Hd,normalWorldGeometry:$d,normalize:To,not:Ga,notEqual:Fa,numWorkgroups:uT,objectDirection:ld,objectGroup:ya,objectPosition:cd,objectRadius:gd,objectScale:hd,objectViewPosition:pd,objectWorldMatrix:dd,oneMinus:Lo,or:ka,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=db)=>e.fract(),oscSine:(e=db)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=db)=>e.fract().round(),oscTriangle:(e=db)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ra,outputStruct:Uy,overloadingFn:lb,packHalf2x16:Jy,packSnorm2x16:Qy,packUnorm2x16:Zy,parabola:Ky,parallaxDirection:Gc,parallaxUV:(e,t)=>e.sub(Gc.mul(t)),parameter:(e,t)=>new My(e,t),pass:(e,t,r)=>new Cx(Cx.COLOR,e,t,r),passTexture:(e,t)=>new Ex(e,t),pcurve:(e,t,r)=>Yo(Ba(Yo(e,t),wa(Yo(e,t),Yo(Ca(1,e),r))),1/t),perspectiveDepthToViewZ:Ep,pmremTexture:pf,pointShadow:W_,pointUV:ex,pointWidth:na,positionGeometry:wd,positionLocal:Cd,positionPrevious:Md,positionView:Pd,positionViewDirection:Fd,positionWorld:Bd,positionWorldDirection:Ld,posterize:Rx,pow:Yo,pow2:Qo,pow3:Zo,pow4:Jo,premultiplyAlpha:Wp,property:Fn,quadBroadcast:WT,quadSwapDiagonal:OT,quadSwapX:UT,quadSwapY:IT,radians:lo,rand:lu,range:nT,rangeFogFactor:Jx,reciprocal:Uo,reference:pc,referenceBuffer:gc,reflect:Ho,reflectVector:nc,reflectView:sc,reflector:e=>new Fb(e),refract:au,refractVector:ac,refractView:ic,reinhardToneMapping:Lx,remap:ll,remapClamp:dl,renderGroup:fa,renderOutput:ml,rendererReference:$u,replaceDefaultUV:function(e,t=null){return bu(t,{getUV:e})},rotate:Lf,rotateUV:pb,roughness:Vn,round:Do,rtt:zb,sRGBTransferEOTF:Fu,sRGBTransferOETF:Du,sample:(e,t=null)=>new Xb(e,Yi(t)),sampler:e=>(!0===e.isNode?e:Bl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Bl(e)).convert("samplerComparison"),saturate:nu,saturation:xx,screenCoordinate:Hl,screenDPR:zl,screenSize:Wl,screenUV:$l,scriptable:Qx,scriptableValue:jx,select:fu,setCurrentStack:on,setName:Tu,shaderStages:ri,shadow:B_,shadowPositionWorld:i_,shapeCircle:Y_,sharedUniformGroup:ga,sheen:$n,sheenRoughness:Wn,shiftLeft:qa,shiftRight:Xa,shininess:ta,sign:Co,sin:vo,sinc:(e,t)=>vo(so.mul(t.mul(e).sub(1))).div(so.mul(t.mul(e).sub(1))),skinning:sp,smoothstep:ou,smoothstepElement:cu,specularColor:Zn,specularColorBlended:Jn,specularF90:ea,spherizeUV:gb,split:(e,t)=>Yi(new hi(Yi(e),t)),spritesheetUV:bb,sqrt:fo,stack:Ly,step:Wo,stepElement:hu,storage:Gh,storageBarrier:()=>pT("storage").toStack(),storageTexture:ux,string:(e="")=>new yi(e,"string"),struct:(e,t=null)=>{const r=new Py(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;ecx(e,t).level(r),texture3DLoad:(...e)=>cx(...e).setSampler(!1),textureBarrier:()=>pT("texture").toStack(),textureBicubic:nm,textureBicubicLevel:im,textureCubeUV:Um,textureLevel:(e,t,r)=>Bl(e,t).level(r),textureLoad:Ll,textureSize:Rl,textureStore:(e,t,r)=>{const s=ux(e,t,r);return null!==r&&s.toStack(),s},thickness:ua,time:db,toneMapping:Hu,toneMappingExposure:ju,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Yi(new Mx(t,r,Yi(s),Yi(i),Yi(n))),transformDirection:eu,transformNormal:qd,transformNormalToView:Xd,transformedClearcoatNormalView:Qd,transformedNormalView:Kd,transformedNormalWorld:Yd,transmission:oa,transpose:Vo,triNoise3D:ab,triplanarTexture:(...e)=>xb(...e),triplanarTextures:xb,trunc:Io,uint:gn,uintBitsToFloat:e=>new ky(e,"float","uint"),uniform:xa,uniformArray:Il,uniformCubeTexture:(e=oc)=>lc(e),uniformFlow:xu,uniformGroup:pa,uniformTexture:(e=wl)=>Bl(e),unpackHalf2x16:sb,unpackNormal:Wc,unpackSnorm2x16:tb,unpackUnorm2x16:rb,unpremultiplyAlpha:Hp,userData:(e,t,r)=>new hx(e,t,r),uv:Nl,uvec2:bn,uvec3:vn,uvec4:An,varying:Lu,varyingProperty:Dn,vec2:fn,vec3:Tn,vec4:Sn,vectorComponents:si,velocity:yx,vertexColor:Op,vertexIndex:$h,vertexStage:Pu,vibrance:Tx,viewZToLogarithmicDepth:wp,viewZToOrthographicDepth:Rp,viewZToPerspectiveDepth:Ap,viewport:jl,viewportCoordinate:Xl,viewportDepthTexture:Np,viewportLinearDepth:Lp,viewportMipTexture:Tp,viewportResolution:Yl,viewportSafeUV:fb,viewportSharedTexture:Jp,viewportSize:ql,viewportTexture:xp,viewportUV:Kl,vogelDiskSample:qb,wgsl:(e,t)=>zx(e,t,"wgsl"),wgslFn:(e,t)=>Wx(e,t,"wgsl"),workgroupArray:(e,t)=>new mT("Workgroup",e,t),workgroupBarrier:()=>pT("workgroup").toStack(),workgroupId:lT,workingToColorSpace:Ou,xor:za});const jv=new Cy;class qv extends Jf{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(jv),jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(jv),jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=Sn(l).mul(nx).context({getUV:()=>ax.mul($d),getTextureLevel:()=>ix}),p=ed.element(3).element(3).equal(1),g=Ba(1,ed.element(1).element(1)).mul(3),m=p.select(Cd.mul(g),Cd),f=Sd.mul(Sn(m,0));let y=ed.mul(Sn(f.xyz,1));y=y.setZ(y.w);const b=new jp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new Ye(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=Sn(l).mul(nx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?jv.set(0,0,0,1):"alpha-blend"===a&&jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=jv.r,T.g=jv.g,T.b=jv.b,T.a=jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.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 Xv=0;class Kv{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=Xv++}}class Yv{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 Kv(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Qv{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Zv{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 Jv{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class eN extends Jv{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class tN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let rN=0;class sN{constructor(e=null){this.id=rN++,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 iN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class nN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class aN extends nN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class oN extends nN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class uN extends nN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class lN extends nN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class dN extends nN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class cN extends nN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class hN extends nN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class pN extends nN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class gN extends aN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class mN extends oN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class fN extends uN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class yN extends lN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class bN extends dN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class xN extends cN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class TN extends hN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let vN=0;const NN=new WeakMap,SN=new WeakMap,RN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),AN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class EN{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.types={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=Ly(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new sN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:vN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===Qe&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=SN.get(this.renderer);return void 0===e&&(e=new Xf,SN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ng(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 Kv(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Kv(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 ri)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")}( ${AN(n.r)}, ${AN(n.g)}, ${AN(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 Qv(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===R)return"int";if(t===S)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=Vs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return RN.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 et||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Ly(this.stack);const e=un();return this.stacks.push(e),on(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,on(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);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Qv("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new iN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 Zv(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new Jv(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}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"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new eN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}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,d(`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 tN("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 $x,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 My(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),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 sN,this.stack=Ly();for(const r of ti)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(){d("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.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new jp),e.build(this)}else this.addFlow("compute",e);for(const e of ti){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of ri){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}getSharedDataFromNode(e){let t=NN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new gN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new mN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new fN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new yN(e);else if("color"===t)s=new bN(e);else if("mat2"===t)s=new xN(e);else if("mat3"===t)s=new TN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new _N(e)}r.cache=s}return s}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${tt} - Node System\n`}}class wN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Qs.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Qs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Qs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Qs.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 CN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}CN.isNodeFunctionInput=!0;class MN extends H_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:ZT(this.light),lightColor:e}}}const BN=new a,LN=new a;let PN=null;class FN extends H_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=xa(new r).setGroup(fa),this.halfWidth=xa(new r).setGroup(fa),this.updateType=Qs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;LN.identity(),BN.copy(t.matrixWorld),BN.premultiply(r),LN.extractRotation(BN),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(LN),this.halfHeight.value.applyMatrix4(LN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Bl(PN.LTC_FLOAT_1),r=Bl(PN.LTC_FLOAT_2)):(t=Bl(PN.LTC_HALF_1),r=Bl(PN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:QT(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){PN=e}}class DN extends H_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=xa(0).setGroup(fa),this.penumbraCosNode=xa(0).setGroup(fa),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(0).setGroup(fa),this.colorNode=xa(this.color).setGroup(fa)}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,t){const{coneCosNode:r,penumbraCosNode:s}=this;return ou(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=XT(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(ZT(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=j_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Bl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class UN extends DN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Bl(r,fn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const IN=an(([e,t])=>{const r=e.abs().sub(t);return Mo($o(r,0)).add(zo($o(r.x,r.y),0))});class ON extends DN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=hn(0),r=this.penumbraCosNode,s=qT(this.light).mul(e.context.positionWorld||Bd);return ln(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=IN(e.xy.sub(fn(.5)),fn(.5)),n=Ba(-1,Ca(1,Ao(r)).sub(1));t.assign(nu(i.mul(-2).mul(n)))}),t}}class VN extends H_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class kN extends H_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=KT(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=xa(new e).setGroup(fa)}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=Hd.dot(s).mul(.5).add(.5),n=su(r,t,i);e.context.irradiance.addAssign(n)}}class GN extends H_{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=Wv(Hd,this.lightProbe);e.context.irradiance.addAssign(t)}}class zN{parseFunction(){d("Abstract function.")}}class $N{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}$N.isNodeFunction=!0;const WN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,HN=/[a-z_0-9]+/gi,jN="#pragma main";class qN extends $N{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(jN),r=-1!==t?e.slice(t+12):e,s=r.match(WN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=HN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new jp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new Yv(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){YN[0]=e,YN[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(YN)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&QN.push(t.getCacheKey(!0)),i&&QN.push(i.getCacheKey()),n&&QN.push(n.getCacheKey()),QN.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),QN.push(this.renderer.shadowMap.enabled?1:0),QN.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Ds(QN),this.callHashCache.set(YN,s),QN.length=0}return YN.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return pf(r);{let e;return e=!0===r.isCubeTexture?dc(r):Bl(r),dg(e)}}if(!0===r.isTexture)return Bl(r,$l.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=pc("color","color",r).setGroup(fa),t=pc("density","float",r).setGroup(fa);return tT(e,eT(t))}if(r.isFog){const e=pc("color","color",r).setGroup(fa),t=pc("near","float",r).setGroup(fa),s=pc("far","float",r).setGroup(fa);return tT(e,Jx(t,s))}o("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?dc(r):!0===r.isTexture?Bl(r):void o("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 KN.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?cx(e,Tn($l,Ol("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Bl(e,$l).renderOutput(t.toneMapping,t.currentColorSpace);return KN.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 wN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const JN=new ze;class eS{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._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new uS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,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),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;hS(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 fS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function yS(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(this._renderTarget,this._mrt),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(){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 ZN(this,r),this._animation=new qf(this,this._nodes,this.info),this._attributes=new ny(r),this._background=new qv(this,this._nodes),this._geometries=new uy(this._attributes,this.info),this._textures=new wy(this,r,this.info),this._pipelines=new my(r,this._nodes),this._bindings=new fy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Zf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new vy(this.lighting),this._bundles=new sS,this._renderContexts=new Ay,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:xS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new eS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Ad,t.modelNormalViewMatrix=Ed):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Ad&&e.modelNormalViewMatrix===Ed}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(_S),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(_S),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new eS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?NS:vS;t.isArrayCamera||(SS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(SS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=TS.width,g.height=TS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(RS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_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)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=RS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=RS.copy(t).floor()}else t=RS.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?NS:vS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&RS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(SS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,RS.z,null,i)}}else if(e.isLineLoop)o("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?NS:vS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),RS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(SS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=it;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);e.side=null===i.shadowSide?i.side:i.shadowSide,null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=it,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class ES{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class wS extends ES{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(iy-e%iy)%iy;var e}get buffer(){return this._buffer}update(){return!0}}class CS extends wS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let MS=0;class BS extends CS{constructor(e,t){super("UniformBuffer_"+MS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class LS extends CS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let US=0;class IS extends DS{constructor(e,t){super(e,t),this.id=US++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class OS extends IS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class VS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class kS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const GS={bitcast_int_uint:new Gx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Gx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},zS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},$S={low:"lowp",medium:"mediump",high:"highp"},WS={swizzleAssign:!0,storageBuffer:!1},HS={perspective:"smooth",linear:"noperspective"},jS={centroid:"centroid"},qS="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class XS extends EN{constructor(e,t){super(e,t,new XN),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=GS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==GS[e]&&this._include(e),zS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?mt:ft;2===s?n=i?Tt:G:3===s?n=i?_t:vt:4===s&&(n=i?Nt:Re);const a={Float32Array:q,Uint8Array:Ge,Uint16Array:xt,Uint32Array:S,Int8Array:bt,Int16Array:yt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=$S[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=$S[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${HS[s.interpolationType]||s.interpolationType} ${jS[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+=`${HS[e.interpolationType]||e.interpolationType} ${jS[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=WS[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)}WS[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 OS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new VS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new kS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new BS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new FS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let KS=null,YS=null;class QS{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[St.RENDER]:null,[St.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?St.COMPUTE:St.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return KS=KS||new t,this.renderer.getDrawingBufferSize(KS)}setScissorTest(){}getClearColor(){const e=this.renderer;return YS=YS||new Cy,e.getClearColor(YS),YS.getRGB(YS),YS}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Rt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}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)}deleteBindGroupData(){}dispose(){}}let ZS,JS,eR=0;class tR{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 rR{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("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_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===R,id:eR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new tR(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;e0?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 nR,aR,oR,uR=!1;class lR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===uR&&(this._init(),uR=!0)}_init(){const e=this.gl;nR={[Ur]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Dr]:e.MIRRORED_REPEAT},aR={[w]:e.NEAREST,[Ir]:e.NEAREST_MIPMAP_NEAREST,[Je]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[Ze]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},oR={[Wr]:e.NEVER,[$r]:e.ALWAYS,[E]:e.LESS,[zr]:e.LEQUAL,[Gr]:e.EQUAL,[kr]:e.GEQUAL,[Vr]:e.GREATER,[Or]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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)}return 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,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;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,o),r.texParameteri(e,r.TEXTURE_WRAP_S,nR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,nR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,nR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,aR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,aR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,oR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==Je&&t.minFilter!==K)return;if(t.type===q&&!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})}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.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?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)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){const t=jr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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));i.bindRenderbuffer(i.RENDERBUFFER,null)}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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function dR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class cR{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 hR{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 pR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class gR{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 v(`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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 yR extends QS{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.currentSamples>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 cR(this),this.capabilities=new hR(this),this.attributeUtils=new rR(this),this.textureUtils=new lR(this),this.bufferRenderer=new gR(this),this.state=new sR(this),this.utils=new iR(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"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new fR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(St.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;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;e{let a=0;for(let t=0;t1&&u.setMRTBlending(i.textures),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;const N=()=>{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,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()});return void t.push(i)}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");o("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&&d("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;epR[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ry(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const bR="point-list",xR="line-list",TR="line-strip",_R="triangle-list",vR="triangle-strip",NR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},SR="never",RR="less",AR="equal",ER="less-equal",wR="greater",CR="not-equal",MR="greater-equal",BR="always",LR="store",PR="load",FR="clear",DR="ccw",UR="cw",IR="none",OR="back",VR="uint16",kR="uint32",GR="r8unorm",zR="r8snorm",$R="r8uint",WR="r8sint",HR="r16uint",jR="r16sint",qR="r16float",XR="rg8unorm",KR="rg8snorm",YR="rg8uint",QR="rg8sint",ZR="r32uint",JR="r32sint",eA="r32float",tA="rg16uint",rA="rg16sint",sA="rg16float",iA="rgba8unorm",nA="rgba8unorm-srgb",aA="rgba8snorm",oA="rgba8uint",uA="rgba8sint",lA="bgra8unorm",dA="bgra8unorm-srgb",cA="rgb9e5ufloat",hA="rgb10a2unorm",pA="rg11b10ufloat",gA="rg32uint",mA="rg32sint",fA="rg32float",yA="rgba16uint",bA="rgba16sint",xA="rgba16float",TA="rgba32uint",_A="rgba32sint",vA="rgba32float",NA="depth16unorm",SA="depth24plus",RA="depth24plus-stencil8",AA="depth32float",EA="depth32float-stencil8",wA="bc1-rgba-unorm",CA="bc1-rgba-unorm-srgb",MA="bc2-rgba-unorm",BA="bc2-rgba-unorm-srgb",LA="bc3-rgba-unorm",PA="bc3-rgba-unorm-srgb",FA="bc4-r-unorm",DA="bc4-r-snorm",UA="bc5-rg-unorm",IA="bc5-rg-snorm",OA="bc6h-rgb-ufloat",VA="bc6h-rgb-float",kA="bc7-rgba-unorm",GA="bc7-rgba-unorm-srgb",zA="etc2-rgb8unorm",$A="etc2-rgb8unorm-srgb",WA="etc2-rgb8a1unorm",HA="etc2-rgb8a1unorm-srgb",jA="etc2-rgba8unorm",qA="etc2-rgba8unorm-srgb",XA="eac-r11unorm",KA="eac-r11snorm",YA="eac-rg11unorm",QA="eac-rg11snorm",ZA="astc-4x4-unorm",JA="astc-4x4-unorm-srgb",eE="astc-5x4-unorm",tE="astc-5x4-unorm-srgb",rE="astc-5x5-unorm",sE="astc-5x5-unorm-srgb",iE="astc-6x5-unorm",nE="astc-6x5-unorm-srgb",aE="astc-6x6-unorm",oE="astc-6x6-unorm-srgb",uE="astc-8x5-unorm",lE="astc-8x5-unorm-srgb",dE="astc-8x6-unorm",cE="astc-8x6-unorm-srgb",hE="astc-8x8-unorm",pE="astc-8x8-unorm-srgb",gE="astc-10x5-unorm",mE="astc-10x5-unorm-srgb",fE="astc-10x6-unorm",yE="astc-10x6-unorm-srgb",bE="astc-10x8-unorm",xE="astc-10x8-unorm-srgb",TE="astc-10x10-unorm",_E="astc-10x10-unorm-srgb",vE="astc-12x10-unorm",NE="astc-12x10-unorm-srgb",SE="astc-12x12-unorm",RE="astc-12x12-unorm-srgb",AE="clamp-to-edge",EE="repeat",wE="mirror-repeat",CE="linear",ME="nearest",BE="zero",LE="one",PE="src",FE="one-minus-src",DE="src-alpha",UE="one-minus-src-alpha",IE="dst",OE="one-minus-dst",VE="dst-alpha",kE="one-minus-dst-alpha",GE="src-alpha-saturated",zE="constant",$E="one-minus-constant",WE="add",HE="subtract",jE="reverse-subtract",qE="min",XE="max",KE=0,YE=15,QE="keep",ZE="zero",JE="replace",ew="invert",tw="increment-clamp",rw="decrement-clamp",sw="increment-wrap",iw="decrement-wrap",nw="storage",aw="read-only-storage",ow="write-only",uw="read-only",lw="read-write",dw="non-filtering",cw="comparison",hw="float",pw="unfilterable-float",gw="depth",mw="sint",fw="uint",yw="2d",bw="3d",xw="2d",Tw="2d-array",_w="cube",vw="3d",Nw="all",Sw="vertex",Rw="instance",Aw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Ew={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class ww extends DS{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Cw extends wS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Mw=0;class Bw extends Cw{constructor(e,t){super("StorageBuffer_"+Mw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Js.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Lw extends Jf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:CE}),this.flipYSampler=e.createSampler({minFilter:ME}),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:vR,stripIndexFormat:kR},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:vR,stripIndexFormat:kR},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:xw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,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:FR,storeOp:LR,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,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Lw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,Ow=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,Vw={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 kw extends $N{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Iw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Ow.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 Gw extends zN{parseFunction(e){return new kw(e)}}const zw={[Js.READ_ONLY]:"read",[Js.WRITE_ONLY]:"write",[Js.READ_WRITE]:"read_write"},$w={[Ur]:"repeat",[xe]:"clamp",[Dr]:"mirror"},Ww={vertex:NR.VERTEX,fragment:NR.FRAGMENT,compute:NR.COMPUTE},Hw={instance:!0,swizzleAssign:!1,storageBuffer:!0},jw={"^^":"tsl_xor"},qw={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"},Xw={},Kw={tsl_xor:new Gx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Gx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Gx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Gx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Gx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Gx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Gx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Gx("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 Gx("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 Gx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Gx("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 Gx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Gx("\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")},Yw={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let Qw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Qw+="diagnostic( off, derivative_uniformity );\n");class Zw extends EN{constructor(e,t){super(e,t,new Gw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${$w[e.wrapS]}S_${$w[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=Xw[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Ur?(s.push(Kw.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(Kw.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Dr?(s.push(Kw.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Xw[t]=r=new Gx(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Su(new cl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Su(new cl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Su(new cl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===q||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=jw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),Js.READ_WRITE):Js.READ_ONLY:e.access}getStorageAccess(e,t){return zw[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new kS(i.name,i.node,o,n):new OS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new VS(i.name,i.node,o,n):"texture3D"===t&&(s=new kS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Ww[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new ww(`${i.name}_sampler`,i.node,o);e.setVisibility(Ww[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?BS:Bw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Ww[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new FS(u,o),e.setVisibility(Ww[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Ww[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Uw(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}n[e]={index:a.binding++,id:a.group,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return qw[e]||e}isAvailable(e){let t=Hw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Hw[e]=t),t}_getWGSLMethod(e){return void 0!==Kw[e]&&this._include(e),Yw[e]}_include(e){const t=Kw[e];return t.build(this),this.addInclude(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${Qw}\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){const[r,s,i]=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( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\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 Jw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=RA:e.depth&&(t=SA),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?bR:e.isLineSegments||e.isMesh&&!0===t.wireframe?xR:e.isLine?TR:e.isMesh?_R:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return lA;if(e===be)return xA;throw new Error("Unsupported output buffer type.")}}const eC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&eC.set(Float16Array,["float16"]);const tC=new Map([[et,["float16"]]]),rC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class sC{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=qr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Nw;let o;o=t.isSampledCubeTexture?_w:t.isSampledTexture3D?vw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Tw:xw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&NR.COMPUTE&&(s.access===Js.READ_WRITE||s.access===Js.WRITE_ONLY)?e.type=nw:e.type=aw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===Js.READ_WRITE?lw:t===Js.WRITE_ONLY?ow:uw,s.texture.isArrayTexture?e.viewDimension=Tw:s.texture.is3DTexture&&(e.viewDimension=vw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=pw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=pw:t.sampleType=gw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=mw:e===S?t.sampleType=fw:e===q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=hw:t.sampleType=pw)}s.isSampledCubeTexture?t.viewDimension=_w:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Tw:s.isSampledTexture3D&&(t.viewDimension=vw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=cw:t.type=dw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class aC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===Qe&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===nt){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:WE},r={srcFactor:i,dstFactor:n,operation:WE}};if(e.premultipliedAlpha)switch(s){case Qe:i(LE,UE,LE,UE);break;case $t:i(LE,LE,LE,LE);break;case zt:i(BE,FE,BE,LE);break;case Gt:i(IE,UE,BE,LE)}else switch(s){case Qe:i(DE,UE,LE,UE);break;case $t:i(DE,LE,LE,LE);break;case zt:o("WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Gt:o("WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ot:t=BE;break;case It:t=LE;break;case Ut:t=PE;break;case Bt:t=FE;break;case Dt:t=DE;break;case Mt:t=UE;break;case Pt:t=IE;break;case Ct:t=OE;break;case Lt:t=VE;break;case wt:t=kE;break;case Ft:t=GE;break;case 211:t=zE;break;case 212:t=$E;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ts:t=SR;break;case es:t=BR;break;case Jr:t=RR;break;case Zr:t=ER;break;case Qr:t=AR;break;case Yr:t=MR;break;case Kr:t=wR;break;case Xr:t=CR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case ls:t=QE;break;case us:t=ZE;break;case os:t=JE;break;case as:t=ew;break;case ns:t=tw;break;case is:t=rw;break;case ss:t=sw;break;case rs:t=iw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case at:t=WE;break;case Et:t=HE;break;case At:t=jE;break;case cs:t=qE;break;case ds:t=XE;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?VR:kR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?UR:DR,s.cullMode=r.side===B?IR:OR,s}_getColorWriteMask(e){return!0===e.colorWrite?YE:KE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=BR;else{const r=e.depthFunc;switch(r){case Qt:t=SR;break;case Yt:t=BR;break;case Kt:t=RR;break;case Xt:t=ER;break;case qt:t=AR;break;case jt:t=MR;break;case Ht:t=wR;break;case Wt:t=CR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class oC extends mR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 uC extends QS{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.defaultRenderPassdescriptor=null,this.utils=new Jw(this),this.attributeUtils=new sC(this),this.bindingUtils=new nC(this),this.pipelineUtils=new aC(this),this.textureUtils=new Dw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}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(Aw),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=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Aw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(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:PR}),this.initTimestampQuery(St.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("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===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){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(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new yR(e)));super(new t(e),e),this.library=new cC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class pC extends Rs{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class gC{constructor(e,t=Sn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new jp;r.name="PostProcessing",this._quadMesh=new Vb(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=ml(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class mC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class fC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.wrapR=xe,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class yC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class bC extends Zb{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class xC extends As{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Es(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):o(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]?(o("NodeLoader: Node type not found:",e),hn()):new this.nodes[e]}}class TC extends ws{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 _C extends Cs{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 xC;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 TC;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}t.lights=this.getLightsData(e.lightsNode.getLights()),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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>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 Fs=e=>Ls(e),Ds=e=>Ls(e),Us=(...e)=>Ls(e),Is=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),Os=new WeakMap;function Vs(e){return Is.get(e)}function ks(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Gs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function zs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function $s(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Hs(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Xs(u[0]):null}function js(e){let t=Os.get(e);return void 0===t&&(t={},Os.set(e,t)),t}function qs(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Ks=Object.freeze({__proto__:null,arrayBufferToBase64:qs,base64ToArrayBuffer:Xs,getAlignmentFromType:$s,getDataFromObject:js,getLengthFromType:Gs,getMemoryLengthFromType:zs,getTypeFromLength:Vs,getTypedArrayFromType:ks,getValueFromType:Hs,getValueType:Ws,hash:Us,hashArray:Ds,hashString:Fs});const Ys={VERTEX:"vertex",FRAGMENT:"fragment"},Qs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Zs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Js={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ei=["fragment","vertex"],ti=["setup","analyze","generate"],ri=[...ei,"compute"],si=["x","y","z","w"],ii={analyze:"setup",generate:"analyze"};let ni=0;class ai extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Qs.NONE,this.updateBeforeType=Qs.NONE,this.updateAfterType=Qs.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ni++})}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),this}onFrameUpdate(e){return this.onUpdate(e,Qs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Qs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Qs.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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.7,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 oi extends ai{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)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 ui extends ai{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 li extends ai{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 di extends li{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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const ci=si.join("");class hi extends ai{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(si.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))}getScope(){return this.node.getScope()}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===ci.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 pi extends li{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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ai.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==xi?xi.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=Ti.get("assign");return this.addToStack(t(...e))}},ai.prototype.toVarIntent=function(){return this},ai.prototype.get=function(e){return new bi(this,e)};const Ni={};function Si(e,t,r){Ni[e]=Ni[t]=Ni[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new hi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ai.prototype["set"+s]=ai.prototype["set"+i]=ai.prototype["set"+n]=function(t){const r=vi(e);return new pi(this,r,Yi(t))},ai.prototype["flip"+s]=ai.prototype["flip"+i]=ai.prototype["flip"+n]=function(){const t=vi(e);return new gi(this,t)}}const Ri=["x","y","z","w"],Ai=["r","g","b","a"],Ei=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ri[e],r=Ai[e],s=Ei[e];Si(t,r,s);for(let i=0;i<4;i++){t=Ri[e]+Ri[i],r=Ai[e]+Ai[i],s=Ei[e]+Ei[i],Si(t,r,s);for(let n=0;n<4;n++){t=Ri[e]+Ri[i]+Ri[n],r=Ai[e]+Ai[i]+Ai[n],s=Ei[e]+Ei[i]+Ei[n],Si(t,r,s);for(let a=0;a<4;a++)t=Ri[e]+Ri[i]+Ri[n]+Ri[a],r=Ai[e]+Ai[i]+Ai[n]+Ai[a],s=Ei[e]+Ei[i]+Ei[n]+Ei[a],Si(t,r,s)}}}for(let e=0;e<32;e++)Ni[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new oi(this,new yi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};Object.defineProperties(ai.prototype,Ni);const wi=new WeakMap,Ci=function(e,t=null){for(const r in e)e[r]=Yi(e[r],t);return e},Mi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...Ji(d(t)))):null!==r?(r=Yi(r),n=(...s)=>i(new e(t,...Ji(d(s)),r))):n=(...r)=>i(new e(t,...Ji(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...Ji(t))};class Li extends ai{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=wi.get(e.constructor);void 0===s&&(s=new WeakMap,wi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Yi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;Zi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Yi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return Zi(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Yi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ai&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Yi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Yi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Fi extends ai{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Li(this,e)}setup(){return this.call()}}const Di=[!1,!0],Ui=[0,1,2,3],Ii=[-1,-2],Oi=[.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],Vi=new Map;for(const e of Di)Vi.set(e,new yi(e));const ki=new Map;for(const e of Ui)ki.set(e,new yi(e,"uint"));const Gi=new Map([...ki].map(e=>new yi(e.value,"int")));for(const e of Ii)Gi.set(e,new yi(e,"int"));const zi=new Map([...Gi].map(e=>new yi(e.value)));for(const e of Oi)zi.set(e,new yi(e));for(const e of Oi)zi.set(-e,new yi(-e));const $i={bool:Vi,uint:ki,ints:Gi,float:zi},Wi=new Map([...Vi,...zi]),Hi=(e,t)=>Wi.has(e)?Wi.get(e):!0===e.isNode?e:new yi(e,t),ji=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new yi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Hs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Qi(t.get(r[0]));if(1===r.length){const t=Hi(r[0],e);return t.nodeType===e?Qi(t):Qi(new ui(t,e))}const s=r.map(e=>Hi(e));return Qi(new di(s,e))}},qi=e=>"object"==typeof e&&null!==e?e.value:e,Xi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ki(e,t){return new Fi(e,t)}const Yi=(e,t=null)=>function(e,t=null){const r=Ws(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Yi(Hi(e,t)):"shader"===r?e.isFn?e:an(e):e}(e,t),Qi=(e,t=null)=>Yi(e,t).toVarIntent(),Zi=(e,t=null)=>new Ci(e,t),Ji=(e,t=null)=>new Mi(e,t),en=(e,t=null,r=null,s=null)=>new Bi(e,t,r,s),tn=(e,...t)=>new Pi(e,...t),rn=(e,t=null,r=null,s={})=>new Bi(e,t,r,{...s,intent:!0});let sn=0;class nn extends ai{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Ki(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+sn++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function an(e,t=null){const r=new nn(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const on=e=>{xi=e},un=()=>xi,ln=(...e)=>xi.If(...e);function dn(e){return xi&&xi.addToStack(e),e}_i("toStack",dn);const cn=new ji("color"),hn=new ji("float",$i.float),pn=new ji("int",$i.ints),gn=new ji("uint",$i.uint),mn=new ji("bool",$i.bool),fn=new ji("vec2"),yn=new ji("ivec2"),bn=new ji("uvec2"),xn=new ji("bvec2"),Tn=new ji("vec3"),_n=new ji("ivec3"),vn=new ji("uvec3"),Nn=new ji("bvec3"),Sn=new ji("vec4"),Rn=new ji("ivec4"),An=new ji("uvec4"),En=new ji("bvec4"),wn=new ji("mat2"),Cn=new ji("mat3"),Mn=new ji("mat4");_i("toColor",cn),_i("toFloat",hn),_i("toInt",pn),_i("toUint",gn),_i("toBool",mn),_i("toVec2",fn),_i("toIVec2",yn),_i("toUVec2",bn),_i("toBVec2",xn),_i("toVec3",Tn),_i("toIVec3",_n),_i("toUVec3",vn),_i("toBVec3",Nn),_i("toVec4",Sn),_i("toIVec4",Rn),_i("toUVec4",An),_i("toBVec4",En),_i("toMat2",wn),_i("toMat3",Cn),_i("toMat4",Mn);const Bn=en(oi).setParameterLength(2),Pn=(e,t)=>Yi(new ui(Yi(e),t));_i("element",Bn),_i("convert",Pn);_i("append",e=>(d("TSL: .append() has been renamed to .toStack()."),dn(e)));class Ln extends ai{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Fs(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}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 Fn=(e,t)=>new Ln(e,t),Dn=(e,t)=>new Ln(e,t,!0),Un=tn(Ln,"vec4","DiffuseColor"),In=tn(Ln,"vec3","DiffuseContribution"),On=tn(Ln,"vec3","EmissiveColor"),Vn=tn(Ln,"float","Roughness"),kn=tn(Ln,"float","Metalness"),Gn=tn(Ln,"float","Clearcoat"),zn=tn(Ln,"float","ClearcoatRoughness"),$n=tn(Ln,"vec3","Sheen"),Wn=tn(Ln,"float","SheenRoughness"),Hn=tn(Ln,"float","Iridescence"),jn=tn(Ln,"float","IridescenceIOR"),qn=tn(Ln,"float","IridescenceThickness"),Xn=tn(Ln,"float","AlphaT"),Kn=tn(Ln,"float","Anisotropy"),Yn=tn(Ln,"vec3","AnisotropyT"),Qn=tn(Ln,"vec3","AnisotropyB"),Zn=tn(Ln,"color","SpecularColor"),Jn=tn(Ln,"color","SpecularColorBlended"),ea=tn(Ln,"float","SpecularF90"),ta=tn(Ln,"float","Shininess"),ra=tn(Ln,"vec4","Output"),sa=tn(Ln,"float","dashSize"),ia=tn(Ln,"float","gapSize"),na=tn(Ln,"float","pointWidth"),aa=tn(Ln,"float","IOR"),oa=tn(Ln,"float","Transmission"),ua=tn(Ln,"float","Thickness"),la=tn(Ln,"float","AttenuationDistance"),da=tn(Ln,"color","AttenuationColor"),ca=tn(Ln,"float","Dispersion");class ha extends ai{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 pa=e=>new ha(e),ga=(e,t=0)=>new ha(e,!0,t),ma=ga("frame"),fa=ga("render"),ya=pa("object");class ba extends mi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ya}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),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.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const xa=(e,t)=>{const r=Xi(t||e);if(r===e&&(e=Hs(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new ba(e,r)};class Ta extends li{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const _a=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Ta(null,r.length,r)}else{const r=e[0],s=e[1];t=new Ta(r,s)}return Yi(t)};_i("toArray",(e,t)=>_a(Array(t).fill(e)));class va extends li{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}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 si.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.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)o("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?Ji(t):Zi(t[0]),new Sa(Yi(e),t));_i("call",Ra);const Aa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ea extends li{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ea(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const wa=rn(Ea,"+").setParameterLength(2,1/0).setName("add"),Ca=rn(Ea,"-").setParameterLength(2,1/0).setName("sub"),Ma=rn(Ea,"*").setParameterLength(2,1/0).setName("mul"),Ba=rn(Ea,"/").setParameterLength(2,1/0).setName("div"),Pa=rn(Ea,"%").setParameterLength(2).setName("mod"),La=rn(Ea,"==").setParameterLength(2).setName("equal"),Fa=rn(Ea,"!=").setParameterLength(2).setName("notEqual"),Da=rn(Ea,"<").setParameterLength(2).setName("lessThan"),Ua=rn(Ea,">").setParameterLength(2).setName("greaterThan"),Ia=rn(Ea,"<=").setParameterLength(2).setName("lessThanEqual"),Oa=rn(Ea,">=").setParameterLength(2).setName("greaterThanEqual"),Va=rn(Ea,"&&").setParameterLength(2,1/0).setName("and"),ka=rn(Ea,"||").setParameterLength(2,1/0).setName("or"),Ga=rn(Ea,"!").setParameterLength(1).setName("not"),za=rn(Ea,"^^").setParameterLength(2).setName("xor"),$a=rn(Ea,"&").setParameterLength(2).setName("bitAnd"),Wa=rn(Ea,"~").setParameterLength(1).setName("bitNot"),Ha=rn(Ea,"|").setParameterLength(2).setName("bitOr"),ja=rn(Ea,"^").setParameterLength(2).setName("bitXor"),qa=rn(Ea,"<<").setParameterLength(2).setName("shiftLeft"),Xa=rn(Ea,">>").setParameterLength(2).setName("shiftRight"),Ka=an(([e])=>(e.addAssign(1),e)),Ya=an(([e])=>(e.subAssign(1),e)),Qa=an(([e])=>{const t=pn(e).toConst();return e.addAssign(1),t}),Za=an(([e])=>{const t=pn(e).toConst();return e.subAssign(1),t});_i("add",wa),_i("sub",Ca),_i("mul",Ma),_i("div",Ba),_i("mod",Pa),_i("equal",La),_i("notEqual",Fa),_i("lessThan",Da),_i("greaterThan",Ua),_i("lessThanEqual",Ia),_i("greaterThanEqual",Oa),_i("and",Va),_i("or",ka),_i("not",Ga),_i("xor",za),_i("bitAnd",$a),_i("bitNot",Wa),_i("bitOr",Ha),_i("bitXor",ja),_i("shiftLeft",qa),_i("shiftRight",Xa),_i("incrementBefore",Ka),_i("decrementBefore",Ya),_i("increment",Qa),_i("decrement",Za);const Ja=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(pn(e),pn(t)));_i("modInt",Ja);class eo extends li{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===eo.MAX||e===eo.MIN)&&arguments.length>3){let i=new eo(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===eo.LENGTH||t===eo.DISTANCE||t===eo.DOT?"float":t===eo.CROSS?"vec3":t===eo.ALL||t===eo.ANY?"bool":t===eo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===eo.ONE_MINUS)i=Ca(1,t);else if(s===eo.RECIPROCAL)i=Ba(1,t);else if(s===eo.DIFFERENCE)i=wo(Ca(t,r));else if(s===eo.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=Sn(Tn(n),0):s=Sn(Tn(s),0);const a=Ma(s,n).xyz;i=To(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.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===eo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===eo.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===eo.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==eo.MIN&&r!==eo.MAX?r===eo.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===eo.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===eo.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==eo.DFDX&&r!==eo.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}eo.ALL="all",eo.ANY="any",eo.RADIANS="radians",eo.DEGREES="degrees",eo.EXP="exp",eo.EXP2="exp2",eo.LOG="log",eo.LOG2="log2",eo.SQRT="sqrt",eo.INVERSE_SQRT="inversesqrt",eo.FLOOR="floor",eo.CEIL="ceil",eo.NORMALIZE="normalize",eo.FRACT="fract",eo.SIN="sin",eo.COS="cos",eo.TAN="tan",eo.ASIN="asin",eo.ACOS="acos",eo.ATAN="atan",eo.ABS="abs",eo.SIGN="sign",eo.LENGTH="length",eo.NEGATE="negate",eo.ONE_MINUS="oneMinus",eo.DFDX="dFdx",eo.DFDY="dFdy",eo.ROUND="round",eo.RECIPROCAL="reciprocal",eo.TRUNC="trunc",eo.FWIDTH="fwidth",eo.TRANSPOSE="transpose",eo.DETERMINANT="determinant",eo.INVERSE="inverse",eo.EQUALS="equals",eo.MIN="min",eo.MAX="max",eo.STEP="step",eo.REFLECT="reflect",eo.DISTANCE="distance",eo.DIFFERENCE="difference",eo.DOT="dot",eo.CROSS="cross",eo.POW="pow",eo.TRANSFORM_DIRECTION="transformDirection",eo.MIX="mix",eo.CLAMP="clamp",eo.REFRACT="refract",eo.SMOOTHSTEP="smoothstep",eo.FACEFORWARD="faceforward";const to=hn(1e-6),ro=hn(1e6),so=hn(Math.PI),io=hn(2*Math.PI),no=hn(2*Math.PI),ao=hn(.5*Math.PI),oo=rn(eo,eo.ALL).setParameterLength(1),uo=rn(eo,eo.ANY).setParameterLength(1),lo=rn(eo,eo.RADIANS).setParameterLength(1),co=rn(eo,eo.DEGREES).setParameterLength(1),ho=rn(eo,eo.EXP).setParameterLength(1),po=rn(eo,eo.EXP2).setParameterLength(1),go=rn(eo,eo.LOG).setParameterLength(1),mo=rn(eo,eo.LOG2).setParameterLength(1),fo=rn(eo,eo.SQRT).setParameterLength(1),yo=rn(eo,eo.INVERSE_SQRT).setParameterLength(1),bo=rn(eo,eo.FLOOR).setParameterLength(1),xo=rn(eo,eo.CEIL).setParameterLength(1),To=rn(eo,eo.NORMALIZE).setParameterLength(1),_o=rn(eo,eo.FRACT).setParameterLength(1),vo=rn(eo,eo.SIN).setParameterLength(1),No=rn(eo,eo.COS).setParameterLength(1),So=rn(eo,eo.TAN).setParameterLength(1),Ro=rn(eo,eo.ASIN).setParameterLength(1),Ao=rn(eo,eo.ACOS).setParameterLength(1),Eo=rn(eo,eo.ATAN).setParameterLength(1,2),wo=rn(eo,eo.ABS).setParameterLength(1),Co=rn(eo,eo.SIGN).setParameterLength(1),Mo=rn(eo,eo.LENGTH).setParameterLength(1),Bo=rn(eo,eo.NEGATE).setParameterLength(1),Po=rn(eo,eo.ONE_MINUS).setParameterLength(1),Lo=rn(eo,eo.DFDX).setParameterLength(1),Fo=rn(eo,eo.DFDY).setParameterLength(1),Do=rn(eo,eo.ROUND).setParameterLength(1),Uo=rn(eo,eo.RECIPROCAL).setParameterLength(1),Io=rn(eo,eo.TRUNC).setParameterLength(1),Oo=rn(eo,eo.FWIDTH).setParameterLength(1),Vo=rn(eo,eo.TRANSPOSE).setParameterLength(1),ko=rn(eo,eo.DETERMINANT).setParameterLength(1),Go=rn(eo,eo.INVERSE).setParameterLength(1),zo=rn(eo,eo.MIN).setParameterLength(2,1/0),$o=rn(eo,eo.MAX).setParameterLength(2,1/0),Wo=rn(eo,eo.STEP).setParameterLength(2),Ho=rn(eo,eo.REFLECT).setParameterLength(2),jo=rn(eo,eo.DISTANCE).setParameterLength(2),qo=rn(eo,eo.DIFFERENCE).setParameterLength(2),Xo=rn(eo,eo.DOT).setParameterLength(2),Ko=rn(eo,eo.CROSS).setParameterLength(2),Yo=rn(eo,eo.POW).setParameterLength(2),Qo=e=>Ma(e,e),Zo=e=>Ma(e,e,e),Jo=e=>Ma(e,e,e,e),eu=rn(eo,eo.TRANSFORM_DIRECTION).setParameterLength(2),tu=e=>Ma(Co(e),Yo(wo(e),1/3)),ru=e=>Xo(e,e),su=rn(eo,eo.MIX).setParameterLength(3),iu=(e,t=0,r=1)=>Yi(new eo(eo.CLAMP,Yi(e),Yi(t),Yi(r))),nu=e=>iu(e),au=rn(eo,eo.REFRACT).setParameterLength(3),ou=rn(eo,eo.SMOOTHSTEP).setParameterLength(3),uu=rn(eo,eo.FACEFORWARD).setParameterLength(3),lu=an(([e])=>{const t=Xo(e.xy,fn(12.9898,78.233)),r=Pa(t,so);return _o(vo(r).mul(43758.5453))}),du=(e,t,r)=>su(t,r,e),cu=(e,t,r)=>ou(t,r,e),hu=(e,t)=>Wo(t,e),pu=uu,gu=yo;_i("all",oo),_i("any",uo),_i("radians",lo),_i("degrees",co),_i("exp",ho),_i("exp2",po),_i("log",go),_i("log2",mo),_i("sqrt",fo),_i("inverseSqrt",yo),_i("floor",bo),_i("ceil",xo),_i("normalize",To),_i("fract",_o),_i("sin",vo),_i("cos",No),_i("tan",So),_i("asin",Ro),_i("acos",Ao),_i("atan",Eo),_i("abs",wo),_i("sign",Co),_i("length",Mo),_i("lengthSq",ru),_i("negate",Bo),_i("oneMinus",Po),_i("dFdx",Lo),_i("dFdy",Fo),_i("round",Do),_i("reciprocal",Uo),_i("trunc",Io),_i("fwidth",Oo),_i("min",zo),_i("max",$o),_i("step",hu),_i("reflect",Ho),_i("distance",jo),_i("dot",Xo),_i("cross",Ko),_i("pow",Yo),_i("pow2",Qo),_i("pow3",Zo),_i("pow4",Jo),_i("transformDirection",eu),_i("mix",du),_i("clamp",iu),_i("refract",au),_i("smoothstep",cu),_i("faceForward",uu),_i("difference",qo),_i("saturate",nu),_i("cbrt",tu),_i("transpose",Vo),_i("determinant",ko),_i("inverse",Go),_i("rand",lu);class mu extends ai{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 e.flowBuildStage(this,"setup"),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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?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?Fn(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("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 fu=en(mu).setParameterLength(2,3);_i("select",fu);class yu extends ai{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const bu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new yu(r,t)},xu=e=>bu(e,{uniformFlow:!0}),Tu=(e,t)=>bu(e,{nodeName:t});function _u(e,t,r=null){return bu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function vu(e,t=null){return bu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Nu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Tu(e,t)}_i("context",bu),_i("label",Nu),_i("uniformFlow",xu),_i("setName",Tu),_i("builtinShadowContext",(e,t,r)=>_u(t,r,e)),_i("builtinAOContext",(e,t)=>vu(t,e));class Su extends ai{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,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Ru=en(Su),Au=(e,t=null)=>Ru(e,t).toStack(),Eu=(e,t=null)=>Ru(e,t,!0).toStack(),wu=e=>Ru(e).setIntent(!0).toStack();_i("toVar",Au),_i("toConst",Eu),_i("toVarIntent",wu);class Cu extends ai{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Mu=(e,t,r=null)=>Yi(new Cu(Yi(e),t,r));class Bu extends ai{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,this.global=!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=Mu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Ys.VERTEX);e.flowNodeFromShaderStage(Ys.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=en(Bu).setParameterLength(1,2),Lu=e=>Pu(e);_i("toVarying",Pu),_i("toVertexStage",Lu);const Fu=an(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return su(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Du=an(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return su(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Uu="WorkingColorSpace";class Iu extends li{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===Uu?p.workingColorSpace:"OutputColorSpace"===t?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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=Sn(Fu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=Sn(Cn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=Sn(Du(i.rgb),i.a)),i):i}}const Ou=(e,t)=>Yi(new Iu(Yi(e),Uu,t)),Vu=(e,t)=>Yi(new Iu(Yi(e),t,Uu));_i("workingToColorSpace",Ou),_i("colorSpaceToWorking",Vu);let ku=class extends oi{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 Gu extends ai{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=Qs.OBJECT}setGroup(e){return this.group=e,this}element(e){return new ku(this,Yi(e))}setNodeType(e){const t=xa(null,e);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;enew zu(e,t,r);class Wu extends li{static get type(){return"ToneMappingNode"}constructor(e,t=ju,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Us(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Sn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Hu=(e,t,r)=>Yi(new Wu(e,Yi(t),Yi(r))),ju=$u("toneMappingExposure","float");_i("toneMapping",(e,t,r)=>Hu(t,r,e));const qu=new WeakMap;function Xu(e,t){let r=qu.get(e);return void 0===r&&(r=new b(e,t),qu.set(e,r)),r}class Ku extends mi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Xu(s.array,i):Xu(s,i);const o=new y(a,r,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=Pu(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}}function Yu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Cn(new Ku(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Mn(new Ku(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ku(e,t,r,s)}const Qu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s),Zu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,f,!0),Ju=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x,!0);_i("toAttribute",e=>Qu(e.value));class el extends ai{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Qs.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const tl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;etl(e,r).setCount(t);_i("compute",rl),_i("computeKernel",tl);class sl extends ai{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const il=e=>new sl(Yi(e));function nl(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),il(e).setParent(t)}_i("cache",nl),_i("isolate",il);class al extends ai{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 ol=en(al).setParameterLength(2);_i("bypass",ol);class ul extends ai{static get type(){return"RemapNode"}constructor(e,t,r,s=hn(0),i=hn(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 ll=en(ul,null,null,{doClamp:!1}).setParameterLength(3,5),dl=en(ul).setParameterLength(3,5);_i("remap",ll),_i("remapClamp",dl);class cl extends ai{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 hl=en(cl).setParameterLength(1,2),pl=e=>(e?fu(e,hl("discard")):hl("discard")).toStack();_i("discard",pl);class gl extends li{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const ml=(e,t=null,r=null)=>Yi(new gl(Yi(e),t,r));_i("renderOutput",ml);class fl extends li{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):_(n),r}}const yl=(e,t=null)=>Yi(new fl(Yi(e),t)).toStack();_i("debug",yl);class bl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class xl extends ai{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Qs.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==bl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function Tl(e,t="",r=null){return(e=Yi(e)).before(new xl(e,t,r))}_i("toInspector",Tl);class _l extends ai{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 Pu(this).build(e,r)}return d(`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 vl=(e,t=null)=>new _l(e,t),Nl=(e=0)=>vl("uv"+(e>0?e:""),"vec2");class Sl extends ai{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 Rl=en(Sl).setParameterLength(1,2);class Al extends ba{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Qs.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 El=en(Al).setParameterLength(1),wl=new N;class Cl extends ba{static get type(){return"TextureNode"}constructor(e=wl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Qs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Nl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=xa(this.value.matrix)),this._matrixUniform.mul(Tn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=xa(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1)),t)),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().");const s=an(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Qs.OBJECT:Qs.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=Wo(hl(x,"float"),hl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Vu(hl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Yi(e).mul(El(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Yi(t)}level(e){const t=this.clone();return t.levelNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}size(e){return Rl(this,e)}bias(e){const t=this.clone();return t.biasNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Yi(e),Yi(t)],r.referenceNode=this.getBase(),Yi(r)}depth(e){const t=this.clone();return t.depthNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}offset(e){const t=this.clone();return t.offsetNode=Yi(e),t.referenceNode=this.getBase(),Yi(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Ml=en(Cl).setParameterLength(1,4).setName("texture"),Bl=(e=wl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Yi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=Ml(e,t,r,s),i},Pl=(...e)=>Bl(...e).setSampler(!1);class Ll extends ba{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Fl=(e,t,r)=>new Ll(e,t,r);class Dl extends oi{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 Ul extends Ll{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ws(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Qs.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;rnew Ul(e,t);const Ol=en(class extends ai{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Vl,kl;class Gl extends ai{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===Gl.DPR?"float":this.scope===Gl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Qs.NONE;return this.scope!==Gl.SIZE&&this.scope!==Gl.VIEWPORT&&this.scope!==Gl.DPR||(e=Qs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Gl.VIEWPORT?null!==t?kl.copy(t.viewport):(e.getViewport(kl),kl.multiplyScalar(e.getPixelRatio())):this.scope===Gl.DPR?this._output.value=e.getPixelRatio():null!==t?(Vl.width=t.width,Vl.height=t.height):e.getDrawingBufferSize(Vl)}setup(){const e=this.scope;let r=null;return r=e===Gl.SIZE?xa(Vl||(Vl=new t)):e===Gl.VIEWPORT?xa(kl||(kl=new s)):e===Gl.DPR?xa(1):fn(Hl.div(Wl)),this._output=r,r}generate(e){if(this.scope===Gl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Wl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Gl.COORDINATE="coordinate",Gl.VIEWPORT="viewport",Gl.SIZE="size",Gl.UV="uv",Gl.DPR="dpr";const zl=tn(Gl,Gl.DPR),$l=tn(Gl,Gl.UV),Wl=tn(Gl,Gl.SIZE),Hl=tn(Gl,Gl.COORDINATE),jl=tn(Gl,Gl.VIEWPORT),ql=jl.zw,Xl=Hl.sub(jl.xy),Kl=Xl.div(ql),Yl=an(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Wl),"vec2").once()(),Ql=xa(0,"uint").setName("u_cameraIndex").setGroup(ga("cameraIndex")).toVarying("v_cameraIndex"),Zl=xa("float").setName("cameraNear").setGroup(fa).onRenderUpdate(({camera:e})=>e.near),Jl=xa("float").setName("cameraFar").setGroup(fa).onRenderUpdate(({camera:e})=>e.far),ed=an(({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(fa).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrix")}else t=xa("mat4").setName("cameraProjectionMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),td=an(({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(fa).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrixInverse")}else t=xa("mat4").setName("cameraProjectionMatrixInverse").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),rd=an(({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(fa).setName("cameraViewMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraViewMatrix")}else t=xa("mat4").setName("cameraViewMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),sd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Il(r).setGroup(fa).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraWorldMatrix")}else t=xa("mat4").setName("cameraWorldMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),id=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Il(r).setGroup(fa).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraNormalMatrix")}else t=xa("mat3").setName("cameraNormalMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),nd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ad=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Il(r,"vec4").setGroup(fa).setName("cameraViewports").element(Ql).toConst("cameraViewport")}else t=Sn(0,0,Wl.x,Wl.y).toConst("cameraViewport");return t}).once()(),od=new C;class ud extends ai{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Qs.OBJECT,this.uniformNode=new ba(null)}getNodeType(){const e=this.scope;return e===ud.WORLD_MATRIX?"mat4":e===ud.POSITION||e===ud.VIEW_POSITION||e===ud.DIRECTION||e===ud.SCALE?"vec3":e===ud.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===ud.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ud.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ud.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ud.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ud.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===ud.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),od.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=od.radius}}generate(e){const t=this.scope;return t===ud.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===ud.POSITION||t===ud.VIEW_POSITION||t===ud.DIRECTION||t===ud.SCALE?this.uniformNode.nodeType="vec3":t===ud.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}}ud.WORLD_MATRIX="worldMatrix",ud.POSITION="position",ud.SCALE="scale",ud.VIEW_POSITION="viewPosition",ud.DIRECTION="direction",ud.RADIUS="radius";const ld=en(ud,ud.DIRECTION).setParameterLength(1),dd=en(ud,ud.WORLD_MATRIX).setParameterLength(1),cd=en(ud,ud.POSITION).setParameterLength(1),hd=en(ud,ud.SCALE).setParameterLength(1),pd=en(ud,ud.VIEW_POSITION).setParameterLength(1),gd=en(ud,ud.RADIUS).setParameterLength(1);class md extends ud{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const fd=tn(md,md.DIRECTION),yd=tn(md,md.WORLD_MATRIX),bd=tn(md,md.POSITION),xd=tn(md,md.SCALE),Td=tn(md,md.VIEW_POSITION),_d=tn(md,md.RADIUS),vd=xa(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Nd=xa(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Sd=an(e=>e.context.modelViewMatrix||Rd).once()().toVar("modelViewMatrix"),Rd=rd.mul(yd),Ad=an(e=>(e.context.isHighPrecisionModelViewMatrix=!0,xa("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Ed=an(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return xa("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),wd=vl("position","vec3"),Cd=wd.toVarying("positionLocal"),Md=wd.toVarying("positionPrevious"),Bd=an(e=>yd.mul(Cd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Pd=an(()=>Cd.transformDirection(yd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ld=an(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Fd=an(e=>{let t;return t=e.camera.isOrthographicCamera?Tn(0,0,1):Ld.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Dd extends ai{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Ud=tn(Dd),Id=hn(Ud).mul(2).sub(1),Od=an(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Id)),e}),Vd=vl("normal","vec3"),kd=an(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Tn(0,1,0)):Vd,"vec3").once()().toVar("normalLocal"),Gd=Ld.dFdx().cross(Ld.dFdy()).normalize().toVar("normalFlat"),zd=an(e=>{let t;return t=!0===e.material.flatShading?Gd:Xd(kd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),$d=an(e=>{let t=zd.transformDirection(rd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),Wd=an(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=zd,!0!==t.flatShading&&(s=Od(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Hd=Wd.transformDirection(rd).toVar("normalWorld"),jd=an(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?Wd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),qd=an(([e,t=yd])=>{const r=Cn(t),s=e.div(Tn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Xd=an(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=vd.mul(e);return rd.transformDirection(s)}),Kd=an(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),Wd)).once(["NORMAL","VERTEX"])(),Yd=an(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Hd)).once(["NORMAL","VERTEX"])(),Qd=an(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Zd=new P,Jd=new a,ec=xa(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),tc=xa(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),rc=xa(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?(Zd.copy(r),Jd.makeRotationFromEuler(Zd)):Jd.identity(),Jd}),sc=Fd.negate().reflect(Wd),ic=Fd.negate().refract(Wd,ec),nc=sc.transformDirection(rd).toVar("reflectVector"),ac=ic.transformDirection(rd).toVar("reflectVector"),oc=new L;class uc extends Cl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===F?nc:e.mapping===D?ac:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Tn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Tn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Tn(t.x.negate(),t.yz)),rc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const lc=en(uc).setParameterLength(1,4).setName("cubeTexture"),dc=(e=oc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Yi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=lc(e,t,r,s),i};class cc extends oi{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 hc extends ai{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=Qs.OBJECT}element(e){return new cc(this,Yi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Fl(null,e,this.count):Array.isArray(this.getValueFromReference())?Il(null,e):"texture"===e?Bl(null):"cubeTexture"===e?dc(null):xa(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),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;enew hc(e,t,r),gc=(e,t,r,s)=>new hc(e,t,s,r);class mc extends hc{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 fc=(e,t,r=null)=>new mc(e,t,r),yc=Nl(),bc=Ld.dFdx(),xc=Ld.dFdy(),Tc=yc.dFdx(),_c=yc.dFdy(),vc=Wd,Nc=xc.cross(vc),Sc=vc.cross(bc),Rc=Nc.mul(Tc.x).add(Sc.mul(_c.x)),Ac=Nc.mul(Tc.y).add(Sc.mul(_c.y)),Ec=Rc.dot(Rc).max(Ac.dot(Ac)),wc=Ec.equal(0).select(0,Ec.inverseSqrt()),Cc=Rc.mul(wc).toVar("tangentViewFrame"),Mc=Ac.mul(wc).toVar("bitangentViewFrame"),Bc=vl("tangent","vec4"),Pc=Bc.xyz.toVar("tangentLocal"),Lc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Sd.mul(Sn(Pc,0)).xyz.toVarying("v_tangentView").normalize():Cc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Fc=Lc.transformDirection(rd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Dc=an(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Bc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Uc=Dc(Vd.cross(Bc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Ic=Dc(kd.cross(Pc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Oc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Dc(Wd.cross(Lc),"v_bitangentView").normalize():Mc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),Vc=Dc(Hd.cross(Fc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kc=Cn(Lc,Oc,Wd).toVar("TBNViewMatrix"),Gc=Fd.mul(kc),zc=an(()=>{let e=Qn.cross(Fd);return e=e.cross(Qn).normalize(),e=su(e,Wd,Kn.mul(Vn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),$c=e=>Yi(e).mul(.5).add(.5),Wc=e=>Tn(e,fo(nu(hn(1).sub(Xo(e,e)))));class Hc extends li{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=Wc(i.xy):s===V?i=Wc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Od(t)),i=Tn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Xd(i):t===U?n=kc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=Wd),n}}const jc=en(Hc).setParameterLength(1,2),qc=an(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Nl()),forceUVContext:!0}),s=hn(r(e=>e));return fn(hn(r(e=>e.add(e.dFdx()))).sub(s),hn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Xc=an(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(Id),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Kc extends li{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=qc({textureNode:this.textureNode,bumpScale:e});return Xc({surf_pos:Ld,surf_norm:Wd,dHdxy:t})}}const Yc=en(Kc).setParameterLength(1,2),Qc=new Map;class Zc extends ai{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Qc.get(e);return void 0===r&&(r=fc(e,t),Qc.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===Zc.COLOR){const e=void 0!==t.color?this.getColor(r):Tn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Zc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Zc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:hn(1);else if(r===Zc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Zc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Zc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Zc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Zc.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===Zc.NORMAL)t.normalMap?(s=jc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Yc(this.getTexture("bump").r,this.getFloat("bumpScale")):Wd;else if(r===Zc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?jc(this.getTexture(r),this.getCache(r+"Scale","vec2")):Wd;else if(r===Zc.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===Zc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===Zc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=wn(Uh.x,Uh.y,Uh.y.negate(),Uh.x).mul(e.rg.mul(2).sub(fn(1)).normalize().mul(e.b))}else s=Uh;else if(r===Zc.IRIDESCENCE_THICKNESS){const e=pc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=pc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Zc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Zc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Zc.IOR)s=this.getFloat(r);else if(r===Zc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Zc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===Zc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):hn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Zc.ALPHA_TEST="alphaTest",Zc.COLOR="color",Zc.OPACITY="opacity",Zc.SHININESS="shininess",Zc.SPECULAR="specular",Zc.SPECULAR_STRENGTH="specularStrength",Zc.SPECULAR_INTENSITY="specularIntensity",Zc.SPECULAR_COLOR="specularColor",Zc.REFLECTIVITY="reflectivity",Zc.ROUGHNESS="roughness",Zc.METALNESS="metalness",Zc.NORMAL="normal",Zc.CLEARCOAT="clearcoat",Zc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Zc.CLEARCOAT_NORMAL="clearcoatNormal",Zc.EMISSIVE="emissive",Zc.ROTATION="rotation",Zc.SHEEN="sheen",Zc.SHEEN_ROUGHNESS="sheenRoughness",Zc.ANISOTROPY="anisotropy",Zc.IRIDESCENCE="iridescence",Zc.IRIDESCENCE_IOR="iridescenceIOR",Zc.IRIDESCENCE_THICKNESS="iridescenceThickness",Zc.IOR="ior",Zc.TRANSMISSION="transmission",Zc.THICKNESS="thickness",Zc.ATTENUATION_DISTANCE="attenuationDistance",Zc.ATTENUATION_COLOR="attenuationColor",Zc.LINE_SCALE="scale",Zc.LINE_DASH_SIZE="dashSize",Zc.LINE_GAP_SIZE="gapSize",Zc.LINE_WIDTH="linewidth",Zc.LINE_DASH_OFFSET="dashOffset",Zc.POINT_SIZE="size",Zc.DISPERSION="dispersion",Zc.LIGHT_MAP="light",Zc.AO="ao";const Jc=tn(Zc,Zc.ALPHA_TEST),eh=tn(Zc,Zc.COLOR),th=tn(Zc,Zc.SHININESS),rh=tn(Zc,Zc.EMISSIVE),sh=tn(Zc,Zc.OPACITY),ih=tn(Zc,Zc.SPECULAR),nh=tn(Zc,Zc.SPECULAR_INTENSITY),ah=tn(Zc,Zc.SPECULAR_COLOR),oh=tn(Zc,Zc.SPECULAR_STRENGTH),uh=tn(Zc,Zc.REFLECTIVITY),lh=tn(Zc,Zc.ROUGHNESS),dh=tn(Zc,Zc.METALNESS),ch=tn(Zc,Zc.NORMAL),hh=tn(Zc,Zc.CLEARCOAT),ph=tn(Zc,Zc.CLEARCOAT_ROUGHNESS),gh=tn(Zc,Zc.CLEARCOAT_NORMAL),mh=tn(Zc,Zc.ROTATION),fh=tn(Zc,Zc.SHEEN),yh=tn(Zc,Zc.SHEEN_ROUGHNESS),bh=tn(Zc,Zc.ANISOTROPY),xh=tn(Zc,Zc.IRIDESCENCE),Th=tn(Zc,Zc.IRIDESCENCE_IOR),_h=tn(Zc,Zc.IRIDESCENCE_THICKNESS),vh=tn(Zc,Zc.TRANSMISSION),Nh=tn(Zc,Zc.THICKNESS),Sh=tn(Zc,Zc.IOR),Rh=tn(Zc,Zc.ATTENUATION_DISTANCE),Ah=tn(Zc,Zc.ATTENUATION_COLOR),Eh=tn(Zc,Zc.LINE_SCALE),wh=tn(Zc,Zc.LINE_DASH_SIZE),Ch=tn(Zc,Zc.LINE_GAP_SIZE),Mh=tn(Zc,Zc.LINE_WIDTH),Bh=tn(Zc,Zc.LINE_DASH_OFFSET),Ph=tn(Zc,Zc.POINT_SIZE),Lh=tn(Zc,Zc.DISPERSION),Fh=tn(Zc,Zc.LIGHT_MAP),Dh=tn(Zc,Zc.AO),Uh=xa(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))}),Ih=an(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Oh extends oi{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 Vh=en(Oh).setParameterLength(2);class kh extends Ll{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=Vs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Js.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 Vh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Js.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Qu(this.value),this._varying=Pu(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)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}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 Gh=(e,t=null,r=0)=>new kh(e,t,r);class zh extends ai{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===zh.VERTEX)s=e.getVertexIndex();else if(r===zh.INSTANCE)s=e.getInstanceIndex();else if(r===zh.DRAW)s=e.getDrawIndex();else if(r===zh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===zh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==zh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}zh.VERTEX="vertex",zh.INSTANCE="instance",zh.SUBGROUP="subgroup",zh.INVOCATION_LOCAL="invocationLocal",zh.INVOCATION_SUBGROUP="invocationSubgroup",zh.DRAW="draw";const $h=tn(zh,zh.VERTEX),Wh=tn(zh,zh.INSTANCE),Hh=tn(zh,zh.SUBGROUP),jh=tn(zh,zh.INVOCATION_SUBGROUP),qh=tn(zh,zh.INVOCATION_LOCAL),Xh=tn(zh,zh.DRAW);class Kh extends ai{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=Qs.FRAME,this.buffer=null,this.bufferColor=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){const{instanceMatrix:t,instanceColor:r,isStorageMatrix:s,isStorageColor:i}=this,{count:n}=t;let{instanceMatrixNode:a,instanceColorNode:o}=this;if(null===a){if(s)a=Gh(t,"mat4",Math.max(n,1)).element(Wh);else if(n<=1e3)a=Fl(t.array,"mat4",Math.max(n,1)).element(Wh);else{const e=new W(t.array,16,1);this.buffer=e;const r=t.usage===x?Ju:Zu,s=[r(e,"vec4",16,0),r(e,"vec4",16,4),r(e,"vec4",16,8),r(e,"vec4",16,12)];a=Mn(...s)}this.instanceMatrixNode=a}if(r&&null===o){if(i)o=Gh(r,"vec3",Math.max(r.count,1)).element(Wh);else{const e=new H(r.array,3),t=r.usage===x?Ju:Zu;this.bufferColor=e,o=Tn(t(e,"vec3",3,0))}this.instanceColorNode=o}const u=a.mul(Cd).xyz;if(Cd.assign(u),e.hasGeometryAttribute("normal")){const e=qd(kd,a);kd.assign(e)}null!==this.instanceColorNode&&Dn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.usage!==x&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.usage!==x&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version))}}const Yh=en(Kh).setParameterLength(2,3);class Qh extends Kh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Zh=en(Qh).setParameterLength(1);class Jh extends ai{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=Wh:this.batchingIdNode=Xh);const t=an(([e])=>{const t=pn(Rl(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=pn(e).mod(t).toConst(),s=pn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,yn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(pn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=pn(Rl(Pl(s),0).x).toConst(),n=hn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Mn(Pl(s,yn(a,o)),Pl(s,yn(a.add(1),o)),Pl(s,yn(a.add(2),o)),Pl(s,yn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=an(([e])=>{const t=pn(Rl(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,yn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Dn("vec3","vBatchColor").assign(t)}const d=Cn(u);Cd.assign(u.mul(Cd));const c=kd.div(Tn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;kd.assign(h),e.hasGeometryAttribute("tangent")&&Pc.mulAssign(d)}}const ep=en(Jh).setParameterLength(1),tp=new WeakMap;class rp extends ai{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Qs.OBJECT,this.skinIndexNode=vl("skinIndex","uvec4"),this.skinWeightNode=vl("skinWeight","vec4"),this.bindMatrixNode=pc("bindMatrix","mat4"),this.bindMatrixInverseNode=pc("bindMatrixInverse","mat4"),this.boneMatricesNode=gc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Cd,this.toPositionNode=Cd,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=wa(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=kd){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=wa(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=gc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Md)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===js(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Md.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();kd.assign(t),e.hasGeometryAttribute("tangent")&&Pc.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;tp.get(t)!==e.frameId&&(tp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const sp=e=>new rp(e);class ip extends ai{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew ip(Ji(e,"int")).toStack(),ap=()=>hl("break").toStack(),op=new WeakMap,up=new s,lp=an(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=pn($h).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,yn(u,o)).depth(i).xyz.mul(t)});class dp extends ai{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=xa(1),this.updateType=Qs.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=op.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 j(m,h,p,a);f.type=q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=hn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,yn(pn(e).add(1),pn(Wh))).r):t.assign(pc("morphTargetInfluences","float").element(e).toVar()),ln(t.notEqual(0),()=>{!0===s&&Cd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(0)})),!0===i&&kd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(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 cp=en(dp).setParameterLength(1);class hp extends ai{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class pp extends hp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class gp extends yu{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:Tn().toVar("directDiffuse"),directSpecular:Tn().toVar("directSpecular"),indirectDiffuse:Tn().toVar("indirectDiffuse"),indirectSpecular:Tn().toVar("indirectSpecular")};return{radiance:Tn().toVar("radiance"),irradiance:Tn().toVar("irradiance"),iblIrradiance:Tn().toVar("iblIrradiance"),ambientOcclusion:hn(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 mp=en(gp);class fp extends hp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const yp=new t;class bp extends Cl{static get type(){return"ViewportTextureNode"}constructor(e=$l,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Qs.FRAME,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(yp):yp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===yp.width&&s.image.height===yp.height||(s.image.width=yp.width,s.image.height=yp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const xp=en(bp).setParameterLength(0,3),Tp=en(bp,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let _p=null;class vp extends bp{static get type(){return"ViewportDepthTextureNode"}constructor(e=$l,t=null){null===_p&&(_p=new Y),super(e,t,_p)}getTextureForReference(){return _p}}const Np=en(vp).setParameterLength(0,2);class Sp extends ai{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===Sp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Sp.DEPTH_BASE)null!==r&&(s=Cp().assign(r));else if(t===Sp.DEPTH)s=e.isPerspectiveCamera?Ap(Ld.z,Zl,Jl):Rp(Ld.z,Zl,Jl);else if(t===Sp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ep(r,Zl,Jl);s=Rp(e,Zl,Jl)}else s=r;else s=Rp(Ld.z,Zl,Jl);return s}}Sp.DEPTH_BASE="depthBase",Sp.DEPTH="depth",Sp.LINEAR_DEPTH="linearDepth";const Rp=(e,t,r)=>e.add(t).div(t.sub(r)),Ap=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ep=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),wp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=mo(e.negate().div(t)),i=mo(r.div(t));return s.div(i)},Cp=en(Sp,Sp.DEPTH_BASE),Mp=tn(Sp,Sp.DEPTH),Bp=en(Sp,Sp.LINEAR_DEPTH).setParameterLength(0,1),Pp=Bp(Np());Mp.assign=e=>Cp(e);class Lp extends ai{static get type(){return"ClippingNode"}constructor(e=Lp.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===Lp.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Lp.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return an(()=>{const r=hn().toVar("distanceToPlane"),s=hn().toVar("distanceToGradient"),i=hn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Il(t).setGroup(fa);np(n,({i:t})=>{const n=e.element(t);r.assign(Ld.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ou(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Il(e).setGroup(fa),n=hn(1).toVar("intersectionClipOpacity");np(a,({i:e})=>{const i=t.element(e);r.assign(Ld.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ou(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}Un.a.mulAssign(i),Un.a.equal(0).discard()})()}setupDefault(e,t){return an(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Il(t).setGroup(fa);np(r,({i:t})=>{const r=e.element(t);Ld.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Il(e).setGroup(fa),r=mn(!0).toVar("clipped");np(s,({i:e})=>{const s=t.element(e);r.assign(Ld.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),an(()=>{const s=Il(e).setGroup(fa),i=Ol(t.getClipDistance());np(r,({i:e})=>{const t=s.element(e),r=Ld.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Lp.ALPHA_TO_COVERAGE="alphaToCoverage",Lp.DEFAULT="default",Lp.HARDWARE="hardware";const Fp=an(([e])=>_o(Ma(1e4,vo(Ma(17,e.x).add(Ma(.1,e.y)))).mul(wa(.1,wo(vo(Ma(13,e.y).add(e.x))))))),Dp=an(([e])=>Fp(fn(Fp(e.xy),e.z))),Up=an(([e])=>{const t=$o(Mo(Lo(e.xyz)),Mo(Fo(e.xyz))),r=hn(1).div(hn(.05).mul(t)).toVar("pixScale"),s=fn(po(bo(mo(r))),po(xo(mo(r)))),i=fn(Dp(bo(s.x.mul(e.xyz))),Dp(bo(s.y.mul(e.xyz)))),n=_o(mo(r)),a=wa(Ma(n.oneMinus(),i.x),Ma(n,i.y)),o=zo(n,n.oneMinus()),u=Tn(a.mul(a).div(Ma(2,o).mul(Ca(1,o))),a.sub(Ma(.5,o)).div(Ca(1,o)),Ca(1,Ca(1,a).mul(Ca(1,a)).div(Ma(2,o).mul(Ca(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return iu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Ip extends _l{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 Op=(e=0)=>new Ip(e),Vp=an(([e,t])=>zo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),kp=an(([e,t])=>zo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gp=an(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zp=an(([e,t])=>su(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Wo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$p=an(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Sn(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"}]}),Wp=an(([e])=>Sn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Hp=an(([e])=>(ln(e.a.equal(0),()=>Sn(0)),Sn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class jp extends Q{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.maskNode=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,this.contextNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{d('NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Fs(t.slice(0,-4)),r.getCacheKey());return this.type+Ds(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Mu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=Mu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=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!==a&&e.stack.addToStack(a);const i=Sn(s,Un.a).max(0);n=this.setupOutput(e,i),ra.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ra.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Sn(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,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.currentSamples;this.alphaToCoverage&&t>1?s=new Lp(Lp.ALPHA_TO_COVERAGE):e.stack.addToStack(new Lp)}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.addToStack(new Lp(Lp.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?wp(Ld.z,Zl,Jl):Rp(Ld.z,Zl,Jl))}null!==s&&Mp.assign(s).toStack()}setupPositionView(){return Sd.mul(Cd).xyz}setupModelViewProjection(){return ed.mul(Ld)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Ih}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&cp(t).toStack(),!0===t.isSkinnedMesh&&sp(t).toStack(),this.displacementMap){const e=fc("displacementMap","texture"),t=fc("displacementScale","float"),r=fc("displacementBias","float");Cd.addAssign(kd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ep(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Zh(t).toStack(),null!==this.positionNode&&Cd.assign(Mu(this.positionNode,"POSITION","vec3")),Cd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&mn(this.maskNode).not().discard();let s=this.colorNode?Sn(this.colorNode):eh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(Op())),t.instanceColor){s=Dn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Dn("vec3","vBatchColor").mul(s)}Un.assign(s);const i=this.opacityNode?hn(this.opacityNode):sh;Un.a.assign(Un.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?hn(this.alphaTestNode):Jc,!0===this.alphaToCoverage?(Un.a=ou(n,n.add(Oo(Un.a)),Un.a),Un.a.lessThanEqual(0).discard()):Un.a.lessThanEqual(n).discard()),!0===this.alphaHash&&Un.a.lessThan(Up(Cd)).discard(),e.isOpaque()&&Un.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Tn(0):Un.rgb}setupNormal(){return this.normalNode?Tn(this.normalNode):ch}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?fc("envMap","cubeTexture"):fc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new fp(Fh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Dh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new pp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=mp(n,t,r,s)}else null!==r&&(a=Tn(null!==s?su(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(On.assign(Tn(i||rh)),a=a.add(On)),a}setupFog(e,t){const r=e.fogNode;return r&&(ra.assign(t),t=Sn(r.toVar())),t}setupPremultipliedAlpha(e,t){return Wp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(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=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskNode=e.maskNode,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,this.contextNode=e.contextNode,super.copy(e)}}const qp=new Z;class Xp extends jp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(qp),this.setValues(e)}}const Kp=new J;class Yp extends jp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Kp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?hn(this.offsetNode):Bh,t=this.dashScaleNode?hn(this.dashScaleNode):Eh,r=this.dashSizeNode?hn(this.dashSizeNode):wh,s=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(r),ia.assign(s);const i=Pu(vl("lineDistance").mul(t));(e?i.add(e):i).mod(sa.add(ia)).greaterThan(sa).discard()}}let Qp=null;class Zp extends bp{static get type(){return"ViewportSharedTextureNode"}constructor(e=$l,t=null){null===Qp&&(Qp=new X),super(e,t,Qp)}getTextureForReference(){return Qp}updateReference(){return this}}const Jp=en(Zp).setParameterLength(0,2),eg=new J;class tg extends jp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(eg),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,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=an(({start:e,end:t})=>{const r=ed.element(2).element(2),s=ed.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Sn(su(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=an(()=>{const e=vl("instanceStart"),t=vl("instanceEnd"),r=Sn(Sd.mul(Sn(e,1))).toVar("start"),s=Sn(Sd.mul(Sn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?hn(this.dashScaleNode):Eh,t=this.offsetNode?hn(this.offsetNode):Bh,r=vl("instanceDistanceStart"),s=vl("instanceDistanceEnd");let i=wd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Dn("float","lineDistance").assign(i)}n&&(Dn("vec3","worldStart").assign(r.xyz),Dn("vec3","worldEnd").assign(s.xyz));const o=jl.z.div(jl.w),u=ed.element(2).element(3).equal(-1);ln(u,()=>{ln(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=ed.mul(r),d=ed.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=Sn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=su(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Dn("vec4","worldPos");o.assign(wd.y.lessThan(.5).select(r,s));const u=Mh.mul(.5);o.addAssign(Sn(wd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(Sn(wd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(Sn(a.mul(u),0)),ln(wd.y.greaterThan(1).or(wd.y.lessThan(0)),()=>{o.subAssign(Sn(a.mul(2).mul(u),0))})),g.assign(ed.mul(o));const l=Tn().toVar();l.assign(wd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=fn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(wd.x.lessThan(0).select(e.negate(),e)),ln(wd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(wd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Mh)),e.assign(e.div(jl.w.div(zl))),g.assign(wd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Sn(e,0,0)))}return g})();const o=an(({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 fn(h,p)});if(this.colorNode=an(()=>{const e=Nl();if(i){const t=this.dashSizeNode?hn(this.dashSizeNode):wh,r=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(t),ia.assign(r);const s=Dn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(sa.add(ia)).greaterThan(sa).discard()}const a=hn(1).toVar("alpha");if(n){const e=Dn("vec3","worldStart"),s=Dn("vec3","worldEnd"),n=Dn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Tn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Mh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(ou(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=hn(s.fwidth()).toVar("dlen");ln(e.y.abs().greaterThan(1),()=>{a.assign(ou(i.oneMinus(),i.add(1),s).oneMinus())})}else ln(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=vl("instanceColorStart"),t=vl("instanceColorEnd");u=wd.y.lessThan(.5).select(e,t).mul(eh)}else u=eh;return Sn(u,a)})(),this.transparent){const e=this.opacityNode?hn(this.opacityNode):sh;this.outputNode=Sn(this.colorNode.rgb.mul(e).add(Jp().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 rg=new te;class sg extends jp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(rg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?hn(this.opacityNode):sh;Un.assign(Vu(Sn($c(Wd),e),re))}}const ig=an(([e=Pd])=>{const 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 fn(t,r)});class ng extends se{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 ie(5,5,5),n=ig(Pd),a=new jp;a.colorNode=Bl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(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 ag=new WeakMap;class og extends li{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=dc(null);const t=new L;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Qs.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===le||r===de){if(ag.has(e)){const t=ag.get(e);lg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ng(r.height);s.fromEquirectangularTexture(t,e),lg(s.texture,e.mapping),this._cubeTexture=s.texture,ag.set(e,s.texture),e.addEventListener("dispose",ug)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function ug(e){const t=e.target;t.removeEventListener("dispose",ug);const r=ag.get(t);void 0!==r&&(ag.delete(t),r.dispose())}function lg(e,t){t===le?e.mapping=F:t===de&&(e.mapping=D)}const dg=en(og).setParameterLength(1);class cg extends hp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=dg(this.envNode)}}class hg extends hp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=hn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class pg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class gg extends pg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(Sn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(Sn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Un.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(su(s.rgb,s.rgb.mul(i.rgb),oh.mul(uh)));break;case he:s.rgb.assign(su(s.rgb,i.rgb,oh.mul(uh)));break;case ce:s.rgb.addAssign(i.rgb.mul(oh.mul(uh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const mg=new ge;class fg extends jp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(mg),this.setValues(e)}setupNormal(){return Od(zd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new hg(Fh)),t}setupOutgoingLight(){return Un.rgb}setupLightingModel(){return new gg}}const yg=an(({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))}),bg=an(e=>e.diffuseColor.mul(1/Math.PI)),xg=an(({dotNH:e})=>ta.mul(hn(.5)).add(1).mul(hn(1/Math.PI)).mul(e.pow(ta))),Tg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(t).clamp(),s=Fd.dot(t).clamp(),i=yg({f0:Zn,f90:1,dotVH:s}),n=hn(.25),a=xg({dotNH:r});return i.mul(n).mul(a)});class _g extends gg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(bg({diffuseColor:Un.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Tg({lightDirection:e})).mul(oh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const vg=new me;class Ng extends jp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(vg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g(!1)}}const Sg=new fe;class Rg extends jp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g}setupVariants(){const e=(this.shininessNode?hn(this.shininessNode):th).max(1e-4);ta.assign(e);const t=this.specularNode||ih;Zn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ag=an(e=>{if(!1===e.geometry.hasAttribute("normal"))return hn(0);const t=zd.dFdx().abs().max(zd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Eg=an(e=>{const{roughness:t}=e,r=Ag();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),wg=an(({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 Ba(.5,i.add(n).max(to))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Cg=an(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Tn(e.mul(r),t.mul(s),a).length()),l=a.mul(Tn(e.mul(i),t.mul(n),o).length());return Ba(.5,u.add(l))}).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"}]}),Mg=an(({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"}]}),Bg=hn(1/Math.PI),Pg=an(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Tn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Bg.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"}]}),Lg=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=Wd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Fd).normalize(),d=n.dot(e).clamp(),c=n.dot(Fd).clamp(),h=n.dot(l).clamp(),p=Fd.dot(l).clamp();let g,m,f=yg({f0:t,f90:r,dotVH:p});if(qi(a)&&(f=Hn.mix(f,i)),qi(o)){const t=Yn.dot(e),r=Yn.dot(Fd),s=Yn.dot(l),i=Qn.dot(e),n=Qn.dot(Fd),a=Qn.dot(l);g=Cg({alphaT:Xn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Xn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=wg({alpha:u,dotNL:d,dotNV:c}),m=Mg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Fg=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Dg=null;const Ug=an(({roughness:e,dotNV:t})=>{null===Dg&&(Dg=new ye(Fg,16,16,G,be),Dg.name="DFG_LUT",Dg.minFilter=oe,Dg.magFilter=oe,Dg.wrapS=xe,Dg.wrapT=xe,Dg.generateMipmaps=!1,Dg.needsUpdate=!0);const r=fn(e,t);return Bl(Dg,r).rg}),Ig=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Lg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=Wd.dot(e).clamp(),l=Wd.dot(Fd).clamp(),d=Ug({roughness:s,dotNV:l}),c=Ug({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=hn(1).sub(g),y=hn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(hn(1).sub(f.mul(y).mul(b).mul(b)).add(to)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Og=an(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Ug({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Vg=an(({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(Tn(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"}]}),kg=an(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=hn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return hn(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"}]}),Gg=an(({dotNV:e,dotNL:t})=>hn(1).div(hn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),zg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(e).clamp(),s=Wd.dot(Fd).clamp(),i=Wd.dot(t).clamp(),n=kg({roughness:Wn,dotNH:i}),a=Gg({dotNV:s,dotNL:r});return $n.mul(n).mul(a)}),$g=an(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=fn(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"}]}),Wg=an(({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"}]}),Hg=an(({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"}]}),jg=an(({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=Tn().toVar();return ln(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(Cn(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=Tn(0).toVar();f.addAssign(Hg({v1:h,v2:p})),f.addAssign(Hg({v1:p,v2:g})),f.addAssign(Hg({v1:g,v2:m})),f.addAssign(Hg({v1:m,v2:h})),c.assign(Tn(Wg({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"}]}),qg=an(({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=Tn().toVar();return ln(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=Tn(0).toVar();d.addAssign(Hg({v1:n,v2:a})),d.addAssign(Hg({v1:a,v2:o})),d.addAssign(Hg({v1:o,v2:l})),d.addAssign(Hg({v1:l,v2:n})),u.assign(Tn(Wg({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"}]}),Xg=1/6,Kg=e=>Ma(Xg,Ma(e,Ma(e,e.negate().add(3)).sub(3)).add(1)),Yg=e=>Ma(Xg,Ma(e,Ma(e,Ma(3,e).sub(6))).add(4)),Qg=e=>Ma(Xg,Ma(e,Ma(e,Ma(-3,e).add(3)).add(3)).add(1)),Zg=e=>Ma(Xg,Yo(e,3)),Jg=e=>Kg(e).add(Yg(e)),em=e=>Qg(e).add(Zg(e)),tm=e=>wa(-1,Yg(e).div(Kg(e).add(Yg(e)))),rm=e=>wa(1,Zg(e).div(Qg(e).add(Zg(e)))),sm=(e,t,r)=>{const s=e.uvNode,i=Ma(s,t.zw).add(.5),n=bo(i),a=_o(i),o=Jg(a.x),u=em(a.x),l=tm(a.x),d=rm(a.x),c=tm(a.y),h=rm(a.y),p=fn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=fn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=fn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=fn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Jg(a.y).mul(wa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=em(a.y).mul(wa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},im=an(([e,t])=>{const r=fn(e.size(pn(t))),s=fn(e.size(pn(t.add(1)))),i=Ba(1,r),n=Ba(1,s),a=sm(e,Sn(i,r),bo(t)),o=sm(e,Sn(n,s),xo(t));return _o(t).mix(a,o)}),nm=an(([e,t])=>{const r=t.mul(El(e));return im(e,r)}),am=an(([e,t,r,s,i])=>{const n=Tn(au(t.negate(),To(e),Ba(1,s))),a=Tn(Mo(i[0].xyz),Mo(i[1].xyz),Mo(i[2].xyz));return To(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"}]}),om=an(([e,t])=>e.mul(iu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),um=Tp(),lm=Tp(),dm=an(([e,t,r],{material:s})=>{const i=(s.side===M?um:lm).sample(e),n=mo(Wl.x).mul(om(t,r));return im(i,n)}),cm=an(([e,t,r])=>(ln(r.notEqual(0),()=>{const s=go(t).negate().div(r);return ho(s.negate().mul(e))}),Tn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),hm=an(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Sn().toVar(),f=Tn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Tn(d.sub(i),d,d.add(i));np({start:0,end:3},({i:i})=>{const d=n.element(i),g=am(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(Sn(y,1))),x=fn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(fn(x.x,x.y.oneMinus()));const T=dm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(cm(Mo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=am(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(Sn(n,1))),y=fn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(fn(y.x,y.y.oneMinus())),m=dm(y,r,d),f=s.mul(cm(Mo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Tn(Og({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Sn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),pm=Cn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),gm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),mm=an(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=su(e,t,ou(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ln(a.lessThan(0),()=>Tn(1));const o=a.sqrt(),u=gm(n,e),l=yg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=hn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Tn(1).add(t).div(Tn(1).sub(t))})(i.clamp(0,.9999)),g=gm(p,n.toVec3()),m=yg({f0:g,f90:1,dotVH:o}),f=Tn(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),b=Tn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Tn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return np({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=Tn(54856e-17,44201e-17,52481e-17),i=Tn(1681e3,1795300,2208400),n=Tn(43278e5,93046e5,66121e5),a=hn(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=Tn(o.x.add(a),o.y,o.z).div(1.0685e-7),pm.mul(o)})(hn(e).mul(y),hn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Tn(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"}]}),fm=an(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=hn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=hn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),ym=Tn(.04),bm=hn(1);class xm extends pg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Tn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Tn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Tn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Tn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Tn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Wd.dot(Fd).clamp(),t=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Zn}),r=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Un.rgb});this.iridescenceFresnel=su(t,r,kn),this.iridescenceF0Dielectric=Vg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Vg({f:r,f90:1,dotVH:e}),this.iridescenceF0=su(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,kn)}if(!0===this.transmission){const t=Bd,r=nd.sub(Bd).normalize(),s=Hd,i=e.context;i.backdrop=hm(s,r,Vn,In,Jn,ea,t,yd,rd,ed,aa,ua,da,la,this.dispersion?ca:null),i.backdropAlpha=oa,Un.a.mulAssign(su(1,i.backdrop.a,oa))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=Wd.dot(Fd).clamp(),a=Ug({roughness:Vn,dotNV:n}),o=i?Hn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(zg({lightDirection:e})));const t=fm({normal:Wd,viewDir:Fd,roughness:Wn}),r=fm({normal:Wd,viewDir:e,roughness:Wn}),i=$n.r.max($n.g).max($n.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=jd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Lg({lightDirection:e,f0:ym,f90:bm,roughness:zn,normalView:jd})))}r.directDiffuse.addAssign(s.mul(bg({diffuseColor:In}))),r.directSpecular.addAssign(s.mul(Ig({lightDirection:e,f0:Jn,f90:1,roughness:Vn,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=Wd,h=Fd,p=Ld.toVar(),g=$g({N:c,V:h,roughness:Vn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Cn(Tn(m.x,0,m.y),Tn(0,1,0),Tn(m.z,0,m.w)).toVar(),b=Jn.mul(f.x).add(Jn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(jg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(In).mul(jg({N:c,V:h,P:p,mInv:Cn(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,s=t.mul(bg({diffuseColor:In})).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul($n,fm({normal:Wd,viewDir:Fd,roughness:Wn}))),!0===this.clearcoat){const e=jd.dot(Fd).clamp(),t=Og({dotNV:e,specularColor:ym,specularF90:bm,roughness:zn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Tn().toVar("singleScatteringDielectric"),n=Tn().toVar("multiScatteringDielectric"),a=Tn().toVar("singleScatteringMetallic"),o=Tn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ea,Zn,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ea,Un.rgb,this.iridescenceF0Metallic);const u=su(i,a,kn),l=su(n,o,kn),d=i.add(n),c=In.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Wd.dot(Fd).clamp().add(t),i=Vn.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=jd.dot(Fd).clamp(),r=yg({dotVH:e,f0:ym,f90:bm}),s=t.mul(Gn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Gn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Tm=hn(1),_m=hn(-2),vm=hn(.8),Nm=hn(-1),Sm=hn(.4),Rm=hn(2),Am=hn(.305),Em=hn(3),wm=hn(.21),Cm=hn(4),Mm=hn(4),Bm=hn(16),Pm=an(([e])=>{const t=Tn(wo(e)).toVar(),r=hn(-1).toVar();return ln(t.x.greaterThan(t.z),()=>{ln(t.x.greaterThan(t.y),()=>{r.assign(fu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}).Else(()=>{ln(t.z.greaterThan(t.y),()=>{r.assign(fu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Lm=an(([e,t])=>{const r=fn().toVar();return ln(t.equal(0),()=>{r.assign(fn(e.z,e.y).div(wo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(fn(e.x.negate(),e.z.negate()).div(wo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(fn(e.x.negate(),e.y).div(wo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(fn(e.z.negate(),e.y).div(wo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(fn(e.x.negate(),e.z).div(wo(e.y)))}).Else(()=>{r.assign(fn(e.x,e.y).div(wo(e.z)))}),Ma(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Fm=an(([e])=>{const t=hn(0).toVar();return ln(e.greaterThanEqual(vm),()=>{t.assign(Tm.sub(e).mul(Nm.sub(_m)).div(Tm.sub(vm)).add(_m))}).ElseIf(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Sm.sub(e).mul(Em.sub(Rm)).div(Sm.sub(Am)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Am.sub(e).mul(Cm.sub(Em)).div(Am.sub(wm)).add(Em))}).Else(()=>{t.assign(hn(-2).mul(mo(Ma(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Dm=an(([e,t])=>{const r=e.toVar();r.assign(Ma(2,r).sub(1));const s=Tn(r,1).toVar();return ln(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"}]}),Um=an(([e,t,r,s,i,n])=>{const a=hn(r),o=Tn(t),u=iu(Fm(a),_m,n),l=_o(u),d=bo(u),c=Tn(Im(e,o,d,s,i,n)).toVar();return ln(l.notEqual(0),()=>{const t=Tn(Im(e,o,d.add(1),s,i,n)).toVar();c.assign(su(c,t,l))}),c}),Im=an(([e,t,r,s,i,n])=>{const a=hn(r).toVar(),o=Tn(t),u=hn(Pm(o)).toVar(),l=hn($o(Mm.sub(a),0)).toVar();a.assign($o(a,Mm));const d=hn(po(a)).toVar(),c=fn(Lm(o,u).mul(d.sub(2)).add(1)).toVar();return ln(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Ma(3,Bm))),c.y.addAssign(Ma(4,po(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(fn(),fn())}),Om=an(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=No(s),l=r.mul(u).add(i.cross(r).mul(vo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Im(e,l,t,n,a,o)}),Vm=an(({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=Tn(fu(t,r,Ko(r,s))).toVar();ln(h.equal(Tn(0)),()=>{h.assign(Tn(s.z,0,s.x.negate()))}),h.assign(To(h));const p=Tn().toVar();return p.addAssign(i.element(0).mul(Om({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),np({start:pn(1),end:e},({i:e})=>{ln(e.greaterThanEqual(n),()=>{ap()});const t=hn(a.mul(hn(e))).toVar();p.addAssign(i.element(e).mul(Om({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(Om({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),Sn(p,1)}),km=an(([e])=>{const t=gn(e).toVar();return t.assign(t.shiftLeft(gn(16)).bitOr(t.shiftRight(gn(16)))),t.assign(t.bitAnd(gn(1431655765)).shiftLeft(gn(1)).bitOr(t.bitAnd(gn(2863311530)).shiftRight(gn(1)))),t.assign(t.bitAnd(gn(858993459)).shiftLeft(gn(2)).bitOr(t.bitAnd(gn(3435973836)).shiftRight(gn(2)))),t.assign(t.bitAnd(gn(252645135)).shiftLeft(gn(4)).bitOr(t.bitAnd(gn(4042322160)).shiftRight(gn(4)))),t.assign(t.bitAnd(gn(16711935)).shiftLeft(gn(8)).bitOr(t.bitAnd(gn(4278255360)).shiftRight(gn(8)))),hn(t).mul(2.3283064365386963e-10)}),Gm=an(([e,t])=>fn(hn(e).div(hn(t)),km(e))),zm=an(([e,t,r])=>{const s=Tn(t).toVar(),i=hn(r),n=i.mul(i).toVar(),a=To(Tn(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=fu(o.greaterThan(0),Tn(a.y.negate(),a.x,0).div(fo(o)),Tn(1,0,0)).toVar(),l=Ko(a,u).toVar(),d=fo(e.x),c=Ma(2,3.14159265359).mul(e.y),h=d.mul(No(c)).toVar(),p=d.mul(vo(c)).toVar(),g=Ma(.5,a.z.add(1));p.assign(g.oneMinus().mul(fo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(fo($o(0,h.mul(h).add(p.mul(p)).oneMinus()))));return To(Tn(n.mul(m.x),n.mul(m.y),$o(0,m.z)))}),$m=an(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Tn(s).toVar(),l=Tn(0).toVar(),d=hn(0).toVar();return ln(e.lessThan(.001),()=>{l.assign(Im(r,u,t,n,a,o))}).Else(()=>{const s=fu(wo(u.z).lessThan(.999),Tn(0,0,1),Tn(1,0,0)),c=To(Ko(s,u)).toVar(),h=Ko(u,c).toVar();np({start:gn(0),end:i},({i:s})=>{const p=Gm(s,i),g=zm(p,Tn(0,0,1),e),m=To(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=To(m.mul(Xo(u,m).mul(2)).sub(u)),y=$o(Xo(u,f),0);ln(y.greaterThan(0),()=>{const e=Im(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),ln(d.greaterThan(0),()=>{l.assign(l.div(d))})}),Sn(l,1)}),Wm=[.125,.215,.35,.446,.526,.582],Hm=20,jm=new _e(-1,1,1,-1,0,1),qm=new ve(90,1),Xm=new e;let Km=null,Ym=0,Qm=0;const Zm=new r,Jm=new WeakMap,ef=[3,1,5,0,4,2],tf=Dm(Nl(),vl("faceIndex")).normalize(),rf=Tn(tf.x,tf.y,tf.z);class sf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=Zm,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Km=this._renderer.getRenderTarget(),Ym=this._renderer.getActiveCubeFace(),Qm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=uf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=lf(),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===F||e.mapping===D?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=Wm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=ef[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Il(new Array(Hm).fill(0)),n=xa(new r(0,1,0)),a=xa(0),o=hn(Hm),u=xa(0),l=xa(1),d=Bl(),c=xa(0),h=hn(1/t),p=hn(1/s),g=hn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:rf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=of("blur");return f.fragmentNode=Vm({...m,latitudinal:u.equal(1)}),Jm.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Bl(),i=xa(0),n=xa(0),a=hn(1/t),o=hn(1/r),u=hn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=of("ggx");return d.fragmentNode=$m({...l,N_immutable:rf,GGX_SAMPLES:gn(512)}),Jm.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,jm)}_sceneToCubeUV(e,t,r,s,i){const n=qm;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(Xm),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Xm),h=!0),u.setRenderTarget(s),u.clear(),h&&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;af(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===F||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=uf(e)):null===this._equirectMaterial&&(this._equirectMaterial=lf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;af(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,jm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,af(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,jm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,af(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,jm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=Jm.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):Hm;f>Hm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,jm)}}function nf(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function af(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function of(e){const t=new jp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function uf(e){const t=of("cubemap");return t.fragmentNode=dc(e,rf),t}function lf(e){const t=of("equirect");return t.fragmentNode=Bl(e,ig(rf),0),t}const df=new WeakMap;function cf(e,t,r){const s=function(e){let t=df.get(e);void 0===t&&(t=new WeakMap,df.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 hf extends li{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 N;s.isRenderTargetTexture=!0,this._texture=Bl(s),this._width=xa(0),this._height=xa(0),this._maxMip=xa(0),this.updateBeforeType=Qs.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:cf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new sf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=rc.mul(Tn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Um(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const pf=en(hf).setParameterLength(1,3),gf=new WeakMap;class mf extends hp{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=gf.get(e);void 0===s&&(s=pf(e),gf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?zc:Wd,i=r.context(ff(Vn,s)).mul(tc),n=r.context(yf(Hd)).mul(Math.PI).mul(tc),a=il(i),o=il(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(ff(zn,jd)).mul(tc),t=il(e);u.addAssign(t)}}}const ff=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fd.negate().reflect(t),r=Jo(e).mix(r,t).normalize(),r=r.transformDirection(rd)),r),getTextureLevel:()=>e}},yf=e=>({getUV:()=>e,getTextureLevel:()=>hn(1)}),bf=new we;class xf extends jp{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(bf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new mf(t):null}setupLightingModel(){return new xm}setupSpecular(){const e=su(Tn(.04),Un.rgb,kn);Zn.assign(Tn(.04)),Jn.assign(e),ea.assign(1)}setupVariants(){const e=this.metalnessNode?hn(this.metalnessNode):dh;kn.assign(e);let t=this.roughnessNode?hn(this.roughnessNode):lh;t=Eg({roughness:t}),Vn.assign(t),this.setupSpecular(),In.assign(Un.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Tf=new Ce;class _f extends xf{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(Tf),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?hn(this.iorNode):Sh;aa.assign(e),Zn.assign(zo(Qo(aa.sub(1).div(aa.add(1))).mul(ah),Tn(1)).mul(nh)),Jn.assign(su(Zn,Un.rgb,kn)),ea.assign(su(nh,1,kn))}setupLightingModel(){return new xm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?hn(this.clearcoatNode):hh,t=this.clearcoatRoughnessNode?hn(this.clearcoatRoughnessNode):ph;Gn.assign(e),zn.assign(Eg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Tn(this.sheenNode):fh,t=this.sheenRoughnessNode?hn(this.sheenRoughnessNode):yh;$n.assign(e),Wn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?hn(this.iridescenceNode):xh,t=this.iridescenceIORNode?hn(this.iridescenceIORNode):Th,r=this.iridescenceThicknessNode?hn(this.iridescenceThicknessNode):_h;Hn.assign(e),jn.assign(t),qn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?fn(this.anisotropyNode):bh).toVar();Kn.assign(e.length()),ln(Kn.equal(0),()=>{e.assign(fn(1,0))}).Else(()=>{e.divAssign(fn(Kn)),Kn.assign(Kn.saturate())}),Xn.assign(Kn.pow2().mix(Vn.pow2(),1)),Yn.assign(kc[0].mul(e.x).add(kc[1].mul(e.y))),Qn.assign(kc[1].mul(e.x).sub(kc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?hn(this.transmissionNode):vh,t=this.thicknessNode?hn(this.thicknessNode):Nh,r=this.attenuationDistanceNode?hn(this.attenuationDistanceNode):Rh,s=this.attenuationColorNode?Tn(this.attenuationColorNode):Ah;if(oa.assign(e),ua.assign(t),la.assign(r),da.assign(s),this.useDispersion){const e=this.dispersionNode?hn(this.dispersionNode):Lh;ca.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Tn(this.clearcoatNormalNode):gh}setup(e){e.context.setupClearcoatNormal=()=>Mu(this.setupClearcoatNormal(e),"NORMAL","vec3"),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 vf extends xm{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(Wd.mul(a)).normalize(),h=hn(Fd.dot(c.negate()).saturate().pow(l).mul(d)),p=Tn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Nf extends _f{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=hn(.1),this.thicknessAmbientNode=hn(0),this.thicknessAttenuationNode=hn(.1),this.thicknessPowerNode=hn(2),this.thicknessScaleNode=hn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new vf(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 Sf=an(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=fn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=fc("gradientMap","texture").context({getUV:()=>i});return Tn(e.r)}{const e=i.fwidth().mul(.5);return su(Tn(.7),Tn(1),ou(hn(.7).sub(e.x),hn(.7).add(e.x),i.x))}});class Rf extends pg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Sf({normal:Vd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(bg({diffuseColor:Un.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const Af=new Me;class Ef extends jp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Af),this.setValues(e)}setupLightingModel(){return new Rf}}const wf=an(()=>{const e=Tn(Fd.z,0,Fd.x.negate()).normalize(),t=Fd.cross(e);return fn(e.dot(Wd),t.dot(Wd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Cf=new Be;class Mf extends jp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Cf),this.setValues(e)}setupVariants(e){const t=wf;let r;r=e.material.matcap?fc("matcap","texture").context({getUV:()=>t}):Tn(su(.2,.8,t.y)),Un.rgb.mulAssign(r.rgb)}}class Bf extends li{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 wn(e,s,s.negate(),e).mul(r)}{const e=t,s=Mn(Sn(1,0,0,0),Sn(0,No(e.x),vo(e.x).negate(),0),Sn(0,vo(e.x),No(e.x),0),Sn(0,0,0,1)),i=Mn(Sn(No(e.y),0,vo(e.y),0),Sn(0,1,0,0),Sn(vo(e.y).negate(),0,No(e.y),0),Sn(0,0,0,1)),n=Mn(Sn(No(e.z),vo(e.z).negate(),0,0),Sn(vo(e.z),No(e.z),0,0),Sn(0,0,1,0),Sn(0,0,0,1));return s.mul(i).mul(n).mul(Sn(r,1)).xyz}}}const Pf=en(Bf).setParameterLength(2),Lf=new Pe;class Ff extends jp{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(Lf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Sd.mul(Tn(s||0));let u=fn(yd[0].xyz.length(),yd[1].xyz.length());null!==n&&(u=u.mul(fn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=wd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Gu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=hn(i||mh),c=Pf(l,d);return Sn(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 Df=new Le,Uf=new t;class If extends Ff{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Sd.mul(Tn(e||Cd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?fn(n):Ph;u=u.mul(zl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Of.div(Ld.z.negate()))),i&&i.isNode&&(u=u.mul(fn(i)));let l=wd.xy;if(s&&s.isNode){const e=hn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(ql.div(2)),l=l.mul(o.w),o=o.add(Sn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Of=xa(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Uf);this.value=.5*t.y});class Vf extends pg{constructor(){super(),this.shadowNode=hn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Un.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Un.rgb)}}const kf=new Fe;class Gf extends jp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(kf),this.setValues(e)}setupLightingModel(){return new Vf}}const zf=Fn("vec3"),$f=Fn("vec3"),Wf=Fn("vec3");class Hf extends pg{constructor(){super()}start(e){const{material:t}=e,r=Fn("vec3"),s=Fn("vec3");ln(nd.sub(Bd).length().greaterThan(_d.mul(2)),()=>{r.assign(nd),s.assign(Bd)}).Else(()=>{r.assign(Bd),s.assign(nd)});const i=s.sub(r),n=xa("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=hn(0).toVar(),l=Tn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),np(n,()=>{const s=r.add(o.mul(u)),i=rd.mul(Sn(s,1)).xyz;let n;null!==t.depthNode&&($f.assign(Bp(Ap(i.z,Zl,Jl))),e.context.sceneDepthNode=Bp(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,zf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&zf.mulAssign(n);const d=zf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),Wf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ln(r.greaterThanEqual($f),()=>{zf.addAssign(e)}):zf.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(qg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Wf)}}class jf extends jp{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=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Hf}}class qf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};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 Xf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}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)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Fs(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}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=Us(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Us(e,1)),e=Us(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Qf=[];class Zf{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);Qf[0]=e,Qf[1]=t,Qf[2]=n,Qf[3]=i;let l=u.get(Qf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Qf,l)):(l.camera=s,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)),Qf[0]=null,Qf[1]=null,Qf[2]=null,Qf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Xf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Yf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Jf{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 ey=1,ty=2,ry=3,sy=4,iy=16;class ny extends Jf{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===ey?this.backend.createAttribute(e):t===ty?this.backend.createIndexAttribute(e):t===ry?this.backend.createStorageAttribute(e):t===sy&&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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,ry):this.updateAttribute(e,ey);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,ty);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,sy)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=oy(t),e.set(t,r)):r.version!==ay(t)&&(this.attributes.delete(r),r=oy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class ly{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):o("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 dy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class cy extends dy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class hy extends dy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let py=0;class gy{constructor(e,t,r,s=null,i=null){this.id=py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class my extends Jf{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 gy(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 gy(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 gy(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 hy(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 cy(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 fy extends Jf{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function yy(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 by(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 xy(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class Ty{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||yy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||by),this.transparent.length>1&&this.transparent.sort(t||by)}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=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,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.isArrayTexture?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 e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Ey){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput?this.outputNode.build(e,...t):super.build(e,...t),on(r),e.removeActiveStack(this),o}}const Py=en(By).setParameterLength(0,1);class Ly extends ai{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=zs(i),a=$s(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}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.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Fy extends ai{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.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.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Dy extends ai{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;tnew ky(e,"uint","float"),$y={};class Wy extends eo{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(Gy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return gn;case"int":return pn;case"uvec2":return bn;case"uvec3":return vn;case"uvec4":return An;case"ivec2":return yn;case"ivec3":return _n;case"ivec4":return Rn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t);const i=hn(s.bitAnd(Bo(s))),n=zy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{ln(e.equal(gn(0)),()=>gn(32));const s=gn(0),i=gn(0);return this._resolveElementType(e,s,t),ln(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),ln(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),ln(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),ln(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),ln(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(gn(1)).bitAnd(gn(1431655765)))),s.assign(s.bitAnd(gn(858993459)).add(s.shiftRight(gn(2)).bitAnd(gn(858993459))));const i=s.add(s.shiftRight(gn(4))).bitAnd(gn(252645135)).mul(gn(16843009)).shiftRight(gn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return an(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Wy.COUNT_TRAILING_ZEROS="countTrailingZeros",Wy.COUNT_LEADING_ZEROS="countLeadingZeros",Wy.COUNT_ONE_BITS="countOneBits";const Hy=rn(Wy,Wy.COUNT_TRAILING_ZEROS).setParameterLength(1),jy=rn(Wy,Wy.COUNT_LEADING_ZEROS).setParameterLength(1),qy=rn(Wy,Wy.COUNT_ONE_BITS).setParameterLength(1),Xy=an(([e])=>{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)}),Ky=(e,t)=>Yo(Ma(4,e.mul(Ca(1,e))),t);class Yy extends li{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const Qy=rn(Yy,"snorm").setParameterLength(1),Zy=rn(Yy,"unorm").setParameterLength(1),Jy=rn(Yy,"float16").setParameterLength(1);class eb extends li{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const tb=rn(eb,"snorm").setParameterLength(1),rb=rn(eb,"unorm").setParameterLength(1),sb=rn(eb,"float16").setParameterLength(1),ib=an(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),nb=an(([e])=>Tn(ib(e.z.add(ib(e.y.mul(1)))),ib(e.z.add(ib(e.x.mul(1)))),ib(e.y.add(ib(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),ab=an(([e,t,r])=>{const s=Tn(e).toVar(),i=hn(1.4).toVar(),n=hn(0).toVar(),a=Tn(s).toVar();return np({start:hn(0),end:hn(3),type:"float",condition:"<="},()=>{const e=Tn(nb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(hn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=hn(ib(s.z.add(ib(s.x.add(ib(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 ob extends ai{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const ub=en(ob),lb=e=>(...t)=>ub(e,...t),db=xa(0).setGroup(fa).onRenderUpdate(e=>e.time),cb=xa(0).setGroup(fa).onRenderUpdate(e=>e.deltaTime),hb=xa(0,"uint").setGroup(fa).onRenderUpdate(e=>e.frameId);const pb=an(([e,t,r=fn(.5)])=>Pf(e.sub(r),t).add(r)),gb=an(([e,t,r=fn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),mb=an(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=yd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=yd;const i=rd.mul(s);return qi(t)&&(i[0][0]=yd[0].length(),i[0][1]=0,i[0][2]=0),qi(r)&&(i[1][0]=0,i[1][1]=yd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ed.mul(i).mul(Cd)}),fb=an(([e=null])=>{const t=Bp();return Bp(Np(e)).sub(t).lessThan(0).select($l,e)});class yb extends ai{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Nl(),r=hn(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=fn(a,o);return t.add(l).mul(u)}}const bb=en(yb).setParameterLength(3),xb=an(([e,t=null,r=null,s=hn(1),i=Cd,n=kd])=>{let a=n.abs().normalize();a=a.div(a.dot(Tn(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=Bl(d,o).mul(a.x),g=Bl(c,u).mul(a.y),m=Bl(h,l).mul(a.z);return wa(p,g,m)}),Tb=new ze,_b=new r,vb=new r,Nb=new r,Sb=new a,Rb=new r(0,0,-1),Ab=new s,Eb=new r,wb=new r,Cb=new s,Mb=new t,Bb=new Ne,Pb=$l.flipX();Bb.depthTexture=new Y(1,1);let Lb=!1;class Fb extends Cl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Bb.texture,Pb),this._reflectorBaseNode=e.reflector||new Db(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=Yi(new Fb({defaultTexture:Bb.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.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Db extends ai{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new $e,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Qs.RENDER:Qs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Mb),e.setSize(Math.round(Mb.width*r),Math.round(Mb.height*r))}setup(e){return this._updateResolution(Bb,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 Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=We,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Lb)return!1;Lb=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Mb),this._updateResolution(o,s),vb.setFromMatrixPosition(n.matrixWorld),Nb.setFromMatrixPosition(r.matrixWorld),Sb.extractRotation(n.matrixWorld),_b.set(0,0,1),_b.applyMatrix4(Sb),Eb.subVectors(vb,Nb);let u=!1;if(!0===Eb.dot(_b)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Lb=!1);u=!0}Eb.reflect(_b).negate(),Eb.add(vb),Sb.extractRotation(r.matrixWorld),Rb.set(0,0,-1),Rb.applyMatrix4(Sb),Rb.add(Nb),wb.subVectors(vb,Rb),wb.reflect(_b).negate(),wb.add(vb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Eb),a.up.set(0,1,0),a.up.applyMatrix4(Sb),a.up.reflect(_b),a.lookAt(wb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Tb.setFromNormalAndCoplanarPoint(_b,vb),Tb.applyMatrix4(a.matrixWorldInverse),Ab.set(Tb.normal.x,Tb.normal.y,Tb.normal.z,Tb.constant);const l=a.projectionMatrix;Cb.x=(Math.sign(Ab.x)+l.elements[8])/l.elements[0],Cb.y=(Math.sign(Ab.y)+l.elements[9])/l.elements[5],Cb.z=-1,Cb.w=(1+l.elements[10])/l.elements[14],Ab.multiplyScalar(1/Ab.dot(Cb));l.elements[2]=Ab.x,l.elements[6]=Ab.y,l.elements[10]=s.coordinateSystem===h?Ab.z-0:Ab.z+1-0,l.elements[14]=Ab.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Lb=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const Ub=new _e(-1,1,1,-1,0,1);class Ib extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new He([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new He(t,2))}}const Ob=new Ib;class Vb extends ne{constructor(e=null){super(Ob,e),this.camera=Ub,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,Ub)}render(e){e.render(this,Ub)}}const kb=new t;class Gb extends Cl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Nl()),this.isRTTNode=!0,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 Vb(new jp),this.updateBeforeType=Qs.RENDER}get autoResize(){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.autoResize){const t=e.getPixelRatio(),r=e.getSize(kb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Cl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const zb=(e,...t)=>Yi(new Gb(Yi(e),...t)),$b=an(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=fn(e.x,e.y.oneMinus()).mul(2).sub(1),i=Sn(Tn(e,t),1)):i=Sn(Tn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Sn(r.mul(i));return n.xyz.div(n.w)}),Wb=an(([e,t])=>{const r=t.mul(Sn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return fn(s.x,s.y.oneMinus())}),Hb=an(([e,t,r])=>{const s=Rl(Pl(t)),i=yn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(yn(2,0))).toVar(),o=Pl(t,i.sub(yn(1,0))).toVar(),u=Pl(t,i.add(yn(1,0))).toVar(),l=Pl(t,i.add(yn(2,0))).toVar(),d=Pl(t,i.add(yn(0,2))).toVar(),c=Pl(t,i.add(yn(0,1))).toVar(),h=Pl(t,i.sub(yn(0,1))).toVar(),p=Pl(t,i.sub(yn(0,2))).toVar(),g=wo(Ca(hn(2).mul(o).sub(a),n)).toVar(),m=wo(Ca(hn(2).mul(u).sub(l),n)).toVar(),f=wo(Ca(hn(2).mul(c).sub(d),n)).toVar(),y=wo(Ca(hn(2).mul(h).sub(p),n)).toVar(),b=$b(e,n,r).toVar(),x=g.lessThan(m).select(b.sub($b(e.sub(fn(hn(1).div(s.x),0)),o,r)),b.negate().add($b(e.add(fn(hn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub($b(e.add(fn(0,hn(1).div(s.y))),c,r)),b.negate().add($b(e.sub(fn(0,hn(1).div(s.y))),h,r)));return To(Ko(x,T))}),jb=an(([e])=>_o(hn(52.9829189).mul(_o(Xo(e,fn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),qb=an(([e,t,r])=>{const s=hn(2.399963229728653),i=fo(hn(e).add(.5).div(hn(t))),n=hn(e).mul(s).add(r);return fn(No(n),vo(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Xb extends ai{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Nl())}sample(e){return this.callback(e)}}class Kb extends ai{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Kb.OBJECT?this.updateType=Qs.OBJECT:e===Kb.MATERIAL?this.updateType=Qs.RENDER:e===Kb.BEFORE_OBJECT?this.updateBeforeType=Qs.OBJECT:e===Kb.BEFORE_MATERIAL&&(this.updateBeforeType=Qs.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Kb.OBJECT="object",Kb.MATERIAL="material",Kb.BEFORE_OBJECT="beforeObject",Kb.BEFORE_MATERIAL="beforeMaterial";const Yb=(e,t)=>new Kb(e,t).toStack();class Qb extends H{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Zb extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Jb extends ai{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ex=tn(Jb),tx=new P,rx=new a;class sx extends ai{static get type(){return"SceneNode"}constructor(e=sx.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===sx.BACKGROUND_BLURRINESS?s=pc("backgroundBlurriness","float",r):t===sx.BACKGROUND_INTENSITY?s=pc("backgroundIntensity","float",r):t===sx.BACKGROUND_ROTATION?s=xa("mat4").setName("backgroundRotation").setGroup(fa).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==je?(tx.copy(r.backgroundRotation),tx.x*=-1,tx.y*=-1,tx.z*=-1,rx.makeRotationFromEuler(tx)):rx.identity(),rx}):o("SceneNode: Unknown scope:",t),s}}sx.BACKGROUND_BLURRINESS="backgroundBlurriness",sx.BACKGROUND_INTENSITY="backgroundIntensity",sx.BACKGROUND_ROTATION="backgroundRotation";const ix=tn(sx,sx.BACKGROUND_BLURRINESS),nx=tn(sx,sx.BACKGROUND_INTENSITY),ax=tn(sx,sx.BACKGROUND_ROTATION);class ox extends Cl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=Js.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Js.READ_WRITE)}toReadOnly(){return this.setAccess(Js.READ_ONLY)}toWriteOnly(){return this.setAccess(Js.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const ux=en(ox).setParameterLength(1,3),lx=an(({texture:e,uv:t})=>{const r=1e-4,s=Tn().toVar();return ln(t.x.lessThan(r),()=>{s.assign(Tn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Tn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Tn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Tn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Tn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Tn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Tn(-.01,0,0))).r.sub(e.sample(t.add(Tn(r,0,0))).r),n=e.sample(t.add(Tn(0,-.01,0))).r.sub(e.sample(t.add(Tn(0,r,0))).r),a=e.sample(t.add(Tn(0,0,-.01))).r.sub(e.sample(t.add(Tn(0,0,r))).r);s.assign(Tn(i,n,a))}),s.normalize()});class dx extends Cl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Tn(.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(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return lx({texture:this,uv:e})}}const cx=en(dx).setParameterLength(1,3);class hx extends hc{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 px=new WeakMap;class gx extends li{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Qs.OBJECT,this.updateAfterType=Qs.OBJECT,this.previousModelWorldMatrix=xa(new a),this.previousProjectionMatrix=xa(new a).setGroup(fa),this.previousCameraViewMatrix=xa(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=fx(r);this.previousModelWorldMatrix.value.copy(s);const i=mx(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}){fx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ed:xa(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Sd).mul(Cd),s=this.previousProjectionMatrix.mul(t).mul(Md),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ca(i,n)}}function mx(e){let t=px.get(e);return void 0===t&&(t={},px.set(e,t)),t}function fx(e,t=0){const r=mx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const yx=tn(gx),bx=an(([e])=>vx(e.rgb)),xx=an(([e,t=hn(1)])=>t.mix(vx(e.rgb),e.rgb)),Tx=an(([e,t=hn(1)])=>{const r=wa(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 su(e.rgb,s,i)}),_x=an(([e,t=hn(1)])=>{const r=Tn(.57735,.57735,.57735),s=t.cos();return Tn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Xo(r,e.rgb).mul(s.oneMinus())))))}),vx=(e,t=Tn(p.getLuminanceCoefficients(new r)))=>Xo(e,t),Nx=an(([e,t=Tn(1),s=Tn(0),i=Tn(1),n=hn(1),a=Tn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(Tn(a)),u=$o(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ln(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ln(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ln(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),Sn(u.rgb,e.a)});class Sx extends li{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 Rx=en(Sx).setParameterLength(2),Ax=new t;class Ex extends Cl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class wx extends Ex{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(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Cx extends li{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 Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=xa(0),this._cameraFar=xa(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Qs.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}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=new wx(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=new wx(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=Ep(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=Rp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Cx.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),Ax.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Ax)),this._pixelRatio=i,this.setSize(Ax.width,Ax.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:bu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Cx.COLOR="color",Cx.DEPTH="depth";class Mx extends Cx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Cx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 jp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=kd.negate(),r=ed.mul(Sd),s=hn(1),i=r.mul(Sn(Cd,1)),n=r.mul(Sn(Cd.add(t),1)),a=To(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Sn(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 Bx=an(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Px=an(([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"}]}),Lx=an(([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"}]}),Fx=an(([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)}),Dx=an(([e,t])=>{const r=Cn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Cn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Fx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ux=Cn(Tn(1.6605,-.1246,-.0182),Tn(-.5876,1.1329,-.1006),Tn(-.0728,-.0083,1.1187)),Ix=Cn(Tn(.6274,.0691,.0164),Tn(.3293,.9195,.088),Tn(.0433,.0113,.8956)),Ox=an(([e])=>{const t=Tn(e).toVar(),r=Tn(t.mul(t)).toVar(),s=Tn(r.mul(r)).toVar();return hn(15.5).mul(s.mul(r)).sub(Ma(40.14,s.mul(t))).add(Ma(31.96,s).sub(Ma(6.868,r.mul(t))).add(Ma(.4298,r).add(Ma(.1191,t).sub(.00232))))}),Vx=an(([e,t])=>{const r=Tn(e).toVar(),s=Cn(Tn(.856627153315983,.137318972929847,.11189821299995),Tn(.0951212405381588,.761241990602591,.0767994186031903),Tn(.0482516061458583,.101439036467562,.811302368396859)),i=Cn(Tn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Tn(-.11060664309660323,1.157823702216272,-.11060664309660294),Tn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=hn(-12.47393),a=hn(4.026069);return r.mulAssign(t),r.assign(Ix.mul(r)),r.assign(s.mul(r)),r.assign($o(r,1e-10)),r.assign(mo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(iu(r,0,1)),r.assign(Ox(r)),r.assign(i.mul(r)),r.assign(Yo($o(Tn(0),r),Tn(2.2))),r.assign(Ux.mul(r)),r.assign(iu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=an(([e,t])=>{const r=hn(.76),s=hn(.15);e=e.mul(t);const i=zo(e.r,zo(e.g,e.b)),n=fu(i.lessThan(.08),i.sub(Ma(6.25,i.mul(i))),.04);e.subAssign(n);const a=$o(e.r,$o(e.g,e.b));ln(a.lessThan(r),()=>e);const o=Ca(1,r),u=Ca(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ca(1,Ba(1,s.mul(a.sub(u)).add(1)));return su(e,Tn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Gx extends ai{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}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 zx=en(Gx).setParameterLength(1,3);class $x extends Gx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 Hx extends ai{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,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:hn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=qs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const jx=en(Hx).setParameterLength(1);class qx 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 Xx{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 Kx=new qx;class Yx extends ai{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new qx,this._output=jx(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]=jx(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]=jx(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 Xx(this),t=Kx.get("THREE"),r=Kx.get("TSL"),s=this.getMethod(),i=[e,this._local,Kx,()=>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:hn()}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=[Fs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ds(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 Qx=en(Yx).setParameterLength(1,2);function Zx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ld.z).negate()}const Jx=an(([e,t],r)=>{const s=Zx(r);return ou(e,t,s)}),eT=an(([e],t)=>{const r=Zx(t);return e.mul(e,r,r).negate().exp().oneMinus()}),tT=an(([e,t])=>Sn(t.toFloat().mix(ra.rgb,e.toVec3()),ra.a));let rT=null,sT=null;class iT extends ai{static get type(){return"RangeNode"}constructor(e=hn(),t=hn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Ws(t.value)),i=e.getTypeLength(Ws(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Ws(a)),d=e.getTypeLength(Ws(o));rT=rT||new s,sT=sT||new s,rT.setScalar(0),sT.setScalar(0),1===u?rT.setScalar(a):a.isColor?rT.set(a.r,a.g,a.b,1):rT.set(a.x,a.y,a.z||0,a.w||0),1===d?sT.setScalar(o):o.isColor?sT.set(o.r,o.g,o.b,1):sT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew aT(e,t),uT=oT("numWorkgroups","uvec3"),lT=oT("workgroupId","uvec3"),dT=oT("globalId","uvec3"),cT=oT("localId","uvec3"),hT=oT("subgroupSize","uint");const pT=en(class extends ai{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 gT extends oi{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 mT extends ai{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new gT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class fT extends ai{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(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=hl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}fT.ATOMIC_LOAD="atomicLoad",fT.ATOMIC_STORE="atomicStore",fT.ATOMIC_ADD="atomicAdd",fT.ATOMIC_SUB="atomicSub",fT.ATOMIC_MAX="atomicMax",fT.ATOMIC_MIN="atomicMin",fT.ATOMIC_AND="atomicAnd",fT.ATOMIC_OR="atomicOr",fT.ATOMIC_XOR="atomicXor";const yT=en(fT),bT=(e,t,r)=>yT(e,t,r).toStack();class xT extends li{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===xT.SUBGROUP_ELECT?"bool":t===xT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===xT.SUBGROUP_BROADCAST||r===xT.SUBGROUP_SHUFFLE||r===xT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===xT.SUBGROUP_SHUFFLE_XOR||r===xT.SUBGROUP_SHUFFLE_DOWN||r===xT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}xT.SUBGROUP_ELECT="subgroupElect",xT.SUBGROUP_BALLOT="subgroupBallot",xT.SUBGROUP_ADD="subgroupAdd",xT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",xT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",xT.SUBGROUP_MUL="subgroupMul",xT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",xT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",xT.SUBGROUP_AND="subgroupAnd",xT.SUBGROUP_OR="subgroupOr",xT.SUBGROUP_XOR="subgroupXor",xT.SUBGROUP_MIN="subgroupMin",xT.SUBGROUP_MAX="subgroupMax",xT.SUBGROUP_ALL="subgroupAll",xT.SUBGROUP_ANY="subgroupAny",xT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",xT.QUAD_SWAP_X="quadSwapX",xT.QUAD_SWAP_Y="quadSwapY",xT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",xT.SUBGROUP_BROADCAST="subgroupBroadcast",xT.SUBGROUP_SHUFFLE="subgroupShuffle",xT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",xT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",xT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",xT.QUAD_BROADCAST="quadBroadcast";const TT=rn(xT,xT.SUBGROUP_ELECT).setParameterLength(0),_T=rn(xT,xT.SUBGROUP_BALLOT).setParameterLength(1),vT=rn(xT,xT.SUBGROUP_ADD).setParameterLength(1),NT=rn(xT,xT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),ST=rn(xT,xT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),RT=rn(xT,xT.SUBGROUP_MUL).setParameterLength(1),AT=rn(xT,xT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),ET=rn(xT,xT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),wT=rn(xT,xT.SUBGROUP_AND).setParameterLength(1),CT=rn(xT,xT.SUBGROUP_OR).setParameterLength(1),MT=rn(xT,xT.SUBGROUP_XOR).setParameterLength(1),BT=rn(xT,xT.SUBGROUP_MIN).setParameterLength(1),PT=rn(xT,xT.SUBGROUP_MAX).setParameterLength(1),LT=rn(xT,xT.SUBGROUP_ALL).setParameterLength(0),FT=rn(xT,xT.SUBGROUP_ANY).setParameterLength(0),DT=rn(xT,xT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),UT=rn(xT,xT.QUAD_SWAP_X).setParameterLength(1),IT=rn(xT,xT.QUAD_SWAP_Y).setParameterLength(1),OT=rn(xT,xT.QUAD_SWAP_DIAGONAL).setParameterLength(1),VT=rn(xT,xT.SUBGROUP_BROADCAST).setParameterLength(2),kT=rn(xT,xT.SUBGROUP_SHUFFLE).setParameterLength(2),GT=rn(xT,xT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),zT=rn(xT,xT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),$T=rn(xT,xT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),WT=rn(xT,xT.QUAD_BROADCAST).setParameterLength(1);let HT;function jT(e){HT=HT||new WeakMap;let t=HT.get(e);return void 0===t&&HT.set(e,t={}),t}function qT(e){const t=jT(e);return t.shadowMatrix||(t.shadowMatrix=xa("mat4").setGroup(fa).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function XT(e,t=Bd){const r=qT(e).mul(t);return r.xyz.div(r.w)}function KT(e){const t=jT(e);return t.position||(t.position=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function YT(e){const t=jT(e);return t.targetPosition||(t.targetPosition=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function QT(e){const t=jT(e);return t.viewPosition||(t.viewPosition=xa(new r).setGroup(fa).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const ZT=e=>rd.transformDirection(KT(e).sub(YT(e))),JT=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},e_=new WeakMap,t_=[];class r_ extends ai{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Fn("vec3","totalDiffuse"),this.totalSpecularNode=Fn("vec3","totalSpecular"),this.outgoingLightNode=Fn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Yi(e));else{let s=null;if(null!==r&&(s=JT(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;e_.has(e)?s=e_.get(e):(s=new r(e),e_.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.getNodeProperties(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=Tn(null!==l?l.mix(g,u):u)),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 s_ extends ai{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Qs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){i_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Bd)}}const i_=Fn("vec3","shadowPositionWorld");function n_(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 a_(e,t){return t=n_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function o_(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 u_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function l_(e,t){return t=u_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function d_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function c_(e,t,r){return r=l_(t,r=a_(e,r))}function h_(e,t,r){o_(e,r),d_(t,r)}var p_=Object.freeze({__proto__:null,resetRendererAndSceneState:c_,resetRendererState:a_,resetSceneState:l_,restoreRendererAndSceneState:h_,restoreRendererState:o_,restoreSceneState:d_,saveRendererAndSceneState:function(e,t,r={}){return r=u_(t,r=n_(e,r))},saveRendererState:n_,saveSceneState:u_});const g_=new WeakMap,m_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),f_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=pc("radius","float",r).setGroup(fa),o=fn(1).div(n),u=a.mul(o.x),l=jb(Hl.xy).mul(6.28318530718);return wa(i(t.xy.add(qb(0,5,l).mul(u)),t.z),i(t.xy.add(qb(1,5,l).mul(u)),t.z),i(t.xy.add(qb(2,5,l).mul(u)),t.z),i(t.xy.add(qb(3,5,l).mul(u)),t.z),i(t.xy.add(qb(4,5,l).mul(u)),t.z)).mul(.2)}),y_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=fn(1).div(n),o=a.x,u=a.y,l=t.xy,d=_o(l.mul(n).add(.5));return l.subAssign(d.mul(a)),wa(i(l,t.z),i(l.add(fn(o,0)),t.z),i(l.add(fn(0,u)),t.z),i(l.add(a),t.z),su(i(l.add(fn(o.negate(),0)),t.z),i(l.add(fn(o.mul(2),0)),t.z),d.x),su(i(l.add(fn(o.negate(),u)),t.z),i(l.add(fn(o.mul(2),u)),t.z),d.x),su(i(l.add(fn(0,u.negate())),t.z),i(l.add(fn(0,u.mul(2))),t.z),d.y),su(i(l.add(fn(o,u.negate())),t.z),i(l.add(fn(o,u.mul(2))),t.z),d.y),su(su(i(l.add(fn(o.negate(),u.negate())),t.z),i(l.add(fn(o.mul(2),u.negate())),t.z),d.x),su(i(l.add(fn(o.negate(),u.mul(2))),t.z),i(l.add(fn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),b_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=$o(1e-7,s.y.mul(s.y)),a=Wo(t.z,i);ln(a.equal(1),()=>hn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=iu(Ca(u,.3).div(.65)),$o(a,u)}),x_=an(([e,t,r])=>{let s=Bd.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),T_=e=>{let t=g_.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=pc("near","float",t).setGroup(fa),s=pc("far","float",t).setGroup(fa),i=cd(e);return x_(i,r,s)})(e):null;t=new jp,t.colorNode=Sn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,g_.set(e,t)}return t},__=e=>{const t=g_.get(e);void 0!==t&&(t.dispose(),g_.delete(e))},v_=new Xf,N_=[],S_=(e,t,r,s)=>{N_[0]=e,N_[1]=t;let i=v_.get(N_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===qe)&&(s&&(js(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,v_.set(N_,i)),N_[0]=null,N_[1]=null,i},R_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanVertical"),a=hn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),A_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanHorizontal"),a=hn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(wa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),E_=[m_,f_,y_,b_];let w_;const C_=new Vb;class M_ extends s_{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._currentShadowType=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,hn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=pc("bias","float",r).setGroup(fa);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=pc("near","float",r.camera).setGroup(fa),s=pc("far","float",r.camera).setGroup(fa);n=wp(e.negate(),t,s)}return a=Tn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return E_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=E;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,camera:r}=e,{light:s,shadow:i}=this,n=t.shadowMap.type,{depthTexture:a,shadowMap:o}=this.setupRenderTarget(i,e);if(i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),n===qe&&!0!==i.isPointLightShadow){a.compareFunction=null,o.depth>1?(o._vsmShadowMapVertical||(o._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=o._vsmShadowMapVertical,o._vsmShadowMapHorizontal||(o._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=o._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Bl(a);a.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Bl(this.vsmShadowMapVertical.texture);a.isArrayTexture&&(r=r.depth(this.depthLayer));const s=pc("blurSamples","float",i).setGroup(fa),n=pc("radius","float",i).setGroup(fa),u=pc("mapSize","vec2",i).setGroup(fa);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new jp);l.fragmentNode=R_({samples:s,radius:n,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new jp),l.fragmentNode=A_({samples:s,radius:n,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=pc("intensity","float",i).setGroup(fa),l=pc("normalBias","float",i).setGroup(fa),d=qT(s).mul(i_.add(Hd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=n===qe&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:a,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:o.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m;o.texture.isCubeTexture?m=dc(o.texture,c.xyz):(m=Bl(o.texture,c),a.isArrayTexture&&(m=m.depth(this.depthLayer)));const f=su(1,g.rgb.mix(m,1),u.mul(m.a)).toVar();this.shadowMap=o,this.shadow.map=o;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture):Bl(this.shadowMap.texture)).toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Nl().mul(Rl(Bl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return an(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");w_=c_(i,n,w_),n.overrideMaterial=T_(r),i.setRenderObjectFunction(S_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===qe&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,h_(i,n,w_)}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),C_.material=this.vsmMaterialVertical,C_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),C_.material=this.vsmMaterialHorizontal,C_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,__(this.light),this.shadowMap&&(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)}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 B_=(e,t)=>new M_(e,t),P_=new e,L_=new a,F_=new r,D_=new r,U_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],I_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],O_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],V_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],k_=an(({depthTexture:e,bd3D:t,dp:r})=>dc(e,t).compare(r)),G_=an(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=pc("radius","float",s).setGroup(fa),n=pc("mapSize","vec2",s).setGroup(fa),a=i.div(n.x),o=wo(t),u=To(Ko(t,o.x.greaterThan(o.z).select(Tn(0,1,0),Tn(1,0,0)))),l=Ko(t,u),d=jb(Hl.xy).mul(6.28318530718),c=qb(0,5,d),h=qb(1,5,d),p=qb(2,5,d),g=qb(3,5,d),m=qb(4,5,d);return dc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(dc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),z_=an(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.near),o=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.far),u=pc("bias","float",s).setGroup(fa),l=hn(1).toVar();return ln(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 d=i.normalize();l.assign(e({depthTexture:t,bd3D:d,dp:r,shadow:s}))}),l});class $_ extends M_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Xe?k_:G_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return z_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new Ke(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=E;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?U_:O_,d=u?I_:V_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(P_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),F_.setFromMatrixPosition(s.matrixWorld),a.position.copy(F_),D_.copy(a.position),D_.add(l[e]),a.up.copy(d[e]),a.lookAt(D_),a.updateMatrixWorld(),o.makeTranslation(-F_.x,-F_.y,-F_.z),L_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(L_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const W_=(e,t)=>new $_(e,t);class H_ extends hp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||xa(this.color).setGroup(fa),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Qs.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return QT(this.light).sub(e.context.positionView||Ld)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return B_(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?Yi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 j_=an(({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)}),q_=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=j_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class X_ extends H_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(2).setGroup(fa)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return W_(this.light)}setupDirect(e){return q_({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const K_=an(([e=Nl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),Y_=an(([e=Nl()],{renderer:t,material:r})=>{const s=ru(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=hn(s.fwidth()).toVar();i=ou(e.oneMinus(),e.add(1),s).oneMinus()}else i=fu(s.greaterThan(1),0,1);return i}),Q_=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=mn(e).toVar();return fu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Z_=an(([e,t])=>{const r=mn(t).toVar(),s=hn(e).toVar();return fu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),J_=an(([e])=>{const t=hn(e).toVar();return pn(bo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ev=an(([e,t])=>{const r=hn(e).toVar();return t.assign(J_(r)),r.sub(hn(t))}),tv=lb([an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=hn(s).toVar(),l=hn(r).toVar(),d=hn(t).toVar(),c=hn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]}),an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=Tn(s).toVar(),l=Tn(r).toVar(),d=Tn(t).toVar(),c=Tn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]})]),rv=lb([an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=hn(o).toVar(),m=hn(a).toVar(),f=hn(n).toVar(),y=hn(i).toVar(),b=hn(s).toVar(),x=hn(r).toVar(),T=hn(t).toVar(),_=hn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=Tn(o).toVar(),m=Tn(a).toVar(),f=Tn(n).toVar(),y=Tn(i).toVar(),b=Tn(s).toVar(),x=Tn(r).toVar(),T=Tn(t).toVar(),_=Tn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),sv=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=gn(e).toVar(),a=gn(n.bitAnd(gn(7))).toVar(),o=hn(Q_(a.lessThan(gn(4)),i,s)).toVar(),u=hn(Ma(2,Q_(a.lessThan(gn(4)),s,i))).toVar();return Z_(o,mn(a.bitAnd(gn(1)))).add(Z_(u,mn(a.bitAnd(gn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),iv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=gn(e).toVar(),u=gn(o.bitAnd(gn(15))).toVar(),l=hn(Q_(u.lessThan(gn(8)),a,n)).toVar(),d=hn(Q_(u.lessThan(gn(4)),n,Q_(u.equal(gn(12)).or(u.equal(gn(14))),a,i))).toVar();return Z_(l,mn(u.bitAnd(gn(1)))).add(Z_(d,mn(u.bitAnd(gn(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"}]}),nv=lb([sv,iv]),av=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=vn(e).toVar();return Tn(nv(n.x,i,s),nv(n.y,i,s),nv(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"}]}),ov=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=vn(e).toVar();return Tn(nv(o.x,a,n,i),nv(o.y,a,n,i),nv(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"}]}),uv=lb([av,ov]),lv=an(([e])=>{const t=hn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),dv=an(([e])=>{const t=hn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),cv=lb([lv,an(([e])=>{const t=Tn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),hv=lb([dv,an(([e])=>{const t=Tn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),pv=an(([e,t])=>{const r=pn(t).toVar(),s=gn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(pn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),gv=an(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(pv(r,pn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(pv(r,pn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(4))),t.addAssign(e)}),mv=an(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar();return s.bitXorAssign(i),s.subAssign(pv(i,pn(14))),n.bitXorAssign(s),n.subAssign(pv(s,pn(11))),i.bitXorAssign(n),i.subAssign(pv(n,pn(25))),s.bitXorAssign(i),s.subAssign(pv(i,pn(16))),n.bitXorAssign(s),n.subAssign(pv(s,pn(4))),i.bitXorAssign(n),i.subAssign(pv(n,pn(14))),s.bitXorAssign(i),s.subAssign(pv(i,pn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),fv=an(([e])=>{const t=gn(e).toVar();return hn(t).div(hn(gn(pn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),yv=an(([e])=>{const t=hn(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"}]}),bv=lb([an(([e])=>{const t=pn(e).toVar(),r=gn(gn(1)).toVar(),s=gn(gn(pn(3735928559)).add(r.shiftLeft(gn(2))).add(gn(13))).toVar();return mv(s.add(gn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(gn(2)).toVar(),n=gn().toVar(),a=gn().toVar(),o=gn().toVar();return n.assign(a.assign(o.assign(gn(pn(3735928559)).add(i.shiftLeft(gn(2))).add(gn(13))))),n.addAssign(gn(s)),a.addAssign(gn(r)),mv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(gn(3)).toVar(),o=gn().toVar(),u=gn().toVar(),l=gn().toVar();return o.assign(u.assign(l.assign(gn(pn(3735928559)).add(a.shiftLeft(gn(2))).add(gn(13))))),o.addAssign(gn(n)),u.addAssign(gn(i)),l.addAssign(gn(s)),mv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),an(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=pn(e).toVar(),u=gn(gn(4)).toVar(),l=gn().toVar(),d=gn().toVar(),c=gn().toVar();return l.assign(d.assign(c.assign(gn(pn(3735928559)).add(u.shiftLeft(gn(2))).add(gn(13))))),l.addAssign(gn(o)),d.addAssign(gn(a)),c.addAssign(gn(n)),gv(l,d,c),l.addAssign(gn(i)),mv(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"}]}),an(([e,t,r,s,i])=>{const n=pn(i).toVar(),a=pn(s).toVar(),o=pn(r).toVar(),u=pn(t).toVar(),l=pn(e).toVar(),d=gn(gn(5)).toVar(),c=gn().toVar(),h=gn().toVar(),p=gn().toVar();return c.assign(h.assign(p.assign(gn(pn(3735928559)).add(d.shiftLeft(gn(2))).add(gn(13))))),c.addAssign(gn(l)),h.addAssign(gn(u)),p.addAssign(gn(o)),gv(c,h,p),c.addAssign(gn(a)),h.addAssign(gn(n)),mv(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"}]})]),xv=lb([an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(bv(s,r)).toVar(),n=vn().toVar();return n.x.assign(i.bitAnd(pn(255))),n.y.assign(i.shiftRight(pn(8)).bitAnd(pn(255))),n.z.assign(i.shiftRight(pn(16)).bitAnd(pn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(bv(n,i,s)).toVar(),o=vn().toVar();return o.x.assign(a.bitAnd(pn(255))),o.y.assign(a.shiftRight(pn(8)).bitAnd(pn(255))),o.z.assign(a.shiftRight(pn(16)).bitAnd(pn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Tv=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=hn(tv(nv(bv(r,s),i,n),nv(bv(r.add(pn(1)),s),i.sub(1),n),nv(bv(r,s.add(pn(1))),i,n.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=hn(rv(nv(bv(r,s,i),n,a,o),nv(bv(r.add(pn(1)),s,i),n.sub(1),a,o),nv(bv(r,s.add(pn(1)),i),n,a.sub(1),o),nv(bv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),nv(bv(r,s,i.add(pn(1))),n,a,o.sub(1)),nv(bv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),nv(bv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),_v=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=Tn(tv(uv(xv(r,s),i,n),uv(xv(r.add(pn(1)),s),i.sub(1),n),uv(xv(r,s.add(pn(1))),i,n.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=Tn(rv(uv(xv(r,s,i),n,a,o),uv(xv(r.add(pn(1)),s,i),n.sub(1),a,o),uv(xv(r,s.add(pn(1)),i),n,a.sub(1),o),uv(xv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),uv(xv(r,s,i.add(pn(1))),n,a,o.sub(1)),uv(xv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),uv(xv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),vv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return fv(bv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return fv(bv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return fv(bv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return fv(bv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Nv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return Tn(fv(bv(r,pn(0))),fv(bv(r,pn(1))),fv(bv(r,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return Tn(fv(bv(r,s,pn(0))),fv(bv(r,s,pn(1))),fv(bv(r,s,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return Tn(fv(bv(r,s,i,pn(0))),fv(bv(r,s,i,pn(1))),fv(bv(r,s,i,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return Tn(fv(bv(r,s,i,n,pn(0))),fv(bv(r,s,i,n,pn(1))),fv(bv(r,s,i,n,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Sv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=hn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(Tv(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"}]}),Rv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(_v(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"}]}),Av=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar();return fn(Sv(o,a,n,i),Sv(o.add(Tn(pn(19),pn(193),pn(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"}]}),Ev=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(Rv(o,a,n,i)).toVar(),l=hn(Sv(o.add(Tn(pn(19),pn(193),pn(17))),a,n,i)).toVar();return Sn(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"}]}),wv=lb([an(([e,t,r,s,i,n,a])=>{const o=pn(a).toVar(),u=hn(n).toVar(),l=pn(i).toVar(),d=pn(s).toVar(),c=pn(r).toVar(),h=pn(t).toVar(),p=fn(e).toVar(),g=Tn(Nv(fn(h.add(d),c.add(l)))).toVar(),m=fn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=fn(fn(hn(h),hn(c)).add(m)).toVar(),y=fn(f.sub(p)).toVar();return ln(o.equal(pn(2)),()=>wo(y.x).add(wo(y.y))),ln(o.equal(pn(3)),()=>$o(wo(y.x),wo(y.y))),Xo(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"}]}),an(([e,t,r,s,i,n,a,o,u])=>{const l=pn(u).toVar(),d=hn(o).toVar(),c=pn(a).toVar(),h=pn(n).toVar(),p=pn(i).toVar(),g=pn(s).toVar(),m=pn(r).toVar(),f=pn(t).toVar(),y=Tn(e).toVar(),b=Tn(Nv(Tn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Tn(Tn(hn(f),hn(m),hn(g)).add(b)).toVar(),T=Tn(x.sub(y)).toVar();return ln(l.equal(pn(2)),()=>wo(T.x).add(wo(T.y)).add(wo(T.z))),ln(l.equal(pn(3)),()=>$o(wo(T.x),wo(T.y),wo(T.z))),Xo(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"}]})]),Cv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();l.assign(zo(l,r))})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Mv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Bv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(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)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Pv=lb([Cv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(zo(d,n))})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Lv=lb([Mv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Fv=lb([Bv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(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)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Dv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=fn(t).toVar(),p=fn(r).toVar(),g=fn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(Tn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Uv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Iv=an(([e])=>{const t=e.y,r=e.z,s=Tn().toVar();return ln(t.lessThan(1e-4),()=>{s.assign(Tn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(bo(i)).mul(6).toVar();const n=pn(Io(i)),a=i.sub(hn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ln(n.equal(pn(0)),()=>{s.assign(Tn(r,l,o))}).ElseIf(n.equal(pn(1)),()=>{s.assign(Tn(u,r,o))}).ElseIf(n.equal(pn(2)),()=>{s.assign(Tn(o,r,l))}).ElseIf(n.equal(pn(3)),()=>{s.assign(Tn(o,u,r))}).ElseIf(n.equal(pn(4)),()=>{s.assign(Tn(l,o,r))}).Else(()=>{s.assign(Tn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Ov=an(([e])=>{const t=Tn(e).toVar(),r=hn(t.x).toVar(),s=hn(t.y).toVar(),i=hn(t.z).toVar(),n=hn(zo(r,zo(s,i))).toVar(),a=hn($o(r,$o(s,i))).toVar(),o=hn(a.sub(n)).toVar(),u=hn().toVar(),l=hn().toVar(),d=hn().toVar();return d.assign(a),ln(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ln(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ln(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(wa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(wa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ln(u.lessThan(0),()=>{u.addAssign(1)})}),Tn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Vv=an(([e])=>{const t=Tn(e).toVar(),r=Nn(Ua(t,Tn(.04045))).toVar(),s=Tn(t.div(12.92)).toVar(),i=Tn(Yo($o(t.add(Tn(.055)),Tn(0)).div(1.055),Tn(2.4))).toVar();return su(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),kv=(e,t)=>{e=hn(e),t=hn(t);const r=fn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ou(e.sub(r),e.add(r),t)},Gv=(e,t,r,s)=>su(e,t,r[s].clamp()),zv=(e,t,r,s,i)=>su(e,t,kv(r,s[i])),$v=an(([e,t,r])=>{const s=To(e).toVar(),i=Ca(hn(.5).mul(t.sub(r)),Bd).div(s).toVar(),n=Ca(hn(-.5).mul(t.sub(r)),Bd).div(s).toVar(),a=Tn().toVar();a.x=s.x.greaterThan(hn(0)).select(i.x,n.x),a.y=s.y.greaterThan(hn(0)).select(i.y,n.y),a.z=s.z.greaterThan(hn(0)).select(i.z,n.z);const o=zo(a.x,a.y,a.z).toVar();return Bd.add(s.mul(o)).toVar().sub(r)}),Wv=an(([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(Ma(r,r).sub(Ma(s,s)))),n});var Hv=Object.freeze({__proto__:null,BRDF_GGX:Lg,BRDF_Lambert:bg,BasicPointShadowFilter:k_,BasicShadowFilter:m_,Break:ap,Const:Eu,Continue:()=>hl("continue").toStack(),DFGLUT:Ug,D_GGX:Mg,Discard:pl,EPSILON:to,F_Schlick:yg,Fn:an,HALF_PI:ao,INFINITY:ro,If:ln,Loop:np,NodeAccess:Js,NodeShaderStage:Ys,NodeType:Zs,NodeUpdateType:Qs,OnBeforeMaterialUpdate:e=>Yb(Kb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>Yb(Kb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>Yb(Kb.MATERIAL,e),OnObjectUpdate:e=>Yb(Kb.OBJECT,e),PCFShadowFilter:f_,PCFSoftShadowFilter:y_,PI:so,PI2:io,PointShadowFilter:G_,Return:()=>hl("return").toStack(),Schlick_to_F0:Vg,ScriptableNodeResources:Kx,ShaderNode:Ki,Stack:dn,Switch:(...e)=>xi.Switch(...e),TBNViewMatrix:kc,TWO_PI:no,VSMShadowFilter:b_,V_GGX_SmithCorrelated:wg,Var:Au,VarIntent:wu,abs:wo,acesFilmicToneMapping:Dx,acos:Ao,add:wa,addMethodChaining:_i,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Vx,all:oo,alphaT:Xn,and:Va,anisotropy:Kn,anisotropyB:Qn,anisotropyT:Yn,any:uo,append:e=>(d("TSL: append() has been renamed to Stack()."),dn(e)),array:_a,arrayBuffer:e=>new yi(e,"ArrayBuffer"),asin:Ro,assign:Na,atan:Eo,atomicAdd:(e,t)=>bT(fT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>bT(fT.ATOMIC_AND,e,t),atomicFunc:bT,atomicLoad:e=>bT(fT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>bT(fT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>bT(fT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>bT(fT.ATOMIC_OR,e,t),atomicStore:(e,t)=>bT(fT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>bT(fT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>bT(fT.ATOMIC_XOR,e,t),attenuationColor:da,attenuationDistance:la,attribute:vl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Zb(e,r,s);return Gh(i,t,e)},backgroundBlurriness:ix,backgroundIntensity:nx,backgroundRotation:ax,batch:ep,bentNormalView:zc,billboarding:mb,bitAnd:$a,bitNot:Wa,bitOr:Ha,bitXor:ja,bitangentGeometry:Uc,bitangentLocal:Ic,bitangentView:Oc,bitangentWorld:Vc,bitcast:Gy,blendBurn:Vp,blendColor:$p,blendDodge:kp,blendOverlay:zp,blendScreen:Gp,blur:Vm,bool:mn,buffer:Fl,bufferAttribute:Qu,builtin:Ol,builtinAOContext:vu,builtinShadowContext:_u,bumpMap:Yc,bvec2:xn,bvec3:Nn,bvec4:En,bypass:ol,cache:nl,call:Ra,cameraFar:Jl,cameraIndex:Ql,cameraNear:Zl,cameraNormalMatrix:id,cameraPosition:nd,cameraProjectionMatrix:ed,cameraProjectionMatrixInverse:td,cameraViewMatrix:rd,cameraViewport:ad,cameraWorldMatrix:sd,cbrt:tu,cdl:Nx,ceil:xo,checker:K_,cineonToneMapping:Lx,clamp:iu,clearcoat:Gn,clearcoatNormalView:jd,clearcoatRoughness:zn,code:zx,color:cn,colorSpaceToWorking:Vu,colorToDirection:e=>Yi(e).mul(2).sub(1),compute:rl,computeKernel:tl,computeSkinning:(e,t=null)=>{const r=new rp(e);return r.positionNode=Gh(new H(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinIndexNode=Gh(new H(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinWeightNode=Gh(new H(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.bindMatrixNode=xa(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=xa(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Fl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Yi(r)},context:bu,convert:Pn,convertColorSpace:(e,t,r)=>Yi(new Iu(Yi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():zb(e,...t),cos:No,countLeadingZeros:jy,countOneBits:qy,countTrailingZeros:Hy,cross:Ko,cubeTexture:dc,cubeTextureBase:lc,dFdx:Lo,dFdy:Fo,dashSize:sa,debug:yl,decrement:Za,decrementBefore:Ya,defaultBuildStages:ti,defaultShaderStages:ei,defined:qi,degrees:co,deltaTime:cb,densityFogFactor:eT,depth:Mp,depthPass:(e,t,r)=>new Cx(Cx.DEPTH,e,t,r),determinant:ko,difference:qo,diffuseColor:Un,diffuseContribution:In,directPointLight:q_,directionToColor:$c,directionToFaceDirection:Od,dispersion:ca,disposeShadowMaterial:__,distance:jo,div:Ba,dot:Xo,drawIndex:Xh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x),element:Bn,emissive:On,equal:La,equirectUV:ig,exp:ho,exp2:po,expression:hl,faceDirection:Id,faceForward:uu,faceforward:pu,float:hn,floatBitsToInt:e=>new ky(e,"int","float"),floatBitsToUint:zy,floor:bo,fog:tT,fract:_o,frameGroup:ma,frameId:hb,frontFacing:Ud,fwidth:Oo,gain:(e,t)=>e.lessThan(.5)?Ky(e.mul(2),t).div(2):Ca(1,Ky(Ma(Ca(1,e),2),t).div(2)),gapSize:ia,getConstNodeType:Xi,getCurrentStack:un,getDirection:Dm,getDistanceAttenuation:j_,getGeometryRoughness:Ag,getNormalFromDepth:Hb,getParallaxCorrectNormal:$v,getRoughness:Eg,getScreenPosition:Wb,getShIrradianceAt:Wv,getShadowMaterial:T_,getShadowRenderObjectFunction:S_,getTextureIndex:Iy,getViewPosition:$b,ggxConvolution:$m,globalId:dT,glsl:(e,t)=>zx(e,t,"glsl"),glslFn:(e,t)=>Wx(e,t,"glsl"),grayscale:bx,greaterThan:Ua,greaterThanEqual:Oa,hash:Xy,highpModelNormalViewMatrix:Ed,highpModelViewMatrix:Ad,hue:_x,increment:Qa,incrementBefore:Ka,inspector:Tl,instance:Yh,instanceIndex:Wh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Qb(e,r,s);return Gh(i,t,e)},instancedBufferAttribute:Zu,instancedDynamicBufferAttribute:Ju,instancedMesh:Zh,int:pn,intBitsToFloat:e=>new ky(e,"float","int"),interleavedGradientNoise:jb,inverse:Go,inverseSqrt:yo,inversesqrt:gu,invocationLocalIndex:qh,invocationSubgroupIndex:jh,ior:aa,iridescence:Hn,iridescenceIOR:jn,iridescenceThickness:qn,isolate:il,ivec2:yn,ivec3:_n,ivec4:Rn,js:(e,t)=>zx(e,t,"js"),label:Nu,length:Mo,lengthSq:ru,lessThan:Da,lessThanEqual:Ia,lightPosition:KT,lightProjectionUV:XT,lightShadowMatrix:qT,lightTargetDirection:ZT,lightTargetPosition:YT,lightViewPosition:QT,lightingContext:mp,lights:(e=[])=>(new r_).setLights(e),linearDepth:Bp,linearToneMapping:Bx,localId:cT,log:go,log2:mo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(go(r.div(t)));return hn(Math.E).pow(s).mul(t).negate()},luminance:vx,mat2:wn,mat3:Cn,mat4:Mn,matcapUV:wf,materialAO:Dh,materialAlphaTest:Jc,materialAnisotropy:bh,materialAnisotropyVector:Uh,materialAttenuationColor:Ah,materialAttenuationDistance:Rh,materialClearcoat:hh,materialClearcoatNormal:gh,materialClearcoatRoughness:ph,materialColor:eh,materialDispersion:Lh,materialEmissive:rh,materialEnvIntensity:tc,materialEnvRotation:rc,materialIOR:Sh,materialIridescence:xh,materialIridescenceIOR:Th,materialIridescenceThickness:_h,materialLightMap:Fh,materialLineDashOffset:Bh,materialLineDashSize:wh,materialLineGapSize:Ch,materialLineScale:Eh,materialLineWidth:Mh,materialMetalness:dh,materialNormal:ch,materialOpacity:sh,materialPointSize:Ph,materialReference:fc,materialReflectivity:uh,materialRefractionRatio:ec,materialRotation:mh,materialRoughness:lh,materialSheen:fh,materialSheenRoughness:yh,materialShininess:th,materialSpecular:ih,materialSpecularColor:ah,materialSpecularIntensity:nh,materialSpecularStrength:oh,materialThickness:Nh,materialTransmission:vh,max:$o,maxMipLevel:El,mediumpModelViewMatrix:Rd,metalness:kn,min:zo,mix:su,mixElement:du,mod:Pa,modInt:Ja,modelDirection:fd,modelNormalMatrix:vd,modelPosition:bd,modelRadius:_d,modelScale:xd,modelViewMatrix:Sd,modelViewPosition:Td,modelViewProjection:Ih,modelWorldMatrix:yd,modelWorldMatrixInverse:Nd,morphReference:cp,mrt:Vy,mul:Ma,mx_aastep:kv,mx_add:(e,t=hn(0))=>wa(e,t),mx_atan2:(e=hn(0),t=hn(1))=>Eo(e,t),mx_cell_noise_float:(e=Nl())=>vv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>hn(e).sub(r).mul(t).add(r),mx_divide:(e,t=hn(1))=>Ba(e,t),mx_fractal_noise_float:(e=Nl(),t=3,r=2,s=.5,i=1)=>Sv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Nl(),t=3,r=2,s=.5,i=1)=>Av(e,pn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Nl(),t=3,r=2,s=.5,i=1)=>Rv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Nl(),t=3,r=2,s=.5,i=1)=>Ev(e,pn(t),r,s).mul(i),mx_frame:()=>hb,mx_heighttonormal:(e,t)=>(e=Tn(e),t=hn(t),Yc(e,t)),mx_hsvtorgb:Iv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=hn(1))=>Ca(t,e),mx_modulo:(e,t=hn(1))=>Pa(e,t),mx_multiply:(e,t=hn(1))=>Ma(e,t),mx_noise_float:(e=Nl(),t=1,r=0)=>Tv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Nl(),t=1,r=0)=>_v(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Nl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Sn(_v(e),Tv(e.add(fn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=fn(.5,.5),r=fn(1,1),s=hn(0),i=fn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=fn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=hn(1))=>Yo(e,t),mx_ramp4:(e,t,r,s,i=Nl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=su(e,t,n),u=su(r,s,n);return su(o,u,a)},mx_ramplr:(e,t,r=Nl())=>Gv(e,t,r,"x"),mx_ramptb:(e,t,r=Nl())=>Gv(e,t,r,"y"),mx_rgbtohsv:Ov,mx_rotate2d:(e,t)=>{e=fn(e);const r=(t=hn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=Tn(e),t=hn(t),r=Tn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=hn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=hn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Nl())=>zv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Nl())=>zv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Vv,mx_subtract:(e,t=hn(0))=>Ca(e,t),mx_timer:()=>db,mx_transform_uv:(e=1,t=0,r=Nl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Dv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Uv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Nl(),t=1)=>Pv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec2:(e=Nl(),t=1)=>Lv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec3:(e=Nl(),t=1)=>Fv(e.convert("vec2|vec3"),t,pn(1)),negate:Bo,neutralToneMapping:kx,nodeArray:Ji,nodeImmutable:tn,nodeObject:Yi,nodeObjectIntent:Qi,nodeObjects:Zi,nodeProxy:en,nodeProxyIntent:rn,normalFlat:Gd,normalGeometry:Vd,normalLocal:kd,normalMap:jc,normalView:Wd,normalViewGeometry:zd,normalWorld:Hd,normalWorldGeometry:$d,normalize:To,not:Ga,notEqual:Fa,numWorkgroups:uT,objectDirection:ld,objectGroup:ya,objectPosition:cd,objectRadius:gd,objectScale:hd,objectViewPosition:pd,objectWorldMatrix:dd,oneMinus:Po,or:ka,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=db)=>e.fract(),oscSine:(e=db)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=db)=>e.fract().round(),oscTriangle:(e=db)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ra,outputStruct:Uy,overloadingFn:lb,packHalf2x16:Jy,packSnorm2x16:Qy,packUnorm2x16:Zy,parabola:Ky,parallaxDirection:Gc,parallaxUV:(e,t)=>e.sub(Gc.mul(t)),parameter:(e,t)=>new My(e,t),pass:(e,t,r)=>new Cx(Cx.COLOR,e,t,r),passTexture:(e,t)=>new Ex(e,t),pcurve:(e,t,r)=>Yo(Ba(Yo(e,t),wa(Yo(e,t),Yo(Ca(1,e),r))),1/t),perspectiveDepthToViewZ:Ep,pmremTexture:pf,pointShadow:W_,pointUV:ex,pointWidth:na,positionGeometry:wd,positionLocal:Cd,positionPrevious:Md,positionView:Ld,positionViewDirection:Fd,positionWorld:Bd,positionWorldDirection:Pd,posterize:Rx,pow:Yo,pow2:Qo,pow3:Zo,pow4:Jo,premultiplyAlpha:Wp,property:Fn,quadBroadcast:WT,quadSwapDiagonal:OT,quadSwapX:UT,quadSwapY:IT,radians:lo,rand:lu,range:nT,rangeFogFactor:Jx,reciprocal:Uo,reference:pc,referenceBuffer:gc,reflect:Ho,reflectVector:nc,reflectView:sc,reflector:e=>new Fb(e),refract:au,refractVector:ac,refractView:ic,reinhardToneMapping:Px,remap:ll,remapClamp:dl,renderGroup:fa,renderOutput:ml,rendererReference:$u,replaceDefaultUV:function(e,t=null){return bu(t,{getUV:e})},rotate:Pf,rotateUV:pb,roughness:Vn,round:Do,rtt:zb,sRGBTransferEOTF:Fu,sRGBTransferOETF:Du,sample:(e,t=null)=>new Xb(e,Yi(t)),sampler:e=>(!0===e.isNode?e:Bl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Bl(e)).convert("samplerComparison"),saturate:nu,saturation:xx,screenCoordinate:Hl,screenDPR:zl,screenSize:Wl,screenUV:$l,scriptable:Qx,scriptableValue:jx,select:fu,setCurrentStack:on,setName:Tu,shaderStages:ri,shadow:B_,shadowPositionWorld:i_,shapeCircle:Y_,sharedUniformGroup:ga,sheen:$n,sheenRoughness:Wn,shiftLeft:qa,shiftRight:Xa,shininess:ta,sign:Co,sin:vo,sinc:(e,t)=>vo(so.mul(t.mul(e).sub(1))).div(so.mul(t.mul(e).sub(1))),skinning:sp,smoothstep:ou,smoothstepElement:cu,specularColor:Zn,specularColorBlended:Jn,specularF90:ea,spherizeUV:gb,split:(e,t)=>Yi(new hi(Yi(e),t)),spritesheetUV:bb,sqrt:fo,stack:Py,step:Wo,stepElement:hu,storage:Gh,storageBarrier:()=>pT("storage").toStack(),storageTexture:ux,string:(e="")=>new yi(e,"string"),struct:(e,t=null)=>{const r=new Ly(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;ecx(e,t).level(r),texture3DLoad:(...e)=>cx(...e).setSampler(!1),textureBarrier:()=>pT("texture").toStack(),textureBicubic:nm,textureBicubicLevel:im,textureCubeUV:Um,textureLevel:(e,t,r)=>Bl(e,t).level(r),textureLoad:Pl,textureSize:Rl,textureStore:(e,t,r)=>{const s=ux(e,t,r);return null!==r&&s.toStack(),s},thickness:ua,time:db,toneMapping:Hu,toneMappingExposure:ju,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Yi(new Mx(t,r,Yi(s),Yi(i),Yi(n))),transformDirection:eu,transformNormal:qd,transformNormalToView:Xd,transformedClearcoatNormalView:Qd,transformedNormalView:Kd,transformedNormalWorld:Yd,transmission:oa,transpose:Vo,triNoise3D:ab,triplanarTexture:(...e)=>xb(...e),triplanarTextures:xb,trunc:Io,uint:gn,uintBitsToFloat:e=>new ky(e,"float","uint"),uniform:xa,uniformArray:Il,uniformCubeTexture:(e=oc)=>lc(e),uniformFlow:xu,uniformGroup:pa,uniformTexture:(e=wl)=>Bl(e),unpackHalf2x16:sb,unpackNormal:Wc,unpackSnorm2x16:tb,unpackUnorm2x16:rb,unpremultiplyAlpha:Hp,userData:(e,t,r)=>new hx(e,t,r),uv:Nl,uvec2:bn,uvec3:vn,uvec4:An,varying:Pu,varyingProperty:Dn,vec2:fn,vec3:Tn,vec4:Sn,vectorComponents:si,velocity:yx,vertexColor:Op,vertexIndex:$h,vertexStage:Lu,vibrance:Tx,viewZToLogarithmicDepth:wp,viewZToOrthographicDepth:Rp,viewZToPerspectiveDepth:Ap,viewport:jl,viewportCoordinate:Xl,viewportDepthTexture:Np,viewportLinearDepth:Pp,viewportMipTexture:Tp,viewportResolution:Yl,viewportSafeUV:fb,viewportSharedTexture:Jp,viewportSize:ql,viewportTexture:xp,viewportUV:Kl,vogelDiskSample:qb,wgsl:(e,t)=>zx(e,t,"wgsl"),wgslFn:(e,t)=>Wx(e,t,"wgsl"),workgroupArray:(e,t)=>new mT("Workgroup",e,t),workgroupBarrier:()=>pT("workgroup").toStack(),workgroupId:lT,workingToColorSpace:Ou,xor:za});const jv=new Cy;class qv extends Jf{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(jv),jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(jv),jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=Sn(l).mul(nx).context({getUV:()=>ax.mul($d),getTextureLevel:()=>ix}),p=ed.element(3).element(3).equal(1),g=Ba(1,ed.element(1).element(1)).mul(3),m=p.select(Cd.mul(g),Cd),f=Sd.mul(Sn(m,0));let y=ed.mul(Sn(f.xyz,1));y=y.setZ(y.w);const b=new jp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new Ye(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=Sn(l).mul(nx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?jv.set(0,0,0,1):"alpha-blend"===a&&jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=jv.r,T.g=jv.g,T.b=jv.b,T.a=jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.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 Xv=0;class Kv{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=Xv++}}class Yv{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 Kv(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Qv{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Zv{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 Jv{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class eN extends Jv{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class tN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let rN=0;class sN{constructor(e=null){this.id=rN++,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 iN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class nN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class aN extends nN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class oN extends nN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class uN extends nN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class lN extends nN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class dN extends nN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class cN extends nN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class hN extends nN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class pN extends nN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class gN extends aN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class mN extends oN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class fN extends uN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class yN extends lN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class bN extends dN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class xN extends cN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class TN extends hN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let vN=0;const NN=new WeakMap,SN=new WeakMap,RN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),AN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class EN{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.types={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=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new sN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:vN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===Qe&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=SN.get(this.renderer);return void 0===e&&(e=new Xf,SN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ng(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 Kv(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Kv(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 ri)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")}( ${AN(n.r)}, ${AN(n.g)}, ${AN(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 Qv(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===R)return"int";if(t===S)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=Vs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return RN.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 et||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=un();return this.stacks.push(e),on(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,on(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);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Qv("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new iN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 Zv(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new Jv(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}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"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new eN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}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,d(`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 tN("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 $x,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 My(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),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 sN,this.stack=Py();for(const r of ti)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(){d("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.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new jp),e.build(this)}else this.addFlow("compute",e);for(const e of ti){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of ri){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}getSharedDataFromNode(e){let t=NN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new gN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new mN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new fN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new yN(e);else if("color"===t)s=new bN(e);else if("mat2"===t)s=new xN(e);else if("mat3"===t)s=new TN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new _N(e)}r.cache=s}return s}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${tt} - Node System\n`}}class wN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Qs.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Qs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Qs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Qs.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 CN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}CN.isNodeFunctionInput=!0;class MN extends H_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:ZT(this.light),lightColor:e}}}const BN=new a,PN=new a;let LN=null;class FN extends H_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=xa(new r).setGroup(fa),this.halfWidth=xa(new r).setGroup(fa),this.updateType=Qs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;PN.identity(),BN.copy(t.matrixWorld),BN.premultiply(r),PN.extractRotation(BN),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(PN),this.halfHeight.value.applyMatrix4(PN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Bl(LN.LTC_FLOAT_1),r=Bl(LN.LTC_FLOAT_2)):(t=Bl(LN.LTC_HALF_1),r=Bl(LN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:QT(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){LN=e}}class DN extends H_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=xa(0).setGroup(fa),this.penumbraCosNode=xa(0).setGroup(fa),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(0).setGroup(fa),this.colorNode=xa(this.color).setGroup(fa)}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,t){const{coneCosNode:r,penumbraCosNode:s}=this;return ou(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=XT(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(ZT(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=j_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Bl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class UN extends DN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Bl(r,fn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const IN=an(([e,t])=>{const r=e.abs().sub(t);return Mo($o(r,0)).add(zo($o(r.x,r.y),0))});class ON extends DN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=hn(0),r=this.penumbraCosNode,s=qT(this.light).mul(e.context.positionWorld||Bd);return ln(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=IN(e.xy.sub(fn(.5)),fn(.5)),n=Ba(-1,Ca(1,Ao(r)).sub(1));t.assign(nu(i.mul(-2).mul(n)))}),t}}class VN extends H_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class kN extends H_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=KT(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=xa(new e).setGroup(fa)}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=Hd.dot(s).mul(.5).add(.5),n=su(r,t,i);e.context.irradiance.addAssign(n)}}class GN extends H_{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=Wv(Hd,this.lightProbe);e.context.irradiance.addAssign(t)}}class zN{parseFunction(){d("Abstract function.")}}class $N{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}$N.isNodeFunction=!0;const WN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,HN=/[a-z_0-9]+/gi,jN="#pragma main";class qN extends $N{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(jN),r=-1!==t?e.slice(t+12):e,s=r.match(WN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=HN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new jp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new Yv(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){YN[0]=e,YN[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(YN)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&QN.push(t.getCacheKey(!0)),i&&QN.push(i.getCacheKey()),n&&QN.push(n.getCacheKey()),QN.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),QN.push(this.renderer.shadowMap.enabled?1:0),QN.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Ds(QN),this.callHashCache.set(YN,s),QN.length=0}return YN.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return pf(r);{let e;return e=!0===r.isCubeTexture?dc(r):Bl(r),dg(e)}}if(!0===r.isTexture)return Bl(r,$l.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=pc("color","color",r).setGroup(fa),t=pc("density","float",r).setGroup(fa);return tT(e,eT(t))}if(r.isFog){const e=pc("color","color",r).setGroup(fa),t=pc("near","float",r).setGroup(fa),s=pc("far","float",r).setGroup(fa);return tT(e,Jx(t,s))}o("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?dc(r):!0===r.isTexture?Bl(r):void o("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 KN.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?cx(e,Tn($l,Ol("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Bl(e,$l).renderOutput(t.toneMapping,t.currentColorSpace);return KN.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 wN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const JN=new ze;class eS{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._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new uS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,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),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;hS(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 fS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function yS(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(this._renderTarget,this._mrt),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(){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 ZN(this,r),this._animation=new qf(this,this._nodes,this.info),this._attributes=new ny(r),this._background=new qv(this,this._nodes),this._geometries=new uy(this._attributes,this.info),this._textures=new wy(this,r,this.info),this._pipelines=new my(r,this._nodes),this._bindings=new fy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Zf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new vy(this.lighting),this._bundles=new sS,this._renderContexts=new Ay,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:xS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new eS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Ad,t.modelNormalViewMatrix=Ed):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Ad&&e.modelNormalViewMatrix===Ed}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(_S),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(_S),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new eS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?NS:vS;t.isArrayCamera||(SS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(SS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=TS.width,g.height=TS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(RS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_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)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=RS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=RS.copy(t).floor()}else t=RS.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?NS:vS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&RS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(SS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,RS.z,null,i)}}else if(e.isLineLoop)o("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?NS:vS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),RS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(SS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=it;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);e.side=null===i.shadowSide?i.side:i.shadowSide,null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=it,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class ES{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class wS extends ES{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(iy-e%iy)%iy;var e}get buffer(){return this._buffer}update(){return!0}}class CS extends wS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let MS=0;class BS extends CS{constructor(e,t){super("UniformBuffer_"+MS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class PS extends CS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let US=0;class IS extends DS{constructor(e,t){super(e,t),this.id=US++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class OS extends IS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class VS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class kS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const GS={bitcast_int_uint:new Gx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Gx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},zS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},$S={low:"lowp",medium:"mediump",high:"highp"},WS={swizzleAssign:!0,storageBuffer:!1},HS={perspective:"smooth",linear:"noperspective"},jS={centroid:"centroid"},qS="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class XS extends EN{constructor(e,t){super(e,t,new XN),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=GS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==GS[e]&&this._include(e),zS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?mt:ft;2===s?n=i?Tt:G:3===s?n=i?_t:vt:4===s&&(n=i?Nt:Re);const a={Float32Array:q,Uint8Array:Ge,Uint16Array:xt,Uint32Array:S,Int8Array:bt,Int16Array:yt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=$S[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=$S[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${HS[s.interpolationType]||s.interpolationType} ${jS[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+=`${HS[e.interpolationType]||e.interpolationType} ${jS[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=WS[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)}WS[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 OS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new VS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new kS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new BS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new FS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let KS=null,YS=null;class QS{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[St.RENDER]:null,[St.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?St.COMPUTE:St.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return KS=KS||new t,this.renderer.getDrawingBufferSize(KS)}setScissorTest(){}getClearColor(){const e=this.renderer;return YS=YS||new Cy,e.getClearColor(YS),YS.getRGB(YS),YS}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Rt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}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)}deleteBindGroupData(){}dispose(){}}let ZS,JS,eR=0;class tR{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 rR{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("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_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===R,id:eR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new tR(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;e0?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 nR,aR,oR,uR=!1;class lR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===uR&&(this._init(),uR=!0)}_init(){const e=this.gl;nR={[Ur]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Dr]:e.MIRRORED_REPEAT},aR={[w]:e.NEAREST,[Ir]:e.NEAREST_MIPMAP_NEAREST,[Je]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[Ze]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},oR={[Wr]:e.NEVER,[$r]:e.ALWAYS,[E]:e.LESS,[zr]:e.LEQUAL,[Gr]:e.EQUAL,[kr]:e.GEQUAL,[Vr]:e.GREATER,[Or]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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)}return 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,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;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,o),r.texParameteri(e,r.TEXTURE_WRAP_S,nR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,nR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,nR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,aR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,aR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,oR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==Je&&t.minFilter!==K)return;if(t.type===q&&!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})}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.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?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)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){const t=jr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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));i.bindRenderbuffer(i.RENDERBUFFER,null)}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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function dR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class cR{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 hR{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 pR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class gR{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 v(`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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 yR extends QS{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.currentSamples>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 cR(this),this.capabilities=new hR(this),this.attributeUtils=new rR(this),this.textureUtils=new lR(this),this.bufferRenderer=new gR(this),this.state=new sR(this),this.utils=new iR(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"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new fR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(St.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;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;e{let a=0;for(let t=0;t1&&u.setMRTBlending(i.textures),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;const N=()=>{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,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()});return void t.push(i)}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");o("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&&d("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;epR[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ry(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const bR="point-list",xR="line-list",TR="line-strip",_R="triangle-list",vR="triangle-strip",NR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},SR="never",RR="less",AR="equal",ER="less-equal",wR="greater",CR="not-equal",MR="greater-equal",BR="always",PR="store",LR="load",FR="clear",DR="ccw",UR="cw",IR="none",OR="back",VR="uint16",kR="uint32",GR="r8unorm",zR="r8snorm",$R="r8uint",WR="r8sint",HR="r16uint",jR="r16sint",qR="r16float",XR="rg8unorm",KR="rg8snorm",YR="rg8uint",QR="rg8sint",ZR="r32uint",JR="r32sint",eA="r32float",tA="rg16uint",rA="rg16sint",sA="rg16float",iA="rgba8unorm",nA="rgba8unorm-srgb",aA="rgba8snorm",oA="rgba8uint",uA="rgba8sint",lA="bgra8unorm",dA="bgra8unorm-srgb",cA="rgb9e5ufloat",hA="rgb10a2unorm",pA="rg11b10ufloat",gA="rg32uint",mA="rg32sint",fA="rg32float",yA="rgba16uint",bA="rgba16sint",xA="rgba16float",TA="rgba32uint",_A="rgba32sint",vA="rgba32float",NA="depth16unorm",SA="depth24plus",RA="depth24plus-stencil8",AA="depth32float",EA="depth32float-stencil8",wA="bc1-rgba-unorm",CA="bc1-rgba-unorm-srgb",MA="bc2-rgba-unorm",BA="bc2-rgba-unorm-srgb",PA="bc3-rgba-unorm",LA="bc3-rgba-unorm-srgb",FA="bc4-r-unorm",DA="bc4-r-snorm",UA="bc5-rg-unorm",IA="bc5-rg-snorm",OA="bc6h-rgb-ufloat",VA="bc6h-rgb-float",kA="bc7-rgba-unorm",GA="bc7-rgba-unorm-srgb",zA="etc2-rgb8unorm",$A="etc2-rgb8unorm-srgb",WA="etc2-rgb8a1unorm",HA="etc2-rgb8a1unorm-srgb",jA="etc2-rgba8unorm",qA="etc2-rgba8unorm-srgb",XA="eac-r11unorm",KA="eac-r11snorm",YA="eac-rg11unorm",QA="eac-rg11snorm",ZA="astc-4x4-unorm",JA="astc-4x4-unorm-srgb",eE="astc-5x4-unorm",tE="astc-5x4-unorm-srgb",rE="astc-5x5-unorm",sE="astc-5x5-unorm-srgb",iE="astc-6x5-unorm",nE="astc-6x5-unorm-srgb",aE="astc-6x6-unorm",oE="astc-6x6-unorm-srgb",uE="astc-8x5-unorm",lE="astc-8x5-unorm-srgb",dE="astc-8x6-unorm",cE="astc-8x6-unorm-srgb",hE="astc-8x8-unorm",pE="astc-8x8-unorm-srgb",gE="astc-10x5-unorm",mE="astc-10x5-unorm-srgb",fE="astc-10x6-unorm",yE="astc-10x6-unorm-srgb",bE="astc-10x8-unorm",xE="astc-10x8-unorm-srgb",TE="astc-10x10-unorm",_E="astc-10x10-unorm-srgb",vE="astc-12x10-unorm",NE="astc-12x10-unorm-srgb",SE="astc-12x12-unorm",RE="astc-12x12-unorm-srgb",AE="clamp-to-edge",EE="repeat",wE="mirror-repeat",CE="linear",ME="nearest",BE="zero",PE="one",LE="src",FE="one-minus-src",DE="src-alpha",UE="one-minus-src-alpha",IE="dst",OE="one-minus-dst",VE="dst-alpha",kE="one-minus-dst-alpha",GE="src-alpha-saturated",zE="constant",$E="one-minus-constant",WE="add",HE="subtract",jE="reverse-subtract",qE="min",XE="max",KE=0,YE=15,QE="keep",ZE="zero",JE="replace",ew="invert",tw="increment-clamp",rw="decrement-clamp",sw="increment-wrap",iw="decrement-wrap",nw="storage",aw="read-only-storage",ow="write-only",uw="read-only",lw="read-write",dw="non-filtering",cw="comparison",hw="float",pw="unfilterable-float",gw="depth",mw="sint",fw="uint",yw="2d",bw="3d",xw="2d",Tw="2d-array",_w="cube",vw="3d",Nw="all",Sw="vertex",Rw="instance",Aw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Ew={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class ww extends DS{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Cw extends wS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Mw=0;class Bw extends Cw{constructor(e,t){super("StorageBuffer_"+Mw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Js.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Pw extends Jf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:CE}),this.flipYSampler=e.createSampler({minFilter:ME}),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:vR,stripIndexFormat:kR},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:vR,stripIndexFormat:kR},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:xw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,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:FR,storeOp:PR,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,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Pw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,Ow=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,Vw={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 kw extends $N{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Iw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Ow.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 Gw extends zN{parseFunction(e){return new kw(e)}}const zw={[Js.READ_ONLY]:"read",[Js.WRITE_ONLY]:"write",[Js.READ_WRITE]:"read_write"},$w={[Ur]:"repeat",[xe]:"clamp",[Dr]:"mirror"},Ww={vertex:NR.VERTEX,fragment:NR.FRAGMENT,compute:NR.COMPUTE},Hw={instance:!0,swizzleAssign:!1,storageBuffer:!0},jw={"^^":"tsl_xor"},qw={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"},Xw={},Kw={tsl_xor:new Gx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Gx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Gx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Gx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Gx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Gx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Gx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Gx("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 Gx("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 Gx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Gx("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 Gx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Gx("\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")},Yw={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let Qw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Qw+="diagnostic( off, derivative_uniformity );\n");class Zw extends EN{constructor(e,t){super(e,t,new Gw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${$w[e.wrapS]}S_${$w[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=Xw[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Ur?(s.push(Kw.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(Kw.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Dr?(s.push(Kw.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Xw[t]=r=new Gx(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Su(new cl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Su(new cl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Su(new cl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===q||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=jw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),Js.READ_WRITE):Js.READ_ONLY:e.access}getStorageAccess(e,t){return zw[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new kS(i.name,i.node,o,n):new OS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new VS(i.name,i.node,o,n):"texture3D"===t&&(s=new kS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Ww[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new ww(`${i.name}_sampler`,i.node,o);e.setVisibility(Ww[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?BS:Bw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Ww[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new FS(u,o),e.setVisibility(Ww[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Ww[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Uw(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}n[e]={index:a.binding++,id:a.group,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return qw[e]||e}isAvailable(e){let t=Hw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Hw[e]=t),t}_getWGSLMethod(e){return void 0!==Kw[e]&&this._include(e),Yw[e]}_include(e){const t=Kw[e];return t.build(this),this.addInclude(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${Qw}\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){const[r,s,i]=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( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\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 Jw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=RA:e.depth&&(t=SA),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?bR:e.isLineSegments||e.isMesh&&!0===t.wireframe?xR:e.isLine?TR:e.isMesh?_R:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return lA;if(e===be)return xA;throw new Error("Unsupported output buffer type.")}}const eC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&eC.set(Float16Array,["float16"]);const tC=new Map([[et,["float16"]]]),rC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class sC{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=qr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Nw;let o;o=t.isSampledCubeTexture?_w:t.isSampledTexture3D?vw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Tw:xw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&NR.COMPUTE&&(s.access===Js.READ_WRITE||s.access===Js.WRITE_ONLY)?e.type=nw:e.type=aw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===Js.READ_WRITE?lw:t===Js.WRITE_ONLY?ow:uw,s.texture.isArrayTexture?e.viewDimension=Tw:s.texture.is3DTexture&&(e.viewDimension=vw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=pw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=pw:t.sampleType=gw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=mw:e===S?t.sampleType=fw:e===q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=hw:t.sampleType=pw)}s.isSampledCubeTexture?t.viewDimension=_w:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Tw:s.isSampledTexture3D&&(t.viewDimension=vw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=cw:t.type=dw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class aC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===Qe&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===nt){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:WE},r={srcFactor:i,dstFactor:n,operation:WE}};if(e.premultipliedAlpha)switch(s){case Qe:i(PE,UE,PE,UE);break;case $t:i(PE,PE,PE,PE);break;case zt:i(BE,FE,BE,PE);break;case Gt:i(IE,UE,BE,PE)}else switch(s){case Qe:i(DE,UE,PE,UE);break;case $t:i(DE,PE,PE,PE);break;case zt:o("WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Gt:o("WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ot:t=BE;break;case It:t=PE;break;case Ut:t=LE;break;case Bt:t=FE;break;case Dt:t=DE;break;case Mt:t=UE;break;case Lt:t=IE;break;case Ct:t=OE;break;case Pt:t=VE;break;case wt:t=kE;break;case Ft:t=GE;break;case 211:t=zE;break;case 212:t=$E;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ts:t=SR;break;case es:t=BR;break;case Jr:t=RR;break;case Zr:t=ER;break;case Qr:t=AR;break;case Yr:t=MR;break;case Kr:t=wR;break;case Xr:t=CR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case ls:t=QE;break;case us:t=ZE;break;case os:t=JE;break;case as:t=ew;break;case ns:t=tw;break;case is:t=rw;break;case ss:t=sw;break;case rs:t=iw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case at:t=WE;break;case Et:t=HE;break;case At:t=jE;break;case cs:t=qE;break;case ds:t=XE;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?VR:kR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?UR:DR,s.cullMode=r.side===B?IR:OR,s}_getColorWriteMask(e){return!0===e.colorWrite?YE:KE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=BR;else{const r=e.depthFunc;switch(r){case Qt:t=SR;break;case Yt:t=BR;break;case Kt:t=RR;break;case Xt:t=ER;break;case qt:t=AR;break;case jt:t=MR;break;case Ht:t=wR;break;case Wt:t=CR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class oC extends mR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 uC extends QS{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.defaultRenderPassdescriptor=null,this.utils=new Jw(this),this.attributeUtils=new sC(this),this.bindingUtils=new nC(this),this.pipelineUtils=new aC(this),this.textureUtils=new Dw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}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(Aw),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=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Aw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(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:LR}),this.initTimestampQuery(St.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("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===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){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(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new yR(e)));super(new t(e),e),this.library=new cC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class pC extends Rs{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class gC{constructor(e,t=Sn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new jp;r.name="PostProcessing",this._quadMesh=new Vb(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=ml(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class mC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class fC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.wrapR=xe,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class yC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class bC extends Zb{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class xC extends As{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Es(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):o(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]?(o("NodeLoader: Node type not found:",e),hn()):new this.nodes[e]}}class TC extends ws{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 _C extends Cs{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 xC;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 TC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t varying( node ); addMethodChaining( 'toVarying', varying ); addMethodChaining( 'toVertexStage', vertexStage ); -// Deprecated - -addMethodChaining( 'varying', ( ...params ) => { // @deprecated, r173 - - warn( 'TSL: .varying() has been renamed to .toVarying().' ); - return varying( ...params ); - -} ); - -addMethodChaining( 'vertexStage', ( ...params ) => { // @deprecated, r173 - - warn( 'TSL: .vertexStage() has been renamed to .toVertexStage().' ); - return varying( ...params ); - -} ); - /** * Converts the given color value from sRGB to linear-sRGB color space. * diff --git a/build/three.webgpu.nodes.min.js b/build/three.webgpu.nodes.min.js index fb3d5fd23c062f..019d2371068784 100644 --- a/build/three.webgpu.nodes.min.js +++ b/build/three.webgpu.nodes.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Color as e,Vector2 as t,Vector3 as r,Vector4 as s,Matrix2 as i,Matrix3 as n,Matrix4 as a,error as o,EventDispatcher as u,MathUtils as l,warn as d,WebGLCoordinateSystem as c,WebGPUCoordinateSystem as h,ColorManagement as p,SRGBTransfer as g,NoToneMapping as m,StaticDrawUsage as f,InterleavedBufferAttribute as y,InterleavedBuffer as b,DynamicDrawUsage as x,NoColorSpace as T,log as _,warnOnce as v,Texture as N,UnsignedIntType as S,IntType as R,Compatibility as A,LessCompare as E,NearestFilter as w,Sphere as C,BackSide as M,DoubleSide as B,Euler as P,CubeTexture as L,CubeReflectionMapping as F,CubeRefractionMapping as D,TangentSpaceNormalMap as U,NoNormalPacking as I,NormalRGPacking as O,NormalGAPacking as V,ObjectSpaceNormalMap as k,RGFormat as G,RED_GREEN_RGTC2_Format as z,RG11_EAC_Format as $,InstancedInterleavedBuffer as W,InstancedBufferAttribute as H,DataArrayTexture as j,FloatType as q,FramebufferTexture as X,LinearMipmapLinearFilter as K,DepthTexture as Y,Material as Q,LineBasicMaterial as Z,LineDashedMaterial as J,NoBlending as ee,MeshNormalMaterial as te,SRGBColorSpace as re,WebGLCubeRenderTarget as se,BoxGeometry as ie,Mesh as ne,Scene as ae,LinearFilter as oe,CubeCamera as ue,EquirectangularReflectionMapping as le,EquirectangularRefractionMapping as de,AddOperation as ce,MixOperation as he,MultiplyOperation as pe,MeshBasicMaterial as ge,MeshLambertMaterial as me,MeshPhongMaterial as fe,DataTexture as ye,HalfFloatType as be,ClampToEdgeWrapping as xe,BufferGeometry as Te,OrthographicCamera as _e,PerspectiveCamera as ve,RenderTarget as Ne,LinearSRGBColorSpace as Se,RGBAFormat as Re,CubeUVReflectionMapping as Ae,BufferAttribute as Ee,MeshStandardMaterial as we,MeshPhysicalMaterial as Ce,MeshToonMaterial as Me,MeshMatcapMaterial as Be,SpriteMaterial as Pe,PointsMaterial as Le,ShadowMaterial as Fe,Uint32BufferAttribute as De,Uint16BufferAttribute as Ue,arrayNeedsUint32 as Ie,DepthStencilFormat as Oe,DepthFormat as Ve,UnsignedInt248Type as ke,UnsignedByteType as Ge,Plane as ze,Object3D as $e,LinearMipMapLinearFilter as We,Float32BufferAttribute as He,UVMapping as je,VSMShadowMap as qe,BasicShadowMap as Xe,CubeDepthTexture as Ke,SphereGeometry as Ye,NormalBlending as Qe,LinearMipmapNearestFilter as Ze,NearestMipmapLinearFilter as Je,Float16BufferAttribute as et,REVISION as tt,ArrayCamera as rt,PlaneGeometry as st,FrontSide as it,CustomBlending as nt,AddEquation as at,ZeroFactor as ot,CylinderGeometry as ut,Quaternion as lt,WebXRController as dt,RAD2DEG as ct,PCFShadowMap as ht,FrustumArray as pt,Frustum as gt,RedIntegerFormat as mt,RedFormat as ft,ShortType as yt,ByteType as bt,UnsignedShortType as xt,RGIntegerFormat as Tt,RGBIntegerFormat as _t,RGBFormat as vt,RGBAIntegerFormat as Nt,TimestampQuery as St,createCanvasElement as Rt,ReverseSubtractEquation as At,SubtractEquation as Et,OneMinusDstAlphaFactor as wt,OneMinusDstColorFactor as Ct,OneMinusSrcAlphaFactor as Mt,OneMinusSrcColorFactor as Bt,DstAlphaFactor as Pt,DstColorFactor as Lt,SrcAlphaSaturateFactor as Ft,SrcAlphaFactor as Dt,SrcColorFactor as Ut,OneFactor as It,CullFaceNone as Ot,CullFaceBack as Vt,CullFaceFront as kt,MultiplyBlending as Gt,SubtractiveBlending as zt,AdditiveBlending as $t,NotEqualDepth as Wt,GreaterDepth as Ht,GreaterEqualDepth as jt,EqualDepth as qt,LessEqualDepth as Xt,LessDepth as Kt,AlwaysDepth as Yt,NeverDepth as Qt,UnsignedShort4444Type as Zt,UnsignedShort5551Type as Jt,UnsignedInt5999Type as er,UnsignedInt101111Type as tr,AlphaFormat as rr,RGB_S3TC_DXT1_Format as sr,RGBA_S3TC_DXT1_Format as ir,RGBA_S3TC_DXT3_Format as nr,RGBA_S3TC_DXT5_Format as ar,RGB_PVRTC_4BPPV1_Format as or,RGB_PVRTC_2BPPV1_Format as ur,RGBA_PVRTC_4BPPV1_Format as lr,RGBA_PVRTC_2BPPV1_Format as dr,RGB_ETC1_Format as cr,RGB_ETC2_Format as hr,RGBA_ETC2_EAC_Format as pr,R11_EAC_Format as gr,SIGNED_R11_EAC_Format as mr,SIGNED_RG11_EAC_Format as fr,RGBA_ASTC_4x4_Format as yr,RGBA_ASTC_5x4_Format as br,RGBA_ASTC_5x5_Format as xr,RGBA_ASTC_6x5_Format as Tr,RGBA_ASTC_6x6_Format as _r,RGBA_ASTC_8x5_Format as vr,RGBA_ASTC_8x6_Format as Nr,RGBA_ASTC_8x8_Format as Sr,RGBA_ASTC_10x5_Format as Rr,RGBA_ASTC_10x6_Format as Ar,RGBA_ASTC_10x8_Format as Er,RGBA_ASTC_10x10_Format as wr,RGBA_ASTC_12x10_Format as Cr,RGBA_ASTC_12x12_Format as Mr,RGBA_BPTC_Format as Br,RED_RGTC1_Format as Pr,SIGNED_RED_RGTC1_Format as Lr,SIGNED_RED_GREEN_RGTC2_Format as Fr,MirroredRepeatWrapping as Dr,RepeatWrapping as Ur,NearestMipmapNearestFilter as Ir,NotEqualCompare as Or,GreaterCompare as Vr,GreaterEqualCompare as kr,EqualCompare as Gr,LessEqualCompare as zr,AlwaysCompare as $r,NeverCompare as Wr,LinearTransfer as Hr,getByteLength as jr,isTypedArray as qr,NotEqualStencilFunc as Xr,GreaterStencilFunc as Kr,GreaterEqualStencilFunc as Yr,EqualStencilFunc as Qr,LessEqualStencilFunc as Zr,LessStencilFunc as Jr,AlwaysStencilFunc as es,NeverStencilFunc as ts,DecrementWrapStencilOp as rs,IncrementWrapStencilOp as ss,DecrementStencilOp as is,IncrementStencilOp as ns,InvertStencilOp as as,ReplaceStencilOp as os,ZeroStencilOp as us,KeepStencilOp as ls,MaxEquation as ds,MinEquation as cs,SpotLight as hs,PointLight as ps,DirectionalLight as gs,RectAreaLight as ms,AmbientLight as fs,HemisphereLight as ys,LightProbe as bs,LinearToneMapping as xs,ReinhardToneMapping as Ts,CineonToneMapping as _s,ACESFilmicToneMapping as vs,AgXToneMapping as Ns,NeutralToneMapping as Ss,Group as Rs,Loader as As,FileLoader as Es,MaterialLoader as ws,ObjectLoader as Cs}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,ConstantAlphaFactor,ConstantColorFactor,Controls,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CustomToneMapping,Cylindrical,Data3DTexture,DataTextureLoader,DataUtils,DefaultLoadingManager,DetachedBindMode,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,ExternalTexture,ExtrudeGeometry,Fog,FogExp2,GLBufferAttribute,GLSL1,GLSL3,GridHelper,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,InstancedBufferGeometry,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,KeyframeTrack,LOD,LatheGeometry,Layers,Light,Line,Line3,LineCurve,LineCurve3,LineLoop,LineSegments,LinearInterpolant,LinearMipMapNearestFilter,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,MeshDepthMaterial,MeshDistanceMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NormalAnimationBlendMode,NumberKeyframeTrack,OctahedronGeometry,OneMinusConstantAlphaFactor,OneMinusConstantColorFactor,PCFSoftShadowMap,Path,PlaneHelper,PointLightHelper,Points,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGB_BPTC_SIGNED_Format,RGB_BPTC_UNSIGNED_Format,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RenderTarget3D,RingGeometry,ShaderMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Spherical,SphericalHarmonics3,SplineCurve,SpotLightHelper,Sprite,StaticCopyUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGLRenderTarget,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";const Ms=["alphaMap","alphaTest","anisotropy","anisotropyMap","anisotropyRotation","aoMap","aoMapIntensity","attenuationColor","attenuationDistance","bumpMap","clearcoat","clearcoatMap","clearcoatNormalMap","clearcoatNormalScale","clearcoatRoughness","color","dispersion","displacementMap","emissive","emissiveIntensity","emissiveMap","envMap","envMapIntensity","gradientMap","ior","iridescence","iridescenceIOR","iridescenceMap","iridescenceThicknessMap","lightMap","lightMapIntensity","map","matcap","metalness","metalnessMap","normalMap","normalScale","opacity","roughness","roughnessMap","sheen","sheenColor","sheenColorMap","sheenRoughnessMap","shininess","specular","specularColor","specularColorMap","specularIntensity","specularIntensityMap","specularMap","thickness","transmission","transmissionMap"],Bs=new WeakMap;class Ps{constructor(e){this.renderObjects=new WeakMap,this.hasNode=this.containsNode(e),this.hasAnimation=!0===e.object.isSkinnedMesh,this.refreshUniforms=Ms,this.renderId=0}firstInitialization(e){return!1===this.renderObjects.has(e)&&(this.getRenderObjectData(e),!0)}needsVelocity(e){const t=e.getMRT();return null!==t&&t.has("velocity")}getRenderObjectData(e){let t=this.renderObjects.get(e);if(void 0===t){const{geometry:r,material:s,object:i}=e;if(t={material:this.getMaterialData(s),geometry:{id:r.id,attributes:this.getAttributesData(r.attributes),indexVersion:r.index?r.index.version:null,drawRange:{start:r.drawRange.start,count:r.drawRange.count}},worldMatrix:i.matrixWorld.clone()},i.center&&(t.center=i.center.clone()),i.morphTargetInfluences&&(t.morphTargetInfluences=i.morphTargetInfluences.slice()),null!==e.bundle&&(t.version=e.bundle.version),t.material.transmission>0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>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 Fs=e=>Ls(e),Ds=e=>Ls(e),Us=(...e)=>Ls(e),Is=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),Os=new WeakMap;function Vs(e){return Is.get(e)}function ks(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Gs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function zs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function $s(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Hs(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Xs(u[0]):null}function js(e){let t=Os.get(e);return void 0===t&&(t={},Os.set(e,t)),t}function qs(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Ks=Object.freeze({__proto__:null,arrayBufferToBase64:qs,base64ToArrayBuffer:Xs,getAlignmentFromType:$s,getDataFromObject:js,getLengthFromType:Gs,getMemoryLengthFromType:zs,getTypeFromLength:Vs,getTypedArrayFromType:ks,getValueFromType:Hs,getValueType:Ws,hash:Us,hashArray:Ds,hashString:Fs});const Ys={VERTEX:"vertex",FRAGMENT:"fragment"},Qs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Zs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Js={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ei=["fragment","vertex"],ti=["setup","analyze","generate"],ri=[...ei,"compute"],si=["x","y","z","w"],ii={analyze:"setup",generate:"analyze"};let ni=0;class ai extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Qs.NONE,this.updateBeforeType=Qs.NONE,this.updateAfterType=Qs.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ni++})}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),this}onFrameUpdate(e){return this.onUpdate(e,Qs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Qs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Qs.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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.7,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 oi extends ai{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)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 ui extends ai{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 li extends ai{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 di extends li{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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const ci=si.join("");class hi extends ai{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(si.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))}getScope(){return this.node.getScope()}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===ci.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 pi extends li{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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ai.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==xi?xi.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=Ti.get("assign");return this.addToStack(t(...e))}},ai.prototype.toVarIntent=function(){return this},ai.prototype.get=function(e){return new bi(this,e)};const Ni={};function Si(e,t,r){Ni[e]=Ni[t]=Ni[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new hi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ai.prototype["set"+s]=ai.prototype["set"+i]=ai.prototype["set"+n]=function(t){const r=vi(e);return new pi(this,r,Yi(t))},ai.prototype["flip"+s]=ai.prototype["flip"+i]=ai.prototype["flip"+n]=function(){const t=vi(e);return new gi(this,t)}}const Ri=["x","y","z","w"],Ai=["r","g","b","a"],Ei=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ri[e],r=Ai[e],s=Ei[e];Si(t,r,s);for(let i=0;i<4;i++){t=Ri[e]+Ri[i],r=Ai[e]+Ai[i],s=Ei[e]+Ei[i],Si(t,r,s);for(let n=0;n<4;n++){t=Ri[e]+Ri[i]+Ri[n],r=Ai[e]+Ai[i]+Ai[n],s=Ei[e]+Ei[i]+Ei[n],Si(t,r,s);for(let a=0;a<4;a++)t=Ri[e]+Ri[i]+Ri[n]+Ri[a],r=Ai[e]+Ai[i]+Ai[n]+Ai[a],s=Ei[e]+Ei[i]+Ei[n]+Ei[a],Si(t,r,s)}}}for(let e=0;e<32;e++)Ni[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new oi(this,new yi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};Object.defineProperties(ai.prototype,Ni);const wi=new WeakMap,Ci=function(e,t=null){for(const r in e)e[r]=Yi(e[r],t);return e},Mi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...Ji(d(t)))):null!==r?(r=Yi(r),n=(...s)=>i(new e(t,...Ji(d(s)),r))):n=(...r)=>i(new e(t,...Ji(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...Ji(t))};class Li extends ai{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=wi.get(e.constructor);void 0===s&&(s=new WeakMap,wi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Yi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;Zi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Yi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return Zi(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Yi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ai&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Yi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Yi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Fi extends ai{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Li(this,e)}setup(){return this.call()}}const Di=[!1,!0],Ui=[0,1,2,3],Ii=[-1,-2],Oi=[.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],Vi=new Map;for(const e of Di)Vi.set(e,new yi(e));const ki=new Map;for(const e of Ui)ki.set(e,new yi(e,"uint"));const Gi=new Map([...ki].map(e=>new yi(e.value,"int")));for(const e of Ii)Gi.set(e,new yi(e,"int"));const zi=new Map([...Gi].map(e=>new yi(e.value)));for(const e of Oi)zi.set(e,new yi(e));for(const e of Oi)zi.set(-e,new yi(-e));const $i={bool:Vi,uint:ki,ints:Gi,float:zi},Wi=new Map([...Vi,...zi]),Hi=(e,t)=>Wi.has(e)?Wi.get(e):!0===e.isNode?e:new yi(e,t),ji=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new yi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Hs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Qi(t.get(r[0]));if(1===r.length){const t=Hi(r[0],e);return t.nodeType===e?Qi(t):Qi(new ui(t,e))}const s=r.map(e=>Hi(e));return Qi(new di(s,e))}},qi=e=>"object"==typeof e&&null!==e?e.value:e,Xi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ki(e,t){return new Fi(e,t)}const Yi=(e,t=null)=>function(e,t=null){const r=Ws(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Yi(Hi(e,t)):"shader"===r?e.isFn?e:an(e):e}(e,t),Qi=(e,t=null)=>Yi(e,t).toVarIntent(),Zi=(e,t=null)=>new Ci(e,t),Ji=(e,t=null)=>new Mi(e,t),en=(e,t=null,r=null,s=null)=>new Bi(e,t,r,s),tn=(e,...t)=>new Pi(e,...t),rn=(e,t=null,r=null,s={})=>new Bi(e,t,r,{...s,intent:!0});let sn=0;class nn extends ai{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Ki(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+sn++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function an(e,t=null){const r=new nn(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const on=e=>{xi=e},un=()=>xi,ln=(...e)=>xi.If(...e);function dn(e){return xi&&xi.addToStack(e),e}_i("toStack",dn);const cn=new ji("color"),hn=new ji("float",$i.float),pn=new ji("int",$i.ints),gn=new ji("uint",$i.uint),mn=new ji("bool",$i.bool),fn=new ji("vec2"),yn=new ji("ivec2"),bn=new ji("uvec2"),xn=new ji("bvec2"),Tn=new ji("vec3"),_n=new ji("ivec3"),vn=new ji("uvec3"),Nn=new ji("bvec3"),Sn=new ji("vec4"),Rn=new ji("ivec4"),An=new ji("uvec4"),En=new ji("bvec4"),wn=new ji("mat2"),Cn=new ji("mat3"),Mn=new ji("mat4");_i("toColor",cn),_i("toFloat",hn),_i("toInt",pn),_i("toUint",gn),_i("toBool",mn),_i("toVec2",fn),_i("toIVec2",yn),_i("toUVec2",bn),_i("toBVec2",xn),_i("toVec3",Tn),_i("toIVec3",_n),_i("toUVec3",vn),_i("toBVec3",Nn),_i("toVec4",Sn),_i("toIVec4",Rn),_i("toUVec4",An),_i("toBVec4",En),_i("toMat2",wn),_i("toMat3",Cn),_i("toMat4",Mn);const Bn=en(oi).setParameterLength(2),Pn=(e,t)=>Yi(new ui(Yi(e),t));_i("element",Bn),_i("convert",Pn);_i("append",e=>(d("TSL: .append() has been renamed to .toStack()."),dn(e)));class Ln extends ai{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Fs(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}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 Fn=(e,t)=>new Ln(e,t),Dn=(e,t)=>new Ln(e,t,!0),Un=tn(Ln,"vec4","DiffuseColor"),In=tn(Ln,"vec3","DiffuseContribution"),On=tn(Ln,"vec3","EmissiveColor"),Vn=tn(Ln,"float","Roughness"),kn=tn(Ln,"float","Metalness"),Gn=tn(Ln,"float","Clearcoat"),zn=tn(Ln,"float","ClearcoatRoughness"),$n=tn(Ln,"vec3","Sheen"),Wn=tn(Ln,"float","SheenRoughness"),Hn=tn(Ln,"float","Iridescence"),jn=tn(Ln,"float","IridescenceIOR"),qn=tn(Ln,"float","IridescenceThickness"),Xn=tn(Ln,"float","AlphaT"),Kn=tn(Ln,"float","Anisotropy"),Yn=tn(Ln,"vec3","AnisotropyT"),Qn=tn(Ln,"vec3","AnisotropyB"),Zn=tn(Ln,"color","SpecularColor"),Jn=tn(Ln,"color","SpecularColorBlended"),ea=tn(Ln,"float","SpecularF90"),ta=tn(Ln,"float","Shininess"),ra=tn(Ln,"vec4","Output"),sa=tn(Ln,"float","dashSize"),ia=tn(Ln,"float","gapSize"),na=tn(Ln,"float","pointWidth"),aa=tn(Ln,"float","IOR"),oa=tn(Ln,"float","Transmission"),ua=tn(Ln,"float","Thickness"),la=tn(Ln,"float","AttenuationDistance"),da=tn(Ln,"color","AttenuationColor"),ca=tn(Ln,"float","Dispersion");class ha extends ai{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 pa=e=>new ha(e),ga=(e,t=0)=>new ha(e,!0,t),ma=ga("frame"),fa=ga("render"),ya=pa("object");class ba extends mi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ya}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),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.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const xa=(e,t)=>{const r=Xi(t||e);if(r===e&&(e=Hs(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new ba(e,r)};class Ta extends li{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const _a=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Ta(null,r.length,r)}else{const r=e[0],s=e[1];t=new Ta(r,s)}return Yi(t)};_i("toArray",(e,t)=>_a(Array(t).fill(e)));class va extends li{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}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 si.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.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)o("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?Ji(t):Zi(t[0]),new Sa(Yi(e),t));_i("call",Ra);const Aa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ea extends li{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ea(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const wa=rn(Ea,"+").setParameterLength(2,1/0).setName("add"),Ca=rn(Ea,"-").setParameterLength(2,1/0).setName("sub"),Ma=rn(Ea,"*").setParameterLength(2,1/0).setName("mul"),Ba=rn(Ea,"/").setParameterLength(2,1/0).setName("div"),Pa=rn(Ea,"%").setParameterLength(2).setName("mod"),La=rn(Ea,"==").setParameterLength(2).setName("equal"),Fa=rn(Ea,"!=").setParameterLength(2).setName("notEqual"),Da=rn(Ea,"<").setParameterLength(2).setName("lessThan"),Ua=rn(Ea,">").setParameterLength(2).setName("greaterThan"),Ia=rn(Ea,"<=").setParameterLength(2).setName("lessThanEqual"),Oa=rn(Ea,">=").setParameterLength(2).setName("greaterThanEqual"),Va=rn(Ea,"&&").setParameterLength(2,1/0).setName("and"),ka=rn(Ea,"||").setParameterLength(2,1/0).setName("or"),Ga=rn(Ea,"!").setParameterLength(1).setName("not"),za=rn(Ea,"^^").setParameterLength(2).setName("xor"),$a=rn(Ea,"&").setParameterLength(2).setName("bitAnd"),Wa=rn(Ea,"~").setParameterLength(1).setName("bitNot"),Ha=rn(Ea,"|").setParameterLength(2).setName("bitOr"),ja=rn(Ea,"^").setParameterLength(2).setName("bitXor"),qa=rn(Ea,"<<").setParameterLength(2).setName("shiftLeft"),Xa=rn(Ea,">>").setParameterLength(2).setName("shiftRight"),Ka=an(([e])=>(e.addAssign(1),e)),Ya=an(([e])=>(e.subAssign(1),e)),Qa=an(([e])=>{const t=pn(e).toConst();return e.addAssign(1),t}),Za=an(([e])=>{const t=pn(e).toConst();return e.subAssign(1),t});_i("add",wa),_i("sub",Ca),_i("mul",Ma),_i("div",Ba),_i("mod",Pa),_i("equal",La),_i("notEqual",Fa),_i("lessThan",Da),_i("greaterThan",Ua),_i("lessThanEqual",Ia),_i("greaterThanEqual",Oa),_i("and",Va),_i("or",ka),_i("not",Ga),_i("xor",za),_i("bitAnd",$a),_i("bitNot",Wa),_i("bitOr",Ha),_i("bitXor",ja),_i("shiftLeft",qa),_i("shiftRight",Xa),_i("incrementBefore",Ka),_i("decrementBefore",Ya),_i("increment",Qa),_i("decrement",Za);const Ja=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(pn(e),pn(t)));_i("modInt",Ja);class eo extends li{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===eo.MAX||e===eo.MIN)&&arguments.length>3){let i=new eo(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===eo.LENGTH||t===eo.DISTANCE||t===eo.DOT?"float":t===eo.CROSS?"vec3":t===eo.ALL||t===eo.ANY?"bool":t===eo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===eo.ONE_MINUS)i=Ca(1,t);else if(s===eo.RECIPROCAL)i=Ba(1,t);else if(s===eo.DIFFERENCE)i=wo(Ca(t,r));else if(s===eo.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=Sn(Tn(n),0):s=Sn(Tn(s),0);const a=Ma(s,n).xyz;i=To(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.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===eo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===eo.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===eo.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==eo.MIN&&r!==eo.MAX?r===eo.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===eo.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===eo.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==eo.DFDX&&r!==eo.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}eo.ALL="all",eo.ANY="any",eo.RADIANS="radians",eo.DEGREES="degrees",eo.EXP="exp",eo.EXP2="exp2",eo.LOG="log",eo.LOG2="log2",eo.SQRT="sqrt",eo.INVERSE_SQRT="inversesqrt",eo.FLOOR="floor",eo.CEIL="ceil",eo.NORMALIZE="normalize",eo.FRACT="fract",eo.SIN="sin",eo.COS="cos",eo.TAN="tan",eo.ASIN="asin",eo.ACOS="acos",eo.ATAN="atan",eo.ABS="abs",eo.SIGN="sign",eo.LENGTH="length",eo.NEGATE="negate",eo.ONE_MINUS="oneMinus",eo.DFDX="dFdx",eo.DFDY="dFdy",eo.ROUND="round",eo.RECIPROCAL="reciprocal",eo.TRUNC="trunc",eo.FWIDTH="fwidth",eo.TRANSPOSE="transpose",eo.DETERMINANT="determinant",eo.INVERSE="inverse",eo.EQUALS="equals",eo.MIN="min",eo.MAX="max",eo.STEP="step",eo.REFLECT="reflect",eo.DISTANCE="distance",eo.DIFFERENCE="difference",eo.DOT="dot",eo.CROSS="cross",eo.POW="pow",eo.TRANSFORM_DIRECTION="transformDirection",eo.MIX="mix",eo.CLAMP="clamp",eo.REFRACT="refract",eo.SMOOTHSTEP="smoothstep",eo.FACEFORWARD="faceforward";const to=hn(1e-6),ro=hn(1e6),so=hn(Math.PI),io=hn(2*Math.PI),no=hn(2*Math.PI),ao=hn(.5*Math.PI),oo=rn(eo,eo.ALL).setParameterLength(1),uo=rn(eo,eo.ANY).setParameterLength(1),lo=rn(eo,eo.RADIANS).setParameterLength(1),co=rn(eo,eo.DEGREES).setParameterLength(1),ho=rn(eo,eo.EXP).setParameterLength(1),po=rn(eo,eo.EXP2).setParameterLength(1),go=rn(eo,eo.LOG).setParameterLength(1),mo=rn(eo,eo.LOG2).setParameterLength(1),fo=rn(eo,eo.SQRT).setParameterLength(1),yo=rn(eo,eo.INVERSE_SQRT).setParameterLength(1),bo=rn(eo,eo.FLOOR).setParameterLength(1),xo=rn(eo,eo.CEIL).setParameterLength(1),To=rn(eo,eo.NORMALIZE).setParameterLength(1),_o=rn(eo,eo.FRACT).setParameterLength(1),vo=rn(eo,eo.SIN).setParameterLength(1),No=rn(eo,eo.COS).setParameterLength(1),So=rn(eo,eo.TAN).setParameterLength(1),Ro=rn(eo,eo.ASIN).setParameterLength(1),Ao=rn(eo,eo.ACOS).setParameterLength(1),Eo=rn(eo,eo.ATAN).setParameterLength(1,2),wo=rn(eo,eo.ABS).setParameterLength(1),Co=rn(eo,eo.SIGN).setParameterLength(1),Mo=rn(eo,eo.LENGTH).setParameterLength(1),Bo=rn(eo,eo.NEGATE).setParameterLength(1),Po=rn(eo,eo.ONE_MINUS).setParameterLength(1),Lo=rn(eo,eo.DFDX).setParameterLength(1),Fo=rn(eo,eo.DFDY).setParameterLength(1),Do=rn(eo,eo.ROUND).setParameterLength(1),Uo=rn(eo,eo.RECIPROCAL).setParameterLength(1),Io=rn(eo,eo.TRUNC).setParameterLength(1),Oo=rn(eo,eo.FWIDTH).setParameterLength(1),Vo=rn(eo,eo.TRANSPOSE).setParameterLength(1),ko=rn(eo,eo.DETERMINANT).setParameterLength(1),Go=rn(eo,eo.INVERSE).setParameterLength(1),zo=rn(eo,eo.MIN).setParameterLength(2,1/0),$o=rn(eo,eo.MAX).setParameterLength(2,1/0),Wo=rn(eo,eo.STEP).setParameterLength(2),Ho=rn(eo,eo.REFLECT).setParameterLength(2),jo=rn(eo,eo.DISTANCE).setParameterLength(2),qo=rn(eo,eo.DIFFERENCE).setParameterLength(2),Xo=rn(eo,eo.DOT).setParameterLength(2),Ko=rn(eo,eo.CROSS).setParameterLength(2),Yo=rn(eo,eo.POW).setParameterLength(2),Qo=e=>Ma(e,e),Zo=e=>Ma(e,e,e),Jo=e=>Ma(e,e,e,e),eu=rn(eo,eo.TRANSFORM_DIRECTION).setParameterLength(2),tu=e=>Ma(Co(e),Yo(wo(e),1/3)),ru=e=>Xo(e,e),su=rn(eo,eo.MIX).setParameterLength(3),iu=(e,t=0,r=1)=>Yi(new eo(eo.CLAMP,Yi(e),Yi(t),Yi(r))),nu=e=>iu(e),au=rn(eo,eo.REFRACT).setParameterLength(3),ou=rn(eo,eo.SMOOTHSTEP).setParameterLength(3),uu=rn(eo,eo.FACEFORWARD).setParameterLength(3),lu=an(([e])=>{const t=Xo(e.xy,fn(12.9898,78.233)),r=Pa(t,so);return _o(vo(r).mul(43758.5453))}),du=(e,t,r)=>su(t,r,e),cu=(e,t,r)=>ou(t,r,e),hu=(e,t)=>Wo(t,e),pu=uu,gu=yo;_i("all",oo),_i("any",uo),_i("radians",lo),_i("degrees",co),_i("exp",ho),_i("exp2",po),_i("log",go),_i("log2",mo),_i("sqrt",fo),_i("inverseSqrt",yo),_i("floor",bo),_i("ceil",xo),_i("normalize",To),_i("fract",_o),_i("sin",vo),_i("cos",No),_i("tan",So),_i("asin",Ro),_i("acos",Ao),_i("atan",Eo),_i("abs",wo),_i("sign",Co),_i("length",Mo),_i("lengthSq",ru),_i("negate",Bo),_i("oneMinus",Po),_i("dFdx",Lo),_i("dFdy",Fo),_i("round",Do),_i("reciprocal",Uo),_i("trunc",Io),_i("fwidth",Oo),_i("min",zo),_i("max",$o),_i("step",hu),_i("reflect",Ho),_i("distance",jo),_i("dot",Xo),_i("cross",Ko),_i("pow",Yo),_i("pow2",Qo),_i("pow3",Zo),_i("pow4",Jo),_i("transformDirection",eu),_i("mix",du),_i("clamp",iu),_i("refract",au),_i("smoothstep",cu),_i("faceForward",uu),_i("difference",qo),_i("saturate",nu),_i("cbrt",tu),_i("transpose",Vo),_i("determinant",ko),_i("inverse",Go),_i("rand",lu);class mu extends ai{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 e.flowBuildStage(this,"setup"),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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?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?Fn(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("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 fu=en(mu).setParameterLength(2,3);_i("select",fu);class yu extends ai{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const bu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new yu(r,t)},xu=e=>bu(e,{uniformFlow:!0}),Tu=(e,t)=>bu(e,{nodeName:t});function _u(e,t,r=null){return bu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function vu(e,t=null){return bu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Nu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Tu(e,t)}_i("context",bu),_i("label",Nu),_i("uniformFlow",xu),_i("setName",Tu),_i("builtinShadowContext",(e,t,r)=>_u(t,r,e)),_i("builtinAOContext",(e,t)=>vu(t,e));class Su extends ai{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,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Ru=en(Su),Au=(e,t=null)=>Ru(e,t).toStack(),Eu=(e,t=null)=>Ru(e,t,!0).toStack(),wu=e=>Ru(e).setIntent(!0).toStack();_i("toVar",Au),_i("toConst",Eu),_i("toVarIntent",wu);class Cu extends ai{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Mu=(e,t,r=null)=>Yi(new Cu(Yi(e),t,r));class Bu extends ai{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,this.global=!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=Mu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Ys.VERTEX);e.flowNodeFromShaderStage(Ys.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=en(Bu).setParameterLength(1,2),Lu=e=>Pu(e);_i("toVarying",Pu),_i("toVertexStage",Lu),_i("varying",(...e)=>(d("TSL: .varying() has been renamed to .toVarying()."),Pu(...e))),_i("vertexStage",(...e)=>(d("TSL: .vertexStage() has been renamed to .toVertexStage()."),Pu(...e)));const Fu=an(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return su(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Du=an(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return su(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Uu="WorkingColorSpace";class Iu extends li{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===Uu?p.workingColorSpace:"OutputColorSpace"===t?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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=Sn(Fu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=Sn(Cn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=Sn(Du(i.rgb),i.a)),i):i}}const Ou=(e,t)=>Yi(new Iu(Yi(e),Uu,t)),Vu=(e,t)=>Yi(new Iu(Yi(e),t,Uu));_i("workingToColorSpace",Ou),_i("colorSpaceToWorking",Vu);let ku=class extends oi{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 Gu extends ai{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=Qs.OBJECT}setGroup(e){return this.group=e,this}element(e){return new ku(this,Yi(e))}setNodeType(e){const t=xa(null,e);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;enew zu(e,t,r);class Wu extends li{static get type(){return"ToneMappingNode"}constructor(e,t=ju,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Us(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Sn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Hu=(e,t,r)=>Yi(new Wu(e,Yi(t),Yi(r))),ju=$u("toneMappingExposure","float");_i("toneMapping",(e,t,r)=>Hu(t,r,e));const qu=new WeakMap;function Xu(e,t){let r=qu.get(e);return void 0===r&&(r=new b(e,t),qu.set(e,r)),r}class Ku extends mi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Xu(s.array,i):Xu(s,i);const o=new y(a,r,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=Pu(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}}function Yu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Cn(new Ku(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Mn(new Ku(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ku(e,t,r,s)}const Qu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s),Zu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,f,!0),Ju=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x,!0);_i("toAttribute",e=>Qu(e.value));class el extends ai{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Qs.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const tl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;etl(e,r).setCount(t);_i("compute",rl),_i("computeKernel",tl);class sl extends ai{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const il=e=>new sl(Yi(e));function nl(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),il(e).setParent(t)}_i("cache",nl),_i("isolate",il);class al extends ai{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 ol=en(al).setParameterLength(2);_i("bypass",ol);class ul extends ai{static get type(){return"RemapNode"}constructor(e,t,r,s=hn(0),i=hn(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 ll=en(ul,null,null,{doClamp:!1}).setParameterLength(3,5),dl=en(ul).setParameterLength(3,5);_i("remap",ll),_i("remapClamp",dl);class cl extends ai{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 hl=en(cl).setParameterLength(1,2),pl=e=>(e?fu(e,hl("discard")):hl("discard")).toStack();_i("discard",pl);class gl extends li{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const ml=(e,t=null,r=null)=>Yi(new gl(Yi(e),t,r));_i("renderOutput",ml);class fl extends li{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):_(n),r}}const yl=(e,t=null)=>Yi(new fl(Yi(e),t)).toStack();_i("debug",yl);class bl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class xl extends ai{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Qs.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==bl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function Tl(e,t="",r=null){return(e=Yi(e)).before(new xl(e,t,r))}_i("toInspector",Tl);class _l extends ai{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 Pu(this).build(e,r)}return d(`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 vl=(e,t=null)=>new _l(e,t),Nl=(e=0)=>vl("uv"+(e>0?e:""),"vec2");class Sl extends ai{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 Rl=en(Sl).setParameterLength(1,2);class Al extends ba{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Qs.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 El=en(Al).setParameterLength(1),wl=new N;class Cl extends ba{static get type(){return"TextureNode"}constructor(e=wl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Qs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Nl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=xa(this.value.matrix)),this._matrixUniform.mul(Tn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=xa(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1)),t)),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().");const s=an(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Qs.OBJECT:Qs.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=Wo(hl(x,"float"),hl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Vu(hl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Yi(e).mul(El(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Yi(t)}level(e){const t=this.clone();return t.levelNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}size(e){return Rl(this,e)}bias(e){const t=this.clone();return t.biasNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Yi(e),Yi(t)],r.referenceNode=this.getBase(),Yi(r)}depth(e){const t=this.clone();return t.depthNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}offset(e){const t=this.clone();return t.offsetNode=Yi(e),t.referenceNode=this.getBase(),Yi(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Ml=en(Cl).setParameterLength(1,4).setName("texture"),Bl=(e=wl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Yi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=Ml(e,t,r,s),i},Pl=(...e)=>Bl(...e).setSampler(!1);class Ll extends ba{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Fl=(e,t,r)=>new Ll(e,t,r);class Dl extends oi{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 Ul extends Ll{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ws(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Qs.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;rnew Ul(e,t);const Ol=en(class extends ai{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Vl,kl;class Gl extends ai{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===Gl.DPR?"float":this.scope===Gl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Qs.NONE;return this.scope!==Gl.SIZE&&this.scope!==Gl.VIEWPORT&&this.scope!==Gl.DPR||(e=Qs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Gl.VIEWPORT?null!==t?kl.copy(t.viewport):(e.getViewport(kl),kl.multiplyScalar(e.getPixelRatio())):this.scope===Gl.DPR?this._output.value=e.getPixelRatio():null!==t?(Vl.width=t.width,Vl.height=t.height):e.getDrawingBufferSize(Vl)}setup(){const e=this.scope;let r=null;return r=e===Gl.SIZE?xa(Vl||(Vl=new t)):e===Gl.VIEWPORT?xa(kl||(kl=new s)):e===Gl.DPR?xa(1):fn(Hl.div(Wl)),this._output=r,r}generate(e){if(this.scope===Gl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Wl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Gl.COORDINATE="coordinate",Gl.VIEWPORT="viewport",Gl.SIZE="size",Gl.UV="uv",Gl.DPR="dpr";const zl=tn(Gl,Gl.DPR),$l=tn(Gl,Gl.UV),Wl=tn(Gl,Gl.SIZE),Hl=tn(Gl,Gl.COORDINATE),jl=tn(Gl,Gl.VIEWPORT),ql=jl.zw,Xl=Hl.sub(jl.xy),Kl=Xl.div(ql),Yl=an(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Wl),"vec2").once()(),Ql=xa(0,"uint").setName("u_cameraIndex").setGroup(ga("cameraIndex")).toVarying("v_cameraIndex"),Zl=xa("float").setName("cameraNear").setGroup(fa).onRenderUpdate(({camera:e})=>e.near),Jl=xa("float").setName("cameraFar").setGroup(fa).onRenderUpdate(({camera:e})=>e.far),ed=an(({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(fa).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrix")}else t=xa("mat4").setName("cameraProjectionMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),td=an(({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(fa).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrixInverse")}else t=xa("mat4").setName("cameraProjectionMatrixInverse").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),rd=an(({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(fa).setName("cameraViewMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraViewMatrix")}else t=xa("mat4").setName("cameraViewMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),sd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Il(r).setGroup(fa).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraWorldMatrix")}else t=xa("mat4").setName("cameraWorldMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),id=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Il(r).setGroup(fa).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraNormalMatrix")}else t=xa("mat3").setName("cameraNormalMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),nd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ad=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Il(r,"vec4").setGroup(fa).setName("cameraViewports").element(Ql).toConst("cameraViewport")}else t=Sn(0,0,Wl.x,Wl.y).toConst("cameraViewport");return t}).once()(),od=new C;class ud extends ai{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Qs.OBJECT,this.uniformNode=new ba(null)}getNodeType(){const e=this.scope;return e===ud.WORLD_MATRIX?"mat4":e===ud.POSITION||e===ud.VIEW_POSITION||e===ud.DIRECTION||e===ud.SCALE?"vec3":e===ud.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===ud.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ud.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ud.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ud.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ud.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===ud.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),od.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=od.radius}}generate(e){const t=this.scope;return t===ud.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===ud.POSITION||t===ud.VIEW_POSITION||t===ud.DIRECTION||t===ud.SCALE?this.uniformNode.nodeType="vec3":t===ud.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}}ud.WORLD_MATRIX="worldMatrix",ud.POSITION="position",ud.SCALE="scale",ud.VIEW_POSITION="viewPosition",ud.DIRECTION="direction",ud.RADIUS="radius";const ld=en(ud,ud.DIRECTION).setParameterLength(1),dd=en(ud,ud.WORLD_MATRIX).setParameterLength(1),cd=en(ud,ud.POSITION).setParameterLength(1),hd=en(ud,ud.SCALE).setParameterLength(1),pd=en(ud,ud.VIEW_POSITION).setParameterLength(1),gd=en(ud,ud.RADIUS).setParameterLength(1);class md extends ud{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const fd=tn(md,md.DIRECTION),yd=tn(md,md.WORLD_MATRIX),bd=tn(md,md.POSITION),xd=tn(md,md.SCALE),Td=tn(md,md.VIEW_POSITION),_d=tn(md,md.RADIUS),vd=xa(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Nd=xa(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Sd=an(e=>e.context.modelViewMatrix||Rd).once()().toVar("modelViewMatrix"),Rd=rd.mul(yd),Ad=an(e=>(e.context.isHighPrecisionModelViewMatrix=!0,xa("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Ed=an(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return xa("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),wd=vl("position","vec3"),Cd=wd.toVarying("positionLocal"),Md=wd.toVarying("positionPrevious"),Bd=an(e=>yd.mul(Cd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Pd=an(()=>Cd.transformDirection(yd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ld=an(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Fd=an(e=>{let t;return t=e.camera.isOrthographicCamera?Tn(0,0,1):Ld.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Dd extends ai{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Ud=tn(Dd),Id=hn(Ud).mul(2).sub(1),Od=an(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Id)),e}),Vd=vl("normal","vec3"),kd=an(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Tn(0,1,0)):Vd,"vec3").once()().toVar("normalLocal"),Gd=Ld.dFdx().cross(Ld.dFdy()).normalize().toVar("normalFlat"),zd=an(e=>{let t;return t=!0===e.material.flatShading?Gd:Xd(kd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),$d=an(e=>{let t=zd.transformDirection(rd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),Wd=an(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=zd,!0!==t.flatShading&&(s=Od(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Hd=Wd.transformDirection(rd).toVar("normalWorld"),jd=an(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?Wd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),qd=an(([e,t=yd])=>{const r=Cn(t),s=e.div(Tn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Xd=an(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=vd.mul(e);return rd.transformDirection(s)}),Kd=an(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),Wd)).once(["NORMAL","VERTEX"])(),Yd=an(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Hd)).once(["NORMAL","VERTEX"])(),Qd=an(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Zd=new P,Jd=new a,ec=xa(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),tc=xa(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),rc=xa(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?(Zd.copy(r),Jd.makeRotationFromEuler(Zd)):Jd.identity(),Jd}),sc=Fd.negate().reflect(Wd),ic=Fd.negate().refract(Wd,ec),nc=sc.transformDirection(rd).toVar("reflectVector"),ac=ic.transformDirection(rd).toVar("reflectVector"),oc=new L;class uc extends Cl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===F?nc:e.mapping===D?ac:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Tn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Tn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Tn(t.x.negate(),t.yz)),rc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const lc=en(uc).setParameterLength(1,4).setName("cubeTexture"),dc=(e=oc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Yi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=lc(e,t,r,s),i};class cc extends oi{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 hc extends ai{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=Qs.OBJECT}element(e){return new cc(this,Yi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Fl(null,e,this.count):Array.isArray(this.getValueFromReference())?Il(null,e):"texture"===e?Bl(null):"cubeTexture"===e?dc(null):xa(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),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;enew hc(e,t,r),gc=(e,t,r,s)=>new hc(e,t,s,r);class mc extends hc{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 fc=(e,t,r=null)=>new mc(e,t,r),yc=Nl(),bc=Ld.dFdx(),xc=Ld.dFdy(),Tc=yc.dFdx(),_c=yc.dFdy(),vc=Wd,Nc=xc.cross(vc),Sc=vc.cross(bc),Rc=Nc.mul(Tc.x).add(Sc.mul(_c.x)),Ac=Nc.mul(Tc.y).add(Sc.mul(_c.y)),Ec=Rc.dot(Rc).max(Ac.dot(Ac)),wc=Ec.equal(0).select(0,Ec.inverseSqrt()),Cc=Rc.mul(wc).toVar("tangentViewFrame"),Mc=Ac.mul(wc).toVar("bitangentViewFrame"),Bc=vl("tangent","vec4"),Pc=Bc.xyz.toVar("tangentLocal"),Lc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Sd.mul(Sn(Pc,0)).xyz.toVarying("v_tangentView").normalize():Cc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Fc=Lc.transformDirection(rd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Dc=an(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Bc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Uc=Dc(Vd.cross(Bc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Ic=Dc(kd.cross(Pc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Oc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Dc(Wd.cross(Lc),"v_bitangentView").normalize():Mc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),Vc=Dc(Hd.cross(Fc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kc=Cn(Lc,Oc,Wd).toVar("TBNViewMatrix"),Gc=Fd.mul(kc),zc=an(()=>{let e=Qn.cross(Fd);return e=e.cross(Qn).normalize(),e=su(e,Wd,Kn.mul(Vn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),$c=e=>Yi(e).mul(.5).add(.5),Wc=e=>Tn(e,fo(nu(hn(1).sub(Xo(e,e)))));class Hc extends li{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=Wc(i.xy):s===V?i=Wc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Od(t)),i=Tn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Xd(i):t===U?n=kc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=Wd),n}}const jc=en(Hc).setParameterLength(1,2),qc=an(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Nl()),forceUVContext:!0}),s=hn(r(e=>e));return fn(hn(r(e=>e.add(e.dFdx()))).sub(s),hn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Xc=an(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(Id),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Kc extends li{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=qc({textureNode:this.textureNode,bumpScale:e});return Xc({surf_pos:Ld,surf_norm:Wd,dHdxy:t})}}const Yc=en(Kc).setParameterLength(1,2),Qc=new Map;class Zc extends ai{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Qc.get(e);return void 0===r&&(r=fc(e,t),Qc.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===Zc.COLOR){const e=void 0!==t.color?this.getColor(r):Tn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Zc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Zc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:hn(1);else if(r===Zc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Zc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Zc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Zc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Zc.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===Zc.NORMAL)t.normalMap?(s=jc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Yc(this.getTexture("bump").r,this.getFloat("bumpScale")):Wd;else if(r===Zc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?jc(this.getTexture(r),this.getCache(r+"Scale","vec2")):Wd;else if(r===Zc.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===Zc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===Zc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=wn(Uh.x,Uh.y,Uh.y.negate(),Uh.x).mul(e.rg.mul(2).sub(fn(1)).normalize().mul(e.b))}else s=Uh;else if(r===Zc.IRIDESCENCE_THICKNESS){const e=pc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=pc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Zc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Zc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Zc.IOR)s=this.getFloat(r);else if(r===Zc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Zc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===Zc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):hn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Zc.ALPHA_TEST="alphaTest",Zc.COLOR="color",Zc.OPACITY="opacity",Zc.SHININESS="shininess",Zc.SPECULAR="specular",Zc.SPECULAR_STRENGTH="specularStrength",Zc.SPECULAR_INTENSITY="specularIntensity",Zc.SPECULAR_COLOR="specularColor",Zc.REFLECTIVITY="reflectivity",Zc.ROUGHNESS="roughness",Zc.METALNESS="metalness",Zc.NORMAL="normal",Zc.CLEARCOAT="clearcoat",Zc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Zc.CLEARCOAT_NORMAL="clearcoatNormal",Zc.EMISSIVE="emissive",Zc.ROTATION="rotation",Zc.SHEEN="sheen",Zc.SHEEN_ROUGHNESS="sheenRoughness",Zc.ANISOTROPY="anisotropy",Zc.IRIDESCENCE="iridescence",Zc.IRIDESCENCE_IOR="iridescenceIOR",Zc.IRIDESCENCE_THICKNESS="iridescenceThickness",Zc.IOR="ior",Zc.TRANSMISSION="transmission",Zc.THICKNESS="thickness",Zc.ATTENUATION_DISTANCE="attenuationDistance",Zc.ATTENUATION_COLOR="attenuationColor",Zc.LINE_SCALE="scale",Zc.LINE_DASH_SIZE="dashSize",Zc.LINE_GAP_SIZE="gapSize",Zc.LINE_WIDTH="linewidth",Zc.LINE_DASH_OFFSET="dashOffset",Zc.POINT_SIZE="size",Zc.DISPERSION="dispersion",Zc.LIGHT_MAP="light",Zc.AO="ao";const Jc=tn(Zc,Zc.ALPHA_TEST),eh=tn(Zc,Zc.COLOR),th=tn(Zc,Zc.SHININESS),rh=tn(Zc,Zc.EMISSIVE),sh=tn(Zc,Zc.OPACITY),ih=tn(Zc,Zc.SPECULAR),nh=tn(Zc,Zc.SPECULAR_INTENSITY),ah=tn(Zc,Zc.SPECULAR_COLOR),oh=tn(Zc,Zc.SPECULAR_STRENGTH),uh=tn(Zc,Zc.REFLECTIVITY),lh=tn(Zc,Zc.ROUGHNESS),dh=tn(Zc,Zc.METALNESS),ch=tn(Zc,Zc.NORMAL),hh=tn(Zc,Zc.CLEARCOAT),ph=tn(Zc,Zc.CLEARCOAT_ROUGHNESS),gh=tn(Zc,Zc.CLEARCOAT_NORMAL),mh=tn(Zc,Zc.ROTATION),fh=tn(Zc,Zc.SHEEN),yh=tn(Zc,Zc.SHEEN_ROUGHNESS),bh=tn(Zc,Zc.ANISOTROPY),xh=tn(Zc,Zc.IRIDESCENCE),Th=tn(Zc,Zc.IRIDESCENCE_IOR),_h=tn(Zc,Zc.IRIDESCENCE_THICKNESS),vh=tn(Zc,Zc.TRANSMISSION),Nh=tn(Zc,Zc.THICKNESS),Sh=tn(Zc,Zc.IOR),Rh=tn(Zc,Zc.ATTENUATION_DISTANCE),Ah=tn(Zc,Zc.ATTENUATION_COLOR),Eh=tn(Zc,Zc.LINE_SCALE),wh=tn(Zc,Zc.LINE_DASH_SIZE),Ch=tn(Zc,Zc.LINE_GAP_SIZE),Mh=tn(Zc,Zc.LINE_WIDTH),Bh=tn(Zc,Zc.LINE_DASH_OFFSET),Ph=tn(Zc,Zc.POINT_SIZE),Lh=tn(Zc,Zc.DISPERSION),Fh=tn(Zc,Zc.LIGHT_MAP),Dh=tn(Zc,Zc.AO),Uh=xa(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))}),Ih=an(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Oh extends oi{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 Vh=en(Oh).setParameterLength(2);class kh extends Ll{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=Vs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Js.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 Vh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Js.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Qu(this.value),this._varying=Pu(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)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}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 Gh=(e,t=null,r=0)=>new kh(e,t,r);class zh extends ai{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===zh.VERTEX)s=e.getVertexIndex();else if(r===zh.INSTANCE)s=e.getInstanceIndex();else if(r===zh.DRAW)s=e.getDrawIndex();else if(r===zh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===zh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==zh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}zh.VERTEX="vertex",zh.INSTANCE="instance",zh.SUBGROUP="subgroup",zh.INVOCATION_LOCAL="invocationLocal",zh.INVOCATION_SUBGROUP="invocationSubgroup",zh.DRAW="draw";const $h=tn(zh,zh.VERTEX),Wh=tn(zh,zh.INSTANCE),Hh=tn(zh,zh.SUBGROUP),jh=tn(zh,zh.INVOCATION_SUBGROUP),qh=tn(zh,zh.INVOCATION_LOCAL),Xh=tn(zh,zh.DRAW);class Kh extends ai{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=Qs.FRAME,this.buffer=null,this.bufferColor=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){const{instanceMatrix:t,instanceColor:r,isStorageMatrix:s,isStorageColor:i}=this,{count:n}=t;let{instanceMatrixNode:a,instanceColorNode:o}=this;if(null===a){if(s)a=Gh(t,"mat4",Math.max(n,1)).element(Wh);else if(n<=1e3)a=Fl(t.array,"mat4",Math.max(n,1)).element(Wh);else{const e=new W(t.array,16,1);this.buffer=e;const r=t.usage===x?Ju:Zu,s=[r(e,"vec4",16,0),r(e,"vec4",16,4),r(e,"vec4",16,8),r(e,"vec4",16,12)];a=Mn(...s)}this.instanceMatrixNode=a}if(r&&null===o){if(i)o=Gh(r,"vec3",Math.max(r.count,1)).element(Wh);else{const e=new H(r.array,3),t=r.usage===x?Ju:Zu;this.bufferColor=e,o=Tn(t(e,"vec3",3,0))}this.instanceColorNode=o}const u=a.mul(Cd).xyz;if(Cd.assign(u),e.hasGeometryAttribute("normal")){const e=qd(kd,a);kd.assign(e)}null!==this.instanceColorNode&&Dn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.usage!==x&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.usage!==x&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version))}}const Yh=en(Kh).setParameterLength(2,3);class Qh extends Kh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Zh=en(Qh).setParameterLength(1);class Jh extends ai{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=Wh:this.batchingIdNode=Xh);const t=an(([e])=>{const t=pn(Rl(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=pn(e).mod(t).toConst(),s=pn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,yn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(pn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=pn(Rl(Pl(s),0).x).toConst(),n=hn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Mn(Pl(s,yn(a,o)),Pl(s,yn(a.add(1),o)),Pl(s,yn(a.add(2),o)),Pl(s,yn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=an(([e])=>{const t=pn(Rl(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,yn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Dn("vec3","vBatchColor").assign(t)}const d=Cn(u);Cd.assign(u.mul(Cd));const c=kd.div(Tn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;kd.assign(h),e.hasGeometryAttribute("tangent")&&Pc.mulAssign(d)}}const ep=en(Jh).setParameterLength(1),tp=new WeakMap;class rp extends ai{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Qs.OBJECT,this.skinIndexNode=vl("skinIndex","uvec4"),this.skinWeightNode=vl("skinWeight","vec4"),this.bindMatrixNode=pc("bindMatrix","mat4"),this.bindMatrixInverseNode=pc("bindMatrixInverse","mat4"),this.boneMatricesNode=gc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Cd,this.toPositionNode=Cd,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=wa(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=kd){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=wa(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=gc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Md)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===js(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Md.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();kd.assign(t),e.hasGeometryAttribute("tangent")&&Pc.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;tp.get(t)!==e.frameId&&(tp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const sp=e=>new rp(e);class ip extends ai{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew ip(Ji(e,"int")).toStack(),ap=()=>hl("break").toStack(),op=new WeakMap,up=new s,lp=an(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=pn($h).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,yn(u,o)).depth(i).xyz.mul(t)});class dp extends ai{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=xa(1),this.updateType=Qs.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=op.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 j(m,h,p,a);f.type=q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=hn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,yn(pn(e).add(1),pn(Wh))).r):t.assign(pc("morphTargetInfluences","float").element(e).toVar()),ln(t.notEqual(0),()=>{!0===s&&Cd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(0)})),!0===i&&kd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(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 cp=en(dp).setParameterLength(1);class hp extends ai{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class pp extends hp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class gp extends yu{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:Tn().toVar("directDiffuse"),directSpecular:Tn().toVar("directSpecular"),indirectDiffuse:Tn().toVar("indirectDiffuse"),indirectSpecular:Tn().toVar("indirectSpecular")};return{radiance:Tn().toVar("radiance"),irradiance:Tn().toVar("irradiance"),iblIrradiance:Tn().toVar("iblIrradiance"),ambientOcclusion:hn(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 mp=en(gp);class fp extends hp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const yp=new t;class bp extends Cl{static get type(){return"ViewportTextureNode"}constructor(e=$l,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Qs.FRAME,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(yp):yp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===yp.width&&s.image.height===yp.height||(s.image.width=yp.width,s.image.height=yp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const xp=en(bp).setParameterLength(0,3),Tp=en(bp,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let _p=null;class vp extends bp{static get type(){return"ViewportDepthTextureNode"}constructor(e=$l,t=null){null===_p&&(_p=new Y),super(e,t,_p)}getTextureForReference(){return _p}}const Np=en(vp).setParameterLength(0,2);class Sp extends ai{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===Sp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Sp.DEPTH_BASE)null!==r&&(s=Cp().assign(r));else if(t===Sp.DEPTH)s=e.isPerspectiveCamera?Ap(Ld.z,Zl,Jl):Rp(Ld.z,Zl,Jl);else if(t===Sp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ep(r,Zl,Jl);s=Rp(e,Zl,Jl)}else s=r;else s=Rp(Ld.z,Zl,Jl);return s}}Sp.DEPTH_BASE="depthBase",Sp.DEPTH="depth",Sp.LINEAR_DEPTH="linearDepth";const Rp=(e,t,r)=>e.add(t).div(t.sub(r)),Ap=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ep=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),wp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=mo(e.negate().div(t)),i=mo(r.div(t));return s.div(i)},Cp=en(Sp,Sp.DEPTH_BASE),Mp=tn(Sp,Sp.DEPTH),Bp=en(Sp,Sp.LINEAR_DEPTH).setParameterLength(0,1),Pp=Bp(Np());Mp.assign=e=>Cp(e);class Lp extends ai{static get type(){return"ClippingNode"}constructor(e=Lp.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===Lp.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Lp.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return an(()=>{const r=hn().toVar("distanceToPlane"),s=hn().toVar("distanceToGradient"),i=hn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Il(t).setGroup(fa);np(n,({i:t})=>{const n=e.element(t);r.assign(Ld.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ou(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Il(e).setGroup(fa),n=hn(1).toVar("intersectionClipOpacity");np(a,({i:e})=>{const i=t.element(e);r.assign(Ld.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ou(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}Un.a.mulAssign(i),Un.a.equal(0).discard()})()}setupDefault(e,t){return an(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Il(t).setGroup(fa);np(r,({i:t})=>{const r=e.element(t);Ld.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Il(e).setGroup(fa),r=mn(!0).toVar("clipped");np(s,({i:e})=>{const s=t.element(e);r.assign(Ld.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),an(()=>{const s=Il(e).setGroup(fa),i=Ol(t.getClipDistance());np(r,({i:e})=>{const t=s.element(e),r=Ld.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Lp.ALPHA_TO_COVERAGE="alphaToCoverage",Lp.DEFAULT="default",Lp.HARDWARE="hardware";const Fp=an(([e])=>_o(Ma(1e4,vo(Ma(17,e.x).add(Ma(.1,e.y)))).mul(wa(.1,wo(vo(Ma(13,e.y).add(e.x))))))),Dp=an(([e])=>Fp(fn(Fp(e.xy),e.z))),Up=an(([e])=>{const t=$o(Mo(Lo(e.xyz)),Mo(Fo(e.xyz))),r=hn(1).div(hn(.05).mul(t)).toVar("pixScale"),s=fn(po(bo(mo(r))),po(xo(mo(r)))),i=fn(Dp(bo(s.x.mul(e.xyz))),Dp(bo(s.y.mul(e.xyz)))),n=_o(mo(r)),a=wa(Ma(n.oneMinus(),i.x),Ma(n,i.y)),o=zo(n,n.oneMinus()),u=Tn(a.mul(a).div(Ma(2,o).mul(Ca(1,o))),a.sub(Ma(.5,o)).div(Ca(1,o)),Ca(1,Ca(1,a).mul(Ca(1,a)).div(Ma(2,o).mul(Ca(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return iu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Ip extends _l{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 Op=(e=0)=>new Ip(e),Vp=an(([e,t])=>zo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),kp=an(([e,t])=>zo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gp=an(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zp=an(([e,t])=>su(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Wo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$p=an(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Sn(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"}]}),Wp=an(([e])=>Sn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Hp=an(([e])=>(ln(e.a.equal(0),()=>Sn(0)),Sn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class jp extends Q{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.maskNode=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,this.contextNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{d('NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Fs(t.slice(0,-4)),r.getCacheKey());return this.type+Ds(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Mu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=Mu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=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!==a&&e.stack.addToStack(a);const i=Sn(s,Un.a).max(0);n=this.setupOutput(e,i),ra.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ra.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Sn(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,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.currentSamples;this.alphaToCoverage&&t>1?s=new Lp(Lp.ALPHA_TO_COVERAGE):e.stack.addToStack(new Lp)}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.addToStack(new Lp(Lp.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?wp(Ld.z,Zl,Jl):Rp(Ld.z,Zl,Jl))}null!==s&&Mp.assign(s).toStack()}setupPositionView(){return Sd.mul(Cd).xyz}setupModelViewProjection(){return ed.mul(Ld)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Ih}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&cp(t).toStack(),!0===t.isSkinnedMesh&&sp(t).toStack(),this.displacementMap){const e=fc("displacementMap","texture"),t=fc("displacementScale","float"),r=fc("displacementBias","float");Cd.addAssign(kd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ep(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Zh(t).toStack(),null!==this.positionNode&&Cd.assign(Mu(this.positionNode,"POSITION","vec3")),Cd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&mn(this.maskNode).not().discard();let s=this.colorNode?Sn(this.colorNode):eh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(Op())),t.instanceColor){s=Dn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Dn("vec3","vBatchColor").mul(s)}Un.assign(s);const i=this.opacityNode?hn(this.opacityNode):sh;Un.a.assign(Un.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?hn(this.alphaTestNode):Jc,!0===this.alphaToCoverage?(Un.a=ou(n,n.add(Oo(Un.a)),Un.a),Un.a.lessThanEqual(0).discard()):Un.a.lessThanEqual(n).discard()),!0===this.alphaHash&&Un.a.lessThan(Up(Cd)).discard(),e.isOpaque()&&Un.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Tn(0):Un.rgb}setupNormal(){return this.normalNode?Tn(this.normalNode):ch}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?fc("envMap","cubeTexture"):fc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new fp(Fh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Dh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new pp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=mp(n,t,r,s)}else null!==r&&(a=Tn(null!==s?su(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(On.assign(Tn(i||rh)),a=a.add(On)),a}setupFog(e,t){const r=e.fogNode;return r&&(ra.assign(t),t=Sn(r.toVar())),t}setupPremultipliedAlpha(e,t){return Wp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(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=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskNode=e.maskNode,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,this.contextNode=e.contextNode,super.copy(e)}}const qp=new Z;class Xp extends jp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(qp),this.setValues(e)}}const Kp=new J;class Yp extends jp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Kp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?hn(this.offsetNode):Bh,t=this.dashScaleNode?hn(this.dashScaleNode):Eh,r=this.dashSizeNode?hn(this.dashSizeNode):wh,s=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(r),ia.assign(s);const i=Pu(vl("lineDistance").mul(t));(e?i.add(e):i).mod(sa.add(ia)).greaterThan(sa).discard()}}let Qp=null;class Zp extends bp{static get type(){return"ViewportSharedTextureNode"}constructor(e=$l,t=null){null===Qp&&(Qp=new X),super(e,t,Qp)}getTextureForReference(){return Qp}updateReference(){return this}}const Jp=en(Zp).setParameterLength(0,2),eg=new J;class tg extends jp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(eg),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,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=an(({start:e,end:t})=>{const r=ed.element(2).element(2),s=ed.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Sn(su(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=an(()=>{const e=vl("instanceStart"),t=vl("instanceEnd"),r=Sn(Sd.mul(Sn(e,1))).toVar("start"),s=Sn(Sd.mul(Sn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?hn(this.dashScaleNode):Eh,t=this.offsetNode?hn(this.offsetNode):Bh,r=vl("instanceDistanceStart"),s=vl("instanceDistanceEnd");let i=wd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Dn("float","lineDistance").assign(i)}n&&(Dn("vec3","worldStart").assign(r.xyz),Dn("vec3","worldEnd").assign(s.xyz));const o=jl.z.div(jl.w),u=ed.element(2).element(3).equal(-1);ln(u,()=>{ln(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=ed.mul(r),d=ed.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=Sn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=su(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Dn("vec4","worldPos");o.assign(wd.y.lessThan(.5).select(r,s));const u=Mh.mul(.5);o.addAssign(Sn(wd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(Sn(wd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(Sn(a.mul(u),0)),ln(wd.y.greaterThan(1).or(wd.y.lessThan(0)),()=>{o.subAssign(Sn(a.mul(2).mul(u),0))})),g.assign(ed.mul(o));const l=Tn().toVar();l.assign(wd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=fn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(wd.x.lessThan(0).select(e.negate(),e)),ln(wd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(wd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Mh)),e.assign(e.div(jl.w.div(zl))),g.assign(wd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Sn(e,0,0)))}return g})();const o=an(({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 fn(h,p)});if(this.colorNode=an(()=>{const e=Nl();if(i){const t=this.dashSizeNode?hn(this.dashSizeNode):wh,r=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(t),ia.assign(r);const s=Dn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(sa.add(ia)).greaterThan(sa).discard()}const a=hn(1).toVar("alpha");if(n){const e=Dn("vec3","worldStart"),s=Dn("vec3","worldEnd"),n=Dn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Tn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Mh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(ou(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=hn(s.fwidth()).toVar("dlen");ln(e.y.abs().greaterThan(1),()=>{a.assign(ou(i.oneMinus(),i.add(1),s).oneMinus())})}else ln(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=vl("instanceColorStart"),t=vl("instanceColorEnd");u=wd.y.lessThan(.5).select(e,t).mul(eh)}else u=eh;return Sn(u,a)})(),this.transparent){const e=this.opacityNode?hn(this.opacityNode):sh;this.outputNode=Sn(this.colorNode.rgb.mul(e).add(Jp().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 rg=new te;class sg extends jp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(rg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?hn(this.opacityNode):sh;Un.assign(Vu(Sn($c(Wd),e),re))}}const ig=an(([e=Pd])=>{const 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 fn(t,r)});class ng extends se{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 ie(5,5,5),n=ig(Pd),a=new jp;a.colorNode=Bl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(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 ag=new WeakMap;class og extends li{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=dc(null);const t=new L;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Qs.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===le||r===de){if(ag.has(e)){const t=ag.get(e);lg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ng(r.height);s.fromEquirectangularTexture(t,e),lg(s.texture,e.mapping),this._cubeTexture=s.texture,ag.set(e,s.texture),e.addEventListener("dispose",ug)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function ug(e){const t=e.target;t.removeEventListener("dispose",ug);const r=ag.get(t);void 0!==r&&(ag.delete(t),r.dispose())}function lg(e,t){t===le?e.mapping=F:t===de&&(e.mapping=D)}const dg=en(og).setParameterLength(1);class cg extends hp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=dg(this.envNode)}}class hg extends hp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=hn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class pg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class gg extends pg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(Sn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(Sn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Un.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(su(s.rgb,s.rgb.mul(i.rgb),oh.mul(uh)));break;case he:s.rgb.assign(su(s.rgb,i.rgb,oh.mul(uh)));break;case ce:s.rgb.addAssign(i.rgb.mul(oh.mul(uh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const mg=new ge;class fg extends jp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(mg),this.setValues(e)}setupNormal(){return Od(zd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new hg(Fh)),t}setupOutgoingLight(){return Un.rgb}setupLightingModel(){return new gg}}const yg=an(({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))}),bg=an(e=>e.diffuseColor.mul(1/Math.PI)),xg=an(({dotNH:e})=>ta.mul(hn(.5)).add(1).mul(hn(1/Math.PI)).mul(e.pow(ta))),Tg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(t).clamp(),s=Fd.dot(t).clamp(),i=yg({f0:Zn,f90:1,dotVH:s}),n=hn(.25),a=xg({dotNH:r});return i.mul(n).mul(a)});class _g extends gg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(bg({diffuseColor:Un.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Tg({lightDirection:e})).mul(oh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const vg=new me;class Ng extends jp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(vg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g(!1)}}const Sg=new fe;class Rg extends jp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g}setupVariants(){const e=(this.shininessNode?hn(this.shininessNode):th).max(1e-4);ta.assign(e);const t=this.specularNode||ih;Zn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ag=an(e=>{if(!1===e.geometry.hasAttribute("normal"))return hn(0);const t=zd.dFdx().abs().max(zd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Eg=an(e=>{const{roughness:t}=e,r=Ag();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),wg=an(({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 Ba(.5,i.add(n).max(to))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Cg=an(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Tn(e.mul(r),t.mul(s),a).length()),l=a.mul(Tn(e.mul(i),t.mul(n),o).length());return Ba(.5,u.add(l))}).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"}]}),Mg=an(({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"}]}),Bg=hn(1/Math.PI),Pg=an(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Tn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Bg.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"}]}),Lg=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=Wd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Fd).normalize(),d=n.dot(e).clamp(),c=n.dot(Fd).clamp(),h=n.dot(l).clamp(),p=Fd.dot(l).clamp();let g,m,f=yg({f0:t,f90:r,dotVH:p});if(qi(a)&&(f=Hn.mix(f,i)),qi(o)){const t=Yn.dot(e),r=Yn.dot(Fd),s=Yn.dot(l),i=Qn.dot(e),n=Qn.dot(Fd),a=Qn.dot(l);g=Cg({alphaT:Xn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Xn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=wg({alpha:u,dotNL:d,dotNV:c}),m=Mg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Fg=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Dg=null;const Ug=an(({roughness:e,dotNV:t})=>{null===Dg&&(Dg=new ye(Fg,16,16,G,be),Dg.name="DFG_LUT",Dg.minFilter=oe,Dg.magFilter=oe,Dg.wrapS=xe,Dg.wrapT=xe,Dg.generateMipmaps=!1,Dg.needsUpdate=!0);const r=fn(e,t);return Bl(Dg,r).rg}),Ig=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Lg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=Wd.dot(e).clamp(),l=Wd.dot(Fd).clamp(),d=Ug({roughness:s,dotNV:l}),c=Ug({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=hn(1).sub(g),y=hn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(hn(1).sub(f.mul(y).mul(b).mul(b)).add(to)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Og=an(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Ug({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Vg=an(({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(Tn(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"}]}),kg=an(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=hn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return hn(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"}]}),Gg=an(({dotNV:e,dotNL:t})=>hn(1).div(hn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),zg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(e).clamp(),s=Wd.dot(Fd).clamp(),i=Wd.dot(t).clamp(),n=kg({roughness:Wn,dotNH:i}),a=Gg({dotNV:s,dotNL:r});return $n.mul(n).mul(a)}),$g=an(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=fn(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"}]}),Wg=an(({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"}]}),Hg=an(({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"}]}),jg=an(({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=Tn().toVar();return ln(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(Cn(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=Tn(0).toVar();f.addAssign(Hg({v1:h,v2:p})),f.addAssign(Hg({v1:p,v2:g})),f.addAssign(Hg({v1:g,v2:m})),f.addAssign(Hg({v1:m,v2:h})),c.assign(Tn(Wg({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"}]}),qg=an(({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=Tn().toVar();return ln(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=Tn(0).toVar();d.addAssign(Hg({v1:n,v2:a})),d.addAssign(Hg({v1:a,v2:o})),d.addAssign(Hg({v1:o,v2:l})),d.addAssign(Hg({v1:l,v2:n})),u.assign(Tn(Wg({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"}]}),Xg=1/6,Kg=e=>Ma(Xg,Ma(e,Ma(e,e.negate().add(3)).sub(3)).add(1)),Yg=e=>Ma(Xg,Ma(e,Ma(e,Ma(3,e).sub(6))).add(4)),Qg=e=>Ma(Xg,Ma(e,Ma(e,Ma(-3,e).add(3)).add(3)).add(1)),Zg=e=>Ma(Xg,Yo(e,3)),Jg=e=>Kg(e).add(Yg(e)),em=e=>Qg(e).add(Zg(e)),tm=e=>wa(-1,Yg(e).div(Kg(e).add(Yg(e)))),rm=e=>wa(1,Zg(e).div(Qg(e).add(Zg(e)))),sm=(e,t,r)=>{const s=e.uvNode,i=Ma(s,t.zw).add(.5),n=bo(i),a=_o(i),o=Jg(a.x),u=em(a.x),l=tm(a.x),d=rm(a.x),c=tm(a.y),h=rm(a.y),p=fn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=fn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=fn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=fn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Jg(a.y).mul(wa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=em(a.y).mul(wa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},im=an(([e,t])=>{const r=fn(e.size(pn(t))),s=fn(e.size(pn(t.add(1)))),i=Ba(1,r),n=Ba(1,s),a=sm(e,Sn(i,r),bo(t)),o=sm(e,Sn(n,s),xo(t));return _o(t).mix(a,o)}),nm=an(([e,t])=>{const r=t.mul(El(e));return im(e,r)}),am=an(([e,t,r,s,i])=>{const n=Tn(au(t.negate(),To(e),Ba(1,s))),a=Tn(Mo(i[0].xyz),Mo(i[1].xyz),Mo(i[2].xyz));return To(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"}]}),om=an(([e,t])=>e.mul(iu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),um=Tp(),lm=Tp(),dm=an(([e,t,r],{material:s})=>{const i=(s.side===M?um:lm).sample(e),n=mo(Wl.x).mul(om(t,r));return im(i,n)}),cm=an(([e,t,r])=>(ln(r.notEqual(0),()=>{const s=go(t).negate().div(r);return ho(s.negate().mul(e))}),Tn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),hm=an(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Sn().toVar(),f=Tn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Tn(d.sub(i),d,d.add(i));np({start:0,end:3},({i:i})=>{const d=n.element(i),g=am(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(Sn(y,1))),x=fn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(fn(x.x,x.y.oneMinus()));const T=dm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(cm(Mo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=am(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(Sn(n,1))),y=fn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(fn(y.x,y.y.oneMinus())),m=dm(y,r,d),f=s.mul(cm(Mo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Tn(Og({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Sn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),pm=Cn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),gm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),mm=an(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=su(e,t,ou(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ln(a.lessThan(0),()=>Tn(1));const o=a.sqrt(),u=gm(n,e),l=yg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=hn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Tn(1).add(t).div(Tn(1).sub(t))})(i.clamp(0,.9999)),g=gm(p,n.toVec3()),m=yg({f0:g,f90:1,dotVH:o}),f=Tn(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),b=Tn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Tn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return np({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=Tn(54856e-17,44201e-17,52481e-17),i=Tn(1681e3,1795300,2208400),n=Tn(43278e5,93046e5,66121e5),a=hn(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=Tn(o.x.add(a),o.y,o.z).div(1.0685e-7),pm.mul(o)})(hn(e).mul(y),hn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Tn(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"}]}),fm=an(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=hn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=hn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),ym=Tn(.04),bm=hn(1);class xm extends pg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Tn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Tn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Tn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Tn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Tn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Wd.dot(Fd).clamp(),t=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Zn}),r=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Un.rgb});this.iridescenceFresnel=su(t,r,kn),this.iridescenceF0Dielectric=Vg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Vg({f:r,f90:1,dotVH:e}),this.iridescenceF0=su(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,kn)}if(!0===this.transmission){const t=Bd,r=nd.sub(Bd).normalize(),s=Hd,i=e.context;i.backdrop=hm(s,r,Vn,In,Jn,ea,t,yd,rd,ed,aa,ua,da,la,this.dispersion?ca:null),i.backdropAlpha=oa,Un.a.mulAssign(su(1,i.backdrop.a,oa))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=Wd.dot(Fd).clamp(),a=Ug({roughness:Vn,dotNV:n}),o=i?Hn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(zg({lightDirection:e})));const t=fm({normal:Wd,viewDir:Fd,roughness:Wn}),r=fm({normal:Wd,viewDir:e,roughness:Wn}),i=$n.r.max($n.g).max($n.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=jd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Lg({lightDirection:e,f0:ym,f90:bm,roughness:zn,normalView:jd})))}r.directDiffuse.addAssign(s.mul(bg({diffuseColor:In}))),r.directSpecular.addAssign(s.mul(Ig({lightDirection:e,f0:Jn,f90:1,roughness:Vn,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=Wd,h=Fd,p=Ld.toVar(),g=$g({N:c,V:h,roughness:Vn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Cn(Tn(m.x,0,m.y),Tn(0,1,0),Tn(m.z,0,m.w)).toVar(),b=Jn.mul(f.x).add(Jn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(jg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(In).mul(jg({N:c,V:h,P:p,mInv:Cn(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,s=t.mul(bg({diffuseColor:In})).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul($n,fm({normal:Wd,viewDir:Fd,roughness:Wn}))),!0===this.clearcoat){const e=jd.dot(Fd).clamp(),t=Og({dotNV:e,specularColor:ym,specularF90:bm,roughness:zn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Tn().toVar("singleScatteringDielectric"),n=Tn().toVar("multiScatteringDielectric"),a=Tn().toVar("singleScatteringMetallic"),o=Tn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ea,Zn,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ea,Un.rgb,this.iridescenceF0Metallic);const u=su(i,a,kn),l=su(n,o,kn),d=i.add(n),c=In.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Wd.dot(Fd).clamp().add(t),i=Vn.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=jd.dot(Fd).clamp(),r=yg({dotVH:e,f0:ym,f90:bm}),s=t.mul(Gn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Gn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Tm=hn(1),_m=hn(-2),vm=hn(.8),Nm=hn(-1),Sm=hn(.4),Rm=hn(2),Am=hn(.305),Em=hn(3),wm=hn(.21),Cm=hn(4),Mm=hn(4),Bm=hn(16),Pm=an(([e])=>{const t=Tn(wo(e)).toVar(),r=hn(-1).toVar();return ln(t.x.greaterThan(t.z),()=>{ln(t.x.greaterThan(t.y),()=>{r.assign(fu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}).Else(()=>{ln(t.z.greaterThan(t.y),()=>{r.assign(fu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Lm=an(([e,t])=>{const r=fn().toVar();return ln(t.equal(0),()=>{r.assign(fn(e.z,e.y).div(wo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(fn(e.x.negate(),e.z.negate()).div(wo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(fn(e.x.negate(),e.y).div(wo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(fn(e.z.negate(),e.y).div(wo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(fn(e.x.negate(),e.z).div(wo(e.y)))}).Else(()=>{r.assign(fn(e.x,e.y).div(wo(e.z)))}),Ma(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Fm=an(([e])=>{const t=hn(0).toVar();return ln(e.greaterThanEqual(vm),()=>{t.assign(Tm.sub(e).mul(Nm.sub(_m)).div(Tm.sub(vm)).add(_m))}).ElseIf(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Sm.sub(e).mul(Em.sub(Rm)).div(Sm.sub(Am)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Am.sub(e).mul(Cm.sub(Em)).div(Am.sub(wm)).add(Em))}).Else(()=>{t.assign(hn(-2).mul(mo(Ma(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Dm=an(([e,t])=>{const r=e.toVar();r.assign(Ma(2,r).sub(1));const s=Tn(r,1).toVar();return ln(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"}]}),Um=an(([e,t,r,s,i,n])=>{const a=hn(r),o=Tn(t),u=iu(Fm(a),_m,n),l=_o(u),d=bo(u),c=Tn(Im(e,o,d,s,i,n)).toVar();return ln(l.notEqual(0),()=>{const t=Tn(Im(e,o,d.add(1),s,i,n)).toVar();c.assign(su(c,t,l))}),c}),Im=an(([e,t,r,s,i,n])=>{const a=hn(r).toVar(),o=Tn(t),u=hn(Pm(o)).toVar(),l=hn($o(Mm.sub(a),0)).toVar();a.assign($o(a,Mm));const d=hn(po(a)).toVar(),c=fn(Lm(o,u).mul(d.sub(2)).add(1)).toVar();return ln(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Ma(3,Bm))),c.y.addAssign(Ma(4,po(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(fn(),fn())}),Om=an(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=No(s),l=r.mul(u).add(i.cross(r).mul(vo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Im(e,l,t,n,a,o)}),Vm=an(({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=Tn(fu(t,r,Ko(r,s))).toVar();ln(h.equal(Tn(0)),()=>{h.assign(Tn(s.z,0,s.x.negate()))}),h.assign(To(h));const p=Tn().toVar();return p.addAssign(i.element(0).mul(Om({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),np({start:pn(1),end:e},({i:e})=>{ln(e.greaterThanEqual(n),()=>{ap()});const t=hn(a.mul(hn(e))).toVar();p.addAssign(i.element(e).mul(Om({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(Om({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),Sn(p,1)}),km=an(([e])=>{const t=gn(e).toVar();return t.assign(t.shiftLeft(gn(16)).bitOr(t.shiftRight(gn(16)))),t.assign(t.bitAnd(gn(1431655765)).shiftLeft(gn(1)).bitOr(t.bitAnd(gn(2863311530)).shiftRight(gn(1)))),t.assign(t.bitAnd(gn(858993459)).shiftLeft(gn(2)).bitOr(t.bitAnd(gn(3435973836)).shiftRight(gn(2)))),t.assign(t.bitAnd(gn(252645135)).shiftLeft(gn(4)).bitOr(t.bitAnd(gn(4042322160)).shiftRight(gn(4)))),t.assign(t.bitAnd(gn(16711935)).shiftLeft(gn(8)).bitOr(t.bitAnd(gn(4278255360)).shiftRight(gn(8)))),hn(t).mul(2.3283064365386963e-10)}),Gm=an(([e,t])=>fn(hn(e).div(hn(t)),km(e))),zm=an(([e,t,r])=>{const s=Tn(t).toVar(),i=hn(r),n=i.mul(i).toVar(),a=To(Tn(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=fu(o.greaterThan(0),Tn(a.y.negate(),a.x,0).div(fo(o)),Tn(1,0,0)).toVar(),l=Ko(a,u).toVar(),d=fo(e.x),c=Ma(2,3.14159265359).mul(e.y),h=d.mul(No(c)).toVar(),p=d.mul(vo(c)).toVar(),g=Ma(.5,a.z.add(1));p.assign(g.oneMinus().mul(fo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(fo($o(0,h.mul(h).add(p.mul(p)).oneMinus()))));return To(Tn(n.mul(m.x),n.mul(m.y),$o(0,m.z)))}),$m=an(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Tn(s).toVar(),l=Tn(0).toVar(),d=hn(0).toVar();return ln(e.lessThan(.001),()=>{l.assign(Im(r,u,t,n,a,o))}).Else(()=>{const s=fu(wo(u.z).lessThan(.999),Tn(0,0,1),Tn(1,0,0)),c=To(Ko(s,u)).toVar(),h=Ko(u,c).toVar();np({start:gn(0),end:i},({i:s})=>{const p=Gm(s,i),g=zm(p,Tn(0,0,1),e),m=To(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=To(m.mul(Xo(u,m).mul(2)).sub(u)),y=$o(Xo(u,f),0);ln(y.greaterThan(0),()=>{const e=Im(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),ln(d.greaterThan(0),()=>{l.assign(l.div(d))})}),Sn(l,1)}),Wm=[.125,.215,.35,.446,.526,.582],Hm=20,jm=new _e(-1,1,1,-1,0,1),qm=new ve(90,1),Xm=new e;let Km=null,Ym=0,Qm=0;const Zm=new r,Jm=new WeakMap,ef=[3,1,5,0,4,2],tf=Dm(Nl(),vl("faceIndex")).normalize(),rf=Tn(tf.x,tf.y,tf.z);class sf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=Zm,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Km=this._renderer.getRenderTarget(),Ym=this._renderer.getActiveCubeFace(),Qm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=uf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=lf(),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===F||e.mapping===D?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=Wm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=ef[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Il(new Array(Hm).fill(0)),n=xa(new r(0,1,0)),a=xa(0),o=hn(Hm),u=xa(0),l=xa(1),d=Bl(),c=xa(0),h=hn(1/t),p=hn(1/s),g=hn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:rf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=of("blur");return f.fragmentNode=Vm({...m,latitudinal:u.equal(1)}),Jm.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Bl(),i=xa(0),n=xa(0),a=hn(1/t),o=hn(1/r),u=hn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=of("ggx");return d.fragmentNode=$m({...l,N_immutable:rf,GGX_SAMPLES:gn(512)}),Jm.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,jm)}_sceneToCubeUV(e,t,r,s,i){const n=qm;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(Xm),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Xm),h=!0),u.setRenderTarget(s),u.clear(),h&&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;af(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===F||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=uf(e)):null===this._equirectMaterial&&(this._equirectMaterial=lf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;af(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,jm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,af(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,jm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,af(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,jm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=Jm.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):Hm;f>Hm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,jm)}}function nf(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function af(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function of(e){const t=new jp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function uf(e){const t=of("cubemap");return t.fragmentNode=dc(e,rf),t}function lf(e){const t=of("equirect");return t.fragmentNode=Bl(e,ig(rf),0),t}const df=new WeakMap;function cf(e,t,r){const s=function(e){let t=df.get(e);void 0===t&&(t=new WeakMap,df.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 hf extends li{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 N;s.isRenderTargetTexture=!0,this._texture=Bl(s),this._width=xa(0),this._height=xa(0),this._maxMip=xa(0),this.updateBeforeType=Qs.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:cf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new sf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=rc.mul(Tn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Um(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const pf=en(hf).setParameterLength(1,3),gf=new WeakMap;class mf extends hp{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=gf.get(e);void 0===s&&(s=pf(e),gf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?zc:Wd,i=r.context(ff(Vn,s)).mul(tc),n=r.context(yf(Hd)).mul(Math.PI).mul(tc),a=il(i),o=il(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(ff(zn,jd)).mul(tc),t=il(e);u.addAssign(t)}}}const ff=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fd.negate().reflect(t),r=Jo(e).mix(r,t).normalize(),r=r.transformDirection(rd)),r),getTextureLevel:()=>e}},yf=e=>({getUV:()=>e,getTextureLevel:()=>hn(1)}),bf=new we;class xf extends jp{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(bf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new mf(t):null}setupLightingModel(){return new xm}setupSpecular(){const e=su(Tn(.04),Un.rgb,kn);Zn.assign(Tn(.04)),Jn.assign(e),ea.assign(1)}setupVariants(){const e=this.metalnessNode?hn(this.metalnessNode):dh;kn.assign(e);let t=this.roughnessNode?hn(this.roughnessNode):lh;t=Eg({roughness:t}),Vn.assign(t),this.setupSpecular(),In.assign(Un.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Tf=new Ce;class _f extends xf{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(Tf),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?hn(this.iorNode):Sh;aa.assign(e),Zn.assign(zo(Qo(aa.sub(1).div(aa.add(1))).mul(ah),Tn(1)).mul(nh)),Jn.assign(su(Zn,Un.rgb,kn)),ea.assign(su(nh,1,kn))}setupLightingModel(){return new xm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?hn(this.clearcoatNode):hh,t=this.clearcoatRoughnessNode?hn(this.clearcoatRoughnessNode):ph;Gn.assign(e),zn.assign(Eg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Tn(this.sheenNode):fh,t=this.sheenRoughnessNode?hn(this.sheenRoughnessNode):yh;$n.assign(e),Wn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?hn(this.iridescenceNode):xh,t=this.iridescenceIORNode?hn(this.iridescenceIORNode):Th,r=this.iridescenceThicknessNode?hn(this.iridescenceThicknessNode):_h;Hn.assign(e),jn.assign(t),qn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?fn(this.anisotropyNode):bh).toVar();Kn.assign(e.length()),ln(Kn.equal(0),()=>{e.assign(fn(1,0))}).Else(()=>{e.divAssign(fn(Kn)),Kn.assign(Kn.saturate())}),Xn.assign(Kn.pow2().mix(Vn.pow2(),1)),Yn.assign(kc[0].mul(e.x).add(kc[1].mul(e.y))),Qn.assign(kc[1].mul(e.x).sub(kc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?hn(this.transmissionNode):vh,t=this.thicknessNode?hn(this.thicknessNode):Nh,r=this.attenuationDistanceNode?hn(this.attenuationDistanceNode):Rh,s=this.attenuationColorNode?Tn(this.attenuationColorNode):Ah;if(oa.assign(e),ua.assign(t),la.assign(r),da.assign(s),this.useDispersion){const e=this.dispersionNode?hn(this.dispersionNode):Lh;ca.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Tn(this.clearcoatNormalNode):gh}setup(e){e.context.setupClearcoatNormal=()=>Mu(this.setupClearcoatNormal(e),"NORMAL","vec3"),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 vf extends xm{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(Wd.mul(a)).normalize(),h=hn(Fd.dot(c.negate()).saturate().pow(l).mul(d)),p=Tn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Nf extends _f{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=hn(.1),this.thicknessAmbientNode=hn(0),this.thicknessAttenuationNode=hn(.1),this.thicknessPowerNode=hn(2),this.thicknessScaleNode=hn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new vf(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 Sf=an(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=fn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=fc("gradientMap","texture").context({getUV:()=>i});return Tn(e.r)}{const e=i.fwidth().mul(.5);return su(Tn(.7),Tn(1),ou(hn(.7).sub(e.x),hn(.7).add(e.x),i.x))}});class Rf extends pg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Sf({normal:Vd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(bg({diffuseColor:Un.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const Af=new Me;class Ef extends jp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Af),this.setValues(e)}setupLightingModel(){return new Rf}}const wf=an(()=>{const e=Tn(Fd.z,0,Fd.x.negate()).normalize(),t=Fd.cross(e);return fn(e.dot(Wd),t.dot(Wd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Cf=new Be;class Mf extends jp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Cf),this.setValues(e)}setupVariants(e){const t=wf;let r;r=e.material.matcap?fc("matcap","texture").context({getUV:()=>t}):Tn(su(.2,.8,t.y)),Un.rgb.mulAssign(r.rgb)}}class Bf extends li{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 wn(e,s,s.negate(),e).mul(r)}{const e=t,s=Mn(Sn(1,0,0,0),Sn(0,No(e.x),vo(e.x).negate(),0),Sn(0,vo(e.x),No(e.x),0),Sn(0,0,0,1)),i=Mn(Sn(No(e.y),0,vo(e.y),0),Sn(0,1,0,0),Sn(vo(e.y).negate(),0,No(e.y),0),Sn(0,0,0,1)),n=Mn(Sn(No(e.z),vo(e.z).negate(),0,0),Sn(vo(e.z),No(e.z),0,0),Sn(0,0,1,0),Sn(0,0,0,1));return s.mul(i).mul(n).mul(Sn(r,1)).xyz}}}const Pf=en(Bf).setParameterLength(2),Lf=new Pe;class Ff extends jp{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(Lf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Sd.mul(Tn(s||0));let u=fn(yd[0].xyz.length(),yd[1].xyz.length());null!==n&&(u=u.mul(fn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=wd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Gu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=hn(i||mh),c=Pf(l,d);return Sn(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 Df=new Le,Uf=new t;class If extends Ff{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Sd.mul(Tn(e||Cd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?fn(n):Ph;u=u.mul(zl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Of.div(Ld.z.negate()))),i&&i.isNode&&(u=u.mul(fn(i)));let l=wd.xy;if(s&&s.isNode){const e=hn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(ql.div(2)),l=l.mul(o.w),o=o.add(Sn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Of=xa(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Uf);this.value=.5*t.y});class Vf extends pg{constructor(){super(),this.shadowNode=hn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Un.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Un.rgb)}}const kf=new Fe;class Gf extends jp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(kf),this.setValues(e)}setupLightingModel(){return new Vf}}const zf=Fn("vec3"),$f=Fn("vec3"),Wf=Fn("vec3");class Hf extends pg{constructor(){super()}start(e){const{material:t}=e,r=Fn("vec3"),s=Fn("vec3");ln(nd.sub(Bd).length().greaterThan(_d.mul(2)),()=>{r.assign(nd),s.assign(Bd)}).Else(()=>{r.assign(Bd),s.assign(nd)});const i=s.sub(r),n=xa("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=hn(0).toVar(),l=Tn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),np(n,()=>{const s=r.add(o.mul(u)),i=rd.mul(Sn(s,1)).xyz;let n;null!==t.depthNode&&($f.assign(Bp(Ap(i.z,Zl,Jl))),e.context.sceneDepthNode=Bp(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,zf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&zf.mulAssign(n);const d=zf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),Wf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ln(r.greaterThanEqual($f),()=>{zf.addAssign(e)}):zf.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(qg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Wf)}}class jf extends jp{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=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Hf}}class qf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};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 Xf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}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)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Fs(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}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=Us(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Us(e,1)),e=Us(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Qf=[];class Zf{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);Qf[0]=e,Qf[1]=t,Qf[2]=n,Qf[3]=i;let l=u.get(Qf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Qf,l)):(l.camera=s,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)),Qf[0]=null,Qf[1]=null,Qf[2]=null,Qf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Xf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Yf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Jf{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 ey=1,ty=2,ry=3,sy=4,iy=16;class ny extends Jf{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===ey?this.backend.createAttribute(e):t===ty?this.backend.createIndexAttribute(e):t===ry?this.backend.createStorageAttribute(e):t===sy&&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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,ry):this.updateAttribute(e,ey);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,ty);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,sy)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=oy(t),e.set(t,r)):r.version!==ay(t)&&(this.attributes.delete(r),r=oy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class ly{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):o("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 dy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class cy extends dy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class hy extends dy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let py=0;class gy{constructor(e,t,r,s=null,i=null){this.id=py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class my extends Jf{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 gy(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 gy(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 gy(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 hy(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 cy(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 fy extends Jf{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function yy(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 by(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 xy(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class Ty{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||yy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||by),this.transparent.length>1&&this.transparent.sort(t||by)}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=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,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.isArrayTexture?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 e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Ey){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput?this.outputNode.build(e,...t):super.build(e,...t),on(r),e.removeActiveStack(this),o}}const Py=en(By).setParameterLength(0,1);class Ly extends ai{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=zs(i),a=$s(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}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.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Fy extends ai{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.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.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Dy extends ai{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;tnew ky(e,"uint","float"),$y={};class Wy extends eo{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(Gy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return gn;case"int":return pn;case"uvec2":return bn;case"uvec3":return vn;case"uvec4":return An;case"ivec2":return yn;case"ivec3":return _n;case"ivec4":return Rn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t);const i=hn(s.bitAnd(Bo(s))),n=zy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{ln(e.equal(gn(0)),()=>gn(32));const s=gn(0),i=gn(0);return this._resolveElementType(e,s,t),ln(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),ln(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),ln(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),ln(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),ln(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(gn(1)).bitAnd(gn(1431655765)))),s.assign(s.bitAnd(gn(858993459)).add(s.shiftRight(gn(2)).bitAnd(gn(858993459))));const i=s.add(s.shiftRight(gn(4))).bitAnd(gn(252645135)).mul(gn(16843009)).shiftRight(gn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return an(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Wy.COUNT_TRAILING_ZEROS="countTrailingZeros",Wy.COUNT_LEADING_ZEROS="countLeadingZeros",Wy.COUNT_ONE_BITS="countOneBits";const Hy=rn(Wy,Wy.COUNT_TRAILING_ZEROS).setParameterLength(1),jy=rn(Wy,Wy.COUNT_LEADING_ZEROS).setParameterLength(1),qy=rn(Wy,Wy.COUNT_ONE_BITS).setParameterLength(1),Xy=an(([e])=>{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)}),Ky=(e,t)=>Yo(Ma(4,e.mul(Ca(1,e))),t);class Yy extends li{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const Qy=rn(Yy,"snorm").setParameterLength(1),Zy=rn(Yy,"unorm").setParameterLength(1),Jy=rn(Yy,"float16").setParameterLength(1);class eb extends li{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const tb=rn(eb,"snorm").setParameterLength(1),rb=rn(eb,"unorm").setParameterLength(1),sb=rn(eb,"float16").setParameterLength(1),ib=an(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),nb=an(([e])=>Tn(ib(e.z.add(ib(e.y.mul(1)))),ib(e.z.add(ib(e.x.mul(1)))),ib(e.y.add(ib(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),ab=an(([e,t,r])=>{const s=Tn(e).toVar(),i=hn(1.4).toVar(),n=hn(0).toVar(),a=Tn(s).toVar();return np({start:hn(0),end:hn(3),type:"float",condition:"<="},()=>{const e=Tn(nb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(hn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=hn(ib(s.z.add(ib(s.x.add(ib(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 ob extends ai{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const ub=en(ob),lb=e=>(...t)=>ub(e,...t),db=xa(0).setGroup(fa).onRenderUpdate(e=>e.time),cb=xa(0).setGroup(fa).onRenderUpdate(e=>e.deltaTime),hb=xa(0,"uint").setGroup(fa).onRenderUpdate(e=>e.frameId);const pb=an(([e,t,r=fn(.5)])=>Pf(e.sub(r),t).add(r)),gb=an(([e,t,r=fn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),mb=an(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=yd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=yd;const i=rd.mul(s);return qi(t)&&(i[0][0]=yd[0].length(),i[0][1]=0,i[0][2]=0),qi(r)&&(i[1][0]=0,i[1][1]=yd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ed.mul(i).mul(Cd)}),fb=an(([e=null])=>{const t=Bp();return Bp(Np(e)).sub(t).lessThan(0).select($l,e)});class yb extends ai{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Nl(),r=hn(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=fn(a,o);return t.add(l).mul(u)}}const bb=en(yb).setParameterLength(3),xb=an(([e,t=null,r=null,s=hn(1),i=Cd,n=kd])=>{let a=n.abs().normalize();a=a.div(a.dot(Tn(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=Bl(d,o).mul(a.x),g=Bl(c,u).mul(a.y),m=Bl(h,l).mul(a.z);return wa(p,g,m)}),Tb=new ze,_b=new r,vb=new r,Nb=new r,Sb=new a,Rb=new r(0,0,-1),Ab=new s,Eb=new r,wb=new r,Cb=new s,Mb=new t,Bb=new Ne,Pb=$l.flipX();Bb.depthTexture=new Y(1,1);let Lb=!1;class Fb extends Cl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Bb.texture,Pb),this._reflectorBaseNode=e.reflector||new Db(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=Yi(new Fb({defaultTexture:Bb.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.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Db extends ai{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new $e,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Qs.RENDER:Qs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Mb),e.setSize(Math.round(Mb.width*r),Math.round(Mb.height*r))}setup(e){return this._updateResolution(Bb,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 Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=We,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Lb)return!1;Lb=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Mb),this._updateResolution(o,s),vb.setFromMatrixPosition(n.matrixWorld),Nb.setFromMatrixPosition(r.matrixWorld),Sb.extractRotation(n.matrixWorld),_b.set(0,0,1),_b.applyMatrix4(Sb),Eb.subVectors(vb,Nb);let u=!1;if(!0===Eb.dot(_b)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Lb=!1);u=!0}Eb.reflect(_b).negate(),Eb.add(vb),Sb.extractRotation(r.matrixWorld),Rb.set(0,0,-1),Rb.applyMatrix4(Sb),Rb.add(Nb),wb.subVectors(vb,Rb),wb.reflect(_b).negate(),wb.add(vb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Eb),a.up.set(0,1,0),a.up.applyMatrix4(Sb),a.up.reflect(_b),a.lookAt(wb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Tb.setFromNormalAndCoplanarPoint(_b,vb),Tb.applyMatrix4(a.matrixWorldInverse),Ab.set(Tb.normal.x,Tb.normal.y,Tb.normal.z,Tb.constant);const l=a.projectionMatrix;Cb.x=(Math.sign(Ab.x)+l.elements[8])/l.elements[0],Cb.y=(Math.sign(Ab.y)+l.elements[9])/l.elements[5],Cb.z=-1,Cb.w=(1+l.elements[10])/l.elements[14],Ab.multiplyScalar(1/Ab.dot(Cb));l.elements[2]=Ab.x,l.elements[6]=Ab.y,l.elements[10]=s.coordinateSystem===h?Ab.z-0:Ab.z+1-0,l.elements[14]=Ab.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Lb=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const Ub=new _e(-1,1,1,-1,0,1);class Ib extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new He([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new He(t,2))}}const Ob=new Ib;class Vb extends ne{constructor(e=null){super(Ob,e),this.camera=Ub,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,Ub)}render(e){e.render(this,Ub)}}const kb=new t;class Gb extends Cl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Nl()),this.isRTTNode=!0,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 Vb(new jp),this.updateBeforeType=Qs.RENDER}get autoResize(){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.autoResize){const t=e.getPixelRatio(),r=e.getSize(kb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Cl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const zb=(e,...t)=>Yi(new Gb(Yi(e),...t)),$b=an(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=fn(e.x,e.y.oneMinus()).mul(2).sub(1),i=Sn(Tn(e,t),1)):i=Sn(Tn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Sn(r.mul(i));return n.xyz.div(n.w)}),Wb=an(([e,t])=>{const r=t.mul(Sn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return fn(s.x,s.y.oneMinus())}),Hb=an(([e,t,r])=>{const s=Rl(Pl(t)),i=yn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(yn(2,0))).toVar(),o=Pl(t,i.sub(yn(1,0))).toVar(),u=Pl(t,i.add(yn(1,0))).toVar(),l=Pl(t,i.add(yn(2,0))).toVar(),d=Pl(t,i.add(yn(0,2))).toVar(),c=Pl(t,i.add(yn(0,1))).toVar(),h=Pl(t,i.sub(yn(0,1))).toVar(),p=Pl(t,i.sub(yn(0,2))).toVar(),g=wo(Ca(hn(2).mul(o).sub(a),n)).toVar(),m=wo(Ca(hn(2).mul(u).sub(l),n)).toVar(),f=wo(Ca(hn(2).mul(c).sub(d),n)).toVar(),y=wo(Ca(hn(2).mul(h).sub(p),n)).toVar(),b=$b(e,n,r).toVar(),x=g.lessThan(m).select(b.sub($b(e.sub(fn(hn(1).div(s.x),0)),o,r)),b.negate().add($b(e.add(fn(hn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub($b(e.add(fn(0,hn(1).div(s.y))),c,r)),b.negate().add($b(e.sub(fn(0,hn(1).div(s.y))),h,r)));return To(Ko(x,T))}),jb=an(([e])=>_o(hn(52.9829189).mul(_o(Xo(e,fn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),qb=an(([e,t,r])=>{const s=hn(2.399963229728653),i=fo(hn(e).add(.5).div(hn(t))),n=hn(e).mul(s).add(r);return fn(No(n),vo(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Xb extends ai{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Nl())}sample(e){return this.callback(e)}}class Kb extends ai{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Kb.OBJECT?this.updateType=Qs.OBJECT:e===Kb.MATERIAL?this.updateType=Qs.RENDER:e===Kb.BEFORE_OBJECT?this.updateBeforeType=Qs.OBJECT:e===Kb.BEFORE_MATERIAL&&(this.updateBeforeType=Qs.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Kb.OBJECT="object",Kb.MATERIAL="material",Kb.BEFORE_OBJECT="beforeObject",Kb.BEFORE_MATERIAL="beforeMaterial";const Yb=(e,t)=>new Kb(e,t).toStack();class Qb extends H{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Zb extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Jb extends ai{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ex=tn(Jb),tx=new P,rx=new a;class sx extends ai{static get type(){return"SceneNode"}constructor(e=sx.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===sx.BACKGROUND_BLURRINESS?s=pc("backgroundBlurriness","float",r):t===sx.BACKGROUND_INTENSITY?s=pc("backgroundIntensity","float",r):t===sx.BACKGROUND_ROTATION?s=xa("mat4").setName("backgroundRotation").setGroup(fa).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==je?(tx.copy(r.backgroundRotation),tx.x*=-1,tx.y*=-1,tx.z*=-1,rx.makeRotationFromEuler(tx)):rx.identity(),rx}):o("SceneNode: Unknown scope:",t),s}}sx.BACKGROUND_BLURRINESS="backgroundBlurriness",sx.BACKGROUND_INTENSITY="backgroundIntensity",sx.BACKGROUND_ROTATION="backgroundRotation";const ix=tn(sx,sx.BACKGROUND_BLURRINESS),nx=tn(sx,sx.BACKGROUND_INTENSITY),ax=tn(sx,sx.BACKGROUND_ROTATION);class ox extends Cl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=Js.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Js.READ_WRITE)}toReadOnly(){return this.setAccess(Js.READ_ONLY)}toWriteOnly(){return this.setAccess(Js.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const ux=en(ox).setParameterLength(1,3),lx=an(({texture:e,uv:t})=>{const r=1e-4,s=Tn().toVar();return ln(t.x.lessThan(r),()=>{s.assign(Tn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Tn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Tn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Tn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Tn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Tn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Tn(-.01,0,0))).r.sub(e.sample(t.add(Tn(r,0,0))).r),n=e.sample(t.add(Tn(0,-.01,0))).r.sub(e.sample(t.add(Tn(0,r,0))).r),a=e.sample(t.add(Tn(0,0,-.01))).r.sub(e.sample(t.add(Tn(0,0,r))).r);s.assign(Tn(i,n,a))}),s.normalize()});class dx extends Cl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Tn(.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(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return lx({texture:this,uv:e})}}const cx=en(dx).setParameterLength(1,3);class hx extends hc{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 px=new WeakMap;class gx extends li{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Qs.OBJECT,this.updateAfterType=Qs.OBJECT,this.previousModelWorldMatrix=xa(new a),this.previousProjectionMatrix=xa(new a).setGroup(fa),this.previousCameraViewMatrix=xa(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=fx(r);this.previousModelWorldMatrix.value.copy(s);const i=mx(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}){fx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ed:xa(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Sd).mul(Cd),s=this.previousProjectionMatrix.mul(t).mul(Md),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ca(i,n)}}function mx(e){let t=px.get(e);return void 0===t&&(t={},px.set(e,t)),t}function fx(e,t=0){const r=mx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const yx=tn(gx),bx=an(([e])=>vx(e.rgb)),xx=an(([e,t=hn(1)])=>t.mix(vx(e.rgb),e.rgb)),Tx=an(([e,t=hn(1)])=>{const r=wa(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 su(e.rgb,s,i)}),_x=an(([e,t=hn(1)])=>{const r=Tn(.57735,.57735,.57735),s=t.cos();return Tn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Xo(r,e.rgb).mul(s.oneMinus())))))}),vx=(e,t=Tn(p.getLuminanceCoefficients(new r)))=>Xo(e,t),Nx=an(([e,t=Tn(1),s=Tn(0),i=Tn(1),n=hn(1),a=Tn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(Tn(a)),u=$o(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ln(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ln(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ln(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),Sn(u.rgb,e.a)});class Sx extends li{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 Rx=en(Sx).setParameterLength(2),Ax=new t;class Ex extends Cl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class wx extends Ex{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(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Cx extends li{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 Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=xa(0),this._cameraFar=xa(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Qs.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}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=new wx(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=new wx(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=Ep(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=Rp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Cx.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),Ax.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Ax)),this._pixelRatio=i,this.setSize(Ax.width,Ax.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:bu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Cx.COLOR="color",Cx.DEPTH="depth";class Mx extends Cx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Cx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 jp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=kd.negate(),r=ed.mul(Sd),s=hn(1),i=r.mul(Sn(Cd,1)),n=r.mul(Sn(Cd.add(t),1)),a=To(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Sn(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 Bx=an(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Px=an(([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"}]}),Lx=an(([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"}]}),Fx=an(([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)}),Dx=an(([e,t])=>{const r=Cn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Cn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Fx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ux=Cn(Tn(1.6605,-.1246,-.0182),Tn(-.5876,1.1329,-.1006),Tn(-.0728,-.0083,1.1187)),Ix=Cn(Tn(.6274,.0691,.0164),Tn(.3293,.9195,.088),Tn(.0433,.0113,.8956)),Ox=an(([e])=>{const t=Tn(e).toVar(),r=Tn(t.mul(t)).toVar(),s=Tn(r.mul(r)).toVar();return hn(15.5).mul(s.mul(r)).sub(Ma(40.14,s.mul(t))).add(Ma(31.96,s).sub(Ma(6.868,r.mul(t))).add(Ma(.4298,r).add(Ma(.1191,t).sub(.00232))))}),Vx=an(([e,t])=>{const r=Tn(e).toVar(),s=Cn(Tn(.856627153315983,.137318972929847,.11189821299995),Tn(.0951212405381588,.761241990602591,.0767994186031903),Tn(.0482516061458583,.101439036467562,.811302368396859)),i=Cn(Tn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Tn(-.11060664309660323,1.157823702216272,-.11060664309660294),Tn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=hn(-12.47393),a=hn(4.026069);return r.mulAssign(t),r.assign(Ix.mul(r)),r.assign(s.mul(r)),r.assign($o(r,1e-10)),r.assign(mo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(iu(r,0,1)),r.assign(Ox(r)),r.assign(i.mul(r)),r.assign(Yo($o(Tn(0),r),Tn(2.2))),r.assign(Ux.mul(r)),r.assign(iu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=an(([e,t])=>{const r=hn(.76),s=hn(.15);e=e.mul(t);const i=zo(e.r,zo(e.g,e.b)),n=fu(i.lessThan(.08),i.sub(Ma(6.25,i.mul(i))),.04);e.subAssign(n);const a=$o(e.r,$o(e.g,e.b));ln(a.lessThan(r),()=>e);const o=Ca(1,r),u=Ca(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ca(1,Ba(1,s.mul(a.sub(u)).add(1)));return su(e,Tn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Gx extends ai{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}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 zx=en(Gx).setParameterLength(1,3);class $x extends Gx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 Hx extends ai{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,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:hn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=qs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const jx=en(Hx).setParameterLength(1);class qx 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 Xx{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 Kx=new qx;class Yx extends ai{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new qx,this._output=jx(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]=jx(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]=jx(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 Xx(this),t=Kx.get("THREE"),r=Kx.get("TSL"),s=this.getMethod(),i=[e,this._local,Kx,()=>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:hn()}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=[Fs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ds(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 Qx=en(Yx).setParameterLength(1,2);function Zx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ld.z).negate()}const Jx=an(([e,t],r)=>{const s=Zx(r);return ou(e,t,s)}),eT=an(([e],t)=>{const r=Zx(t);return e.mul(e,r,r).negate().exp().oneMinus()}),tT=an(([e,t])=>Sn(t.toFloat().mix(ra.rgb,e.toVec3()),ra.a));let rT=null,sT=null;class iT extends ai{static get type(){return"RangeNode"}constructor(e=hn(),t=hn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Ws(t.value)),i=e.getTypeLength(Ws(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Ws(a)),d=e.getTypeLength(Ws(o));rT=rT||new s,sT=sT||new s,rT.setScalar(0),sT.setScalar(0),1===u?rT.setScalar(a):a.isColor?rT.set(a.r,a.g,a.b,1):rT.set(a.x,a.y,a.z||0,a.w||0),1===d?sT.setScalar(o):o.isColor?sT.set(o.r,o.g,o.b,1):sT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew aT(e,t),uT=oT("numWorkgroups","uvec3"),lT=oT("workgroupId","uvec3"),dT=oT("globalId","uvec3"),cT=oT("localId","uvec3"),hT=oT("subgroupSize","uint");const pT=en(class extends ai{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 gT extends oi{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 mT extends ai{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new gT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class fT extends ai{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(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=hl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}fT.ATOMIC_LOAD="atomicLoad",fT.ATOMIC_STORE="atomicStore",fT.ATOMIC_ADD="atomicAdd",fT.ATOMIC_SUB="atomicSub",fT.ATOMIC_MAX="atomicMax",fT.ATOMIC_MIN="atomicMin",fT.ATOMIC_AND="atomicAnd",fT.ATOMIC_OR="atomicOr",fT.ATOMIC_XOR="atomicXor";const yT=en(fT),bT=(e,t,r)=>yT(e,t,r).toStack();class xT extends li{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===xT.SUBGROUP_ELECT?"bool":t===xT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===xT.SUBGROUP_BROADCAST||r===xT.SUBGROUP_SHUFFLE||r===xT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===xT.SUBGROUP_SHUFFLE_XOR||r===xT.SUBGROUP_SHUFFLE_DOWN||r===xT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}xT.SUBGROUP_ELECT="subgroupElect",xT.SUBGROUP_BALLOT="subgroupBallot",xT.SUBGROUP_ADD="subgroupAdd",xT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",xT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",xT.SUBGROUP_MUL="subgroupMul",xT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",xT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",xT.SUBGROUP_AND="subgroupAnd",xT.SUBGROUP_OR="subgroupOr",xT.SUBGROUP_XOR="subgroupXor",xT.SUBGROUP_MIN="subgroupMin",xT.SUBGROUP_MAX="subgroupMax",xT.SUBGROUP_ALL="subgroupAll",xT.SUBGROUP_ANY="subgroupAny",xT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",xT.QUAD_SWAP_X="quadSwapX",xT.QUAD_SWAP_Y="quadSwapY",xT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",xT.SUBGROUP_BROADCAST="subgroupBroadcast",xT.SUBGROUP_SHUFFLE="subgroupShuffle",xT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",xT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",xT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",xT.QUAD_BROADCAST="quadBroadcast";const TT=rn(xT,xT.SUBGROUP_ELECT).setParameterLength(0),_T=rn(xT,xT.SUBGROUP_BALLOT).setParameterLength(1),vT=rn(xT,xT.SUBGROUP_ADD).setParameterLength(1),NT=rn(xT,xT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),ST=rn(xT,xT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),RT=rn(xT,xT.SUBGROUP_MUL).setParameterLength(1),AT=rn(xT,xT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),ET=rn(xT,xT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),wT=rn(xT,xT.SUBGROUP_AND).setParameterLength(1),CT=rn(xT,xT.SUBGROUP_OR).setParameterLength(1),MT=rn(xT,xT.SUBGROUP_XOR).setParameterLength(1),BT=rn(xT,xT.SUBGROUP_MIN).setParameterLength(1),PT=rn(xT,xT.SUBGROUP_MAX).setParameterLength(1),LT=rn(xT,xT.SUBGROUP_ALL).setParameterLength(0),FT=rn(xT,xT.SUBGROUP_ANY).setParameterLength(0),DT=rn(xT,xT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),UT=rn(xT,xT.QUAD_SWAP_X).setParameterLength(1),IT=rn(xT,xT.QUAD_SWAP_Y).setParameterLength(1),OT=rn(xT,xT.QUAD_SWAP_DIAGONAL).setParameterLength(1),VT=rn(xT,xT.SUBGROUP_BROADCAST).setParameterLength(2),kT=rn(xT,xT.SUBGROUP_SHUFFLE).setParameterLength(2),GT=rn(xT,xT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),zT=rn(xT,xT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),$T=rn(xT,xT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),WT=rn(xT,xT.QUAD_BROADCAST).setParameterLength(1);let HT;function jT(e){HT=HT||new WeakMap;let t=HT.get(e);return void 0===t&&HT.set(e,t={}),t}function qT(e){const t=jT(e);return t.shadowMatrix||(t.shadowMatrix=xa("mat4").setGroup(fa).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function XT(e,t=Bd){const r=qT(e).mul(t);return r.xyz.div(r.w)}function KT(e){const t=jT(e);return t.position||(t.position=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function YT(e){const t=jT(e);return t.targetPosition||(t.targetPosition=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function QT(e){const t=jT(e);return t.viewPosition||(t.viewPosition=xa(new r).setGroup(fa).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const ZT=e=>rd.transformDirection(KT(e).sub(YT(e))),JT=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},e_=new WeakMap,t_=[];class r_ extends ai{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Fn("vec3","totalDiffuse"),this.totalSpecularNode=Fn("vec3","totalSpecular"),this.outgoingLightNode=Fn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Yi(e));else{let s=null;if(null!==r&&(s=JT(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;e_.has(e)?s=e_.get(e):(s=new r(e),e_.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.getNodeProperties(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=Tn(null!==l?l.mix(g,u):u)),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 s_ extends ai{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Qs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){i_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Bd)}}const i_=Fn("vec3","shadowPositionWorld");function n_(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 a_(e,t){return t=n_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function o_(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 u_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function l_(e,t){return t=u_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function d_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function c_(e,t,r){return r=l_(t,r=a_(e,r))}function h_(e,t,r){o_(e,r),d_(t,r)}var p_=Object.freeze({__proto__:null,resetRendererAndSceneState:c_,resetRendererState:a_,resetSceneState:l_,restoreRendererAndSceneState:h_,restoreRendererState:o_,restoreSceneState:d_,saveRendererAndSceneState:function(e,t,r={}){return r=u_(t,r=n_(e,r))},saveRendererState:n_,saveSceneState:u_});const g_=new WeakMap,m_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),f_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=pc("radius","float",r).setGroup(fa),o=fn(1).div(n),u=a.mul(o.x),l=jb(Hl.xy).mul(6.28318530718);return wa(i(t.xy.add(qb(0,5,l).mul(u)),t.z),i(t.xy.add(qb(1,5,l).mul(u)),t.z),i(t.xy.add(qb(2,5,l).mul(u)),t.z),i(t.xy.add(qb(3,5,l).mul(u)),t.z),i(t.xy.add(qb(4,5,l).mul(u)),t.z)).mul(.2)}),y_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=fn(1).div(n),o=a.x,u=a.y,l=t.xy,d=_o(l.mul(n).add(.5));return l.subAssign(d.mul(a)),wa(i(l,t.z),i(l.add(fn(o,0)),t.z),i(l.add(fn(0,u)),t.z),i(l.add(a),t.z),su(i(l.add(fn(o.negate(),0)),t.z),i(l.add(fn(o.mul(2),0)),t.z),d.x),su(i(l.add(fn(o.negate(),u)),t.z),i(l.add(fn(o.mul(2),u)),t.z),d.x),su(i(l.add(fn(0,u.negate())),t.z),i(l.add(fn(0,u.mul(2))),t.z),d.y),su(i(l.add(fn(o,u.negate())),t.z),i(l.add(fn(o,u.mul(2))),t.z),d.y),su(su(i(l.add(fn(o.negate(),u.negate())),t.z),i(l.add(fn(o.mul(2),u.negate())),t.z),d.x),su(i(l.add(fn(o.negate(),u.mul(2))),t.z),i(l.add(fn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),b_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=$o(1e-7,s.y.mul(s.y)),a=Wo(t.z,i);ln(a.equal(1),()=>hn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=iu(Ca(u,.3).div(.65)),$o(a,u)}),x_=an(([e,t,r])=>{let s=Bd.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),T_=e=>{let t=g_.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=pc("near","float",t).setGroup(fa),s=pc("far","float",t).setGroup(fa),i=cd(e);return x_(i,r,s)})(e):null;t=new jp,t.colorNode=Sn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,g_.set(e,t)}return t},__=e=>{const t=g_.get(e);void 0!==t&&(t.dispose(),g_.delete(e))},v_=new Xf,N_=[],S_=(e,t,r,s)=>{N_[0]=e,N_[1]=t;let i=v_.get(N_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===qe)&&(s&&(js(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,v_.set(N_,i)),N_[0]=null,N_[1]=null,i},R_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanVertical"),a=hn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),A_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanHorizontal"),a=hn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(wa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),E_=[m_,f_,y_,b_];let w_;const C_=new Vb;class M_ extends s_{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._currentShadowType=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,hn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=pc("bias","float",r).setGroup(fa);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=pc("near","float",r.camera).setGroup(fa),s=pc("far","float",r.camera).setGroup(fa);n=wp(e.negate(),t,s)}return a=Tn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return E_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=E;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,camera:r}=e,{light:s,shadow:i}=this,n=t.shadowMap.type,{depthTexture:a,shadowMap:o}=this.setupRenderTarget(i,e);if(i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),n===qe&&!0!==i.isPointLightShadow){a.compareFunction=null,o.depth>1?(o._vsmShadowMapVertical||(o._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=o._vsmShadowMapVertical,o._vsmShadowMapHorizontal||(o._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=o._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Bl(a);a.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Bl(this.vsmShadowMapVertical.texture);a.isArrayTexture&&(r=r.depth(this.depthLayer));const s=pc("blurSamples","float",i).setGroup(fa),n=pc("radius","float",i).setGroup(fa),u=pc("mapSize","vec2",i).setGroup(fa);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new jp);l.fragmentNode=R_({samples:s,radius:n,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new jp),l.fragmentNode=A_({samples:s,radius:n,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=pc("intensity","float",i).setGroup(fa),l=pc("normalBias","float",i).setGroup(fa),d=qT(s).mul(i_.add(Hd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=n===qe&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:a,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:o.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m;o.texture.isCubeTexture?m=dc(o.texture,c.xyz):(m=Bl(o.texture,c),a.isArrayTexture&&(m=m.depth(this.depthLayer)));const f=su(1,g.rgb.mix(m,1),u.mul(m.a)).toVar();this.shadowMap=o,this.shadow.map=o;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture):Bl(this.shadowMap.texture)).toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Nl().mul(Rl(Bl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return an(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");w_=c_(i,n,w_),n.overrideMaterial=T_(r),i.setRenderObjectFunction(S_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===qe&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,h_(i,n,w_)}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),C_.material=this.vsmMaterialVertical,C_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),C_.material=this.vsmMaterialHorizontal,C_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,__(this.light),this.shadowMap&&(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)}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 B_=(e,t)=>new M_(e,t),P_=new e,L_=new a,F_=new r,D_=new r,U_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],I_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],O_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],V_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],k_=an(({depthTexture:e,bd3D:t,dp:r})=>dc(e,t).compare(r)),G_=an(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=pc("radius","float",s).setGroup(fa),n=pc("mapSize","vec2",s).setGroup(fa),a=i.div(n.x),o=wo(t),u=To(Ko(t,o.x.greaterThan(o.z).select(Tn(0,1,0),Tn(1,0,0)))),l=Ko(t,u),d=jb(Hl.xy).mul(6.28318530718),c=qb(0,5,d),h=qb(1,5,d),p=qb(2,5,d),g=qb(3,5,d),m=qb(4,5,d);return dc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(dc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),z_=an(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.near),o=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.far),u=pc("bias","float",s).setGroup(fa),l=hn(1).toVar();return ln(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 d=i.normalize();l.assign(e({depthTexture:t,bd3D:d,dp:r,shadow:s}))}),l});class $_ extends M_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Xe?k_:G_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return z_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new Ke(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=E;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?U_:O_,d=u?I_:V_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(P_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),F_.setFromMatrixPosition(s.matrixWorld),a.position.copy(F_),D_.copy(a.position),D_.add(l[e]),a.up.copy(d[e]),a.lookAt(D_),a.updateMatrixWorld(),o.makeTranslation(-F_.x,-F_.y,-F_.z),L_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(L_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const W_=(e,t)=>new $_(e,t);class H_ extends hp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||xa(this.color).setGroup(fa),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Qs.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return QT(this.light).sub(e.context.positionView||Ld)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return B_(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?Yi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 j_=an(({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)}),q_=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=j_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class X_ extends H_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(2).setGroup(fa)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return W_(this.light)}setupDirect(e){return q_({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const K_=an(([e=Nl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),Y_=an(([e=Nl()],{renderer:t,material:r})=>{const s=ru(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=hn(s.fwidth()).toVar();i=ou(e.oneMinus(),e.add(1),s).oneMinus()}else i=fu(s.greaterThan(1),0,1);return i}),Q_=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=mn(e).toVar();return fu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Z_=an(([e,t])=>{const r=mn(t).toVar(),s=hn(e).toVar();return fu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),J_=an(([e])=>{const t=hn(e).toVar();return pn(bo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ev=an(([e,t])=>{const r=hn(e).toVar();return t.assign(J_(r)),r.sub(hn(t))}),tv=lb([an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=hn(s).toVar(),l=hn(r).toVar(),d=hn(t).toVar(),c=hn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]}),an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=Tn(s).toVar(),l=Tn(r).toVar(),d=Tn(t).toVar(),c=Tn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]})]),rv=lb([an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=hn(o).toVar(),m=hn(a).toVar(),f=hn(n).toVar(),y=hn(i).toVar(),b=hn(s).toVar(),x=hn(r).toVar(),T=hn(t).toVar(),_=hn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=Tn(o).toVar(),m=Tn(a).toVar(),f=Tn(n).toVar(),y=Tn(i).toVar(),b=Tn(s).toVar(),x=Tn(r).toVar(),T=Tn(t).toVar(),_=Tn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),sv=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=gn(e).toVar(),a=gn(n.bitAnd(gn(7))).toVar(),o=hn(Q_(a.lessThan(gn(4)),i,s)).toVar(),u=hn(Ma(2,Q_(a.lessThan(gn(4)),s,i))).toVar();return Z_(o,mn(a.bitAnd(gn(1)))).add(Z_(u,mn(a.bitAnd(gn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),iv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=gn(e).toVar(),u=gn(o.bitAnd(gn(15))).toVar(),l=hn(Q_(u.lessThan(gn(8)),a,n)).toVar(),d=hn(Q_(u.lessThan(gn(4)),n,Q_(u.equal(gn(12)).or(u.equal(gn(14))),a,i))).toVar();return Z_(l,mn(u.bitAnd(gn(1)))).add(Z_(d,mn(u.bitAnd(gn(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"}]}),nv=lb([sv,iv]),av=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=vn(e).toVar();return Tn(nv(n.x,i,s),nv(n.y,i,s),nv(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"}]}),ov=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=vn(e).toVar();return Tn(nv(o.x,a,n,i),nv(o.y,a,n,i),nv(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"}]}),uv=lb([av,ov]),lv=an(([e])=>{const t=hn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),dv=an(([e])=>{const t=hn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),cv=lb([lv,an(([e])=>{const t=Tn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),hv=lb([dv,an(([e])=>{const t=Tn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),pv=an(([e,t])=>{const r=pn(t).toVar(),s=gn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(pn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),gv=an(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(pv(r,pn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(pv(r,pn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(4))),t.addAssign(e)}),mv=an(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar();return s.bitXorAssign(i),s.subAssign(pv(i,pn(14))),n.bitXorAssign(s),n.subAssign(pv(s,pn(11))),i.bitXorAssign(n),i.subAssign(pv(n,pn(25))),s.bitXorAssign(i),s.subAssign(pv(i,pn(16))),n.bitXorAssign(s),n.subAssign(pv(s,pn(4))),i.bitXorAssign(n),i.subAssign(pv(n,pn(14))),s.bitXorAssign(i),s.subAssign(pv(i,pn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),fv=an(([e])=>{const t=gn(e).toVar();return hn(t).div(hn(gn(pn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),yv=an(([e])=>{const t=hn(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"}]}),bv=lb([an(([e])=>{const t=pn(e).toVar(),r=gn(gn(1)).toVar(),s=gn(gn(pn(3735928559)).add(r.shiftLeft(gn(2))).add(gn(13))).toVar();return mv(s.add(gn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(gn(2)).toVar(),n=gn().toVar(),a=gn().toVar(),o=gn().toVar();return n.assign(a.assign(o.assign(gn(pn(3735928559)).add(i.shiftLeft(gn(2))).add(gn(13))))),n.addAssign(gn(s)),a.addAssign(gn(r)),mv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(gn(3)).toVar(),o=gn().toVar(),u=gn().toVar(),l=gn().toVar();return o.assign(u.assign(l.assign(gn(pn(3735928559)).add(a.shiftLeft(gn(2))).add(gn(13))))),o.addAssign(gn(n)),u.addAssign(gn(i)),l.addAssign(gn(s)),mv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),an(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=pn(e).toVar(),u=gn(gn(4)).toVar(),l=gn().toVar(),d=gn().toVar(),c=gn().toVar();return l.assign(d.assign(c.assign(gn(pn(3735928559)).add(u.shiftLeft(gn(2))).add(gn(13))))),l.addAssign(gn(o)),d.addAssign(gn(a)),c.addAssign(gn(n)),gv(l,d,c),l.addAssign(gn(i)),mv(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"}]}),an(([e,t,r,s,i])=>{const n=pn(i).toVar(),a=pn(s).toVar(),o=pn(r).toVar(),u=pn(t).toVar(),l=pn(e).toVar(),d=gn(gn(5)).toVar(),c=gn().toVar(),h=gn().toVar(),p=gn().toVar();return c.assign(h.assign(p.assign(gn(pn(3735928559)).add(d.shiftLeft(gn(2))).add(gn(13))))),c.addAssign(gn(l)),h.addAssign(gn(u)),p.addAssign(gn(o)),gv(c,h,p),c.addAssign(gn(a)),h.addAssign(gn(n)),mv(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"}]})]),xv=lb([an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(bv(s,r)).toVar(),n=vn().toVar();return n.x.assign(i.bitAnd(pn(255))),n.y.assign(i.shiftRight(pn(8)).bitAnd(pn(255))),n.z.assign(i.shiftRight(pn(16)).bitAnd(pn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(bv(n,i,s)).toVar(),o=vn().toVar();return o.x.assign(a.bitAnd(pn(255))),o.y.assign(a.shiftRight(pn(8)).bitAnd(pn(255))),o.z.assign(a.shiftRight(pn(16)).bitAnd(pn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Tv=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=hn(tv(nv(bv(r,s),i,n),nv(bv(r.add(pn(1)),s),i.sub(1),n),nv(bv(r,s.add(pn(1))),i,n.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=hn(rv(nv(bv(r,s,i),n,a,o),nv(bv(r.add(pn(1)),s,i),n.sub(1),a,o),nv(bv(r,s.add(pn(1)),i),n,a.sub(1),o),nv(bv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),nv(bv(r,s,i.add(pn(1))),n,a,o.sub(1)),nv(bv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),nv(bv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),_v=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=Tn(tv(uv(xv(r,s),i,n),uv(xv(r.add(pn(1)),s),i.sub(1),n),uv(xv(r,s.add(pn(1))),i,n.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=Tn(rv(uv(xv(r,s,i),n,a,o),uv(xv(r.add(pn(1)),s,i),n.sub(1),a,o),uv(xv(r,s.add(pn(1)),i),n,a.sub(1),o),uv(xv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),uv(xv(r,s,i.add(pn(1))),n,a,o.sub(1)),uv(xv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),uv(xv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),vv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return fv(bv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return fv(bv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return fv(bv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return fv(bv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Nv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return Tn(fv(bv(r,pn(0))),fv(bv(r,pn(1))),fv(bv(r,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return Tn(fv(bv(r,s,pn(0))),fv(bv(r,s,pn(1))),fv(bv(r,s,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return Tn(fv(bv(r,s,i,pn(0))),fv(bv(r,s,i,pn(1))),fv(bv(r,s,i,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return Tn(fv(bv(r,s,i,n,pn(0))),fv(bv(r,s,i,n,pn(1))),fv(bv(r,s,i,n,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Sv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=hn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(Tv(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"}]}),Rv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(_v(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"}]}),Av=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar();return fn(Sv(o,a,n,i),Sv(o.add(Tn(pn(19),pn(193),pn(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"}]}),Ev=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(Rv(o,a,n,i)).toVar(),l=hn(Sv(o.add(Tn(pn(19),pn(193),pn(17))),a,n,i)).toVar();return Sn(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"}]}),wv=lb([an(([e,t,r,s,i,n,a])=>{const o=pn(a).toVar(),u=hn(n).toVar(),l=pn(i).toVar(),d=pn(s).toVar(),c=pn(r).toVar(),h=pn(t).toVar(),p=fn(e).toVar(),g=Tn(Nv(fn(h.add(d),c.add(l)))).toVar(),m=fn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=fn(fn(hn(h),hn(c)).add(m)).toVar(),y=fn(f.sub(p)).toVar();return ln(o.equal(pn(2)),()=>wo(y.x).add(wo(y.y))),ln(o.equal(pn(3)),()=>$o(wo(y.x),wo(y.y))),Xo(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"}]}),an(([e,t,r,s,i,n,a,o,u])=>{const l=pn(u).toVar(),d=hn(o).toVar(),c=pn(a).toVar(),h=pn(n).toVar(),p=pn(i).toVar(),g=pn(s).toVar(),m=pn(r).toVar(),f=pn(t).toVar(),y=Tn(e).toVar(),b=Tn(Nv(Tn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Tn(Tn(hn(f),hn(m),hn(g)).add(b)).toVar(),T=Tn(x.sub(y)).toVar();return ln(l.equal(pn(2)),()=>wo(T.x).add(wo(T.y)).add(wo(T.z))),ln(l.equal(pn(3)),()=>$o(wo(T.x),wo(T.y),wo(T.z))),Xo(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"}]})]),Cv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();l.assign(zo(l,r))})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Mv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Bv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(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)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Pv=lb([Cv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(zo(d,n))})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Lv=lb([Mv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Fv=lb([Bv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(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)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Dv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=fn(t).toVar(),p=fn(r).toVar(),g=fn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(Tn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Uv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Iv=an(([e])=>{const t=e.y,r=e.z,s=Tn().toVar();return ln(t.lessThan(1e-4),()=>{s.assign(Tn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(bo(i)).mul(6).toVar();const n=pn(Io(i)),a=i.sub(hn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ln(n.equal(pn(0)),()=>{s.assign(Tn(r,l,o))}).ElseIf(n.equal(pn(1)),()=>{s.assign(Tn(u,r,o))}).ElseIf(n.equal(pn(2)),()=>{s.assign(Tn(o,r,l))}).ElseIf(n.equal(pn(3)),()=>{s.assign(Tn(o,u,r))}).ElseIf(n.equal(pn(4)),()=>{s.assign(Tn(l,o,r))}).Else(()=>{s.assign(Tn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Ov=an(([e])=>{const t=Tn(e).toVar(),r=hn(t.x).toVar(),s=hn(t.y).toVar(),i=hn(t.z).toVar(),n=hn(zo(r,zo(s,i))).toVar(),a=hn($o(r,$o(s,i))).toVar(),o=hn(a.sub(n)).toVar(),u=hn().toVar(),l=hn().toVar(),d=hn().toVar();return d.assign(a),ln(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ln(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ln(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(wa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(wa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ln(u.lessThan(0),()=>{u.addAssign(1)})}),Tn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Vv=an(([e])=>{const t=Tn(e).toVar(),r=Nn(Ua(t,Tn(.04045))).toVar(),s=Tn(t.div(12.92)).toVar(),i=Tn(Yo($o(t.add(Tn(.055)),Tn(0)).div(1.055),Tn(2.4))).toVar();return su(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),kv=(e,t)=>{e=hn(e),t=hn(t);const r=fn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ou(e.sub(r),e.add(r),t)},Gv=(e,t,r,s)=>su(e,t,r[s].clamp()),zv=(e,t,r,s,i)=>su(e,t,kv(r,s[i])),$v=an(([e,t,r])=>{const s=To(e).toVar(),i=Ca(hn(.5).mul(t.sub(r)),Bd).div(s).toVar(),n=Ca(hn(-.5).mul(t.sub(r)),Bd).div(s).toVar(),a=Tn().toVar();a.x=s.x.greaterThan(hn(0)).select(i.x,n.x),a.y=s.y.greaterThan(hn(0)).select(i.y,n.y),a.z=s.z.greaterThan(hn(0)).select(i.z,n.z);const o=zo(a.x,a.y,a.z).toVar();return Bd.add(s.mul(o)).toVar().sub(r)}),Wv=an(([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(Ma(r,r).sub(Ma(s,s)))),n});var Hv=Object.freeze({__proto__:null,BRDF_GGX:Lg,BRDF_Lambert:bg,BasicPointShadowFilter:k_,BasicShadowFilter:m_,Break:ap,Const:Eu,Continue:()=>hl("continue").toStack(),DFGLUT:Ug,D_GGX:Mg,Discard:pl,EPSILON:to,F_Schlick:yg,Fn:an,HALF_PI:ao,INFINITY:ro,If:ln,Loop:np,NodeAccess:Js,NodeShaderStage:Ys,NodeType:Zs,NodeUpdateType:Qs,OnBeforeMaterialUpdate:e=>Yb(Kb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>Yb(Kb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>Yb(Kb.MATERIAL,e),OnObjectUpdate:e=>Yb(Kb.OBJECT,e),PCFShadowFilter:f_,PCFSoftShadowFilter:y_,PI:so,PI2:io,PointShadowFilter:G_,Return:()=>hl("return").toStack(),Schlick_to_F0:Vg,ScriptableNodeResources:Kx,ShaderNode:Ki,Stack:dn,Switch:(...e)=>xi.Switch(...e),TBNViewMatrix:kc,TWO_PI:no,VSMShadowFilter:b_,V_GGX_SmithCorrelated:wg,Var:Au,VarIntent:wu,abs:wo,acesFilmicToneMapping:Dx,acos:Ao,add:wa,addMethodChaining:_i,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Vx,all:oo,alphaT:Xn,and:Va,anisotropy:Kn,anisotropyB:Qn,anisotropyT:Yn,any:uo,append:e=>(d("TSL: append() has been renamed to Stack()."),dn(e)),array:_a,arrayBuffer:e=>new yi(e,"ArrayBuffer"),asin:Ro,assign:Na,atan:Eo,atomicAdd:(e,t)=>bT(fT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>bT(fT.ATOMIC_AND,e,t),atomicFunc:bT,atomicLoad:e=>bT(fT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>bT(fT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>bT(fT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>bT(fT.ATOMIC_OR,e,t),atomicStore:(e,t)=>bT(fT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>bT(fT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>bT(fT.ATOMIC_XOR,e,t),attenuationColor:da,attenuationDistance:la,attribute:vl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Zb(e,r,s);return Gh(i,t,e)},backgroundBlurriness:ix,backgroundIntensity:nx,backgroundRotation:ax,batch:ep,bentNormalView:zc,billboarding:mb,bitAnd:$a,bitNot:Wa,bitOr:Ha,bitXor:ja,bitangentGeometry:Uc,bitangentLocal:Ic,bitangentView:Oc,bitangentWorld:Vc,bitcast:Gy,blendBurn:Vp,blendColor:$p,blendDodge:kp,blendOverlay:zp,blendScreen:Gp,blur:Vm,bool:mn,buffer:Fl,bufferAttribute:Qu,builtin:Ol,builtinAOContext:vu,builtinShadowContext:_u,bumpMap:Yc,bvec2:xn,bvec3:Nn,bvec4:En,bypass:ol,cache:nl,call:Ra,cameraFar:Jl,cameraIndex:Ql,cameraNear:Zl,cameraNormalMatrix:id,cameraPosition:nd,cameraProjectionMatrix:ed,cameraProjectionMatrixInverse:td,cameraViewMatrix:rd,cameraViewport:ad,cameraWorldMatrix:sd,cbrt:tu,cdl:Nx,ceil:xo,checker:K_,cineonToneMapping:Lx,clamp:iu,clearcoat:Gn,clearcoatNormalView:jd,clearcoatRoughness:zn,code:zx,color:cn,colorSpaceToWorking:Vu,colorToDirection:e=>Yi(e).mul(2).sub(1),compute:rl,computeKernel:tl,computeSkinning:(e,t=null)=>{const r=new rp(e);return r.positionNode=Gh(new H(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinIndexNode=Gh(new H(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinWeightNode=Gh(new H(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.bindMatrixNode=xa(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=xa(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Fl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Yi(r)},context:bu,convert:Pn,convertColorSpace:(e,t,r)=>Yi(new Iu(Yi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():zb(e,...t),cos:No,countLeadingZeros:jy,countOneBits:qy,countTrailingZeros:Hy,cross:Ko,cubeTexture:dc,cubeTextureBase:lc,dFdx:Lo,dFdy:Fo,dashSize:sa,debug:yl,decrement:Za,decrementBefore:Ya,defaultBuildStages:ti,defaultShaderStages:ei,defined:qi,degrees:co,deltaTime:cb,densityFogFactor:eT,depth:Mp,depthPass:(e,t,r)=>new Cx(Cx.DEPTH,e,t,r),determinant:ko,difference:qo,diffuseColor:Un,diffuseContribution:In,directPointLight:q_,directionToColor:$c,directionToFaceDirection:Od,dispersion:ca,disposeShadowMaterial:__,distance:jo,div:Ba,dot:Xo,drawIndex:Xh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x),element:Bn,emissive:On,equal:La,equirectUV:ig,exp:ho,exp2:po,expression:hl,faceDirection:Id,faceForward:uu,faceforward:pu,float:hn,floatBitsToInt:e=>new ky(e,"int","float"),floatBitsToUint:zy,floor:bo,fog:tT,fract:_o,frameGroup:ma,frameId:hb,frontFacing:Ud,fwidth:Oo,gain:(e,t)=>e.lessThan(.5)?Ky(e.mul(2),t).div(2):Ca(1,Ky(Ma(Ca(1,e),2),t).div(2)),gapSize:ia,getConstNodeType:Xi,getCurrentStack:un,getDirection:Dm,getDistanceAttenuation:j_,getGeometryRoughness:Ag,getNormalFromDepth:Hb,getParallaxCorrectNormal:$v,getRoughness:Eg,getScreenPosition:Wb,getShIrradianceAt:Wv,getShadowMaterial:T_,getShadowRenderObjectFunction:S_,getTextureIndex:Iy,getViewPosition:$b,ggxConvolution:$m,globalId:dT,glsl:(e,t)=>zx(e,t,"glsl"),glslFn:(e,t)=>Wx(e,t,"glsl"),grayscale:bx,greaterThan:Ua,greaterThanEqual:Oa,hash:Xy,highpModelNormalViewMatrix:Ed,highpModelViewMatrix:Ad,hue:_x,increment:Qa,incrementBefore:Ka,inspector:Tl,instance:Yh,instanceIndex:Wh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Qb(e,r,s);return Gh(i,t,e)},instancedBufferAttribute:Zu,instancedDynamicBufferAttribute:Ju,instancedMesh:Zh,int:pn,intBitsToFloat:e=>new ky(e,"float","int"),interleavedGradientNoise:jb,inverse:Go,inverseSqrt:yo,inversesqrt:gu,invocationLocalIndex:qh,invocationSubgroupIndex:jh,ior:aa,iridescence:Hn,iridescenceIOR:jn,iridescenceThickness:qn,isolate:il,ivec2:yn,ivec3:_n,ivec4:Rn,js:(e,t)=>zx(e,t,"js"),label:Nu,length:Mo,lengthSq:ru,lessThan:Da,lessThanEqual:Ia,lightPosition:KT,lightProjectionUV:XT,lightShadowMatrix:qT,lightTargetDirection:ZT,lightTargetPosition:YT,lightViewPosition:QT,lightingContext:mp,lights:(e=[])=>(new r_).setLights(e),linearDepth:Bp,linearToneMapping:Bx,localId:cT,log:go,log2:mo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(go(r.div(t)));return hn(Math.E).pow(s).mul(t).negate()},luminance:vx,mat2:wn,mat3:Cn,mat4:Mn,matcapUV:wf,materialAO:Dh,materialAlphaTest:Jc,materialAnisotropy:bh,materialAnisotropyVector:Uh,materialAttenuationColor:Ah,materialAttenuationDistance:Rh,materialClearcoat:hh,materialClearcoatNormal:gh,materialClearcoatRoughness:ph,materialColor:eh,materialDispersion:Lh,materialEmissive:rh,materialEnvIntensity:tc,materialEnvRotation:rc,materialIOR:Sh,materialIridescence:xh,materialIridescenceIOR:Th,materialIridescenceThickness:_h,materialLightMap:Fh,materialLineDashOffset:Bh,materialLineDashSize:wh,materialLineGapSize:Ch,materialLineScale:Eh,materialLineWidth:Mh,materialMetalness:dh,materialNormal:ch,materialOpacity:sh,materialPointSize:Ph,materialReference:fc,materialReflectivity:uh,materialRefractionRatio:ec,materialRotation:mh,materialRoughness:lh,materialSheen:fh,materialSheenRoughness:yh,materialShininess:th,materialSpecular:ih,materialSpecularColor:ah,materialSpecularIntensity:nh,materialSpecularStrength:oh,materialThickness:Nh,materialTransmission:vh,max:$o,maxMipLevel:El,mediumpModelViewMatrix:Rd,metalness:kn,min:zo,mix:su,mixElement:du,mod:Pa,modInt:Ja,modelDirection:fd,modelNormalMatrix:vd,modelPosition:bd,modelRadius:_d,modelScale:xd,modelViewMatrix:Sd,modelViewPosition:Td,modelViewProjection:Ih,modelWorldMatrix:yd,modelWorldMatrixInverse:Nd,morphReference:cp,mrt:Vy,mul:Ma,mx_aastep:kv,mx_add:(e,t=hn(0))=>wa(e,t),mx_atan2:(e=hn(0),t=hn(1))=>Eo(e,t),mx_cell_noise_float:(e=Nl())=>vv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>hn(e).sub(r).mul(t).add(r),mx_divide:(e,t=hn(1))=>Ba(e,t),mx_fractal_noise_float:(e=Nl(),t=3,r=2,s=.5,i=1)=>Sv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Nl(),t=3,r=2,s=.5,i=1)=>Av(e,pn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Nl(),t=3,r=2,s=.5,i=1)=>Rv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Nl(),t=3,r=2,s=.5,i=1)=>Ev(e,pn(t),r,s).mul(i),mx_frame:()=>hb,mx_heighttonormal:(e,t)=>(e=Tn(e),t=hn(t),Yc(e,t)),mx_hsvtorgb:Iv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=hn(1))=>Ca(t,e),mx_modulo:(e,t=hn(1))=>Pa(e,t),mx_multiply:(e,t=hn(1))=>Ma(e,t),mx_noise_float:(e=Nl(),t=1,r=0)=>Tv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Nl(),t=1,r=0)=>_v(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Nl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Sn(_v(e),Tv(e.add(fn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=fn(.5,.5),r=fn(1,1),s=hn(0),i=fn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=fn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=hn(1))=>Yo(e,t),mx_ramp4:(e,t,r,s,i=Nl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=su(e,t,n),u=su(r,s,n);return su(o,u,a)},mx_ramplr:(e,t,r=Nl())=>Gv(e,t,r,"x"),mx_ramptb:(e,t,r=Nl())=>Gv(e,t,r,"y"),mx_rgbtohsv:Ov,mx_rotate2d:(e,t)=>{e=fn(e);const r=(t=hn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=Tn(e),t=hn(t),r=Tn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=hn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=hn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Nl())=>zv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Nl())=>zv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Vv,mx_subtract:(e,t=hn(0))=>Ca(e,t),mx_timer:()=>db,mx_transform_uv:(e=1,t=0,r=Nl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Dv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Uv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Nl(),t=1)=>Pv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec2:(e=Nl(),t=1)=>Lv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec3:(e=Nl(),t=1)=>Fv(e.convert("vec2|vec3"),t,pn(1)),negate:Bo,neutralToneMapping:kx,nodeArray:Ji,nodeImmutable:tn,nodeObject:Yi,nodeObjectIntent:Qi,nodeObjects:Zi,nodeProxy:en,nodeProxyIntent:rn,normalFlat:Gd,normalGeometry:Vd,normalLocal:kd,normalMap:jc,normalView:Wd,normalViewGeometry:zd,normalWorld:Hd,normalWorldGeometry:$d,normalize:To,not:Ga,notEqual:Fa,numWorkgroups:uT,objectDirection:ld,objectGroup:ya,objectPosition:cd,objectRadius:gd,objectScale:hd,objectViewPosition:pd,objectWorldMatrix:dd,oneMinus:Po,or:ka,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=db)=>e.fract(),oscSine:(e=db)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=db)=>e.fract().round(),oscTriangle:(e=db)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ra,outputStruct:Uy,overloadingFn:lb,packHalf2x16:Jy,packSnorm2x16:Qy,packUnorm2x16:Zy,parabola:Ky,parallaxDirection:Gc,parallaxUV:(e,t)=>e.sub(Gc.mul(t)),parameter:(e,t)=>new My(e,t),pass:(e,t,r)=>new Cx(Cx.COLOR,e,t,r),passTexture:(e,t)=>new Ex(e,t),pcurve:(e,t,r)=>Yo(Ba(Yo(e,t),wa(Yo(e,t),Yo(Ca(1,e),r))),1/t),perspectiveDepthToViewZ:Ep,pmremTexture:pf,pointShadow:W_,pointUV:ex,pointWidth:na,positionGeometry:wd,positionLocal:Cd,positionPrevious:Md,positionView:Ld,positionViewDirection:Fd,positionWorld:Bd,positionWorldDirection:Pd,posterize:Rx,pow:Yo,pow2:Qo,pow3:Zo,pow4:Jo,premultiplyAlpha:Wp,property:Fn,quadBroadcast:WT,quadSwapDiagonal:OT,quadSwapX:UT,quadSwapY:IT,radians:lo,rand:lu,range:nT,rangeFogFactor:Jx,reciprocal:Uo,reference:pc,referenceBuffer:gc,reflect:Ho,reflectVector:nc,reflectView:sc,reflector:e=>new Fb(e),refract:au,refractVector:ac,refractView:ic,reinhardToneMapping:Px,remap:ll,remapClamp:dl,renderGroup:fa,renderOutput:ml,rendererReference:$u,replaceDefaultUV:function(e,t=null){return bu(t,{getUV:e})},rotate:Pf,rotateUV:pb,roughness:Vn,round:Do,rtt:zb,sRGBTransferEOTF:Fu,sRGBTransferOETF:Du,sample:(e,t=null)=>new Xb(e,Yi(t)),sampler:e=>(!0===e.isNode?e:Bl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Bl(e)).convert("samplerComparison"),saturate:nu,saturation:xx,screenCoordinate:Hl,screenDPR:zl,screenSize:Wl,screenUV:$l,scriptable:Qx,scriptableValue:jx,select:fu,setCurrentStack:on,setName:Tu,shaderStages:ri,shadow:B_,shadowPositionWorld:i_,shapeCircle:Y_,sharedUniformGroup:ga,sheen:$n,sheenRoughness:Wn,shiftLeft:qa,shiftRight:Xa,shininess:ta,sign:Co,sin:vo,sinc:(e,t)=>vo(so.mul(t.mul(e).sub(1))).div(so.mul(t.mul(e).sub(1))),skinning:sp,smoothstep:ou,smoothstepElement:cu,specularColor:Zn,specularColorBlended:Jn,specularF90:ea,spherizeUV:gb,split:(e,t)=>Yi(new hi(Yi(e),t)),spritesheetUV:bb,sqrt:fo,stack:Py,step:Wo,stepElement:hu,storage:Gh,storageBarrier:()=>pT("storage").toStack(),storageTexture:ux,string:(e="")=>new yi(e,"string"),struct:(e,t=null)=>{const r=new Ly(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;ecx(e,t).level(r),texture3DLoad:(...e)=>cx(...e).setSampler(!1),textureBarrier:()=>pT("texture").toStack(),textureBicubic:nm,textureBicubicLevel:im,textureCubeUV:Um,textureLevel:(e,t,r)=>Bl(e,t).level(r),textureLoad:Pl,textureSize:Rl,textureStore:(e,t,r)=>{const s=ux(e,t,r);return null!==r&&s.toStack(),s},thickness:ua,time:db,toneMapping:Hu,toneMappingExposure:ju,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Yi(new Mx(t,r,Yi(s),Yi(i),Yi(n))),transformDirection:eu,transformNormal:qd,transformNormalToView:Xd,transformedClearcoatNormalView:Qd,transformedNormalView:Kd,transformedNormalWorld:Yd,transmission:oa,transpose:Vo,triNoise3D:ab,triplanarTexture:(...e)=>xb(...e),triplanarTextures:xb,trunc:Io,uint:gn,uintBitsToFloat:e=>new ky(e,"float","uint"),uniform:xa,uniformArray:Il,uniformCubeTexture:(e=oc)=>lc(e),uniformFlow:xu,uniformGroup:pa,uniformTexture:(e=wl)=>Bl(e),unpackHalf2x16:sb,unpackNormal:Wc,unpackSnorm2x16:tb,unpackUnorm2x16:rb,unpremultiplyAlpha:Hp,userData:(e,t,r)=>new hx(e,t,r),uv:Nl,uvec2:bn,uvec3:vn,uvec4:An,varying:Pu,varyingProperty:Dn,vec2:fn,vec3:Tn,vec4:Sn,vectorComponents:si,velocity:yx,vertexColor:Op,vertexIndex:$h,vertexStage:Lu,vibrance:Tx,viewZToLogarithmicDepth:wp,viewZToOrthographicDepth:Rp,viewZToPerspectiveDepth:Ap,viewport:jl,viewportCoordinate:Xl,viewportDepthTexture:Np,viewportLinearDepth:Pp,viewportMipTexture:Tp,viewportResolution:Yl,viewportSafeUV:fb,viewportSharedTexture:Jp,viewportSize:ql,viewportTexture:xp,viewportUV:Kl,vogelDiskSample:qb,wgsl:(e,t)=>zx(e,t,"wgsl"),wgslFn:(e,t)=>Wx(e,t,"wgsl"),workgroupArray:(e,t)=>new mT("Workgroup",e,t),workgroupBarrier:()=>pT("workgroup").toStack(),workgroupId:lT,workingToColorSpace:Ou,xor:za});const jv=new Cy;class qv extends Jf{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(jv),jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(jv),jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=Sn(l).mul(nx).context({getUV:()=>ax.mul($d),getTextureLevel:()=>ix}),p=ed.element(3).element(3).equal(1),g=Ba(1,ed.element(1).element(1)).mul(3),m=p.select(Cd.mul(g),Cd),f=Sd.mul(Sn(m,0));let y=ed.mul(Sn(f.xyz,1));y=y.setZ(y.w);const b=new jp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new Ye(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=Sn(l).mul(nx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?jv.set(0,0,0,1):"alpha-blend"===a&&jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=jv.r,T.g=jv.g,T.b=jv.b,T.a=jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.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 Xv=0;class Kv{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=Xv++}}class Yv{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 Kv(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Qv{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Zv{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 Jv{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class eN extends Jv{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class tN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let rN=0;class sN{constructor(e=null){this.id=rN++,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 iN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class nN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class aN extends nN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class oN extends nN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class uN extends nN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class lN extends nN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class dN extends nN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class cN extends nN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class hN extends nN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class pN extends nN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class gN extends aN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class mN extends oN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class fN extends uN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class yN extends lN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class bN extends dN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class xN extends cN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class TN extends hN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let vN=0;const NN=new WeakMap,SN=new WeakMap,RN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),AN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class EN{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.types={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=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new sN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:vN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===Qe&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=SN.get(this.renderer);return void 0===e&&(e=new Xf,SN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ng(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 Kv(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Kv(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 ri)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")}( ${AN(n.r)}, ${AN(n.g)}, ${AN(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 Qv(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===R)return"int";if(t===S)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=Vs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return RN.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 et||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=un();return this.stacks.push(e),on(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,on(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);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Qv("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new iN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 Zv(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new Jv(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}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"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new eN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}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,d(`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 tN("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 $x,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 My(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),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 sN,this.stack=Py();for(const r of ti)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(){d("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.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new jp),e.build(this)}else this.addFlow("compute",e);for(const e of ti){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of ri){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}getSharedDataFromNode(e){let t=NN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new gN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new mN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new fN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new yN(e);else if("color"===t)s=new bN(e);else if("mat2"===t)s=new xN(e);else if("mat3"===t)s=new TN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new _N(e)}r.cache=s}return s}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${tt} - Node System\n`}}class wN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Qs.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Qs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Qs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Qs.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 CN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}CN.isNodeFunctionInput=!0;class MN extends H_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:ZT(this.light),lightColor:e}}}const BN=new a,PN=new a;let LN=null;class FN extends H_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=xa(new r).setGroup(fa),this.halfWidth=xa(new r).setGroup(fa),this.updateType=Qs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;PN.identity(),BN.copy(t.matrixWorld),BN.premultiply(r),PN.extractRotation(BN),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(PN),this.halfHeight.value.applyMatrix4(PN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Bl(LN.LTC_FLOAT_1),r=Bl(LN.LTC_FLOAT_2)):(t=Bl(LN.LTC_HALF_1),r=Bl(LN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:QT(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){LN=e}}class DN extends H_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=xa(0).setGroup(fa),this.penumbraCosNode=xa(0).setGroup(fa),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(0).setGroup(fa),this.colorNode=xa(this.color).setGroup(fa)}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,t){const{coneCosNode:r,penumbraCosNode:s}=this;return ou(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=XT(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(ZT(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=j_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Bl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class UN extends DN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Bl(r,fn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const IN=an(([e,t])=>{const r=e.abs().sub(t);return Mo($o(r,0)).add(zo($o(r.x,r.y),0))});class ON extends DN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=hn(0),r=this.penumbraCosNode,s=qT(this.light).mul(e.context.positionWorld||Bd);return ln(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=IN(e.xy.sub(fn(.5)),fn(.5)),n=Ba(-1,Ca(1,Ao(r)).sub(1));t.assign(nu(i.mul(-2).mul(n)))}),t}}class VN extends H_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class kN extends H_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=KT(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=xa(new e).setGroup(fa)}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=Hd.dot(s).mul(.5).add(.5),n=su(r,t,i);e.context.irradiance.addAssign(n)}}class GN extends H_{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=Wv(Hd,this.lightProbe);e.context.irradiance.addAssign(t)}}class zN{parseFunction(){d("Abstract function.")}}class $N{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}$N.isNodeFunction=!0;const WN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,HN=/[a-z_0-9]+/gi,jN="#pragma main";class qN extends $N{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(jN),r=-1!==t?e.slice(t+12):e,s=r.match(WN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=HN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new jp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new Yv(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){YN[0]=e,YN[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(YN)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&QN.push(t.getCacheKey(!0)),i&&QN.push(i.getCacheKey()),n&&QN.push(n.getCacheKey()),QN.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),QN.push(this.renderer.shadowMap.enabled?1:0),QN.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Ds(QN),this.callHashCache.set(YN,s),QN.length=0}return YN.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return pf(r);{let e;return e=!0===r.isCubeTexture?dc(r):Bl(r),dg(e)}}if(!0===r.isTexture)return Bl(r,$l.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=pc("color","color",r).setGroup(fa),t=pc("density","float",r).setGroup(fa);return tT(e,eT(t))}if(r.isFog){const e=pc("color","color",r).setGroup(fa),t=pc("near","float",r).setGroup(fa),s=pc("far","float",r).setGroup(fa);return tT(e,Jx(t,s))}o("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?dc(r):!0===r.isTexture?Bl(r):void o("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 KN.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?cx(e,Tn($l,Ol("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Bl(e,$l).renderOutput(t.toneMapping,t.currentColorSpace);return KN.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 wN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const JN=new ze;class eS{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._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new uS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,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),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;hS(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 fS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function yS(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(this._renderTarget,this._mrt),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(){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 ZN(this,r),this._animation=new qf(this,this._nodes,this.info),this._attributes=new ny(r),this._background=new qv(this,this._nodes),this._geometries=new uy(this._attributes,this.info),this._textures=new wy(this,r,this.info),this._pipelines=new my(r,this._nodes),this._bindings=new fy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Zf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new vy(this.lighting),this._bundles=new sS,this._renderContexts=new Ay,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:xS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new eS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Ad,t.modelNormalViewMatrix=Ed):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Ad&&e.modelNormalViewMatrix===Ed}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(_S),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(_S),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new eS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?NS:vS;t.isArrayCamera||(SS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(SS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=TS.width,g.height=TS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(RS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_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)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=RS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=RS.copy(t).floor()}else t=RS.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?NS:vS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&RS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(SS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,RS.z,null,i)}}else if(e.isLineLoop)o("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?NS:vS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),RS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(SS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=it;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);e.side=null===i.shadowSide?i.side:i.shadowSide,null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=it,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class ES{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class wS extends ES{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(iy-e%iy)%iy;var e}get buffer(){return this._buffer}update(){return!0}}class CS extends wS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let MS=0;class BS extends CS{constructor(e,t){super("UniformBuffer_"+MS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class PS extends CS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let US=0;class IS extends DS{constructor(e,t){super(e,t),this.id=US++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class OS extends IS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class VS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class kS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const GS={bitcast_int_uint:new Gx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Gx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},zS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},$S={low:"lowp",medium:"mediump",high:"highp"},WS={swizzleAssign:!0,storageBuffer:!1},HS={perspective:"smooth",linear:"noperspective"},jS={centroid:"centroid"},qS="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class XS extends EN{constructor(e,t){super(e,t,new XN),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=GS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==GS[e]&&this._include(e),zS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?mt:ft;2===s?n=i?Tt:G:3===s?n=i?_t:vt:4===s&&(n=i?Nt:Re);const a={Float32Array:q,Uint8Array:Ge,Uint16Array:xt,Uint32Array:S,Int8Array:bt,Int16Array:yt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=$S[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=$S[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${HS[s.interpolationType]||s.interpolationType} ${jS[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+=`${HS[e.interpolationType]||e.interpolationType} ${jS[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=WS[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)}WS[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 OS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new VS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new kS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new BS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new FS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let KS=null,YS=null;class QS{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[St.RENDER]:null,[St.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?St.COMPUTE:St.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return KS=KS||new t,this.renderer.getDrawingBufferSize(KS)}setScissorTest(){}getClearColor(){const e=this.renderer;return YS=YS||new Cy,e.getClearColor(YS),YS.getRGB(YS),YS}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Rt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}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)}deleteBindGroupData(){}dispose(){}}let ZS,JS,eR=0;class tR{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 rR{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("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_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===R,id:eR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new tR(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;e0?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 nR,aR,oR,uR=!1;class lR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===uR&&(this._init(),uR=!0)}_init(){const e=this.gl;nR={[Ur]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Dr]:e.MIRRORED_REPEAT},aR={[w]:e.NEAREST,[Ir]:e.NEAREST_MIPMAP_NEAREST,[Je]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[Ze]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},oR={[Wr]:e.NEVER,[$r]:e.ALWAYS,[E]:e.LESS,[zr]:e.LEQUAL,[Gr]:e.EQUAL,[kr]:e.GEQUAL,[Vr]:e.GREATER,[Or]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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)}return 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,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;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,o),r.texParameteri(e,r.TEXTURE_WRAP_S,nR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,nR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,nR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,aR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,aR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,oR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==Je&&t.minFilter!==K)return;if(t.type===q&&!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})}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.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?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)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){const t=jr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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));i.bindRenderbuffer(i.RENDERBUFFER,null)}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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function dR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class cR{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 hR{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 pR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class gR{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 v(`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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 yR extends QS{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.currentSamples>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 cR(this),this.capabilities=new hR(this),this.attributeUtils=new rR(this),this.textureUtils=new lR(this),this.bufferRenderer=new gR(this),this.state=new sR(this),this.utils=new iR(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"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new fR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(St.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;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;e{let a=0;for(let t=0;t1&&u.setMRTBlending(i.textures),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;const N=()=>{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,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()});return void t.push(i)}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");o("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&&d("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;epR[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ry(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const bR="point-list",xR="line-list",TR="line-strip",_R="triangle-list",vR="triangle-strip",NR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},SR="never",RR="less",AR="equal",ER="less-equal",wR="greater",CR="not-equal",MR="greater-equal",BR="always",PR="store",LR="load",FR="clear",DR="ccw",UR="cw",IR="none",OR="back",VR="uint16",kR="uint32",GR="r8unorm",zR="r8snorm",$R="r8uint",WR="r8sint",HR="r16uint",jR="r16sint",qR="r16float",XR="rg8unorm",KR="rg8snorm",YR="rg8uint",QR="rg8sint",ZR="r32uint",JR="r32sint",eA="r32float",tA="rg16uint",rA="rg16sint",sA="rg16float",iA="rgba8unorm",nA="rgba8unorm-srgb",aA="rgba8snorm",oA="rgba8uint",uA="rgba8sint",lA="bgra8unorm",dA="bgra8unorm-srgb",cA="rgb9e5ufloat",hA="rgb10a2unorm",pA="rg11b10ufloat",gA="rg32uint",mA="rg32sint",fA="rg32float",yA="rgba16uint",bA="rgba16sint",xA="rgba16float",TA="rgba32uint",_A="rgba32sint",vA="rgba32float",NA="depth16unorm",SA="depth24plus",RA="depth24plus-stencil8",AA="depth32float",EA="depth32float-stencil8",wA="bc1-rgba-unorm",CA="bc1-rgba-unorm-srgb",MA="bc2-rgba-unorm",BA="bc2-rgba-unorm-srgb",PA="bc3-rgba-unorm",LA="bc3-rgba-unorm-srgb",FA="bc4-r-unorm",DA="bc4-r-snorm",UA="bc5-rg-unorm",IA="bc5-rg-snorm",OA="bc6h-rgb-ufloat",VA="bc6h-rgb-float",kA="bc7-rgba-unorm",GA="bc7-rgba-unorm-srgb",zA="etc2-rgb8unorm",$A="etc2-rgb8unorm-srgb",WA="etc2-rgb8a1unorm",HA="etc2-rgb8a1unorm-srgb",jA="etc2-rgba8unorm",qA="etc2-rgba8unorm-srgb",XA="eac-r11unorm",KA="eac-r11snorm",YA="eac-rg11unorm",QA="eac-rg11snorm",ZA="astc-4x4-unorm",JA="astc-4x4-unorm-srgb",eE="astc-5x4-unorm",tE="astc-5x4-unorm-srgb",rE="astc-5x5-unorm",sE="astc-5x5-unorm-srgb",iE="astc-6x5-unorm",nE="astc-6x5-unorm-srgb",aE="astc-6x6-unorm",oE="astc-6x6-unorm-srgb",uE="astc-8x5-unorm",lE="astc-8x5-unorm-srgb",dE="astc-8x6-unorm",cE="astc-8x6-unorm-srgb",hE="astc-8x8-unorm",pE="astc-8x8-unorm-srgb",gE="astc-10x5-unorm",mE="astc-10x5-unorm-srgb",fE="astc-10x6-unorm",yE="astc-10x6-unorm-srgb",bE="astc-10x8-unorm",xE="astc-10x8-unorm-srgb",TE="astc-10x10-unorm",_E="astc-10x10-unorm-srgb",vE="astc-12x10-unorm",NE="astc-12x10-unorm-srgb",SE="astc-12x12-unorm",RE="astc-12x12-unorm-srgb",AE="clamp-to-edge",EE="repeat",wE="mirror-repeat",CE="linear",ME="nearest",BE="zero",PE="one",LE="src",FE="one-minus-src",DE="src-alpha",UE="one-minus-src-alpha",IE="dst",OE="one-minus-dst",VE="dst-alpha",kE="one-minus-dst-alpha",GE="src-alpha-saturated",zE="constant",$E="one-minus-constant",WE="add",HE="subtract",jE="reverse-subtract",qE="min",XE="max",KE=0,YE=15,QE="keep",ZE="zero",JE="replace",ew="invert",tw="increment-clamp",rw="decrement-clamp",sw="increment-wrap",iw="decrement-wrap",nw="storage",aw="read-only-storage",ow="write-only",uw="read-only",lw="read-write",dw="non-filtering",cw="comparison",hw="float",pw="unfilterable-float",gw="depth",mw="sint",fw="uint",yw="2d",bw="3d",xw="2d",Tw="2d-array",_w="cube",vw="3d",Nw="all",Sw="vertex",Rw="instance",Aw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Ew={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class ww extends DS{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Cw extends wS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Mw=0;class Bw extends Cw{constructor(e,t){super("StorageBuffer_"+Mw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Js.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Pw extends Jf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:CE}),this.flipYSampler=e.createSampler({minFilter:ME}),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:vR,stripIndexFormat:kR},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:vR,stripIndexFormat:kR},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:xw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,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:FR,storeOp:PR,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,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Pw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,Ow=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,Vw={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 kw extends $N{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Iw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Ow.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 Gw extends zN{parseFunction(e){return new kw(e)}}const zw={[Js.READ_ONLY]:"read",[Js.WRITE_ONLY]:"write",[Js.READ_WRITE]:"read_write"},$w={[Ur]:"repeat",[xe]:"clamp",[Dr]:"mirror"},Ww={vertex:NR.VERTEX,fragment:NR.FRAGMENT,compute:NR.COMPUTE},Hw={instance:!0,swizzleAssign:!1,storageBuffer:!0},jw={"^^":"tsl_xor"},qw={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"},Xw={},Kw={tsl_xor:new Gx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Gx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Gx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Gx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Gx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Gx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Gx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Gx("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 Gx("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 Gx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Gx("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 Gx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Gx("\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")},Yw={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let Qw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Qw+="diagnostic( off, derivative_uniformity );\n");class Zw extends EN{constructor(e,t){super(e,t,new Gw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${$w[e.wrapS]}S_${$w[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=Xw[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Ur?(s.push(Kw.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(Kw.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Dr?(s.push(Kw.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Xw[t]=r=new Gx(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Su(new cl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Su(new cl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Su(new cl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===q||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=jw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),Js.READ_WRITE):Js.READ_ONLY:e.access}getStorageAccess(e,t){return zw[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new kS(i.name,i.node,o,n):new OS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new VS(i.name,i.node,o,n):"texture3D"===t&&(s=new kS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Ww[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new ww(`${i.name}_sampler`,i.node,o);e.setVisibility(Ww[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?BS:Bw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Ww[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new FS(u,o),e.setVisibility(Ww[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Ww[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Uw(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}n[e]={index:a.binding++,id:a.group,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return qw[e]||e}isAvailable(e){let t=Hw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Hw[e]=t),t}_getWGSLMethod(e){return void 0!==Kw[e]&&this._include(e),Yw[e]}_include(e){const t=Kw[e];return t.build(this),this.addInclude(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${Qw}\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){const[r,s,i]=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( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\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 Jw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=RA:e.depth&&(t=SA),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?bR:e.isLineSegments||e.isMesh&&!0===t.wireframe?xR:e.isLine?TR:e.isMesh?_R:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return lA;if(e===be)return xA;throw new Error("Unsupported output buffer type.")}}const eC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&eC.set(Float16Array,["float16"]);const tC=new Map([[et,["float16"]]]),rC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class sC{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=qr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Nw;let o;o=t.isSampledCubeTexture?_w:t.isSampledTexture3D?vw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Tw:xw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&NR.COMPUTE&&(s.access===Js.READ_WRITE||s.access===Js.WRITE_ONLY)?e.type=nw:e.type=aw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===Js.READ_WRITE?lw:t===Js.WRITE_ONLY?ow:uw,s.texture.isArrayTexture?e.viewDimension=Tw:s.texture.is3DTexture&&(e.viewDimension=vw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=pw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=pw:t.sampleType=gw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=mw:e===S?t.sampleType=fw:e===q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=hw:t.sampleType=pw)}s.isSampledCubeTexture?t.viewDimension=_w:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Tw:s.isSampledTexture3D&&(t.viewDimension=vw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=cw:t.type=dw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class aC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===Qe&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===nt){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:WE},r={srcFactor:i,dstFactor:n,operation:WE}};if(e.premultipliedAlpha)switch(s){case Qe:i(PE,UE,PE,UE);break;case $t:i(PE,PE,PE,PE);break;case zt:i(BE,FE,BE,PE);break;case Gt:i(IE,UE,BE,PE)}else switch(s){case Qe:i(DE,UE,PE,UE);break;case $t:i(DE,PE,PE,PE);break;case zt:o("WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Gt:o("WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ot:t=BE;break;case It:t=PE;break;case Ut:t=LE;break;case Bt:t=FE;break;case Dt:t=DE;break;case Mt:t=UE;break;case Lt:t=IE;break;case Ct:t=OE;break;case Pt:t=VE;break;case wt:t=kE;break;case Ft:t=GE;break;case 211:t=zE;break;case 212:t=$E;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ts:t=SR;break;case es:t=BR;break;case Jr:t=RR;break;case Zr:t=ER;break;case Qr:t=AR;break;case Yr:t=MR;break;case Kr:t=wR;break;case Xr:t=CR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case ls:t=QE;break;case us:t=ZE;break;case os:t=JE;break;case as:t=ew;break;case ns:t=tw;break;case is:t=rw;break;case ss:t=sw;break;case rs:t=iw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case at:t=WE;break;case Et:t=HE;break;case At:t=jE;break;case cs:t=qE;break;case ds:t=XE;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?VR:kR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?UR:DR,s.cullMode=r.side===B?IR:OR,s}_getColorWriteMask(e){return!0===e.colorWrite?YE:KE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=BR;else{const r=e.depthFunc;switch(r){case Qt:t=SR;break;case Yt:t=BR;break;case Kt:t=RR;break;case Xt:t=ER;break;case qt:t=AR;break;case jt:t=MR;break;case Ht:t=wR;break;case Wt:t=CR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class oC extends mR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 uC extends QS{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.defaultRenderPassdescriptor=null,this.utils=new Jw(this),this.attributeUtils=new sC(this),this.bindingUtils=new nC(this),this.pipelineUtils=new aC(this),this.textureUtils=new Dw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}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(Aw),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=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Aw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(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:LR}),this.initTimestampQuery(St.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("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===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){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(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new yR(e)));super(new t(e),e),this.library=new cC,this.isWebGPURenderer=!0}}class pC extends Rs{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class gC{constructor(e,t=Sn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new jp;r.name="PostProcessing",this._quadMesh=new Vb(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=ml(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class mC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class fC extends Zb{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class yC extends As{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Es(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):o(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]?(o("NodeLoader: Node type not found:",e),hn()):new this.nodes[e]}}class bC extends ws{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 xC extends Cs{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 yC;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 bC;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}t.lights=this.getLightsData(e.lightsNode.getLights()),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!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}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,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>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 Fs=e=>Ls(e),Ds=e=>Ls(e),Us=(...e)=>Ls(e),Is=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),Os=new WeakMap;function Vs(e){return Is.get(e)}function ks(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function Gs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function zs(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function $s(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function Hs(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Xs(u[0]):null}function js(e){let t=Os.get(e);return void 0===t&&(t={},Os.set(e,t)),t}function qs(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Ks=Object.freeze({__proto__:null,arrayBufferToBase64:qs,base64ToArrayBuffer:Xs,getAlignmentFromType:$s,getDataFromObject:js,getLengthFromType:Gs,getMemoryLengthFromType:zs,getTypeFromLength:Vs,getTypedArrayFromType:ks,getValueFromType:Hs,getValueType:Ws,hash:Us,hashArray:Ds,hashString:Fs});const Ys={VERTEX:"vertex",FRAGMENT:"fragment"},Qs={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},Zs={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},Js={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ei=["fragment","vertex"],ti=["setup","analyze","generate"],ri=[...ei,"compute"],si=["x","y","z","w"],ii={analyze:"setup",generate:"analyze"};let ni=0;class ai extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Qs.NONE,this.updateBeforeType=Qs.NONE,this.updateAfterType=Qs.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:ni++})}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),this}onFrameUpdate(e){return this.onUpdate(e,Qs.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Qs.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Qs.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(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.7,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 oi extends ai{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)}getMemberType(e,t){return this.node.getMemberType(e,t)}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 ui extends ai{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 li extends ai{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 di extends li{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 u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const ci=si.join("");class hi extends ai{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(si.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))}getScope(){return this.node.getScope()}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===ci.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 pi extends li{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;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ai.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==xi?xi.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=Ti.get("assign");return this.addToStack(t(...e))}},ai.prototype.toVarIntent=function(){return this},ai.prototype.get=function(e){return new bi(this,e)};const Ni={};function Si(e,t,r){Ni[e]=Ni[t]=Ni[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new hi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ai.prototype["set"+s]=ai.prototype["set"+i]=ai.prototype["set"+n]=function(t){const r=vi(e);return new pi(this,r,Yi(t))},ai.prototype["flip"+s]=ai.prototype["flip"+i]=ai.prototype["flip"+n]=function(){const t=vi(e);return new gi(this,t)}}const Ri=["x","y","z","w"],Ai=["r","g","b","a"],Ei=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ri[e],r=Ai[e],s=Ei[e];Si(t,r,s);for(let i=0;i<4;i++){t=Ri[e]+Ri[i],r=Ai[e]+Ai[i],s=Ei[e]+Ei[i],Si(t,r,s);for(let n=0;n<4;n++){t=Ri[e]+Ri[i]+Ri[n],r=Ai[e]+Ai[i]+Ai[n],s=Ei[e]+Ei[i]+Ei[n],Si(t,r,s);for(let a=0;a<4;a++)t=Ri[e]+Ri[i]+Ri[n]+Ri[a],r=Ai[e]+Ai[i]+Ai[n]+Ai[a],s=Ei[e]+Ei[i]+Ei[n]+Ei[a],Si(t,r,s)}}}for(let e=0;e<32;e++)Ni[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new oi(this,new yi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Yi(t))}};Object.defineProperties(ai.prototype,Ni);const wi=new WeakMap,Ci=function(e,t=null){for(const r in e)e[r]=Yi(e[r],t);return e},Mi=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...Ji(d(t)))):null!==r?(r=Yi(r),n=(...s)=>i(new e(t,...Ji(d(s)),r))):n=(...r)=>i(new e(t,...Ji(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...Ji(t))};class Li extends ai{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=wi.get(e.constructor);void 0===s&&(s=new WeakMap,wi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Yi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;Zi(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Yi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return Zi(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Yi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ai&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Yi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Yi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Fi extends ai{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Li(this,e)}setup(){return this.call()}}const Di=[!1,!0],Ui=[0,1,2,3],Ii=[-1,-2],Oi=[.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],Vi=new Map;for(const e of Di)Vi.set(e,new yi(e));const ki=new Map;for(const e of Ui)ki.set(e,new yi(e,"uint"));const Gi=new Map([...ki].map(e=>new yi(e.value,"int")));for(const e of Ii)Gi.set(e,new yi(e,"int"));const zi=new Map([...Gi].map(e=>new yi(e.value)));for(const e of Oi)zi.set(e,new yi(e));for(const e of Oi)zi.set(-e,new yi(-e));const $i={bool:Vi,uint:ki,ints:Gi,float:zi},Wi=new Map([...Vi,...zi]),Hi=(e,t)=>Wi.has(e)?Wi.get(e):!0===e.isNode?e:new yi(e,t),ji=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new yi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[Hs(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Qi(t.get(r[0]));if(1===r.length){const t=Hi(r[0],e);return t.nodeType===e?Qi(t):Qi(new ui(t,e))}const s=r.map(e=>Hi(e));return Qi(new di(s,e))}},qi=e=>"object"==typeof e&&null!==e?e.value:e,Xi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Ki(e,t){return new Fi(e,t)}const Yi=(e,t=null)=>function(e,t=null){const r=Ws(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Yi(Hi(e,t)):"shader"===r?e.isFn?e:an(e):e}(e,t),Qi=(e,t=null)=>Yi(e,t).toVarIntent(),Zi=(e,t=null)=>new Ci(e,t),Ji=(e,t=null)=>new Mi(e,t),en=(e,t=null,r=null,s=null)=>new Bi(e,t,r,s),tn=(e,...t)=>new Pi(e,...t),rn=(e,t=null,r=null,s={})=>new Bi(e,t,r,{...s,intent:!0});let sn=0;class nn extends ai{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Ki(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+sn++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function an(e,t=null){const r=new nn(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const on=e=>{xi=e},un=()=>xi,ln=(...e)=>xi.If(...e);function dn(e){return xi&&xi.addToStack(e),e}_i("toStack",dn);const cn=new ji("color"),hn=new ji("float",$i.float),pn=new ji("int",$i.ints),gn=new ji("uint",$i.uint),mn=new ji("bool",$i.bool),fn=new ji("vec2"),yn=new ji("ivec2"),bn=new ji("uvec2"),xn=new ji("bvec2"),Tn=new ji("vec3"),_n=new ji("ivec3"),vn=new ji("uvec3"),Nn=new ji("bvec3"),Sn=new ji("vec4"),Rn=new ji("ivec4"),An=new ji("uvec4"),En=new ji("bvec4"),wn=new ji("mat2"),Cn=new ji("mat3"),Mn=new ji("mat4");_i("toColor",cn),_i("toFloat",hn),_i("toInt",pn),_i("toUint",gn),_i("toBool",mn),_i("toVec2",fn),_i("toIVec2",yn),_i("toUVec2",bn),_i("toBVec2",xn),_i("toVec3",Tn),_i("toIVec3",_n),_i("toUVec3",vn),_i("toBVec3",Nn),_i("toVec4",Sn),_i("toIVec4",Rn),_i("toUVec4",An),_i("toBVec4",En),_i("toMat2",wn),_i("toMat3",Cn),_i("toMat4",Mn);const Bn=en(oi).setParameterLength(2),Pn=(e,t)=>Yi(new ui(Yi(e),t));_i("element",Bn),_i("convert",Pn);_i("append",e=>(d("TSL: .append() has been renamed to .toStack()."),dn(e)));class Ln extends ai{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Fs(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}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 Fn=(e,t)=>new Ln(e,t),Dn=(e,t)=>new Ln(e,t,!0),Un=tn(Ln,"vec4","DiffuseColor"),In=tn(Ln,"vec3","DiffuseContribution"),On=tn(Ln,"vec3","EmissiveColor"),Vn=tn(Ln,"float","Roughness"),kn=tn(Ln,"float","Metalness"),Gn=tn(Ln,"float","Clearcoat"),zn=tn(Ln,"float","ClearcoatRoughness"),$n=tn(Ln,"vec3","Sheen"),Wn=tn(Ln,"float","SheenRoughness"),Hn=tn(Ln,"float","Iridescence"),jn=tn(Ln,"float","IridescenceIOR"),qn=tn(Ln,"float","IridescenceThickness"),Xn=tn(Ln,"float","AlphaT"),Kn=tn(Ln,"float","Anisotropy"),Yn=tn(Ln,"vec3","AnisotropyT"),Qn=tn(Ln,"vec3","AnisotropyB"),Zn=tn(Ln,"color","SpecularColor"),Jn=tn(Ln,"color","SpecularColorBlended"),ea=tn(Ln,"float","SpecularF90"),ta=tn(Ln,"float","Shininess"),ra=tn(Ln,"vec4","Output"),sa=tn(Ln,"float","dashSize"),ia=tn(Ln,"float","gapSize"),na=tn(Ln,"float","pointWidth"),aa=tn(Ln,"float","IOR"),oa=tn(Ln,"float","Transmission"),ua=tn(Ln,"float","Thickness"),la=tn(Ln,"float","AttenuationDistance"),da=tn(Ln,"color","AttenuationColor"),ca=tn(Ln,"float","Dispersion");class ha extends ai{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 pa=e=>new ha(e),ga=(e,t=0)=>new ha(e,!0,t),ma=ga("frame"),fa=ga("render"),ya=pa("object");class ba extends mi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=ya}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),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.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const xa=(e,t)=>{const r=Xi(t||e);if(r===e&&(e=Hs(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new ba(e,r)};class Ta extends li{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const _a=(...e)=>{let t;if(1===e.length){const r=e[0];t=new Ta(null,r.length,r)}else{const r=e[0],s=e[1];t=new Ta(r,s)}return Yi(t)};_i("toArray",(e,t)=>_a(Array(t).fill(e)));class va extends li{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}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 si.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.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)o("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?Ji(t):Zi(t[0]),new Sa(Yi(e),t));_i("call",Ra);const Aa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ea extends li{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ea(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=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),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const wa=rn(Ea,"+").setParameterLength(2,1/0).setName("add"),Ca=rn(Ea,"-").setParameterLength(2,1/0).setName("sub"),Ma=rn(Ea,"*").setParameterLength(2,1/0).setName("mul"),Ba=rn(Ea,"/").setParameterLength(2,1/0).setName("div"),Pa=rn(Ea,"%").setParameterLength(2).setName("mod"),La=rn(Ea,"==").setParameterLength(2).setName("equal"),Fa=rn(Ea,"!=").setParameterLength(2).setName("notEqual"),Da=rn(Ea,"<").setParameterLength(2).setName("lessThan"),Ua=rn(Ea,">").setParameterLength(2).setName("greaterThan"),Ia=rn(Ea,"<=").setParameterLength(2).setName("lessThanEqual"),Oa=rn(Ea,">=").setParameterLength(2).setName("greaterThanEqual"),Va=rn(Ea,"&&").setParameterLength(2,1/0).setName("and"),ka=rn(Ea,"||").setParameterLength(2,1/0).setName("or"),Ga=rn(Ea,"!").setParameterLength(1).setName("not"),za=rn(Ea,"^^").setParameterLength(2).setName("xor"),$a=rn(Ea,"&").setParameterLength(2).setName("bitAnd"),Wa=rn(Ea,"~").setParameterLength(1).setName("bitNot"),Ha=rn(Ea,"|").setParameterLength(2).setName("bitOr"),ja=rn(Ea,"^").setParameterLength(2).setName("bitXor"),qa=rn(Ea,"<<").setParameterLength(2).setName("shiftLeft"),Xa=rn(Ea,">>").setParameterLength(2).setName("shiftRight"),Ka=an(([e])=>(e.addAssign(1),e)),Ya=an(([e])=>(e.subAssign(1),e)),Qa=an(([e])=>{const t=pn(e).toConst();return e.addAssign(1),t}),Za=an(([e])=>{const t=pn(e).toConst();return e.subAssign(1),t});_i("add",wa),_i("sub",Ca),_i("mul",Ma),_i("div",Ba),_i("mod",Pa),_i("equal",La),_i("notEqual",Fa),_i("lessThan",Da),_i("greaterThan",Ua),_i("lessThanEqual",Ia),_i("greaterThanEqual",Oa),_i("and",Va),_i("or",ka),_i("not",Ga),_i("xor",za),_i("bitAnd",$a),_i("bitNot",Wa),_i("bitOr",Ha),_i("bitXor",ja),_i("shiftLeft",qa),_i("shiftRight",Xa),_i("incrementBefore",Ka),_i("decrementBefore",Ya),_i("increment",Qa),_i("decrement",Za);const Ja=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(pn(e),pn(t)));_i("modInt",Ja);class eo extends li{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===eo.MAX||e===eo.MIN)&&arguments.length>3){let i=new eo(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===eo.LENGTH||t===eo.DISTANCE||t===eo.DOT?"float":t===eo.CROSS?"vec3":t===eo.ALL||t===eo.ANY?"bool":t===eo.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===eo.ONE_MINUS)i=Ca(1,t);else if(s===eo.RECIPROCAL)i=Ba(1,t);else if(s===eo.DIFFERENCE)i=wo(Ca(t,r));else if(s===eo.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=Sn(Tn(n),0):s=Sn(Tn(s),0);const a=Ma(s,n).xyz;i=To(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.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===eo.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===eo.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===eo.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==eo.MIN&&r!==eo.MAX?r===eo.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===eo.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===eo.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==eo.DFDX&&r!==eo.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}eo.ALL="all",eo.ANY="any",eo.RADIANS="radians",eo.DEGREES="degrees",eo.EXP="exp",eo.EXP2="exp2",eo.LOG="log",eo.LOG2="log2",eo.SQRT="sqrt",eo.INVERSE_SQRT="inversesqrt",eo.FLOOR="floor",eo.CEIL="ceil",eo.NORMALIZE="normalize",eo.FRACT="fract",eo.SIN="sin",eo.COS="cos",eo.TAN="tan",eo.ASIN="asin",eo.ACOS="acos",eo.ATAN="atan",eo.ABS="abs",eo.SIGN="sign",eo.LENGTH="length",eo.NEGATE="negate",eo.ONE_MINUS="oneMinus",eo.DFDX="dFdx",eo.DFDY="dFdy",eo.ROUND="round",eo.RECIPROCAL="reciprocal",eo.TRUNC="trunc",eo.FWIDTH="fwidth",eo.TRANSPOSE="transpose",eo.DETERMINANT="determinant",eo.INVERSE="inverse",eo.EQUALS="equals",eo.MIN="min",eo.MAX="max",eo.STEP="step",eo.REFLECT="reflect",eo.DISTANCE="distance",eo.DIFFERENCE="difference",eo.DOT="dot",eo.CROSS="cross",eo.POW="pow",eo.TRANSFORM_DIRECTION="transformDirection",eo.MIX="mix",eo.CLAMP="clamp",eo.REFRACT="refract",eo.SMOOTHSTEP="smoothstep",eo.FACEFORWARD="faceforward";const to=hn(1e-6),ro=hn(1e6),so=hn(Math.PI),io=hn(2*Math.PI),no=hn(2*Math.PI),ao=hn(.5*Math.PI),oo=rn(eo,eo.ALL).setParameterLength(1),uo=rn(eo,eo.ANY).setParameterLength(1),lo=rn(eo,eo.RADIANS).setParameterLength(1),co=rn(eo,eo.DEGREES).setParameterLength(1),ho=rn(eo,eo.EXP).setParameterLength(1),po=rn(eo,eo.EXP2).setParameterLength(1),go=rn(eo,eo.LOG).setParameterLength(1),mo=rn(eo,eo.LOG2).setParameterLength(1),fo=rn(eo,eo.SQRT).setParameterLength(1),yo=rn(eo,eo.INVERSE_SQRT).setParameterLength(1),bo=rn(eo,eo.FLOOR).setParameterLength(1),xo=rn(eo,eo.CEIL).setParameterLength(1),To=rn(eo,eo.NORMALIZE).setParameterLength(1),_o=rn(eo,eo.FRACT).setParameterLength(1),vo=rn(eo,eo.SIN).setParameterLength(1),No=rn(eo,eo.COS).setParameterLength(1),So=rn(eo,eo.TAN).setParameterLength(1),Ro=rn(eo,eo.ASIN).setParameterLength(1),Ao=rn(eo,eo.ACOS).setParameterLength(1),Eo=rn(eo,eo.ATAN).setParameterLength(1,2),wo=rn(eo,eo.ABS).setParameterLength(1),Co=rn(eo,eo.SIGN).setParameterLength(1),Mo=rn(eo,eo.LENGTH).setParameterLength(1),Bo=rn(eo,eo.NEGATE).setParameterLength(1),Po=rn(eo,eo.ONE_MINUS).setParameterLength(1),Lo=rn(eo,eo.DFDX).setParameterLength(1),Fo=rn(eo,eo.DFDY).setParameterLength(1),Do=rn(eo,eo.ROUND).setParameterLength(1),Uo=rn(eo,eo.RECIPROCAL).setParameterLength(1),Io=rn(eo,eo.TRUNC).setParameterLength(1),Oo=rn(eo,eo.FWIDTH).setParameterLength(1),Vo=rn(eo,eo.TRANSPOSE).setParameterLength(1),ko=rn(eo,eo.DETERMINANT).setParameterLength(1),Go=rn(eo,eo.INVERSE).setParameterLength(1),zo=rn(eo,eo.MIN).setParameterLength(2,1/0),$o=rn(eo,eo.MAX).setParameterLength(2,1/0),Wo=rn(eo,eo.STEP).setParameterLength(2),Ho=rn(eo,eo.REFLECT).setParameterLength(2),jo=rn(eo,eo.DISTANCE).setParameterLength(2),qo=rn(eo,eo.DIFFERENCE).setParameterLength(2),Xo=rn(eo,eo.DOT).setParameterLength(2),Ko=rn(eo,eo.CROSS).setParameterLength(2),Yo=rn(eo,eo.POW).setParameterLength(2),Qo=e=>Ma(e,e),Zo=e=>Ma(e,e,e),Jo=e=>Ma(e,e,e,e),eu=rn(eo,eo.TRANSFORM_DIRECTION).setParameterLength(2),tu=e=>Ma(Co(e),Yo(wo(e),1/3)),ru=e=>Xo(e,e),su=rn(eo,eo.MIX).setParameterLength(3),iu=(e,t=0,r=1)=>Yi(new eo(eo.CLAMP,Yi(e),Yi(t),Yi(r))),nu=e=>iu(e),au=rn(eo,eo.REFRACT).setParameterLength(3),ou=rn(eo,eo.SMOOTHSTEP).setParameterLength(3),uu=rn(eo,eo.FACEFORWARD).setParameterLength(3),lu=an(([e])=>{const t=Xo(e.xy,fn(12.9898,78.233)),r=Pa(t,so);return _o(vo(r).mul(43758.5453))}),du=(e,t,r)=>su(t,r,e),cu=(e,t,r)=>ou(t,r,e),hu=(e,t)=>Wo(t,e),pu=uu,gu=yo;_i("all",oo),_i("any",uo),_i("radians",lo),_i("degrees",co),_i("exp",ho),_i("exp2",po),_i("log",go),_i("log2",mo),_i("sqrt",fo),_i("inverseSqrt",yo),_i("floor",bo),_i("ceil",xo),_i("normalize",To),_i("fract",_o),_i("sin",vo),_i("cos",No),_i("tan",So),_i("asin",Ro),_i("acos",Ao),_i("atan",Eo),_i("abs",wo),_i("sign",Co),_i("length",Mo),_i("lengthSq",ru),_i("negate",Bo),_i("oneMinus",Po),_i("dFdx",Lo),_i("dFdy",Fo),_i("round",Do),_i("reciprocal",Uo),_i("trunc",Io),_i("fwidth",Oo),_i("min",zo),_i("max",$o),_i("step",hu),_i("reflect",Ho),_i("distance",jo),_i("dot",Xo),_i("cross",Ko),_i("pow",Yo),_i("pow2",Qo),_i("pow3",Zo),_i("pow4",Jo),_i("transformDirection",eu),_i("mix",du),_i("clamp",iu),_i("refract",au),_i("smoothstep",cu),_i("faceForward",uu),_i("difference",qo),_i("saturate",nu),_i("cbrt",tu),_i("transpose",Vo),_i("determinant",ko),_i("inverse",Go),_i("rand",lu);class mu extends ai{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 e.flowBuildStage(this,"setup"),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,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?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?Fn(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\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&&(d("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 fu=en(mu).setParameterLength(2,3);_i("select",fu);class yu extends ai{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const bu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new yu(r,t)},xu=e=>bu(e,{uniformFlow:!0}),Tu=(e,t)=>bu(e,{nodeName:t});function _u(e,t,r=null){return bu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function vu(e,t=null){return bu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Nu(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),Tu(e,t)}_i("context",bu),_i("label",Nu),_i("uniformFlow",xu),_i("setName",Tu),_i("builtinShadowContext",(e,t,r)=>_u(t,r,e)),_i("builtinAOContext",(e,t)=>vu(t,e));class Su extends ai{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,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Ru=en(Su),Au=(e,t=null)=>Ru(e,t).toStack(),Eu=(e,t=null)=>Ru(e,t,!0).toStack(),wu=e=>Ru(e).setIntent(!0).toStack();_i("toVar",Au),_i("toConst",Eu),_i("toVarIntent",wu);class Cu extends ai{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Mu=(e,t,r=null)=>Yi(new Cu(Yi(e),t,r));class Bu extends ai{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,this.global=!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=Mu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Ys.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Ys.VERTEX);e.flowNodeFromShaderStage(Ys.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=en(Bu).setParameterLength(1,2),Lu=e=>Pu(e);_i("toVarying",Pu),_i("toVertexStage",Lu);const Fu=an(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return su(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Du=an(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return su(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Uu="WorkingColorSpace";class Iu extends li{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===Uu?p.workingColorSpace:"OutputColorSpace"===t?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!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=Sn(Fu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=Sn(Cn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=Sn(Du(i.rgb),i.a)),i):i}}const Ou=(e,t)=>Yi(new Iu(Yi(e),Uu,t)),Vu=(e,t)=>Yi(new Iu(Yi(e),t,Uu));_i("workingToColorSpace",Ou),_i("colorSpaceToWorking",Vu);let ku=class extends oi{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 Gu extends ai{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=Qs.OBJECT}setGroup(e){return this.group=e,this}element(e){return new ku(this,Yi(e))}setNodeType(e){const t=xa(null,e);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;enew zu(e,t,r);class Wu extends li{static get type(){return"ToneMappingNode"}constructor(e,t=ju,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Us(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=Sn(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const Hu=(e,t,r)=>Yi(new Wu(e,Yi(t),Yi(r))),ju=$u("toneMappingExposure","float");_i("toneMapping",(e,t,r)=>Hu(t,r,e));const qu=new WeakMap;function Xu(e,t){let r=qu.get(e);return void 0===r&&(r=new b(e,t),qu.set(e,r)),r}class Ku extends mi{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=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(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=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Xu(s.array,i):Xu(s,i);const o=new y(a,r,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=Pu(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}}function Yu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Cn(new Ku(e,"vec3",9,0).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,3).setUsage(i).setInstanced(n),new Ku(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Mn(new Ku(e,"vec4",16,0).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,4).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,8).setUsage(i).setInstanced(n),new Ku(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Ku(e,t,r,s)}const Qu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s),Zu=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,f,!0),Ju=(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x,!0);_i("toAttribute",e=>Qu(e.value));class el extends ai{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Qs.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const tl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;etl(e,r).setCount(t);_i("compute",rl),_i("computeKernel",tl);class sl extends ai{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!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}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const il=e=>new sl(Yi(e));function nl(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),il(e).setParent(t)}_i("cache",nl),_i("isolate",il);class al extends ai{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 ol=en(al).setParameterLength(2);_i("bypass",ol);class ul extends ai{static get type(){return"RemapNode"}constructor(e,t,r,s=hn(0),i=hn(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 ll=en(ul,null,null,{doClamp:!1}).setParameterLength(3,5),dl=en(ul).setParameterLength(3,5);_i("remap",ll),_i("remapClamp",dl);class cl extends ai{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 hl=en(cl).setParameterLength(1,2),pl=e=>(e?fu(e,hl("discard")):hl("discard")).toStack();_i("discard",pl);class gl extends li{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const ml=(e,t=null,r=null)=>Yi(new gl(Yi(e),t,r));_i("renderOutput",ml);class fl extends li{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):_(n),r}}const yl=(e,t=null)=>Yi(new fl(Yi(e),t)).toStack();_i("debug",yl);class bl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class xl extends ai{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Qs.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==bl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function Tl(e,t="",r=null){return(e=Yi(e)).before(new xl(e,t,r))}_i("toInspector",Tl);class _l extends ai{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 Pu(this).build(e,r)}return d(`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 vl=(e,t=null)=>new _l(e,t),Nl=(e=0)=>vl("uv"+(e>0?e:""),"vec2");class Sl extends ai{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 Rl=en(Sl).setParameterLength(1,2);class Al extends ba{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Qs.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 El=en(Al).setParameterLength(1),wl=new N;class Cl extends ba{static get type(){return"TextureNode"}constructor(e=wl,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.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Qs.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=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===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Nl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=xa(this.value.matrix)),this._matrixUniform.mul(Tn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=xa(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1)),t)),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().");const s=an(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Qs.OBJECT:Qs.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}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),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=Wo(hl(x,"float"),hl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Vu(hl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Yi(e).mul(El(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Yi(t)}level(e){const t=this.clone();return t.levelNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}size(e){return Rl(this,e)}bias(e){const t=this.clone();return t.biasNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Yi(e),Yi(t)],r.referenceNode=this.getBase(),Yi(r)}depth(e){const t=this.clone();return t.depthNode=Yi(e),t.referenceNode=this.getBase(),Yi(t)}offset(e){const t=this.clone();return t.offsetNode=Yi(e),t.referenceNode=this.getBase(),Yi(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();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}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.offsetNode=this.offsetNode,e}}const Ml=en(Cl).setParameterLength(1,4).setName("texture"),Bl=(e=wl,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Yi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=Ml(e,t,r,s),i},Pl=(...e)=>Bl(...e).setSampler(!1);class Ll extends ba{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Fl=(e,t,r)=>new Ll(e,t,r);class Dl extends oi{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 Ul extends Ll{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?Ws(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Qs.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;rnew Ul(e,t);const Ol=en(class extends ai{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Vl,kl;class Gl extends ai{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===Gl.DPR?"float":this.scope===Gl.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Qs.NONE;return this.scope!==Gl.SIZE&&this.scope!==Gl.VIEWPORT&&this.scope!==Gl.DPR||(e=Qs.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===Gl.VIEWPORT?null!==t?kl.copy(t.viewport):(e.getViewport(kl),kl.multiplyScalar(e.getPixelRatio())):this.scope===Gl.DPR?this._output.value=e.getPixelRatio():null!==t?(Vl.width=t.width,Vl.height=t.height):e.getDrawingBufferSize(Vl)}setup(){const e=this.scope;let r=null;return r=e===Gl.SIZE?xa(Vl||(Vl=new t)):e===Gl.VIEWPORT?xa(kl||(kl=new s)):e===Gl.DPR?xa(1):fn(Hl.div(Wl)),this._output=r,r}generate(e){if(this.scope===Gl.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(Wl).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}Gl.COORDINATE="coordinate",Gl.VIEWPORT="viewport",Gl.SIZE="size",Gl.UV="uv",Gl.DPR="dpr";const zl=tn(Gl,Gl.DPR),$l=tn(Gl,Gl.UV),Wl=tn(Gl,Gl.SIZE),Hl=tn(Gl,Gl.COORDINATE),jl=tn(Gl,Gl.VIEWPORT),ql=jl.zw,Xl=Hl.sub(jl.xy),Kl=Xl.div(ql),Yl=an(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),Wl),"vec2").once()(),Ql=xa(0,"uint").setName("u_cameraIndex").setGroup(ga("cameraIndex")).toVarying("v_cameraIndex"),Zl=xa("float").setName("cameraNear").setGroup(fa).onRenderUpdate(({camera:e})=>e.near),Jl=xa("float").setName("cameraFar").setGroup(fa).onRenderUpdate(({camera:e})=>e.far),ed=an(({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(fa).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrix")}else t=xa("mat4").setName("cameraProjectionMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),td=an(({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(fa).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraProjectionMatrixInverse")}else t=xa("mat4").setName("cameraProjectionMatrixInverse").setGroup(fa).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),rd=an(({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(fa).setName("cameraViewMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraViewMatrix")}else t=xa("mat4").setName("cameraViewMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),sd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Il(r).setGroup(fa).setName("cameraWorldMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraWorldMatrix")}else t=xa("mat4").setName("cameraWorldMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),id=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Il(r).setGroup(fa).setName("cameraNormalMatrices").element(e.isMultiViewCamera?Ol("gl_ViewID_OVR"):Ql).toConst("cameraNormalMatrix")}else t=xa("mat3").setName("cameraNormalMatrix").setGroup(fa).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),nd=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ad=an(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Il(r,"vec4").setGroup(fa).setName("cameraViewports").element(Ql).toConst("cameraViewport")}else t=Sn(0,0,Wl.x,Wl.y).toConst("cameraViewport");return t}).once()(),od=new C;class ud extends ai{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Qs.OBJECT,this.uniformNode=new ba(null)}getNodeType(){const e=this.scope;return e===ud.WORLD_MATRIX?"mat4":e===ud.POSITION||e===ud.VIEW_POSITION||e===ud.DIRECTION||e===ud.SCALE?"vec3":e===ud.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===ud.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===ud.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===ud.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===ud.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===ud.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===ud.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),od.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=od.radius}}generate(e){const t=this.scope;return t===ud.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===ud.POSITION||t===ud.VIEW_POSITION||t===ud.DIRECTION||t===ud.SCALE?this.uniformNode.nodeType="vec3":t===ud.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}}ud.WORLD_MATRIX="worldMatrix",ud.POSITION="position",ud.SCALE="scale",ud.VIEW_POSITION="viewPosition",ud.DIRECTION="direction",ud.RADIUS="radius";const ld=en(ud,ud.DIRECTION).setParameterLength(1),dd=en(ud,ud.WORLD_MATRIX).setParameterLength(1),cd=en(ud,ud.POSITION).setParameterLength(1),hd=en(ud,ud.SCALE).setParameterLength(1),pd=en(ud,ud.VIEW_POSITION).setParameterLength(1),gd=en(ud,ud.RADIUS).setParameterLength(1);class md extends ud{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const fd=tn(md,md.DIRECTION),yd=tn(md,md.WORLD_MATRIX),bd=tn(md,md.POSITION),xd=tn(md,md.SCALE),Td=tn(md,md.VIEW_POSITION),_d=tn(md,md.RADIUS),vd=xa(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Nd=xa(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Sd=an(e=>e.context.modelViewMatrix||Rd).once()().toVar("modelViewMatrix"),Rd=rd.mul(yd),Ad=an(e=>(e.context.isHighPrecisionModelViewMatrix=!0,xa("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Ed=an(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return xa("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),wd=vl("position","vec3"),Cd=wd.toVarying("positionLocal"),Md=wd.toVarying("positionPrevious"),Bd=an(e=>yd.mul(Cd).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Pd=an(()=>Cd.transformDirection(yd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ld=an(e=>e.context.setupPositionView().toVarying("v_positionView"),"vec3").once(["POSITION"])(),Fd=an(e=>{let t;return t=e.camera.isOrthographicCamera?Tn(0,0,1):Ld.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Dd extends ai{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Ud=tn(Dd),Id=hn(Ud).mul(2).sub(1),Od=an(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(Id)),e}),Vd=vl("normal","vec3"),kd=an(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),Tn(0,1,0)):Vd,"vec3").once()().toVar("normalLocal"),Gd=Ld.dFdx().cross(Ld.dFdy()).normalize().toVar("normalFlat"),zd=an(e=>{let t;return t=!0===e.material.flatShading?Gd:Xd(kd).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),$d=an(e=>{let t=zd.transformDirection(rd);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),Wd=an(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=zd,!0!==t.flatShading&&(s=Od(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Hd=Wd.transformDirection(rd).toVar("normalWorld"),jd=an(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?Wd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),qd=an(([e,t=yd])=>{const r=Cn(t),s=e.div(Tn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Xd=an(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=vd.mul(e);return rd.transformDirection(s)}),Kd=an(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),Wd)).once(["NORMAL","VERTEX"])(),Yd=an(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Hd)).once(["NORMAL","VERTEX"])(),Qd=an(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Zd=new P,Jd=new a,ec=xa(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),tc=xa(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),rc=xa(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?(Zd.copy(r),Jd.makeRotationFromEuler(Zd)):Jd.identity(),Jd}),sc=Fd.negate().reflect(Wd),ic=Fd.negate().refract(Wd,ec),nc=sc.transformDirection(rd).toVar("reflectVector"),ac=ic.transformDirection(rd).toVar("reflectVector"),oc=new L;class uc extends Cl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===F?nc:e.mapping===D?ac:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),Tn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?Tn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=Tn(t.x.negate(),t.yz)),rc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const lc=en(uc).setParameterLength(1,4).setName("cubeTexture"),dc=(e=oc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Yi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Yi(t)),null!==r&&(i.levelNode=Yi(r)),null!==s&&(i.biasNode=Yi(s))):i=lc(e,t,r,s),i};class cc extends oi{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 hc extends ai{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=Qs.OBJECT}element(e){return new cc(this,Yi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Fl(null,e,this.count):Array.isArray(this.getValueFromReference())?Il(null,e):"texture"===e?Bl(null):"cubeTexture"===e?dc(null):xa(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),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;enew hc(e,t,r),gc=(e,t,r,s)=>new hc(e,t,s,r);class mc extends hc{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 fc=(e,t,r=null)=>new mc(e,t,r),yc=Nl(),bc=Ld.dFdx(),xc=Ld.dFdy(),Tc=yc.dFdx(),_c=yc.dFdy(),vc=Wd,Nc=xc.cross(vc),Sc=vc.cross(bc),Rc=Nc.mul(Tc.x).add(Sc.mul(_c.x)),Ac=Nc.mul(Tc.y).add(Sc.mul(_c.y)),Ec=Rc.dot(Rc).max(Ac.dot(Ac)),wc=Ec.equal(0).select(0,Ec.inverseSqrt()),Cc=Rc.mul(wc).toVar("tangentViewFrame"),Mc=Ac.mul(wc).toVar("bitangentViewFrame"),Bc=vl("tangent","vec4"),Pc=Bc.xyz.toVar("tangentLocal"),Lc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Sd.mul(Sn(Pc,0)).xyz.toVarying("v_tangentView").normalize():Cc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Fc=Lc.transformDirection(rd).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Dc=an(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Bc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Uc=Dc(Vd.cross(Bc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),Ic=Dc(kd.cross(Pc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Oc=an(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Dc(Wd.cross(Lc),"v_bitangentView").normalize():Mc,!0!==r.flatShading&&(s=Od(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),Vc=Dc(Hd.cross(Fc),"v_bitangentWorld").normalize().toVar("bitangentWorld"),kc=Cn(Lc,Oc,Wd).toVar("TBNViewMatrix"),Gc=Fd.mul(kc),zc=an(()=>{let e=Qn.cross(Fd);return e=e.cross(Qn).normalize(),e=su(e,Wd,Kn.mul(Vn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),$c=e=>Yi(e).mul(.5).add(.5),Wc=e=>Tn(e,fo(nu(hn(1).sub(Xo(e,e)))));class Hc extends li{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=Wc(i.xy):s===V?i=Wc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Od(t)),i=Tn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Xd(i):t===U?n=kc.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=Wd),n}}const jc=en(Hc).setParameterLength(1,2),qc=an(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Nl()),forceUVContext:!0}),s=hn(r(e=>e));return fn(hn(r(e=>e.add(e.dFdx()))).sub(s),hn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Xc=an(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(Id),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Kc extends li{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=qc({textureNode:this.textureNode,bumpScale:e});return Xc({surf_pos:Ld,surf_norm:Wd,dHdxy:t})}}const Yc=en(Kc).setParameterLength(1,2),Qc=new Map;class Zc extends ai{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=Qc.get(e);return void 0===r&&(r=fc(e,t),Qc.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===Zc.COLOR){const e=void 0!==t.color?this.getColor(r):Tn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===Zc.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===Zc.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:hn(1);else if(r===Zc.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===Zc.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===Zc.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===Zc.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===Zc.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===Zc.NORMAL)t.normalMap?(s=jc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Yc(this.getTexture("bump").r,this.getFloat("bumpScale")):Wd;else if(r===Zc.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===Zc.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?jc(this.getTexture(r),this.getCache(r+"Scale","vec2")):Wd;else if(r===Zc.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===Zc.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===Zc.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=wn(Uh.x,Uh.y,Uh.y.negate(),Uh.x).mul(e.rg.mul(2).sub(fn(1)).normalize().mul(e.b))}else s=Uh;else if(r===Zc.IRIDESCENCE_THICKNESS){const e=pc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=pc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===Zc.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===Zc.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===Zc.IOR)s=this.getFloat(r);else if(r===Zc.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===Zc.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===Zc.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):hn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}Zc.ALPHA_TEST="alphaTest",Zc.COLOR="color",Zc.OPACITY="opacity",Zc.SHININESS="shininess",Zc.SPECULAR="specular",Zc.SPECULAR_STRENGTH="specularStrength",Zc.SPECULAR_INTENSITY="specularIntensity",Zc.SPECULAR_COLOR="specularColor",Zc.REFLECTIVITY="reflectivity",Zc.ROUGHNESS="roughness",Zc.METALNESS="metalness",Zc.NORMAL="normal",Zc.CLEARCOAT="clearcoat",Zc.CLEARCOAT_ROUGHNESS="clearcoatRoughness",Zc.CLEARCOAT_NORMAL="clearcoatNormal",Zc.EMISSIVE="emissive",Zc.ROTATION="rotation",Zc.SHEEN="sheen",Zc.SHEEN_ROUGHNESS="sheenRoughness",Zc.ANISOTROPY="anisotropy",Zc.IRIDESCENCE="iridescence",Zc.IRIDESCENCE_IOR="iridescenceIOR",Zc.IRIDESCENCE_THICKNESS="iridescenceThickness",Zc.IOR="ior",Zc.TRANSMISSION="transmission",Zc.THICKNESS="thickness",Zc.ATTENUATION_DISTANCE="attenuationDistance",Zc.ATTENUATION_COLOR="attenuationColor",Zc.LINE_SCALE="scale",Zc.LINE_DASH_SIZE="dashSize",Zc.LINE_GAP_SIZE="gapSize",Zc.LINE_WIDTH="linewidth",Zc.LINE_DASH_OFFSET="dashOffset",Zc.POINT_SIZE="size",Zc.DISPERSION="dispersion",Zc.LIGHT_MAP="light",Zc.AO="ao";const Jc=tn(Zc,Zc.ALPHA_TEST),eh=tn(Zc,Zc.COLOR),th=tn(Zc,Zc.SHININESS),rh=tn(Zc,Zc.EMISSIVE),sh=tn(Zc,Zc.OPACITY),ih=tn(Zc,Zc.SPECULAR),nh=tn(Zc,Zc.SPECULAR_INTENSITY),ah=tn(Zc,Zc.SPECULAR_COLOR),oh=tn(Zc,Zc.SPECULAR_STRENGTH),uh=tn(Zc,Zc.REFLECTIVITY),lh=tn(Zc,Zc.ROUGHNESS),dh=tn(Zc,Zc.METALNESS),ch=tn(Zc,Zc.NORMAL),hh=tn(Zc,Zc.CLEARCOAT),ph=tn(Zc,Zc.CLEARCOAT_ROUGHNESS),gh=tn(Zc,Zc.CLEARCOAT_NORMAL),mh=tn(Zc,Zc.ROTATION),fh=tn(Zc,Zc.SHEEN),yh=tn(Zc,Zc.SHEEN_ROUGHNESS),bh=tn(Zc,Zc.ANISOTROPY),xh=tn(Zc,Zc.IRIDESCENCE),Th=tn(Zc,Zc.IRIDESCENCE_IOR),_h=tn(Zc,Zc.IRIDESCENCE_THICKNESS),vh=tn(Zc,Zc.TRANSMISSION),Nh=tn(Zc,Zc.THICKNESS),Sh=tn(Zc,Zc.IOR),Rh=tn(Zc,Zc.ATTENUATION_DISTANCE),Ah=tn(Zc,Zc.ATTENUATION_COLOR),Eh=tn(Zc,Zc.LINE_SCALE),wh=tn(Zc,Zc.LINE_DASH_SIZE),Ch=tn(Zc,Zc.LINE_GAP_SIZE),Mh=tn(Zc,Zc.LINE_WIDTH),Bh=tn(Zc,Zc.LINE_DASH_OFFSET),Ph=tn(Zc,Zc.POINT_SIZE),Lh=tn(Zc,Zc.DISPERSION),Fh=tn(Zc,Zc.LIGHT_MAP),Dh=tn(Zc,Zc.AO),Uh=xa(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))}),Ih=an(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Oh extends oi{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 Vh=en(Oh).setParameterLength(2);class kh extends Ll{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=Vs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=Js.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 Vh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(Js.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Qu(this.value),this._varying=Pu(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)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}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 Gh=(e,t=null,r=0)=>new kh(e,t,r);class zh extends ai{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===zh.VERTEX)s=e.getVertexIndex();else if(r===zh.INSTANCE)s=e.getInstanceIndex();else if(r===zh.DRAW)s=e.getDrawIndex();else if(r===zh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===zh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==zh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}zh.VERTEX="vertex",zh.INSTANCE="instance",zh.SUBGROUP="subgroup",zh.INVOCATION_LOCAL="invocationLocal",zh.INVOCATION_SUBGROUP="invocationSubgroup",zh.DRAW="draw";const $h=tn(zh,zh.VERTEX),Wh=tn(zh,zh.INSTANCE),Hh=tn(zh,zh.SUBGROUP),jh=tn(zh,zh.INVOCATION_SUBGROUP),qh=tn(zh,zh.INVOCATION_LOCAL),Xh=tn(zh,zh.DRAW);class Kh extends ai{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=Qs.FRAME,this.buffer=null,this.bufferColor=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){const{instanceMatrix:t,instanceColor:r,isStorageMatrix:s,isStorageColor:i}=this,{count:n}=t;let{instanceMatrixNode:a,instanceColorNode:o}=this;if(null===a){if(s)a=Gh(t,"mat4",Math.max(n,1)).element(Wh);else if(n<=1e3)a=Fl(t.array,"mat4",Math.max(n,1)).element(Wh);else{const e=new W(t.array,16,1);this.buffer=e;const r=t.usage===x?Ju:Zu,s=[r(e,"vec4",16,0),r(e,"vec4",16,4),r(e,"vec4",16,8),r(e,"vec4",16,12)];a=Mn(...s)}this.instanceMatrixNode=a}if(r&&null===o){if(i)o=Gh(r,"vec3",Math.max(r.count,1)).element(Wh);else{const e=new H(r.array,3),t=r.usage===x?Ju:Zu;this.bufferColor=e,o=Tn(t(e,"vec3",3,0))}this.instanceColorNode=o}const u=a.mul(Cd).xyz;if(Cd.assign(u),e.hasGeometryAttribute("normal")){const e=qd(kd,a);kd.assign(e)}null!==this.instanceColorNode&&Dn("vec3","vInstanceColor").assign(this.instanceColorNode)}update(){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.usage!==x&&this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.usage!==x&&this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version))}}const Yh=en(Kh).setParameterLength(2,3);class Qh extends Kh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const Zh=en(Qh).setParameterLength(1);class Jh extends ai{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=Wh:this.batchingIdNode=Xh);const t=an(([e])=>{const t=pn(Rl(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=pn(e).mod(t).toConst(),s=pn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,yn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(pn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=pn(Rl(Pl(s),0).x).toConst(),n=hn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Mn(Pl(s,yn(a,o)),Pl(s,yn(a.add(1),o)),Pl(s,yn(a.add(2),o)),Pl(s,yn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=an(([e])=>{const t=pn(Rl(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,yn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);Dn("vec3","vBatchColor").assign(t)}const d=Cn(u);Cd.assign(u.mul(Cd));const c=kd.div(Tn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;kd.assign(h),e.hasGeometryAttribute("tangent")&&Pc.mulAssign(d)}}const ep=en(Jh).setParameterLength(1),tp=new WeakMap;class rp extends ai{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Qs.OBJECT,this.skinIndexNode=vl("skinIndex","uvec4"),this.skinWeightNode=vl("skinWeight","vec4"),this.bindMatrixNode=pc("bindMatrix","mat4"),this.bindMatrixInverseNode=pc("bindMatrixInverse","mat4"),this.boneMatricesNode=gc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Cd,this.toPositionNode=Cd,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=wa(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=kd){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=wa(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=gc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Md)}needsPreviousBoneMatrices(e){const t=e.renderer.getMRT();return t&&t.has("velocity")||!0===js(e.object).useVelocity}setup(e){this.needsPreviousBoneMatrices(e)&&Md.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const t=this.getSkinnedNormal();kd.assign(t),e.hasGeometryAttribute("tangent")&&Pc.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;tp.get(t)!==e.frameId&&(tp.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const sp=e=>new rp(e);class ip extends ai{static get type(){return"LoopNode"}constructor(e=[]){super("void"),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(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew ip(Ji(e,"int")).toStack(),ap=()=>hl("break").toStack(),op=new WeakMap,up=new s,lp=an(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=pn($h).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,yn(u,o)).depth(i).xyz.mul(t)});class dp extends ai{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=xa(1),this.updateType=Qs.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=op.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 j(m,h,p,a);f.type=q,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=hn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,yn(pn(e).add(1),pn(Wh))).r):t.assign(pc("morphTargetInfluences","float").element(e).toVar()),ln(t.notEqual(0),()=>{!0===s&&Cd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(0)})),!0===i&&kd.addAssign(lp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:pn(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 cp=en(dp).setParameterLength(1);class hp extends ai{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class pp extends hp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class gp extends yu{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:Tn().toVar("directDiffuse"),directSpecular:Tn().toVar("directSpecular"),indirectDiffuse:Tn().toVar("indirectDiffuse"),indirectSpecular:Tn().toVar("indirectSpecular")};return{radiance:Tn().toVar("radiance"),irradiance:Tn().toVar("irradiance"),iblIrradiance:Tn().toVar("iblIrradiance"),ambientOcclusion:hn(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 mp=en(gp);class fp extends hp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const yp=new t;class bp extends Cl{static get type(){return"ViewportTextureNode"}constructor(e=$l,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Qs.FRAME,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(yp):yp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===yp.width&&s.image.height===yp.height||(s.image.width=yp.width,s.image.height=yp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const xp=en(bp).setParameterLength(0,3),Tp=en(bp,null,null,{generateMipmaps:!0}).setParameterLength(0,3);let _p=null;class vp extends bp{static get type(){return"ViewportDepthTextureNode"}constructor(e=$l,t=null){null===_p&&(_p=new Y),super(e,t,_p)}getTextureForReference(){return _p}}const Np=en(vp).setParameterLength(0,2);class Sp extends ai{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===Sp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Sp.DEPTH_BASE)null!==r&&(s=Cp().assign(r));else if(t===Sp.DEPTH)s=e.isPerspectiveCamera?Ap(Ld.z,Zl,Jl):Rp(Ld.z,Zl,Jl);else if(t===Sp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Ep(r,Zl,Jl);s=Rp(e,Zl,Jl)}else s=r;else s=Rp(Ld.z,Zl,Jl);return s}}Sp.DEPTH_BASE="depthBase",Sp.DEPTH="depth",Sp.LINEAR_DEPTH="linearDepth";const Rp=(e,t,r)=>e.add(t).div(t.sub(r)),Ap=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Ep=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),wp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=mo(e.negate().div(t)),i=mo(r.div(t));return s.div(i)},Cp=en(Sp,Sp.DEPTH_BASE),Mp=tn(Sp,Sp.DEPTH),Bp=en(Sp,Sp.LINEAR_DEPTH).setParameterLength(0,1),Pp=Bp(Np());Mp.assign=e=>Cp(e);class Lp extends ai{static get type(){return"ClippingNode"}constructor(e=Lp.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===Lp.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Lp.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return an(()=>{const r=hn().toVar("distanceToPlane"),s=hn().toVar("distanceToGradient"),i=hn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Il(t).setGroup(fa);np(n,({i:t})=>{const n=e.element(t);r.assign(Ld.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(ou(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Il(e).setGroup(fa),n=hn(1).toVar("intersectionClipOpacity");np(a,({i:e})=>{const i=t.element(e);r.assign(Ld.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(ou(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}Un.a.mulAssign(i),Un.a.equal(0).discard()})()}setupDefault(e,t){return an(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Il(t).setGroup(fa);np(r,({i:t})=>{const r=e.element(t);Ld.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Il(e).setGroup(fa),r=mn(!0).toVar("clipped");np(s,({i:e})=>{const s=t.element(e);r.assign(Ld.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),an(()=>{const s=Il(e).setGroup(fa),i=Ol(t.getClipDistance());np(r,({i:e})=>{const t=s.element(e),r=Ld.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Lp.ALPHA_TO_COVERAGE="alphaToCoverage",Lp.DEFAULT="default",Lp.HARDWARE="hardware";const Fp=an(([e])=>_o(Ma(1e4,vo(Ma(17,e.x).add(Ma(.1,e.y)))).mul(wa(.1,wo(vo(Ma(13,e.y).add(e.x))))))),Dp=an(([e])=>Fp(fn(Fp(e.xy),e.z))),Up=an(([e])=>{const t=$o(Mo(Lo(e.xyz)),Mo(Fo(e.xyz))),r=hn(1).div(hn(.05).mul(t)).toVar("pixScale"),s=fn(po(bo(mo(r))),po(xo(mo(r)))),i=fn(Dp(bo(s.x.mul(e.xyz))),Dp(bo(s.y.mul(e.xyz)))),n=_o(mo(r)),a=wa(Ma(n.oneMinus(),i.x),Ma(n,i.y)),o=zo(n,n.oneMinus()),u=Tn(a.mul(a).div(Ma(2,o).mul(Ca(1,o))),a.sub(Ma(.5,o)).div(Ca(1,o)),Ca(1,Ca(1,a).mul(Ca(1,a)).div(Ma(2,o).mul(Ca(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return iu(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class Ip extends _l{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 Op=(e=0)=>new Ip(e),Vp=an(([e,t])=>zo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),kp=an(([e,t])=>zo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Gp=an(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),zp=an(([e,t])=>su(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),Wo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),$p=an(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return Sn(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"}]}),Wp=an(([e])=>Sn(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Hp=an(([e])=>(ln(e.a.equal(0),()=>Sn(0)),Sn(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class jp extends Q{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.maskNode=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,this.contextNode=null,Object.defineProperty(this,"shadowPositionNode",{get:()=>this.receivedShadowPositionNode,set:e=>{d('NodeMaterial: ".shadowPositionNode" was renamed to ".receivedShadowPositionNode".'),this.receivedShadowPositionNode=e}})}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Fs(t.slice(0,-4)),r.getCacheKey());return this.type+Ds(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Mu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=Mu(this.setupVertex(e),"VERTEX"),i=this.vertexNode||s;let n;e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=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!==a&&e.stack.addToStack(a);const i=Sn(s,Un.a).max(0);n=this.setupOutput(e,i),ra.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ra.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=Sn(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,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.currentSamples;this.alphaToCoverage&&t>1?s=new Lp(Lp.ALPHA_TO_COVERAGE):e.stack.addToStack(new Lp)}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.addToStack(new Lp(Lp.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?wp(Ld.z,Zl,Jl):Rp(Ld.z,Zl,Jl))}null!==s&&Mp.assign(s).toStack()}setupPositionView(){return Sd.mul(Cd).xyz}setupModelViewProjection(){return ed.mul(Ld)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.vertex=e.removeStack(),Ih}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&cp(t).toStack(),!0===t.isSkinnedMesh&&sp(t).toStack(),this.displacementMap){const e=fc("displacementMap","texture"),t=fc("displacementScale","float"),r=fc("displacementBias","float");Cd.addAssign(kd.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&ep(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&Zh(t).toStack(),null!==this.positionNode&&Cd.assign(Mu(this.positionNode,"POSITION","vec3")),Cd}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&mn(this.maskNode).not().discard();let s=this.colorNode?Sn(this.colorNode):eh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul(Op())),t.instanceColor){s=Dn("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=Dn("vec3","vBatchColor").mul(s)}Un.assign(s);const i=this.opacityNode?hn(this.opacityNode):sh;Un.a.assign(Un.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?hn(this.alphaTestNode):Jc,!0===this.alphaToCoverage?(Un.a=ou(n,n.add(Oo(Un.a)),Un.a),Un.a.lessThanEqual(0).discard()):Un.a.lessThanEqual(n).discard()),!0===this.alphaHash&&Un.a.lessThan(Up(Cd)).discard(),e.isOpaque()&&Un.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?Tn(0):Un.rgb}setupNormal(){return this.normalNode?Tn(this.normalNode):ch}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?fc("envMap","cubeTexture"):fc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new fp(Fh)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Dh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new pp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}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=mp(n,t,r,s)}else null!==r&&(a=Tn(null!==s?su(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(On.assign(Tn(i||rh)),a=a.add(On)),a}setupFog(e,t){const r=e.fogNode;return r&&(ra.assign(t),t=Sn(r.toVar())),t}setupPremultipliedAlpha(e,t){return Wp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(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=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,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.maskNode=e.maskNode,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,this.contextNode=e.contextNode,super.copy(e)}}const qp=new Z;class Xp extends jp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(qp),this.setValues(e)}}const Kp=new J;class Yp extends jp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(Kp),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?hn(this.offsetNode):Bh,t=this.dashScaleNode?hn(this.dashScaleNode):Eh,r=this.dashSizeNode?hn(this.dashSizeNode):wh,s=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(r),ia.assign(s);const i=Pu(vl("lineDistance").mul(t));(e?i.add(e):i).mod(sa.add(ia)).greaterThan(sa).discard()}}let Qp=null;class Zp extends bp{static get type(){return"ViewportSharedTextureNode"}constructor(e=$l,t=null){null===Qp&&(Qp=new X),super(e,t,Qp)}getTextureForReference(){return Qp}updateReference(){return this}}const Jp=en(Zp).setParameterLength(0,2),eg=new J;class tg extends jp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(eg),this.useColor=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,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=an(({start:e,end:t})=>{const r=ed.element(2).element(2),s=ed.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return Sn(su(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=an(()=>{const e=vl("instanceStart"),t=vl("instanceEnd"),r=Sn(Sd.mul(Sn(e,1))).toVar("start"),s=Sn(Sd.mul(Sn(t,1))).toVar("end");if(i){const e=this.dashScaleNode?hn(this.dashScaleNode):Eh,t=this.offsetNode?hn(this.offsetNode):Bh,r=vl("instanceDistanceStart"),s=vl("instanceDistanceEnd");let i=wd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),Dn("float","lineDistance").assign(i)}n&&(Dn("vec3","worldStart").assign(r.xyz),Dn("vec3","worldEnd").assign(s.xyz));const o=jl.z.div(jl.w),u=ed.element(2).element(3).equal(-1);ln(u,()=>{ln(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=ed.mul(r),d=ed.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=Sn().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=su(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=Dn("vec4","worldPos");o.assign(wd.y.lessThan(.5).select(r,s));const u=Mh.mul(.5);o.addAssign(Sn(wd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(Sn(wd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(Sn(a.mul(u),0)),ln(wd.y.greaterThan(1).or(wd.y.lessThan(0)),()=>{o.subAssign(Sn(a.mul(2).mul(u),0))})),g.assign(ed.mul(o));const l=Tn().toVar();l.assign(wd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=fn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(wd.x.lessThan(0).select(e.negate(),e)),ln(wd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(wd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Mh)),e.assign(e.div(jl.w.div(zl))),g.assign(wd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(Sn(e,0,0)))}return g})();const o=an(({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 fn(h,p)});if(this.colorNode=an(()=>{const e=Nl();if(i){const t=this.dashSizeNode?hn(this.dashSizeNode):wh,r=this.gapSizeNode?hn(this.gapSizeNode):Ch;sa.assign(t),ia.assign(r);const s=Dn("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(sa.add(ia)).greaterThan(sa).discard()}const a=hn(1).toVar("alpha");if(n){const e=Dn("vec3","worldStart"),s=Dn("vec3","worldEnd"),n=Dn("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:Tn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Mh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(ou(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){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=hn(s.fwidth()).toVar("dlen");ln(e.y.abs().greaterThan(1),()=>{a.assign(ou(i.oneMinus(),i.add(1),s).oneMinus())})}else ln(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=vl("instanceColorStart"),t=vl("instanceColorEnd");u=wd.y.lessThan(.5).select(e,t).mul(eh)}else u=eh;return Sn(u,a)})(),this.transparent){const e=this.opacityNode?hn(this.opacityNode):sh;this.outputNode=Sn(this.colorNode.rgb.mul(e).add(Jp().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 rg=new te;class sg extends jp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(rg),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?hn(this.opacityNode):sh;Un.assign(Vu(Sn($c(Wd),e),re))}}const ig=an(([e=Pd])=>{const 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 fn(t,r)});class ng extends se{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 ie(5,5,5),n=ig(Pd),a=new jp;a.colorNode=Bl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(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 ag=new WeakMap;class og extends li{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=dc(null);const t=new L;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Qs.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===le||r===de){if(ag.has(e)){const t=ag.get(e);lg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new ng(r.height);s.fromEquirectangularTexture(t,e),lg(s.texture,e.mapping),this._cubeTexture=s.texture,ag.set(e,s.texture),e.addEventListener("dispose",ug)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function ug(e){const t=e.target;t.removeEventListener("dispose",ug);const r=ag.get(t);void 0!==r&&(ag.delete(t),r.dispose())}function lg(e,t){t===le?e.mapping=F:t===de&&(e.mapping=D)}const dg=en(og).setParameterLength(1);class cg extends hp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=dg(this.envNode)}}class hg extends hp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=hn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class pg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class gg extends pg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(Sn(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(Sn(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(Un.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(su(s.rgb,s.rgb.mul(i.rgb),oh.mul(uh)));break;case he:s.rgb.assign(su(s.rgb,i.rgb,oh.mul(uh)));break;case ce:s.rgb.addAssign(i.rgb.mul(oh.mul(uh)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const mg=new ge;class fg extends jp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(mg),this.setValues(e)}setupNormal(){return Od(zd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new hg(Fh)),t}setupOutgoingLight(){return Un.rgb}setupLightingModel(){return new gg}}const yg=an(({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))}),bg=an(e=>e.diffuseColor.mul(1/Math.PI)),xg=an(({dotNH:e})=>ta.mul(hn(.5)).add(1).mul(hn(1/Math.PI)).mul(e.pow(ta))),Tg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(t).clamp(),s=Fd.dot(t).clamp(),i=yg({f0:Zn,f90:1,dotVH:s}),n=hn(.25),a=xg({dotNH:r});return i.mul(n).mul(a)});class _g extends gg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(bg({diffuseColor:Un.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(Tg({lightDirection:e})).mul(oh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const vg=new me;class Ng extends jp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(vg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g(!1)}}const Sg=new fe;class Rg extends jp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new cg(t):null}setupLightingModel(){return new _g}setupVariants(){const e=(this.shininessNode?hn(this.shininessNode):th).max(1e-4);ta.assign(e);const t=this.specularNode||ih;Zn.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const Ag=an(e=>{if(!1===e.geometry.hasAttribute("normal"))return hn(0);const t=zd.dFdx().abs().max(zd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Eg=an(e=>{const{roughness:t}=e,r=Ag();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),wg=an(({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 Ba(.5,i.add(n).max(to))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Cg=an(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(Tn(e.mul(r),t.mul(s),a).length()),l=a.mul(Tn(e.mul(i),t.mul(n),o).length());return Ba(.5,u.add(l))}).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"}]}),Mg=an(({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"}]}),Bg=hn(1/Math.PI),Pg=an(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=Tn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Bg.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"}]}),Lg=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=Wd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Fd).normalize(),d=n.dot(e).clamp(),c=n.dot(Fd).clamp(),h=n.dot(l).clamp(),p=Fd.dot(l).clamp();let g,m,f=yg({f0:t,f90:r,dotVH:p});if(qi(a)&&(f=Hn.mix(f,i)),qi(o)){const t=Yn.dot(e),r=Yn.dot(Fd),s=Yn.dot(l),i=Qn.dot(e),n=Qn.dot(Fd),a=Qn.dot(l);g=Cg({alphaT:Xn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Xn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=wg({alpha:u,dotNL:d,dotNV:c}),m=Mg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Fg=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Dg=null;const Ug=an(({roughness:e,dotNV:t})=>{null===Dg&&(Dg=new ye(Fg,16,16,G,be),Dg.name="DFG_LUT",Dg.minFilter=oe,Dg.magFilter=oe,Dg.wrapS=xe,Dg.wrapT=xe,Dg.generateMipmaps=!1,Dg.needsUpdate=!0);const r=fn(e,t);return Bl(Dg,r).rg}),Ig=an(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Lg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=Wd.dot(e).clamp(),l=Wd.dot(Fd).clamp(),d=Ug({roughness:s,dotNV:l}),c=Ug({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=hn(1).sub(g),y=hn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(hn(1).sub(f.mul(y).mul(b).mul(b)).add(to)),T=f.mul(y),_=x.mul(T);return o.add(_)}),Og=an(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Ug({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Vg=an(({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(Tn(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"}]}),kg=an(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=hn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return hn(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"}]}),Gg=an(({dotNV:e,dotNL:t})=>hn(1).div(hn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),zg=an(({lightDirection:e})=>{const t=e.add(Fd).normalize(),r=Wd.dot(e).clamp(),s=Wd.dot(Fd).clamp(),i=Wd.dot(t).clamp(),n=kg({roughness:Wn,dotNH:i}),a=Gg({dotNV:s,dotNL:r});return $n.mul(n).mul(a)}),$g=an(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=fn(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"}]}),Wg=an(({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"}]}),Hg=an(({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"}]}),jg=an(({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=Tn().toVar();return ln(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(Cn(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=Tn(0).toVar();f.addAssign(Hg({v1:h,v2:p})),f.addAssign(Hg({v1:p,v2:g})),f.addAssign(Hg({v1:g,v2:m})),f.addAssign(Hg({v1:m,v2:h})),c.assign(Tn(Wg({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"}]}),qg=an(({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=Tn().toVar();return ln(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=Tn(0).toVar();d.addAssign(Hg({v1:n,v2:a})),d.addAssign(Hg({v1:a,v2:o})),d.addAssign(Hg({v1:o,v2:l})),d.addAssign(Hg({v1:l,v2:n})),u.assign(Tn(Wg({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"}]}),Xg=1/6,Kg=e=>Ma(Xg,Ma(e,Ma(e,e.negate().add(3)).sub(3)).add(1)),Yg=e=>Ma(Xg,Ma(e,Ma(e,Ma(3,e).sub(6))).add(4)),Qg=e=>Ma(Xg,Ma(e,Ma(e,Ma(-3,e).add(3)).add(3)).add(1)),Zg=e=>Ma(Xg,Yo(e,3)),Jg=e=>Kg(e).add(Yg(e)),em=e=>Qg(e).add(Zg(e)),tm=e=>wa(-1,Yg(e).div(Kg(e).add(Yg(e)))),rm=e=>wa(1,Zg(e).div(Qg(e).add(Zg(e)))),sm=(e,t,r)=>{const s=e.uvNode,i=Ma(s,t.zw).add(.5),n=bo(i),a=_o(i),o=Jg(a.x),u=em(a.x),l=tm(a.x),d=rm(a.x),c=tm(a.y),h=rm(a.y),p=fn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=fn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=fn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=fn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=Jg(a.y).mul(wa(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=em(a.y).mul(wa(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},im=an(([e,t])=>{const r=fn(e.size(pn(t))),s=fn(e.size(pn(t.add(1)))),i=Ba(1,r),n=Ba(1,s),a=sm(e,Sn(i,r),bo(t)),o=sm(e,Sn(n,s),xo(t));return _o(t).mix(a,o)}),nm=an(([e,t])=>{const r=t.mul(El(e));return im(e,r)}),am=an(([e,t,r,s,i])=>{const n=Tn(au(t.negate(),To(e),Ba(1,s))),a=Tn(Mo(i[0].xyz),Mo(i[1].xyz),Mo(i[2].xyz));return To(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"}]}),om=an(([e,t])=>e.mul(iu(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),um=Tp(),lm=Tp(),dm=an(([e,t,r],{material:s})=>{const i=(s.side===M?um:lm).sample(e),n=mo(Wl.x).mul(om(t,r));return im(i,n)}),cm=an(([e,t,r])=>(ln(r.notEqual(0),()=>{const s=go(t).negate().div(r);return ho(s.negate().mul(e))}),Tn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),hm=an(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=Sn().toVar(),f=Tn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=Tn(d.sub(i),d,d.add(i));np({start:0,end:3},({i:i})=>{const d=n.element(i),g=am(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(Sn(y,1))),x=fn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(fn(x.x,x.y.oneMinus()));const T=dm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(cm(Mo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=am(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(Sn(n,1))),y=fn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(fn(y.x,y.y.oneMinus())),m=dm(y,r,d),f=s.mul(cm(Mo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=Tn(Og({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return Sn(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),pm=Cn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),gm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),mm=an(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=su(e,t,ou(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();ln(a.lessThan(0),()=>Tn(1));const o=a.sqrt(),u=gm(n,e),l=yg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=hn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return Tn(1).add(t).div(Tn(1).sub(t))})(i.clamp(0,.9999)),g=gm(p,n.toVec3()),m=yg({f0:g,f90:1,dotVH:o}),f=Tn(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),b=Tn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(Tn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return np({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=Tn(54856e-17,44201e-17,52481e-17),i=Tn(1681e3,1795300,2208400),n=Tn(43278e5,93046e5,66121e5),a=hn(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=Tn(o.x.add(a),o.y,o.z).div(1.0685e-7),pm.mul(o)})(hn(e).mul(y),hn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(Tn(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"}]}),fm=an(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=hn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=hn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),ym=Tn(.04),bm=hn(1);class xm extends pg{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,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=Tn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=Tn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=Tn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=Tn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=Tn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=Wd.dot(Fd).clamp(),t=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Zn}),r=mm({outsideIOR:hn(1),eta2:jn,cosTheta1:e,thinFilmThickness:qn,baseF0:Un.rgb});this.iridescenceFresnel=su(t,r,kn),this.iridescenceF0Dielectric=Vg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Vg({f:r,f90:1,dotVH:e}),this.iridescenceF0=su(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,kn)}if(!0===this.transmission){const t=Bd,r=nd.sub(Bd).normalize(),s=Hd,i=e.context;i.backdrop=hm(s,r,Vn,In,Jn,ea,t,yd,rd,ed,aa,ua,da,la,this.dispersion?ca:null),i.backdropAlpha=oa,Un.a.mulAssign(su(1,i.backdrop.a,oa))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=Wd.dot(Fd).clamp(),a=Ug({roughness:Vn,dotNV:n}),o=i?Hn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=Wd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(zg({lightDirection:e})));const t=fm({normal:Wd,viewDir:Fd,roughness:Wn}),r=fm({normal:Wd,viewDir:e,roughness:Wn}),i=$n.r.max($n.g).max($n.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=jd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Lg({lightDirection:e,f0:ym,f90:bm,roughness:zn,normalView:jd})))}r.directDiffuse.addAssign(s.mul(bg({diffuseColor:In}))),r.directSpecular.addAssign(s.mul(Ig({lightDirection:e,f0:Jn,f90:1,roughness:Vn,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=Wd,h=Fd,p=Ld.toVar(),g=$g({N:c,V:h,roughness:Vn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Cn(Tn(m.x,0,m.y),Tn(0,1,0),Tn(m.z,0,m.w)).toVar(),b=Jn.mul(f.x).add(Jn.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(jg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(In).mul(jg({N:c,V:h,P:p,mInv:Cn(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,s=t.mul(bg({diffuseColor:In})).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul($n,fm({normal:Wd,viewDir:Fd,roughness:Wn}))),!0===this.clearcoat){const e=jd.dot(Fd).clamp(),t=Og({dotNV:e,specularColor:ym,specularF90:bm,roughness:zn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=Tn().toVar("singleScatteringDielectric"),n=Tn().toVar("multiScatteringDielectric"),a=Tn().toVar("singleScatteringMetallic"),o=Tn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ea,Zn,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ea,Un.rgb,this.iridescenceF0Metallic);const u=su(i,a,kn),l=su(n,o,kn),d=i.add(n),c=In.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=fm({normal:Wd,viewDir:Fd,roughness:Wn}),t=$n.r.max($n.g).max($n.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=Wd.dot(Fd).clamp().add(t),i=Vn.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=jd.dot(Fd).clamp(),r=yg({dotVH:e,f0:ym,f90:bm}),s=t.mul(Gn.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul(Gn));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const Tm=hn(1),_m=hn(-2),vm=hn(.8),Nm=hn(-1),Sm=hn(.4),Rm=hn(2),Am=hn(.305),Em=hn(3),wm=hn(.21),Cm=hn(4),Mm=hn(4),Bm=hn(16),Pm=an(([e])=>{const t=Tn(wo(e)).toVar(),r=hn(-1).toVar();return ln(t.x.greaterThan(t.z),()=>{ln(t.x.greaterThan(t.y),()=>{r.assign(fu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}).Else(()=>{ln(t.z.greaterThan(t.y),()=>{r.assign(fu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(fu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Lm=an(([e,t])=>{const r=fn().toVar();return ln(t.equal(0),()=>{r.assign(fn(e.z,e.y).div(wo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(fn(e.x.negate(),e.z.negate()).div(wo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(fn(e.x.negate(),e.y).div(wo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(fn(e.z.negate(),e.y).div(wo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(fn(e.x.negate(),e.z).div(wo(e.y)))}).Else(()=>{r.assign(fn(e.x,e.y).div(wo(e.z)))}),Ma(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Fm=an(([e])=>{const t=hn(0).toVar();return ln(e.greaterThanEqual(vm),()=>{t.assign(Tm.sub(e).mul(Nm.sub(_m)).div(Tm.sub(vm)).add(_m))}).ElseIf(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Sm.sub(e).mul(Em.sub(Rm)).div(Sm.sub(Am)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Am.sub(e).mul(Cm.sub(Em)).div(Am.sub(wm)).add(Em))}).Else(()=>{t.assign(hn(-2).mul(mo(Ma(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Dm=an(([e,t])=>{const r=e.toVar();r.assign(Ma(2,r).sub(1));const s=Tn(r,1).toVar();return ln(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"}]}),Um=an(([e,t,r,s,i,n])=>{const a=hn(r),o=Tn(t),u=iu(Fm(a),_m,n),l=_o(u),d=bo(u),c=Tn(Im(e,o,d,s,i,n)).toVar();return ln(l.notEqual(0),()=>{const t=Tn(Im(e,o,d.add(1),s,i,n)).toVar();c.assign(su(c,t,l))}),c}),Im=an(([e,t,r,s,i,n])=>{const a=hn(r).toVar(),o=Tn(t),u=hn(Pm(o)).toVar(),l=hn($o(Mm.sub(a),0)).toVar();a.assign($o(a,Mm));const d=hn(po(a)).toVar(),c=fn(Lm(o,u).mul(d.sub(2)).add(1)).toVar();return ln(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(Ma(3,Bm))),c.y.addAssign(Ma(4,po(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(fn(),fn())}),Om=an(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=No(s),l=r.mul(u).add(i.cross(r).mul(vo(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Im(e,l,t,n,a,o)}),Vm=an(({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=Tn(fu(t,r,Ko(r,s))).toVar();ln(h.equal(Tn(0)),()=>{h.assign(Tn(s.z,0,s.x.negate()))}),h.assign(To(h));const p=Tn().toVar();return p.addAssign(i.element(0).mul(Om({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),np({start:pn(1),end:e},({i:e})=>{ln(e.greaterThanEqual(n),()=>{ap()});const t=hn(a.mul(hn(e))).toVar();p.addAssign(i.element(e).mul(Om({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(Om({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),Sn(p,1)}),km=an(([e])=>{const t=gn(e).toVar();return t.assign(t.shiftLeft(gn(16)).bitOr(t.shiftRight(gn(16)))),t.assign(t.bitAnd(gn(1431655765)).shiftLeft(gn(1)).bitOr(t.bitAnd(gn(2863311530)).shiftRight(gn(1)))),t.assign(t.bitAnd(gn(858993459)).shiftLeft(gn(2)).bitOr(t.bitAnd(gn(3435973836)).shiftRight(gn(2)))),t.assign(t.bitAnd(gn(252645135)).shiftLeft(gn(4)).bitOr(t.bitAnd(gn(4042322160)).shiftRight(gn(4)))),t.assign(t.bitAnd(gn(16711935)).shiftLeft(gn(8)).bitOr(t.bitAnd(gn(4278255360)).shiftRight(gn(8)))),hn(t).mul(2.3283064365386963e-10)}),Gm=an(([e,t])=>fn(hn(e).div(hn(t)),km(e))),zm=an(([e,t,r])=>{const s=Tn(t).toVar(),i=hn(r),n=i.mul(i).toVar(),a=To(Tn(n.mul(s.x),n.mul(s.y),s.z)).toVar(),o=a.x.mul(a.x).add(a.y.mul(a.y)),u=fu(o.greaterThan(0),Tn(a.y.negate(),a.x,0).div(fo(o)),Tn(1,0,0)).toVar(),l=Ko(a,u).toVar(),d=fo(e.x),c=Ma(2,3.14159265359).mul(e.y),h=d.mul(No(c)).toVar(),p=d.mul(vo(c)).toVar(),g=Ma(.5,a.z.add(1));p.assign(g.oneMinus().mul(fo(h.mul(h).oneMinus())).add(g.mul(p)));const m=u.mul(h).add(l.mul(p)).add(a.mul(fo($o(0,h.mul(h).add(p.mul(p)).oneMinus()))));return To(Tn(n.mul(m.x),n.mul(m.y),$o(0,m.z)))}),$m=an(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Tn(s).toVar(),l=Tn(0).toVar(),d=hn(0).toVar();return ln(e.lessThan(.001),()=>{l.assign(Im(r,u,t,n,a,o))}).Else(()=>{const s=fu(wo(u.z).lessThan(.999),Tn(0,0,1),Tn(1,0,0)),c=To(Ko(s,u)).toVar(),h=Ko(u,c).toVar();np({start:gn(0),end:i},({i:s})=>{const p=Gm(s,i),g=zm(p,Tn(0,0,1),e),m=To(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=To(m.mul(Xo(u,m).mul(2)).sub(u)),y=$o(Xo(u,f),0);ln(y.greaterThan(0),()=>{const e=Im(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),ln(d.greaterThan(0),()=>{l.assign(l.div(d))})}),Sn(l,1)}),Wm=[.125,.215,.35,.446,.526,.582],Hm=20,jm=new _e(-1,1,1,-1,0,1),qm=new ve(90,1),Xm=new e;let Km=null,Ym=0,Qm=0;const Zm=new r,Jm=new WeakMap,ef=[3,1,5,0,4,2],tf=Dm(Nl(),vl("faceIndex")).normalize(),rf=Tn(tf.x,tf.y,tf.z);class sf{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=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=Zm,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Km=this._renderer.getRenderTarget(),Ym=this._renderer.getActiveCubeFace(),Qm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),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 v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=uf(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=lf(),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===F||e.mapping===D?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._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=Wm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);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=ef[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Il(new Array(Hm).fill(0)),n=xa(new r(0,1,0)),a=xa(0),o=hn(Hm),u=xa(0),l=xa(1),d=Bl(),c=xa(0),h=hn(1/t),p=hn(1/s),g=hn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:rf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=of("blur");return f.fragmentNode=Vm({...m,latitudinal:u.equal(1)}),Jm.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Bl(),i=xa(0),n=xa(0),a=hn(1/t),o=hn(1/r),u=hn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=of("ggx");return d.fragmentNode=$m({...l,N_immutable:rf,GGX_SAMPLES:gn(512)}),Jm.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,jm)}_sceneToCubeUV(e,t,r,s,i){const n=qm;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(Xm),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Xm),h=!0),u.setRenderTarget(s),u.clear(),h&&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;af(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===F||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=uf(e)):null===this._equirectMaterial&&(this._equirectMaterial=lf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;af(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,jm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,af(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,jm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,af(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,jm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=Jm.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):Hm;f>Hm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,jm)}}function nf(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function af(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function of(e){const t=new jp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function uf(e){const t=of("cubemap");return t.fragmentNode=dc(e,rf),t}function lf(e){const t=of("equirect");return t.fragmentNode=Bl(e,ig(rf),0),t}const df=new WeakMap;function cf(e,t,r){const s=function(e){let t=df.get(e);void 0===t&&(t=new WeakMap,df.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 hf extends li{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 N;s.isRenderTargetTexture=!0,this._texture=Bl(s),this._width=xa(0),this._height=xa(0),this._maxMip=xa(0),this.updateBeforeType=Qs.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:cf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new sf(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=rc.mul(Tn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Um(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const pf=en(hf).setParameterLength(1,3),gf=new WeakMap;class mf extends hp{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=gf.get(e);void 0===s&&(s=pf(e),gf.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?zc:Wd,i=r.context(ff(Vn,s)).mul(tc),n=r.context(yf(Hd)).mul(Math.PI).mul(tc),a=il(i),o=il(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(ff(zn,jd)).mul(tc),t=il(e);u.addAssign(t)}}}const ff=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Fd.negate().reflect(t),r=Jo(e).mix(r,t).normalize(),r=r.transformDirection(rd)),r),getTextureLevel:()=>e}},yf=e=>({getUV:()=>e,getTextureLevel:()=>hn(1)}),bf=new we;class xf extends jp{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(bf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new mf(t):null}setupLightingModel(){return new xm}setupSpecular(){const e=su(Tn(.04),Un.rgb,kn);Zn.assign(Tn(.04)),Jn.assign(e),ea.assign(1)}setupVariants(){const e=this.metalnessNode?hn(this.metalnessNode):dh;kn.assign(e);let t=this.roughnessNode?hn(this.roughnessNode):lh;t=Eg({roughness:t}),Vn.assign(t),this.setupSpecular(),In.assign(Un.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const Tf=new Ce;class _f extends xf{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(Tf),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?hn(this.iorNode):Sh;aa.assign(e),Zn.assign(zo(Qo(aa.sub(1).div(aa.add(1))).mul(ah),Tn(1)).mul(nh)),Jn.assign(su(Zn,Un.rgb,kn)),ea.assign(su(nh,1,kn))}setupLightingModel(){return new xm(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?hn(this.clearcoatNode):hh,t=this.clearcoatRoughnessNode?hn(this.clearcoatRoughnessNode):ph;Gn.assign(e),zn.assign(Eg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?Tn(this.sheenNode):fh,t=this.sheenRoughnessNode?hn(this.sheenRoughnessNode):yh;$n.assign(e),Wn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?hn(this.iridescenceNode):xh,t=this.iridescenceIORNode?hn(this.iridescenceIORNode):Th,r=this.iridescenceThicknessNode?hn(this.iridescenceThicknessNode):_h;Hn.assign(e),jn.assign(t),qn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?fn(this.anisotropyNode):bh).toVar();Kn.assign(e.length()),ln(Kn.equal(0),()=>{e.assign(fn(1,0))}).Else(()=>{e.divAssign(fn(Kn)),Kn.assign(Kn.saturate())}),Xn.assign(Kn.pow2().mix(Vn.pow2(),1)),Yn.assign(kc[0].mul(e.x).add(kc[1].mul(e.y))),Qn.assign(kc[1].mul(e.x).sub(kc[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?hn(this.transmissionNode):vh,t=this.thicknessNode?hn(this.thicknessNode):Nh,r=this.attenuationDistanceNode?hn(this.attenuationDistanceNode):Rh,s=this.attenuationColorNode?Tn(this.attenuationColorNode):Ah;if(oa.assign(e),ua.assign(t),la.assign(r),da.assign(s),this.useDispersion){const e=this.dispersionNode?hn(this.dispersionNode):Lh;ca.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?Tn(this.clearcoatNormalNode):gh}setup(e){e.context.setupClearcoatNormal=()=>Mu(this.setupClearcoatNormal(e),"NORMAL","vec3"),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 vf extends xm{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(Wd.mul(a)).normalize(),h=hn(Fd.dot(c.negate()).saturate().pow(l).mul(d)),p=Tn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Nf extends _f{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=hn(.1),this.thicknessAmbientNode=hn(0),this.thicknessAttenuationNode=hn(.1),this.thicknessPowerNode=hn(2),this.thicknessScaleNode=hn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new vf(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 Sf=an(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=fn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=fc("gradientMap","texture").context({getUV:()=>i});return Tn(e.r)}{const e=i.fwidth().mul(.5);return su(Tn(.7),Tn(1),ou(hn(.7).sub(e.x),hn(.7).add(e.x),i.x))}});class Rf extends pg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Sf({normal:Vd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(bg({diffuseColor:Un.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(bg({diffuseColor:Un}))),s.indirectDiffuse.mulAssign(t)}}const Af=new Me;class Ef extends jp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Af),this.setValues(e)}setupLightingModel(){return new Rf}}const wf=an(()=>{const e=Tn(Fd.z,0,Fd.x.negate()).normalize(),t=Fd.cross(e);return fn(e.dot(Wd),t.dot(Wd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Cf=new Be;class Mf extends jp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Cf),this.setValues(e)}setupVariants(e){const t=wf;let r;r=e.material.matcap?fc("matcap","texture").context({getUV:()=>t}):Tn(su(.2,.8,t.y)),Un.rgb.mulAssign(r.rgb)}}class Bf extends li{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 wn(e,s,s.negate(),e).mul(r)}{const e=t,s=Mn(Sn(1,0,0,0),Sn(0,No(e.x),vo(e.x).negate(),0),Sn(0,vo(e.x),No(e.x),0),Sn(0,0,0,1)),i=Mn(Sn(No(e.y),0,vo(e.y),0),Sn(0,1,0,0),Sn(vo(e.y).negate(),0,No(e.y),0),Sn(0,0,0,1)),n=Mn(Sn(No(e.z),vo(e.z).negate(),0,0),Sn(vo(e.z),No(e.z),0,0),Sn(0,0,1,0),Sn(0,0,0,1));return s.mul(i).mul(n).mul(Sn(r,1)).xyz}}}const Pf=en(Bf).setParameterLength(2),Lf=new Pe;class Ff extends jp{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(Lf),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Sd.mul(Tn(s||0));let u=fn(yd[0].xyz.length(),yd[1].xyz.length());null!==n&&(u=u.mul(fn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=wd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new Gu(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=hn(i||mh),c=Pf(l,d);return Sn(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 Df=new Le,Uf=new t;class If extends Ff{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Sd.mul(Tn(e||Cd)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?fn(n):Ph;u=u.mul(zl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(Of.div(Ld.z.negate()))),i&&i.isNode&&(u=u.mul(fn(i)));let l=wd.xy;if(s&&s.isNode){const e=hn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(ql.div(2)),l=l.mul(o.w),o=o.add(Sn(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const Of=xa(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Uf);this.value=.5*t.y});class Vf extends pg{constructor(){super(),this.shadowNode=hn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){Un.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(Un.rgb)}}const kf=new Fe;class Gf extends jp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(kf),this.setValues(e)}setupLightingModel(){return new Vf}}const zf=Fn("vec3"),$f=Fn("vec3"),Wf=Fn("vec3");class Hf extends pg{constructor(){super()}start(e){const{material:t}=e,r=Fn("vec3"),s=Fn("vec3");ln(nd.sub(Bd).length().greaterThan(_d.mul(2)),()=>{r.assign(nd),s.assign(Bd)}).Else(()=>{r.assign(Bd),s.assign(nd)});const i=s.sub(r),n=xa("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=hn(0).toVar(),l=Tn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),np(n,()=>{const s=r.add(o.mul(u)),i=rd.mul(Sn(s,1)).xyz;let n;null!==t.depthNode&&($f.assign(Bp(Ap(i.z,Zl,Jl))),e.context.sceneDepthNode=Bp(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,zf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&zf.mulAssign(n);const d=zf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),Wf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?ln(r.greaterThanEqual($f),()=>{zf.addAssign(e)}):zf.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(qg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(Wf)}}class jf extends jp{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=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new Hf}}class qf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,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,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};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 Xf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}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)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.version),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,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||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Fs(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}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=Us(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Us(e,1)),e=Us(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Qf=[];class Zf{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);Qf[0]=e,Qf[1]=t,Qf[2]=n,Qf[3]=i;let l=u.get(Qf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Qf,l)):(l.camera=s,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)),Qf[0]=null,Qf[1]=null,Qf[2]=null,Qf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Xf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Yf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class Jf{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 ey=1,ty=2,ry=3,sy=4,iy=16;class ny extends Jf{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===ey?this.backend.createAttribute(e):t===ty?this.backend.createIndexAttribute(e):t===ry?this.backend.createStorageAttribute(e):t===sy&&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),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,ry):this.updateAttribute(e,ey);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,ty);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,sy)}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}getIndirectOffset(e){return e.geometry.indirectOffset}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=oy(t),e.set(t,r)):r.version!==ay(t)&&(this.attributes.delete(r),r=oy(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class ly{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):o("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 dy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class cy extends dy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class hy extends dy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let py=0;class gy{constructor(e,t,r,s=null,i=null){this.id=py++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class my extends Jf{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 gy(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 gy(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 gy(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 hy(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 cy(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 fy extends Jf{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))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(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.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;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(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?sy:ry;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function yy(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 by(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 xy(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class Ty{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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(xy(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||yy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||by),this.transparent.length>1&&this.transparent.sort(t||by)}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=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,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.isArrayTexture?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 e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("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);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Ey){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(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.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput?this.outputNode.build(e,...t):super.build(e,...t),on(r),e.removeActiveStack(this),o}}const Py=en(By).setParameterLength(0,1);class Ly extends ai{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"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(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=zs(i),a=$s(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}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.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Fy extends ai{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.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.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Dy extends ai{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;tnew ky(e,"uint","float"),$y={};class Wy extends eo{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(Gy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return gn;case"int":return pn;case"uvec2":return bn;case"uvec3":return vn;case"uvec4":return An;case"ivec2":return yn;case"ivec3":return _n;case"ivec4":return Rn}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t);const i=hn(s.bitAnd(Bo(s))),n=zy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{ln(e.equal(gn(0)),()=>gn(32));const s=gn(0),i=gn(0);return this._resolveElementType(e,s,t),ln(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),ln(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),ln(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),ln(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),ln(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return an(([e])=>{const s=gn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(gn(1)).bitAnd(gn(1431655765)))),s.assign(s.bitAnd(gn(858993459)).add(s.shiftRight(gn(2)).bitAnd(gn(858993459))));const i=s.add(s.shiftRight(gn(4))).bitAnd(gn(252645135)).mul(gn(16843009)).shiftRight(gn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return an(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Wy.COUNT_TRAILING_ZEROS="countTrailingZeros",Wy.COUNT_LEADING_ZEROS="countLeadingZeros",Wy.COUNT_ONE_BITS="countOneBits";const Hy=rn(Wy,Wy.COUNT_TRAILING_ZEROS).setParameterLength(1),jy=rn(Wy,Wy.COUNT_LEADING_ZEROS).setParameterLength(1),qy=rn(Wy,Wy.COUNT_ONE_BITS).setParameterLength(1),Xy=an(([e])=>{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)}),Ky=(e,t)=>Yo(Ma(4,e.mul(Ca(1,e))),t);class Yy extends li{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const Qy=rn(Yy,"snorm").setParameterLength(1),Zy=rn(Yy,"unorm").setParameterLength(1),Jy=rn(Yy,"float16").setParameterLength(1);class eb extends li{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const tb=rn(eb,"snorm").setParameterLength(1),rb=rn(eb,"unorm").setParameterLength(1),sb=rn(eb,"float16").setParameterLength(1),ib=an(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),nb=an(([e])=>Tn(ib(e.z.add(ib(e.y.mul(1)))),ib(e.z.add(ib(e.x.mul(1)))),ib(e.y.add(ib(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),ab=an(([e,t,r])=>{const s=Tn(e).toVar(),i=hn(1.4).toVar(),n=hn(0).toVar(),a=Tn(s).toVar();return np({start:hn(0),end:hn(3),type:"float",condition:"<="},()=>{const e=Tn(nb(a.mul(2))).toVar();s.addAssign(e.add(r.mul(hn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=hn(ib(s.z.add(ib(s.x.add(ib(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 ob extends ai{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;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._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const ub=en(ob),lb=e=>(...t)=>ub(e,...t),db=xa(0).setGroup(fa).onRenderUpdate(e=>e.time),cb=xa(0).setGroup(fa).onRenderUpdate(e=>e.deltaTime),hb=xa(0,"uint").setGroup(fa).onRenderUpdate(e=>e.frameId);const pb=an(([e,t,r=fn(.5)])=>Pf(e.sub(r),t).add(r)),gb=an(([e,t,r=fn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),mb=an(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=yd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=yd;const i=rd.mul(s);return qi(t)&&(i[0][0]=yd[0].length(),i[0][1]=0,i[0][2]=0),qi(r)&&(i[1][0]=0,i[1][1]=yd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,ed.mul(i).mul(Cd)}),fb=an(([e=null])=>{const t=Bp();return Bp(Np(e)).sub(t).lessThan(0).select($l,e)});class yb extends ai{static get type(){return"SpriteSheetUVNode"}constructor(e,t=Nl(),r=hn(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=fn(a,o);return t.add(l).mul(u)}}const bb=en(yb).setParameterLength(3),xb=an(([e,t=null,r=null,s=hn(1),i=Cd,n=kd])=>{let a=n.abs().normalize();a=a.div(a.dot(Tn(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=Bl(d,o).mul(a.x),g=Bl(c,u).mul(a.y),m=Bl(h,l).mul(a.z);return wa(p,g,m)}),Tb=new ze,_b=new r,vb=new r,Nb=new r,Sb=new a,Rb=new r(0,0,-1),Ab=new s,Eb=new r,wb=new r,Cb=new s,Mb=new t,Bb=new Ne,Pb=$l.flipX();Bb.depthTexture=new Y(1,1);let Lb=!1;class Fb extends Cl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Bb.texture,Pb),this._reflectorBaseNode=e.reflector||new Db(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=Yi(new Fb({defaultTexture:Bb.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.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Db extends ai{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new $e,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Qs.RENDER:Qs.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Mb),e.setSize(Math.round(Mb.width*r),Math.round(Mb.height*r))}setup(e){return this._updateResolution(Bb,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 Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=We,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Lb)return!1;Lb=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Mb),this._updateResolution(o,s),vb.setFromMatrixPosition(n.matrixWorld),Nb.setFromMatrixPosition(r.matrixWorld),Sb.extractRotation(n.matrixWorld),_b.set(0,0,1),_b.applyMatrix4(Sb),Eb.subVectors(vb,Nb);let u=!1;if(!0===Eb.dot(_b)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Lb=!1);u=!0}Eb.reflect(_b).negate(),Eb.add(vb),Sb.extractRotation(r.matrixWorld),Rb.set(0,0,-1),Rb.applyMatrix4(Sb),Rb.add(Nb),wb.subVectors(vb,Rb),wb.reflect(_b).negate(),wb.add(vb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Eb),a.up.set(0,1,0),a.up.applyMatrix4(Sb),a.up.reflect(_b),a.lookAt(wb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Tb.setFromNormalAndCoplanarPoint(_b,vb),Tb.applyMatrix4(a.matrixWorldInverse),Ab.set(Tb.normal.x,Tb.normal.y,Tb.normal.z,Tb.constant);const l=a.projectionMatrix;Cb.x=(Math.sign(Ab.x)+l.elements[8])/l.elements[0],Cb.y=(Math.sign(Ab.y)+l.elements[9])/l.elements[5],Cb.z=-1,Cb.w=(1+l.elements[10])/l.elements[14],Ab.multiplyScalar(1/Ab.dot(Cb));l.elements[2]=Ab.x,l.elements[6]=Ab.y,l.elements[10]=s.coordinateSystem===h?Ab.z-0:Ab.z+1-0,l.elements[14]=Ab.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Lb=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const Ub=new _e(-1,1,1,-1,0,1);class Ib extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new He([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new He(t,2))}}const Ob=new Ib;class Vb extends ne{constructor(e=null){super(Ob,e),this.camera=Ub,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,Ub)}render(e){e.render(this,Ub)}}const kb=new t;class Gb extends Cl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Nl()),this.isRTTNode=!0,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 Vb(new jp),this.updateBeforeType=Qs.RENDER}get autoResize(){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.autoResize){const t=e.getPixelRatio(),r=e.getSize(kb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Cl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const zb=(e,...t)=>Yi(new Gb(Yi(e),...t)),$b=an(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=fn(e.x,e.y.oneMinus()).mul(2).sub(1),i=Sn(Tn(e,t),1)):i=Sn(Tn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=Sn(r.mul(i));return n.xyz.div(n.w)}),Wb=an(([e,t])=>{const r=t.mul(Sn(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return fn(s.x,s.y.oneMinus())}),Hb=an(([e,t,r])=>{const s=Rl(Pl(t)),i=yn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(yn(2,0))).toVar(),o=Pl(t,i.sub(yn(1,0))).toVar(),u=Pl(t,i.add(yn(1,0))).toVar(),l=Pl(t,i.add(yn(2,0))).toVar(),d=Pl(t,i.add(yn(0,2))).toVar(),c=Pl(t,i.add(yn(0,1))).toVar(),h=Pl(t,i.sub(yn(0,1))).toVar(),p=Pl(t,i.sub(yn(0,2))).toVar(),g=wo(Ca(hn(2).mul(o).sub(a),n)).toVar(),m=wo(Ca(hn(2).mul(u).sub(l),n)).toVar(),f=wo(Ca(hn(2).mul(c).sub(d),n)).toVar(),y=wo(Ca(hn(2).mul(h).sub(p),n)).toVar(),b=$b(e,n,r).toVar(),x=g.lessThan(m).select(b.sub($b(e.sub(fn(hn(1).div(s.x),0)),o,r)),b.negate().add($b(e.add(fn(hn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub($b(e.add(fn(0,hn(1).div(s.y))),c,r)),b.negate().add($b(e.sub(fn(0,hn(1).div(s.y))),h,r)));return To(Ko(x,T))}),jb=an(([e])=>_o(hn(52.9829189).mul(_o(Xo(e,fn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),qb=an(([e,t,r])=>{const s=hn(2.399963229728653),i=fo(hn(e).add(.5).div(hn(t))),n=hn(e).mul(s).add(r);return fn(No(n),vo(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Xb extends ai{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Nl())}sample(e){return this.callback(e)}}class Kb extends ai{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Kb.OBJECT?this.updateType=Qs.OBJECT:e===Kb.MATERIAL?this.updateType=Qs.RENDER:e===Kb.BEFORE_OBJECT?this.updateBeforeType=Qs.OBJECT:e===Kb.BEFORE_MATERIAL&&(this.updateBeforeType=Qs.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Kb.OBJECT="object",Kb.MATERIAL="material",Kb.BEFORE_OBJECT="beforeObject",Kb.BEFORE_MATERIAL="beforeMaterial";const Yb=(e,t)=>new Kb(e,t).toStack();class Qb extends H{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class Zb extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class Jb extends ai{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ex=tn(Jb),tx=new P,rx=new a;class sx extends ai{static get type(){return"SceneNode"}constructor(e=sx.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===sx.BACKGROUND_BLURRINESS?s=pc("backgroundBlurriness","float",r):t===sx.BACKGROUND_INTENSITY?s=pc("backgroundIntensity","float",r):t===sx.BACKGROUND_ROTATION?s=xa("mat4").setName("backgroundRotation").setGroup(fa).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==je?(tx.copy(r.backgroundRotation),tx.x*=-1,tx.y*=-1,tx.z*=-1,rx.makeRotationFromEuler(tx)):rx.identity(),rx}):o("SceneNode: Unknown scope:",t),s}}sx.BACKGROUND_BLURRINESS="backgroundBlurriness",sx.BACKGROUND_INTENSITY="backgroundIntensity",sx.BACKGROUND_ROTATION="backgroundRotation";const ix=tn(sx,sx.BACKGROUND_BLURRINESS),nx=tn(sx,sx.BACKGROUND_INTENSITY),ax=tn(sx,sx.BACKGROUND_ROTATION);class ox extends Cl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=Js.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(Js.READ_WRITE)}toReadOnly(){return this.setAccess(Js.READ_ONLY)}toWriteOnly(){return this.setAccess(Js.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const ux=en(ox).setParameterLength(1,3),lx=an(({texture:e,uv:t})=>{const r=1e-4,s=Tn().toVar();return ln(t.x.lessThan(r),()=>{s.assign(Tn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(Tn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(Tn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(Tn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(Tn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(Tn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(Tn(-.01,0,0))).r.sub(e.sample(t.add(Tn(r,0,0))).r),n=e.sample(t.add(Tn(0,-.01,0))).r.sub(e.sample(t.add(Tn(0,r,0))).r),a=e.sample(t.add(Tn(0,0,-.01))).r.sub(e.sample(t.add(Tn(0,0,r))).r);s.assign(Tn(i,n,a))}),s.normalize()});class dx extends Cl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return Tn(.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(pn(Rl(this,this.levelNode).y).sub(t.y).sub(1))),t}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return lx({texture:this,uv:e})}}const cx=en(dx).setParameterLength(1,3);class hx extends hc{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 px=new WeakMap;class gx extends li{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Qs.OBJECT,this.updateAfterType=Qs.OBJECT,this.previousModelWorldMatrix=xa(new a),this.previousProjectionMatrix=xa(new a).setGroup(fa),this.previousCameraViewMatrix=xa(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=fx(r);this.previousModelWorldMatrix.value.copy(s);const i=mx(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}){fx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?ed:xa(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Sd).mul(Cd),s=this.previousProjectionMatrix.mul(t).mul(Md),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ca(i,n)}}function mx(e){let t=px.get(e);return void 0===t&&(t={},px.set(e,t)),t}function fx(e,t=0){const r=mx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const yx=tn(gx),bx=an(([e])=>vx(e.rgb)),xx=an(([e,t=hn(1)])=>t.mix(vx(e.rgb),e.rgb)),Tx=an(([e,t=hn(1)])=>{const r=wa(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 su(e.rgb,s,i)}),_x=an(([e,t=hn(1)])=>{const r=Tn(.57735,.57735,.57735),s=t.cos();return Tn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Xo(r,e.rgb).mul(s.oneMinus())))))}),vx=(e,t=Tn(p.getLuminanceCoefficients(new r)))=>Xo(e,t),Nx=an(([e,t=Tn(1),s=Tn(0),i=Tn(1),n=hn(1),a=Tn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(Tn(a)),u=$o(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return ln(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),ln(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),ln(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),Sn(u.rgb,e.a)});class Sx extends li{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 Rx=en(Sx).setParameterLength(2),Ax=new t;class Ex extends Cl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class wx extends Ex{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(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Cx extends li{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 Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=xa(0),this._cameraFar=xa(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Qs.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}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=new wx(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=new wx(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=Ep(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=Rp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Cx.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),Ax.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Ax)),this._pixelRatio=i,this.setSize(Ax.width,Ax.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;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);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:bu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Cx.COLOR="color",Cx.DEPTH="depth";class Mx extends Cx{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Cx.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}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 jp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=kd.negate(),r=ed.mul(Sd),s=hn(1),i=r.mul(Sn(Cd,1)),n=r.mul(Sn(Cd.add(t),1)),a=To(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=Sn(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 Bx=an(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Px=an(([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"}]}),Lx=an(([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"}]}),Fx=an(([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)}),Dx=an(([e,t])=>{const r=Cn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Cn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Fx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Ux=Cn(Tn(1.6605,-.1246,-.0182),Tn(-.5876,1.1329,-.1006),Tn(-.0728,-.0083,1.1187)),Ix=Cn(Tn(.6274,.0691,.0164),Tn(.3293,.9195,.088),Tn(.0433,.0113,.8956)),Ox=an(([e])=>{const t=Tn(e).toVar(),r=Tn(t.mul(t)).toVar(),s=Tn(r.mul(r)).toVar();return hn(15.5).mul(s.mul(r)).sub(Ma(40.14,s.mul(t))).add(Ma(31.96,s).sub(Ma(6.868,r.mul(t))).add(Ma(.4298,r).add(Ma(.1191,t).sub(.00232))))}),Vx=an(([e,t])=>{const r=Tn(e).toVar(),s=Cn(Tn(.856627153315983,.137318972929847,.11189821299995),Tn(.0951212405381588,.761241990602591,.0767994186031903),Tn(.0482516061458583,.101439036467562,.811302368396859)),i=Cn(Tn(1.1271005818144368,-.1413297634984383,-.14132976349843826),Tn(-.11060664309660323,1.157823702216272,-.11060664309660294),Tn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=hn(-12.47393),a=hn(4.026069);return r.mulAssign(t),r.assign(Ix.mul(r)),r.assign(s.mul(r)),r.assign($o(r,1e-10)),r.assign(mo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(iu(r,0,1)),r.assign(Ox(r)),r.assign(i.mul(r)),r.assign(Yo($o(Tn(0),r),Tn(2.2))),r.assign(Ux.mul(r)),r.assign(iu(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=an(([e,t])=>{const r=hn(.76),s=hn(.15);e=e.mul(t);const i=zo(e.r,zo(e.g,e.b)),n=fu(i.lessThan(.08),i.sub(Ma(6.25,i.mul(i))),.04);e.subAssign(n);const a=$o(e.r,$o(e.g,e.b));ln(a.lessThan(r),()=>e);const o=Ca(1,r),u=Ca(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ca(1,Ba(1,s.mul(a.sub(u)).add(1)));return su(e,Tn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Gx extends ai{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}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 zx=en(Gx).setParameterLength(1,3);class $x extends Gx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}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 Hx extends ai{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,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:hn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=qs(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Xs(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const jx=en(Hx).setParameterLength(1);class qx 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 Xx{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 Kx=new qx;class Yx extends ai{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new qx,this._output=jx(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]=jx(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]=jx(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 Xx(this),t=Kx.get("THREE"),r=Kx.get("TSL"),s=this.getMethod(),i=[e,this._local,Kx,()=>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:hn()}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=[Fs(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Ds(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 Qx=en(Yx).setParameterLength(1,2);function Zx(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ld.z).negate()}const Jx=an(([e,t],r)=>{const s=Zx(r);return ou(e,t,s)}),eT=an(([e],t)=>{const r=Zx(t);return e.mul(e,r,r).negate().exp().oneMinus()}),tT=an(([e,t])=>Sn(t.toFloat().mix(ra.rgb,e.toVec3()),ra.a));let rT=null,sT=null;class iT extends ai{static get type(){return"RangeNode"}constructor(e=hn(),t=hn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(Ws(t.value)),i=e.getTypeLength(Ws(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(Ws(a)),d=e.getTypeLength(Ws(o));rT=rT||new s,sT=sT||new s,rT.setScalar(0),sT.setScalar(0),1===u?rT.setScalar(a):a.isColor?rT.set(a.r,a.g,a.b,1):rT.set(a.x,a.y,a.z||0,a.w||0),1===d?sT.setScalar(o):o.isColor?sT.set(o.r,o.g,o.b,1):sT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew aT(e,t),uT=oT("numWorkgroups","uvec3"),lT=oT("workgroupId","uvec3"),dT=oT("globalId","uvec3"),cT=oT("localId","uvec3"),hT=oT("subgroupSize","uint");const pT=en(class extends ai{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 gT extends oi{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 mT extends ai{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new gT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class fT extends ai{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(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=hl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}fT.ATOMIC_LOAD="atomicLoad",fT.ATOMIC_STORE="atomicStore",fT.ATOMIC_ADD="atomicAdd",fT.ATOMIC_SUB="atomicSub",fT.ATOMIC_MAX="atomicMax",fT.ATOMIC_MIN="atomicMin",fT.ATOMIC_AND="atomicAnd",fT.ATOMIC_OR="atomicOr",fT.ATOMIC_XOR="atomicXor";const yT=en(fT),bT=(e,t,r)=>yT(e,t,r).toStack();class xT extends li{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===xT.SUBGROUP_ELECT?"bool":t===xT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===xT.SUBGROUP_BROADCAST||r===xT.SUBGROUP_SHUFFLE||r===xT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===xT.SUBGROUP_SHUFFLE_XOR||r===xT.SUBGROUP_SHUFFLE_DOWN||r===xT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}xT.SUBGROUP_ELECT="subgroupElect",xT.SUBGROUP_BALLOT="subgroupBallot",xT.SUBGROUP_ADD="subgroupAdd",xT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",xT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",xT.SUBGROUP_MUL="subgroupMul",xT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",xT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",xT.SUBGROUP_AND="subgroupAnd",xT.SUBGROUP_OR="subgroupOr",xT.SUBGROUP_XOR="subgroupXor",xT.SUBGROUP_MIN="subgroupMin",xT.SUBGROUP_MAX="subgroupMax",xT.SUBGROUP_ALL="subgroupAll",xT.SUBGROUP_ANY="subgroupAny",xT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",xT.QUAD_SWAP_X="quadSwapX",xT.QUAD_SWAP_Y="quadSwapY",xT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",xT.SUBGROUP_BROADCAST="subgroupBroadcast",xT.SUBGROUP_SHUFFLE="subgroupShuffle",xT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",xT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",xT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",xT.QUAD_BROADCAST="quadBroadcast";const TT=rn(xT,xT.SUBGROUP_ELECT).setParameterLength(0),_T=rn(xT,xT.SUBGROUP_BALLOT).setParameterLength(1),vT=rn(xT,xT.SUBGROUP_ADD).setParameterLength(1),NT=rn(xT,xT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),ST=rn(xT,xT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),RT=rn(xT,xT.SUBGROUP_MUL).setParameterLength(1),AT=rn(xT,xT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),ET=rn(xT,xT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),wT=rn(xT,xT.SUBGROUP_AND).setParameterLength(1),CT=rn(xT,xT.SUBGROUP_OR).setParameterLength(1),MT=rn(xT,xT.SUBGROUP_XOR).setParameterLength(1),BT=rn(xT,xT.SUBGROUP_MIN).setParameterLength(1),PT=rn(xT,xT.SUBGROUP_MAX).setParameterLength(1),LT=rn(xT,xT.SUBGROUP_ALL).setParameterLength(0),FT=rn(xT,xT.SUBGROUP_ANY).setParameterLength(0),DT=rn(xT,xT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),UT=rn(xT,xT.QUAD_SWAP_X).setParameterLength(1),IT=rn(xT,xT.QUAD_SWAP_Y).setParameterLength(1),OT=rn(xT,xT.QUAD_SWAP_DIAGONAL).setParameterLength(1),VT=rn(xT,xT.SUBGROUP_BROADCAST).setParameterLength(2),kT=rn(xT,xT.SUBGROUP_SHUFFLE).setParameterLength(2),GT=rn(xT,xT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),zT=rn(xT,xT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),$T=rn(xT,xT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),WT=rn(xT,xT.QUAD_BROADCAST).setParameterLength(1);let HT;function jT(e){HT=HT||new WeakMap;let t=HT.get(e);return void 0===t&&HT.set(e,t={}),t}function qT(e){const t=jT(e);return t.shadowMatrix||(t.shadowMatrix=xa("mat4").setGroup(fa).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function XT(e,t=Bd){const r=qT(e).mul(t);return r.xyz.div(r.w)}function KT(e){const t=jT(e);return t.position||(t.position=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function YT(e){const t=jT(e);return t.targetPosition||(t.targetPosition=xa(new r).setGroup(fa).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function QT(e){const t=jT(e);return t.viewPosition||(t.viewPosition=xa(new r).setGroup(fa).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const ZT=e=>rd.transformDirection(KT(e).sub(YT(e))),JT=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},e_=new WeakMap,t_=[];class r_ extends ai{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Fn("vec3","totalDiffuse"),this.totalSpecularNode=Fn("vec3","totalSpecular"),this.outgoingLightNode=Fn("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Yi(e));else{let s=null;if(null!==r&&(s=JT(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;e_.has(e)?s=e_.get(e):(s=new r(e),e_.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.getNodeProperties(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=Tn(null!==l?l.mix(g,u):u)),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 s_ extends ai{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Qs.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){i_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Bd)}}const i_=Fn("vec3","shadowPositionWorld");function n_(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 a_(e,t){return t=n_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function o_(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 u_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function l_(e,t){return t=u_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function d_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function c_(e,t,r){return r=l_(t,r=a_(e,r))}function h_(e,t,r){o_(e,r),d_(t,r)}var p_=Object.freeze({__proto__:null,resetRendererAndSceneState:c_,resetRendererState:a_,resetSceneState:l_,restoreRendererAndSceneState:h_,restoreRendererState:o_,restoreSceneState:d_,saveRendererAndSceneState:function(e,t,r={}){return r=u_(t,r=n_(e,r))},saveRendererState:n_,saveSceneState:u_});const g_=new WeakMap,m_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),f_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=pc("radius","float",r).setGroup(fa),o=fn(1).div(n),u=a.mul(o.x),l=jb(Hl.xy).mul(6.28318530718);return wa(i(t.xy.add(qb(0,5,l).mul(u)),t.z),i(t.xy.add(qb(1,5,l).mul(u)),t.z),i(t.xy.add(qb(2,5,l).mul(u)),t.z),i(t.xy.add(qb(3,5,l).mul(u)),t.z),i(t.xy.add(qb(4,5,l).mul(u)),t.z)).mul(.2)}),y_=an(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Bl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=pc("mapSize","vec2",r).setGroup(fa),a=fn(1).div(n),o=a.x,u=a.y,l=t.xy,d=_o(l.mul(n).add(.5));return l.subAssign(d.mul(a)),wa(i(l,t.z),i(l.add(fn(o,0)),t.z),i(l.add(fn(0,u)),t.z),i(l.add(a),t.z),su(i(l.add(fn(o.negate(),0)),t.z),i(l.add(fn(o.mul(2),0)),t.z),d.x),su(i(l.add(fn(o.negate(),u)),t.z),i(l.add(fn(o.mul(2),u)),t.z),d.x),su(i(l.add(fn(0,u.negate())),t.z),i(l.add(fn(0,u.mul(2))),t.z),d.y),su(i(l.add(fn(o,u.negate())),t.z),i(l.add(fn(o,u.mul(2))),t.z),d.y),su(su(i(l.add(fn(o.negate(),u.negate())),t.z),i(l.add(fn(o.mul(2),u.negate())),t.z),d.x),su(i(l.add(fn(o.negate(),u.mul(2))),t.z),i(l.add(fn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),b_=an(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Bl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=$o(1e-7,s.y.mul(s.y)),a=Wo(t.z,i);ln(a.equal(1),()=>hn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=iu(Ca(u,.3).div(.65)),$o(a,u)}),x_=an(([e,t,r])=>{let s=Bd.sub(e).length();return s=s.sub(t).div(r.sub(t)),s=s.saturate(),s}),T_=e=>{let t=g_.get(e);if(void 0===t){const r=e.isPointLight?(e=>{const t=e.shadow.camera,r=pc("near","float",t).setGroup(fa),s=pc("far","float",t).setGroup(fa),i=cd(e);return x_(i,r,s)})(e):null;t=new jp,t.colorNode=Sn(0,0,0,1),t.depthNode=r,t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.fog=!1,g_.set(e,t)}return t},__=e=>{const t=g_.get(e);void 0!==t&&(t.dispose(),g_.delete(e))},v_=new Xf,N_=[],S_=(e,t,r,s)=>{N_[0]=e,N_[1]=t;let i=v_.get(N_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===qe)&&(s&&(js(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,v_.set(N_,i)),N_[0]=null,N_[1]=null,i},R_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanVertical"),a=hn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),A_=an(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=hn(0).toVar("meanHorizontal"),a=hn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(hn(1)).select(hn(0),hn(2).div(e.sub(1))),u=e.lessThanEqual(hn(1)).select(hn(0),hn(-1));np({start:pn(0),end:pn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(hn(e).mul(o));let d=s.sample(wa(Hl.xy,fn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(wa(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=fo(a.sub(n.mul(n)).max(0));return fn(n,l)}),E_=[m_,f_,y_,b_];let w_;const C_=new Vb;class M_ extends s_{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._currentShadowType=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,hn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=pc("bias","float",r).setGroup(fa);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=pc("near","float",r.camera).setGroup(fa),s=pc("far","float",r.camera).setGroup(fa);n=wp(e.negate(),t,s)}return a=Tn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return E_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=E;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,camera:r}=e,{light:s,shadow:i}=this,n=t.shadowMap.type,{depthTexture:a,shadowMap:o}=this.setupRenderTarget(i,e);if(i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),n===qe&&!0!==i.isPointLightShadow){a.compareFunction=null,o.depth>1?(o._vsmShadowMapVertical||(o._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=o._vsmShadowMapVertical,o._vsmShadowMapHorizontal||(o._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:o.depth,depthBuffer:!1}),o._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=o._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Bl(a);a.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Bl(this.vsmShadowMapVertical.texture);a.isArrayTexture&&(r=r.depth(this.depthLayer));const s=pc("blurSamples","float",i).setGroup(fa),n=pc("radius","float",i).setGroup(fa),u=pc("mapSize","vec2",i).setGroup(fa);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new jp);l.fragmentNode=R_({samples:s,radius:n,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new jp),l.fragmentNode=A_({samples:s,radius:n,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=pc("intensity","float",i).setGroup(fa),l=pc("normalBias","float",i).setGroup(fa),d=qT(s).mul(i_.add(Hd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=n===qe&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:a,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:o.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m;o.texture.isCubeTexture?m=dc(o.texture,c.xyz):(m=Bl(o.texture,c),a.isArrayTexture&&(m=m.depth(this.depthLayer)));const f=su(1,g.rgb.mix(m,1),u.mul(m.a)).toVar();this.shadowMap=o,this.shadow.map=o;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture):Bl(this.shadowMap.texture)).toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?dc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Nl().mul(Rl(Bl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return an(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}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);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}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");w_=c_(i,n,w_),n.overrideMaterial=T_(r),i.setRenderObjectFunction(S_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===qe&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,h_(i,n,w_)}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),C_.material=this.vsmMaterialVertical,C_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),C_.material=this.vsmMaterialHorizontal,C_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,__(this.light),this.shadowMap&&(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)}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 B_=(e,t)=>new M_(e,t),P_=new e,L_=new a,F_=new r,D_=new r,U_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],I_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],O_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],V_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],k_=an(({depthTexture:e,bd3D:t,dp:r})=>dc(e,t).compare(r)),G_=an(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=pc("radius","float",s).setGroup(fa),n=pc("mapSize","vec2",s).setGroup(fa),a=i.div(n.x),o=wo(t),u=To(Ko(t,o.x.greaterThan(o.z).select(Tn(0,1,0),Tn(1,0,0)))),l=Ko(t,u),d=jb(Hl.xy).mul(6.28318530718),c=qb(0,5,d),h=qb(1,5,d),p=qb(2,5,d),g=qb(3,5,d),m=qb(4,5,d);return dc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(dc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(dc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),z_=an(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toVar(),n=i.length(),a=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.near),o=xa("float").setGroup(fa).onRenderUpdate(()=>s.camera.far),u=pc("bias","float",s).setGroup(fa),l=hn(1).toVar();return ln(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 d=i.normalize();l.assign(e({depthTexture:t,bd3D:d,dp:r,shadow:s}))}),l});class $_ extends M_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===Xe?k_:G_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return z_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new Ke(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=E;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?U_:O_,d=u?I_:V_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(P_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),F_.setFromMatrixPosition(s.matrixWorld),a.position.copy(F_),D_.copy(a.position),D_.add(l[e]),a.up.copy(d[e]),a.lookAt(D_),a.updateMatrixWorld(),o.makeTranslation(-F_.x,-F_.y,-F_.z),L_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(L_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const W_=(e,t)=>new $_(e,t);class H_ extends hp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||xa(this.color).setGroup(fa),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Qs.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return QT(this.light).sub(e.context.positionView||Ld)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return B_(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?Yi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),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 j_=an(({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)}),q_=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=j_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class X_ extends H_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(2).setGroup(fa)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return W_(this.light)}setupDirect(e){return q_({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const K_=an(([e=Nl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),Y_=an(([e=Nl()],{renderer:t,material:r})=>{const s=ru(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=hn(s.fwidth()).toVar();i=ou(e.oneMinus(),e.add(1),s).oneMinus()}else i=fu(s.greaterThan(1),0,1);return i}),Q_=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=mn(e).toVar();return fu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),Z_=an(([e,t])=>{const r=mn(t).toVar(),s=hn(e).toVar();return fu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),J_=an(([e])=>{const t=hn(e).toVar();return pn(bo(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ev=an(([e,t])=>{const r=hn(e).toVar();return t.assign(J_(r)),r.sub(hn(t))}),tv=lb([an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=hn(s).toVar(),l=hn(r).toVar(),d=hn(t).toVar(),c=hn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]}),an(([e,t,r,s,i,n])=>{const a=hn(n).toVar(),o=hn(i).toVar(),u=Tn(s).toVar(),l=Tn(r).toVar(),d=Tn(t).toVar(),c=Tn(e).toVar(),h=hn(Ca(1,o)).toVar();return Ca(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"}]})]),rv=lb([an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=hn(o).toVar(),m=hn(a).toVar(),f=hn(n).toVar(),y=hn(i).toVar(),b=hn(s).toVar(),x=hn(r).toVar(),T=hn(t).toVar(),_=hn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=hn(d).toVar(),h=hn(l).toVar(),p=hn(u).toVar(),g=Tn(o).toVar(),m=Tn(a).toVar(),f=Tn(n).toVar(),y=Tn(i).toVar(),b=Tn(s).toVar(),x=Tn(r).toVar(),T=Tn(t).toVar(),_=Tn(e).toVar(),v=hn(Ca(1,p)).toVar(),N=hn(Ca(1,h)).toVar();return hn(Ca(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),sv=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=gn(e).toVar(),a=gn(n.bitAnd(gn(7))).toVar(),o=hn(Q_(a.lessThan(gn(4)),i,s)).toVar(),u=hn(Ma(2,Q_(a.lessThan(gn(4)),s,i))).toVar();return Z_(o,mn(a.bitAnd(gn(1)))).add(Z_(u,mn(a.bitAnd(gn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),iv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=gn(e).toVar(),u=gn(o.bitAnd(gn(15))).toVar(),l=hn(Q_(u.lessThan(gn(8)),a,n)).toVar(),d=hn(Q_(u.lessThan(gn(4)),n,Q_(u.equal(gn(12)).or(u.equal(gn(14))),a,i))).toVar();return Z_(l,mn(u.bitAnd(gn(1)))).add(Z_(d,mn(u.bitAnd(gn(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"}]}),nv=lb([sv,iv]),av=an(([e,t,r])=>{const s=hn(r).toVar(),i=hn(t).toVar(),n=vn(e).toVar();return Tn(nv(n.x,i,s),nv(n.y,i,s),nv(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"}]}),ov=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=hn(t).toVar(),o=vn(e).toVar();return Tn(nv(o.x,a,n,i),nv(o.y,a,n,i),nv(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"}]}),uv=lb([av,ov]),lv=an(([e])=>{const t=hn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),dv=an(([e])=>{const t=hn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),cv=lb([lv,an(([e])=>{const t=Tn(e).toVar();return Ma(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),hv=lb([dv,an(([e])=>{const t=Tn(e).toVar();return Ma(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),pv=an(([e,t])=>{const r=pn(t).toVar(),s=gn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(pn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),gv=an(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(pv(r,pn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(pv(r,pn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(pv(e,pn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(pv(t,pn(4))),t.addAssign(e)}),mv=an(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=gn(e).toVar();return s.bitXorAssign(i),s.subAssign(pv(i,pn(14))),n.bitXorAssign(s),n.subAssign(pv(s,pn(11))),i.bitXorAssign(n),i.subAssign(pv(n,pn(25))),s.bitXorAssign(i),s.subAssign(pv(i,pn(16))),n.bitXorAssign(s),n.subAssign(pv(s,pn(4))),i.bitXorAssign(n),i.subAssign(pv(n,pn(14))),s.bitXorAssign(i),s.subAssign(pv(i,pn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),fv=an(([e])=>{const t=gn(e).toVar();return hn(t).div(hn(gn(pn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),yv=an(([e])=>{const t=hn(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"}]}),bv=lb([an(([e])=>{const t=pn(e).toVar(),r=gn(gn(1)).toVar(),s=gn(gn(pn(3735928559)).add(r.shiftLeft(gn(2))).add(gn(13))).toVar();return mv(s.add(gn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(gn(2)).toVar(),n=gn().toVar(),a=gn().toVar(),o=gn().toVar();return n.assign(a.assign(o.assign(gn(pn(3735928559)).add(i.shiftLeft(gn(2))).add(gn(13))))),n.addAssign(gn(s)),a.addAssign(gn(r)),mv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(gn(3)).toVar(),o=gn().toVar(),u=gn().toVar(),l=gn().toVar();return o.assign(u.assign(l.assign(gn(pn(3735928559)).add(a.shiftLeft(gn(2))).add(gn(13))))),o.addAssign(gn(n)),u.addAssign(gn(i)),l.addAssign(gn(s)),mv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),an(([e,t,r,s])=>{const i=pn(s).toVar(),n=pn(r).toVar(),a=pn(t).toVar(),o=pn(e).toVar(),u=gn(gn(4)).toVar(),l=gn().toVar(),d=gn().toVar(),c=gn().toVar();return l.assign(d.assign(c.assign(gn(pn(3735928559)).add(u.shiftLeft(gn(2))).add(gn(13))))),l.addAssign(gn(o)),d.addAssign(gn(a)),c.addAssign(gn(n)),gv(l,d,c),l.addAssign(gn(i)),mv(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"}]}),an(([e,t,r,s,i])=>{const n=pn(i).toVar(),a=pn(s).toVar(),o=pn(r).toVar(),u=pn(t).toVar(),l=pn(e).toVar(),d=gn(gn(5)).toVar(),c=gn().toVar(),h=gn().toVar(),p=gn().toVar();return c.assign(h.assign(p.assign(gn(pn(3735928559)).add(d.shiftLeft(gn(2))).add(gn(13))))),c.addAssign(gn(l)),h.addAssign(gn(u)),p.addAssign(gn(o)),gv(c,h,p),c.addAssign(gn(a)),h.addAssign(gn(n)),mv(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"}]})]),xv=lb([an(([e,t])=>{const r=pn(t).toVar(),s=pn(e).toVar(),i=gn(bv(s,r)).toVar(),n=vn().toVar();return n.x.assign(i.bitAnd(pn(255))),n.y.assign(i.shiftRight(pn(8)).bitAnd(pn(255))),n.z.assign(i.shiftRight(pn(16)).bitAnd(pn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),an(([e,t,r])=>{const s=pn(r).toVar(),i=pn(t).toVar(),n=pn(e).toVar(),a=gn(bv(n,i,s)).toVar(),o=vn().toVar();return o.x.assign(a.bitAnd(pn(255))),o.y.assign(a.shiftRight(pn(8)).bitAnd(pn(255))),o.z.assign(a.shiftRight(pn(16)).bitAnd(pn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Tv=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=hn(tv(nv(bv(r,s),i,n),nv(bv(r.add(pn(1)),s),i.sub(1),n),nv(bv(r,s.add(pn(1))),i,n.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=hn(rv(nv(bv(r,s,i),n,a,o),nv(bv(r.add(pn(1)),s,i),n.sub(1),a,o),nv(bv(r,s.add(pn(1)),i),n,a.sub(1),o),nv(bv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),nv(bv(r,s,i.add(pn(1))),n,a,o.sub(1)),nv(bv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),nv(bv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),nv(bv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),_v=lb([an(([e])=>{const t=fn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=hn(ev(t.x,r)).toVar(),n=hn(ev(t.y,s)).toVar(),a=hn(yv(i)).toVar(),o=hn(yv(n)).toVar(),u=Tn(tv(uv(xv(r,s),i,n),uv(xv(r.add(pn(1)),s),i.sub(1),n),uv(xv(r,s.add(pn(1))),i,n.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return cv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn().toVar(),s=pn().toVar(),i=pn().toVar(),n=hn(ev(t.x,r)).toVar(),a=hn(ev(t.y,s)).toVar(),o=hn(ev(t.z,i)).toVar(),u=hn(yv(n)).toVar(),l=hn(yv(a)).toVar(),d=hn(yv(o)).toVar(),c=Tn(rv(uv(xv(r,s,i),n,a,o),uv(xv(r.add(pn(1)),s,i),n.sub(1),a,o),uv(xv(r,s.add(pn(1)),i),n,a.sub(1),o),uv(xv(r.add(pn(1)),s.add(pn(1)),i),n.sub(1),a.sub(1),o),uv(xv(r,s,i.add(pn(1))),n,a,o.sub(1)),uv(xv(r.add(pn(1)),s,i.add(pn(1))),n.sub(1),a,o.sub(1)),uv(xv(r,s.add(pn(1)),i.add(pn(1))),n,a.sub(1),o.sub(1)),uv(xv(r.add(pn(1)),s.add(pn(1)),i.add(pn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return hv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),vv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return fv(bv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return fv(bv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return fv(bv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return fv(bv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Nv=lb([an(([e])=>{const t=hn(e).toVar(),r=pn(J_(t)).toVar();return Tn(fv(bv(r,pn(0))),fv(bv(r,pn(1))),fv(bv(r,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),an(([e])=>{const t=fn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar();return Tn(fv(bv(r,s,pn(0))),fv(bv(r,s,pn(1))),fv(bv(r,s,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),an(([e])=>{const t=Tn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar();return Tn(fv(bv(r,s,i,pn(0))),fv(bv(r,s,i,pn(1))),fv(bv(r,s,i,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),an(([e])=>{const t=Sn(e).toVar(),r=pn(J_(t.x)).toVar(),s=pn(J_(t.y)).toVar(),i=pn(J_(t.z)).toVar(),n=pn(J_(t.w)).toVar();return Tn(fv(bv(r,s,i,n,pn(0))),fv(bv(r,s,i,n,pn(1))),fv(bv(r,s,i,n,pn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Sv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=hn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(Tv(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"}]}),Rv=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(0).toVar(),l=hn(1).toVar();return np(a,()=>{u.addAssign(l.mul(_v(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"}]}),Av=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar();return fn(Sv(o,a,n,i),Sv(o.add(Tn(pn(19),pn(193),pn(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"}]}),Ev=an(([e,t,r,s])=>{const i=hn(s).toVar(),n=hn(r).toVar(),a=pn(t).toVar(),o=Tn(e).toVar(),u=Tn(Rv(o,a,n,i)).toVar(),l=hn(Sv(o.add(Tn(pn(19),pn(193),pn(17))),a,n,i)).toVar();return Sn(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"}]}),wv=lb([an(([e,t,r,s,i,n,a])=>{const o=pn(a).toVar(),u=hn(n).toVar(),l=pn(i).toVar(),d=pn(s).toVar(),c=pn(r).toVar(),h=pn(t).toVar(),p=fn(e).toVar(),g=Tn(Nv(fn(h.add(d),c.add(l)))).toVar(),m=fn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=fn(fn(hn(h),hn(c)).add(m)).toVar(),y=fn(f.sub(p)).toVar();return ln(o.equal(pn(2)),()=>wo(y.x).add(wo(y.y))),ln(o.equal(pn(3)),()=>$o(wo(y.x),wo(y.y))),Xo(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"}]}),an(([e,t,r,s,i,n,a,o,u])=>{const l=pn(u).toVar(),d=hn(o).toVar(),c=pn(a).toVar(),h=pn(n).toVar(),p=pn(i).toVar(),g=pn(s).toVar(),m=pn(r).toVar(),f=pn(t).toVar(),y=Tn(e).toVar(),b=Tn(Nv(Tn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=Tn(Tn(hn(f),hn(m),hn(g)).add(b)).toVar(),T=Tn(x.sub(y)).toVar();return ln(l.equal(pn(2)),()=>wo(T.x).add(wo(T.y)).add(wo(T.z))),ln(l.equal(pn(3)),()=>$o(wo(T.x),wo(T.y),wo(T.z))),Xo(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"}]})]),Cv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();l.assign(zo(l,r))})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Mv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Bv=an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=fn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=fn(ev(n.x,a),ev(n.y,o)).toVar(),l=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{const r=hn(wv(u,e,t,a,o,i,s)).toVar();ln(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)})})}),ln(s.equal(pn(0)),()=>{l.assign(fo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Pv=lb([Cv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=hn(1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(zo(d,n))})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Lv=lb([Mv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=fn(1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Fv=lb([Bv,an(([e,t,r])=>{const s=pn(r).toVar(),i=hn(t).toVar(),n=Tn(e).toVar(),a=pn().toVar(),o=pn().toVar(),u=pn().toVar(),l=Tn(ev(n.x,a),ev(n.y,o),ev(n.z,u)).toVar(),d=Tn(1e6,1e6,1e6).toVar();return np({start:-1,end:pn(1),name:"x",condition:"<="},({x:e})=>{np({start:-1,end:pn(1),name:"y",condition:"<="},({y:t})=>{np({start:-1,end:pn(1),name:"z",condition:"<="},({z:r})=>{const n=hn(wv(l,e,t,r,a,o,u,i,s)).toVar();ln(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)})})})}),ln(s.equal(pn(0)),()=>{d.assign(fo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Dv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=fn(t).toVar(),p=fn(r).toVar(),g=fn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(Tn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Uv=an(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=pn(e).toVar(),h=Tn(t).toVar(),p=Tn(r).toVar(),g=Tn(s).toVar(),m=hn(i).toVar(),f=hn(n).toVar(),y=hn(a).toVar(),b=mn(o).toVar(),x=pn(u).toVar(),T=hn(l).toVar(),_=hn(d).toVar(),v=h.mul(p).add(g),N=hn(0).toVar();return ln(c.equal(pn(0)),()=>{N.assign(_v(v))}),ln(c.equal(pn(1)),()=>{N.assign(Nv(v))}),ln(c.equal(pn(2)),()=>{N.assign(Fv(v,m,pn(0)))}),ln(c.equal(pn(3)),()=>{N.assign(Rv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),ln(b,()=>{N.assign(iu(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Iv=an(([e])=>{const t=e.y,r=e.z,s=Tn().toVar();return ln(t.lessThan(1e-4),()=>{s.assign(Tn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(bo(i)).mul(6).toVar();const n=pn(Io(i)),a=i.sub(hn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());ln(n.equal(pn(0)),()=>{s.assign(Tn(r,l,o))}).ElseIf(n.equal(pn(1)),()=>{s.assign(Tn(u,r,o))}).ElseIf(n.equal(pn(2)),()=>{s.assign(Tn(o,r,l))}).ElseIf(n.equal(pn(3)),()=>{s.assign(Tn(o,u,r))}).ElseIf(n.equal(pn(4)),()=>{s.assign(Tn(l,o,r))}).Else(()=>{s.assign(Tn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Ov=an(([e])=>{const t=Tn(e).toVar(),r=hn(t.x).toVar(),s=hn(t.y).toVar(),i=hn(t.z).toVar(),n=hn(zo(r,zo(s,i))).toVar(),a=hn($o(r,$o(s,i))).toVar(),o=hn(a.sub(n)).toVar(),u=hn().toVar(),l=hn().toVar(),d=hn().toVar();return d.assign(a),ln(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),ln(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{ln(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(wa(2,i.sub(r).div(o)))}).Else(()=>{u.assign(wa(4,r.sub(s).div(o)))}),u.mulAssign(1/6),ln(u.lessThan(0),()=>{u.addAssign(1)})}),Tn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),Vv=an(([e])=>{const t=Tn(e).toVar(),r=Nn(Ua(t,Tn(.04045))).toVar(),s=Tn(t.div(12.92)).toVar(),i=Tn(Yo($o(t.add(Tn(.055)),Tn(0)).div(1.055),Tn(2.4))).toVar();return su(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),kv=(e,t)=>{e=hn(e),t=hn(t);const r=fn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return ou(e.sub(r),e.add(r),t)},Gv=(e,t,r,s)=>su(e,t,r[s].clamp()),zv=(e,t,r,s,i)=>su(e,t,kv(r,s[i])),$v=an(([e,t,r])=>{const s=To(e).toVar(),i=Ca(hn(.5).mul(t.sub(r)),Bd).div(s).toVar(),n=Ca(hn(-.5).mul(t.sub(r)),Bd).div(s).toVar(),a=Tn().toVar();a.x=s.x.greaterThan(hn(0)).select(i.x,n.x),a.y=s.y.greaterThan(hn(0)).select(i.y,n.y),a.z=s.z.greaterThan(hn(0)).select(i.z,n.z);const o=zo(a.x,a.y,a.z).toVar();return Bd.add(s.mul(o)).toVar().sub(r)}),Wv=an(([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(Ma(r,r).sub(Ma(s,s)))),n});var Hv=Object.freeze({__proto__:null,BRDF_GGX:Lg,BRDF_Lambert:bg,BasicPointShadowFilter:k_,BasicShadowFilter:m_,Break:ap,Const:Eu,Continue:()=>hl("continue").toStack(),DFGLUT:Ug,D_GGX:Mg,Discard:pl,EPSILON:to,F_Schlick:yg,Fn:an,HALF_PI:ao,INFINITY:ro,If:ln,Loop:np,NodeAccess:Js,NodeShaderStage:Ys,NodeType:Zs,NodeUpdateType:Qs,OnBeforeMaterialUpdate:e=>Yb(Kb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>Yb(Kb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>Yb(Kb.MATERIAL,e),OnObjectUpdate:e=>Yb(Kb.OBJECT,e),PCFShadowFilter:f_,PCFSoftShadowFilter:y_,PI:so,PI2:io,PointShadowFilter:G_,Return:()=>hl("return").toStack(),Schlick_to_F0:Vg,ScriptableNodeResources:Kx,ShaderNode:Ki,Stack:dn,Switch:(...e)=>xi.Switch(...e),TBNViewMatrix:kc,TWO_PI:no,VSMShadowFilter:b_,V_GGX_SmithCorrelated:wg,Var:Au,VarIntent:wu,abs:wo,acesFilmicToneMapping:Dx,acos:Ao,add:wa,addMethodChaining:_i,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:Vx,all:oo,alphaT:Xn,and:Va,anisotropy:Kn,anisotropyB:Qn,anisotropyT:Yn,any:uo,append:e=>(d("TSL: append() has been renamed to Stack()."),dn(e)),array:_a,arrayBuffer:e=>new yi(e,"ArrayBuffer"),asin:Ro,assign:Na,atan:Eo,atomicAdd:(e,t)=>bT(fT.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>bT(fT.ATOMIC_AND,e,t),atomicFunc:bT,atomicLoad:e=>bT(fT.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>bT(fT.ATOMIC_MAX,e,t),atomicMin:(e,t)=>bT(fT.ATOMIC_MIN,e,t),atomicOr:(e,t)=>bT(fT.ATOMIC_OR,e,t),atomicStore:(e,t)=>bT(fT.ATOMIC_STORE,e,t),atomicSub:(e,t)=>bT(fT.ATOMIC_SUB,e,t),atomicXor:(e,t)=>bT(fT.ATOMIC_XOR,e,t),attenuationColor:da,attenuationDistance:la,attribute:vl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Zb(e,r,s);return Gh(i,t,e)},backgroundBlurriness:ix,backgroundIntensity:nx,backgroundRotation:ax,batch:ep,bentNormalView:zc,billboarding:mb,bitAnd:$a,bitNot:Wa,bitOr:Ha,bitXor:ja,bitangentGeometry:Uc,bitangentLocal:Ic,bitangentView:Oc,bitangentWorld:Vc,bitcast:Gy,blendBurn:Vp,blendColor:$p,blendDodge:kp,blendOverlay:zp,blendScreen:Gp,blur:Vm,bool:mn,buffer:Fl,bufferAttribute:Qu,builtin:Ol,builtinAOContext:vu,builtinShadowContext:_u,bumpMap:Yc,bvec2:xn,bvec3:Nn,bvec4:En,bypass:ol,cache:nl,call:Ra,cameraFar:Jl,cameraIndex:Ql,cameraNear:Zl,cameraNormalMatrix:id,cameraPosition:nd,cameraProjectionMatrix:ed,cameraProjectionMatrixInverse:td,cameraViewMatrix:rd,cameraViewport:ad,cameraWorldMatrix:sd,cbrt:tu,cdl:Nx,ceil:xo,checker:K_,cineonToneMapping:Lx,clamp:iu,clearcoat:Gn,clearcoatNormalView:jd,clearcoatRoughness:zn,code:zx,color:cn,colorSpaceToWorking:Vu,colorToDirection:e=>Yi(e).mul(2).sub(1),compute:rl,computeKernel:tl,computeSkinning:(e,t=null)=>{const r=new rp(e);return r.positionNode=Gh(new H(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinIndexNode=Gh(new H(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.skinWeightNode=Gh(new H(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(Wh).toVar(),r.bindMatrixNode=xa(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=xa(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Fl(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Yi(r)},context:bu,convert:Pn,convertColorSpace:(e,t,r)=>Yi(new Iu(Yi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():zb(e,...t),cos:No,countLeadingZeros:jy,countOneBits:qy,countTrailingZeros:Hy,cross:Ko,cubeTexture:dc,cubeTextureBase:lc,dFdx:Lo,dFdy:Fo,dashSize:sa,debug:yl,decrement:Za,decrementBefore:Ya,defaultBuildStages:ti,defaultShaderStages:ei,defined:qi,degrees:co,deltaTime:cb,densityFogFactor:eT,depth:Mp,depthPass:(e,t,r)=>new Cx(Cx.DEPTH,e,t,r),determinant:ko,difference:qo,diffuseColor:Un,diffuseContribution:In,directPointLight:q_,directionToColor:$c,directionToFaceDirection:Od,dispersion:ca,disposeShadowMaterial:__,distance:jo,div:Ba,dot:Xo,drawIndex:Xh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Yu(e,t,r,s,x),element:Bn,emissive:On,equal:La,equirectUV:ig,exp:ho,exp2:po,expression:hl,faceDirection:Id,faceForward:uu,faceforward:pu,float:hn,floatBitsToInt:e=>new ky(e,"int","float"),floatBitsToUint:zy,floor:bo,fog:tT,fract:_o,frameGroup:ma,frameId:hb,frontFacing:Ud,fwidth:Oo,gain:(e,t)=>e.lessThan(.5)?Ky(e.mul(2),t).div(2):Ca(1,Ky(Ma(Ca(1,e),2),t).div(2)),gapSize:ia,getConstNodeType:Xi,getCurrentStack:un,getDirection:Dm,getDistanceAttenuation:j_,getGeometryRoughness:Ag,getNormalFromDepth:Hb,getParallaxCorrectNormal:$v,getRoughness:Eg,getScreenPosition:Wb,getShIrradianceAt:Wv,getShadowMaterial:T_,getShadowRenderObjectFunction:S_,getTextureIndex:Iy,getViewPosition:$b,ggxConvolution:$m,globalId:dT,glsl:(e,t)=>zx(e,t,"glsl"),glslFn:(e,t)=>Wx(e,t,"glsl"),grayscale:bx,greaterThan:Ua,greaterThanEqual:Oa,hash:Xy,highpModelNormalViewMatrix:Ed,highpModelViewMatrix:Ad,hue:_x,increment:Qa,incrementBefore:Ka,inspector:Tl,instance:Yh,instanceIndex:Wh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=ks("float")):(r=Gs(t),s=ks(t));const i=new Qb(e,r,s);return Gh(i,t,e)},instancedBufferAttribute:Zu,instancedDynamicBufferAttribute:Ju,instancedMesh:Zh,int:pn,intBitsToFloat:e=>new ky(e,"float","int"),interleavedGradientNoise:jb,inverse:Go,inverseSqrt:yo,inversesqrt:gu,invocationLocalIndex:qh,invocationSubgroupIndex:jh,ior:aa,iridescence:Hn,iridescenceIOR:jn,iridescenceThickness:qn,isolate:il,ivec2:yn,ivec3:_n,ivec4:Rn,js:(e,t)=>zx(e,t,"js"),label:Nu,length:Mo,lengthSq:ru,lessThan:Da,lessThanEqual:Ia,lightPosition:KT,lightProjectionUV:XT,lightShadowMatrix:qT,lightTargetDirection:ZT,lightTargetPosition:YT,lightViewPosition:QT,lightingContext:mp,lights:(e=[])=>(new r_).setLights(e),linearDepth:Bp,linearToneMapping:Bx,localId:cT,log:go,log2:mo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(go(r.div(t)));return hn(Math.E).pow(s).mul(t).negate()},luminance:vx,mat2:wn,mat3:Cn,mat4:Mn,matcapUV:wf,materialAO:Dh,materialAlphaTest:Jc,materialAnisotropy:bh,materialAnisotropyVector:Uh,materialAttenuationColor:Ah,materialAttenuationDistance:Rh,materialClearcoat:hh,materialClearcoatNormal:gh,materialClearcoatRoughness:ph,materialColor:eh,materialDispersion:Lh,materialEmissive:rh,materialEnvIntensity:tc,materialEnvRotation:rc,materialIOR:Sh,materialIridescence:xh,materialIridescenceIOR:Th,materialIridescenceThickness:_h,materialLightMap:Fh,materialLineDashOffset:Bh,materialLineDashSize:wh,materialLineGapSize:Ch,materialLineScale:Eh,materialLineWidth:Mh,materialMetalness:dh,materialNormal:ch,materialOpacity:sh,materialPointSize:Ph,materialReference:fc,materialReflectivity:uh,materialRefractionRatio:ec,materialRotation:mh,materialRoughness:lh,materialSheen:fh,materialSheenRoughness:yh,materialShininess:th,materialSpecular:ih,materialSpecularColor:ah,materialSpecularIntensity:nh,materialSpecularStrength:oh,materialThickness:Nh,materialTransmission:vh,max:$o,maxMipLevel:El,mediumpModelViewMatrix:Rd,metalness:kn,min:zo,mix:su,mixElement:du,mod:Pa,modInt:Ja,modelDirection:fd,modelNormalMatrix:vd,modelPosition:bd,modelRadius:_d,modelScale:xd,modelViewMatrix:Sd,modelViewPosition:Td,modelViewProjection:Ih,modelWorldMatrix:yd,modelWorldMatrixInverse:Nd,morphReference:cp,mrt:Vy,mul:Ma,mx_aastep:kv,mx_add:(e,t=hn(0))=>wa(e,t),mx_atan2:(e=hn(0),t=hn(1))=>Eo(e,t),mx_cell_noise_float:(e=Nl())=>vv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>hn(e).sub(r).mul(t).add(r),mx_divide:(e,t=hn(1))=>Ba(e,t),mx_fractal_noise_float:(e=Nl(),t=3,r=2,s=.5,i=1)=>Sv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Nl(),t=3,r=2,s=.5,i=1)=>Av(e,pn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Nl(),t=3,r=2,s=.5,i=1)=>Rv(e,pn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Nl(),t=3,r=2,s=.5,i=1)=>Ev(e,pn(t),r,s).mul(i),mx_frame:()=>hb,mx_heighttonormal:(e,t)=>(e=Tn(e),t=hn(t),Yc(e,t)),mx_hsvtorgb:Iv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=hn(1))=>Ca(t,e),mx_modulo:(e,t=hn(1))=>Pa(e,t),mx_multiply:(e,t=hn(1))=>Ma(e,t),mx_noise_float:(e=Nl(),t=1,r=0)=>Tv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Nl(),t=1,r=0)=>_v(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Nl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return Sn(_v(e),Tv(e.add(fn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=fn(.5,.5),r=fn(1,1),s=hn(0),i=fn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=fn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=hn(1))=>Yo(e,t),mx_ramp4:(e,t,r,s,i=Nl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=su(e,t,n),u=su(r,s,n);return su(o,u,a)},mx_ramplr:(e,t,r=Nl())=>Gv(e,t,r,"x"),mx_ramptb:(e,t,r=Nl())=>Gv(e,t,r,"y"),mx_rgbtohsv:Ov,mx_rotate2d:(e,t)=>{e=fn(e);const r=(t=hn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=Tn(e),t=hn(t),r=Tn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=hn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=hn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Nl())=>zv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Nl())=>zv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:Vv,mx_subtract:(e,t=hn(0))=>Ca(e,t),mx_timer:()=>db,mx_transform_uv:(e=1,t=0,r=Nl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Dv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Nl(),r=fn(1,1),s=fn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>Uv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Nl(),t=1)=>Pv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec2:(e=Nl(),t=1)=>Lv(e.convert("vec2|vec3"),t,pn(1)),mx_worley_noise_vec3:(e=Nl(),t=1)=>Fv(e.convert("vec2|vec3"),t,pn(1)),negate:Bo,neutralToneMapping:kx,nodeArray:Ji,nodeImmutable:tn,nodeObject:Yi,nodeObjectIntent:Qi,nodeObjects:Zi,nodeProxy:en,nodeProxyIntent:rn,normalFlat:Gd,normalGeometry:Vd,normalLocal:kd,normalMap:jc,normalView:Wd,normalViewGeometry:zd,normalWorld:Hd,normalWorldGeometry:$d,normalize:To,not:Ga,notEqual:Fa,numWorkgroups:uT,objectDirection:ld,objectGroup:ya,objectPosition:cd,objectRadius:gd,objectScale:hd,objectViewPosition:pd,objectWorldMatrix:dd,oneMinus:Po,or:ka,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=db)=>e.fract(),oscSine:(e=db)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=db)=>e.fract().round(),oscTriangle:(e=db)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ra,outputStruct:Uy,overloadingFn:lb,packHalf2x16:Jy,packSnorm2x16:Qy,packUnorm2x16:Zy,parabola:Ky,parallaxDirection:Gc,parallaxUV:(e,t)=>e.sub(Gc.mul(t)),parameter:(e,t)=>new My(e,t),pass:(e,t,r)=>new Cx(Cx.COLOR,e,t,r),passTexture:(e,t)=>new Ex(e,t),pcurve:(e,t,r)=>Yo(Ba(Yo(e,t),wa(Yo(e,t),Yo(Ca(1,e),r))),1/t),perspectiveDepthToViewZ:Ep,pmremTexture:pf,pointShadow:W_,pointUV:ex,pointWidth:na,positionGeometry:wd,positionLocal:Cd,positionPrevious:Md,positionView:Ld,positionViewDirection:Fd,positionWorld:Bd,positionWorldDirection:Pd,posterize:Rx,pow:Yo,pow2:Qo,pow3:Zo,pow4:Jo,premultiplyAlpha:Wp,property:Fn,quadBroadcast:WT,quadSwapDiagonal:OT,quadSwapX:UT,quadSwapY:IT,radians:lo,rand:lu,range:nT,rangeFogFactor:Jx,reciprocal:Uo,reference:pc,referenceBuffer:gc,reflect:Ho,reflectVector:nc,reflectView:sc,reflector:e=>new Fb(e),refract:au,refractVector:ac,refractView:ic,reinhardToneMapping:Px,remap:ll,remapClamp:dl,renderGroup:fa,renderOutput:ml,rendererReference:$u,replaceDefaultUV:function(e,t=null){return bu(t,{getUV:e})},rotate:Pf,rotateUV:pb,roughness:Vn,round:Do,rtt:zb,sRGBTransferEOTF:Fu,sRGBTransferOETF:Du,sample:(e,t=null)=>new Xb(e,Yi(t)),sampler:e=>(!0===e.isNode?e:Bl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Bl(e)).convert("samplerComparison"),saturate:nu,saturation:xx,screenCoordinate:Hl,screenDPR:zl,screenSize:Wl,screenUV:$l,scriptable:Qx,scriptableValue:jx,select:fu,setCurrentStack:on,setName:Tu,shaderStages:ri,shadow:B_,shadowPositionWorld:i_,shapeCircle:Y_,sharedUniformGroup:ga,sheen:$n,sheenRoughness:Wn,shiftLeft:qa,shiftRight:Xa,shininess:ta,sign:Co,sin:vo,sinc:(e,t)=>vo(so.mul(t.mul(e).sub(1))).div(so.mul(t.mul(e).sub(1))),skinning:sp,smoothstep:ou,smoothstepElement:cu,specularColor:Zn,specularColorBlended:Jn,specularF90:ea,spherizeUV:gb,split:(e,t)=>Yi(new hi(Yi(e),t)),spritesheetUV:bb,sqrt:fo,stack:Py,step:Wo,stepElement:hu,storage:Gh,storageBarrier:()=>pT("storage").toStack(),storageTexture:ux,string:(e="")=>new yi(e,"string"),struct:(e,t=null)=>{const r=new Ly(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;ecx(e,t).level(r),texture3DLoad:(...e)=>cx(...e).setSampler(!1),textureBarrier:()=>pT("texture").toStack(),textureBicubic:nm,textureBicubicLevel:im,textureCubeUV:Um,textureLevel:(e,t,r)=>Bl(e,t).level(r),textureLoad:Pl,textureSize:Rl,textureStore:(e,t,r)=>{const s=ux(e,t,r);return null!==r&&s.toStack(),s},thickness:ua,time:db,toneMapping:Hu,toneMappingExposure:ju,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Yi(new Mx(t,r,Yi(s),Yi(i),Yi(n))),transformDirection:eu,transformNormal:qd,transformNormalToView:Xd,transformedClearcoatNormalView:Qd,transformedNormalView:Kd,transformedNormalWorld:Yd,transmission:oa,transpose:Vo,triNoise3D:ab,triplanarTexture:(...e)=>xb(...e),triplanarTextures:xb,trunc:Io,uint:gn,uintBitsToFloat:e=>new ky(e,"float","uint"),uniform:xa,uniformArray:Il,uniformCubeTexture:(e=oc)=>lc(e),uniformFlow:xu,uniformGroup:pa,uniformTexture:(e=wl)=>Bl(e),unpackHalf2x16:sb,unpackNormal:Wc,unpackSnorm2x16:tb,unpackUnorm2x16:rb,unpremultiplyAlpha:Hp,userData:(e,t,r)=>new hx(e,t,r),uv:Nl,uvec2:bn,uvec3:vn,uvec4:An,varying:Pu,varyingProperty:Dn,vec2:fn,vec3:Tn,vec4:Sn,vectorComponents:si,velocity:yx,vertexColor:Op,vertexIndex:$h,vertexStage:Lu,vibrance:Tx,viewZToLogarithmicDepth:wp,viewZToOrthographicDepth:Rp,viewZToPerspectiveDepth:Ap,viewport:jl,viewportCoordinate:Xl,viewportDepthTexture:Np,viewportLinearDepth:Pp,viewportMipTexture:Tp,viewportResolution:Yl,viewportSafeUV:fb,viewportSharedTexture:Jp,viewportSize:ql,viewportTexture:xp,viewportUV:Kl,vogelDiskSample:qb,wgsl:(e,t)=>zx(e,t,"wgsl"),wgslFn:(e,t)=>Wx(e,t,"wgsl"),workgroupArray:(e,t)=>new mT("Workgroup",e,t),workgroupBarrier:()=>pT("workgroup").toStack(),workgroupId:lT,workingToColorSpace:Ou,xor:za});const jv=new Cy;class qv extends Jf{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(jv),jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(jv),jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=Sn(l).mul(nx).context({getUV:()=>ax.mul($d),getTextureLevel:()=>ix}),p=ed.element(3).element(3).equal(1),g=Ba(1,ed.element(1).element(1)).mul(3),m=p.select(Cd.mul(g),Cd),f=Sd.mul(Sn(m,0));let y=ed.mul(Sn(f.xyz,1));y=y.setZ(y.w);const b=new jp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new Ye(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=Sn(l).mul(nx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?jv.set(0,0,0,1):"alpha-blend"===a&&jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=jv.r,T.g=jv.g,T.b=jv.b,T.a=jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.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 Xv=0;class Kv{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=Xv++}}class Yv{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 Kv(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class Qv{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class Zv{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}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 Jv{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class eN extends Jv{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class tN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let rN=0;class sN{constructor(e=null){this.id=rN++,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 iN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class nN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class aN extends nN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class oN extends nN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class uN extends nN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class lN extends nN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class dN extends nN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class cN extends nN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class hN extends nN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class pN extends nN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class gN extends aN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class mN extends oN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class fN extends uN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class yN extends lN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class bN extends dN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class xN extends cN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class TN extends hN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let vN=0;const NN=new WeakMap,SN=new WeakMap,RN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),AN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class EN{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.types={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=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new sN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:vN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===Qe&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=SN.get(this.renderer);return void 0===e&&(e=new Xf,SN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new ng(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 Kv(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new Kv(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 ri)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")}( ${AN(n.r)}, ${AN(n.g)}, ${AN(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 Qv(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===R)return"int";if(t===S)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=Vs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return RN.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 et||!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")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=un();return this.stacks.push(e),on(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,on(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);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}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,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new Qv("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}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 a=this.structs.index++;null===r&&(r="StructType"+a),n=new iN(r,t),this.structs[s].push(n),this.types[s][r]=e,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 Zv(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new Jv(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}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"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new eN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}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,d(`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 tN("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 $x,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 My(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),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 sN,this.stack=Py();for(const r of ti)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(){d("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.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("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(){d("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(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new jp),e.build(this)}else this.addFlow("compute",e);for(const e of ti){this.setBuildStage(e),this.context.vertex&&this.context.vertex.isNode&&this.flowNodeFromShaderStage("vertex",this.context.vertex);for(const t of ri){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}getSharedDataFromNode(e){let t=NN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new gN(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new mN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new fN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new yN(e);else if("color"===t)s=new bN(e);else if("mat2"===t)s=new xN(e);else if("mat3"===t)s=new TN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new _N(e)}r.cache=s}return s}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${tt} - Node System\n`}}class wN{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={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Qs.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Qs.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Qs.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Qs.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Qs.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Qs.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 CN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}CN.isNodeFunctionInput=!0;class MN extends H_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:ZT(this.light),lightColor:e}}}const BN=new a,PN=new a;let LN=null;class FN extends H_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=xa(new r).setGroup(fa),this.halfWidth=xa(new r).setGroup(fa),this.updateType=Qs.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;PN.identity(),BN.copy(t.matrixWorld),BN.premultiply(r),PN.extractRotation(BN),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(PN),this.halfHeight.value.applyMatrix4(PN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Bl(LN.LTC_FLOAT_1),r=Bl(LN.LTC_FLOAT_2)):(t=Bl(LN.LTC_HALF_1),r=Bl(LN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:QT(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){LN=e}}class DN extends H_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=xa(0).setGroup(fa),this.penumbraCosNode=xa(0).setGroup(fa),this.cutoffDistanceNode=xa(0).setGroup(fa),this.decayExponentNode=xa(0).setGroup(fa),this.colorNode=xa(this.color).setGroup(fa)}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,t){const{coneCosNode:r,penumbraCosNode:s}=this;return ou(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=XT(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(ZT(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=j_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Bl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class UN extends DN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Bl(r,fn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const IN=an(([e,t])=>{const r=e.abs().sub(t);return Mo($o(r,0)).add(zo($o(r.x,r.y),0))});class ON extends DN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=hn(0),r=this.penumbraCosNode,s=qT(this.light).mul(e.context.positionWorld||Bd);return ln(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=IN(e.xy.sub(fn(.5)),fn(.5)),n=Ba(-1,Ca(1,Ao(r)).sub(1));t.assign(nu(i.mul(-2).mul(n)))}),t}}class VN extends H_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class kN extends H_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=KT(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=xa(new e).setGroup(fa)}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=Hd.dot(s).mul(.5).add(.5),n=su(r,t,i);e.context.irradiance.addAssign(n)}}class GN extends H_{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=Wv(Hd,this.lightProbe);e.context.irradiance.addAssign(t)}}class zN{parseFunction(){d("Abstract function.")}}class $N{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}$N.isNodeFunction=!0;const WN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,HN=/[a-z_0-9]+/gi,jN="#pragma main";class qN extends $N{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(jN),r=-1!==t?e.slice(t+12):e,s=r.match(WN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=HN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new jp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new Yv(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){YN[0]=e,YN[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(YN)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&QN.push(t.getCacheKey(!0)),i&&QN.push(i.getCacheKey()),n&&QN.push(n.getCacheKey()),QN.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),QN.push(this.renderer.shadowMap.enabled?1:0),QN.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Ds(QN),this.callHashCache.set(YN,s),QN.length=0}return YN.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return pf(r);{let e;return e=!0===r.isCubeTexture?dc(r):Bl(r),dg(e)}}if(!0===r.isTexture)return Bl(r,$l.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("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=pc("color","color",r).setGroup(fa),t=pc("density","float",r).setGroup(fa);return tT(e,eT(t))}if(r.isFog){const e=pc("color","color",r).setGroup(fa),t=pc("near","float",r).setGroup(fa),s=pc("far","float",r).setGroup(fa);return tT(e,Jx(t,s))}o("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?dc(r):!0===r.isTexture?Bl(r):void o("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 KN.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?cx(e,Tn($l,Ol("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Bl(e,$l).renderOutput(t.toneMapping,t.currentColorSpace);return KN.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 wN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const JN=new ze;class eS{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._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new uS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,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),i.layers.mask=6|e.layers.mask,n.layers.mask=3&i.layers.mask,a.layers.mask=5&i.layers.mask;const o=e.parent,u=i.cameras;hS(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 fS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function yS(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(this._renderTarget,this._mrt),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(){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 ZN(this,r),this._animation=new qf(this,this._nodes,this.info),this._attributes=new ny(r),this._background=new qv(this,this._nodes),this._geometries=new uy(this._attributes,this.info),this._textures=new wy(this,r,this.info),this._pipelines=new my(r,this._nodes),this._bindings=new fy(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new Zf(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new vy(this.lighting),this._bundles=new sS,this._renderContexts=new Ay,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}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._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:xS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new eS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=Ad,t.modelNormalViewMatrix=Ed):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===Ad&&e.modelNormalViewMatrix===Ed}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(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>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(_S),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(_S),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new eS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?NS:vS;t.isArrayCamera||(SS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(SS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=TS.width,g.height=TS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(RS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_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)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,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)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');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.get(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;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.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}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=RS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=RS.copy(t).floor()}else t=RS.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),this._inspector.copyFramebufferToTexture(e)}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),this._inspector.copyTextureToTexture(e,t)}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.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?NS:vS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&RS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(SS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,RS.z,null,i)}}else if(e.isLineLoop)o("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?NS:vS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),RS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(SS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=it;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);e.side=null===i.shadowSide?i.side:i.shadowSide,null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=it,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_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)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class ES{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class wS extends ES{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(iy-e%iy)%iy;var e}get buffer(){return this._buffer}update(){return!0}}class CS extends wS{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let MS=0;class BS extends CS{constructor(e,t){super("UniformBuffer_"+MS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class PS extends CS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}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(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let US=0;class IS extends DS{constructor(e,t){super(e,t),this.id=US++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class OS extends IS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class VS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class kS extends OS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const GS={bitcast_int_uint:new Gx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Gx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},zS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},$S={low:"lowp",medium:"mediump",high:"highp"},WS={swizzleAssign:!0,storageBuffer:!1},HS={perspective:"smooth",linear:"noperspective"},jS={centroid:"centroid"},qS="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n";class XS extends EN{constructor(e,t){super(e,t,new XN),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=GS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==GS[e]&&this._include(e),zS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?mt:ft;2===s?n=i?Tt:G:3===s?n=i?_t:vt:4===s&&(n=i?Nt:Re);const a={Float32Array:q,Uint8Array:Ge,Uint16Array:xt,Uint32Array:S,Int8Array:bt,Int16Array:yt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=$S[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=$S[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){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+=`${HS[s.interpolationType]||s.interpolationType} ${jS[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+=`${HS[e.interpolationType]||e.interpolationType} ${jS[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`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}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=WS[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)}WS[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 OS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new VS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new kS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new BS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new FS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let KS=null,YS=null;class QS{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[St.RENDER]:null,[St.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(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?St.COMPUTE:St.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return KS=KS||new t,this.renderer.getDrawingBufferSize(KS)}setScissorTest(){}getClearColor(){const e=this.renderer;return YS=YS||new Cy,e.getClearColor(YS),YS.getRGB(YS),YS}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Rt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${tt} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}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)}deleteBindGroupData(){}dispose(){}}let ZS,JS,eR=0;class tR{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 rR{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("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_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===R,id:eR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new tR(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;e0?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 nR,aR,oR,uR=!1;class lR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===uR&&(this._init(),uR=!0)}_init(){const e=this.gl;nR={[Ur]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Dr]:e.MIRRORED_REPEAT},aR={[w]:e.NEAREST,[Ir]:e.NEAREST_MIPMAP_NEAREST,[Je]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[Ze]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},oR={[Wr]:e.NEVER,[$r]:e.ALWAYS,[E]:e.LESS,[zr]:e.LEQUAL,[Gr]:e.EQUAL,[kr]:e.GEQUAL,[Vr]:e.GREATER,[Or]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(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){const e=i?Hr:p.getTransfer(s);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=e===g?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)}return 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,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;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,o),r.texParameteri(e,r.TEXTURE_WRAP_S,nR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,nR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,nR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,aR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,aR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,oR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==Je&&t.minFilter!==K)return;if(t.type===q&&!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})}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.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?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)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){const t=jr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,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));i.bindRenderbuffer(i.RENDERBUFFER,null)}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();a.state.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),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,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}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function dR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class cR{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 hR{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 pR={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",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class gR{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 v(`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,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);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){o("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);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){o("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=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("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){o("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 yR extends QS{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.currentSamples>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 cR(this),this.capabilities=new hR(this),this.attributeUtils=new rR(this),this.textureUtils=new lR(this),this.bufferRenderer=new gR(this),this.state=new sR(this),this.utils=new iR(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"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}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&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new fR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(St.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;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;e{let a=0;for(let t=0;t1&&u.setMRTBlending(i.textures),u.useProgram(a);const h=e.getAttributes(),p=this.get(h);let g=p.vaoGPU;if(void 0===g){const e=this._getVaoKey(h);g=this.vaoCache[e],void 0===g&&(g=this._createVao(h),this.vaoCache[e]=g,p.vaoGPU=g)}const m=e.getIndex(),f=null!==m?this.get(m).bufferGPU:null;u.setVertexState(g,f);const y=l.lastOcclusionObject;if(y!==t&&void 0!==y){if(null!==y&&!0===y.occlusionTest&&(o.endQuery(o.ANY_SAMPLES_PASSED),l.occlusionQueryIndex++),!0===t.occlusionTest){const e=o.createQuery();o.beginQuery(o.ANY_SAMPLES_PASSED,e),l.occlusionQueries[l.occlusionQueryIndex]=e,l.occlusionQueryObjects[l.occlusionQueryIndex]=t}l.lastOcclusionObject=t}const b=this.bufferRenderer;t.isPoints?b.mode=o.POINTS:t.isLineSegments?b.mode=o.LINES:t.isLine?b.mode=o.LINE_STRIP:t.isLineLoop?b.mode=o.LINE_LOOP:!0===s.wireframe?(u.setLineWidth(s.wireframeLinewidth*this.renderer.getPixelRatio()),b.mode=o.LINES):b.mode=o.TRIANGLES;const{vertexCount:x,instanceCount:T}=d;let{firstVertex:_}=d;if(b.object=t,null!==m){_*=m.array.BYTES_PER_ELEMENT;const e=this.get(m);b.index=m.count,b.type=e.type}else b.index=0;const N=()=>{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,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()});return void t.push(i)}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");o("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&&d("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;epR[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ry(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!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&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const bR="point-list",xR="line-list",TR="line-strip",_R="triangle-list",vR="triangle-strip",NR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},SR="never",RR="less",AR="equal",ER="less-equal",wR="greater",CR="not-equal",MR="greater-equal",BR="always",PR="store",LR="load",FR="clear",DR="ccw",UR="cw",IR="none",OR="back",VR="uint16",kR="uint32",GR="r8unorm",zR="r8snorm",$R="r8uint",WR="r8sint",HR="r16uint",jR="r16sint",qR="r16float",XR="rg8unorm",KR="rg8snorm",YR="rg8uint",QR="rg8sint",ZR="r32uint",JR="r32sint",eA="r32float",tA="rg16uint",rA="rg16sint",sA="rg16float",iA="rgba8unorm",nA="rgba8unorm-srgb",aA="rgba8snorm",oA="rgba8uint",uA="rgba8sint",lA="bgra8unorm",dA="bgra8unorm-srgb",cA="rgb9e5ufloat",hA="rgb10a2unorm",pA="rg11b10ufloat",gA="rg32uint",mA="rg32sint",fA="rg32float",yA="rgba16uint",bA="rgba16sint",xA="rgba16float",TA="rgba32uint",_A="rgba32sint",vA="rgba32float",NA="depth16unorm",SA="depth24plus",RA="depth24plus-stencil8",AA="depth32float",EA="depth32float-stencil8",wA="bc1-rgba-unorm",CA="bc1-rgba-unorm-srgb",MA="bc2-rgba-unorm",BA="bc2-rgba-unorm-srgb",PA="bc3-rgba-unorm",LA="bc3-rgba-unorm-srgb",FA="bc4-r-unorm",DA="bc4-r-snorm",UA="bc5-rg-unorm",IA="bc5-rg-snorm",OA="bc6h-rgb-ufloat",VA="bc6h-rgb-float",kA="bc7-rgba-unorm",GA="bc7-rgba-unorm-srgb",zA="etc2-rgb8unorm",$A="etc2-rgb8unorm-srgb",WA="etc2-rgb8a1unorm",HA="etc2-rgb8a1unorm-srgb",jA="etc2-rgba8unorm",qA="etc2-rgba8unorm-srgb",XA="eac-r11unorm",KA="eac-r11snorm",YA="eac-rg11unorm",QA="eac-rg11snorm",ZA="astc-4x4-unorm",JA="astc-4x4-unorm-srgb",eE="astc-5x4-unorm",tE="astc-5x4-unorm-srgb",rE="astc-5x5-unorm",sE="astc-5x5-unorm-srgb",iE="astc-6x5-unorm",nE="astc-6x5-unorm-srgb",aE="astc-6x6-unorm",oE="astc-6x6-unorm-srgb",uE="astc-8x5-unorm",lE="astc-8x5-unorm-srgb",dE="astc-8x6-unorm",cE="astc-8x6-unorm-srgb",hE="astc-8x8-unorm",pE="astc-8x8-unorm-srgb",gE="astc-10x5-unorm",mE="astc-10x5-unorm-srgb",fE="astc-10x6-unorm",yE="astc-10x6-unorm-srgb",bE="astc-10x8-unorm",xE="astc-10x8-unorm-srgb",TE="astc-10x10-unorm",_E="astc-10x10-unorm-srgb",vE="astc-12x10-unorm",NE="astc-12x10-unorm-srgb",SE="astc-12x12-unorm",RE="astc-12x12-unorm-srgb",AE="clamp-to-edge",EE="repeat",wE="mirror-repeat",CE="linear",ME="nearest",BE="zero",PE="one",LE="src",FE="one-minus-src",DE="src-alpha",UE="one-minus-src-alpha",IE="dst",OE="one-minus-dst",VE="dst-alpha",kE="one-minus-dst-alpha",GE="src-alpha-saturated",zE="constant",$E="one-minus-constant",WE="add",HE="subtract",jE="reverse-subtract",qE="min",XE="max",KE=0,YE=15,QE="keep",ZE="zero",JE="replace",ew="invert",tw="increment-clamp",rw="decrement-clamp",sw="increment-wrap",iw="decrement-wrap",nw="storage",aw="read-only-storage",ow="write-only",uw="read-only",lw="read-write",dw="non-filtering",cw="comparison",hw="float",pw="unfilterable-float",gw="depth",mw="sint",fw="uint",yw="2d",bw="3d",xw="2d",Tw="2d-array",_w="cube",vw="3d",Nw="all",Sw="vertex",Rw="instance",Aw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Ew={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class ww extends DS{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Cw extends wS{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Mw=0;class Bw extends Cw{constructor(e,t){super("StorageBuffer_"+Mw++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:Js.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class Pw extends Jf{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:CE}),this.flipYSampler=e.createSampler({minFilter:ME}),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:vR,stripIndexFormat:kR},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:vR,stripIndexFormat:kR},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:xw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,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:FR,storeOp:PR,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,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:xw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new Pw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,Ow=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,Vw={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 kw extends $N{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Iw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=Ow.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 Gw extends zN{parseFunction(e){return new kw(e)}}const zw={[Js.READ_ONLY]:"read",[Js.WRITE_ONLY]:"write",[Js.READ_WRITE]:"read_write"},$w={[Ur]:"repeat",[xe]:"clamp",[Dr]:"mirror"},Ww={vertex:NR.VERTEX,fragment:NR.FRAGMENT,compute:NR.COMPUTE},Hw={instance:!0,swizzleAssign:!1,storageBuffer:!0},jw={"^^":"tsl_xor"},qw={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"},Xw={},Kw={tsl_xor:new Gx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Gx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Gx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Gx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Gx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Gx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Gx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Gx("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 Gx("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 Gx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Gx("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 Gx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Gx("\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")},Yw={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",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let Qw="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(Qw+="diagnostic( off, derivative_uniformity );\n");class Zw extends EN{constructor(e,t){super(e,t,new Gw),this.uniformGroups={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${$w[e.wrapS]}S_${$w[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=Xw[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Ur?(s.push(Kw.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(Kw.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Dr?(s.push(Kw.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",Xw[t]=r=new Gx(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.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Su(new cl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Su(new cl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Su(new cl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===q||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} 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||"cubeDepthTexture"===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=jw[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),Js.READ_WRITE):Js.READ_ONLY:e.access}getStorageAccess(e,t){return zw[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||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new kS(i.name,i.node,o,n):new OS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new VS(i.name,i.node,o,n):"texture3D"===t&&(s=new kS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Ww[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new ww(`${i.name}_sampler`,i.node,o);e.setVisibility(Ww[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?BS:Bw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Ww[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new FS(u,o),e.setVisibility(Ww[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Ww[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.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||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!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&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Uw(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";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=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}n[e]={index:a.binding++,id:a.group,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}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}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return qw[e]||e}isAvailable(e){let t=Hw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Hw[e]=t),t}_getWGSLMethod(e){return void 0!==Kw[e]&&this._include(e),Yw[e]}_include(e){const t=Kw[e];return t.build(this),this.addInclude(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${Qw}\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){const[r,s,i]=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( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\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 Jw{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return null!==e.depthTexture?t=this.getTextureFormatGPU(e.depthTexture):e.depth&&e.stencil?t=RA:e.depth&&(t=SA),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.currentSamples}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}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?bR:e.isLineSegments||e.isMesh&&!0===t.wireframe?xR:e.isLine?TR:e.isMesh?_R:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return lA;if(e===be)return xA;throw new Error("Unsupported output buffer type.")}}const eC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&eC.set(Float16Array,["float16"]);const tC=new Map([[et,["float16"]]]),rC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class sC{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;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=qr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Nw;let o;o=t.isSampledCubeTexture?_w:t.isSampledTexture3D?vw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?Tw:xw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&NR.COMPUTE&&(s.access===Js.READ_WRITE||s.access===Js.WRITE_ONLY)?e.type=nw:e.type=aw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===Js.READ_WRITE?lw:t===Js.WRITE_ONLY?ow:uw,s.texture.isArrayTexture?e.viewDimension=Tw:s.texture.is3DTexture&&(e.viewDimension=vw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=pw)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=pw:t.sampleType=gw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=mw:e===S?t.sampleType=fw:e===q&&(this.backend.hasFeature("float32-filterable")?t.sampleType=hw:t.sampleType=pw)}s.isSampledCubeTexture?t.viewDimension=_w:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=Tw:s.isSampledTexture3D&&(t.viewDimension=vw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=cw:t.type=dw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class aC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===Qe&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),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.getCurrentColorFormats(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),{layoutGPU:s}=t.layout;a.push(s)}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===nt){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:WE},r={srcFactor:i,dstFactor:n,operation:WE}};if(e.premultipliedAlpha)switch(s){case Qe:i(PE,UE,PE,UE);break;case $t:i(PE,PE,PE,PE);break;case zt:i(BE,FE,BE,PE);break;case Gt:i(IE,UE,BE,PE)}else switch(s){case Qe:i(DE,UE,PE,UE);break;case $t:i(DE,PE,PE,PE);break;case zt:o("WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true");break;case Gt:o("WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true")}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case ot:t=BE;break;case It:t=PE;break;case Ut:t=LE;break;case Bt:t=FE;break;case Dt:t=DE;break;case Mt:t=UE;break;case Lt:t=IE;break;case Ct:t=OE;break;case Pt:t=VE;break;case wt:t=kE;break;case Ft:t=GE;break;case 211:t=zE;break;case 212:t=$E;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ts:t=SR;break;case es:t=BR;break;case Jr:t=RR;break;case Zr:t=ER;break;case Qr:t=AR;break;case Yr:t=MR;break;case Kr:t=wR;break;case Xr:t=CR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case ls:t=QE;break;case us:t=ZE;break;case os:t=JE;break;case as:t=ew;break;case ns:t=tw;break;case is:t=rw;break;case ss:t=sw;break;case rs:t=iw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case at:t=WE;break;case Et:t=HE;break;case At:t=jE;break;case cs:t=qE;break;case ds:t=XE;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?VR:kR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?UR:DR,s.cullMode=r.side===B?IR:OR,s}_getColorWriteMask(e){return!0===e.colorWrite?YE:KE}_getDepthCompare(e){let t;if(!1===e.depthTest)t=BR;else{const r=e.depthFunc;switch(r){case Qt:t=SR;break;case Yt:t=BR;break;case Kt:t=RR;break;case Xt:t=ER;break;case qt:t=AR;break;case jt:t=MR;break;case Ht:t=wR;break;case Wt:t=CR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class oC extends mR{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 v(`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,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)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("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){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("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 uC extends QS{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.defaultRenderPassdescriptor=null,this.utils=new Jw(this),this.attributeUtils=new sC(this),this.bindingUtils=new nC(this),this.pipelineUtils=new aC(this),this.textureUtils=new Dw(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}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(Aw),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=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Aw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${tt} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);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;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(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:LR}),this.initTimestampQuery(St.RENDER,this.getTimestampUID(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;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("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===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){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(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new yR(e)));super(new t(e),e),this.library=new cC,this.isWebGPURenderer=!0}}class pC extends Rs{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class gC{constructor(e,t=Sn(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new jp;r.name="PostProcessing",this._quadMesh=new Vb(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=ml(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class mC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class fC extends Zb{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class yC extends As{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Es(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):o(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]?(o("NodeLoader: Node type not found:",e),hn()):new this.nodes[e]}}class bC extends ws{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 xC extends Cs{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 yC;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 bC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;tTSL
  • asin
  • assign
  • atan
  • -
  • atan2
  • atomicAdd
  • atomicAnd
  • atomicFunc
  • @@ -1028,7 +1027,6 @@

    TSL

  • builtinAOContext
  • builtinShadowContext
  • bumpMap
  • -
  • burn
  • bypass
  • cache
  • cameraFar
  • @@ -1082,7 +1080,6 @@

    TSL

  • degrees
  • deltaTime
  • denoise
  • -
  • densityFog
  • densityFogFactor
  • depth
  • depthBase
  • @@ -1096,7 +1093,6 @@

    TSL

  • dispersion
  • distance
  • div
  • -
  • dodge
  • dof
  • dot
  • dotScreen
  • @@ -1104,7 +1100,6 @@

    TSL

  • dynamicBufferAttribute
  • emissive
  • equal
  • -
  • equals
  • equirectUV
  • exp
  • exp2
  • @@ -1281,7 +1276,6 @@

    TSL

  • outline
  • output
  • outputStruct
  • -
  • overlay
  • overloadingFn
  • packHalf2x16
  • packSnorm2x16
  • @@ -1323,7 +1317,6 @@

    TSL

  • radians
  • rand
  • range
  • -
  • rangeFog
  • rangeFogFactor
  • reciprocal
  • reference
  • @@ -1354,7 +1347,6 @@

    TSL

  • samplerComparison
  • saturate
  • saturation
  • -
  • screen
  • screenCoordinate
  • screenDPR
  • screenSize
  • @@ -1398,7 +1390,6 @@

    TSL

  • storage
  • storageBarrier
  • storageElement
  • -
  • storageObject
  • storageTexture
  • struct
  • sub
  • @@ -1525,6 +1516,7 @@

    Global

  • ByteType
  • CineonToneMapping
  • ClampToEdgeWrapping
  • +
  • Compatibility
  • ConstantAlphaFactor
  • ConstantColorFactor
  • CubeReflectionMapping
  • @@ -2093,6 +2085,38 @@

    Global

    } + // Sort results: exact matches first, then classes before members + const searchLower = v.toLowerCase(); + results.sort( ( a, b ) => { + + const aName = a.title.split( /[#~]/ ).pop().toLowerCase(); + const bName = b.title.split( /[#~]/ ).pop().toLowerCase(); + const aIsClass = ! a.title.includes( '#' ) && ! a.title.includes( '~' ); + const bIsClass = ! b.title.includes( '#' ) && ! b.title.includes( '~' ); + + // Exact match on class name (highest priority) + const aExactClass = aIsClass && aName === searchLower; + const bExactClass = bIsClass && bName === searchLower; + if ( aExactClass !== bExactClass ) return aExactClass ? - 1 : 1; + + // Class starts with search term + const aStartsClass = aIsClass && aName.startsWith( searchLower ); + const bStartsClass = bIsClass && bName.startsWith( searchLower ); + if ( aStartsClass !== bStartsClass ) return aStartsClass ? - 1 : 1; + + // Exact match on member name + const aExact = aName === searchLower; + const bExact = bName === searchLower; + if ( aExact !== bExact ) return aExact ? - 1 : 1; + + // Classes before members + if ( aIsClass !== bIsClass ) return aIsClass ? - 1 : 1; + + // Alphabetically + return a.title.localeCompare( b.title ); + + } ); + // Display results if ( results.length > 0 ) { diff --git a/docs/pages/ImageBitmapLoader.html b/docs/pages/ImageBitmapLoader.html index c0dfc7f22a9472..faa57fc5e56e72 100644 --- a/docs/pages/ImageBitmapLoader.html +++ b/docs/pages/ImageBitmapLoader.html @@ -17,15 +17,18 @@

    ImageBitmapLoader

    An ImageBitmap provides an asynchronous and resource efficient pathway to prepare textures for rendering.

    Note that Texture#flipY and Texture#premultiplyAlpha are ignored with image bitmaps. -They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.

    -

    You need to set the equivalent options via ImageBitmapLoader#setOptions instead.

    -

    Also note that unlike FileLoader, this loader avoids multiple concurrent requests to the same URL only if Cache is enabled.

    -

    Code Example

    -
    const loader = new THREE.ImageBitmapLoader();
    +These options need to be configured via ImageBitmapLoader#setOptions prior to loading,
    +unlike regular images which can be configured on the Texture to set these options on GPU upload instead.

    +

    To match the default behaviour of Texture, the following options are needed:

    +

    Also note that unlike FileLoader, this loader will only avoid multiple concurrent requests to the same URL if Cache is enabled.

    +
    const loader = new THREE.ImageBitmapLoader();
     loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed
     const imageBitmap = await loader.loadAsync( 'image.png' );
     const texture = new THREE.Texture( imageBitmap );
     texture.needsUpdate = true;
    +
    +

    Code Example

    +
    { imageOrientation: 'flipY', premultiplyAlpha: 'none' }
     
    diff --git a/docs/pages/Quaternion.html b/docs/pages/Quaternion.html index ca13d8dd149c39..e34358a55cf482 100644 --- a/docs/pages/Quaternion.html +++ b/docs/pages/Quaternion.html @@ -594,7 +594,7 @@

    ..slerp( qb : Quaternion, t : number ) : Quaternion

    -

    Performs a spherical linear interpolation between quaternions.

    +

    Performs a spherical linear interpolation between this quaternion and the target quaternion.

    @@ -611,7 +611,7 @@

    .slerpt

    @@ -832,7 +832,7 @@

    . -

    The interpolation factor in the range [0,1].

    +

    The interpolation factor. A value in the range [0,1] will interpolate. A value outside the range [0,1] will extrapolate.

    diff --git a/docs/pages/Renderer.html b/docs/pages/Renderer.html index 355710789b362d..c4b10c175f878e 100644 --- a/docs/pages/Renderer.html +++ b/docs/pages/Renderer.html @@ -981,6 +981,28 @@

    .Returns: The viewport definition. +

    .hasCompatibility( name : string ) : boolean

    +
    +
    +

    Checks if the given compatibility is supported by the selected backend. If the +renderer has not been initialized, this method always returns false.

    +
    +

    -

    The interpolation factor in the closed interval [0, 1].

    +

    The interpolation factor. A value in the range [0,1] will interpolate. A value outside the range [0,1] will extrapolate.

    + + + + + + +
    + name + +

    The compatibility's name.

    +
    +
    +
    Returns: Whether the compatibility is supported or not.
    +
    +

    .hasFeature( name : string ) : boolean

    diff --git a/docs/pages/TSL.html b/docs/pages/TSL.html index 9707ebd70eb255..a9f01cfdbaaf15 100644 --- a/docs/pages/TSL.html +++ b/docs/pages/TSL.html @@ -1729,35 +1729,6 @@

    .atan<

    -

    .atan2( y : Node | number, x : Node | number ) : Node

    -
    -
    -

    Returns the arc-tangent of the quotient of its parameters.

    -
    - - - - - - - - - - - -
    - y - -

    The y parameter.

    -
    - x - -

    The x parameter.

    -
    -
    -
    Deprecated: since r172. Use atan instead.
    -
    -

    .atomicAdd( pointerNode : Node, valueNode : Node ) : AtomicFunctionNode

    @@ -2823,23 +2794,6 @@

    .bum

    -

    .burn( …params : any ) : function

    -
    - - - - - - - -
    - params - -
    -
    -
    Deprecated: since r171. Use blendBurn instead.
    -
    -

    .bypass( outputNode : Node, callNode : Node ) : BypassNode

    @@ -3880,30 +3834,6 @@

    .den

    -

    .densityFog( color : Node, density : Node ) : function

    -
    - - - - - - - - - - - -
    - color - -
    - density - -
    -
    -
    Deprecated: since r171. Use `fog( color, densityFogFactor( density ) )` instead.
    -
    -

    .densityFogFactor( density : Node )

    @@ -4101,23 +4031,6 @@

    .div

    -

    .dodge( …params : any ) : function

    -
    - - - - - - - -
    - params - -
    -
    -
    Deprecated: since r171. Use blendDodge instead.
    -
    -

    .dof( node : Node.<vec4>, viewZNode : Node.<float>, focusDistance : Node.<float> | number, focalLength : Node.<float> | number, bokehScale : Node.<float> | number ) : DepthOfFieldNode

    @@ -4302,35 +4215,6 @@

    .equal

    -

    .equals( x : Node | number, y : Node | number ) : Node.<bool>

    -
    -
    -

    Returns true if x equals y.

    -
    - - - - - - - - - - - -
    - x - -

    The first parameter.

    -
    - y - -

    The second parameter.

    -
    -
    -
    Deprecated: since r175. Use equal instead.
    -
    -

    .equirectUV( dirNode : Node.<vec3> ) : Node.<vec2>

    @@ -6898,23 +6782,6 @@

    ..overlay( …params : any ) : function

    -
    - - - - - - - -
    - params - -
    -
    -
    Deprecated: since r171. Use blendOverlay instead.
    -
    -

    .overloadingFn( functionNodes : Array.<function()> ) : FunctionOverloadingNode

    @@ -7779,37 +7646,6 @@

    .range

    -

    .rangeFog( color : Node, near : Node, far : Node ) : function

    -
    - - - - - - - - - - - - - - - -
    - color - -
    - near - -
    - far - -
    -
    -
    Deprecated: since r171. Use `fog( color, rangeFogFactor( near, far ) )` instead.
    -
    -

    .rangeFogFactor( near : Node, far : Node )

    @@ -8691,23 +8527,6 @@

    .Returns: The saturated color.

    -

    .screen( …params : any ) : function

    -
    - - - - - - - -
    - params - -
    -
    -
    Deprecated: since r171. Use blendScreen instead.
    -
    -

    .scriptable( codeNode : CodeNode, parameters : Object ) : ScriptableNode

    @@ -9572,40 +9391,6 @@

    ..storageObject( value : StorageBufferAttribute | StorageInstancedBufferAttribute | BufferAttribute, type : string, count : number ) : StorageBufferNode

    -
    - - - - - - - - - - - - - - - -
    - value - -

    The buffer data.

    -
    - type - -

    The buffer type (e.g. 'vec3').

    -
    - count - -

    The buffer count.

    -
    -
    -
    Deprecated: since r171. Use `storage().setPBO( true )` instead.
    -
    -

    .storageTexture( value : StorageTexture, uvNode : Node.<(vec2|vec3)>, storeNode : Node ) : StorageTextureNode

    diff --git a/docs/pages/TextureNode.html b/docs/pages/TextureNode.html index 24017d570a4902..ff2275bb21132b 100644 --- a/docs/pages/TextureNode.html +++ b/docs/pages/TextureNode.html @@ -816,27 +816,6 @@

    .Returns: The texture reference.

    -

    .uv( uvNode : Node ) : TextureNode

    -
    - - - - - - - -
    - uvNode - -

    The uv node.

    -
    -
    -
    Deprecated: since r172. Use TextureNode#sample instead.
    -
    -
    -
    Returns: A texture node representing the texture sample.
    -
    -

    Source

    src/nodes/accessors/TextureNode.js diff --git a/docs/pages/Uniform.html b/docs/pages/Uniform.html index a9dc74de31730f..f49ef57c7992a3 100644 --- a/docs/pages/Uniform.html +++ b/docs/pages/Uniform.html @@ -54,6 +54,13 @@

    .boundary< value.

    +
    +

    .index : number

    +
    +

    This property is set by UniformsGroup and marks +the index position in the uniform array.

    +
    +

    .itemSize : number

    diff --git a/docs/pages/UniformsGroup.html b/docs/pages/UniformsGroup.html index 7437f0993c9de1..e40bad9e8b671c 100644 --- a/docs/pages/UniformsGroup.html +++ b/docs/pages/UniformsGroup.html @@ -145,6 +145,33 @@

    .Returns: A reference to this group.

    +

    .addUniformUpdateRange( uniform : Uniform )

    +
    +
    +

    Adds a uniform's update range to this buffer.

    +
    + + + + + + + +
    + uniform + +

    The uniform.

    +
    +
    +

    .clearUpdateRanges()

    +
    +
    +

    Clears all update ranges of this buffer.

    +
    +
    +
    Overrides: UniformBuffer#clearUpdateRanges
    +
    +

    .clone() : UniformsGroup

    diff --git a/docs/pages/WebGLRenderer.html b/docs/pages/WebGLRenderer.html index 549bdccacff88e..f8771379116c46 100644 --- a/docs/pages/WebGLRenderer.html +++ b/docs/pages/WebGLRenderer.html @@ -461,7 +461,7 @@

    .

    The destination mipmap level.

    -

    Default is null.

    +

    Default is 0.

    diff --git a/docs/pages/global.html b/docs/pages/global.html index ff686d3215dda1..ef5d42249a2317 100644 --- a/docs/pages/global.html +++ b/docs/pages/global.html @@ -120,6 +120,12 @@

    . +

    .Compatibility : Object (constant)

    +
    +

    Compatibility flags for features that may not be supported across all platforms.

    +
    +

    .ConstantAlphaFactor : number (constant)

    diff --git a/docs/pages/module-VignetteShader.html b/docs/pages/module-VignetteShader.html index 6b127f0ff4a5be..6346b68e01ebba 100644 --- a/docs/pages/module-VignetteShader.html +++ b/docs/pages/module-VignetteShader.html @@ -23,7 +23,7 @@

    Properties

    Source

    diff --git a/docs/search.json b/docs/search.json index 8dc50652deb22a..62350ce6b1c215 100644 --- a/docs/search.json +++ b/docs/search.json @@ -12,10 +12,6 @@ "title": "AmbientLight", "kind": "class" }, - { - "title": "AmbientLight#isAmbientLight", - "kind": "member" - }, { "title": "AmbientLightNode", "kind": "class" @@ -44,10 +40,6 @@ "title": "AnalyticLightNode#getLightVector", "kind": "function" }, - { - "title": "AnalyticLightNode#isAnalyticLightNode", - "kind": "member" - }, { "title": "AnalyticLightNode#light", "kind": "member" @@ -352,10 +344,6 @@ "title": "AnimationObjectGroup#add", "kind": "function" }, - { - "title": "AnimationObjectGroup#isAnimationObjectGroup", - "kind": "member" - }, { "title": "AnimationObjectGroup#remove", "kind": "function" @@ -376,10 +364,6 @@ "title": "ArcCurve", "kind": "class" }, - { - "title": "ArcCurve#isArcCurve", - "kind": "member" - }, { "title": "ArrayCamera", "kind": "class" @@ -388,14 +372,6 @@ "title": "ArrayCamera#cameras", "kind": "member" }, - { - "title": "ArrayCamera#isArrayCamera", - "kind": "member" - }, - { - "title": "ArrayCamera#isMultiViewCamera", - "kind": "member" - }, { "title": "ArrayElementNode", "kind": "class" @@ -412,10 +388,6 @@ "title": "ArrayElementNode#indexNode", "kind": "member" }, - { - "title": "ArrayElementNode#isArrayElementNode", - "kind": "member" - }, { "title": "ArrayElementNode#node", "kind": "member" @@ -448,10 +420,6 @@ "title": "ArrayNode#getNodeType", "kind": "function" }, - { - "title": "ArrayNode#isArrayNode", - "kind": "member" - }, { "title": "ArrayNode#values", "kind": "member" @@ -492,10 +460,6 @@ "title": "AssignNode#hasDependencies", "kind": "function" }, - { - "title": "AssignNode#isAssignNode", - "kind": "member" - }, { "title": "AssignNode#needsSplitAssign", "kind": "function" @@ -936,10 +900,6 @@ "title": "BatchedMesh#instanceCount", "kind": "member" }, - { - "title": "BatchedMesh#isBatchedMesh", - "kind": "member" - }, { "title": "BatchedMesh#maxInstanceCount", "kind": "member" @@ -1016,10 +976,6 @@ "title": "BitcastNode#inputType", "kind": "member" }, - { - "title": "BitcastNode#isBitcastNode", - "kind": "member" - }, { "title": "BitcastNode#valueNode", "kind": "member" @@ -1028,18 +984,10 @@ "title": "BitcountNode", "kind": "class" }, - { - "title": "BitcountNode#isBitcountNode", - "kind": "member" - }, { "title": "Bone", "kind": "class" }, - { - "title": "Bone#isBone", - "kind": "member" - }, { "title": "BooleanKeyframeTrack", "kind": "class" @@ -1120,10 +1068,6 @@ "title": "Box2#intersectsBox", "kind": "function" }, - { - "title": "Box2#isBox2", - "kind": "member" - }, { "title": "Box2#isEmpty", "kind": "function" @@ -1252,10 +1196,6 @@ "title": "Box3#intersectsTriangle", "kind": "function" }, - { - "title": "Box3#isBox3", - "kind": "member" - }, { "title": "Box3#isEmpty", "kind": "function" @@ -1424,10 +1364,6 @@ "title": "BufferAttribute#id", "kind": "member" }, - { - "title": "BufferAttribute#isBufferAttribute", - "kind": "member" - }, { "title": "BufferAttribute#itemSize", "kind": "member" @@ -1556,10 +1492,6 @@ "title": "BufferAttributeNode#instanced", "kind": "member" }, - { - "title": "BufferAttributeNode#isBufferNode", - "kind": "member" - }, { "title": "BufferAttributeNode#setInstanced", "kind": "function" @@ -1684,10 +1616,6 @@ "title": "BufferGeometry#indirectOffset", "kind": "member" }, - { - "title": "BufferGeometry#isBufferGeometry", - "kind": "member" - }, { "title": "BufferGeometry#lookAt", "kind": "function" @@ -1804,10 +1732,6 @@ "title": "BufferNode#getInputType", "kind": "function" }, - { - "title": "BufferNode#isBufferNode", - "kind": "member" - }, { "title": "BufferNode#updateRanges", "kind": "member" @@ -1820,10 +1744,6 @@ "title": "BuiltinNode#generate", "kind": "function" }, - { - "title": "BuiltinNode#isBuiltinNode", - "kind": "member" - }, { "title": "BuiltinNode#name", "kind": "member" @@ -1844,10 +1764,6 @@ "title": "BundleGroup", "kind": "class" }, - { - "title": "BundleGroup#isBundleGroup", - "kind": "member" - }, { "title": "BundleGroup#needsUpdate", "kind": "member" @@ -1872,10 +1788,6 @@ "title": "BypassNode#callNode", "kind": "member" }, - { - "title": "BypassNode#isBypassNode", - "kind": "member" - }, { "title": "BypassNode#outputNode", "kind": "member" @@ -1896,10 +1808,6 @@ "title": "Camera#getWorldDirection", "kind": "function" }, - { - "title": "Camera#isCamera", - "kind": "member" - }, { "title": "Camera#matrixWorldInverse", "kind": "member" @@ -2012,10 +1920,6 @@ "title": "CanvasTexture", "kind": "class" }, - { - "title": "CanvasTexture#isCanvasTexture", - "kind": "member" - }, { "title": "CapsuleGeometry", "kind": "class" @@ -2040,10 +1944,6 @@ "title": "CatmullRomCurve3#getPoint", "kind": "function" }, - { - "title": "CatmullRomCurve3#isCatmullRomCurve3", - "kind": "member" - }, { "title": "CatmullRomCurve3#points", "kind": "member" @@ -2080,10 +1980,6 @@ "title": "ClippingGroup#enabled", "kind": "member" }, - { - "title": "ClippingGroup#isClippingGroup", - "kind": "member" - }, { "title": "ClippingNode", "kind": "class" @@ -2168,10 +2064,6 @@ "title": "CodeNode#includes", "kind": "member" }, - { - "title": "CodeNode#isCodeNode", - "kind": "member" - }, { "title": "CodeNode#language", "kind": "member" @@ -2264,10 +2156,6 @@ "title": "Color#getStyle", "kind": "function" }, - { - "title": "Color#isColor", - "kind": "member" - }, { "title": "Color#lerp", "kind": "function" @@ -2384,10 +2272,6 @@ "title": "CompressedArrayTexture#image", "kind": "member" }, - { - "title": "CompressedArrayTexture#isCompressedArrayTexture", - "kind": "member" - }, { "title": "CompressedArrayTexture#layerUpdates", "kind": "member" @@ -2400,14 +2284,6 @@ "title": "CompressedCubeTexture", "kind": "class" }, - { - "title": "CompressedCubeTexture#isCompressedCubeTexture", - "kind": "member" - }, - { - "title": "CompressedCubeTexture#isCubeTexture", - "kind": "member" - }, { "title": "CompressedTexture", "kind": "class" @@ -2424,10 +2300,6 @@ "title": "CompressedTexture#image", "kind": "member" }, - { - "title": "CompressedTexture#isCompressedTexture", - "kind": "member" - }, { "title": "CompressedTexture#mipmaps", "kind": "member" @@ -2484,10 +2356,6 @@ "title": "ComputeNode#getCount", "kind": "function" }, - { - "title": "ComputeNode#isComputeNode", - "kind": "member" - }, { "title": "ComputeNode#label", "kind": "function" @@ -2564,10 +2432,6 @@ "title": "ConstNode#generateConst", "kind": "function" }, - { - "title": "ConstNode#isConstNode", - "kind": "member" - }, { "title": "ContextNode", "kind": "class" @@ -2588,10 +2452,6 @@ "title": "ContextNode#getScope", "kind": "function" }, - { - "title": "ContextNode#isContextNode", - "kind": "member" - }, { "title": "ContextNode#node", "kind": "member" @@ -2696,14 +2556,6 @@ "title": "CubeDepthTexture#images", "kind": "member" }, - { - "title": "CubeDepthTexture#isCubeDepthTexture", - "kind": "member" - }, - { - "title": "CubeDepthTexture#isCubeTexture", - "kind": "member" - }, { "title": "CubeMapNode", "kind": "class" @@ -2724,10 +2576,6 @@ "title": "CubeRenderTarget#fromEquirectangularTexture", "kind": "function" }, - { - "title": "CubeRenderTarget#isCubeRenderTarget", - "kind": "member" - }, { "title": "CubeTexture", "kind": "class" @@ -2740,10 +2588,6 @@ "title": "CubeTexture#images", "kind": "member" }, - { - "title": "CubeTexture#isCubeTexture", - "kind": "member" - }, { "title": "CubeTextureLoader", "kind": "class" @@ -2768,10 +2612,6 @@ "title": "CubeTextureNode#getInputType", "kind": "function" }, - { - "title": "CubeTextureNode#isCubeTextureNode", - "kind": "member" - }, { "title": "CubeTextureNode#setUpdateMatrix", "kind": "function" @@ -2788,10 +2628,6 @@ "title": "CubicBezierCurve#getPoint", "kind": "function" }, - { - "title": "CubicBezierCurve#isCubicBezierCurve", - "kind": "member" - }, { "title": "CubicBezierCurve#v0", "kind": "member" @@ -2816,10 +2652,6 @@ "title": "CubicBezierCurve3#getPoint", "kind": "function" }, - { - "title": "CubicBezierCurve3#isCubicBezierCurve3", - "kind": "member" - }, { "title": "CubicBezierCurve3#v0", "kind": "member" @@ -3004,10 +2836,6 @@ "title": "Data3DTexture#image", "kind": "member" }, - { - "title": "Data3DTexture#isData3DTexture", - "kind": "member" - }, { "title": "Data3DTexture#magFilter", "kind": "member" @@ -3048,10 +2876,6 @@ "title": "DataArrayTexture#image", "kind": "member" }, - { - "title": "DataArrayTexture#isDataArrayTexture", - "kind": "member" - }, { "title": "DataArrayTexture#layerUpdates", "kind": "member" @@ -3088,10 +2912,6 @@ "title": "DataTexture#image", "kind": "member" }, - { - "title": "DataTexture#isDataTexture", - "kind": "member" - }, { "title": "DataTexture#unpackAlignment", "kind": "member" @@ -3124,18 +2944,10 @@ "title": "DepthTexture#generateMipmaps", "kind": "member" }, - { - "title": "DepthTexture#isDepthTexture", - "kind": "member" - }, { "title": "DirectionalLight", "kind": "class" }, - { - "title": "DirectionalLight#isDirectionalLight", - "kind": "member" - }, { "title": "DirectionalLight#shadow", "kind": "member" @@ -3180,10 +2992,6 @@ "title": "DirectionalLightShadow", "kind": "class" }, - { - "title": "DirectionalLightShadow#isDirectionalLightShadow", - "kind": "member" - }, { "title": "DiscreteInterpolant", "kind": "class" @@ -3240,10 +3048,6 @@ "title": "EllipseCurve#getPoint", "kind": "function" }, - { - "title": "EllipseCurve#isEllipseCurve", - "kind": "member" - }, { "title": "EllipseCurve#xRadius", "kind": "member" @@ -3280,10 +3084,6 @@ "title": "Euler#fromArray", "kind": "function" }, - { - "title": "Euler#isEuler", - "kind": "member" - }, { "title": "Euler#order", "kind": "member" @@ -3360,10 +3160,6 @@ "title": "ExternalTexture", "kind": "class" }, - { - "title": "ExternalTexture#isExternalTexture", - "kind": "member" - }, { "title": "ExternalTexture#sourceTexture", "kind": "member" @@ -3444,10 +3240,6 @@ "title": "Fog#far", "kind": "member" }, - { - "title": "Fog#isFog", - "kind": "member" - }, { "title": "Fog#name", "kind": "member" @@ -3476,10 +3268,6 @@ "title": "FogExp2#density", "kind": "member" }, - { - "title": "FogExp2#isFogExp2", - "kind": "member" - }, { "title": "FogExp2#name", "kind": "member" @@ -3496,10 +3284,6 @@ "title": "FramebufferTexture#generateMipmaps", "kind": "member" }, - { - "title": "FramebufferTexture#isFramebufferTexture", - "kind": "member" - }, { "title": "FramebufferTexture#magFilter", "kind": "member" @@ -3512,10 +3296,6 @@ "title": "FrontFacingNode", "kind": "class" }, - { - "title": "FrontFacingNode#isFrontFacingNode", - "kind": "member" - }, { "title": "Frustum", "kind": "class" @@ -3684,10 +3464,6 @@ "title": "GLBufferAttribute#elementSize", "kind": "member" }, - { - "title": "GLBufferAttribute#isGLBufferAttribute", - "kind": "member" - }, { "title": "GLBufferAttribute#itemSize", "kind": "member" @@ -3956,10 +3732,6 @@ "title": "Group", "kind": "class" }, - { - "title": "Group#isGroup", - "kind": "member" - }, { "title": "HemisphereLight", "kind": "class" @@ -3968,10 +3740,6 @@ "title": "HemisphereLight#groundColor", "kind": "member" }, - { - "title": "HemisphereLight#isHemisphereLight", - "kind": "member" - }, { "title": "HemisphereLightHelper", "kind": "class" @@ -4044,10 +3812,6 @@ "title": "ImageBitmapLoader#abort", "kind": "function" }, - { - "title": "ImageBitmapLoader#isImageBitmapLoader", - "kind": "member" - }, { "title": "ImageBitmapLoader#load", "kind": "function" @@ -4076,10 +3840,6 @@ "title": "IndexNode", "kind": "class" }, - { - "title": "IndexNode#isIndexNode", - "kind": "member" - }, { "title": "IndexNode#scope", "kind": "member" @@ -4088,10 +3848,6 @@ "title": "IndirectStorageBufferAttribute", "kind": "class" }, - { - "title": "IndirectStorageBufferAttribute#isIndirectStorageBufferAttribute", - "kind": "member" - }, { "title": "Info", "kind": "class" @@ -4140,10 +3896,6 @@ "title": "InputNode#getInputType", "kind": "function" }, - { - "title": "InputNode#isInputNode", - "kind": "member" - }, { "title": "InputNode#precision", "kind": "member" @@ -4276,14 +4028,6 @@ "title": "InstanceNode#instanceMatrixNode", "kind": "member" }, - { - "title": "InstanceNode#isStorageColor", - "kind": "member" - }, - { - "title": "InstanceNode#isStorageMatrix", - "kind": "member" - }, { "title": "InstanceNode#setup", "kind": "function" @@ -4300,10 +4044,6 @@ "title": "InstancedBufferAttribute", "kind": "class" }, - { - "title": "InstancedBufferAttribute#isInstancedBufferAttribute", - "kind": "member" - }, { "title": "InstancedBufferAttribute#meshPerAttribute", "kind": "member" @@ -4316,18 +4056,10 @@ "title": "InstancedBufferGeometry#instanceCount", "kind": "member" }, - { - "title": "InstancedBufferGeometry#isInstancedBufferGeometry", - "kind": "member" - }, { "title": "InstancedInterleavedBuffer", "kind": "class" }, - { - "title": "InstancedInterleavedBuffer#isInstancedInterleavedBuffer", - "kind": "member" - }, { "title": "InstancedInterleavedBuffer#meshPerAttribute", "kind": "member" @@ -4380,10 +4112,6 @@ "title": "InstancedMesh#instanceMatrix", "kind": "member" }, - { - "title": "InstancedMesh#isInstancedMesh", - "kind": "member" - }, { "title": "InstancedMesh#morphTexture", "kind": "member" @@ -4452,10 +4180,6 @@ "title": "InterleavedBuffer#count", "kind": "member" }, - { - "title": "InterleavedBuffer#isInterleavedBuffer", - "kind": "member" - }, { "title": "InterleavedBuffer#needsUpdate", "kind": "member" @@ -4548,10 +4272,6 @@ "title": "InterleavedBufferAttribute#getZ", "kind": "function" }, - { - "title": "InterleavedBufferAttribute#isInterleavedBufferAttribute", - "kind": "member" - }, { "title": "InterleavedBufferAttribute#itemSize", "kind": "member" @@ -4672,10 +4392,6 @@ "title": "IsolateNode", "kind": "class" }, - { - "title": "IsolateNode#isIsolateNode", - "kind": "member" - }, { "title": "IsolateNode#node", "kind": "member" @@ -4796,10 +4512,6 @@ "title": "LOD#getObjectForDistance", "kind": "function" }, - { - "title": "LOD#isLOD", - "kind": "member" - }, { "title": "LOD#levels", "kind": "member" @@ -4880,18 +4592,10 @@ "title": "Light#intensity", "kind": "member" }, - { - "title": "Light#isLight", - "kind": "member" - }, { "title": "LightProbe", "kind": "class" }, - { - "title": "LightProbe#isLightProbe", - "kind": "member" - }, { "title": "LightProbe#sh", "kind": "member" @@ -5052,10 +4756,6 @@ "title": "LightingNode", "kind": "class" }, - { - "title": "LightingNode#isLightingNode", - "kind": "member" - }, { "title": "LightsNode", "kind": "class" @@ -5124,10 +4824,6 @@ "title": "Line#geometry", "kind": "member" }, - { - "title": "Line#isLine", - "kind": "member" - }, { "title": "Line#material", "kind": "member" @@ -5180,10 +4876,6 @@ "title": "Line2NodeMaterial#gapSizeNode", "kind": "member" }, - { - "title": "Line2NodeMaterial#isLine2NodeMaterial", - "kind": "member" - }, { "title": "Line2NodeMaterial#lineColorNode", "kind": "member" @@ -5280,10 +4972,6 @@ "title": "LineBasicMaterial#fog", "kind": "member" }, - { - "title": "LineBasicMaterial#isLineBasicMaterial", - "kind": "member" - }, { "title": "LineBasicMaterial#linecap", "kind": "member" @@ -5304,10 +4992,6 @@ "title": "LineBasicNodeMaterial", "kind": "class" }, - { - "title": "LineBasicNodeMaterial#isLineBasicNodeMaterial", - "kind": "member" - }, { "title": "LineCurve", "kind": "class" @@ -5316,10 +5000,6 @@ "title": "LineCurve#getPoint", "kind": "function" }, - { - "title": "LineCurve#isLineCurve", - "kind": "member" - }, { "title": "LineCurve#v1", "kind": "member" @@ -5336,10 +5016,6 @@ "title": "LineCurve3#getPoint", "kind": "function" }, - { - "title": "LineCurve3#isLineCurve3", - "kind": "member" - }, { "title": "LineCurve3#v1", "kind": "member" @@ -5360,10 +5036,6 @@ "title": "LineDashedMaterial#gapSize", "kind": "member" }, - { - "title": "LineDashedMaterial#isLineDashedMaterial", - "kind": "member" - }, { "title": "LineDashedMaterial#scale", "kind": "member" @@ -5388,10 +5060,6 @@ "title": "LineDashedNodeMaterial#gapSizeNode", "kind": "member" }, - { - "title": "LineDashedNodeMaterial#isLineDashedNodeMaterial", - "kind": "member" - }, { "title": "LineDashedNodeMaterial#offsetNode", "kind": "member" @@ -5404,18 +5072,10 @@ "title": "LineLoop", "kind": "class" }, - { - "title": "LineLoop#isLineLoop", - "kind": "member" - }, { "title": "LineSegments", "kind": "class" }, - { - "title": "LineSegments#isLineSegments", - "kind": "member" - }, { "title": "LinearInterpolant", "kind": "class" @@ -5572,10 +5232,6 @@ "title": "MRTNode#has", "kind": "function" }, - { - "title": "MRTNode#isMRTNode", - "kind": "member" - }, { "title": "MRTNode#merge", "kind": "function" @@ -5700,10 +5356,6 @@ "title": "Material#id", "kind": "member" }, - { - "title": "Material#isMaterial", - "kind": "member" - }, { "title": "Material#name", "kind": "member" @@ -5880,10 +5532,6 @@ "title": "MaterialReferenceNode", "kind": "class" }, - { - "title": "MaterialReferenceNode#isMaterialReferenceNode", - "kind": "member" - }, { "title": "MaterialReferenceNode#material", "kind": "member" @@ -5916,10 +5564,6 @@ "title": "MathNode#getNodeType", "kind": "function" }, - { - "title": "MathNode#isMathNode", - "kind": "member" - }, { "title": "MathNode#method", "kind": "member" @@ -5944,10 +5588,6 @@ "title": "Matrix2#identity", "kind": "function" }, - { - "title": "Matrix2#isMatrix2", - "kind": "member" - }, { "title": "Matrix2#set", "kind": "function" @@ -5996,10 +5636,6 @@ "title": "Matrix3#invert", "kind": "function" }, - { - "title": "Matrix3#isMatrix3", - "kind": "member" - }, { "title": "Matrix3#makeRotation", "kind": "function" @@ -6124,10 +5760,6 @@ "title": "Matrix4#invert", "kind": "function" }, - { - "title": "Matrix4#isMatrix4", - "kind": "member" - }, { "title": "Matrix4#lookAt", "kind": "function" @@ -6240,10 +5872,6 @@ "title": "MemberNode", "kind": "class" }, - { - "title": "MemberNode#isMemberNode", - "kind": "member" - }, { "title": "MemberNode#property", "kind": "member" @@ -6268,10 +5896,6 @@ "title": "Mesh#getVertexPosition", "kind": "function" }, - { - "title": "Mesh#isMesh", - "kind": "member" - }, { "title": "Mesh#material", "kind": "member" @@ -6328,10 +5952,6 @@ "title": "MeshBasicMaterial#fog", "kind": "member" }, - { - "title": "MeshBasicMaterial#isMeshBasicMaterial", - "kind": "member" - }, { "title": "MeshBasicMaterial#lightMap", "kind": "member" @@ -6376,10 +5996,6 @@ "title": "MeshBasicNodeMaterial", "kind": "class" }, - { - "title": "MeshBasicNodeMaterial#isMeshBasicNodeMaterial", - "kind": "member" - }, { "title": "MeshBasicNodeMaterial#lights", "kind": "member" @@ -6428,10 +6044,6 @@ "title": "MeshDepthMaterial#displacementScale", "kind": "member" }, - { - "title": "MeshDepthMaterial#isMeshDepthMaterial", - "kind": "member" - }, { "title": "MeshDepthMaterial#map", "kind": "member" @@ -6464,10 +6076,6 @@ "title": "MeshDistanceMaterial#displacementScale", "kind": "member" }, - { - "title": "MeshDistanceMaterial#isMeshDistanceMaterial", - "kind": "member" - }, { "title": "MeshDistanceMaterial#map", "kind": "member" @@ -6544,10 +6152,6 @@ "title": "MeshLambertMaterial#fog", "kind": "member" }, - { - "title": "MeshLambertMaterial#isMeshLambertMaterial", - "kind": "member" - }, { "title": "MeshLambertMaterial#lightMap", "kind": "member" @@ -6604,10 +6208,6 @@ "title": "MeshLambertNodeMaterial", "kind": "class" }, - { - "title": "MeshLambertNodeMaterial#isMeshLambertNodeMaterial", - "kind": "member" - }, { "title": "MeshLambertNodeMaterial#lights", "kind": "member" @@ -6660,10 +6260,6 @@ "title": "MeshMatcapMaterial#fog", "kind": "member" }, - { - "title": "MeshMatcapMaterial#isMeshMatcapMaterial", - "kind": "member" - }, { "title": "MeshMatcapMaterial#map", "kind": "member" @@ -6696,10 +6292,6 @@ "title": "MeshMatcapNodeMaterial", "kind": "class" }, - { - "title": "MeshMatcapNodeMaterial#isMeshMatcapNodeMaterial", - "kind": "member" - }, { "title": "MeshMatcapNodeMaterial#setupVariants", "kind": "function" @@ -6732,10 +6324,6 @@ "title": "MeshNormalMaterial#flatShading", "kind": "member" }, - { - "title": "MeshNormalMaterial#isMeshNormalMaterial", - "kind": "member" - }, { "title": "MeshNormalMaterial#normalMap", "kind": "member" @@ -6760,10 +6348,6 @@ "title": "MeshNormalNodeMaterial", "kind": "class" }, - { - "title": "MeshNormalNodeMaterial#isMeshNormalNodeMaterial", - "kind": "member" - }, { "title": "MeshNormalNodeMaterial#setupDiffuseColor", "kind": "function" @@ -6840,10 +6424,6 @@ "title": "MeshPhongMaterial#fog", "kind": "member" }, - { - "title": "MeshPhongMaterial#isMeshPhongMaterial", - "kind": "member" - }, { "title": "MeshPhongMaterial#lightMap", "kind": "member" @@ -6908,10 +6488,6 @@ "title": "MeshPhongNodeMaterial", "kind": "class" }, - { - "title": "MeshPhongNodeMaterial#isMeshPhongNodeMaterial", - "kind": "member" - }, { "title": "MeshPhongNodeMaterial#lights", "kind": "member" @@ -7012,10 +6588,6 @@ "title": "MeshPhysicalMaterial#iridescenceThicknessRange", "kind": "member" }, - { - "title": "MeshPhysicalMaterial#isMeshPhysicalMaterial", - "kind": "member" - }, { "title": "MeshPhysicalMaterial#reflectivity", "kind": "member" @@ -7120,10 +6692,6 @@ "title": "MeshPhysicalNodeMaterial#iridescenceThicknessNode", "kind": "member" }, - { - "title": "MeshPhysicalNodeMaterial#isMeshPhysicalNodeMaterial", - "kind": "member" - }, { "title": "MeshPhysicalNodeMaterial#setupClearcoatNormal", "kind": "function" @@ -7296,10 +6864,6 @@ "title": "MeshStandardMaterial#fog", "kind": "member" }, - { - "title": "MeshStandardMaterial#isMeshStandardMaterial", - "kind": "member" - }, { "title": "MeshStandardMaterial#lightMap", "kind": "member" @@ -7364,10 +6928,6 @@ "title": "MeshStandardNodeMaterial#emissiveNode", "kind": "member" }, - { - "title": "MeshStandardNodeMaterial#isMeshStandardNodeMaterial", - "kind": "member" - }, { "title": "MeshStandardNodeMaterial#lights", "kind": "member" @@ -7456,10 +7016,6 @@ "title": "MeshToonMaterial#gradientMap", "kind": "member" }, - { - "title": "MeshToonMaterial#isMeshToonMaterial", - "kind": "member" - }, { "title": "MeshToonMaterial#lightMap", "kind": "member" @@ -7504,10 +7060,6 @@ "title": "MeshToonNodeMaterial", "kind": "class" }, - { - "title": "MeshToonNodeMaterial#isMeshToonNodeMaterial", - "kind": "member" - }, { "title": "MeshToonNodeMaterial#lights", "kind": "member" @@ -7636,10 +7188,6 @@ "title": "Node#isGlobal", "kind": "function" }, - { - "title": "Node#isNode", - "kind": "member" - }, { "title": "Node#name", "kind": "member" @@ -7736,10 +7284,6 @@ "title": "NodeAttribute", "kind": "class" }, - { - "title": "NodeAttribute#isNodeAttribute", - "kind": "member" - }, { "title": "NodeAttribute#name", "kind": "member" @@ -8580,10 +8124,6 @@ "title": "NodeFunctionInput#count", "kind": "member" }, - { - "title": "NodeFunctionInput#isConst", - "kind": "member" - }, { "title": "NodeFunctionInput#name", "kind": "member" @@ -8704,10 +8244,6 @@ "title": "NodeMaterial#hardwareClipping", "kind": "member" }, - { - "title": "NodeMaterial#isNodeMaterial", - "kind": "member" - }, { "title": "NodeMaterial#lights", "kind": "member" @@ -8992,10 +8528,6 @@ "title": "NodeUniform#id", "kind": "member" }, - { - "title": "NodeUniform#isNodeUniform", - "kind": "member" - }, { "title": "NodeUniform#name", "kind": "member" @@ -9020,10 +8552,6 @@ "title": "NodeVar#count", "kind": "member" }, - { - "title": "NodeVar#isNodeVar", - "kind": "member" - }, { "title": "NodeVar#name", "kind": "member" @@ -9048,10 +8576,6 @@ "title": "NodeVarying#interpolationType", "kind": "member" }, - { - "title": "NodeVarying#isNodeVarying", - "kind": "member" - }, { "title": "NodeVarying#needsInterpolation", "kind": "member" @@ -9192,10 +8716,6 @@ "title": "Object3D#id", "kind": "member" }, - { - "title": "Object3D#isObject3D", - "kind": "member" - }, { "title": "Object3D#layers", "kind": "member" @@ -9480,10 +9000,6 @@ "title": "OperatorNode#getOperatorMethod", "kind": "function" }, - { - "title": "OperatorNode#isOperatorNode", - "kind": "member" - }, { "title": "OperatorNode#op", "kind": "member" @@ -9504,10 +9020,6 @@ "title": "OrthographicCamera#far", "kind": "member" }, - { - "title": "OrthographicCamera#isOrthographicCamera", - "kind": "member" - }, { "title": "OrthographicCamera#left", "kind": "member" @@ -9544,10 +9056,6 @@ "title": "OutputStructNode", "kind": "class" }, - { - "title": "OutputStructNode#isOutputStructNode", - "kind": "member" - }, { "title": "OutputStructNode#members", "kind": "member" @@ -9612,10 +9120,6 @@ "title": "PackFloatNode#encoding", "kind": "member" }, - { - "title": "PackFloatNode#isPackFloatNode", - "kind": "member" - }, { "title": "PackFloatNode#vectorNode", "kind": "member" @@ -9628,10 +9132,6 @@ "title": "ParameterNode#getMemberType", "kind": "function" }, - { - "title": "ParameterNode#isParameterNode", - "kind": "member" - }, { "title": "PassMultipleTextureNode", "kind": "class" @@ -9712,10 +9212,6 @@ "title": "PassNode#global", "kind": "member" }, - { - "title": "PassNode#isPassNode", - "kind": "member" - }, { "title": "PassNode#opaque", "kind": "member" @@ -9896,10 +9392,6 @@ "title": "PerspectiveCamera#getViewSize", "kind": "function" }, - { - "title": "PerspectiveCamera#isPerspectiveCamera", - "kind": "member" - }, { "title": "PerspectiveCamera#near", "kind": "member" @@ -10088,10 +9580,6 @@ "title": "Plane#intersectsSphere", "kind": "function" }, - { - "title": "Plane#isPlane", - "kind": "member" - }, { "title": "Plane#negate", "kind": "function" @@ -10164,10 +9652,6 @@ "title": "PointLight#distance", "kind": "member" }, - { - "title": "PointLight#isPointLight", - "kind": "member" - }, { "title": "PointLight#power", "kind": "member" @@ -10220,10 +9704,6 @@ "title": "PointLightShadow", "kind": "class" }, - { - "title": "PointLightShadow#isPointLightShadow", - "kind": "member" - }, { "title": "PointShadowNode", "kind": "class" @@ -10252,10 +9732,6 @@ "title": "PointUVNode", "kind": "class" }, - { - "title": "PointUVNode#isPointUVNode", - "kind": "member" - }, { "title": "Points", "kind": "class" @@ -10264,10 +9740,6 @@ "title": "Points#geometry", "kind": "member" }, - { - "title": "Points#isPoints", - "kind": "member" - }, { "title": "Points#material", "kind": "member" @@ -10304,10 +9776,6 @@ "title": "PointsMaterial#fog", "kind": "member" }, - { - "title": "PointsMaterial#isPointsMaterial", - "kind": "member" - }, { "title": "PointsMaterial#map", "kind": "member" @@ -10328,10 +9796,6 @@ "title": "PointsNodeMaterial#alphaToCoverage", "kind": "member" }, - { - "title": "PointsNodeMaterial#isPointsNodeMaterial", - "kind": "member" - }, { "title": "PointsNodeMaterial#sizeNode", "kind": "member" @@ -10544,10 +10008,6 @@ "title": "PropertyNode#global", "kind": "member" }, - { - "title": "PropertyNode#isPropertyNode", - "kind": "member" - }, { "title": "PropertyNode#name", "kind": "member" @@ -10564,10 +10024,6 @@ "title": "QuadMesh#camera", "kind": "member" }, - { - "title": "QuadMesh#isQuadMesh", - "kind": "member" - }, { "title": "QuadMesh#render", "kind": "function" @@ -10584,10 +10040,6 @@ "title": "QuadraticBezierCurve#getPoint", "kind": "function" }, - { - "title": "QuadraticBezierCurve#isQuadraticBezierCurve", - "kind": "member" - }, { "title": "QuadraticBezierCurve#v0", "kind": "member" @@ -10608,10 +10060,6 @@ "title": "QuadraticBezierCurve3#getPoint", "kind": "function" }, - { - "title": "QuadraticBezierCurve3#isQuadraticBezierCurve3", - "kind": "member" - }, { "title": "QuadraticBezierCurve3#v0", "kind": "member" @@ -10668,10 +10116,6 @@ "title": "Quaternion#invert", "kind": "function" }, - { - "title": "Quaternion#isQuaternion", - "kind": "member" - }, { "title": "Quaternion#length", "kind": "function" @@ -10788,10 +10232,6 @@ "title": "RTTNode#height", "kind": "member" }, - { - "title": "RTTNode#isRTTNode", - "kind": "member" - }, { "title": "RTTNode#node", "kind": "member" @@ -10852,10 +10292,6 @@ "title": "RawShaderMaterial", "kind": "class" }, - { - "title": "RawShaderMaterial#isRawShaderMaterial", - "kind": "member" - }, { "title": "Ray", "kind": "class" @@ -11004,10 +10440,6 @@ "title": "RectAreaLight#height", "kind": "member" }, - { - "title": "RectAreaLight#isRectAreaLight", - "kind": "member" - }, { "title": "RectAreaLight#power", "kind": "member" @@ -11128,14 +10560,6 @@ "title": "ReferenceElementNode#getNodeType", "kind": "function" }, - { - "title": "ReferenceElementNode#isReferenceElementNode", - "kind": "member" - }, - { - "title": "ReferenceElementNode#isReferenceElementNode", - "kind": "member" - }, { "title": "ReferenceElementNode#referenceNode", "kind": "member" @@ -11292,10 +10716,6 @@ "title": "RenderOutputNode#getToneMapping", "kind": "function" }, - { - "title": "RenderOutputNode#isRenderOutputNode", - "kind": "member" - }, { "title": "RenderOutputNode#outputColorSpace", "kind": "member" @@ -11336,10 +10756,6 @@ "title": "RenderTarget#height", "kind": "member" }, - { - "title": "RenderTarget#isRenderTarget", - "kind": "member" - }, { "title": "RenderTarget#multiview", "kind": "member" @@ -11392,10 +10808,6 @@ "title": "RenderTarget3D", "kind": "class" }, - { - "title": "RenderTarget3D#isRenderTarget3D", - "kind": "member" - }, { "title": "RenderTarget3D#texture", "kind": "member" @@ -11612,6 +11024,10 @@ "title": "Renderer#getViewport", "kind": "function" }, + { + "title": "Renderer#hasCompatibility", + "kind": "function" + }, { "title": "Renderer#hasFeature", "kind": "function" @@ -11660,14 +11076,6 @@ "title": "Renderer#isOccluded", "kind": "function" }, - { - "title": "Renderer#isOutputTarget", - "kind": "member" - }, - { - "title": "Renderer#isRenderer", - "kind": "member" - }, { "title": "Renderer#library", "kind": "member" @@ -11876,10 +11284,6 @@ "title": "SampleNode", "kind": "class" }, - { - "title": "SampleNode#isSampleNode", - "kind": "member" - }, { "title": "SampleNode#sample", "kind": "function" @@ -11928,10 +11332,6 @@ "title": "Scene#fog", "kind": "member" }, - { - "title": "Scene#isScene", - "kind": "member" - }, { "title": "Scene#overrideMaterial", "kind": "member" @@ -11964,10 +11364,6 @@ "title": "ScreenNode#getUpdateType", "kind": "function" }, - { - "title": "ScreenNode#isViewportNode", - "kind": "member" - }, { "title": "ScreenNode#scope", "kind": "member" @@ -12052,10 +11448,6 @@ "title": "ScriptableNode#getValue", "kind": "function" }, - { - "title": "ScriptableNode#isScriptableNode", - "kind": "member" - }, { "title": "ScriptableNode#onRefresh", "kind": "function" @@ -12104,14 +11496,6 @@ "title": "ScriptableValueNode#inputType", "kind": "member" }, - { - "title": "ScriptableValueNode#isScriptableOutputNode", - "kind": "member" - }, - { - "title": "ScriptableValueNode#isScriptableValueNode", - "kind": "member" - }, { "title": "ScriptableValueNode#outputType", "kind": "member" @@ -12184,10 +11568,6 @@ "title": "ShaderMaterial#index0AttributeName", "kind": "member" }, - { - "title": "ShaderMaterial#isShaderMaterial", - "kind": "member" - }, { "title": "ShaderMaterial#lights", "kind": "member" @@ -12224,10 +11604,6 @@ "title": "ShadowBaseNode", "kind": "class" }, - { - "title": "ShadowBaseNode#isShadowBaseNode", - "kind": "member" - }, { "title": "ShadowBaseNode#light", "kind": "member" @@ -12268,10 +11644,6 @@ "title": "ShadowMaterial#fog", "kind": "member" }, - { - "title": "ShadowMaterial#isShadowMaterial", - "kind": "member" - }, { "title": "ShadowMaterial#transparent", "kind": "member" @@ -12292,10 +11664,6 @@ "title": "ShadowNode#getShadowFilterFn", "kind": "function" }, - { - "title": "ShadowNode#isShadowNode", - "kind": "member" - }, { "title": "ShadowNode#renderShadow", "kind": "function" @@ -12356,10 +11724,6 @@ "title": "ShadowNodeMaterial", "kind": "class" }, - { - "title": "ShadowNodeMaterial#isShadowNodeMaterial", - "kind": "member" - }, { "title": "ShadowNodeMaterial#lights", "kind": "member" @@ -12520,10 +11884,6 @@ "title": "SkeletonHelper#dispose", "kind": "function" }, - { - "title": "SkeletonHelper#isSkeletonHelper", - "kind": "member" - }, { "title": "SkeletonHelper#root", "kind": "member" @@ -12572,10 +11932,6 @@ "title": "SkinnedMesh#computeBoundingSphere", "kind": "function" }, - { - "title": "SkinnedMesh#isSkinnedMesh", - "kind": "member" - }, { "title": "SkinnedMesh#normalizeSkinWeights", "kind": "function" @@ -12676,10 +12032,6 @@ "title": "Source#id", "kind": "member" }, - { - "title": "Source#isSource", - "kind": "member" - }, { "title": "Source#needsUpdate", "kind": "member" @@ -12760,10 +12112,6 @@ "title": "Sphere#isEmpty", "kind": "function" }, - { - "title": "Sphere#isSphere", - "kind": "member" - }, { "title": "Sphere#makeEmpty", "kind": "function" @@ -12880,10 +12228,6 @@ "title": "SphericalHarmonics3#getIrradianceAt", "kind": "function" }, - { - "title": "SphericalHarmonics3#isSphericalHarmonics3", - "kind": "member" - }, { "title": "SphericalHarmonics3#lerp", "kind": "function" @@ -12912,10 +12256,6 @@ "title": "SplineCurve#getPoint", "kind": "function" }, - { - "title": "SplineCurve#isSplineCurve", - "kind": "member" - }, { "title": "SplineCurve#points", "kind": "member" @@ -12944,10 +12284,6 @@ "title": "SplitNode#getVectorLength", "kind": "function" }, - { - "title": "SplitNode#isSplitNode", - "kind": "member" - }, { "title": "SplitNode#node", "kind": "member" @@ -12968,10 +12304,6 @@ "title": "SpotLight#distance", "kind": "member" }, - { - "title": "SpotLight#isSpotLight", - "kind": "member" - }, { "title": "SpotLight#map", "kind": "member" @@ -13056,10 +12388,6 @@ "title": "SpotLightShadow#focus", "kind": "member" }, - { - "title": "SpotLightShadow#isSpotLightShadow", - "kind": "member" - }, { "title": "Sprite", "kind": "class" @@ -13076,10 +12404,6 @@ "title": "Sprite#geometry", "kind": "member" }, - { - "title": "Sprite#isSprite", - "kind": "member" - }, { "title": "Sprite#material", "kind": "member" @@ -13104,10 +12428,6 @@ "title": "SpriteMaterial#fog", "kind": "member" }, - { - "title": "SpriteMaterial#isSpriteMaterial", - "kind": "member" - }, { "title": "SpriteMaterial#map", "kind": "member" @@ -13128,10 +12448,6 @@ "title": "SpriteNodeMaterial", "kind": "class" }, - { - "title": "SpriteNodeMaterial#isSpriteNodeMaterial", - "kind": "member" - }, { "title": "SpriteNodeMaterial#positionNode", "kind": "member" @@ -13208,10 +12524,6 @@ "title": "StackNode#addToStackBefore", "kind": "function" }, - { - "title": "StackNode#isStackNode", - "kind": "member" - }, { "title": "StackNode#nodes", "kind": "member" @@ -13260,14 +12572,6 @@ "title": "Storage3DTexture#image", "kind": "member" }, - { - "title": "Storage3DTexture#is3DTexture", - "kind": "member" - }, - { - "title": "Storage3DTexture#isStorageTexture", - "kind": "member" - }, { "title": "Storage3DTexture#magFilter", "kind": "member" @@ -13288,10 +12592,6 @@ "title": "StorageArrayElementNode", "kind": "class" }, - { - "title": "StorageArrayElementNode#isStorageArrayElementNode", - "kind": "member" - }, { "title": "StorageArrayElementNode#storageBufferNode", "kind": "member" @@ -13304,10 +12604,6 @@ "title": "StorageArrayTexture#image", "kind": "member" }, - { - "title": "StorageArrayTexture#isStorageTexture", - "kind": "member" - }, { "title": "StorageArrayTexture#magFilter", "kind": "member" @@ -13324,10 +12620,6 @@ "title": "StorageBufferAttribute", "kind": "class" }, - { - "title": "StorageBufferAttribute#isStorageBufferAttribute", - "kind": "member" - }, { "title": "StorageBufferNode", "kind": "class" @@ -13372,18 +12664,6 @@ "title": "StorageBufferNode#global", "kind": "member" }, - { - "title": "StorageBufferNode#isAtomic", - "kind": "member" - }, - { - "title": "StorageBufferNode#isPBO", - "kind": "member" - }, - { - "title": "StorageBufferNode#isStorageBufferNode", - "kind": "member" - }, { "title": "StorageBufferNode#setAccess", "kind": "function" @@ -13412,10 +12692,6 @@ "title": "StorageInstancedBufferAttribute", "kind": "class" }, - { - "title": "StorageInstancedBufferAttribute#isStorageInstancedBufferAttribute", - "kind": "member" - }, { "title": "StorageTexture", "kind": "class" @@ -13424,10 +12700,6 @@ "title": "StorageTexture#image", "kind": "member" }, - { - "title": "StorageTexture#isStorageTexture", - "kind": "member" - }, { "title": "StorageTexture#magFilter", "kind": "member" @@ -13464,10 +12736,6 @@ "title": "StorageTextureNode#getInputType", "kind": "function" }, - { - "title": "StorageTextureNode#isStorageTextureNode", - "kind": "member" - }, { "title": "StorageTextureNode#mipLevel", "kind": "member" @@ -13524,10 +12792,6 @@ "title": "StructTypeNode#getLength", "kind": "function" }, - { - "title": "StructTypeNode#isStructLayoutNode", - "kind": "member" - }, { "title": "StructTypeNode#membersLayout", "kind": "member" @@ -13540,10 +12804,6 @@ "title": "SubBuildNode", "kind": "class" }, - { - "title": "SubBuildNode#isSubBuildNode", - "kind": "member" - }, { "title": "SubBuildNode#name", "kind": "member" @@ -13574,11 +12834,7 @@ }, { "title": "TempNode#hasDependencies", - "kind": "function" - }, - { - "title": "TempNode#isTempNode", - "kind": "member" + "kind": "function" }, { "title": "TetrahedronGeometry", @@ -13664,18 +12920,6 @@ "title": "Texture#internalFormat", "kind": "member" }, - { - "title": "Texture#isArrayTexture", - "kind": "member" - }, - { - "title": "Texture#isRenderTargetTexture", - "kind": "member" - }, - { - "title": "Texture#isTexture", - "kind": "member" - }, { "title": "Texture#magFilter", "kind": "member" @@ -13816,10 +13060,6 @@ "title": "Texture3DNode#getInputType", "kind": "function" }, - { - "title": "Texture3DNode#isTexture3DNode", - "kind": "member" - }, { "title": "Texture3DNode#normal", "kind": "function" @@ -13928,10 +13168,6 @@ "title": "TextureNode#gradNode", "kind": "member" }, - { - "title": "TextureNode#isTextureNode", - "kind": "member" - }, { "title": "TextureNode#level", "kind": "function" @@ -14000,10 +13236,6 @@ "title": "TextureNode#updateType", "kind": "member" }, - { - "title": "TextureNode#uv", - "kind": "function" - }, { "title": "TextureNode#uvNode", "kind": "member" @@ -14016,10 +13248,6 @@ "title": "TextureSizeNode", "kind": "class" }, - { - "title": "TextureSizeNode#isTextureSizeNode", - "kind": "member" - }, { "title": "TextureSizeNode#levelNode", "kind": "member" @@ -14328,6 +13556,10 @@ "title": "Uniform#getValue", "kind": "function" }, + { + "title": "Uniform#index", + "kind": "member" + }, { "title": "Uniform#itemSize", "kind": "member" @@ -14356,10 +13588,6 @@ "title": "UniformArrayElementNode", "kind": "class" }, - { - "title": "UniformArrayElementNode#isArrayBufferElementNode", - "kind": "member" - }, { "title": "UniformArrayNode", "kind": "class" @@ -14388,10 +13616,6 @@ "title": "UniformArrayNode#getPaddedType", "kind": "function" }, - { - "title": "UniformArrayNode#isArrayBufferNode", - "kind": "member" - }, { "title": "UniformArrayNode#paddedType", "kind": "member" @@ -14412,10 +13636,6 @@ "title": "UniformGroupNode", "kind": "class" }, - { - "title": "UniformGroupNode#isUniformGroup", - "kind": "member" - }, { "title": "UniformGroupNode#name", "kind": "member" @@ -14444,10 +13664,6 @@ "title": "UniformNode#groupNode", "kind": "member" }, - { - "title": "UniformNode#isUniformNode", - "kind": "member" - }, { "title": "UniformNode#label", "kind": "function" @@ -14476,6 +13692,10 @@ "title": "UniformsGroup#addUniform", "kind": "function" }, + { + "title": "UniformsGroup#addUniformUpdateRange", + "kind": "function" + }, { "title": "UniformsGroup#buffer", "kind": "member" @@ -14484,6 +13704,10 @@ "title": "UniformsGroup#byteLength", "kind": "member" }, + { + "title": "UniformsGroup#clearUpdateRanges", + "kind": "function" + }, { "title": "UniformsGroup#clone", "kind": "function" @@ -14500,14 +13724,6 @@ "title": "UniformsGroup#id", "kind": "member" }, - { - "title": "UniformsGroup#isUniformsGroup", - "kind": "member" - }, - { - "title": "UniformsGroup#isUniformsGroup", - "kind": "member" - }, { "title": "UniformsGroup#name", "kind": "member" @@ -14588,10 +13804,6 @@ "title": "UnpackFloatNode#encoding", "kind": "member" }, - { - "title": "UnpackFloatNode#isUnpackFloatNode", - "kind": "member" - }, { "title": "UnpackFloatNode#uintNode", "kind": "member" @@ -14628,10 +13840,6 @@ "title": "VarNode#isIntent", "kind": "function" }, - { - "title": "VarNode#isVarNode", - "kind": "member" - }, { "title": "VarNode#name", "kind": "member" @@ -14668,10 +13876,6 @@ "title": "VaryingNode#interpolationType", "kind": "member" }, - { - "title": "VaryingNode#isVaryingNode", - "kind": "member" - }, { "title": "VaryingNode#name", "kind": "member" @@ -14792,10 +13996,6 @@ "title": "Vector2#height", "kind": "member" }, - { - "title": "Vector2#isVector2", - "kind": "member" - }, { "title": "Vector2#length", "kind": "function" @@ -15032,10 +14232,6 @@ "title": "Vector3#getComponent", "kind": "function" }, - { - "title": "Vector3#isVector3", - "kind": "member" - }, { "title": "Vector3#length", "kind": "function" @@ -15308,10 +14504,6 @@ "title": "Vector4#height", "kind": "member" }, - { - "title": "Vector4#isVector4", - "kind": "member" - }, { "title": "Vector4#length", "kind": "function" @@ -15512,18 +14704,10 @@ "title": "VertexColorNode#index", "kind": "member" }, - { - "title": "VertexColorNode#isVertexColorNode", - "kind": "member" - }, { "title": "VideoFrameTexture", "kind": "class" }, - { - "title": "VideoFrameTexture#isVideoFrameTexture", - "kind": "member" - }, { "title": "VideoFrameTexture#setFrame", "kind": "function" @@ -15540,10 +14724,6 @@ "title": "VideoTexture#generateMipmaps", "kind": "member" }, - { - "title": "VideoTexture#isVideoTexture", - "kind": "member" - }, { "title": "VideoTexture#update", "kind": "function" @@ -15552,10 +14732,6 @@ "title": "ViewportDepthNode", "kind": "class" }, - { - "title": "ViewportDepthNode#isViewportDepthNode", - "kind": "member" - }, { "title": "ViewportDepthNode#scope", "kind": "member" @@ -15596,10 +14772,6 @@ "title": "ViewportTextureNode#getTextureForReference", "kind": "function" }, - { - "title": "ViewportTextureNode#isOutputTextureNode", - "kind": "member" - }, { "title": "ViewportTextureNode#updateBeforeType", "kind": "member" @@ -15608,10 +14780,6 @@ "title": "VolumeNodeMaterial", "kind": "class" }, - { - "title": "VolumeNodeMaterial#isVolumeNodeMaterial", - "kind": "member" - }, { "title": "VolumeNodeMaterial#offsetNode", "kind": "member" @@ -15912,10 +15080,6 @@ "title": "WebGL3DRenderTarget", "kind": "class" }, - { - "title": "WebGL3DRenderTarget#isWebGL3DRenderTarget", - "kind": "member" - }, { "title": "WebGL3DRenderTarget#texture", "kind": "member" @@ -15924,10 +15088,6 @@ "title": "WebGLArrayRenderTarget", "kind": "class" }, - { - "title": "WebGLArrayRenderTarget#isWebGLArrayRenderTarget", - "kind": "member" - }, { "title": "WebGLArrayRenderTarget#texture", "kind": "member" @@ -15944,10 +15104,6 @@ "title": "WebGLCubeRenderTarget#fromEquirectangularTexture", "kind": "function" }, - { - "title": "WebGLCubeRenderTarget#isWebGLCubeRenderTarget", - "kind": "member" - }, { "title": "WebGLCubeRenderTarget#texture", "kind": "member" @@ -15956,10 +15112,6 @@ "title": "WebGLRenderTarget", "kind": "class" }, - { - "title": "WebGLRenderTarget#isWebGLRenderTarget", - "kind": "member" - }, { "title": "WebGLRenderer", "kind": "class" @@ -16124,10 +15276,6 @@ "title": "WebGLRenderer#initTexture", "kind": "function" }, - { - "title": "WebGLRenderer#isWebGLRenderer", - "kind": "member" - }, { "title": "WebGLRenderer#localClippingEnabled", "kind": "member" @@ -16272,10 +15420,6 @@ "title": "WebGPURenderer", "kind": "class" }, - { - "title": "WebGPURenderer#isWebGPURenderer", - "kind": "member" - }, { "title": "WebGPURenderer#library", "kind": "member" @@ -16444,10 +15588,6 @@ "title": "WorkgroupInfoElementNode", "kind": "class" }, - { - "title": "WorkgroupInfoElementNode#isWorkgroupInfoElementNode", - "kind": "member" - }, { "title": "WorkgroupInfoNode", "kind": "class" @@ -16476,10 +15616,6 @@ "title": "WorkgroupInfoNode#getInputType", "kind": "function" }, - { - "title": "WorkgroupInfoNode#isWorkgroupInfoNode", - "kind": "member" - }, { "title": "WorkgroupInfoNode#label", "kind": "function" @@ -16746,10 +15882,6 @@ "title": "AnaglyphPassNode", "kind": "class" }, - { - "title": "AnaglyphPassNode#isAnaglyphPassNode", - "kind": "member" - }, { "title": "AnaglyphPassNode#setup", "kind": "function" @@ -17414,10 +16546,6 @@ "title": "CSS2DObject#element", "kind": "member" }, - { - "title": "CSS2DObject#isCSS2DObject", - "kind": "member" - }, { "title": "CSS2DRenderer", "kind": "class" @@ -17450,10 +16578,6 @@ "title": "CSS3DObject#element", "kind": "member" }, - { - "title": "CSS3DObject#isCSS3DObject", - "kind": "member" - }, { "title": "CSS3DRenderer", "kind": "class" @@ -17478,10 +16602,6 @@ "title": "CSS3DSprite", "kind": "class" }, - { - "title": "CSS3DSprite#isCSS3DSprite", - "kind": "member" - }, { "title": "CSS3DSprite#rotation2D", "kind": "member" @@ -18286,10 +17406,6 @@ "title": "Font#generateShapes", "kind": "function" }, - { - "title": "Font#isFont", - "kind": "member" - }, { "title": "FontLoader", "kind": "class" @@ -18954,10 +18070,6 @@ "title": "LDrawConditionalLineMaterial#color", "kind": "member" }, - { - "title": "LDrawConditionalLineMaterial#isLDrawConditionalLineMaterial", - "kind": "member" - }, { "title": "LDrawConditionalLineMaterial#opacity", "kind": "member" @@ -19122,10 +18234,6 @@ "title": "Lensflare#frustumCulled", "kind": "member" }, - { - "title": "Lensflare#isLensflare", - "kind": "member" - }, { "title": "Lensflare#renderOrder", "kind": "member" @@ -19166,10 +18274,6 @@ "title": "LensflareMesh#frustumCulled", "kind": "member" }, - { - "title": "LensflareMesh#isLensflareMesh", - "kind": "member" - }, { "title": "LensflareMesh#renderOrder", "kind": "member" @@ -19254,10 +18358,6 @@ "title": "Line2", "kind": "class" }, - { - "title": "Line2#isLine2", - "kind": "member" - }, { "title": "LineGeometry", "kind": "class" @@ -19266,10 +18366,6 @@ "title": "LineGeometry#fromLine", "kind": "function" }, - { - "title": "LineGeometry#isLineGeometry", - "kind": "member" - }, { "title": "LineGeometry#setColors", "kind": "function" @@ -19314,10 +18410,6 @@ "title": "LineMaterial#gapSize", "kind": "member" }, - { - "title": "LineMaterial#isLineMaterial", - "kind": "member" - }, { "title": "LineMaterial#linewidth", "kind": "member" @@ -19342,10 +18434,6 @@ "title": "LineSegments2#computeLineDistances", "kind": "function" }, - { - "title": "LineSegments2#isLineSegments2", - "kind": "member" - }, { "title": "LineSegments2#raycast", "kind": "function" @@ -19374,10 +18462,6 @@ "title": "LineSegmentsGeometry#fromWireframeGeometry", "kind": "function" }, - { - "title": "LineSegmentsGeometry#isLineSegmentsGeometry", - "kind": "member" - }, { "title": "LineSegmentsGeometry#setColors", "kind": "function" @@ -19418,10 +18502,6 @@ "title": "Lut#getColor", "kind": "function" }, - { - "title": "Lut#isLut", - "kind": "member" - }, { "title": "Lut#lut", "kind": "member" @@ -19778,10 +18858,6 @@ "title": "MarchingCubes#getCell", "kind": "function" }, - { - "title": "MarchingCubes#isMarchingCubes", - "kind": "member" - }, { "title": "MarchingCubes#reset", "kind": "function" @@ -20710,10 +19786,6 @@ "title": "OutputPass#dispose", "kind": "function" }, - { - "title": "OutputPass#isOutputPass", - "kind": "member" - }, { "title": "OutputPass#material", "kind": "member" @@ -20810,10 +19882,6 @@ "title": "ParallaxBarrierPassNode", "kind": "class" }, - { - "title": "ParallaxBarrierPassNode#isParallaxBarrierPassNode", - "kind": "member" - }, { "title": "ParallaxBarrierPassNode#setup", "kind": "function" @@ -20842,10 +19910,6 @@ "title": "Pass#enabled", "kind": "member" }, - { - "title": "Pass#isPass", - "kind": "member" - }, { "title": "Pass#needsSwap", "kind": "member" @@ -20910,10 +19974,6 @@ "title": "PixelationPassNode#depthEdgeStrength", "kind": "member" }, - { - "title": "PixelationPassNode#isPixelationPassNode", - "kind": "member" - }, { "title": "PixelationPassNode#normalEdgeStrength", "kind": "member" @@ -20950,10 +20010,6 @@ "title": "PointerLockControls#getDirection", "kind": "function" }, - { - "title": "PointerLockControls#isLocked", - "kind": "member" - }, { "title": "PointerLockControls#lock", "kind": "function" @@ -21154,10 +20210,6 @@ "title": "Reflector#getRenderTarget", "kind": "function" }, - { - "title": "Reflector#isReflector", - "kind": "member" - }, { "title": "ReflectorForSSRPass", "kind": "class" @@ -21186,10 +20238,6 @@ "title": "Refractor#getRenderTarget", "kind": "function" }, - { - "title": "Refractor#isRefractor", - "kind": "member" - }, { "title": "RenderPass", "kind": "class" @@ -21214,10 +20262,6 @@ "title": "RenderPass#clearDepth", "kind": "member" }, - { - "title": "RenderPass#isRenderPass", - "kind": "member" - }, { "title": "RenderPass#needsSwap", "kind": "member" @@ -21494,10 +20538,6 @@ "title": "SSAAPassNode#dispose", "kind": "function" }, - { - "title": "SSAAPassNode#isSSAAPassNode", - "kind": "member" - }, { "title": "SSAAPassNode#sampleLevel", "kind": "member" @@ -21966,10 +21006,6 @@ "title": "SVGObject", "kind": "class" }, - { - "title": "SVGObject#isSVGObject", - "kind": "member" - }, { "title": "SVGObject#node", "kind": "member" @@ -22142,10 +21178,6 @@ "title": "SelectionHelper#enabled", "kind": "member" }, - { - "title": "SelectionHelper#isDown", - "kind": "member" - }, { "title": "SelectionHelper#renderer", "kind": "member" @@ -22210,10 +21242,6 @@ "title": "ShadowMesh#frustumCulled", "kind": "member" }, - { - "title": "ShadowMesh#isShadowMesh", - "kind": "member" - }, { "title": "ShadowMesh#matrixAutoUpdate", "kind": "member" @@ -22254,10 +21282,6 @@ "title": "Sky", "kind": "class" }, - { - "title": "Sky#isSky", - "kind": "member" - }, { "title": "SkyGeometry", "kind": "class" @@ -22266,14 +21290,6 @@ "title": "SkyMesh", "kind": "class" }, - { - "title": "SkyMesh#isSky", - "kind": "member" - }, - { - "title": "SkyMesh#isSkyMesh", - "kind": "member" - }, { "title": "SkyMesh#mieCoefficient", "kind": "member" @@ -22326,10 +21342,6 @@ "title": "StereoCompositePassNode#dispose", "kind": "function" }, - { - "title": "StereoCompositePassNode#isStereoCompositePassNode", - "kind": "member" - }, { "title": "StereoCompositePassNode#setSize", "kind": "function" @@ -22366,10 +21378,6 @@ "title": "StereoPassNode", "kind": "class" }, - { - "title": "StereoPassNode#isStereoPassNode", - "kind": "member" - }, { "title": "StereoPassNode#stereo", "kind": "member" @@ -22470,10 +21478,6 @@ "title": "TRAANode#getTextureNode", "kind": "function" }, - { - "title": "TRAANode#isTRAANode", - "kind": "member" - }, { "title": "TRAANode#maxVelocityLength", "kind": "member" @@ -23182,10 +22186,6 @@ "title": "VertexNormalsHelper#dispose", "kind": "function" }, - { - "title": "VertexNormalsHelper#isVertexNormalsHelper", - "kind": "member" - }, { "title": "VertexNormalsHelper#matrixAutoUpdate", "kind": "member" @@ -23246,10 +22246,6 @@ "title": "ViewHelper#handleClick", "kind": "function" }, - { - "title": "ViewHelper#isViewHelper", - "kind": "member" - }, { "title": "ViewHelper#render", "kind": "function" @@ -23434,10 +22430,6 @@ "title": "Water", "kind": "class" }, - { - "title": "Water#isWater", - "kind": "member" - }, { "title": "WaterMesh", "kind": "class" @@ -23450,10 +22442,6 @@ "title": "WaterMesh#distortionScale", "kind": "member" }, - { - "title": "WaterMesh#isWaterMesh", - "kind": "member" - }, { "title": "WaterMesh#resolutionScale", "kind": "member" @@ -23494,18 +22482,10 @@ "title": "Wireframe#computeLineDistances", "kind": "function" }, - { - "title": "Wireframe#isWireframe", - "kind": "member" - }, { "title": "WireframeGeometry2", "kind": "class" }, - { - "title": "WireframeGeometry2#isWireframeGeometry2", - "kind": "member" - }, { "title": "WoodNodeMaterial", "kind": "class" @@ -24676,6 +23656,10 @@ "title": "ColorConverter.setHSV", "kind": "function" }, + { + "title": "Compatibility", + "kind": "member" + }, { "title": "ConeGeometry.fromJSON", "kind": "function" @@ -26350,10 +25334,6 @@ "title": "atan", "kind": "function" }, - { - "title": "atan2", - "kind": "function" - }, { "title": "atomicAdd", "kind": "function" @@ -26538,10 +25518,6 @@ "title": "bumpMap", "kind": "function" }, - { - "title": "burn", - "kind": "function" - }, { "title": "bypass", "kind": "function" @@ -26754,10 +25730,6 @@ "title": "denoise", "kind": "function" }, - { - "title": "densityFog", - "kind": "function" - }, { "title": "densityFogFactor", "kind": "function" @@ -26810,10 +25782,6 @@ "title": "div", "kind": "function" }, - { - "title": "dodge", - "kind": "function" - }, { "title": "dof", "kind": "function" @@ -26842,10 +25810,6 @@ "title": "equal", "kind": "function" }, - { - "title": "equals", - "kind": "function" - }, { "title": "equirectUV", "kind": "function" @@ -27558,10 +26522,6 @@ "title": "outputStruct", "kind": "function" }, - { - "title": "overlay", - "kind": "function" - }, { "title": "overloadingFn", "kind": "function" @@ -27726,10 +26686,6 @@ "title": "range", "kind": "function" }, - { - "title": "rangeFog", - "kind": "function" - }, { "title": "rangeFogFactor", "kind": "function" @@ -27858,10 +26814,6 @@ "title": "saturation", "kind": "function" }, - { - "title": "screen", - "kind": "function" - }, { "title": "screenCoordinate", "kind": "member" @@ -28034,10 +26986,6 @@ "title": "storageElement", "kind": "function" }, - { - "title": "storageObject", - "kind": "function" - }, { "title": "storageTexture", "kind": "function" diff --git a/examples/jsm/loaders/GLTFLoader.js b/examples/jsm/loaders/GLTFLoader.js index 7e9166df9341b9..5f7b268b15db3a 100644 --- a/examples/jsm/loaders/GLTFLoader.js +++ b/examples/jsm/loaders/GLTFLoader.js @@ -66,6 +66,7 @@ import { InstancedBufferAttribute } from 'three'; import { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js'; +import { clone } from '../utils/SkeletonUtils.js'; /** * A loader for the glTF 2.0 format. @@ -4510,7 +4511,20 @@ class GLTFParser { for ( let i = 0, il = nodes.length; i < il; i ++ ) { - scene.add( nodes[ i ] ); + const node = nodes[ i ]; + + // If the node already has a parent, it means it's being reused across multiple scenes. + // Clone it to avoid the second scene's add() removing it from the first scene. + // See: https://github.com/mrdoob/three.js/issues/27993 + if ( node.parent !== null ) { + + scene.add( clone( node ) ); + + } else { + + scene.add( node ); + + } } diff --git a/utils/docs/template/publish.js b/utils/docs/template/publish.js index a984d946bdaf41..a112452a2f998d 100644 --- a/utils/docs/template/publish.js +++ b/utils/docs/template/publish.js @@ -151,8 +151,29 @@ function buildSearchListForData() { 'TSL': [] }; + // State flags that should appear in search (not type-checking properties) + const allowedIsProperties = new Set( [ + 'isPlaying', + 'isDisposed', + 'isPresenting' + ] ); + data().each( ( item ) => { + // Skip .is* type-checking properties (e.g., isCamera, isMesh) + // but keep state flags listed in allowedIsProperties + if ( item.name && item.kind === 'member' ) { + + const name = item.name; + + if ( name.startsWith( 'is' ) && ! allowedIsProperties.has( name ) ) { + + return; + + } + + } + if ( item.kind !== 'package' && item.kind !== 'typedef' && ! item.inherited ) { // Extract the class name from the longname (e.g., "Animation#getAnimationLoop" -> "Animation") diff --git a/utils/docs/template/static/index.html b/utils/docs/template/static/index.html index 0d500b663927ff..bdb8ac4bc3214e 100644 --- a/utils/docs/template/static/index.html +++ b/utils/docs/template/static/index.html @@ -344,6 +344,38 @@

    three.js

    } + // Sort results: exact matches first, then classes before members + const searchLower = v.toLowerCase(); + results.sort( ( a, b ) => { + + const aName = a.title.split( /[#~]/ ).pop().toLowerCase(); + const bName = b.title.split( /[#~]/ ).pop().toLowerCase(); + const aIsClass = ! a.title.includes( '#' ) && ! a.title.includes( '~' ); + const bIsClass = ! b.title.includes( '#' ) && ! b.title.includes( '~' ); + + // Exact match on class name (highest priority) + const aExactClass = aIsClass && aName === searchLower; + const bExactClass = bIsClass && bName === searchLower; + if ( aExactClass !== bExactClass ) return aExactClass ? - 1 : 1; + + // Class starts with search term + const aStartsClass = aIsClass && aName.startsWith( searchLower ); + const bStartsClass = bIsClass && bName.startsWith( searchLower ); + if ( aStartsClass !== bStartsClass ) return aStartsClass ? - 1 : 1; + + // Exact match on member name + const aExact = aName === searchLower; + const bExact = bName === searchLower; + if ( aExact !== bExact ) return aExact ? - 1 : 1; + + // Classes before members + if ( aIsClass !== bIsClass ) return aIsClass ? - 1 : 1; + + // Alphabetically + return a.title.localeCompare( b.title ); + + } ); + // Display results if ( results.length > 0 ) {